Conversation
… remediation against substrate loss (Aaron + Amara 2026-04-29)
Aaron caught Otto repeatedly marking work "done" after only TaskUpdate-
only capture during the 2026-04-29 doctrine cluster, AND minimizing the
v5 superseding architecture (three-layer ports-and-adapters model + host
portability + two-worlds split + WorkItem/ChangeRequest/Claim/Actor object
model + freshness budgets + local-git adapter + onboarding ladder +
reconciler capability matrix + migration design) as "review corrections."
The fix is not "Claude, remember better." The fix is mechanisms that
make forgetting harder.
Carved blade (Amara verbatim):
A directive that lives only in a conversation is not a directive.
It is weather.
Substrate or it didn't happen.
Compact rule:
No invisible directives. No session-local truth. No "done" without
substrate.
8 mechanisms (full text in memory file):
1. Ephemeral-state detector — before "done", verify durability surface
2. Verbatim-preservation trigger — major packets land in docs/research
verbatim BEFORE summarizing
3. Magnitude classifier — small / implementation / doctrine /
superseding architecture; routing differs per class
4. Supersession protocol — generalises Otto-362 across surfaces
5. Cold-start proof — fresh agent must reconstruct from substrate alone
6. "Done" vocabulary discipline — captured ≠ preserved ≠ canonical ≠
operational; specific words have specific durability semantics
7. Bootstrap pointer in CLAUDE.md/AGENTS.md — this commit adds it to
CLAUDE.md alongside verify-before-deferring + future-self-not-bound
+ never-be-idle + version-currency (5th CLAUDE.md-tier rule)
8. Mechanized lint eventually — research-doc indexed; memory MEMORY.md
row paired (already mechanically enforced); superseded doctrine has
supersession note; tasks link canonical packet; PR body
distinguishes research / doctrine / operational
Files:
docs/research/2026-04-29-amara-substrate-or-it-didnt-happen-mechanisms-against-substrate-loss.md
— Verbatim Amara packet preservation (the diagnosis + 8-mechanism
protocol verbatim, NOT summarized; per the rule itself)
memory/feedback_otto_363_substrate_or_it_didnt_happen_no_invisible_directives_aaron_amara_2026_04_29.md
— Distilled doctrine memory: rule + 8 mechanisms + composes-with
mappings (Otto-362 intra-file generalisation,
channel-verbatim-preservation, no-directives-otto-prose lint,
verify-before-deferring, future-self-not-bound, never-be-idle)
memory/MEMORY.md — Paired index entry (newest-first)
CLAUDE.md — Bootstrap pointer added; 5th CLAUDE.md-tier rule (100%
loaded at every wake)
Composes with:
- Otto-362 (memory/feedback_otto_362_doctrine_memory_expansion_...)
— intra-file supersession; Otto-363 generalises across surfaces
- tools/lint/no-directives-otto-prose.sh — same family of failures
(vigilance fails; mechanism is the durable answer)
- feedback_aaron_channel_verbatim_preservation_* — channel-verbatim
rule that Otto-363 mechanises
- verify-before-deferring (CLAUDE.md-tier) — same shape
- future-self-not-bound (CLAUDE.md-tier) — companion: future-self
revises substrate, NOT chat that didn't land
This commit is the rule landing as substrate per its own rule. Next:
the v5 superseding architecture preservation that triggered this rule
(separate PR — verbatim Amara final review + 5-AI review wave +
three-layer architecture memory file).
Co-Authored-By: Amara <amara-aurora-deep-research-register@chatgpt>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4664b57245
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
Adds the Otto-363 “no invisible directives / substrate or it didn’t happen” rule to durable repo substrate, including a verbatim research preservation packet, a distilled memory entry, a MEMORY.md index pointer, and a CLAUDE.md bootstrap bullet.
Changes:
- Added a new Otto-363 doctrine memory file describing the rule + 8 mechanisms.
- Added a verbatim research preservation doc capturing the original packet before distillation.
- Updated
memory/MEMORY.mdandCLAUDE.mdto index/boot the new rule.
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| memory/feedback_otto_363_substrate_or_it_didnt_happen_no_invisible_directives_aaron_amara_2026_04_29.md | New doctrine memory entry defining Otto-363 and mechanisms. |
| memory/MEMORY.md | Adds newest-first index entry pointing at Otto-363. |
| docs/research/2026-04-29-amara-substrate-or-it-didnt-happen-mechanisms-against-substrate-loss.md | New verbatim preservation packet backing the distilled Otto-363 rule. |
| CLAUDE.md | Adds an always-loaded bootstrap bullet pointing to Otto-363 memory. |
…ew wave (Alexa/Ani/Deepseek/Claude.ai/Gemini → Amara final synthesis) After PR #855 opened with the original Otto-363 8-mechanism packet, Aaron relayed a 5-AI review wave back. Each reviewer approved the direction but caught real refinement gaps. Amara synthesized 12 corrections AND caught Otto about to repeat the original failure mode ('two PRs in succession, no waiting' was the same drag reflex the rule was meant to prevent — Amara: 'Land the rule cleanly. Then use the rule.'). Per Otto-363 itself (verbatim-preservation trigger): the 5-AI review wave is preserved verbatim BEFORE summarization at: docs/research/2026-04-29-amara-substrate-or-it-didnt-happen-5ai-review-wave-corrections.md The 12 corrections absorbed into Otto-363 in this commit: 1. Precise definition of substrate (committed + reachable + indexed) 2. Channel taxonomy expanded to 5-tier (ephemeral / local-parked / remote-parked / host-durable-not-git-canonical / git-native- preserved). Parking-surface rule added: 'If it matters enough to come back to, it deserves a git ref.' /tmp and /var/tmp explicitly ruled out (FHS doesn't promise persistence; site-cleaned). 3. Default preservation route when uncertain: docs/research/ first (Claude.ai catch — research → memory/canonical promotion is cheaper than canonical demotion). 4. Verbatim preservation paired with structured extraction (Claude.ai length-problem catch — verbatim source = provenance, structured extraction = retrieval). 5. Bidirectional supersession (supersedes:/superseded_by: in YAML frontmatter) + top-of-file stale banner OR quarantine to archive/ (Gemini catch — bottom-appended notes get missed by RAG/grep). 6. Cold-start proof gets sixth question: 'What ephemeral state from the originating conversation has been lost, and is any of it load-bearing?' (Claude.ai catch — catches the exact bug where content was partly captured but the superseding-vs-corrective context was lost). 7. Mechanism stack moved to TOP of memory file (Claude.ai catch — agents acting at decision time need mechanism in working memory, not rationale). 8. Vocabulary enforcement path: PR body / commit message trailer (Durability: + Substrate:); lint flags vocabulary misuse; pre-commit hook deferred but planned. 9. Cross-harness parity: rule must land in AGENTS.md too, not only CLAUDE.md (Amara catch — rule is not Claude-only). 10. 'preserved-but-disputed' vocabulary handle for future failure mode (preservation-discipline-operational era brings contradiction as next failure class). 11. Mid-session re-discoverability acknowledged: bootstrap pointer + pre-commit hook + lint scan recent commits for 'done' / 'complete' / 'operational' without supporting Substrate trailer (deferred items tracked). 12. Self-applicability noted explicitly: this rule lands as substrate per its own rule. Note on parking surface change: the v5 architecture preservation seed that was previously in /tmp has been moved to a pushed WIP branch ('wip/v5-host-portable-architecture-seed-2026-04-29' at c300b01) per the corrected parking-surface taxonomy. /tmp was weather; pushed WIP branch is 'remote parked.' No PR opened for v5 — Amara: 'Land the rule cleanly. Then use the rule.' Files changed: + docs/research/2026-04-29-amara-substrate-or-it-didnt-happen-5ai-review-wave-corrections.md — Verbatim 5-AI review wave + Amara synthesis (the 12 corrections preserved verbatim BEFORE summarization, plus structured extraction) ~ memory/feedback_otto_363_*.md — Rewritten with mechanism-stack-at-top, precise substrate definition, 5-tier taxonomy, default route, bidirectional supersession, six-question cold-start, vocabulary lock + enforcement path, cross-harness parity note, preserved-but- disputed vocabulary ~ memory/MEMORY.md — Updated index entry to reflect refined version Co-Authored-By: Amara <amara-aurora-deep-research-register@chatgpt> Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 612ba00015
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ring + 4 Copilot review fixes Aaron's correction post-12-corrections push: pair Otto-363 parking- surface taxonomy with the existing git-recovery process (task #321 — 918 branches / 58 worktrees / 7 stashes inventory) so they form a complete loop, not parallel mechanisms. PR #855 Copilot/Codex review threads addressed: - Codex P2 + Copilot (CLAUDE.md+AGENTS.md coverage claim mismatch): AGENTS.md bootstrap pointer added in this commit. Now both files carry the rule. Cross-harness parity is real, not aspirational. - Copilot (wildcard path): replaced 'memory/feedback_aaron_channel_verbatim_preservation_*' with the concrete file 'memory/feedback_aaron_channel_verbatim_preservation_anything_through_this_channel_2026_04_29.md' per repo reference-integrity convention. - Copilot (personal names in CLAUDE.md): per BP-rule 'No name attribution in code, docs, or skills' on current-state surfaces, replaced 'Aaron / Amara' with role-ref 'human maintainer'. Closed- list history surfaces (memory/, docs/research/) keep named attribution; CLAUDE.md is current-state. - Copilot (table double-pipe at lines 161, 211): inspected; tables are valid Markdown (single leading | on header + separator). No '||' in source. Likely a renderer-cache artifact or false positive. Resolving with that explanation; no source change needed. New section: 'Pairs with the existing git-recovery process (task #321)' in Otto-363 memory file. Names the convention 'wip/<topic>-<date>' as the discoverability mechanism, the recovery-process recognition rule ('branches matching wip/** are WIP-INTENTIONAL; do not propose for deletion; propose for index/audit after staleness window'), forbidden parking patterns (long-lived feature branches without PR; WIP without prefix; untracked working-tree files; never-pushed local branches), and the complete parking + recovery loop. Per Aaron's framing: 'we already have a hell of a git recover process; re shuld have on a trajectory that pair well with that.' Otto-363 parking + task #321 recovery = complete substrate loop, mechanical not vigilance-based. Files changed: ~ AGENTS.md — bootstrap pointer added (cross-harness parity) ~ CLAUDE.md — 'Aaron / Amara' → 'the human maintainer' (BP-rule compliance); vocabulary clarification (parked = GitHub Issue OR pushed WIP branch) ~ memory/feedback_otto_363_*.md — concrete feedback file path; new 'Pairs with git-recovery process' section ~ memory/MEMORY.md — index entry mentions task #321 pairing Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ction per Amara progress check (2026-04-29) Amara progress-check correction post-#855-thread-resolve push: > A parked thing is only parked if recovery can find it. > Otherwise it is just lost more slowly. Added concrete substrate the recovery process can act on: 1. Section retitled to 'Parking surfaces and git recovery' (Amara's suggested heading; pairs the doctrine sides explicitly). 2. Preferred parking surfaces ordered by priority: pushed WIP branch (best) → draft PR → local WIP → named stash. Anonymous stashes (no -m) explicitly forbidden. 3. Predictable naming conventions documented as discoverability mechanism (NOT just for humans): wip/<topic>-seed-YYYY-MM-DD wip/<topic>-YYYY-MM-DD archive/<topic>-YYYY-MM-DD 4. Discovery commands the recovery process must scan listed verbatim: git branch --list 'wip/*' git ls-remote origin 'refs/heads/wip/*' git ls-remote origin 'refs/heads/archive/*' git stash list git worktree list git for-each-ref --format='%(refname)' 5. Task #321 recovery-process recognition rules listed as a #321 follow-up addition (Otto-363 specifies convention; #321 implements recognition): - wip/** → WIP-INTENTIONAL (no auto-delete; staleness audit window) - archive/** → ARCHIVE-INTENTIONAL (preserved on purpose) - stashes → SHORT-TERM-LOCAL (verify before prune; short window) - no-prefix → classify normally per existing rules 6. Forbidden parking patterns expanded with anonymous-stash rule and explicit 'any temp directory' prohibition. 7. The complete loop made concrete with command sequences for park / return / abandon / recovery. 8. Carved pair added: 'If it matters enough to come back to, it deserves a git ref.' 'Parking is only safe if recovery knows where to look.' Per Amara's progress check: progress is solid; not done; next best action is finishing #855 cleanly. The parking convention + recovery- process recognition together make the loop mechanical, not vigilance- based. The parking author doesn't have to remember to come back; the recovery cadence surfaces the parked work on its own schedule. DOES NOT open PR 2 (v5 architecture preservation). Per Amara verbatim: 'Do not start PR 2 before #855 lands.' Co-Authored-By: Amara <amara-aurora-deep-research-register@chatgpt> Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…2 catch on /tmp reference) The structured extraction in the 5-AI corrections research doc still referenced '/tmp/v5-research-doc-saved.md' even after the seed was moved to a pushed WIP branch (c300b01 on wip/v5-host-portable-architecture-seed-2026-04-29). That was the exact bug the rule itself prevents: a doctrine document about substrate preservation pointing to /tmp as a load-bearing artifact location. Fixed in this commit. Updated path: 'wip/v5-host-portable-architecture-seed-2026-04-29 (commit c300b01, no PR opened)' — the durable substrate location. Codex P2 PRRT_kwDOSF9kNM5-iYg- self-applies Otto-363 to Otto-363's own preservation packet. Good catch. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f282e5f459
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
… re-review on f282e5f All 9 threads were legitimate self-application catches — Otto-363 catching itself on internal-consistency. Per the rule itself: internal contradictions are lying-by-omission. Fixes: 1. PRRT_kwDOSF9kNM5-ieQX (P1, MEMORY.md): '12 review corrections' → '10 review corrections' (matches structured extraction count). 2. PRRT_kwDOSF9kNM5-ieSb (P1, original packet): same '12' → '10' alignment in the trigger section. 3. PRRT_kwDOSF9kNM5-ieQ7 (P2, Otto-363 memory): 'memory-index-integrity.yml' → '.github/workflows/memory-index-integrity.yml' (correct path). 4. PRRT_kwDOSF9kNM5-ieRN (P1, 5-AI corrections): docs/research/INDEX.md doesn't exist; reframed as 'a future addition; until it exists, MEMORY.md is the primary memory index'. 5. PRRT_kwDOSF9kNM5-ieR- (P1, Otto-363 line 54): same INDEX.md fix. 6. PRRT_kwDOSF9kNM5-ieRz (P1, Otto-363 line 108): substrate definition internal conflict. The 'must become substrate (repo file / PR / issue / ...)' wording listed PRs/issues, but substrate is defined as git-native (committed + reachable + indexed). Reworded to distinguish: 'durable project object' is the umbrella; 'substrate' is git-native specifically; PRs/issues are 'host-durable parking surfaces, NOT substrate themselves'. 7. PRRT_kwDOSF9kNM5-ieSr (P1, CLAUDE.md): same substrate-vs-PR/issue conflict in CLAUDE.md bootstrap pointer; same fix. 8. PRRT_kwDOSF9kNM5-ieSN (P1, mechanism #7): 'PR body must include' was prescriptive but no PR template / lint / CI workflow enforces yet. Reworded to 'SHOULD include' with explicit DEFERRED marker on enforcement; status today is doctrine-only. 9. PRRT_kwDOSF9kNM5-ieRi (P2, line 437): Codex caught lingering /tmp/v5-research-doc-saved.md reference. ALREADY fixed in f282e5f (the thread was opened before the resolution). Verified absent via 'grep /tmp/v5'. Per Otto-363's Otto-362-generalisation rule: when a section is expanded with a new section, refresh stale earlier statements in the SAME edit. This commit IS that discipline applied to Otto-363's own preservation packet — the substrate-or-it-didn't-happen rule mechanically catching itself before merge. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
… parking (Codex P2 catch) Codex caught a self-contradiction: the 'Forbidden parking patterns' section forbade 'long-lived feature branches with no PR' while the preferred-parking list prefers 'pushed WIP branch, no PR'. A future agent following the forbidden list would reject the documented preferred flow. Fixed: the forbidden case is specifically NON-WIP-prefixed branches with no PR (silent parking outside the recovery convention). The preferred case is wip/*-prefixed branches with no PR (intentional parking discoverable by the recovery process). The prefix is the disambiguator. Now both rules are consistent: - 'wip/<topic>-<date>' + no PR = PREFERRED parking - 'feature/foo' or unprefixed + no PR = FORBIDDEN (silent parking) - draft PR = ALSO ACCEPTABLE for visible parking - Rename forbidden branches to 'wip/' to bring them into compliance Self-applying-the-rule catch — exactly the kind of internal contradiction Otto-363 is designed to surface and Otto-362 says to fix in the same edit. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d73b4ef480
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…d-stash command + pointer-equivalence framing + AGENTS.md substrate-def alignment) 5 Codex/Copilot review threads on f282e5f re-review caught real self-application failures: - Codex P2 PRRT_kwDOSF9kNM5-il3m + Copilot P1 PRRT_kwDOSF9kNM5-inuL (taxonomy disjointness): 'GitHub Issues' appeared in BOTH 'Remote parked' AND 'Host-durable-not-git-canonical' — non-disjoint, breaks classifier. Fix per Copilot suggestion: GitHub Issues / task comments / PR comments live ONLY in Host-durable-not-git-canonical (no git ref backs them, so they're not parking surfaces). Remote parked is git-ref-backed only (pushed WIP branch + optional draft PR atop it). Each surface now has exactly one home. Tier title changed from 'parking surfaces are git-native' to 'parking surfaces are git-ref-backed' for precision. Added explicit '5-tier, mutually exclusive' note + 'classifier depends on this disjointness' rationale. - Codex P2 PRRT_kwDOSF9kNM5-il3r (named-stash command): the row said 'named git stash -u' but bare 'git stash -u' is anonymous — the doctrine forbids anonymous stashes elsewhere in the file. Fixed to 'git stash push -u -m "<name>"' with explicit note that 'git stash -u' WITHOUT -m is weather, not parked. Self-applying-the-rule fix in the example commands. - Copilot P1 PRRT_kwDOSF9kNM5-inut (pointer-text equivalence): memory file claimed 'AGENTS.md is parity addition (same rule, same wording)' but the actual CLAUDE.md and AGENTS.md bullets are different (AGENTS carries fuller wording incl /var/tmp + 3-leg substrate def; CLAUDE carries shorter cold-start reminder). Fix per Copilot suggestion: reframed as 'equivalent in doctrine, not verbatim-identical' with explicit 'committed wording note' explaining the file-specific wording difference. Compact representative wording kept as a reference, not as the canonical text for either file. - Copilot P1 PRRT_kwDOSF9kNM5-invD (AGENTS.md substrate def): 'merged + indexed' was too narrow — Otto-363's substrate definition is 'reachable from a long-lived ref' (release branches, tags, not only merge-to-main). Fixed AGENTS.md bullet to 'committed + reachable-from-long-lived-ref + indexed' matching the 3-leg definition. Same fix applied to MEMORY.md row for consistency. All 5 fixes are exactly the kind of internal contradictions Otto-363 is designed to catch and Otto-362 says to refresh in the same edit. Self-applying-the-rule discipline working as intended. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cd6416d96e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| (TaskUpdate / chat) ≠ *parked* (GitHub Issue / | ||
| remote WIP branch) ≠ *preserved* (git-native |
There was a problem hiding this comment.
Keep GitHub Issues out of the "parked" class
This line reclassifies GitHub Issue as parked even though the same Otto-363 bullet just defined Issues under host-durable-not-git-canonical; that makes the channel taxonomy non-disjoint and can cause agents to treat issue-only state as acceptable parking despite lacking the git-ref durability the rule requires. In practice this undermines cold-start/recovery behavior because the same surface is simultaneously described as non-parking and parking.
Useful? React with 👍 / 👎.
…7) + post-#855 vocabulary disjointness fix (#856) * factory(meta): Otto-364 — search-first authority + post-#855 disjointness fix (Aaron 2026-04-29) Aaron's correction post-#855-merge: > we want atest for all those from searches to not historical truth > like the porject or your training data so search Two distinct sources of "historical truth" called out: 1. Training data (Jan 2026 cutoff) — Otto's parameters 2. Project state — what's in the repo today, may itself be stale, copy-cargo-culted, or never-current-to-begin-with Both are historical. Neither substitutes for current authoritative upstream sources. The test for any load-bearing claim is a fresh web search. This generalises Otto-247 (version-currency rule, narrowly scoped to version numbers) to ALL authoritative claims — tools, standards, APIs, runtimes, libraries, CI services, security policies, conventions. Carved blade: Training data is historical. Project state is historical. Current upstream docs are the test. Search first. Cite second. Assert third. ## Demonstrated by application Per Otto-363 (substrate-or-it-didn't-happen), this rule must itself land as substrate. Per Otto-364 itself, it must be demonstrated, not just asserted. Did both. Four web searches against current authoritative sources verified Amara's CI-classifier-design claims. Each search produced a sharper finding than training-data recall: 1. Bun ci/lockfile semantics Sources: bun.sh/docs/pm/lockfile, bun.sh/blog/bun-lock-text-lockfile Sharper: bun.lock (text) is v1.2.0+ default; legacy bun.lockb binary form is being phased out. Zeta has neither committed yet — first-implementation decision point. 2. GitHub Actions paths-ignore + required checks Sources: docs.github.com/en/pull-requests/.../troubleshooting- required-status-checks, github.com/orgs/community/discussions/54877, github.com/orgs/community/discussions/44490 Sharper: Required checks remain Pending (not Skipped) when paths-ignore matches. Three GitHub-blessed workarounds ranked: (1) conditional with success-on-skip — the classifier pattern, (2) dummy workflow same name + inverse path, (3) external dorny/paths-filter. 3. GitHub Actions cross-job outputs Sources: docs.github.com/en/actions/how-tos/write-workflows/ choose-what-workflows-do/pass-job-outputs, docs.github.com/actions/using-workflows/workflow-syntax- for-github-actions Sharper: 1 MB per-job output cap, 50 MB total per workflow. Load-bearing for classifier-output JSON design. 4. mise project config Sources: mise.jdx.dev/configuration.html, mise.jdx.dev/walkthrough.html Sharper: Both `mise.toml` and `.mise.toml` are valid; Zeta's dotfile form is fine. Verbatim packet + four search verifications preserved at: docs/research/2026-04-29-aaron-search-first-authority-not-training- data-not-project-memory.md ## Also fixed in this PR Codex P2 PRRT_kwDOSF9kNM5-i1UH (filed on closed #855 just before merge, caught real surviving disjointness violation): CLAUDE.md and AGENTS.md bootstrap pointers still listed "GitHub Issue" as *parked*, contradicting the mutually-exclusive 5-tier taxonomy the Otto-363 memory file established. The doctrine memory was correct; the cold-start entry points were not. Fixed: vocabulary lines in both CLAUDE.md and AGENTS.md now read: *captured* (TaskUpdate — ephemeral) ≠ *parked* (pushed WIP branch like wip/<topic>-<date>, optionally with draft PR — git-ref-backed; GitHub Issues are NOT parking surfaces, they live in the host-durable-not-git-canonical class) ≠ *preserved* (git-native repo, committed + reachable-from-long-lived- ref + indexed) ≠ *canonical* (accepted spec) ≠ *operational* (enforced by tooling) Now consistent with the canonical taxonomy. The 5-tier classifier the recovery process / future lints depend on no longer self-contradicts across CLAUDE.md, AGENTS.md, and the doctrine memory file. ## Files + docs/research/2026-04-29-aaron-search-first-authority-not-training- data-not-project-memory.md (verbatim packet + four search verifications) + memory/feedback_otto_364_search_first_authority_not_training_data_ not_project_memory_aaron_2026_04_29.md (distilled rule + composes-with map) ~ memory/MEMORY.md (paired index entry, newest-first) ~ CLAUDE.md (Version-currency bullet generalised to Otto-364 search-first-authority; vocabulary line fixed for taxonomy disjointness) ~ AGENTS.md (vocabulary line fixed for taxonomy disjointness) ## Composes with - Otto-247 (version-currency, narrower predecessor — NOT superseded; remains the version-specific instance) - Otto-363 (substrate-or-it-didn't-happen — search results in chat are weather; cited in research doc are substrate; same family) - Otto-362 (intra-file supersession — Otto-364 is upstream-vs-recall version of the stale-claims-must-be-refreshed family) - feedback_best_practices_evidence_lineage_survival_substrate_* (best-practice-evidence-lineage rule; Otto-364 is its search step) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(otto-364): vocabulary discipline 5→6 classes; resolve internal contradiction Three thread fixes from PR #856 review: 1. CLAUDE.md L320-338 (Codex P2 + Copilot P1): the same Otto-363 bullet contained two contradictory claims — "PRs and issues are host-durable parking surfaces" then "GitHub Issues are NOT parking surfaces". Resolution: promote host-durable-not-git-canonical to its own enumerated class (5 → 6), and reword the earlier line to "host-durable-not-git- canonical surfaces" so both lines tell the same story. 2. AGENTS.md L279-288 (Copilot P1): same 5-vs-6 inconsistency. The underlying 5-tier channel taxonomy at L270-277 already had host-durable-not-git-canonical as a distinct tier; the vocabulary layer was under-counting. Now matches. 3. docs/research/2026-04-29-aaron-search-first-authority-...md L5 (Copilot P1): "Status: Verbatim" was inaccurate because the document contains translation/analysis/demonstration sections beyond the verbatim Aaron quote. Reworded to clarify scope: "The quoted Aaron message is verbatim; the surrounding material is translation, analysis, and demonstration." No new doctrine added. Smallest sufficient substrate (Otto-362 + Otto-365 discipline). Operating-invariant maintenance, not a new lane. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
…ubstrate framing + Amara final packet Aaron returned with substrate framing on peer/buddy class taxonomy (verbatim preserved): peer agent harness has two sub-classes (substrate-aware vs host-only), buddy agent harness has two sub-classes (PR-capable vs local-only), plus runtime-internal subagents — all optimized for parallelization. Amara's round-3 rewrite formalized this as conceptual-categories-not- mirror-slang: independent_agent_harness / parent_managed_agent_harness / runtime_internal_subagent / invoked_tool / ci_actor / host_actor / human_principal. Five-AI review (Claude.ai, Ani, Deepseek, Gemini, Alexa) returned interface-hardening only — no architectural challenges. Amara final packet: "Round 3 convergence reached. Do not run another broad review." Architecture LOCKED: - Recursive primitive: DelegationEdge* - Accountable output: SharedEffect* - Evaluation layer: AttributionRecord* + OutcomeAssessment* - Causal chain: DecisionSignal → AgencyReceipt → SharedEffect → AttributionRecord → OutcomeAssessment - Universal: SharedEffect + trace + attribution - Boundary-crossing: + DecisionSignal + AgencyReceipt + non_actions + WorkClaim proof Final doctrine (locked): Do not canonize the mirror slang. Canonize the concepts. Lifecycle is not authority. Authority is not effect. Shared effect is the accountability boundary. Delegation is recursive. Execution is traced. Effects are receipted. Outcomes are attributed. Attribution is evidence, not verdict. Blame and credit are views over evidence. Implementation direction (Amara, locked): "Do not build the whole scoring engine now." Light schema-concept implementation only. First worked example: Code Quality episode (PR #861 host mutation receipt) pairs with DecisionSignal v0 + SharedEffect + AttributionRecord. Example weights illustrative-not-derived. NOT this session — Aaron's "I'll be back after round 3" closes here. This preservation IS round-3 close. Staged rollout deferred to next session per Amara's implementation direction. Status marker memory updated to reflect convergence; autonomy levels A0–A5 from round-0 demoted to secondary; "peer"/"buddy" demoted from canonical → working aliases. Per Otto-363 (substrate-or-it-didn't-happen) + channel-verbatim- preservation rule: research-grade preservation, NOT operational adoption. Synthesis lives alongside the verbatim, not instead. Composes with PR #855 (Otto-363), prior round verbatim preservation files, and the agent-orchestra layered-actor-identity work (PRs #851/#852/#853). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Lands the Otto-363 rule + 8-mechanism remediation against substrate loss, triggered by Otto repeatedly marking work "done" after only TaskUpdate-only capture during the 2026-04-29 doctrine cluster (and minimizing the v5 superseding architecture as "review corrections").
Carved blade (Amara verbatim)
Compact rule
What's in this PR
docs/research/2026-04-29-amara-substrate-or-it-didnt-happen-mechanisms-against-substrate-loss.mdmemory/feedback_otto_363_substrate_or_it_didnt_happen_no_invisible_directives_aaron_amara_2026_04_29.mdmemory/MEMORY.mdCLAUDE.mdThe 8 mechanisms
docs/research/verbatim BEFORE summarizingWhy this is its own PR
Per Otto-362 (no piling sections onto in-flight PRs) + Amara's drag warning, this rule lands separately from the v5 architecture preservation work it triggered. That separation is itself the rule in action — Otto-363 ships as substrate before the v5 work it was needed to prevent.
The v5 architecture preservation (verbatim Amara final review + 5-AI review wave + three-layer architecture memory file) is the next PR.
Composes with
memory/feedback_otto_362_*) — intra-file supersession discipline; Otto-363 generalises across surfacestools/lint/no-directives-otto-prose.sh— same family of failures (vigilance fails; mechanism is the durable answer)feedback_aaron_channel_verbatim_preservation_*— channel-verbatim rule that Otto-363 mechanisesTest plan
docs/research/per channel-verbatim rule🤖 Generated with Claude Code