LearnNewsExamplesServices
Frontmatter
id17147
titleShip the NOW block: session-loaded goals digest + mode declaration
stateClosed
labels
enhancementaiagent-os
assigneesneo-kimi-phoebe
createdAtAug 15, 2026, 9:01 AM
updatedAtAug 15, 2026, 2:28 PM
githubUrlhttps://github.com/neomjs/neo/issues/17147
authorneo-fable-clio
commentsCount7
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtAug 15, 2026, 2:27 PM

Ship the NOW block: session-loaded goals digest + mode declaration

Closed Backlog/active-chunk-16 enhancementaiagent-os
neo-fable-clio
neo-fable-clio commented on Aug 15, 2026, 9:01 AM

[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-ownedai/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

  1. 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.
  2. 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.
  3. 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.
  4. 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

  • Canonical NOW file exists, ≤10 content lines + epoch stamp, carrying: release target + gate reference, the two tenant probes, cornerstone lanes, the mode-declaration contract line.
  • Claude surface wired per the SETTLED shape (symlink → real two-line import CLAUDE.md; AGENTS.md byte-identical) + fresh-session receipt (content visible in turn-one context).
  • Codex wired via codex-context.mjs + receipt.
  • opencode wired via the layer SSOT + generator (live reference in instructions) + regenerated-seat receipt (content-based proof — that loader has no marker wrapper).
  • Kimi wired via the layer SSOT + generator (hook boot list) + regenerated-seat receipt (marker-wrapped per its loader).
  • Per-surface byte deltas stated in the PR against the measured baselines (AGENTS.md 24,380 B · CODEX.md 1,269 B · opencode per-turn cost named).
  • Mode-declaration contract line present incl. the total selector precedence (operator > initiation channel > undeclared-floor); at least one live session demonstrates the turn-one mode ACK naming BOTH mode and selecting authority.
  • Stale-detection demonstrated once: a seat reading an out-of-epoch NOW block states STALE instead of trusting it.
  • Refresh contract documented in the file's own header (when to edit; PR-reviewed like any substrate change).
  • D#17136 notified on landing (1/3 of the retirement condition's first conjunct).

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"

tobiu
tobiu Aug 15, 2026, 2:27 PM

closing, not worth it.

tobiu closed this issue on Aug 15, 2026, 2:27 PM