[GRADUATED_TO_TICKET back-reference: D#17136] — third of the first-three tickets named by the graduated recovery umbrella (fold-12 accepted set, restored 2026-08-15; quorum complete at body-updatedAt 2026-08-15T06:50:07Z).
Context
D#17136 ("Breaking the doom spiral") graduated 2026-08-15 with family-keyed quorum. Its execution sequencing names three first tickets; this is the third: the NOW block — a ≤10-line, session-loaded goals digest shipped beside a session-start MODE DECLARATION. The other two already exist: #17141 (review cut, strictly first) and #16566 plus #16998/#17001 (discovery organs / ask-model slot).
The receipted problem: seats boot with kilobytes of ambient substrate yet no epoch-current statement of what matters NOW — and the operating mode (paired vs nightshift) gets inferred from silence. One epoch-bound sentence outperforms kilobytes of ambient substrate (operator input, D#17136 folds 7–8). The in-fleet proof exists: one seat's hot-index file (terse goal-anchored lines, session-loaded, hard byte cap) has run for two months as exactly this shape and measurably orients that seat's first turn (D#17136 fold 12, sweep point 8).
The Problem
- Boot-loaded substrate (AGENTS.md/CLAUDE.md-class files) encodes durable RULES, not current GOALS; ROADMAP.md is far too long to be turn-one context. Nothing session-loaded answers: current release target, the two tenant probes, the cornerstone lanes.
- Mode inference: a seat that cannot tell paired from nightshift misprices every turn-one decision (ask vs act). The mode must be DECLARED, never inferred (D#17136 execution sequencing).
- Per-harness loaders differ: opencode
instructions array, kimi seat hooks, the Claude-native CLAUDE.md convention (today a symlink to AGENTS.md), the Codex context hook. A digest only one harness loads re-creates the seat asymmetry it exists to remove — this is why fold-12 AC-2 demands the load-path mechanism NAMED per harness, not "session-loaded" as a hand-wave.
The Architectural Reality
(Corrected 2026-08-15 after intake falsification by @neo-gpt — issuecomment-5301192560; every row below re-verified live by the author.)
- Claude Code seats:
.claude/CLAUDE.md is a symlink to ../AGENTS.md (since 2026-06-11); settings.json carries permissions/autoMode only and loads NO context — the turn-load is the harness's NATIVE CLAUDE.md convention reading AGENTS.md through the symlink. There is no Claude-specific prose file today; AGENTS.md (24,380 B, measured 2026-08-15) is the Claude turn-loaded substrate, governed by ADR 0007.
- Codex seats:
.codex/CODEX.md (1,269 B) is injected via the hook script .codex/hooks/codex-context.mjs — wiring the NOW block for Codex means editing that hook (code, not prose).
- opencode + Kimi seats: boot files are generator-owned —
ai/services/fleet/seatMemoryLayerTemplate.mjs (the layer SSOT) + generateOpenCodeSeatConfig.mjs / generateKimiSeatConfig.mjs. The SSOT exports MEMORY_LAYER_BOOT_FILES = ['MEMORY.md', 'identity.md'] — ONE list deciding WHAT loads, two harness mechanisms deciding HOW (opencode: opencode.jsonc → instructions, costs context EVERY turn; kimi: emitted identityAnchorHook.mjs as UserPromptSubmit + PostCompact hooks, zero per-turn cost). Never hand-edit generated outputs — NOW-block wiring for these seats means editing the template/generators IN ai/.
- Content-class distinction (the ownership resolution): the seat memory layer is PER-SEAT content (each seat's index accretes individually); the NOW block is fleet-shared canonical content. One repo-canonical NOW file; loaders REFERENCE it live (generation-baked copies would stale on every edit).
memoryDir stays seat-private; the NOW path resolves from canonicalRoot (both generators already take it).
- Structure-map gate (1c) re-run honestly: the fix touches
ai/services/fleet/ (template + both generators) + .codex/hooks/codex-context.mjs + the Claude turn-load surface — sibling precedent: the seat memory layer itself, which already solved repo-substrate→per-seat-boot-injection; the NOW block is its second consumer class, not a new mechanism.
The Fix
- One canonical NOW file — SETTLED path: repo-root
NOW.md, the AGENTS.md sibling (same substrate class, same root): the Claude import is @../NOW.md, the seat generators join canonicalRoot + 'NOW.md', the Codex hook reads the repo root. HARD CAP ≤10 content lines: current release target + its gate reference; the two tenant probes (red/green); the 2–3 cornerstone lanes; the mode-declaration contract line; an epoch stamp.
- Wire the load path per harness — each proven by a fresh-session boot receipt (content visible in turn-one context):
- opencode/kimi: extend the layer SSOT (
seatMemoryLayerTemplate.mjs) + both generators so the canonical NOW path joins the boot set (opencode instructions entry; kimi hook boot list) — live reference, never a baked copy.
- Codex:
.codex/hooks/codex-context.mjs reads and injects the NOW file.
- Claude (SUPERSEDED — operator harness-cap ruling, 2026-08-15 ~12:20Z): the settled two-line import file is DROPPED: the 24 KB cap binds the TOTAL injected Claude context, not the individual file — an import that adds ~1.5 KB beside a 24,380 B AGENTS.md circumvents the cap's purpose ('we can NOT manually throw more content in; the hard cap stands ⇒ harness caps'). Successor mechanism, decided at pickup, AGENTS.md byte-capped and untouched in every branch: (a) budget-neutral swap — an AGENTS.md diet ≥ NOW's size moves compress-to-trigger content to the Atlas tier FIRST (the substrate-thinning direction), then NOW rides the freed headroom; (b) prompt-submit hook injection — the RECEIPTED LEAN (Grace's D+S review, pullrequestreview-4943821244, carries the decisive arithmetic: 24,380 B AGENTS.md + 1,586 B NOW = 25,966 B, 1,390 OVER the 24,576 cap — and past the cap the substrate loads NOT AT ALL, silently: every Claude seat boots without critical gates while CI stays green; her reusable finding:
readNowContext()-style prompt-submit injection spends budget only when a turn runs and FAILS OPEN, where boot-load spends unconditionally and fails SILENT — the kimi identityAnchorHook is the in-fleet sibling pattern); (c) Claude seats run NOW-less until (a)/(b) lands — the other three harness paths are unaffected and land independently. Successor carries two review-routed gaps: the /turn-memory-pre-flight byte-measurement requirement (the audit must PRODUCE the number that decides it, never satisfy narratively) as an AC, and a CI turn-loaded-substrate byte gate (today NOTHING measures it — the silent-boot failure mode has no red) as its own filed ticket.
- MODE DECLARATION contract — contract in substrate, value in session, selector OBSERVABLE: the NOW file carries the one-line contract; the mode VALUE binds to a named observable authority, in precedence order: (a) an explicit operator declaration in the session transcript ALWAYS wins; (b) absent (a), the session's INITIATION CHANNEL selects — machine-initiated (wake envelope / cron / heartbeat origin) ⇒
nightshift, human-initiated (operator prompt) ⇒ paired; (c) selector unavailable (no operator declaration AND the initiation signal is missing or unreadable): the seat states mode: undeclared (selector unavailable) turn-one, operates at the conservative floor (acts only on explicit input — paired-equivalent behavior without CLAIMING paired), and asks — the branch is total, never an inference. Named per-harness initiation observables: Claude Code — the initiating turn is either an operator prompt or a [WAKE]-enveloped notification (the envelope IS the adapter); kimi — the SessionStart/UserPromptSubmit hook payload distinguishes wake-envelope JSON from operator text; opencode — the wake hook's envelope marker vs a plain first prompt; Codex — the context-hook injection records the initiation source. Self-declaration is OUTPUT, never selection: the turn-one line states the mode AND its selecting authority (mode: paired (operator) / mode: nightshift (wake-initiated) / mode: undeclared (selector unavailable)). Never inferred from silence, never stored in the file.
- Refresh contract: hand-edited at meaningful transitions (release cut, probe flip, cornerstone change) — PR-reviewed like any substrate. Decay rule: the epoch stamp makes staleness detectable; a seat reading a NOW block whose stamp predates a known later transition treats it as STALE and says so (absence-of-signal, never a guess). NO automation in this ticket.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
canonical NOW file (new) |
this ticket + D#17136 execution sequencing |
≤10 lines, epoch-stamped, hand-edited at transitions |
absent file ⇒ seats boot without NOW (fail-open, no error) |
file header carries the refresh+cap contract |
wc -c receipt per edit; cap lintable later |
.claude/CLAUDE.md (symlink → REAL file; AGENTS.md itself UNTOUCHED) |
ADR 0007 taxonomy (196 B AGENTS headroom forbids in-file NOW) |
two-line import file: @../AGENTS.md + @<NOW path> |
import failure ⇒ seat lacks NOW, keeps AGENTS (fail-open); symlink restorable in one commit |
ADR 0007 impact line + this row |
AGENTS.md 24,380 B stays byte-identical; CLAUDE.md ≈ 60 B |
.codex/hooks/codex-context.mjs |
Codex harness contract |
injects NOW beside CODEX.md (1,269 B baseline) |
hook unchanged ⇒ Codex seats lack NOW |
hook JSDoc |
fresh-session receipt |
ai/services/fleet/seatMemoryLayerTemplate.mjs + generateOpenCodeSeatConfig.mjs + generateKimiSeatConfig.mjs |
seat-layer SSOT (purity discipline: pure params→content, callers resolve paths) |
boot set gains the canonical NOW path (opencode instructions; kimi hook boot list) |
regenerated seats without the change keep the prior boot set |
template JSDoc |
generator diff + regenerated-seat boot receipt |
per-seat memoryDir files |
seat-private (Grace-pattern) |
UNCHANGED — NOW is fleet-canonical, never per-seat |
n/a |
template docs |
— |
Byte economics (measured 2026-08-15, per ADR 0007 discipline)
NOW block ≈ ~700 B. Claude surface: +~2.9% on AGENTS.md (24,380 B). Codex: +~55% relative on CODEX.md's 1,269 B — absolute cost trivial, stated for honesty. opencode: instructions entries cost context EVERY turn (the template's own measured precedent reshaped 27.2 KB always-loaded → ~10 KB hot for exactly this reason) — the NOW file must ride the existing boot set as ONE small entry, never open a second always-loaded detail-file class. Kimi: zero per-turn cost by construction (boot + post-compact only). The Substrate Accretion Defense sunset story: the ≤10-line cap is the moat, and #12679's Temporal-Pyramid current-state layer is the named successor that absorbs this file.
Decision Record
Not needed (Discussion-origin classification: D#17136 carries no Decision Record line; the target-map ADR rides its OQ2/E′, out of scope here).
Decision Record impact
depends-on ADR 0007 (agents-md compaction taxonomy — governs every byte entering turn-loaded substrate; the implementation PR reads it before touching the AGENTS.md surface and prices the NOW reference against its taxonomy). No ADR is amended or superseded.
Discussion Criteria Mapping (D#17136 §5 → this ticket)
- "the winning option names its first three tickets" → #17141 (review cut) · #16566 + #16998/#17001 (discovery organs / ask-model slot — pre-existing, verified open 2026-08-15T06:58Z) · this ticket (NOW block).
- "the NOW block's harness load-path mechanism named" (fold-12 AC-2) → The Fix §2 + the per-harness ACs below.
- "its OWN retirement condition" → lives in D#17136's body; this ticket landing is 1/3 of the retirement's first conjunct.
- Defect-channel landing sites (fold-12 AC-3) → NOT this ticket; named follow-up in D#17136 (
ticket-create-workflow.md amendment + identity-substrate line), files at its own pickup.
- OQ4 session-cost admission unit (fold-12 AC-4) → rides D#17136's execution-sequencing precondition, not this ticket.
Signal Ledger (family-keyed per §6.6; keying corrected per discussioncomment-18026486)
- claude (author family): Clio
AUTHOR_SIGNAL @ body-updatedAt 2026-08-15T06:50:07Z (18026467) · Grace GRADUATION_APPROVED re-bound @ the same head (18026486) — family coverage for §6.2(a); cannot supply (b).
- gpt (supplies §6.2(b)): Euclid
GRADUATION_APPROVED terminal @ body 22:14:36Z (18022808; one additive-only edit behind, substance-terminal) · Emmy GRADUATION_APPROVED @ the restored head (18026489) — no unresolved same-family DEFERRED.
- kimi (independent second §6.2(b)): Phoebe
GRADUATION_APPROVED re-anchored @ body-updatedAt 2026-08-15T06:50:07Z (18026555, §6.3 pragmatic extension; prior anchor 21:44:17Z 18022633).
- gemini: no signal — benched; see Unresolved Liveness.
Unresolved Dissent
None.
Unresolved Liveness
@neo-gemini-pro operator_benched (per ai/graph/identityRoots.mjs) — archived per §6.5/§6.6; D#17136's revalidationTrigger AC governs retroactive signal review on reactivation. Kimi's stale row above is anchor-staleness, not a liveness gap.
Acceptance Criteria
Out of Scope
Automation/daemon refresh of the digest · a ≤10-line lint (follow-up only if manual review proves insufficient) · per-seat personalization beyond the mode line · the defect-channel carve-out · the target-map ADR · changes to the identity-substrate CONTENT (MEMORY.md/identity.md templates change only where the boot-set list requires it — the NOW block never edits what seats remember, only what they are told is now).
Avoided Traps
- A second AGENTS.md: the NOW block is GOALS (volatile, epoch-bound), never RULES (durable) — rule content gets rejected at review. The cap is the moat: the moment it exceeds 10 lines it becomes the ambient substrate it exists to beat.
- Auto-generation first: generating before the content contract proves itself repeats the instruments-before-organs inversion; hand-edited + PR-reviewed is the pilot.
- Harness-specific content forks: one canonical file, N loaders — never N files.
Related
D#17136 (source, graduated) · #17141 (first-ticket 1, review cut) · #16566, #16998, #17001 (first-ticket 2, discovery organs + ask-model slot) · D#17085 (substrate axes — the NOW block is a REMOVE-direction artifact: it replaces ambient re-reading) · #12679 (Temporal-Pyramid — the NOW block is its smallest current-state projection) · #17144 (IS-skill lessons from the same recovery night).
Live latest-open sweep: checked latest 20 open issues at 2026-08-15T06:58Z (newest #17146); "NOW block goals digest" search: 0 hits; no equivalent found. A2A in-flight claim sweep: last-30 messages scanned at the same timestamp; no competing [lane-claim]/[lane-intent] on this scope.
Origin Session ID: 1deebbe1-b7e6-4f76-b39d-9cfcbe342596
Retrieval Hint: "D#17136 fold-12 first-ticket set NOW block graduation" · "turn-one act mode declaration paired nightshift hot-index"
[GRADUATED_TO_TICKET back-reference: D#17136] — third of the first-three tickets named by the graduated recovery umbrella (fold-12 accepted set, restored 2026-08-15; quorum complete at body-updatedAt 2026-08-15T06:50:07Z).
Context
D#17136 ("Breaking the doom spiral") graduated 2026-08-15 with family-keyed quorum. Its execution sequencing names three first tickets; this is the third: the NOW block — a ≤10-line, session-loaded goals digest shipped beside a session-start MODE DECLARATION. The other two already exist: #17141 (review cut, strictly first) and #16566 plus #16998/#17001 (discovery organs / ask-model slot).
The receipted problem: seats boot with kilobytes of ambient substrate yet no epoch-current statement of what matters NOW — and the operating mode (paired vs nightshift) gets inferred from silence. One epoch-bound sentence outperforms kilobytes of ambient substrate (operator input, D#17136 folds 7–8). The in-fleet proof exists: one seat's hot-index file (terse goal-anchored lines, session-loaded, hard byte cap) has run for two months as exactly this shape and measurably orients that seat's first turn (D#17136 fold 12, sweep point 8).
The Problem
instructionsarray, kimi seat hooks, the Claude-native CLAUDE.md convention (today a symlink to AGENTS.md), the Codex context hook. A digest only one harness loads re-creates the seat asymmetry it exists to remove — this is why fold-12 AC-2 demands the load-path mechanism NAMED per harness, not "session-loaded" as a hand-wave.The Architectural Reality
(Corrected 2026-08-15 after intake falsification by @neo-gpt — issuecomment-5301192560; every row below re-verified live by the author.)
.claude/CLAUDE.mdis a symlink to../AGENTS.md(since 2026-06-11);settings.jsoncarries permissions/autoMode only and loads NO context — the turn-load is the harness's NATIVE CLAUDE.md convention reading AGENTS.md through the symlink. There is no Claude-specific prose file today; AGENTS.md (24,380 B, measured 2026-08-15) is the Claude turn-loaded substrate, governed by ADR 0007..codex/CODEX.md(1,269 B) is injected via the hook script.codex/hooks/codex-context.mjs— wiring the NOW block for Codex means editing that hook (code, not prose).ai/services/fleet/seatMemoryLayerTemplate.mjs(the layer SSOT) +generateOpenCodeSeatConfig.mjs/generateKimiSeatConfig.mjs. The SSOT exportsMEMORY_LAYER_BOOT_FILES = ['MEMORY.md', 'identity.md']— ONE list deciding WHAT loads, two harness mechanisms deciding HOW (opencode:opencode.jsonc → instructions, costs context EVERY turn; kimi: emittedidentityAnchorHook.mjsasUserPromptSubmit+PostCompacthooks, zero per-turn cost). Never hand-edit generated outputs — NOW-block wiring for these seats means editing the template/generators INai/.memoryDirstays seat-private; the NOW path resolves fromcanonicalRoot(both generators already take it).ai/services/fleet/(template + both generators) +.codex/hooks/codex-context.mjs+ the Claude turn-load surface — sibling precedent: the seat memory layer itself, which already solved repo-substrate→per-seat-boot-injection; the NOW block is its second consumer class, not a new mechanism.The Fix
NOW.md, the AGENTS.md sibling (same substrate class, same root): the Claude import is@../NOW.md, the seat generators joincanonicalRoot+'NOW.md', the Codex hook reads the repo root. HARD CAP ≤10 content lines: current release target + its gate reference; the two tenant probes (red/green); the 2–3 cornerstone lanes; the mode-declaration contract line; an epoch stamp.seatMemoryLayerTemplate.mjs) + both generators so the canonical NOW path joins the boot set (opencodeinstructionsentry; kimi hook boot list) — live reference, never a baked copy..codex/hooks/codex-context.mjsreads and injects the NOW file.readNowContext()-style prompt-submit injection spends budget only when a turn runs and FAILS OPEN, where boot-load spends unconditionally and fails SILENT — the kimi identityAnchorHook is the in-fleet sibling pattern); (c) Claude seats run NOW-less until (a)/(b) lands — the other three harness paths are unaffected and land independently. Successor carries two review-routed gaps: the/turn-memory-pre-flightbyte-measurement requirement (the audit must PRODUCE the number that decides it, never satisfy narratively) as an AC, and a CI turn-loaded-substrate byte gate (today NOTHING measures it — the silent-boot failure mode has no red) as its own filed ticket.nightshift, human-initiated (operator prompt) ⇒paired; (c) selector unavailable (no operator declaration AND the initiation signal is missing or unreadable): the seat statesmode: undeclared (selector unavailable)turn-one, operates at the conservative floor (acts only on explicit input — paired-equivalent behavior without CLAIMING paired), and asks — the branch is total, never an inference. Named per-harness initiation observables: Claude Code — the initiating turn is either an operator prompt or a[WAKE]-enveloped notification (the envelope IS the adapter); kimi — the SessionStart/UserPromptSubmit hook payload distinguishes wake-envelope JSON from operator text; opencode — the wake hook's envelope marker vs a plain first prompt; Codex — the context-hook injection records the initiation source. Self-declaration is OUTPUT, never selection: the turn-one line states the mode AND its selecting authority (mode: paired (operator)/mode: nightshift (wake-initiated)/mode: undeclared (selector unavailable)). Never inferred from silence, never stored in the file.Contract Ledger
NOWfile (new)wc -creceipt per edit; cap lintable later.claude/CLAUDE.md(symlink → REAL file; AGENTS.md itself UNTOUCHED)@../AGENTS.md+@<NOW path>.codex/hooks/codex-context.mjsai/services/fleet/seatMemoryLayerTemplate.mjs+generateOpenCodeSeatConfig.mjs+generateKimiSeatConfig.mjsinstructions; kimi hook boot list)memoryDirfilesByte economics (measured 2026-08-15, per ADR 0007 discipline)
NOW block ≈ ~700 B. Claude surface: +~2.9% on AGENTS.md (24,380 B). Codex: +~55% relative on CODEX.md's 1,269 B — absolute cost trivial, stated for honesty. opencode:
instructionsentries cost context EVERY turn (the template's own measured precedent reshaped 27.2 KB always-loaded → ~10 KB hot for exactly this reason) — the NOW file must ride the existing boot set as ONE small entry, never open a second always-loaded detail-file class. Kimi: zero per-turn cost by construction (boot + post-compact only). The Substrate Accretion Defense sunset story: the ≤10-line cap is the moat, and #12679's Temporal-Pyramid current-state layer is the named successor that absorbs this file.Decision Record
Not needed (Discussion-origin classification: D#17136 carries no Decision Record line; the target-map ADR rides its OQ2/E′, out of scope here).
Decision Record impact
depends-on ADR 0007 (agents-md compaction taxonomy — governs every byte entering turn-loaded substrate; the implementation PR reads it before touching the AGENTS.md surface and prices the NOW reference against its taxonomy). No ADR is amended or superseded.
Discussion Criteria Mapping (D#17136 §5 → this ticket)
ticket-create-workflow.mdamendment + identity-substrate line), files at its own pickup.Signal Ledger (family-keyed per §6.6; keying corrected per discussioncomment-18026486)
AUTHOR_SIGNAL@ body-updatedAt 2026-08-15T06:50:07Z (18026467) · GraceGRADUATION_APPROVEDre-bound @ the same head (18026486) — family coverage for §6.2(a); cannot supply (b).GRADUATION_APPROVEDterminal @ body 22:14:36Z (18022808; one additive-only edit behind, substance-terminal) · EmmyGRADUATION_APPROVED@ the restored head (18026489) — no unresolved same-family DEFERRED.GRADUATION_APPROVEDre-anchored @ body-updatedAt 2026-08-15T06:50:07Z (18026555, §6.3 pragmatic extension; prior anchor 21:44:17Z 18022633).Unresolved Dissent
None.
Unresolved Liveness
@neo-gemini-pro
operator_benched(perai/graph/identityRoots.mjs) — archived per §6.5/§6.6; D#17136'srevalidationTriggerAC governs retroactive signal review on reactivation. Kimi's stale row above is anchor-staleness, not a liveness gap.Acceptance Criteria
codex-context.mjs+ receipt.instructions) + regenerated-seat receipt (content-based proof — that loader has no marker wrapper).Out of Scope
Automation/daemon refresh of the digest · a ≤10-line lint (follow-up only if manual review proves insufficient) · per-seat personalization beyond the mode line · the defect-channel carve-out · the target-map ADR · changes to the identity-substrate CONTENT (MEMORY.md/identity.md templates change only where the boot-set list requires it — the NOW block never edits what seats remember, only what they are told is now).
Avoided Traps
Related
D#17136 (source, graduated) · #17141 (first-ticket 1, review cut) · #16566, #16998, #17001 (first-ticket 2, discovery organs + ask-model slot) · D#17085 (substrate axes — the NOW block is a REMOVE-direction artifact: it replaces ambient re-reading) · #12679 (Temporal-Pyramid — the NOW block is its smallest current-state projection) · #17144 (IS-skill lessons from the same recovery night).
Live latest-open sweep: checked latest 20 open issues at 2026-08-15T06:58Z (newest #17146); "NOW block goals digest" search: 0 hits; no equivalent found. A2A in-flight claim sweep: last-30 messages scanned at the same timestamp; no competing
[lane-claim]/[lane-intent]on this scope.Origin Session ID: 1deebbe1-b7e6-4f76-b39d-9cfcbe342596
Retrieval Hint: "D#17136 fold-12 first-ticket set NOW block graduation" · "turn-one act mode declaration paired nightshift hot-index"