SOURCE DOCUMENT · 24 OCTOBER 2026
Runner advancement and positioning
# Runner advancement and defensive positioning
Static research, 2026-10-24. This supersedes the runner-transition coverage limits in PLATE_APPEARANCE_ANALYSIS.md and corrects specific earlier positioning interpretations. The original ATR and initial calculator are unchanged. No Altirra operation, Atari instruction execution, native frequency measurement or game patch was performed.
## Findings and scope
For offense0, the single, double, groundball and air-out **base/out/scoring kernels now have joint translations**, retaining identities. With supplied effective fielding ratings and necessary incoming native state, these close across all eight base masks, three live out states and normal/corners/infield defense. They are conditional on the initial class. Air-out fly/line taxonomy remains incomplete.
The requested third-only, one-out comparison closes for baseball state under the independent-uniform-byte model, without unknown cache assumptions. Complete-PA calculations integrate foul retries and HBP-family continuations. No unresolved outcomes are discarded or renormalized in that example.
A general simulator needs more than current players and speeds. The double throw gate reads the **original third-base speed cache**, even when the runner began on first. Some double subtypes retain incoming geometry bytes. Empty-base caches are not refreshed. Missing bytes produce explicit unresolved mass. First-occupied PA continuation calculations can also retain a finite-horizon tail.
In plain English: the game chooses a broad play, then a batted-ball route, and only some routes risk an extra base. Faster runners help on singles. The batter's speed does not stretch a selected single into a double here, but does affect double plays. Positioning changes both the initial single frequency and later groundball decisions. Reproducing the original behavior requires retaining its unusual dependencies rather than correcting them into modern baseball rules.
## Evidence and probability assumptions
Primary evidence: MICROLEAGUE_DISASSEMBLY.asm, INSTRUCTION_INDEX.json, MICROLEAGUE_XREFS.csv, STATIC_TEST_VECTORS.json and the ATR; prior math, bunt, PA and positioning reports supplied navigation. Only relevant candidate regions were decoded locally. The permanent reference was not regenerated.
ATR: `original_disks/Micro League Baseball (1984)(Micro League Sports Association)(US).atr`; SHA-256 `2f94eb9a5fa06408c46ad24cf5b8d7398de195d7354f5734dea48c03045cca75`. Resident A maps to zero-based file offset A+$7C10; arithmetic A in $0C00..$11FF maps to A+$2110. All native addresses below are verifiable with these mappings.
**Confirmed static** means local instructions, branch order and state operations. **Conditional exact** means probability under independent uniform bytes at material RANDOM reads and valid supplied state/roster inputs. **Unresolved** means missing inputs, unsupported domains, event taxonomy or hardware timing. No result is a measured native frequency or win probability.
$1091(argument n) returns `floor((n+1)*R/256)` with carry clear. Define `U(k)=floor(k*R/256)` and `Q(t)=count{R:U(10)<t}/256`, R=0..255. Comparisons are strict `<`; byte arithmetic wraps mod256. Rejection redraws the entire specified pair and divides by its exact acceptance probability. That is different from discarding unresolved baseball events.
Presentation reads can be integrated out under IID, but their POKEY timing remains relevant to a real hardware model. Text is not always cosmetic: $307F remaps geometry using the last text ID, and groundball text $79 changes the play route.
## 1. Shared runner state and throw gate
Slots $B4..$B8 are batter,first,second,third,home staging; $B9..$BD are parallel display identities. $D6 is the original mask during the handler. $1D0A..D are original cached speeds: movement does not shift them. $D7/$D8/$D9 are depth/position/combined geometry; D8 is usually10 times a one-based physical position. $B3=0/8/9 for swing-away normal/corners/infield ($46DA..$46F3). Ordinary pitches1..4 share B3=0.
$31F8 decodes X=low3bits, Y=bits3..5, bit7 selects group versus target/force. $313E's group includes **source slot X**, not only slots above it. $3173 moves one player stepwise, recursively forcing occupied destinations. Each step calls $3228, scoring home staging only while outs<3. $328E stages third at home without scoring immediately. $3262/$3272 remove an identity.
| Operation | State effect |
|---|---|
| 08 | Batter and existing runners +1 |
| 09 | Existing runners +1 |
| 10 | Batter and existing runners +2 |
| 11 | Existing runners +2 |
| 88 | Batter first, force occupied destinations |
| 90 | Batter stepwise second, force occupied destinations |
| 0A | Current second and third +1 |
| 8B | Current third home |
| 23 | Current third +4 steps; that runner scores in this double path |
`08;0A` sends original first third and original second home. This is essential at $5FCD.
A run can score **before** a later extra-base attempt makes the third out. First/third, two outs: $64BB's `11` scores original third, moves original first third; a later failed attempt retires him. The earlier score remains. Runner kernels retain chronological scoring. Conversely DP adds its second out before `08`, so inning-ending advancement does not score at $3228. Terminal bases are cleared/stranded projections, not stale native graphics slots.
### Effective fielding and $64BB
$4683 accepts a **zero-based** argument and increments it before selecting the opposing lineup record. Public fielding_ratings are nine effective returns for physical positions1..9, not modern fielding percentages. The existing effective_fielding_rating(record,position) decodes primary/secondary rating fields.
$64BB uses j=floor(D8/10), reads $657D+j, then calls $4683. Its zero-based mapping j=0..9 is `[10,7,7,8,7,6,7,6,7,8]`. Thus D8=30/40/50/60 use physical RF9/CF8/LF7/CF8 respectively; OF7/8/9 use themselves. Nonstandard physical position11 remains unresolved.
With effective rating r and original cached speed s selected by C5:
```
r>0: T=(s+4-r)&255
r=0, s=0..5: T=[0,8,8,9,10,10][s]
P(safe)=Q(T); P(out)=1-Q(T) $64D4..$64ED,$6558..$6575
```
For ordinary speeds1..5, zero-rating thresholds are8,8,9,10,10. Failure adds an out and removes home staging if occupied, otherwise third. Safe calls $3228. A zero-rating table index beyond the reviewed0..5 domain remains unresolved; it is not clamped. A known raw cache byte wraps: s=255,r=2 gives T=1.
## 2. Single branch tree
$5E4E credits the hit and exposure before subtype selection. $356B=04,02,00 normally; $356E=04,01,00 for either position in. $5E77 routes:
| Entry | Normal | Corners/infield |
|---|---:|---:|
| $5F62 |51/256|51/256|
| $5FD2 |102/256|153/256|
| $5E7D |103/256|52/256|
* $5F62 draws D7=U4, OF=7+U3; reject both if D7=2 or D9=83. OF counts are86,85,85, not equal thirds. A fresh raw byte85..169 (85/256) goes to $6587. Remaining171/256 do `08`, then `0A` if pre-play outs=2 or D7>=2 ($5FBB..$5FCD), otherwise finish.
* $5FD2 uses $3571=09,07,00: $6008,$6023,$5FE0 with25,51,180 byte weights. First two converge at $6087:`08`; their sign/throw wording does not change baseball state. $5FE0 draws $48B9 rejecting D7=1, then $48E2->$307F->$6587. Remapping changes D8/D9, **not D7**.
* $5E7D draws OF=7+U3,D7=U4. D7=3 does `11;88`: existing runners2, batter1. Its other four dispatch/wording choices converge on $6587.
$48B9 draws IF=3+U4, then odd positions3/5 get depth1+U3, even4/6 get1+U4. Rejection redraws both. Material $307F mappings include32->90,33->91,42->90,43/44->80,52/53/62->71,63/64->81. D8 becomes ten times the new position; D7 survives. The Python table retains all25 reviewed mappings.
### $6587, offense0
If50<=D8<70, or D8>=70 and D7=0, use `09;88` (+1 existing, batter first). With neither first nor second occupied, same closure.
Otherwise C5=2 if original second occupied, else1. With two outs, draw U10 against `(cached_second_speed+4)&255`: below gives `11;88`, all existing+2. Even first-only states read the retained empty-second cache here. On failure, or with fewer than2 outs:
* Selected speed>=5: $6600..$6611 group(C5,+2), then88; no throw.
* Other speeds: raw<51 gives group(C5,+1), then88. Remaining205/256 call $64BB.
* In $64BB, original mask&3==1 uses11, leaving original first third; the safe/out test leaves him there or retires him. Other configurations do09 then stage current third at home, generally the original second trying to score. Batter then goes first through88.
For first-only Speed5 with two outs, both sides of the empty-second-cache gate give the same base result; its unknown value can be marginalized without guessing it. Execution still reads the byte.
This gate can therefore mean first-to-third or second-to-home. Original third may score earlier; runners behind the attempted runner have their own destinations. Identity and sequencing are retained.
**No batter stretch:** every reviewed offense0 class-2 closure leaves the batter first or stranded on an inning-ending runner out. No single-to-double gate was found. Batter speed is not read for these advances. Existing runner speed, retained cache when accessed, effective throw rating, outs, depth and subtype are material. Corners/infield share the conditional single tree but have different initial single weights.
## 3. Double branch tree and retained-state dependency
$4D83 credits a hit/exposure. $3574 chooses $4E27,$4DA8,$4E8D with51,51,154 byte weights. With first empty, all paths yield batter second and original second/third home; the existing shortcut is retained.
With first occupied:
* $4E27 text IDs231/251, each1/2, map through $307F to D8=90/70. D7 remains incoming. A sign bit splits $4FB3 versus $5054 equally.
* $4DA8 raw&1 selects gap D9=73/93. A second raw>=170 (86/256) sets D8=D9-3; other170/256 retain incoming D8. **Neither initializes D7.** Another sign splits ordinary versus attempted advance equally.
* $4E8D draws OF=7+U3,D7=2+U3, rejecting D9=84. Gaps73/93 go $4FB3. Other geometries use $3577=09,08,04,03,00:25,26,102,26,77 byte weights to $4F7D,$4F6C,$4F27,$4F05,$4EE8. $4F7D remaps then10 (first third, no attempt). Entries1/3/4 go $4FB3. Entry2 remaps and uses raw<51 ordinary, otherwise attempt.
$4FB3/$4FFB, offense0: D7=4 does `90;23`, scoring original first without a throw. Otherwise `11;90` leaves him third. Existing second/third score and batter goes second in either case. Retained D7 is therefore a material missing input in the first two subtypes.
$5054 does90, forcing batter second and original first third, scoring original second/third; $328E stages that first runner home. It then sets **C5=3** ($5065..$5069), so $64D4 reads $1D0D, the **original third-base cache**, not original first's $1D0B. $43AD..$43C4 skips speed writes for empty slots. An empty third cache may retain a previous player's speed.
That is a confirmed static dependency; whether intentional or a bug is unknown. Changing first runner speed alone has no mathematical effect within this double tree. Changing third's cached speed can. If third is occupied, its refreshed speed is used. Missing cache/geometry retains unresolved mass. A nonstandard geometry/lineup lookup also remains unresolved rather than guessing a rating.
## 4. Groundballs: complete branch order
$5CBA sets display identity and increments a provisional out at $5CC2. Text is $71+U9: $79 has28/256 probability. Independently raw<32 (1/8) selects pitcher D8=D9=10, retaining D7. Otherwise7/8:
* Text79 repeatedly draws $48B9 until D8=30, then directly $546F:08, remove batter at slot1. This text is material. Total probability49/512, regardless positioning; accepted depth has no further baseball-state effect on that path.
* Other texts228/256 draw the ordinary joint IF/depth distribution and enter $5CFC. Total weight399/512; each physical IF has1/4 and its odd/even depth buckets described above.
### Early branches precede the positioning table
Empty bases: batter out. Two pre-play outs: pitcher/1B contexts or no first runner produce batter out. Other first-occupied contexts use raw<85 batter out, otherwise original first forced at second. These end the inning without scoring and without a two-out-to-four-out DP branch.
With fewer than2 outs, **$5D30..$5D3A tests first occupied and B3<3 before later tables**. Swing-away normal B3=0 sends ALL masks1,3,5,7 to $5526. Corners8/infield9 do not take this jump. Earlier SURPRISE_BUNT_GAME_THEORY.md overlooked that short circuit: its blanket normal/corners first+third equivalence and normal-loaded-home-route claims are superseded here.
| Mask; <2 outs | Normal | Corners | Infield |
|---|---|---|---|
|0|Batter out|Same|Same|
|1,3|$5526|$5526|$5526|
|2|P/3B hold second;1B/2B/SS advance|SS now holds;1B/2B still advance|Same as corners|
|4,6|P/1B/3B hold unforced;2B/SS advance all|Same|2B/SS try home;P/1B/3B hold|
|5|Early $5526|$55A9 middle IF DP/force;P/1B/3B force-only batter out|Force-only batter out|
|7|Early $5526|P/1B/3B try home;2B/SS $5526|All try home|
Text79 bypasses this table. P=pitcher;1B/2B/3B/SS=physical3/4/5/6. Cleanup:
* $549D/$54C2/$546F:08, remove slot1 (batter); existing runners advance1 while inning live.
* $5543:88, remove slot1; only forced runners advance, batter out. Unforced third holds with first+third/no second.
* $54E4/$5664:08, remove slot2 (original first); batter first, one provisional out; others advance1 while live.
* $56AB: add out,08, remove slots2 and1 (original first,batter). If that ends the inning, advances do not score.
### $5526 and DP arithmetic
$5526 masks raw&3:0 -> force original first(1/4);1 -> batter out/all advance(1/4);2/3 -> $5613 DP test(1/2).
```
D8=30: T=effective rating(physical1B) $5619..$5629
otherwise:
z=rating(physical2B)+rating(physicalSS)
k=7 if z<4, 8 if z==4, 9 if z>4
T=(k-batter_speed)&255 $5631..$5659
P(DP | gate)=Q(T); failure forces original first $565D..$56AB
```
Batter speed and IF ratings matter; runner speed does not enter this gate. Pitcher/other contexts use the2B+SS formula, rather than necessarily the fielder's own rating.
$55A9 first+third, corners: middle IF D9 in43/44/45/63/64/65 sign-splits DP-test versus force equally; other middle geometries go DP-test directly. D9=45/65 are unreachable from this sampler but remain native comparisons. P/1B/3B use force-only batter out. Infield's odd B3=9 goes force-only batter out. Normal already took $5526.
### Home play $6636
Cancel provisional out, then:
```
T=(original_third_speed
+ I(D8 !=50 AND D8 <31 AND D7 >=3)
+ I(original_mask !=7))&255
P(home safe)=Q(T) $6647..$667D
```
**Correction:** `CMP #$1F; BCS $665B` means the extra depth bonus requires D8<31, not D8>=31. It is not the broad middle-infield bonus in the earlier notes. D8=40/60 get no depth bonus. Pitcher home plays can still read incoming D7, so loaded corners/infield may need that byte.
Safe:08, third scores, batter first, no out, no hit/error credit. Called a safe fielder's-choice result, not a single.
Failure: restore provisional out. Nonloaded: stage/remove third at home,08; batter first, other runners+1, one out/no run. Loaded: pitcher uses a new sign bit for second-out probability1/2; other fielders query their physical effective rating r and use Q(r). Second-out branch removes third at home plus batter at first; alternate retires only third. Native $3228, not a newly introduced rule, suppresses inning-ending scoring.
## 5. Air outs and tag-ups
$5259 adds batter out/removes him. At3 outs later advances cannot score. Otherwise $3580 selects $5395,$5303,$5298 with51,51,154 byte weights:
* $5395 raw<85 -> $5413 -> free third-home(8B). Other171/256 hold runners. Its high-raw rejection accepts only depth0: the sampler produces0..2 despite comparisons with both0 and3. The $5443 tail there returns without $52F8.
* $5303 all text/sign/depth branches converge $52F8:8B, third home free.
* $5298 samples D7=U4,OF=7+U3. Depth1 always accepted; others accepted on sign-half; joint rejection gives accepted depth masses1/5,2/5,1/5,1/5. Depth0 holds;2/3 freely advance third. Depth1 with third: raw<153 freely advances, otherwise103/256 calls $64BB with C5=3,class6, staging third home and testing speed/rating. Other runners hold. Without third no attempt. Failure adds a runner out after batter out.
State closure holds for every mask. Universal official flyout-versus-lineout labels remain unverified for these narrative routes, so they retain `air_out_unspecified`. This is taxonomy uncertainty, not unknown runner-transition mass. Separate class6 lineout/pop/foul kernels remain; the lineout subtype's first-runner DP probability is1/8 with first occupied and <2 outs.
## 6. Conditional probability illustrations
Generated by exact branch enumeration, not Atari sampling. Unless specified: offense0, one runner, outs1, batter speed3, all effective ratings2, supplied native cache=(3,3,3,3), context=(2,70,72). Fractions are exact; percentages are formatted. Different configurations can change these joint results.
### Selected single: second-to-home, second only, one out
|Speed|Defense|Scores|Thrown out|Finishes third|
|---:|---|---:|---:|---:|
|1|normal|762097837717/2933462663168 (25.979463%)|858501431915/2933462663168 (29.265804%)|5128372631/11458838528 (44.754733%)|
|1|either in|644589269545/2933462663168 (21.973665%)|924967672535/2933462663168 (31.531599%)|5327756723/11458838528 (46.494736%)|
|2|normal|886796369727/2933462663168 (30.230362%)|733802899905/2933462663168 (25.014905%)|5128372631/11458838528 (44.754733%)|
|2|either in|778942115835/2933462663168 (26.553674%)|790614826245/2933462663168 (26.951590%)|5327756723/11458838528 (46.494736%)|
|3|normal|7864834409/22917677056 (34.317764%)|4796097385/22917677056 (20.927502%)|5128372631/11458838528 (44.754733%)|
|3|either in|7094746445/22917677056 (30.957529%)|5167417165/22917677056 (22.547735%)|5327756723/11458838528 (46.494736%)|
|4|normal|565698668181/1466731331584 (38.568663%)|244600966635/1466731331584 (16.676603%)|5128372631/11458838528 (44.754733%)|
|4|either in|521240195625/1466731331584 (35.537537%)|263538275415/1466731331584 (17.967727%)|5327756723/11458838528 (46.494736%)|
|5|normal|3673653/5595136 (65.657975%)|0 (0.000000%)|1921483/5595136 (34.342025%)|
|5|either in|7242807/11190272 (64.724137%)|0 (0.000000%)|3947465/11190272 (35.275863%)|
### Selected single: first-to-third, first only, one out
|Speed|Defense|Finishes third|Thrown out|Finishes second|
|---:|---|---:|---:|---:|
|1|normal|762097837717/2933462663168 (25.979463%)|858501431915/2933462663168 (29.265804%)|5128372631/11458838528 (44.754733%)|
|1|either in|644589269545/2933462663168 (21.973665%)|924967672535/2933462663168 (31.531599%)|5327756723/11458838528 (46.494736%)|
|2|normal|886796369727/2933462663168 (30.230362%)|733802899905/2933462663168 (25.014905%)|5128372631/11458838528 (44.754733%)|
|2|either in|778942115835/2933462663168 (26.553674%)|790614826245/2933462663168 (26.951590%)|5327756723/11458838528 (46.494736%)|
|3|normal|7864834409/22917677056 (34.317764%)|4796097385/22917677056 (20.927502%)|5128372631/11458838528 (44.754733%)|
|3|either in|7094746445/22917677056 (30.957529%)|5167417165/22917677056 (22.547735%)|5327756723/11458838528 (46.494736%)|
|4|normal|565698668181/1466731331584 (38.568663%)|244600966635/1466731331584 (16.676603%)|5128372631/11458838528 (44.754733%)|
|4|either in|521240195625/1466731331584 (35.537537%)|263538275415/1466731331584 (17.967727%)|5327756723/11458838528 (46.494736%)|
|5|normal|3673653/5595136 (65.657975%)|0 (0.000000%)|1921483/5595136 (34.342025%)|
|5|either in|7242807/11190272 (64.724137%)|0 (0.000000%)|3947465/11190272 (35.275863%)|
### Selected double: first-to-home, first only, one out
First runner speed3; incoming context(2,70,72). Vary the empty original-third cache. Conditional tree does not read first runner speed, so changing it to1 or5 leaves these probabilities unchanged. Positioning does not alter this conditional double tree.
|Third-cache byte|Scores|Thrown out at home|Finishes third|
|---:|---:|---:|---:|
|1|3099831/16252928 (19.072447%)|31212051/130023424 (24.004945%)|74012725/130023424 (56.922609%)|
|2|14666121/65011712 (22.559198%)|26678457/130023424 (20.518193%)|74012725/130023424 (56.922609%)|
|3|33691467/130023424 (25.911844%)|174369/1015808 (17.165547%)|74012725/130023424 (56.922609%)|
|4|38225061/130023424 (29.398596%)|8892819/65011712 (13.678795%)|74012725/130023424 (56.922609%)|
|5|42758655/130023424 (32.885348%)|3313011/32505856 (10.192044%)|74012725/130023424 (56.922609%)|
### Groundball examples: complete joint kernels
All speeds3/ratings2; incoming context(2,70,72), all empty cache bytes3. Third-runner score/home-out columns are zero when no third runner. Batter-safe uses final live base/home.
|Bases|Outs|Defense|Third scores|Third out at home|DP|Batter safe|
|---|---:|---|---:|---:|---:|---:|
|first|0|normal|0 (0.000000%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|first|0|corners|0 (0.000000%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|first|0|infield|0 (0.000000%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|first+third|1|normal|210461/262144 (80.284500%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|first+third|1|corners|2779/8192 (33.923340%)|0 (0.000000%)|1197/8192 (14.611816%)|1995/8192 (24.353027%)|
|first+third|1|infield|49/512 (9.570312%)|0 (0.000000%)|0 (0.000000%)|0 (0.000000%)|
|third|1|normal|497/1024 (48.535156%)|0 (0.000000%)|0 (0.000000%)|0 (0.000000%)|
|third|1|corners|497/1024 (48.535156%)|0 (0.000000%)|0 (0.000000%)|0 (0.000000%)|
|third|1|infield|66185/262144 (25.247574%)|61047/262144 (23.287582%)|0 (0.000000%)|399/1024 (38.964844%)|
|loaded|0|normal|1 (100.000000%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|loaded|0|corners|43400511/67108864 (64.671801%)|23708353/67108864 (35.328199%)|838034381/4294967296 (19.512008%)|2627509299/4294967296 (61.176468%)|
|loaded|0|infield|25116735/67108864 (37.426852%)|41992129/67108864 (62.573148%)|657341645/4294967296 (15.304928%)|3226583859/4294967296 (75.124760%)|
|loaded|1|normal|210461/262144 (80.284500%)|0 (0.000000%)|51683/262144 (19.715500%)|126109/262144 (48.106766%)|
|loaded|1|corners|36863295/67108864 (54.930590%)|23708353/67108864 (35.328199%)|838034381/4294967296 (19.512008%)|2627509299/4294967296 (61.176468%)|
|loaded|1|infield|25116735/67108864 (37.426852%)|41992129/67108864 (62.573148%)|657341645/4294967296 (15.304928%)|3226583859/4294967296 (75.124760%)|
## 7. Requested comparison: third, one out
Original **CAREW vs FELLER** fixture in STATIC_TEST_VECTORS.json: batter ATR offset59469, pitcher60024, batting header59408 (A.L. ALL-TIME ALL-STARS). Batter speed4 from record; third runner R3 speed3; outs1. Defensive lineup is a **controlled configuration of effective rating2 at all nine positions**, not a claim about the team's actual historical defenders. Unchanged fixture baselines; explicitly supplied live tail cutpoints(243,247,253) throughout retries. MATCHUP_ANALYSIS.md notes that their lifetime across every actual runtime path is not globally proved. The comparison is conditional on these cutpoints, not an unconditional forecast of an arbitrary ATR session. Recalculate initial counts for each position:
|Initial class|Normal|Corners|Infield|
|---|---:|---:|---:|
|Walk|25|25|25|
|K|14|14|14|
|Single|62|74|86|
|Double|13|13|13|
|Triple|4|4|4|
|HR|4|4|4|
|Mixed out|121|109|97|
|HBP/interruption|4|4|4|
|Error|6|6|6|
|Groundball|3|3|3|
Counts are out of256, not final results. Here selected single/double/triple/HR/error always scores third; walk/HBP alone do not force him. Mixed outs, groundballs and interruptions supply other scoring/out/hold paths.
Groundball alone: normal/corners score497/1024, home-out0, hold527/1024. Infield score66185/262144, home-out61047/262144, hold527/1024. Its home-safe and home-out paths both leave batter first, combined399/1024. Text79 bypass contributes49/512 scoring against every position. These are not complete-PA probabilities.
### Completed-PA measures from the joint distribution
Fixed actions, lineup, initial records/header; IID material bytes. No intervening outer-driver game-over (such as a walk-off wild pitch) or management change. This is a PA projection, not an inning/win simulation.
Foul retries are self-loops for relevant baseball state: if per-selection mass f, other transitions receive1/(1-f). Nonterminal class7 advances existing runners, leaves batter active. Without first occupied, these advances progress toward empty bases within at most3 advances; each successor gets its own same-policy kernel. This integrates both repeated fouls and pre-completion runs; it does not discard unknown outcomes.
Predicates:
* Scores: R3 in scored, including an earlier interruption.
* Out at home: R3 in retired. In this third-only swing-away state, its only retirements are home-play/tag-up throws; do not use that shortcut for arbitrary runners.
* Remains third: movement(R3,'3').
* Batter safe: final live base1/2/3 or home, not hit probability. Generic stranded-hit events retain hit credit separately. No such safe-batter/inning-ending-runner-out ambiguity occurs in this fixture state.
* Inning ends: outs==3.
These overlap. Only the first three partition this runner's possibilities here.
|Completed-PA measure|Normal|Corners in|Infield in|
|---|---:|---:|---:|
|Runner scores|59.52432865%|61.96289608%|60.54989586%|
|Runner out at home|0.91894299%|0.82714916%|4.58318954%|
|Runner holds third|39.55672836%|37.20995477%|34.86691461%|
|Batter safe|45.74269457%|50.49074317%|61.66909987%|
|Inning ends|0.91894299%|0.82714916%|0.73550135%|
|Unresolved transition mass|0|0|0|
|Unexpanded continuation mass|0|0|0|
Exact rational values:
|Measure|Normal|Corners|Infield|
|---|---:|---:|---:|
|Runner scores|6340440439/10651847040|6605451331/10660333440|51679674419/85350558720|
|Runner out at home|16314067/1775307840|14696143/1776722240|186275137/4064312320|
|Runner holds third|4213522199/10651847040|3966705251/10660333440|3719888303/10668819840|
|Batter safe|42236739404800/92335486135707|46695189091328/92482673382147|76165431398767/123506637129316|
|Inning ends|16314067/1775307840|14696143/1776722240|1868317/254019520|
Air-out taxonomy is still unclassified where noted, but none of these five predicates depends on its fly/line label. Every measure above sums completed joint-branch mass; no normalization of unresolved outcomes occurs.
Infield reduces groundball scoring but increases the initial single weight enough that full-PA scoring here remains above normal. Corners also increases it here. No universally optimal defense follows: matchup, speeds, configuration, outs and continuation values matter. No win probability is calculated.
### Reproduction
```python
from pathlib import Path
import json
from reverse_engineering import MATCHUP_CALCULATOR as mc
from reverse_engineering import PLATE_APPEARANCE_ENGINE as pa
v=json.loads(Path('reverse_engineering/STATIC_TEST_VECTORS.json').read_text())
records=[bytes.fromhex(v[k]['hex']) for k in ('batter','pitcher','team_header')]
s=pa.GameState(pa.Runner('Carew',4),(None,None,pa.Runner('R3',3)),
outs=1,fielding_ratings=(2,)*9)
for defense,name in [(1,'normal'),(6,'corners'),(7,'infield')]:
initial=mc.calculate_records(*records,defense=name,tail=(243,247,253))
result=pa.resolve_plate_appearance(s,pa.Actions(0,defense),initial)
assert result.complete_game_state and result.unresolved_mass==0
for label,test in {
'scores': lambda o:'R3' in o.scored,
'home_out': lambda o:'R3' in o.retired,
'holds': lambda o:('R3','3') in o.movements,
'batter_safe': lambda o:o.batter_result in ('1','2','3','home'),
'inning_ends': lambda o:o.inning_ended,
}.items():
print(name,label,pa.outcome_measure_bounds(result,test))
```
## 8. API and remaining boundaries
Existing public function signatures and original constructor positional fields remain. Appended optional GameState fields: `cached_speeds=(batter,first,second,third)` raw bytes/None, `native_context=(D7,D8,D9)` bytes/None. Empty tuple means unknown. Occupied slots use Runner.speed, as $43C1 refreshes them; empty slots depend on supplied history. Runner retains its existing speed1..5 domain. Raw nonstandard active-player records need a broader interface.
This is algebraic branch translation, **not a 6502 interpreter**. Gates, integer buckets, byte wrap, remaps and joint rejection are preserved. Terminal results marginalize presentation geometry, rather than inventing final geometry bytes. Original speed-cache values are retained. The caller must choose the next batter and update actual records before a new PA; this is not a cycle/state-exact machine replacement.
Outcome exposes `batter_result`, `runner_results`, `outs_added`, `inning_ended`; state.batter_active, scored, retired, runs, movements, hit/error counters and provenance remain. Serialization includes new joint fields and batter-active status. Inning-ending nonretired players are stranded, not live base occupants. Single/double retain hit credit when another runner is retired. A safe home-play choice is not relabeled a hit.
`outcome_measure_bounds(result,predicate)` returns known completed contribution, conservative upper bound, unresolved mass and continuation mass. It does not normalize away either missing part. complete_game_state distinguishes state closure from complete_categories; the latter remains false for unclassified air outs. require_complete=True still refuses incomplete taxonomy.
|Remaining boundary|Reason/address/treatment|
|---|---|
|Double, first occupied, incoming D7 unknown|$4E27/$4DA8 retain it; $4FFB compares4. Supply context or retain affected mass.|
|Double attempt, original third empty|$5067 sets C5=3; $64D4 reads stale $1D0D. Supply cache/history or retain affected mass.|
|Single first-only, two outs|$65C0 reads original second cache before later speed gate. Supply empty-second byte where material.|
|Loaded corners/infield pitcher home play|$5CF1 leaves D7 intact; $6654 may read it. Supply it or retain conditional mass. Normal early5526 avoids it.|
|Nonstandard geometry/extended zero-rating lookup|May request physical position11 (e.g. retained D8=0), or table index beyond0..5. No complete out-of-range roster lookup supplied.|
|First-occupied PA continuation closure|Explicit horizon remains. Missed fouls can remap D8/D9 while leaving D7; cannot collapse every state into one generic self-loop. Class7 changes occupied/cache identities at next acceptance.|
|General offense1..4|Still explicitly unresolved; offense0 ground table does not implement stealing/hit-and-run/etc.|
|Defense5/8|Existing pitchout/intentional-walk diversions precede class selection; not ordinary groundball position columns.|
|Air-out fly/line labels|State closure at5395/5303/5298 known; universal official scoring taxonomy remains unknown.|
|Live tail cutpoints|Initial calculator requires supplied tail bytes. Saved243/247/253 are assumed stable here; verify live values and lifetime before claiming an arbitrary native-session forecast.|
|Hardware RNG/renderer/OS|IID is conditional; no native correlation or timing validation.|
|Outer game-over/AI/inning progression|Not modeled; interrupted walk-off may end game before PA completion.|
## 9. Targeted Altirra experiments (not performed)
If later authorized, operate a disposable image copy and preserve the original hash. Break/inspect/force debugger RAM or decision returns, not disk patches. Log B1/B2/B3, DB,D6,D7/D8/D9,A8,B4..B8,B9..BD,$1D0A..D,C5,D5,score and defensive rating lookup/return. Record entry/exit bytes, not just animation.
1. $6587 with second occupied, speed3,D8=70,D7=1,outs0: raw $6614=50/51 splits advance/throw; $6558 U10=4/5 brackets T5 at rating2. Expect third versus home safe/out; batter first. Selected speed5 should group+2 without throw. First-only/two-outs: vary retained $1D0C, keeping first speed fixed.
2. $5FB7/$5FCD, first/second, force extra branch. Verify08;0A sends first third, second home.
3. $5054 first only: put different bytes in $1D0B/$1D0D; log C5=3 at $64D4. Vary first speed then only third cache; bracket $655B threshold. Repeat third occupied to verify refresh.
4. $4DA8 incoming D7=3/4, known D8; $4DC0=169/170 brackets overwrite; $4E08 sign chooses attempt/hold. Verify11;90 versus90;23 first-runner result. Repeat $4E27 and confirm D7 survives remapping.
5. First+third/loaded B3=0/8/9: break $5D34,$5526,$55A9,$5586, hold geometry fixed. Verify normal early5526 before later tables.
6. $5CC4 text79 versus other, raw pitcher31/IF32 boundary. Text79 IF path must reject to D8=30 then546F, bypassing later DP/positioning table.
7. Third only/one out, B3=9,D8=40/60,speed3: D7=1..4 must not add bonus at6650; U10=3/4 at6678 brackets home safe/out. Repeat D8=30,D7=2/3 and D8=50 for narrow bonus.
8. At5613 vary batter speed and physical2B/SS ratings; D8=30 direct1B gate. At66CB bracket rating2 with U10=1/2; verify third+batter versus third only, including pre-play one out/score suppression.
9. $5298 log accepted depths, force $52EE=152/153; $64BB class6 must stage third without class2's preparatory advancement. Other runners hold.
10. First+third/two outs/single->$64BB: verify earlier3228 score remains after later failed throw makes third out. Contrast DP increment-before-advance.
11. Collect joint native RANDOM samples plus cycle counts/renderer modes; examine rejection-conditioned pairs and adjacent correlation before treating conditional IID probabilities as empirical Atari frequencies.
## 10. Validation and preservation
All 29 new runner tests pass, as do the 17 PA tests. Full discovery ran99 tests:98 passed; the sole failure is the already documented frozen RESEARCH_INDEX.md hash in test_bunt_algorithms.py, which intentionally predates the authorized index updates. Existing arithmetic, matchup, reference, bunt and pitcher-management behavioral tests pass. That historical test/manifest remains unchanged.
Checks include288 base/out/class/defense combinations with explicit valid native inputs; strict probability conservation, unique scored identities, runner destinations and outs; hand-decomposed home/DP/tag-up/extra-base gates; chronology of earlier scoring versus later third out; retained-cache dependence and255-byte wrap; all25 remap entries, the full throw-position table and eight targeted original opcode/operand anchors checked against ATR bytes. The full report reproduction example was executed successfully through package imports. These are static/model validations, not an independent native oracle.
Pre/post SHA-256 fingerprints covered61 pre-existing source/report/disk/reference/data files. Only the authorized engine and index plus the minimally updated PA coverage assertion changed. The original ATR, all original applications, MATCHUP_CALCULATOR.py, disassembly/indexes, historical reports and all other fingerprinted evidence match their pre-task hashes. The two requested runner files are the only additions.
The prior PA analysis remains an unchanged checkpoint. Its gaps and older positioning tables are superseded only by explicit closures/corrections here. One old PA test assertion that an unconfigured first-only single was100% unresolved was updated to require unknown mass plus newly known branches. The historical checksum manifest/test was not rewritten to conceal authorized index updates.