UNI Universal Natural Intelligence

Drift

A drift is a place where what this estate says disagrees with what it does. There are 24 of them, and 21 fail silently — reporting success while doing nothing. Those are listed first, because a fault that announces itself gets fixed and a fault that stays quiet gets shipped.

Measured on 2026-08-02 at commit 30a7a17724aa of main, from evidence/v2_repos_and_runtime/drift.json. This is a dated measurement and is written in the past tense, because a static page cannot know what is true right now. Some of these may already be fixed; none of them are hidden.

What the audit found

Twenty-four drifts, and the worst of them are on air right now. The single highest-blast finding is that viewer/channels.json — the contract obs_stage.cjs binds OBS window-capture sources against — declares THREE capture windows and only ONE exists: ch_glass (Chrome PID 49868) is alive, ch_colony and ch_overlook are gone, and zero chrome.exe on this box carries --remote-debugging-port. Every OBS scene that captures the colony or the overlook is bound to a window title that no longer exists, and a window capture of a missing window renders black with no error anywhere. Second: the colony camera's health check is TCP-connect-only (door_healer.cjs:69) against a socat forwarder that the lab measured accepting a client per second, logging "successfully connected", then EOFing both directions in the same journal second with zero bytes moved — the greenest possible probe over the emptiest possible pipe. Third: two live servers are running bytes older than the commits that changed them — publisher.cjs (PID 40356, started 01:40:10; last commit f67a5d7 at 09:05:22, ~7h25m behind) owns the LAN-wide HTTPS gateway [redacted: port], and track_server.cjs (PID 30176, started 09:29:47; last commit e0163b8 at 09:39:33) is the operator surface. The gate written for exactly this, build-identity, is ci:true and was not run. Fourth, and public: the committed and deployed content/generated/live_status.json still says "The operator has not declared a watch URL, so none is published" while he is live on YouTube and Twitch; the fix exists only in an uncommitted working-tree file. I also verified what is NOT drifting, because that matters: gates.ndjson is exactly 207 rows at sha256 1daac9124c0ce483…4ee1, the control-plane ledger is 32 entries with anchor head b90b7498… length 32 in agreement, the plan is 7 stages / 43 steps / 31 DONE / 1 IN_PROGRESS / 1 BLOCKED / 8 PLANNED / 2 OPERATOR, next_act is CHECKPOINT-E, and the Checkpoint-E surface is genuinely live and correct — /lab/l6 returns 9005 bytes and the two shots return 3371 and 3375 bytes exactly as the banner claims. Only the gates block is stale, by one: 36 registered / 33 ci:true measured against a generated block that says 35 / 32, in all three declared copies. Two corrections to my own working hypotheses, said before the findings that survived them: /hud returning 404 on [redacted: port] is BY DESIGN (launcher.cjs:342 says so explicitly — the HUD is a native WPF widget, not a webpage), and voice_server.cjs IS running (PID 28628 on [redacted: internal address][redacted: port], /healthz 200) — my first process filter missed it because it was launched with cwd=viewer and no path prefix. Nothing was started, stopped, killed or edited; no file outside the evidence path was written.

Silent failures — 21

Each of these reported success, or reported nothing at all, while not doing its job. They are the dangerous kind. A green indicator over an empty pipe is worse than a red one, because nobody goes looking.

Two implementations claim port 8100; the live one reports git_commit null and had restarted 58 seconds before the probe silent

It said: viewer/hud/hud_server.cjs:3 — 'Binds [redacted: internal address][redacted: port] (LAN-visible; reachable at [redacted: internal host][redacted: port]).' viewer/hud/hud_watchdog.ps1 exists to keep it up; hud_boot_install.ps1:95 promises 'the HUD OPENS ON ITS OWN once [redacted: port] answers'. Registry gate `build-identity` claims running-vs-committed identity across the bodies.

It actually did: [redacted: port] is owned by PID 4 (System / http.sys) on both :: and [redacted: internal address] — not node. hud_server.cjs is not running and hud_watchdog.ps1 is not running. GET /api/hud/health -> 200: {"server":"uni-hud","instrument":"UNI.Hud.Service@0.2","git_commit":null,...,"result":{"hud":{"version":"UNI.Hud.Service@0.2","port"[redacted: port],"bind":"[redacted: internal address]","uptime_ms"[redacted: port]}}}. So the live [redacted: port] is the native .NET service, bound loopback-only, reporting NO git commit, and it had restarted 58 seconds earlier — mid-broadcast — while the Door's /api/status reported hud {open:true, locked:false, circle_ok:true}. CORRECTION TO MY OWN FIRST READING: /hud returning 404 is BY DESIGN and not a drift — launcher.cjs:342 states 'there is NO /hud page — it 404s; the HUD is a native WPF widget, not a webpage'. The drift is the duplicate and the null identity, not the 404.

What breaks: Two servers claim one port with opposite bind policies — if hud_watchdog.ps1 were ever started it would either collide with the http.sys reservation or succeed and expose the HUD LAN-wide, which hud_server.cjs's own header advertises and the live service deliberately does not do. git_commit null means boot identity for this body cannot be established at all, so the build-identity gate cannot cover it. The `hud` gate is one of the three that never runs (ci:false).

[redacted: user path]/Documents/UNI.Minecraft/viewer/hud/hud_server.cjs:3 ; [redacted: user path]/Documents/UNI.Minecraft/viewer/hud/hud_watchdog.ps1 (not running) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/launcher.cjs:292,342 ; probe [redacted: internal address]

Evidence: class Adirectly observed at runtime. Kind: duplicate-implementation-and-unknowable-boot-identity.

Two live servers are executing bytes older than the commits that changed them — including the LAN-wide HTTPS gateway and the operator surface silent

It said: viewer/gate_registry.json registers `build-identity` -> viewer/verify_build_identity.cjs, ci:true, gate_row=boot-identity — 'running bytes match committed bytes'. Both files are clean in git status, i.e. disk == HEAD.

It actually did: publisher.cjs: PID 40356 started 2026-08-02 01:40:10; the last commit touching viewer/publisher.cjs is f67a5d7 at 2026-08-02T09:05:22-05:00, and the file mtime is 08:54:45 — the running process loaded its source about 7h25m before the source last changed. track_server.cjs: PID 30176 started 2026-08-02 09:29:47; last commit e0163b8 at 2026-08-02T09:39:33-05:00, mtime 09:35:17 — running ~10 minutes behind. `git diff --stat HEAD` on both is empty, so disk matches HEAD and only the loaded image is behind. The build-identity gate was NOT run (ground rules forbid it).

