[orchestrator] round 7 phase 1 orders: THE CORRECTION, EMBODIED

Contracts v9: CorrectionState (debt/band/units, rungs 2-4 — the mite stays in
wildlife by ruling), EntityState.sealed, pry command, CommissionDef.compliance,
notice/sealed/mirrored/stasis/debtBand events, and Renderer.onEvents?() — RENDER's
round-6 request, granted now that three cues derive events from snapshot deltas.
main.ts fans the same event array to the renderer.

Rulings baked into the orders (from the adversarial design pass): fax-first and
auto-release are CONTRACTUAL on the auditor; warden faxes carry no grid reference;
gunships target deviation, not throughput; no debt for canning a unit (an immune
system does not hold a grudge); THE INVERSION - The Correction is the only thing
in the world that never drops a frame; the compliance tone is one grid-locked
triad voice, discovered-gated, sparse by construction.

Also: archaeology-lab.glb re-baked through the corrected farm pipeline
(bg_remove_local before meshing) - backdrop-slab flatness 0.614 -> 0.480.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
type-two 2026-07-29 12:12:31 +10:00
parent 72842e270a
commit 60a14313b4
8 changed files with 182 additions and 84 deletions

View File

@ -25,24 +25,33 @@ REQUESTs.
---
## CURRENT ORDERS — Round 6 (goal: The Correction gets teeth, the map stops drifting)
## CURRENT ORDERS — Round 7 (Phase 1: the paperwork economy)
1. **FIREWALL machine** + catch recipe on SIM's trap pattern (they detect by recipe
shape); `parity-mite` canned item; mite spawn tuning if SIM makes it data-driven;
commissions that want canned mites ("ONE (1) UNIT OF THE CORRECTION, ALIVE.
INVOICE ATTACHED. DO NOT READ THE INVOICE.").
2. **Numbers-station drift fix** (SCREEN's round-5 finding): two decoys decode onto
real visible seams (08127 → reel-beds-deep, 27503 → broadcast-shelf-south);
your validator recomputes plants but not decoys — re-cut the decoys and extend
the validator so a decoy landing on ANY seam fails by name.
3. **Accent fills for the GLB'd 10**: the ten machines with real models now get
`accent` values chosen against their actual textures (RENDER's overlay reads it).
4. **THE STANDARD mite lines** (~8 new, coordinate with SCREEN), CANON-DELTA the
mite reading of §5.
Contracts v9: `CommissionDef.compliance`, and SIM lands debt/wardens/gunships/
auditors this round — coordinate thresholds via NOTES as usual.
**DoD:** firewall catches against SIM's real mechanic; no decoy decodes onto any
seam (validator-enforced); all 10 GLB machines accented; the fax celebrates its
first canned mite in voice.
1. **COMPLIANCE QUOTAS**: 3-4 `compliance:true` standing commissions in The
Correction's register — they want TIER-0/1 material only (extend your validator:
a compliance commission wanting tier>=2 fails by name). Flavor: polite, clean,
horrifying ("QUOTA 7-C: 40 LUMA BARS. THE FILE THANKS YOU FOR YOUR COOPERATION.
THE FILE DOES NOT KNOW YOUR NAME."). These are the debt valve — shipping boring
content on purpose is a real strategy with a real bandwidth cost.
2. **FORGED HASH**: a two-input recipe on the EXISTING hex-splicer (container-pack +
hf-dust or your better reading — argue it in CANON-DELTA), producing `forged-hash`
(new item, tier 3). It voids a Hash Auditor's audit. Tech-gate it late (fortress-
adjacent). NOTE for SIM coordination: its shape cannot use the empty-inputs
catcher path — they're budgeting a second detection for it.
3. **Debt/band tuning numbers** if SIM makes them data-driven (they export constants
otherwise — retire copies as before).
4. **THE STANDARD, audit pool**: ~8 new chyron lines acknowledging audits/mirrors/
stasis ("Units conducting review are not present." / "The sector was always
white."). <=96 chars each (the wrap cap).
5. **CANON-DELTA**: the rungs-2-4 reading of §5, the no-grudge ruling, the
deviation-targeting ruling, and FORGED HASH's argument.
**DoD:** compliance quotas validate + complete against SIM's real debt venting;
forged-hash reachable via tech; validator green; the fax reads like the enemy's HR
department discovered your existence and filed it.
---

View File

@ -25,28 +25,36 @@ you never simulate. If motion looks wrong, interpolate better or note it — don
---
## CURRENT ORDERS — Round 6 (goal: the GLB era looks as good as it is)
## CURRENT ORDERS — Round 7 (Phase 1: bodies later, PRESENCE now)
MODELBEAST delivered: 10 real GLBs now live in `public/assets/models/` (mosh-reactor,
quantizer, seam-extractor, muxer, archaeology-lab, software-decoder, decode-asic,
mosquito-trap, chroma-keyer, artifact-bottler). Hot-swap + normalization worked
first try. One problem, and it's yours: **at game zoom they read dark** — baked
textures carry no emissive, so the two-material rule dies on real assets.
Contracts v9 grants your round-6 request: `Renderer.onEvents?(events)` — main.ts fans
out the same array Screen/Audio get. Your three derived cues (repaired sparkle,
firewall paperwork, relicFound geyser) can now be exact; migrate them.
1. **GLB legibility pass, the round's centerpiece**: give hot-swapped GLBs the
accent treatment placeholders get — your existing accent derivation drives a
small emissive element (glow sprite / rim boost / brightest-texel emissive lift;
your call, note it) + an overall brightness floor so a dark chassis never reads
as a hole. Verify all 10 in showroom AND in the demo world at default zoom;
screenshot before/after in NOTES.
2. **Mite visuals** (SIM lands `'parity-mite'` wildlife): hospital-white beetles,
green checkmark eye (§5), unsettling gentleness; a caught mite in a firewall
reads as filed paperwork. The 'repaired' event gets a small, infuriatingly tidy
sparkle where your product used to be.
3. **Excavation VFX** on `relicFound` (carried from your round-5 NEXT).
RULING — THE INVERSION: the codex assigns wrong-motion to CORRUPTION, not authority
(§8: "clean things move at 60fps; corrupted things move wrong on purpose"). So The
Correction units are the ONLY things in the world that never miss a frame: they
glide, smoothly interpolated, unbothered, while everything the player owns keeps its
existing judder vocabulary. Do NOT quantize their transforms.
**DoD:** all 10 GLBs legible at default zoom (before/after proof); mites read as
The Correction at a glance; perf rule holds.
1. **Placeholder bodies for rungs 2-4** (zero GLBs this round): distinct primitive
silhouettes in hospital-white with one green element each — warden: tall
filing-cabinet slab with a stamp arm; gunship: five mirrored rotor platters in a
row, hovering; auditor: a faceless white marble column that TELEPORTS (appears/
disappears, never walks — §5 says it moves only between frames). All matte,
spotless, unweathered.
2. **The gunship's mirror**: its `rect` renders as a faint ghostly duplicate of the
sector beneath it (a translucent white re-render or projected decal — your
language). The tether to `target` is a visible line.
3. **Stasis rect**: bleached ground, frozen belt items visibly stopped mid-tile,
00:00:00:00 timecode floating. Release snaps back hard.
4. **Seal stamp**: sealed machines get a white compliance placard on the chassis +
their idle animation FREEZES (a sealed machine is a still photograph of itself).
5. **onEvents migration** for your three derived cues + the new ones (notice ping at
the fax, mirrored flash inside the sector).
**DoD:** all three rungs readable at a glance in showroom + demo world; the glide
verified against juddering surroundings; stasis freeze/release pinned; perf holds.
---

View File

@ -27,24 +27,33 @@ seed stock — port, don't move).
---
## CURRENT ORDERS — Round 6 (goal: the sky notices the enemy)
## CURRENT ORDERS — Round 7 (Phase 1: the sky is audited, the speaker stays pure)
Your chyron now wraps (orchestrator fix — 29/30 STANDARD lines were clipping at ~51
chars since round 5; two-line wrap verified live).
Contracts v9 events: `mirrored`, `stasis`, `debtBand`, `notice`.
1. **`repaired` events on the sky** (SIM lands them): each repair eases total
corruption by its item's contribution AND stamps a small, perfect, green-tick
placard — The Correction signs its work. Boredom and repairs must stay
distinguishable (rot vs theft).
2. **Mite shimmer**: reuse the growth-mask for a faint hospital-white sterile patch
creeping around heavy mite activity — the inverse of corruption, and it should
feel WORSE.
3. **THE STANDARD, new pool**: coordinate with DATA — the propaganda acknowledges
the mites now ("Units are assisting you." / "Inventory discrepancies are being
resolved in your favor."). Chyron-only, mumble untouched (standing constraint).
1. **`mirrored` subtracts from the ledger** — the gunship steals corruption the same
way `repaired` does (your shipped decrement path); reuse it, don't fork it. A
mirrored theft also stamps a small hospital-white sector outline placard (distinct
from the mite's green tick — this one is architectural).
2. **Stasis on the sky**: while any `stasis` rect is on, the feed gets a subtle
freeze-adjacent treatment — timecode stops advancing, drift pauses — WITHOUT
triggering the brownout seizure vocabulary. Release resumes exactly where it
stopped (the sky was never damaged; it was administered).
3. **THE COMPLIANCE TONE (the audio ruling, verbatim):** The Correction never speaks —
it faxes. Its only sound: on `notice` and on warden-arrival, ONE voice of the
ratifySting triad, alone, struck on a fixed Hz grid — zero vibrato, zero drift,
zero analog imperfection. You cannot record a tone with no imperfection; you can
only generate one. That is the house law making its own argument. CONSTRAINTS:
gate on `discovered` exactly as tapeChunk is (pre-relic silence guarantee is
structural and measured); do NOT create a continuous tone — ratifySting's rarity
is its punchline and a frequent second 'only clean sound' would demote it. One
note per event, sparse by construction.
4. **Debt band ambience**: at band>=3 the sky's substrate gains the faintest sterile
vignette (reuse the pallor machinery, white instead of grey); gone below band 3.
**DoD:** a mite wave is visible on the sky as creeping cleanliness + tick stamps;
pixel-verified; budget holds.
**DoD:** mirrored arithmetic pinned (ledger before/after); stasis freeze
byte-identical on resume; compliance tone spectrally verified (single partial, zero
sidebands) and pre-discovery silence still 0.0/0.0; budget holds.
---

View File

@ -21,28 +21,50 @@ playable through unit tests. You are the lane the other four trust with their li
---
## CURRENT ORDERS — Round 6 (goal: M3's enemy — THE CORRECTION walks)
## CURRENT ORDERS — Round 7 (Phase 1: THE CORRECTION, EMBODIED — mechanics only)
Round 5 (MEGA) shipped complete: wildlife, seams, relic, research time — reviewed and
live. The tuner dead-dial and chyron clipping were fixed orchestrator-side; seams are
wired into GameData (your CONTRACT REQUEST, granted in v7).
Zero new assets, zero farm. Contracts v9 carries everything: `CorrectionState` (debt,
band, units), `EntityState.sealed`, the `pry` command, `CommissionDef.compliance`, and
events `notice`/`sealed`/`mirrored`/`stasis`/`debtBand`. The parity-mite REMAINS in
WildlifeState — the refactor was measured at 25 files across five lanes for zero
visible change and is deferred by ruling. CorrectionState covers rungs 2-4 only.
1. **PARITY MITES v1** (codex §5: hospital-white beetle drones that quietly *repair*
your product). Contracts v8 widens `WildlifeState.kind` with `'parity-mite'`
they ride the wildlife array. Behaviour: spawn from the world rim when
`shippedTotal` corruption crosses thresholds (escalate with progress); seek belts
carrying tier-2 glitch products; on reaching one, EAT the item and emit a new
`{kind:'repaired'; item; pos; tick}` event (v8) — the work is not destroyed, it is
*corrected*, which is worse. Deterministic, save/load carried, capped like swarms.
2. **The counter**: DATA authors a FIREWALL machine on your trap pattern (recipe-shape
detection, radius) — a mite in range is caught and canned (`parity-mite` item,
forward-canon in data). Coordinate via NOTES.
3. **Reference factory v6**: survives a mite wave without losing its melt regression
(a firewall on the uplink approach is the natural layout teach).
1. **PARITY DEBT.** One scalar, five bands (NOMINAL/OBSERVED/AUDITED/SEALED/REFUSED),
thresholds exported from constants.ts. Rises on tier>=2 shipments (per-item tier
from data). DECAYS always; decays faster while shipping tier-0/1 — and completing a
`compliance:true` commission vents a chunk. Emit `debtBand` on band edges only.
RULING: canning a Correction unit adds NO debt — an immune system does not hold a
grudge; "it cannot perceive you" is the joke.
2. **CHECKSUM WARDEN (band>=2).** Emit `notice` FIRST (fax-first is contractual),
~20s later it walks to its target, audits (phase+progress visible), rolls back the
last N outputs (new small per-machine output ring buffer), stamps `sealed:true`
(emit `sealed`), leaves. A sealed machine refuses to run. Counters: the firewall
recipe-shape catcher (same detection you shipped for mites) OR the new `pry`
command — ~90 ticks standing at the machine, clears the seal, ADDS debt (you
defaced a compliance notice).
3. **REDUNDANCY GUNSHIP (band>=3).** Picks the 8x8 sector with the most DEVIATION
(most tier>=2 output — RULING: not highest throughput; it corrects corruption, not
productivity), tethers to a PARITY ANCHOR (the sector's most corrupting machine,
`target`), publishes `rect`. Crafts inside the sector feed its progress; at
threshold it emits `mirrored` (which SCREEN subtracts from the sky ledger — the
shipped `repaired` path). Break the tether by starving/sealing/idling/removing the
anchor; it leaves when the tether breaks or a firewall cans it.
4. **HASH AUDITOR (band 4).** `notice`, then a visible 5s PRESCAN phase, then
`stasis` on: a rect where entities stop ticking and belt items freeze, with a
deterministic `lockHash` string. SAFETIES ARE CONTRACTUAL: it ALWAYS auto-releases
after AUDITOR_STASIS_TICKS even if the player does nothing. Counter is ABSTENTION:
if nothing crafted in its rect during prescan, it finds nothing and leaves without
locking. Material counter: FORGED HASH — a two-input recipe on the existing
hex-splicer (DATA authors it); holding a forged-hash item in any machine inside
the prescan rect voids the audit. NOTE: your recipe-shape catcher path assumes
empty inputs — this one has inputs, budget ~40-60 lines for a second detection.
5. **Reference factory v7**: survives one full warden+gunship cycle at 20k ticks with
melt regression intact (a firewall near the uplink is the natural teach).
Save v5 carries debt/units/seals. Determinism suite green.
**DoD:** mite lifecycle tested (spawn → seek → repair → event; firewall catch);
zero-brownout regression intact; mites never touch tier-0/1 cargo (they correct
CORRUPTION, not raw material — that's the fiction and the balance).
**DoD:** full lifecycle tests for all three rungs incl. abstention and forged-hash
voiding; a sealed machine provably dead until pried; `mirrored` arithmetic verified;
auto-release pinned by test (this one is the safety — it must be impossible to cut).
---

View File

@ -24,23 +24,35 @@ dispatch Commands via the bus and read state from `update(snap, events)`.
---
## CURRENT ORDERS — Round 6 (goal: the enemy has a face, the dial has teeth)
## CURRENT ORDERS — Round 7 (Phase 1: the enemy has paperwork)
Your tuner dock now drives the real engine (orchestrator adapter — the dead-dial
finding from the voice review is fixed and live-verified, station names and all).
Contracts v9: `snapshot.correction` (debt/band/units), `sealed` on entities, `pry`
command, `notice`/`sealed`/`mirrored`/`stasis`/`debtBand` events, `compliance` flag
on commissions.
1. **Mite surfacing**: toasts in voice ("A PARITY MITE IS EDITING YOUR MELT.",
"IT LEFT A RECEIPT."), `repaired` events in the ticker, firewall inspector shows
catches. The Correction is polite; the copy should make players furious.
2. **Tuner tick marks**: the adapter now passes `listStations()` through — draw
station ticks on the dial band so hunting has landmarks (keep the hunt: ticks
mark THAT something is there, not WHAT).
3. **Credits line** (from the voice-cloning plan, cheap now): an ABOUT/credits
entry reachable from the tech panel footer — repo, codex, and the standing
disclosure slot for future synthetic-voice credit.
1. **PARITY DEBT gauge** in the top strip: five labelled bands — NOMINAL / OBSERVED /
AUDITED / SEALED / REFUSED — hospital-white/green when calm, never red (The
Correction does not do alarm; the player's own systems do). Hidden until debt
first moves.
2. **Notices are faxes.** `notice` events render as incoming faxes in the existing
fax voice, BUT in The Correction's register: "NOTICE OF SCHEDULED AUDIT. NO
ACTION REQUIRED." — RULING: no grid reference, no unit name. A faction that
cannot perceive you does not give you coordinates. Compliance quotas
(`compliance:true` commissions) get a distinct COMPLIANCE stamp.
3. **Seal + pry.** Sealed machines: inspector shows a compliance seal panel
("THIS UNIT HAS BEEN BROUGHT INTO COMPLIANCE.") with a PRY button dispatching
`pry`; progress while prying; toast on completion ("SEAL REMOVED. THIS WILL BE
NOTED."). Sealed state also visible in the jam line.
4. **Stasis surfacing**: `stasis` on -> toast naming the lockHash ("SECTOR LOCKED.
HASH 8C4F119E. AWAIT RELEASE.") + a countdown chip; auditor prescan gets one
warning toast ("AN AUDITOR IS READING. STOP MOVING.") — that line teaches the
abstention counter without a tutorial.
5. **Mirrored ticker**: mirrored events join the CORRECTED ticker (rename or split —
your call, note it).
**DoD:** a mite raid is narratable from UI alone; ticks render from real station
data; credits reachable in-game.
**DoD:** a full warden cycle and a full auditor cycle are narratable from UI alone;
the abstention teach verified against the real sim in live.test.ts; gauge bands
pinned by test.
---

View File

@ -81,6 +81,8 @@ export interface CommissionDef {
wants: Record<string, number>;
rewardBandwidth: number;
repeat?: boolean; // v2: standing order — re-activates after completion
compliance?: boolean; // v9: a Correction quota — completing it vents PARITY
// DEBT; wants must be tier-0/1 (validator-enforced)
}
// v7: lifted verbatim from SIM's round-5 mirror — data/seams.json's shape.
@ -122,6 +124,8 @@ export interface EntityState {
heat: number; // 0..1, throttles >0.7, scrams at 1
scrammed?: boolean; // v3: heat-scram latch (heat alone can't show the
// hysteresis window; renderer/UI read this, not 0.5)
sealed?: boolean; // v9: warden compliance seal — machine refuses to run
// until pried (the pry command). UI/renderer read this.
}
export interface BeltItem {
@ -149,6 +153,24 @@ export interface SimSnapshot {
research?: ResearchState; // v4: research progress (hardens in v6)
wildlife?: ReadonlyArray<WildlifeState>; // v5: piles & swarms (M2's living hazards)
relics?: ReadonlyArray<RelicState>; // v6: buried secrets (the hidden pipe)
correction?: CorrectionState; // v9: PARITY DEBT + rungs 2-4 (mite stays wildlife)
}
/** v9: THE CORRECTION, embodied. Debt is the escalation throttle; bands gate spawns. */
export interface CorrectionState {
debt: number; // 0..1
band: 0 | 1 | 2 | 3 | 4; // NOMINAL | OBSERVED | AUDITED | SEALED | REFUSED
units: ReadonlyArray<CorrectionUnit>;
}
export interface CorrectionUnit {
id: number;
kind: 'checksum-warden' | 'redundancy-gunship' | 'hash-auditor';
pos: Vec2;
/** sim-defined phase, e.g. 'approach' | 'audit' | 'tether' | 'prescan' | 'stasis' | 'leaving' */
phase: string;
progress: number; // 0..1 of current phase
target?: number; // warden: audited entity; gunship: the PARITY ANCHOR
rect?: { x: number; y: number; w: number; h: number }; // gunship sector / auditor stasis
}
export interface RelicState {
@ -185,6 +207,9 @@ export type Command =
// sandbox/demo verb, also a
// legitimate creative mode
| { kind: 'excavate'; pos: Vec2 } // v6: dig at a relic site
| { kind: 'pry'; pos: Vec2 } // v9: pry a compliance seal
// off (takes time, adds debt
// - you defaced a notice)
| { kind: 'setPaused'; paused: boolean };
export type SimEvent =
@ -200,7 +225,15 @@ export type SimEvent =
| { kind: 'wildlife'; on: 'spawned' | 'cleared'; wildlife: 'dust-pile' | 'mosquito-swarm' | 'parity-mite';
id: number; pos: Vec2; tick: number } // v5: hazard lifecycle
| { kind: 'relicFound'; relic: 'optical-fossil'; id: number; tick: number } // v6
| { kind: 'repaired'; item: string; pos: Vec2; tick: number }; // v8: a mite corrected your work
| { kind: 'repaired'; item: string; pos: Vec2; tick: number } // v8: a mite corrected your work
// v9 — THE CORRECTION, rungs 2-4. 'notice' always precedes action (fax first, never
// silent); auditor stasis ALWAYS auto-releases (safety is contractual, not tunable).
| { kind: 'notice'; unit: 'checksum-warden' | 'redundancy-gunship' | 'hash-auditor'; tick: number }
| { kind: 'sealed'; entity: number; on: boolean; tick: number }
| { kind: 'mirrored'; item: string; pos: Vec2; tick: number } // subtracts from the sky ledger
| { kind: 'stasis'; rect: { x: number; y: number; w: number; h: number }; on: boolean;
lockHash: string; tick: number }
| { kind: 'debtBand'; band: 0 | 1 | 2 | 3 | 4; tick: number };
// ---------------------------------------------------------------- module interfaces
@ -229,6 +262,10 @@ export interface Renderer {
* demolition tint. def is null in remove mode. The '__remove' sentinel is deprecated
* and main.ts stops sending it in v5. */
setGhost(def: string | null, pos: Vec2 | null, dir: Dir, mode?: 'build' | 'remove'): void;
/** v9 GRANT (requested round 6, three consumers by round 7): the same event array
* ScreenFX/AudioFX get, fanned out by main.ts each frame. Optional a renderer
* without it keeps deriving from snapshot deltas. */
onEvents?(events: SimEvent[]): void;
}
export interface UIBus {

View File

@ -190,6 +190,7 @@ async function boot() {
const snap = sim.snapshot();
const events = sim.drainEvents();
refreshGhost();
renderer.onEvents?.(events); // v9: same array Screen/Audio get — read-only, same frame
renderer.render(snap, acc / MS_PER_TICK);
ui.update(snap, events);
screen.onEvents(events);