[orchestrator] round 7 review: ratify the airborne ruling, expose the dev sim handle

CONTRACTS v9 notes: 'sealed' jam reason documented; SIM's firewalls-catch-only-
what-walks departure RATIFIED (UI measured the alternative as rung 3 not
existing); unitCleared queued as round 8's first contract item.

main.ts DEV block now exposes window.__fktrySim so testkit verbs can drive an
in-browser review the way lane tests drive headless ones - used today to verify
the full Phase 1 loop live: band 4, three simultaneous notices, gunship tether +
real mirrored theft (sky placard + ledger + ticker + toast), auditor SECTOR LOCK
with hash countdown, THE SCREEN held at HOLD with zero feed-time cost.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-29 13:21:58 +10:00
parent 69e3f5a37f
commit 0f0bfb039b
2 changed files with 15 additions and 0 deletions

View File

@ -81,3 +81,15 @@ batches them between rounds. Until granted, work around locally inside your lane
signpost an unfound relic: RENDER draws the subtle shimmer, UI shows nothing until
`found`. Discoverability budget: wandering + curiosity. That's the design.
- New jam reason string: `'no seam'` (extractor off-seam).
## v9 notes
- Jam reason `'sealed'` joins `'no seam'` in the sim's vocabulary: a warden-sealed
machine stalls with it until the `pry` command clears the seal. UI translates it
as a document, not a fault.
- RULING (round 7, ratifying SIM's departure): firewalls catch only what WALKS.
Gunships are airborne and immune — UI measured rung 3 being deleted entirely
otherwise. Pinned by SIM's regression test (a gunship must reach tether and emit
`mirrored` in the shipped demo).
- Round-8 backlog, first item: a `unitCleared` event — the firewall's victory
currently fires nine times in the demo and is silent to SCREEN/audio/RENDER.

View File

@ -205,6 +205,9 @@ async function boot() {
// research-gated ids, so it is a post-research save by definition: grant the techs
// it needs first (testkit rides the public save/load API), then dispatch.
if (import.meta.env.DEV) {
// the page's live sim, so testkit verbs (chargeDebt, spawnCorrectionUnit, ...) can
// drive an in-browser review session the same way lane tests drive headless ones
(window as any).__fktrySim = sim;
(window as any).__fktryDemo = async () => {
const { referenceFactory, referenceFactoryTech } = await import('./sim/reference');
const techs = referenceFactoryTech(data);