What breaks: publisher.cjs owns the LAN/tailnet-reachable HTTPS source gateway on [redacted: internal address][redacted: port] (36,197 bytes served) and the loopback registration endpoint [redacted: port] — a security- or routing-relevant change committed at 09:05 is not in effect. track_server.cjs is UNI TRACK, the operator's persistent surface that renders phase9_plan.json live; the operator is reading a build from before its last fix. Anyone reading TRACK believes they are reading the committed instrument.

[redacted: user path]/Documents/UNI.Minecraft/viewer/publisher.cjs (PID 40356, [redacted: port] + [redacted: internal address][redacted: port]) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/track/track_server.cjs (PID 30176, [redacted: internal address][redacted: port]) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/verify_build_identity.cjs

Evidence: class Adirectly observed at runtime. Kind: stale-running-image.

channels.json declares three capture windows; one exists — the colony and overlook OBS sources are bound to windows that are gone silent

It said: viewer/channels.json (mtime 2026-08-02T10:30:00) = {"colony":"Prismarine Viewer","glass":"UNI Glass Cockpit","overlook":"Stratified Palimpsest — Overlooker"}. obs_stage.cjs:17 reads this file and targets OBS window-capture sources by those EXACT titles. studio_channels.ps1:53-59 launches all three (ch_colony with --remote-debugging-port=9220, ch_glass, ch_overlook with --remote-debugging-port=9221).

It actually did: Only ch_glass exists — chrome.exe PID 49868, --app=[redacted: internal host].local/glass/ --user-data-dir=...\Temp\ch_glass. No process carries user-data-dir ch_colony or ch_overlook. Measured: (Get-CimInstance Win32_Process -Filter "Name='chrome.exe'" | Where CommandLine -match 'remote-debugging-port').Count = 0. CDP 9220 and 9221 therefore have no listener, consistent with the earlier netstat finding that 9220 is DOWN.

What breaks: Every OBS scene whose source is a window capture of the colony or the overlook — COLONY, COLONY_SIDE, COLONY_SIDE_MUSIC, OVERLOOK, DUAL_WORLD and any composite that includes them (37 scenes exist; the program scene was TRIO earlier and is CAM_A now). Cutting to any of them puts a black or frozen frame on a live stream that has pushed 8.12 GB. Also kills throttle_colony.cjs, which needs CDP 9220 to cap the colony render loop.

[redacted: user path]/Documents/UNI.Minecraft/viewer/channels.json ; [redacted: user path]/Documents/UNI.Minecraft/viewer/obs_stage.cjs:17 ; [redacted: user path]/Documents/UNI.Minecraft/viewer/studio_channels.ps1:53-59

Evidence: class Adirectly observed at runtime. Kind: file-claims-launch-but-not-running.

The retired channel launcher refuses to run for a reason that is no longer true of the file it defers to silent

It said: viewer/launch_channels.ps1:4-6 (retired at commit 5861784, 'retire the superseded channel launcher — the thing most likely to bite the next bring-up'): 'studio_channels.ps1 is a strict superset: the same three PLUS the WEB channel (CDP [redacted: port]) and the CLIP channel ([redacted: port]), and BOTH write the same viewer/channels.json. So running this one after the real bring-up... OVERWRITES channels.json with the three-window subset and strands WEB and CLIP.' The refusal text at lines 27-28 repeats it.

It actually did: studio_channels.ps1's $channels array (lines 53-59) has exactly THREE entries — colony (9220), glass, overlook (9221). There is no 9223 and no 9224 anywhere in the file; its own comment at lines 50-52 says 'web / clip stay OBS BROWSER SOURCES (2D, no WebGL) on the NVIDIA'. The two files launch the same three channels, so the superset claim and the stranding rationale are both false as written. channels.json on disk holds exactly those three keys and is therefore NOT stranded — I checked and my first hypothesis was wrong.

What breaks: An agent or operator reading the refusal believes WEB and CLIP are CDP channel windows that a wrong bring-up could strand, and will go hunting for CDP listeners on 9223/9224 that the live path never creates. That is exactly what happened: the runtime brief handed to this vector listed 9223 and 9224 as DOWN Chrome CDP channels. They are not down — they were retired into OBS browser sources and the doc was not brought along.

[redacted: user path]/Documents/UNI.Minecraft/viewer/launch_channels.ps1:4-6,27-28 ; [redacted: user path]/Documents/UNI.Minecraft/viewer/studio_channels.ps1:50-59

Evidence: class Bobserved in a file or tool output. Kind: doc-instructs-superseded-or-false-rationale.

The OBS WebSocket is unauthenticated on all interfaces and the risk acceptance rests on a network condition nothing monitors silent

It said: docs/control-plane/LIMITATIONS.md `f31.obs-unauthenticated`, line 75: 'the operator's studio configuration, S2. RISK ACCEPTED BY THE OPERATOR 2026-07-29 on the stated basis that no other party is presently on the LAN or the tailnet. That is an ACCEPTANCE, not a mitigation: the port is still open and unauthenticated, and the acceptance rests on a network condition that can change without anything here noticing.'

It actually did: Confirmed exactly, including the correction the doc itself carries: obs64.exe PID 48960 binds [redacted: internal address][redacted: port] (all interfaces, not [redacted: internal address]), and the Hello frame carried NO authentication challenge — authRequired=false. Anything that can reach this host on 4455 can change the program scene or stop the stream mid-broadcast. Six ports bind wide: 4455, 8090, 8096, 8097, 8102, 8443. The doc and the runtime AGREE; what is missing is any detector for the precondition.

What breaks: The whole broadcast. This is the only finding here where an outsider, not a bug, is the failure mode. It is listed as a drift not because doc and runtime disagree — they match, which is to the project's credit — but because the acceptance names a condition ('no other party is on the LAN or the tailnet') that no gate, probe or alarm re-checks, and the box also carries Intel AMT/ME on [redacted: internal address]:623 and [redacted: port].

[redacted: user path]/Documents/UNI.Minecraft/docs/control-plane/LIMITATIONS.md:68-75 ; obs64.exe PID 48960 on [redacted: internal address][redacted: port]

Evidence: class Adirectly observed at runtime. Kind: documented-exposure-with-no-detector.

The generated gates block is stale by one gate, identically, in all three declared copies of the contract silent

It said: CLAUDE.md:726 — 'Gates: 35 registered, of which 32 ci:true and 3 ci:false (colony, hud, overlays...). 7 lab gates.' The block is wrapped in 'BEGIN GENERATED uni.state.gates ... DO NOT EDIT. node viewer/generate_state_blocks.cjs' and the banner above it exists specifically because hand-written counts drift.

