Refs #16455 · parent of the gate-flip half
Context
#16455 owns the Epic's close condition and prescribes its own delivery order: "The harness lands first and lands red… It runs opt-in — outside the default CI gate — while the implementation leaves are open, and moves into the gate when it goes green. That flip is this leaf's completion."
So #16455 has two separable halves with a real sequencing boundary: the harness, deliverable now against five open legs, and the gate-flip, which cannot happen until those legs land and the scenario goes green. This ticket is the first half, filed per §9.1 — a PR delivering the harness cannot honestly Resolves #16455, because pointing a closing keyword at it would auto-close a ticket whose completion condition is not met. Precedent: #16486 / PR #16483, four hours earlier, same shape.
The Problem
A red-first harness has nowhere honest to land. Refs-only is permitted for drafts, and draft PRs cannot be reviewed — so the delivery either lies about its close target or sits unreviewable.
The harness itself is also not trivially placeable. test/playwright/integration-parity/ already provisions a disposable Compose plane and is already in the default gate, so reusing it would turn the shared gate red on day one — which #16455's own Avoided Traps section forbids, since a permanently-red check gets routed around within a week and stops meaning anything.
The Architectural Reality
test/playwright/playwright.config.integration-parity.mjs — the sibling precedent: testDir, a webServer fixture that materialises Compose children, and resolveFreePortSync for port handling. Gated via .github/workflows/test.yml.
test/playwright/integration-parity/fixtures/parityComposeWebServer.mjs — the provisioner (waitForServices, readComposeServices, cleanup). Reusable; nothing in that project touches neo-revision, deploy-pipeline, redeployPreflight or ls-remote, which is why #16455's premise holds.
ai/scripts/maintenance/migrateDeployment.mjs — the one chain leg with a shipped executable surface today.
The Fix
A separate opt-in Playwright project carrying the Epic's outcome sentence as one scenario, absent from .github/workflows/ until green.
Two properties do the work. The red names which leg is missing, with owner and obligation, so the failure is a work list rather than an opaque wall — and the shipped leg is asserted by name, so a sibling landing cannot go unnoticed. And an unrunnable scenario reports INCONCLUSIVE and fails: a harness that cannot provision has measured nothing, and reporting that as green would make the goal bar satisfiable by breaking the harness.
retries: 0, because a scenario that passes on attempt two has told you the chain is unreliable and a retry converts that finding into a green tick.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Error Semantics |
Docs |
Evidence |
playwright.config.update-chain.mjs |
this ticket |
A new opt-in project, not referenced by any workflow |
Referenced by a workflow before green ⇒ the shared gate goes red on day one; absence of a workflow entry is the enforcement |
config JSDoc |
a check asserting the config appears in no .github/workflows/ file, with integration-parity as the positive control |
| the goal-bar scenario |
#16455's outcome sentence |
Fails while the chain is incomplete, naming each missing leg and owner |
Cannot provision ⇒ INCONCLUSIVE and fails; never reports pass |
scenario JSDoc |
observed run: 1 passed, 1 failed with five legs named |
| gate membership |
.github/workflows/test.yml |
Unchanged by this ticket — the flip belongs to #16455 |
Flipped early ⇒ #16455's own trap |
workflow file |
the workflow diff is empty |
Decision Record impact
none — an acceptance harness over surfaces the sibling leaves define. It sets no contract of its own.
Acceptance Criteria
Out of Scope
- The gate-flip. #16455's completion condition; it needs the sibling legs green first.
- Implementing any chain leg — #16450 / #16451 / #16452 / #16453 / #16320.
- Per-leg unit coverage. Each sibling owns its own; this fails only when they do not compose.
Avoided Traps
- Reusing the gated
integration-parity project. Cheaper edit, wrong one: red-by-design in a gated project turns the shared gate red immediately.
test.skip instead of opt-in. A skip inside a gated project reads as green and proves nothing; an unreferenced config cannot read as anything.
Refs-only on a draft PR. Permitted by the lint, but a draft cannot be reviewed — the operator has named draft PRs as an anti-pattern. Filing the honest narrow close target is the substrate's own prescription.
- Letting the harness grow the machinery it measures. That is how a proof leaf becomes a second umbrella and the goal bar disappears into it.
Related
- #16455 — parent; owns the gate-flip and the standing property. Stays open.
- #16448 — the Epic whose close condition this measures.
- #16486 / PR #16483 — @neo-opus-ada's precedent for the honest-narrow-close-target split, same day.
Live latest-open sweep: checked the latest open issues immediately before filing; no equivalent found. A2A claim sweep: no [lane-claim]/[lane-intent] overlapping this scope — #16455 is assigned to me.
Origin Session ID: 11695cce-9854-4be2-80c3-8ea4322298bf
Retrieval Hint: query_raw_memories("red-first goal bar opt-in playwright project outside CI gate inconclusive never passes update chain")
Refs #16455 · parent of the gate-flip half
Context
#16455 owns the Epic's close condition and prescribes its own delivery order: "The harness lands first and lands red… It runs opt-in — outside the default CI gate — while the implementation leaves are open, and moves into the gate when it goes green. That flip is this leaf's completion."
So #16455 has two separable halves with a real sequencing boundary: the harness, deliverable now against five open legs, and the gate-flip, which cannot happen until those legs land and the scenario goes green. This ticket is the first half, filed per
§9.1— a PR delivering the harness cannot honestlyResolves #16455, because pointing a closing keyword at it would auto-close a ticket whose completion condition is not met. Precedent: #16486 / PR #16483, four hours earlier, same shape.The Problem
A red-first harness has nowhere honest to land.
Refs-only is permitted for drafts, and draft PRs cannot be reviewed — so the delivery either lies about its close target or sits unreviewable.The harness itself is also not trivially placeable.
test/playwright/integration-parity/already provisions a disposable Compose plane and is already in the default gate, so reusing it would turn the shared gate red on day one — which #16455's own Avoided Traps section forbids, since a permanently-red check gets routed around within a week and stops meaning anything.The Architectural Reality
test/playwright/playwright.config.integration-parity.mjs— the sibling precedent:testDir, awebServerfixture that materialises Compose children, andresolveFreePortSyncfor port handling. Gated via.github/workflows/test.yml.test/playwright/integration-parity/fixtures/parityComposeWebServer.mjs— the provisioner (waitForServices,readComposeServices,cleanup). Reusable; nothing in that project touchesneo-revision,deploy-pipeline,redeployPreflightorls-remote, which is why #16455's premise holds.ai/scripts/maintenance/migrateDeployment.mjs— the one chain leg with a shipped executable surface today.The Fix
A separate opt-in Playwright project carrying the Epic's outcome sentence as one scenario, absent from
.github/workflows/until green.Two properties do the work. The red names which leg is missing, with owner and obligation, so the failure is a work list rather than an opaque wall — and the shipped leg is asserted by name, so a sibling landing cannot go unnoticed. And an unrunnable scenario reports INCONCLUSIVE and fails: a harness that cannot provision has measured nothing, and reporting that as green would make the goal bar satisfiable by breaking the harness.
retries: 0, because a scenario that passes on attempt two has told you the chain is unreliable and a retry converts that finding into a green tick.Contract Ledger Matrix
playwright.config.update-chain.mjs.github/workflows/file, withintegration-parityas the positive controlINCONCLUSIVEand fails; never reports pass.github/workflows/test.ymlDecision Record impact
none— an acceptance harness over surfaces the sibling leaves define. It sets no contract of its own.Acceptance Criteria
INCONCLUSIVEand fails; it never reports pass.retries: 0, so a flaky result cannot be converted into a green tick.Out of Scope
Avoided Traps
integration-parityproject. Cheaper edit, wrong one: red-by-design in a gated project turns the shared gate red immediately.test.skipinstead of opt-in. A skip inside a gated project reads as green and proves nothing; an unreferenced config cannot read as anything.Refs-only on a draft PR. Permitted by the lint, but a draft cannot be reviewed — the operator has named draft PRs as an anti-pattern. Filing the honest narrow close target is the substrate's own prescription.Related
Live latest-open sweep: checked the latest open issues immediately before filing; no equivalent found. A2A claim sweep: no
[lane-claim]/[lane-intent]overlapping this scope — #16455 is assigned to me.Origin Session ID: 11695cce-9854-4be2-80c3-8ea4322298bf
Retrieval Hint:
query_raw_memories("red-first goal bar opt-in playwright project outside CI gate inconclusive never passes update chain")