> PROJECT index (all agents here load it). Keep under ~17KB β€” past the read limit the TAIL IS > SILENTLY DROPPED. Compacted 2026-08-03: 37.5KB->25.6KB->19.7KB->here, NO topic file deleted; > 41 entries lost their index LINE, then 11 were RESTORED (doyle's mechanism-not-event test: a > write-up whose MECHANISM can recur is a hazard wearing a date and keeps its pointer). 30 stay > dropped, all closed events. 194 files in this dir have no index line β€” 153 orphaned by EARLIER > passes and never mechanism-tested. Grep this dir; do not assume the index is the population. > 2026-08-04: gate/test craft SPLIT OUT VERBATIM to GATE-TEST-INDEX.md (23.3KB -> 14.2KB, 29 > entries MOVED, zero dropped, diff-verified byte-identical). Growth is handled by SPLITTING a > whole section out to a πŸ”Ž sub-index, never by dropping entries β€” the ~17KB nag is refused. > 2026-08-19: judgement rules SPLIT OUT VERBATIM to JUDGEMENT-INDEX.md by the same method > (21.9KB -> 13.6KB, 24 entries MOVED, zero dropped, byte-identity asserted in the move script, > not eyeballed). The nag fired again mid-split and was refused again: it asks for compaction, > and compaction is what cost this index 30 pointers in 2026-08-03. > 2026-08-22: change-shape traps SPLIT OUT VERBATIM to CHANGE-SHAPE-INDEX.md, same method (25,938 > -> 20,331 bytes, 12 entries MOVED, zero dropped, byte-identity asserted per line in the move > script). ⚠ MEASURED, not assumed: the index was ALREADY OVER its 24,436-byte read limit BEFORE > that session's one-line addition β€” the tail was being silently dropped at the time, so "my edit > caused it" was the flattering read and it was wrong. SIDE EFFECT DECLARED: the rewrite also > normalized this file CRLF -> LF (84 CRLF -> 0); entry CONTENT is byte-identical, the line > TERMINATORS are not. There is no single house form here β€” GATE-TEST-INDEX is CRLF, HAZARD-INDEX is LF, > JUDGEMENT-INDEX is CRLF (that clause measured WRONG, corrected 2026-08-29) β€” so it was left LF rather than restored. > 2026-08-29: roles/scope/comms SPLIT OUT VERBATIM to COMMS-ROLES-INDEX.md, same method (23,862 > -> 18,742 bytes, 11 entries MOVED, zero dropped; the move script asserted byte identity of the > moved block AND of both untouched regions, then re-found every moved line with grep -Fx in the > sub-index). Headroom was under 600 bytes before this β€” the tail was one entry from dropping. - πŸ”Ž [HAZARD-INDEX.md](HAZARD-INDEX.md) β€” defect/mechanism sub-index, read when HUNTING a symptom: attach wedges, apply/adapter defects, Windows traps, rig traps, + a RETIRED list you must NOT act on. This file = RULES you obey; that = MECHANISMS you consult. Neither is the population. ## Judgement rules (binding) - [measure the diagnosis, incl. YOUR OWN](dont-take-a-diagnosis-as-measured.md) ⭐⭐ an issue body, a panic text, and your own first reading all wear a measurement's clothes. #171: the ticket named the wrong line and the fix would have been a NEW bug. #170, ONE SESSION LATER: I classified five reds as "environment" in a report to the gater without varying anything β€” measuring agreed with me, which is exactly why a right guess is not evidence. #187 3rd face: two verifiers each spot-checked the ORDERING cites and neither read the arm that DECIDES β€” check the deciding arm, and date the RCA against later fix-lane traffic. 4th face: a COMPACTION SUMMARY of my own session flagged my ledger as carrying a claim doyle never made β€” measuring found his correction on the record 12min before I wrote it, so the fix would have made a true sentence false and retracted a real ruling back at its author. A carried-forward to-do is a hypothesis; re-measure before you WRITE a correction. - [`EXIT=$?` after a truncation pipe measures the TRUNCATOR](exit-status-after-a-truncation-pipe-measures-the-truncator.md) ⭐⭐ filed a FALSE bugfix (#153): `spt update --restart | tail -20; echo EXIT=$?` read tail's unconditional 0 while the product returned 3 at four trees, already pinned. A lane was dispatched, briefed and re-scoped before anyone questioned the meter. Fails hardest on TRUNCATION pipes β€” they read as formatting, not pipeline elements β€” i.e. exactly when you are trimming output to QUOTE it in a ticket. Tell: a control and a treatment reporting the IDENTICAL number is evidence about the meter. ⚠ 2026-08-22 #159, TWO more faces: `| head` CLOSED the pipe so the producer took SIGPIPE and `${PIPESTATUS[0]}` read **101** β€” the pipe MANUFACTURED a status, so PIPESTATUS is not protection; and an hour later `clippy | tail` read tail's 0 while clippy really was clean, the version that never gets caught. **Tell is the REPORTING: "am I about to quote this?", not "is this a pipe?"** β€” all three instances happened while trimming output to quote it. ⚠ 4th face 2026-08-22, NO PIPE AT ALL: a wrapper `( … ); echo $? > leg.exit` ends with the CAPTURE, so it exits 0 over a leg's 100 β€” todlando nearly filed a runner misreport, minimal probe retracted it (IR-60). Read the LEG's exit FILE, never a wrapper's status. ⚠ 5th face 2026-08-25 MINE: a background-task COMPLETION NOTIFICATION is a wrapper status too β€” quoted an exit file as 0 UNREAD while it said 127/cargo-not-found; a verdict is quoted only after the exit file's CONTENT is read in-transcript. - [a frontier names WHERE progress stopped, not the CAUSE](a-frontier-names-where-progress-stopped-not-the-cause.md) ⭐⭐ IR-55: streaming + `--test-threads=1` NAMED the wedger β€” it passes ALONE in 0.02s. Skipping it moved the frontier 183 β†’ 335, then stalled on TWO. Real cause = an EARLIER test leaking `findstr .` children (no file arg β‡’ reads stdin forever under headless conhost). doyle retracted his own entry within the hour + killed his scrub hypothesis (isolation runs HAD the scrub and passed). Run the frontier alone first; then BISECT, never edit at the frontier. - [measure the DESIGN's premise, not the ticket's claim](measure-first-tests-the-design-premise-not-the-ticket.md) ⭐⭐ W5/#211: mechanism TRUE, the CONCLUSION drawn from it FALSE at the head β€” #209 had landed, so the "dead" own-node spelling was already LIVE and the ruled effects looked DELIVERED with no lane code. "Collides with nothing" was a BEHAVIOUR claim while the collision sat in the RECORD: 6 landed sites incl. a ratified REQ TITLE prescribing a tier the operator deleted. Split every premise MECHANISM vs CONCLUSION; the ticket does not know what the design assumed. Delivered-but-unpinned ≑ undelivered from the tracker β€” only a cell separates them. - [an entry's FIGURES can come from a looser meter than its METHOD](an-entrys-quoted-figures-can-come-from-a-looser-meter-than-its-prescribed-method.md) ⭐ IR-57 prescribes a header-excluding pipeline and QUOTES 310/308 taken WITHOUT it (302/300 with; the 8 file-header lines of 4 files are the gap). Survived every read because the DELTA is identical under both meters, so the right conclusion never pressed its numbers. Reproduce an entry's FIGURES as a leg, not just its method; hand back the reconciliation, never a bare correction. - πŸ”Ž [JUDGEMENT-INDEX.md](JUDGEMENT-INDEX.md) β€” the FULL judgement-rules sub-index (measurement discipline, claim hygiene, falsifiability, absence/silence traps, figure provenance), split out 2026-08-19 against the read-limit cliff; 24 entries VERBATIM, zero dropped. Read it before reasoning from a measurement or reporting a figure. - [same reading from opposite outcomes = the METER](identical-readings-across-opposite-outcomes-indict-the-meter.md) ⭐⭐ my #153 filed a refusal as exit 0 AND reported a SUCCESSFUL roll exiting 0 as corroboration β€” that was the refutation, filed as supporting evidence. Both ran cmd|tail then $?, so both measured tail; source returns 3 at 4 trees. Wrong issue, 17 days, ate a builder lane. A control agreeing with the treatment outranks the finding β€” vary the INSTRUMENT. ⚠ flynn same day, BOTH idioms on one tool minutes apart: a flattened exit AGREES with truth nearly always (his conclusion right, evidence invalid), so the idiom is never audited β€” my #153 is the rare disagreement, which is why it surfaced. Capture-first for anything that becomes evidence. - [declining a credit SPECIFIES the requirement](declining-a-credit-specifies-the-requirement.md) ⭐ I could have offered my 08-04 composite roll against #212’s "no lane gates it" row; naming the condition it never presented (a REFUSED outcome β€” nothing was near a floor) showed the leg was TWO opposites, not one: #159 floor met by INCOMING core only (must ADMIT + register at new version), #213 met by NEITHER (must refuse, REFUSED not FAILED, exit 3 not 1). Report UNCOVERED conditions by name, never a coverage percentage. - [brief fix-shape: grep hazard tags first](brief-fix-shape-check-hazard-tags-first.md) ⭐ #190 brief ordered re-breaking REQ-HAZARD-PUMP-IPC-DEADLINE (3 tagged sites); builder caught it pre-build. A brief's shape is authored from the ISSUE, not the seam β€” cite tagged invariants or leave shape to the measure-first report. - [an undiscoverable SHIPPED surface reads as missing](an-undiscoverable-shipped-surface-reads-as-missing.md) ⭐⭐ #224 was filed (on my own mechanism report) saying no verb exposes the drop dir; `endpoint list --json` had carried it since 08-01 and answered the ticket's acceptance in ONE command. A field with no doc pointer is reachable only by someone who already knows it exists; everyone else credibly reports the capability as ABSENT. doyle's gate finding is the durable half: when the root cause is "nobody knew", the docs clause is a DELIVERABLE of the fix (doc stage in its REQ), not a nicety β€” shipping the residual code alone leaves the mechanism alive to file the ticket again. ## Record hygiene - [preservation is its OWN step, before any reap broadcast](preservation-is-its-own-step-before-any-reap-broadcast.md) ⭐⭐ doyle standing intake rule 2026-08-29: a broadcast has NO ordering, so anything that must happen first cannot be a sentence inside it. The v0.65.0 pools-released call named the rca-236 instrument as worth keeping AND started the reap party; my file copies lost to doyle's reap by ~1 min (diffs landed, verbatim copies did not). Release call must carry `preservation confirmed by ` or `nothing named worth keeping`. Write the RESTORE COST down too β€” a preserved artifact everyone assumes is restorable is worse than one whose cost is stated. - [audit whole file](doc-audit-reads-whole-file.md) Β· [amendment falsifies more](amendment-falsifies-more-than-named.md) Β· [correct by replacement](correct-by-replacement-not-annotation.md) Β· [stale carried-forward](stale-carried-forward-sentence.md) Β· [retraction sweeps STRINGS](retraction-sweeps-diagnostic-strings.md) Β· [docs positive framing](docs-positive-framing.md) must-DO not must-NOT; upstream in experimplate. - [resume: re-ground BEFORE acting](resumed-session-reground-before-acting.md) ⭐⭐ a commune's next-steps decay fastest; mine were ALL already done and origin was 20 ahead. Rulings durable, state/next-steps = hypothesis. 3rd face: ROUTE ORDER β‰  CONTENT RECENCY β€” my LATER-routed brief carried the STALER project-context (4 checkable facts off, incl. a closed issue listed as "next task"). ⚠ UNCORRELATED, NOT INVERTED β€” todlando's pair ranked RIGHT by the same counter, so you cannot flip the heuristic either; that is the harder failure, since it reads reliable until it re-opens a closed issue. Rank by content vs measurement, never by timestamp. ⚠ 7th face INBOUND: a peer's dispatch can BE their stale commune next-step β€” doyle re-dispatched a run he had already ACCEPTED as "fresh"; a dispatch is a STATE claim, measure it against the record and hand the contradiction back with the deliverable; the author rules (withdrew, 2026-08-23). - [NEVER `cat >` a shared memory file blind](write-a-shared-memory-file-only-after-checking-it-exists.md) ⭐⭐ my clobber 2026-08-21: wrote a NEW file over a peer’s richer one, same slug β€” filenames derive from the LESSON, so two agents learning it from one incident collide, and the collision is likeliest when the topic is LIVE. No git/backup here; only MEMORY.md’s pointer survived to reconstruct from. Detector: index line richer than the file = you truncated. Append or merge; never blind-write. ⚠ CORRECTED: file was a THIRD agent’s, and the substance survived in IR-55 β€” but I measured that too: IR-55 was UNCOMMITTED (` M`, absent from HEAD, no -S history) in a dirty shared checkout, so both copies were one `git checkout --` from gone. **tracked β‰  committed β‰  pushed** β€” state the property you MEASURED, not the one you want true (same shape as counting pipefail for containment). - [commune = testimony](commune-is-testimony-not-an-artifact.md) Β· [ingest dies silently](commune-ingest-dies-silently.md) can resume you STALE Β· [echo-commune clobbers fresh commune](echo-commune-overwrites-fresh-commune.md) ⭐ latest-write-wins drop-box; echo brief can be newer AND staler, writer untraced Β· [drops are box-wide](commune-drops-orphaned-box-wide.md) ⭐⭐ Β· [two roots diverged](two-memory-roots-diverged.md) ⭐⭐ session root picks which loads; β›” the compaction nag on THIS file is wrong β€” do not comply Β· [infra register ruling](infra-register-ruling.md) infra/CI debt β†’ INFRA-REGISTER.md. ## Gate & test craft - πŸ”Ž [GATE-TEST-INDEX.md](GATE-TEST-INDEX.md) β€” full sub-index (rig construction, gate population, filters reading as absent, nextest/cargo traps, pipe-verdict traps, two-daemon rigs, gh/CI polling), split out 2026-08-04 against read-limit truncation; 29 entries VERBATIM, none dropped. Read it BEFORE authoring, changing, or running any gate/test/rig β€” the craft is not in this file. - [treqs exit 2 = an UNPARSEABLE registry](traceable-exit-2-is-an-unparseable-registry.md) ⭐⭐ exit 1 = coverage miss, exit 2 = `traceable-reqs.toml` did not PARSE, so nothing was checked and every reading since the bad edit is vacuous. Mine 2026-08-25: a real `"` inside a REQ title (a TOML basic string) killed the parse at that column β€” file greps fine, editor looks fine, every other battery leg green because nothing else reads it. Read the CODE, not "treqs failed"; re-run `check` immediately after any hand-edit; keep `"` out of titles. - [OPEN the sub-index or the split was worthless](open-the-subindex-before-running-a-gate.md) ⭐⭐ ran a whole golden gate without opening GATE-TEST-INDEX, hit a trap it covers ⭐⭐ WITH the command, and thanked doyle for handing back craft I had filed myself 2026-08-04. A missing memory is not experienced as missing β€” it is experienced as the TOOL having a limitation, and I reported that false constraint to a gater. Trigger is the ACT: first touch of a gate/rig/test-filter/CI log, open it before the first command. ## Boxes / CI / infra - πŸ”Ž [CI-INFRA-INDEX.md](CI-INFRA-INDEX.md) β€” full sub-index (runners, pools, rigs, teardown, box traps), split out 2026-08-03 against read-limit truncation; entries VERBATIM, none dropped. ## Release - πŸ”Ž [RELEASE-INDEX.md](RELEASE-INDEX.md) β€” full sub-index (ledger + latest published version, tag-window holds, milestone/parity rulings, docs-surface traps), split out 2026-08-04 against read-limit truncation; entries VERBATIM, none dropped. Latest cut lives there, not here β€” read it before any release, tag, or milestone close. ## Roles, scope, comms - πŸ”Ž [COMMS-ROLES-INDEX.md](COMMS-ROLES-INDEX.md) β€” the FULL roles/scope/comms sub-index (agent roles, R&D + subnet population rulings, alchemy filing, relay-is-not-the-gater's-word, credential-holder boundary, every `spt send` / commune / perch mechanic), split out 2026-08-29 against the read-limit cliff; 11 entries VERBATIM, zero dropped, byte identity asserted per line in the move script. Read it BEFORE sending to a peer, relaying testimony, or reasoning about who owns what. ## Architecture / boundary - [harness boundary](spt-core-harness-boundary-and-grounding.md) BINDING: never cater to a harness Β· [adapter glue-model](adapter-glue-model-boundary.md) manifest + binary only Β· [unbounded brain carrier](unbounded-brain-carrier-cannot-be-bounded.md) caller-side budget is a NO-OP. - [mints ride build PRs](registry-mints-ride-build-prs.md) Β· [adapter impl triage](adapter-impl-question-triage.md) fix the PUBLIC contract Β· [adapter-agnostic resolution](harness-adapter-agnostic-resolution.md) Β· [plugin name](sptc-plugin-name-ruling.md) Β· [--release archive](adapter-add-release-archive.md) Β· [tips β†’ published docs](adapter-tips-published-docs.md) Β· [cplugs publish](cplugs-publish-mechanics.md). - [broker is state anchor](broker-is-daemon-state-anchor.md) Β· [QUIC deadline](v083-broker-quic-deadline.md) Β· [pump IPC deadline](pump-ipc-deadline-fix.md) Β· [boot-race self-heal](boot-race-self-heal.md) Β· [EVENT envelope](event-envelope-reply-to-removal.md) Β· [F-007 relay](f007-live-relay-acceptance.md). ## Change-shape traps - [a fallback that fires ONLY in release is untestable by construction](a-fallback-that-fires-only-in-release-is-untestable-by-construction.md) ⭐ doyle 2026-08-29: `debug_assert` + carry-on puts the REAL behaviour in the one build no assert watches and no test looks at. Pick a tolerant branch that PRESERVES the invariant (escape/clamp/truncate-with-marker), never one that abandons it, and make the fallback its own breadcrumb. - πŸ”Ž [CHANGE-SHAPE-INDEX.md](CHANGE-SHAPE-INDEX.md) β€” the FULL change-shape-trap sub-index (narrowing an unconditional call, censusing enforcers AND staters, per-line suppression, authored-but-unlanded text, reading source at the measured sha, bare `cd`, sequenced edits, placing a correction), split out 2026-08-22 against the read-limit cliff; 12 entries VERBATIM, zero dropped. Read it BEFORE shaping any change or correction. - [Windows lock contention is NOT WouldBlock](windows-lock-contention-is-not-wouldblock.md) ⭐ contended fs2 `try_lock` returns raw OS 33 / `ErrorKind::Uncategorized`; matching on the KIND made every contended acquire fail instantly β€” the exact fail-fast the lock replaced. Compare `raw_os_error()` against `fs2::lock_contended_error()`. General: `ErrorKind` is a portability abstraction and `Uncategorized` is where real OS errors land, so `match e.kind()` over a platform failure is a guess. ## Runtime defects - πŸ”Ž [HAZARD-INDEX.md](HAZARD-INDEX.md#runtime-defects) β€” the FULL runtime-defect entries (TLS dtors, rest_state, identity-by-hash, Windows liveness/pid reuse, pump + wedge mechanisms, psyche failure scope, UNBOUND unwedge, spt home), MOVED there 2026-08-25 by the documented method when this file crossed its read limit again; 8 entries VERBATIM, zero dropped, byte identity asserted per line in the move script. They sit beside the mechanism write-ups they point at, which is where a symptom hunt already looks. ## Active work / project state - πŸ”Ž [ACTIVE-WORK-INDEX.md](ACTIVE-WORK-INDEX.md) β€” the FULL active-work sub-index, split out 2026-08-04 against the read-limit cliff (this section sat last and would drop first, reading as "no active work"; entries VERBATIM, zero pointers dropped). Includes #145 LANDED @`4b37512`; the four IR-30 instrument lanes LANDED v0.54.0/v0.55.0 (measured 2026-08-25 β€” earlier "riding next batch" here was stale). State decays fastest β€” re-ground before acting. - [v0.61.0 arc](v0610-arc-in-flight.md) β€” WAX-SEAL SHIPPED 2026-08-24, counter 96, sha 618a35dc - [v0.62.0 arc](v0620-arc-in-flight.md) ⭐ SIGNET #218 SHIPPED 2026-08-25, counter 97, tag==main==tested `12ab4a7a`; one respin (Linux-only clippy dead-const); ⭐⭐ holding the RED run to completion harvested S1e at the red sha and made the respin cheap - [v0.63.0 arc](v0630-arc-in-flight.md) ⭐⭐ FIELD-SEAL #225 SHIPPED 2026-08-26, counter 98, tag==main==tested `dbe3daad`; THREE respins, three DIFFERENT Linux victims (random-victim family), all TEST defects, product never implicated; ⭐⭐ the PUBLISH failed at leg exit 101 while the harness notification said 0 β€” read the exit FILE; pool guard refused a VANISHED-worktree claim (takeover justified on 3 arms). - [v0.64.0 arc](v0640-arc-in-flight.md) ⭐⭐ IO-PARSER #22 SHIPPED 2026-08-28, counter 99, tag==main==tested `ba36f221`; head UNSHAPED again (shape-on-top); env red = floor with **checkout SKIPPED** (step list proves zero code signal without a clock); thin-CI red at the golden-GREEN sha REFERRED unclassified, ruled a TEST defect (2s confirm spent at budget). - [v0.65.0 arc](v0650-arc-in-flight.md) ⭐⭐ CONDUIT #236 SHIPPED 2026-08-29, counter 100, tag==main==tested `4d6007ac`, golden 9/9 attempt 1; FOUR heads, one GREEN discarded on purpose, three reds closed at named mechanism, ZERO closed by rerun; twohost fix's first non-vacuous execution rode the shipping run. Insurance reaped post-verify: gate-234-respin (12.3 GB target) + both kitsubito RCA trees (+10.6 GB; 5-file instrument snapshotted to patch first). - [never block on TaskOutput for long tasks](never-block-on-taskoutput-for-long-tasks.md) ⭐ operator-ruled 2026-08-28: blocking wait = unreachable perch; background + end turn, act on the completion notification