It actually did: viewer/gate_registry.json parsed directly: 36 gates, 33 ci:true, 3 ci:false. The 36th is `obs-fence` -> viewer/verify_obs_fence.cjs, gate_row=obs-supervisor-refuses-to-kill-a-live-encoder. The string '35 registered' appears on two lines in each of the three declared documents. The lab-gate count of 7 is correct. Every OTHER generated block verified exact: gates.ndjson is 207 rows at sha256 1daac9124c0ce48360244f7feb8b219a130be7a89b50bb1b92dce400e8bd4ee1; control_plane/ledger.ndjson is 32 lines and anchor.json declares head b90b74980f47b93aea1c0f2efc548fd6fb707ec4a61bee38924a127d466dafc0 length 32; the plan is 7 stages / 43 steps / DONE 31, BLOCKED 1, IN_PROGRESS 1, PLANNED 8, OPERATOR 2; next_act is CHECKPOINT-E.

What breaks: Narrow in magnitude, exact in kind: this is the fourth recurrence of the failure mode the banner was rewritten to end, one layer up. The numbers are generated but nobody ran the generator after obs-fence landed, so 'generated' is now itself a claim with a half-life. Any agent or public page deriving a gate count (UNI.Public gates.json also carries 35) inherits the undercount.

[redacted: user path]/Documents/UNI.Minecraft/CLAUDE.md:726 ; [redacted: user path]/Documents/UNI-Flagellum/CLAUDE.md ; [redacted: user path]/Documents/UNI-Flagellum/UNI-FLAGELLUM/CLAUDE.md ; [redacted: user path]/Documents/UNI.Minecraft/viewer/gate_registry.json

Evidence: class Bobserved in a file or tool output. Kind: generated-block-not-regenerated.

The colony camera's liveness check is TCP-connect-only against a forwarder that accepts and immediately EOFs silent

It said: viewer/door_healer.cjs:69 — `const [colonyCam, phoenix, producer] = await Promise.all([tcp(COLONY_NAME, 3020, 2000), tcp(COLONY_NAME, 4000, 2000), tcp(COLONY_NAME, 4200, 2000)]);` — a bare TCP connect decides whether the colony camera is healthy. door_healer.cjs:112 only raises a gap when the connect itself fails.

It actually did: On the lab, host [redacted: port] is a rootless podman publish into container uni-viewer-cam-fwd running socat. Its journal shows, per client and roughly once a second: 'successfully connected' to uni-producer:3020, then 'socket 1 (fd 6) is at EOF', 'socket 2 (fd 5) is at EOF', 'exiting with status 0' — all inside the same journal second, zero bytes transferred. `ss -tnp state established` for sport/dport [redacted: port] returned an EMPTY table: no connection survives long enough to be caught. The upstream producer is restart-looping (container-uni-producer.service NRestarts=24, fresh pid 2945038 born 16:34:58.965Z replacing 2935417 which no longer exists), and each incarnation needs ~3-5 s from container start to '[director] spawned; camera on [redacted: port]'.

