Context
Sub-issue of #15551 under portability authority #15243 / ADR 0029. PR #15552 produced one complete, independently mergeable tranche while the parent remains broader: matrix-runner provenance plus the macOS row-5 denied-permission fallback receipt. The ready-for-review gate correctly refuses a non-closing PR, so this ticket records the delivered row as its own substantial evidence unit rather than falsely closing rows 4, 6, and 7.
The code was authored under #15551's valid ticket authority. This is decomposition of that parent outcome, not retroactive authority for untracked work.
Problem
The matrix could serve one dynamic port while a spec navigated to a different fallback port, and macOS row 5 remained NOT_YET_MEASURED. A green denial probe alone would be insufficient: the receipt has to traverse the real product gesture, prove same-instance continuity and JSON persistence, return home, close natively, and leave cleanup idempotent.
Intended solution
- Make the runner's resolved port the sole authority consumed by every matrix worker/spec.
- Exercise real browser-context
window-management denial and exact NotAllowedError.
- Drive the real G1 boundary gesture into exactly one tear-out vessel.
- Prove singleton component identity, exact mount/heartbeat transitions, and actual JSON perspective-writer acceptance while detached and returned.
- Close the vessel natively and prove one semantic home, cleared lifecycle maps, and repeated-terminal no-op.
- Promote only macOS row 5 to
PASS_FALLBACK; retain the canonical Demo B competing-vessel red control and leave rows 4, 6, and 7 open.
Contract ledger
| Surface |
Required truth |
Falsifier |
| Runner provenance |
page navigation and web server consume one resolved dynamic port |
fresh unpinned run selects a non-default port |
| Permission denial |
browser context reports denied; getScreenDetails() rejects NotAllowedError |
denial is asserted before the gesture |
| Gesture/vessel |
real boundary executor creates exactly one popout |
page count + singleton component census |
| Permanence |
component id and vessel binding remain stable; mounts 1 → 2 → 3, heartbeat 0 → 1 → 2 |
exact deltas, not greater-than checks |
| JSON persistence |
real DockPerspectiveStore.savePerspective accepts detached and returned documents |
stored JSON-only zones equal worker truth |
| Cleanup |
native close yields one home, three lifecycle maps empty, repeated disconnect no-op |
state read after both terminals |
| Ledger |
only row 5 advances |
rows 4, 6, 7 remain NOT_YET_MEASURED |
Acceptance criteria
Evidence
Required level: L4 headed real-browser receipt. PR #15552 records 3/3 exact-shape row-5 runs, a combined row-2/row-5 run, dynamic ports, and the canonical Demo B red control.
Out of scope
- macOS row 4 store continuity.
- macOS row 6 three-target arbitration.
- macOS row 7 drop/cancel/blocked-acquisition terminal matrix.
- Production fixes for #15395/#15396.
- Windows/Linux receipts.
Relationships
Parent: #15551 · Authority: #15243 / ADR 0029 · Delivery: PR #15552 · Production split: #15395 / #15396.
Freshness receipt
Immediately before creation, targeted all-state searches for the row-5 permission fallback, PASS_FALLBACK / NotAllowedError, and dynamic-port matrix work returned only #15551 and #15243; no equivalent child exists.
Origin Session ID: ad71d4c3-3e37-4a17-8df7-8415509def84
Retrieval Hint: macOS row 5 denied screen details fallback matrix runner dynamic port JSON perspective native close
Context
Sub-issue of #15551 under portability authority #15243 / ADR 0029. PR #15552 produced one complete, independently mergeable tranche while the parent remains broader: matrix-runner provenance plus the macOS row-5 denied-permission fallback receipt. The ready-for-review gate correctly refuses a non-closing PR, so this ticket records the delivered row as its own substantial evidence unit rather than falsely closing rows 4, 6, and 7.
The code was authored under #15551's valid ticket authority. This is decomposition of that parent outcome, not retroactive authority for untracked work.
Problem
The matrix could serve one dynamic port while a spec navigated to a different fallback port, and macOS row 5 remained
NOT_YET_MEASURED. A green denial probe alone would be insufficient: the receipt has to traverse the real product gesture, prove same-instance continuity and JSON persistence, return home, close natively, and leave cleanup idempotent.Intended solution
window-managementdenial and exactNotAllowedError.PASS_FALLBACK; retain the canonical Demo B competing-vessel red control and leave rows 4, 6, and 7 open.Contract ledger
denied;getScreenDetails()rejectsNotAllowedError1 → 2 → 3, heartbeat0 → 1 → 2DockPerspectiveStore.savePerspectiveaccepts detached and returned documentsNOT_YET_MEASUREDAcceptance criteria
deniedand exactNotAllowedError.PASS_FALLBACKwithout promoting rows 4, 6, or 7.src/**andapps/**remain untouched.Evidence
Required level: L4 headed real-browser receipt. PR #15552 records 3/3 exact-shape row-5 runs, a combined row-2/row-5 run, dynamic ports, and the canonical Demo B red control.
Out of scope
Relationships
Parent: #15551 · Authority: #15243 / ADR 0029 · Delivery: PR #15552 · Production split: #15395 / #15396.
Freshness receipt
Immediately before creation, targeted all-state searches for the row-5 permission fallback,
PASS_FALLBACK/NotAllowedError, and dynamic-port matrix work returned only #15551 and #15243; no equivalent child exists.Origin Session ID:
ad71d4c3-3e37-4a17-8df7-8415509def84Retrieval Hint:
macOS row 5 denied screen details fallback matrix runner dynamic port JSON perspective native close