h1. #11180 suites — trunk @p2j@ vs @11180c@

Side-by-side comparison of the two recorded runs in this directory:

|_.Run|_.Engine|_.Report|
|*trunk*|@/home/sbi/projects/p2j@, brz trunk rev <notextile>ca@goldencode.com-20260807191255</notextile> (2026-08-07)|"@p2j/RESULTS.md@":p2j/RESULTS.md|
|*11180c*|@/home/sbi/projects/11180c@, brz revno 16697, rev-id <notextile>sbi@goldencode.com-20260731102243</notextile> (2026-07-31)|"@11180c/RESULTS.md@":11180c/RESULTS.md|

Both runs used the identical harness — same @abl/launcher.p@ @?prog=@ driving, same click coordinates, same client reaping, no server restarts, 27 program runs each — so the differences below are engine-attributable, subject to the confound in §6.

Expected results throughout are the *native OpenEdge* baselines in @docs/testsuite/*.md@ and @docs/screen-testsuite.md@. FWD behaviour is never the expectation.

---

h2. 1. Verdict tallies

|_.Suite|_. |_.trunk|_.11180c|
|*File-logged (10)*|Pass / match|3|*6*|
| |Partial|2|2|
| |Fail|5|*2*|
|*On-screen (17)*|Match|4|*11*|
| |Partial / deviates|1|2|
| |Undetermined|2|0|
| |Fail|8|*2*|
| |OE inconclusive|2|2|

h2. 2. File-logged suite — per test, with the exact log delta

@<@ = trunk, @>@ = 11180c. Diffs taken between @p2j/logs/@ and @11180c/logs/@.

|_.#|_.Test|_.trunk|_.11180c|_.Log delta|
|1|@tc11180d_false_steal@|FAIL|*FAIL*|_logs identical_|
|2|@tc11180e_dest_browse_leave@|FAIL|PARTIAL|@< 08 FOCUS is now: <none/invalid>@ → @> 08 FOCUS is now: FILL-IN/fC@|
|3|@tc11180f_btn@|PARTIAL|*PASS*|@> 13 fSib LEAVE@ added|
|4|@tc11180f_btn_browse@|PARTIAL|PARTIAL|@> 13 fSib LEAVE@ added|
|5|@tc11180f_btn_browse_ovl@|PASS|*PASS*|@> 13 fSib LEAVE@ added|
|6|@tc11180f_btn_browse_sep@|FAIL|*PASS*|@09 frmB ENTRY@ → @09 fDest LEAVE@; settled focus @<none/invalid>@ → @FILL-IN/fSib@; @+ 14 fSib LEAVE, 15 frmB LEAVE, 16 frMain ENTRY@|
|7|@test-11180-f-redirect-to-target@|FAIL|*PASS*|@< 08 FOCUS is now: <none/invalid>@ → @> 08 FOCUS is now: FILL-IN/fT@|
|8|@test-11180-g-teardown-apply@|PASS|PASS|_identical_|
|9|@test-11180-g-teardown-hide-apply@|PASS|PASS|_identical_|
|10|@test-11180-g-teardown-mouse@|FAIL|*FAIL*|_identical_|

Four logs are byte-identical (1, 8, 9, 10) — those code paths are untouched by 11180c.

The @_sep@ change at line 09 is a *substitution*, not an addition: trunk's cosmetic @frmB ENTRY@ is replaced by the @fDest LEAVE@ that the OE baseline requires there.

h2. 3. On-screen suite — per probe

|_.Probe|_.trunk|_.11180c|_.Movement|
|A @-entry-choose-leave@|FAIL|*MATCH*|*Fixed* — teardown pair fires twice; originating defect gone|
|B1 @-reentrant-leave-fillin@|MATCH|MATCH|unchanged|
|B2 @-reentrant-leave-browse@|MATCH|MATCH|unchanged|
|B3 @-reentrant-leave-frameleave@|undetermined|MATCH|trace unchanged; verdict resolved by evidence, not by a fix (§5)|
|B4 @-reentrant-leave-delete@|undetermined|*DEVIATES*|*behaviour changed* — 12 → 14 lines, abandoned-target LEAVE pair added|
|B5 @-reentrant-leave-browse-caller@|FAIL|*MATCH*|*Fixed* — Effect B correct, focus @fiZ@|
|B6 @-reentrant-leave-browse-nodelete@|MATCH|MATCH|unchanged|
|B7 @test-11180-1@|PARTIAL|*DEVIATES*|focus fixed (@<invalid>@ → @fiThird@), but LEAVE pair added|
|C1 @-d-false-steal@|FAIL|*MATCH*|*Fixed* — focus @fB@|
|C2 @-e-dest-browse-leave@|FAIL|*MATCH*|*Fixed* — Effect B + focus @fC@|
|C3 @-e-mouse-dest-browse-leave@|FAIL|FAIL|unchanged|
|C4 @-f-redirect-to-target-gui@|FAIL|*MATCH*|*Fixed* — focus @fT@; residual @frmB ENTRY@ also gone|
|C5 @-g-teardown-apply-gui@|consistent|consistent|unchanged (OE inconclusive)|
|C6 @-g-teardown-hide-apply-gui@|MATCH|MATCH|unchanged|
|C7 @-g-teardown-mouse-gui@|diverges|diverges|unchanged (OE inconclusive)|
|C8 @-h-redirect-to-sibling-gui@|FAIL|*MATCH*|*Fixed* — @fA LEAVE@ emitted in OE order; both residuals gone|
|C9 @-i-mouse-frame-leave-gui@|FAIL|FAIL|unchanged|

h2. 4. What the comparison shows

*Six probes and three file tests went FAIL → MATCH*, and every one sits on the @APPLY 'ENTRY'@ path (Site A). The common mechanism: focus now settles on a real widget instead of @<invalid>@, and the abandoned-target @LEAVE@ is emitted where OE emits it. The originating CounterAct defect (group A) is resolved.

*Nothing on the mouse path moved.* C3, C9, C7 and file test 10 are unchanged, and three of the four byte-identical logs are here. This matches the source: @FocusManager.java@ is byte-identical between the two trees, so Site B received no change. @docs/screen-testsuite.md@ §1 requires the two engine sites to agree; after 11180c they diverge more than before — Site A now emits Effect B, Site B still emits nothing and lets the clicked destination win.

*Two probes moved the wrong way* (B4, B7): the abandoned-target @LEAVE@ pair is now emitted where OE emits nothing. Both are new in 11180c. The underlying reason is symmetrical and worth stating plainly — *neither engine implements OE's both-Browse gate on that emit*:

|_.Probe|_.Old focus → target|_.OE|_.trunk|_.11180c|
|B5 @-browse-caller@|browse → browse|emits|silent ✗|emits ✓|
|C2 @-e-dest-browse-leave@|browse → browse|emits|silent ✗|emits ✓|
|B4 @-reentrant-leave-delete@|fill-in → browse|*silent*|silent ✓|emits ✗|
|B7 @test-11180-1@|browse → fill-in|*silent*|silent ✓|emits ✗|

Trunk is uniformly silent, so it accidentally satisfies the two cases where OE is silent and fails the two where OE speaks. 11180c is uniformly loud, so it satisfies the opposite pair. Probes 4 and 7 exist precisely to pin this gate down. Focus outcomes are unaffected in both directions; the cost of the 11180c side is spurious @LEAVE@ triggers on widgets that were never entered.

The same-frame sibling-redirect path is not affected on either engine: @tc11180f_btn@ and @tc11180f_btn_browse@ correctly emit no @fDest LEAVE@, and @_sep@ correctly does.

h2. 5. Two verdict changes that are not behaviour changes

B3 and B4 were scored "undetermined" on trunk only because the probes' own dynamic overlay hides the trailing @-- FOCUS now = …@ line on the FWD web canvas (see @p2j/RESULTS.md@ §D3). In the 11180c run their event identities were resolved from line ordering — frame-before-widget is the ENTRY pair, widget-before-frame the LEAVE pair, as fixed by B2/B5 where the full text is legible and by the probe source, which registers only ENTRY/LEAVE loggers for those widgets.

* *B3's trace is identical across the two runs.* Its upgrade to MATCH is better evidence, not a fix.
* *B4's trace genuinely changed* (12 → 14 lines), so its move to DEVIATES is a real behaviour change.

h2. 6. Confound

@11180c@ is revno 16697 (2026-07-31); the trunk tested is 2026-08-07. The two trees therefore differ by roughly a week of trunk drift *plus* the #11180 work, and the 119-line @ThinClient.java@ diff contains both. The attributions in §4 are supported by the history entry (*1105*, HC 20260723 / SBI 20260731) and by the shape of the code (@pendingEntryTarget@, the @destroyFrame()@ recovery, the @downMouseButtonNewFocus@ relaxation), but a strictly clean A/B would compare 11180c against its own merge base rather than current trunk.

h2. 7. Open items after 11180c

# *Site B (@FocusManager@) has no corresponding change* — the mouse path still drops the clicked target and never emits Effect B (3 failing probes, 1 inconclusive).
# *The abandoned-target @LEAVE@ fires without the both-Browse gate* — 2 probes over-emit (§4).
# *The head-less twins of review points #1 and #2 still fail where their GUI twins pass* — @tc11180d@ vs @-d-false-steal@, @tc11180e@ vs @-e-dest-browse-leave@. Same topology, opposite outcome, depending on whether the transfer is driven by a synchronous top-level @APPLY@ chain or from inside the @WAIT-FOR@ loop. The file-logged suite therefore currently understates the fix and should be resolved before it is used as the regression gate.

---

> *Note:* this directory lives under @deploy/@, which is regenerated by @ant deployapp@ and removed by @ant clean.all@. An earlier rebuild already deleted @p2j/logs/*.log@ once (restored from the run's scratchpad). Copy this tree elsewhere if it needs to survive a rebuild.