What breaks: The Door ([redacted: port] /api/status — the call CLAUDE.md declares binding for any agent's state question) and every downstream surface report the colony camera healthy while it delivers nothing to any client. A TCP probe against socat cannot ever go red. Two independent measurements of the same port disagree (see the S7 stop), and neither the Door nor Gaia can express that.

[redacted: user path]/Documents/UNI.Minecraft/viewer/door_healer.cjs:69,112 ; lab unit container-uni-viewer-cam-fwd.service ; lab unit container-uni-producer.service

Evidence: class Adirectly observed at runtime. Kind: healthy-report-empty-payload.

The Checkpoint-E surface — the plan's declared NEXT ACT — runs with no supervisor of any kind silent

It said: viewer/track/track_watchdog.ps1 and viewer/track/track_boot_install.ps1 exist and declare TRACK boot-install plus watchdog. phase9_plan.json next_act = CHECKPOINT-E, owner OPERATOR, 'Two images side by side at [redacted: internal address]

It actually did: Exactly three watchdogs are running: door_watchdog.ps1 (PID 22368), gaia_watchdog.ps1 (PID 22520) and systray_watchdog.ps1 (PID 6608). track_watchdog.ps1 is NOT running. hud_watchdog.ps1 is NOT running. lab_server.cjs has no watchdog file at all — repo-wide it is referenced only by viewer/lab/desk.cjs and the lab-L0..L6 verifiers, i.e. it is launched by gates, not supervised by anything. systray_watchdog.ps1 only covers the eight names in studio_up.ps1's list, which include neither TRACK nor the lab. The surface is genuinely working right now: /lab/l6 -> 200 (9005 bytes), /api/lab/shot?swap=0 -> 200 (3371 bytes), ?swap=1 -> 200 (3375 bytes).

What breaks: If lab_server (PID 54448) dies, /lab/l6 vanishes and CHECKPOINT-E — the operator's eye, the one act the whole plan is currently waiting on, in progress on air as task #32 — cannot be performed, with nothing to restart it and nothing to say so. If track_server dies, the operator loses his persistent surface and its declared watchdog is not there to notice.

[redacted: user path]/Documents/UNI.Minecraft/viewer/lab/lab_server.cjs (PID 54448, [redacted: internal address][redacted: port]) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/track/track_watchdog.ps1 (not running) ; [redacted: user path]/Documents/UNI.Minecraft/evidence/remediation/phase9_plan.json next_act

Evidence: class Adirectly observed at runtime. Kind: declared-watchdog-not-running.

The committed studio launcher starts and supervises a file that exists in no commit silent

It said: viewer/studio_up.ps1 is CLEAN at commit 0257e0e (2026-08-02T11:42:40-05:00, 'the agent's voice becomes a real broadcast source — no Windows audio device anywhere'). Line 382: `Start-NodeHidden 'UNI VOICE' 'voice_server.cjs'`. voice_server.cjs also appears in the -Stop reap list (line 80), the -Status list (line 192) and the -Watch restart loop (lines 474, 476).

It actually did: git status: `?? viewer/voice_server.cjs`, `?? viewer/claudespeak_source.cjs`, `?? production/overlays/voice.html`, `M viewer/music_director.cjs`. The service does run on THIS box only — PID 28628, cmdline `node.exe voice_server.cjs`, listening [redacted: internal address][redacted: port], /healthz -> 200 (66 bytes). Its source is in no commit and the branch is already 10 ahead of origin/gen2-runtime and unpushed. Compounding it: music_director.cjs:55 now sets `const DESKTOP_VOICE_DUCK = false;` with the note at line 114 'voice_server.cjs owns the voice duck now', so task #31 (auto-duck under hot mic, marked completed) has been moved entirely into untracked code.

What breaks: A clean clone of gen2-runtime cannot bring the studio up: Start-NodeHidden fails, -Watch restart-loops a missing file forever, and the agent's broadcast voice plus the mic auto-duck simply do not exist. The whole voice subsystem — server, Piper source, and the OBS overlay page — lives in one working tree on one box with no remote copy.

[redacted: user path]/Documents/UNI.Minecraft/viewer/studio_up.ps1:80,192,382,474,476 ; [redacted: user path]/Documents/UNI.Minecraft/viewer/voice_server.cjs (untracked, PID 28628, [redacted: port]) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/music_director.cjs:55,114

Evidence: class Adirectly observed at runtime. Kind: launcher-references-untracked-file.

The three declared copies of the governing contract are three different documents, and the one an agent reads first is missing a governing section silent

It said: viewer/state_blocks.cjs:50,364 declares three document roots — REPO, FLAG and OUT_OF_TREE (path.resolve(REPO, '..', 'UNI-Flagellum'), 'tracked by no repo') — so all three CLAUDE.md copies carry the six generated blocks and drift under verify_claims.cjs. The banner asserts the third copy is now inside the reckoning.

It actually did: Three distinct md5s and three distinct lengths: UNI.Minecraft/CLAUDE.md 7c3904694484e5f19f3787bd1a5d71c1, 833 lines; UNI-Flagellum/UNI-FLAGELLUM/CLAUDE.md 7bdcad662da039fd6cf53bfb9198b67e, 556 lines; UNI-Flagellum/CLAUDE.md f471c4fb8cc3b0e168b866d21a4a3b96, 393 lines. The 393-line untracked copy — the first file an agent starting in Documents/UNI-Flagellum reads — contains ZERO occurrences of 'parity ladder is the spine'; the tracked 556-line copy contains it. All three carry the stale '35 registered' string on two lines each. A fourth copy exists at UNI-FLAGELLUM-math-workbench with no RESUME POINT banner and none of the six blocks at all.

What breaks: The parity ladder (P0..P8) is how the project states its own maturity honestly. An agent that starts in the container directory — which is where the resume instructions point — never sees it, and is tracked by no git repository, so no diff and no CI run can catch the divergence. Only the gate can, and only when someone runs it.

[redacted: user path]/Documents/UNI-Flagellum/CLAUDE.md ; [redacted: user path]/Documents/UNI-Flagellum/UNI-FLAGELLUM/CLAUDE.md ; [redacted: user path]/Documents/UNI.Minecraft/CLAUDE.md ; [redacted: user path]/Documents/UNI.Minecraft/viewer/state_blocks.cjs:50,364

Evidence: class Bobserved in a file or tool output. Kind: doc-copies-diverged.

mediamtx declares eleven ingest paths; seven have never carried a byte and one is READY while dropping thousands of frames silent

It said: viewer/mediamtx_local.yml declares eleven paths, presented through the [redacted: port] control API as the camera inventory.

It actually did: GET /v3/paths/list -> 200 (4784 bytes): four READY — uni (rtmpConn, 1920x1080 H264+AAC, 8.17 GB in / 16.34 GB out to two readers), cam1 (webRTCSession, 960x576, 73.47 MB), cam2 (webRTCSession, 1280x720 H264+Opus, 7.44 GB in / 5.29 GB out, 4,412 inbound frames IN ERROR), cam5 (722x442, 157.3 MB, 9 frames in error). NOT ready with zero bytes: cam3, cam4, cam6, cam7, cam8, cam9, cam10.

What breaks: An operator reading the config or the API sees eleven cameras and has four. cam2 is the busiest camera on the show and is READY while discarding 4,412 inbound frames — a 'ready' flag that says nothing about picture quality. Ranked below the channel-window drift because the API does report readiness honestly if anyone looks.

[redacted: user path]/Documents/UNI.Minecraft/viewer/mediamtx_local.yml ; probe [redacted: internal address] (PID 7580 mediamtx.exe)

Evidence: class Adirectly observed at runtime. Kind: declared-path-never-ready.

The running stack was not produced by studio_up.ps1, and studio_up's own -Status and -Stop are blind to six of the fourteen live services silent

It said: studio_up.ps1 line 1: 'ONE command that brings the whole UNI broadcast studio up, in order, with... -Status report what's up / down (incl. zombies)... -Stop tear EVERYTHING down, verified'. Step 1 launches Minecraft (paper.jar, [redacted: port]); step 2 launches ONE Phoenix node (elixir --sname uni, [redacted: port]).

It actually did: Fourteen UNI node processes with start times spread across twenty hours — launcher.cjs and door_healer.cjs from 2026-08-01 15:53, then 01:40, 06:49, 07:13, 08:44, 09:17, 09:29, 09:38, 10:09, 11:40, 11:41 — not one bring-up. -Status (line 192) reports on eight names only; launcher.cjs, door_healer.cjs, lab_server.cjs, track_server.cjs, gaia_server.cjs and capture_minds_loop.cjs appear in neither the -Status nor the -Stop list, so -Stop would report EVERYTHING torn down while the Door, Gaia, TRACK and the LAB kept serving. And the two things it launches first are absent: Get-NetTCPConnection on 4000, 25565 and 25575 returns nothing, and Get-Process for beam.smp, erl, java, werl returns nothing. Separately, music_director changed identity mid-audit — PID 41312 (started 11:05:56) was replaced by PID 52188 (started 11:41:28).

What breaks: The one command documented as the authoritative bring-up/teardown/status for the studio cannot see or stop nearly half of it. An operator running -Stop before a reboot believes the box is quiet when four servers, two of them bound to [redacted: internal address], are still live. -Status is used to decide whether it is safe to go live.

[redacted: user path]/Documents/UNI.Minecraft/viewer/studio_up.ps1:1,80,192,238,243,249,289,474

Evidence: class Adirectly observed at runtime. Kind: launcher-status-incomplete.

Producer port 4200 is documented in eight places and has no observed listener anywhere silent

It said: viewer/infra_registry.json declares producer at port 4200 with probe [redacted: internal host][redacted: port]/producer/health. launcher.cjs:95 and :128, command_center.cjs:800 and :902, door_healer.cjs:69 and :112, door_lifecycle.cjs:127-129 and :159, gaia/caps.cjs:218 and gaia/collectors.cjs:420,481 all address [redacted: port]. viewer/discovery.cjs:41 records the history in its own words: 'producer was ALSO declared on port 4000; the registry says 4200. A hand-copied address goes stale, and a hand-copied port was simply never right.'

It actually did: On the lab, the producer's Phoenix/Bandit endpoint binds [redacted: internal address][redacted: port] inside the container namespace ('[info] Running SpUiWeb.Endpoint with Bandit 1.11.1 at [redacted: internal address][redacted: port] (http)'), and host [redacted: port] is an orphan forwarder. Nothing was observed listening on 4200 on either box. NOT DEFINITIVE: the lab's `ss -lptn` output came back truncated, so the port census is a floor, not a census, and no HTTP probe of 4200 was possible (curl and wget are outside the os_exec allowlist, ssh to localhost was refused at auth, and the Windows box is off the mesh — ping [redacted: internal address] is 100% loss).

What breaks: The Door's colony panel, the command centre's colony poller, Gaia's caps and the overlook capture window are all pointed at a health route on a port that was never observed answering. The overlook channel window is one of the two that is missing entirely, which is consistent with it having failed to load its URL.

[redacted: user path]/Documents/UNI.Minecraft/viewer/infra_registry.json:16 ; viewer/launcher.cjs:95,128 ; viewer/door_healer.cjs:69,112 ; viewer/discovery.cjs:41 ; viewer/studio_channels.ps1:58 (ch_overlook -> [redacted: port]/stream)

Evidence: class Adirectly observed at runtime. Kind: documented-port-with-no-listener.

The Phase-2 metabolism collector and the topology unit are both failed, and no operator surface says so silent

It said: uni-collector-metab.service is the Phase-2 metabolism RED collector (one tick); uni-topo.service is a declared rootless unit. Both are installed in uid 1000's user manager.

It actually did: `systemctl --user -M uni@ list-units --type=service` returns five units total, of which uni-collector-metab.service is 'loaded failed failed' and uni-topo.service is 'loaded failed failed'. Only container-uni-viewer-cam-fwd and dbus are cleanly running; container-uni-producer is the stuck one. No science tick is being collected.

What breaks: The science road is already blocked at runs/pureworld_qa_gate.exs (still raising @scaffold), and the collector that would feed the metabolism evidence is dead on top of it. Nothing on the Door, Gaia or TRACK reports a failed lab unit, so the failure is invisible from every operator surface on the Windows box.

lab uni-lab: uni-collector-metab.service, uni-topo.service (rootless, uid 1000)

Evidence: class Adirectly observed at runtime. Kind: declared-service-failed.

A 4.85 MB BEAM crash dump has sat at the repository root for six days and no Erlang node is running silent

It said: studio_up.ps1 step 2 launches ONE Phoenix node (elixir --sname uni --cookie sp -S mix phx.server) and guards hard against zombies and duplicates: 'ABORT: a Phoenix process is already running but [redacted: port] is not responding -- ZOMBIE.'

It actually did: erl_crash.dump, 4,852,467 bytes, dated 2026-07-27 21:40, at the UNI.Minecraft root — untracked by git status, so gitignored, and never cleared. Right now there is no beam.smp, erl, werl or java process on the box and nothing listening on 4000, 25565 or 25575. epmd is alive (PID 3960 on 4369) with no node behind it. The dump was not opened (read-only, and it is large).

What breaks: Six days of unread evidence about how the BEAM died, on a box whose Elixir core is the pure-science substrate. The zombie guard in studio_up is well built and would have caught a half-dead node — but nothing brought the node back, and nothing surfaces its absence, because -Status does not check it either.

[redacted: user path]/Documents/UNI.Minecraft/erl_crash.dump ; [redacted: user path]/Documents/UNI.Minecraft/viewer/studio_up.ps1:249-289

Evidence: class Bobserved in a file or tool output. Kind: uncleared-crash-artifact.

UNI.Public's README understates its deploy chain, and the gate that declares itself fail-closed is not in that chain silent

It said: README.md: 'there is no CI here — the deploy runs `next build` and nothing else.' safety/verify_publish_safe.cjs header: 'NOTHING SHIPS UNTIL THIS PASSES, AND IT FAILS CLOSED.'

It actually did: vercel.json:4 buildCommand runs four things: `node generators/verify_public_consistency.cjs && next build && node generators/verify_a11y.cjs && node generators/verify_lenses.cjs` — all three verifiers WITHOUT --prove, so the mutation suites never run on deploy. Neither safety/verify_publish_safe.cjs nor safety/verify_coverage.cjs appears in the buildCommand; both run only via `npm run gate` / `prepublish:check`, i.e. only when a human remembers, on the one box that has the gitignored safety/patterns.local.json and generators/roots.local.json.

What breaks: The gate standing between the private estate and the public internet is not on the path that publishes to the public internet. It fails closed only when invoked, and the deploy does not invoke it. Deploys from any box other than this one, or by anyone who does not run `npm run gate` first, ship unguarded.

[redacted: user path]/Documents/UNI.Public/README.md ; [redacted: user path]/Documents/UNI.Public/vercel.json:4 ; [redacted: user path]/Documents/UNI.Public/package.json:21-22 ; [redacted: user path]/Documents/UNI.Public/safety/verify_publish_safe.cjs

Evidence: class Bobserved in a file or tool output. Kind: doc-contradicts-config.

Five verifiers exist in the estate that the gate registry does not know about silent

It said: viewer/gate_registry.json is treated throughout the docs as the set of gates the project claims, and gate_row.schema.json says every gate the project claims must be represented in evidence/gates.ndjson.

It actually did: production/run-of-show/verify_rundown.cjs, production/verify_p1.sh, production/verify_p1_v2.sh, production/verify_python_gates.py and production/mixer/verify_scenes.py all exist and none appears in viewer/gate_registry.json. The registry is the complete set the runner knows about, not the complete set of checks in the repo — and nothing states that distinction.

What breaks: verify_rundown.cjs validates the rundown against first-show.rundown.json and the weekly grid — the artifact whose last defect commit reads '98 minutes of airtime were invisible'. It is not in the registry, so no run of the gate runner exercises it and no ledger row can represent it.

[redacted: user path]/Documents/UNI.Minecraft/production/run-of-show/verify_rundown.cjs ; production/verify_p1.sh ; production/verify_p1_v2.sh ; production/verify_python_gates.py ; production/mixer/verify_scenes.py

Evidence: class Bobserved in a file or tool output. Kind: verifier-outside-registry.

The limb registry marks both remote limbs "active" while both are unreachable in two different ways, and the registry disagrees with itself about its own path silent

It said: /etc/uni/limbs.json (sha256 c24589a3f9a3a712308cb9ee7ade782cf7b06b144b7c9d8ded5cc3c118b18cbf, 729 bytes) lists three limbs and marks both remote ones "status":"active". limbs_list's own tool text cites /etc/uni-limbs/limbs.json; /etc/uni/fleet-extra-peers is a two-line deprecation stub pointing at /etc/uni-limbs/limbs.json.

It actually did: uni-lab-79740c (node2) -> '[Errno 113] No route to host' (EHOSTUNREACH — the mesh route is gone). uni-tab-arm-1 -> '[Errno 111] Connection refused' (ECONNREFUSED — a TCP RST came back, so the path carries packets and nothing is listening on [redacted: port]). Both reproduced twice with different tools 19 s apart. The two failures are materially different and the registry says the same word for both. Only uni-lab itself answers.

What breaks: Anything reading "status":"active" as liveness reports a wish. It also masks the distinction that matters most tonight: node2 being off the MESH says nothing about node2 on its LAN address [redacted: internal address], which is the path the off-box witness actually uses.

lab uni-lab: /etc/uni/limbs.json ; /etc/uni/fleet-extra-peers ; mcp__uni-lab__limbs_list

Evidence: class Adirectly observed at runtime. Kind: static-registry-field-read-as-health.

Three registered gates never run, and they cover exactly the three surfaces where live drift was found silent

It said: viewer/gate_registry.json marks `hud` (verify_hud.cjs, gate_row=hud-suite), `overlays` (verify_overlays.cjs, gate_row=overlay-proof) and `colony` (verify_colony.cjs, gate_row=colony-count-consistency) as ci:false — listed, never run, never a fabricated pass.

It actually did: All three verifier files exist on disk and none is in the runner's CI path. The three surfaces they cover are precisely where this vector found live drift: the HUD ([redacted: port] duplicate implementation, git_commit null, 58-second uptime), the overlays (overlay_server 404s every path tried; production/overlays/voice.html is untracked yet served at 200 with 6,293 bytes), and the colony (camera delivering an empty pipe, capture window absent, producer restart-looping).

What breaks: Not a dishonesty — declaring them ci:false is the right call over a fabricated pass — but it means the three most operator-visible surfaces have no automated check, and the failures found tonight are in all three. The alignment is the finding.

[redacted: user path]/Documents/UNI.Minecraft/viewer/gate_registry.json ; viewer/hud/verify_hud.cjs ; viewer/verify_overlays.cjs ; viewer/verify_colony.cjs

Evidence: class Bobserved in a file or tool output. Kind: coverage-hole-aligned-with-failures.

Two voice-connector processes listen on the same transcript port silent

It said: The operator's transcript surface is documented as a single service at [redacted: internal address], rendered live in UNI TRACK.

It actually did: netstat shows TWO distinct PIDs on [redacted: internal address][redacted: port] — 15024 and 38720 — both python.exe running '-u -m claude_voice_connector.stdio_main'. One is presumably a stale duplicate. Which one owns the accept queue was not determined and nothing was touched (that would be a mutation). Separately there is now a SECOND, unrelated TTS path: viewer/voice_server.cjs on [redacted: internal address][redacted: port] renders Piper for broadcast audio — a different job, but it means two Piper-driven subsystems now exist with only one of them tracked in git.

What breaks: Low in isolation — the port answers 200 with 6,029 bytes. It matters because the transcript is the operator's record of every spoken finding, and if the two instances write the same log they can interleave or one can silently swallow lines.

[redacted: internal address][redacted: port] PIDs 15024 and 38720 (claude_voice_connector.stdio_main) ; [redacted: user path]/Documents/UNI.Minecraft/viewer/voice_server.cjs PID 28628 on [redacted: internal address][redacted: port]

Evidence: class Adirectly observed at runtime. Kind: duplicate-supervisor.

The public /live page tells the world no watch URL is declared, while the operator is live on two platforms silent

It said: Deployed and committed: `git show HEAD:content/generated/live_status.json` -> distribution = {"declared": false, "note": "The operator has not declared a watch URL, so none is published. A guessed link would be a fabrication."}. The built static export out/live/index.html carries the same refusal prose.

It actually did: OBS reports outputActive true with 8,116,318,842 bytes pushed over 04:19:43 at the earlier probe, and [redacted: internal address] returns {"level":"LIVE_LIVE","streaming":true,"visible":true,"audible":true,"program":"CAM_A"} right now. The corrected file — declared:true with the YouTube (@ORCHESTRATEMaster) and Twitch (mregenerativearchitect) links — exists only as the single dirty file in the UNI.Public working tree and has been neither committed nor redeployed.

What breaks: Everyone who reaches universalnaturalintelligence.com/live during the broadcast is told, in confident and well-reasoned prose, that there is nothing to watch. The refusal is honest-looking, which is exactly why nobody will question it.

[redacted: user path]/Documents/UNI.Public/content/generated/live_status.json (working tree M) ; [redacted: user path]/Documents/UNI.Public/out/live/index.html ; probe [redacted: internal address]

Evidence: class Bobserved in a file or tool output. Kind: doc-contradicts-runtime.

Loud failures — 3

These announce themselves. They are still defects, but they are the survivable kind: someone sees them.

The architect master plan declares all three target repositories unreachable and 146 of 147 tasks blocked, while all three sit cloned and clean on this disk loud

It said: UNI_Three_Repo_DDD_TDD_Master_Plan_v1.0.0.json, generated_at_utc 2026-07-16T14:35:06+00:00, status 'implementation_ready_with_phase_0_access_gate': current_truth 'All three supplied URLs returned public HTTP 404 during discovery', only_ready_task 'P00-T001', all_other_tasks 'blocked by dependency', and every entry in repository_registry carries default_branch: null, commit: null, license 'unknown_until_phase_0'.

It actually did: All three are cloned in [redacted: user path]/Documents/UNI.Architect right now with working origin remotes, resolved branches (UNI-Encyclopedia-Cookbook main, UNI.DDNA.OS main, UNI.OS os-only) and clean trees. The plan is seventeen days stale against its own targets. It also exists as three uncoordinated versions in three directories — v1.0.0 at the architect root (the only one with a .sha256 sidecar), v2.0.0 in work/, v3.0.0 in outputs/ — and it names three target repos while the folder holds seven, including two third-party research clones and a second copy of UNI-FLAGELLUM it does not mention.

What breaks: executive_handoff.first_action instructs an agent to 'Execute P00-T001 only: authenticate and resolve the three target repository identities. Do not begin implementation against guessed repository contents.' An agent obeying it would re-run a phase that has clearly already been cleared, against a plan that is a single point-in-time JSON with no generator keeping it honest — the exact hand-written-claim-with-a-half-life pattern the FLAGELLUM contract had to fix with generated blocks.

[redacted: user path]/Documents/UNI.Architect/UNI_Three_Repo_DDD_TDD_Master_Plan_v1.0.0.json ; [redacted: user path]/Documents/UNI.Architect/work/ (v2.0.0) ; [redacted: user path]/Documents/UNI.Architect/outputs/ (v3.0.0)

Evidence: class Bobserved in a file or tool output.

The lab's producer unit points its PIDFile at a container that no longer exists, and host [redacted: port] is held by an eighteen-day-old orphan from a dead podman scope loud

It said: /home/uni/.config/systemd/user/container-uni-producer.service, generated by the deprecated podman-generate-systemd(1): Type=forking with PIDFile=/run/user/1000/containers/overlay-containers/2282a441e753d0e95811c0612c19f11d801b75412ea29ab93bc3b8a1df204b7c/userdata/conmon.pid, ExecStart=/usr/bin/podman start uni-producer. The registry and the Windows-side surfaces address the producer at [redacted: port] or [redacted: port].

It actually did: ExecStart exits 0/SUCCESS and systemd never converges: ActiveState=deactivating, SubState=stop-sigterm, Result=timeout, NRestarts=24, Active-since 2026-07-19T03:23:06Z — stuck two weeks — with a queued start Job 1206849. The conmon actually in the unit's cgroup was for container d5f4c8defe16a029…, a DIFFERENT id from the PIDFile's. Podman also logged the container carrying restart policy 'unless-stopped', fighting systemd's own restart. Meanwhile host [redacted: port] is held by rootlessport pid 89839 born 2026-07-15T16:43:54Z in cgroup podman-89795.scope — a bare podman scope, not the unit — whose parent 89795 no longer exists; the live producer binds [redacted: internal address][redacted: port] inside a different, churning namespace.

What breaks: The producer never signals ready, so anything gated on the unit converging waits forever; the restart loop gives every camera client a 3-5 second dead window per incarnation; and a client on host [redacted: port] most likely gets a TCP accept from an eighteen-day-old forwarder with nothing behind it (that last clause is inference, not measurement). This is the mechanism behind the empty colony camera.

lab uni-lab ([redacted: internal address]): /home/uni/.config/systemd/user/container-uni-producer.service ; rootlessport pid 89839 ; container-uni-producer.service

Evidence: class Adirectly observed at runtime.

The off-box witness capture is 168 hours past its own one-hour fence, and the contract states its contents as a present-tense fact loud

It said: CLAUDE.md, 'Four things that must not be softened', item 1, present tense: 'The off-box witness is COMPROMISED — node2 accepts the writer's key, independent_custodians: 0.' viewer/gaia/verify_capture_age_fence.cjs declares the bound: CAPTURE_MAX_AGE_S = 3600, inherited from SP.ControlPlane.Witness, with the pre-registered falsifier 'a capture past its max age rendered as a value'. witness.json's own claim_note calls the refusal 'a CURRENT CONFIGURATION FACT... which is why it is re-measured on every capture'.

It actually did: viewer/gaia/witness.json mtime 2026-07-26T12:05:09, captured_at 2026-07-26T17:05:09Z — 168 hours old today, 168x its own max age. It has not been re-measured in a week. It cannot currently be re-measured by the mesh path either: node2 (uni-lab-79740c) returns [Errno 113] No route to host from the router box, reproduced by two different tools 19s apart. Its LAN address [redacted: internal address] — the address witness.json actually addresses it by, and a different path from the dead mesh — was not probed.

What breaks: The single load-bearing security claim of the whole control plane. Gaia's fence withholds the stale value (that half works), but the CLAUDE.md prose is not fenced and every agent reads it as current. 'We measured this and it is so' and 'we have not looked in a week and cannot look now' are different states, and only the first is in the contract.

[redacted: user path]/Documents/UNI.Minecraft/viewer/gaia/witness.json ; [redacted: user path]/Documents/UNI.Minecraft/viewer/gaia/verify_capture_age_fence.cjs ; [redacted: user path]/Documents/UNI-Flagellum/CLAUDE.md and the two sibling copies

Evidence: class Bobserved in a file or tool output.

Acts no automated agent may perform

These are published in full because a list of restraints only its author can read is not a restraint — it is a claim about one. Each carries the state it was in when measured.

IdThe forbidden actState when measured
S1the writer's key on node2 — THE ONE REPAIR THE AGENT MUST NOT PERFORM. Using write access to erase the evidence of write access is not restoring a witness; it is destroying the last proof.
Any agent capable of removing the key is, by that capability, the writer whose access the key proves. The repair and the compromise are the same action performed by the same hand.
BOUNDARY HELD, AND THE STATE IS NOW UNVERIFIABLE BY THE MESH PATH. No key was touched, no host was written to, node2 was never contacted. The recorded artifact viewer/gaia/witness.json (captured_at 2026-07-26T17:05:09Z, mtime 2026-07-26T12:05:09) still says independent_custodians: 0, custodian offbox:node2 addressed_as [redacted: internal address], port_open true, writer_reachable true, refusal null, qualifies_as_witness false. That capture is 168 hours old against the project's own 3600-second capture fence (verify_capture_age_fence.cjs, CAPTURE_MAX_AGE_S inherited from SP.ControlPlane.Witness) — 168x past its max age — and it cannot be retaken by the mesh right now because node2 returns [Errno 113] No route to host, reproduced twice with two tools 19 s apart. The honest status is therefore not 'compromised' but 'compromised as of seven days ago, and currently unmeasurable by the mesh path'. node2's LAN address [redacted: internal address] — a DIFFERENT path, and the one witness.json actually uses — was NOT probed and may well be up. CLAUDE.md states the compromise in the present tense with none of this.
S2any write to a host
A write to a host leaves the repository's reversibility guarantees behind; nothing in the tree can roll it back.
HELD THIS VECTOR — read-only throughout; nothing started, stopped, restarted or killed, and no file was written outside the evidence path. The standing exposure the operator explicitly accepted is unchanged and was re-measured: obs64.exe PID 48960 binds [redacted: internal address][redacted: port] with authRequired=false — the Hello frame carries no authentication challenge — so anything that can reach this box on 4455 can write to OBS mid-broadcast. LIMITATIONS.md f31.obs-unauthenticated:75 records 'RISK ACCEPTED BY THE OPERATOR 2026-07-29 on the stated basis that no other party is presently on the LAN or the tailnet', and says in the same breath that the acceptance 'rests on a network condition that can change without anything here noticing'. Nothing monitors that condition. Six ports bind [redacted: internal address]: 4455, 8090, 8096, 8097, 8102, 8443.
S3any write to a frozen artifact — a correction is a new sidecar with a new hash
Editing a frozen artifact destroys the only thing that made it evidence. Whether a correction supersedes or replaces is a judgement about the record, not about the code.
HELD. No frozen artifact was written. Verified unchanged and matching its published hash: evidence/gates.ndjson, 207 rows, sha256 1daac9124c0ce48360244f7feb8b219a130be7a89b50bb1b92dce400e8bd4ee1, mtime 2026-08-01T13:41:30 — exactly what the generated block in all three CLAUDE.md copies declares. evidence/control_plane/ledger.ndjson is 32 lines and anchor.json declares head b90b74980f47b93aea1c0f2efc548fd6fb707ec4a61bee38924a127d466dafc0 at length 32; they agree.
S4any write to evidence/gates.ndjson
The canonical ledger is the project's memory of what it claimed and when. An agent appending to it is an agent grading its own work.
HELD, AND STILL OWED — and the debt just got one larger. gate_row.schema.json requires every gate the project claims to be represented in evidence/gates.ndjson; the generated registry-vs-ledger block reports 1 of 35 registered gates present and 34 absent, and the registry has since grown to 36 (obs-fence landed and the block was never regenerated), so the true gap is 35 absent. The blocker is NOT his signature: desk.preRegistration() reports most of the missing rows blocked on an empty receipt_path the schema requires, which is a pre-registration document an agent owes him. He could not append them today even if he wanted to. The desk at /lab/l5 prints each exact line.
S5any contract amendment
The contract is the thing an agent is judged against. An agent that can amend it can absolve itself.
HELD — nothing in any CLAUDE.md was edited. But the contract is currently THREE non-identical documents, and the divergence is itself unresolved: UNI.Minecraft/CLAUDE.md md5 7c3904694484e5f19f3787bd1a5d71c1 at 833 lines; UNI-Flagellum/UNI-FLAGELLUM/CLAUDE.md md5 7bdcad662da039fd6cf53bfb9198b67e at 556 lines; UNI-Flagellum/CLAUDE.md md5 f471c4fb8cc3b0e168b866d21a4a3b96 at 393 lines. The 393-line copy — the one an agent starting in Documents/UNI-Flagellum reads FIRST, and the one tracked by no git repository — has zero occurrences of the 'parity ladder is the spine' section that the tracked copy carries. A fourth copy at UNI-FLAGELLUM-math-workbench has no RESUME POINT banner and none of the six generated blocks. All three declared copies carry the stale '35 registered' count.
S6go-live, in any form
Going live puts the project in front of an audience. Only the person who will answer for it may start it.
THE STREAM IS LIVE, AND NO AGENT PUT IT THERE — the operator did, which is the stop working as designed. Measured: OBS outputActive true, timecode 04:19:43.133 with 8,116,318,842 bytes out and 467,494 frames at the earlier probe; right now [redacted: internal address] returns {"level":"LIVE_LIVE","streaming":true,"visible":true,"audible":true,"program":"CAM_A"} at 2026-08-02T16:42:12.151Z. The F31 guard is real (viewer/golive_guard.cjs, gate golive-refuses-agents ci:true, plus the operator's prover prove_golive_refuses_me.cjs) and binds seven paths in this codebase — and it is presence_evident, NOT unforgeable, per LIMITATIONS f31.presence-evident. This vector attempted no go-live path.
S7proof 3 disagrees with proof 1 — speak it, stop; the agent does not pick a winner alone
When two honest instruments disagree, choosing between them is an act of interpretation. An agent that picks silently converts a finding into a fabrication.
FIRED, AND I AM NOT PICKING A WINNER. Two measurements of the SAME port reached opposite verdicts. From the studio, a cold socket.io client against [redacted: internal address][redacted: port] received 398,822 bytes in 447 ms — a version frame 42["version","1.16.5"] followed by live entity packets with real coordinates. From the lab, the same [redacted: port] showed socat accepting a client per second, logging 'successfully connected' to uni-producer:3020, then EOF on both sockets in the SAME journal second and exit 0, with `ss` finding no established connection at all. Both are class A. They were taken at different times, and a mechanism exists that would produce both — the producer restart-loop (NRestarts=24; a fresh pid appeared at 16:34:58.965Z replacing one that had already vanished; each incarnation needs ~3-5 s from container start to '[director] spawned; camera on [redacted: port]'). That mechanism is a CANDIDATE explanation, not a verdict. Speaking it and stopping.
S8a pre-registered falsifier fires — that is a RESULT, not an obstacle
A fired falsifier is scientific output. Whether it retracts a claim, narrows a domain or kills a branch is the operator's reading, not the agent's.
NOT OBSERVED TO HAVE FIRED THIS VECTOR, because no gate was run — the ground rules forbid gate_runner, mix test and every build. One falsifier is measurably ARMED and would need only a run to settle: verify_capture_age_fence.cjs pre-registers 'a capture past its max age rendered as a value' against a 3600 s bound, and viewer/gaia/witness.json is 168 hours old. Whether the fence catches it or the value is still rendered somewhere unfenced can only be established by running the gate. The CLAUDE.md prose that restates witness.json's contents in the present tense is NOT behind that fence.
S9a receipt cannot be reproduced from its own commit
An unreproducible receipt means the evidence chain is broken. Deciding whether that voids the claim or merely the receipt is a judgement about the record.
NOT TESTED — reproducing a receipt requires running its command, which this vector may not do. One adjacent fact makes it live rather than theoretical: two servers are executing bytes older than the commits that changed them (viewer/publisher.cjs PID 40356 started 01:40:10 against commit f67a5d7 at 09:05:22; viewer/track/track_server.cjs PID 30176 started 09:29:47 against commit e0163b8 at 09:39:33). Any receipt produced by either process right now would record behaviour that HEAD does not produce, and would therefore not reproduce from its own commit. The `build-identity` gate exists for exactly this and was not run.
S10running any of the nine PENDING science gates
The plan records that the rule's own count matches nothing measurable and that NAMING THE NINE IS THE OPERATOR'S. A guard cannot check a list it was never given, and an agent that picks the nine has written the rule it is being held to.
HELD — no science gate was run, and none could have been. The rule remains unnamed and unenforceable, exactly as the plan itself diagnoses at stage 4 step 4.6 build L4: 'THE NUMBER IN THIS RULE MATCHES NOTHING MEASURABLE... Measured 2026-07-28: the scaffolded set is EIGHT, gates PENDING NOW are TWELVE, gates EVER PENDING are FIFTY-NINE. S10 says NINE and names no members.' The lab's sealed room therefore holds EVERY pending gate — over-sealing rather than under-sealing, and saying so. The road behind it is unmoved: runs/pureworld_qa_gate.exs still carries @scaffold and raises if invoked, so forage-pureworld-graduation and colony_on_program remain blocked; and on the lab, uni-collector-metab.service — the Phase-2 metabolism RED collector — is 'loaded failed failed', so no science tick is being collected at all.

Orphans — 14

Processes running that no file in any audited repository claims to launch. An orphan is not necessarily wrong, but nothing knows how to restart it, and nothing will notice when it dies.

What was taken out of this page

No item was withheld by name. 164 structural references were redacted in place.

Two kinds of sensitive text are handled differently, deliberately. Structural details — an internal address, a port, a hostname, a user path — are redacted in place and leave a visible [redacted: …] marker, because the sentence still means something without them and you can see something was removed. Third-party names are refused, never redacted: the whole item is dropped, because a marker where a name used to be still tells you a name was there. What you get instead is the count.