Skip to content
Merged
32 changes: 32 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,38 @@ These apply to any AI harness.
`docs/DRIFT-TAXONOMY.md` (operational one-page
field guide) — the absorb stayed in-place as
provenance; the promotion is the ratification.
- **Substrate or it didn't happen — no invisible
directives (Otto-363).** Before declaring work
*"done,"* identify its durability surface. Chat,
TaskUpdate, `/tmp`, `/var/tmp`, and loop todos are
NOT durable project substrate. If a directive /
decision / packet matters after compaction, it
must be converted into substrate (committed to
canonical git history + reachable from a long-lived
ref + indexed by a canonical bootstrap or index
file — all three legs). 5-tier channel taxonomy:
ephemeral (chat, TaskUpdate, temp dirs — weather)
/ local-parked (named stash, local WIP) /
remote-parked (pushed WIP branch like
`wip/<topic>-<date>`, draft PR — *"if it matters
enough to come back to, it deserves a git ref"*) /
host-durable-not-git-canonical (GitHub Issues, PR
comments) / git-native-preserved (committed +
reachable-from-long-lived-ref + indexed repo
files). Vocabulary discipline: *captured*
(TaskUpdate / chat) ≠ *parked* (GitHub Issue /
remote WIP branch) ≠ *preserved* (git-native
Comment on lines +280 to +281
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

repo) ≠ *canonical* (accepted spec) ≠
*operational* (enforced by tooling). When
uncertain about preservation route, default to
`docs/research/` first; promotion to
memory/canonical is cheaper than demotion. Cross-
harness rule: applies to all harnesses, not just
Claude Code. Carved blade: *"A directive that
lives only in a conversation is not a directive.
It is weather. Substrate or it didn't happen."*
Full reasoning:
`memory/feedback_otto_363_substrate_or_it_didnt_happen_no_invisible_directives_aaron_amara_2026_04_29.md`.

## Build and test gate

Expand Down
36 changes: 36 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,42 @@ Claude-Code-specific mechanisms.
verify-before-deferring, future-self-not-bound,
and never-be-idle. Full reasoning:
`memory/feedback_version_currency_always_search_first_training_data_is_stale_otto_247_2026_04_24.md`.
- **Substrate or it didn't happen — no invisible
directives (Otto-363).** Before declaring work
*"done,"* identify its durability surface. Chat,
TaskUpdate, `/tmp`, and loop todos are NOT durable
project substrate. If a directive / decision /
packet matters after compaction, it must be
converted to a durable project object — preferably
substrate (committed + reachable + indexed git-
native repo file: memory / docs/research / docs/ops
/ claim file / validator / bootstrap rule). PRs
and issues are host-durable parking surfaces, NOT
substrate; for doctrine-changing decisions, mirror
the substantive content into a git-native file.
Vocabulary discipline: *captured* (TaskUpdate
only) ≠ *parked* (GitHub Issue / pushed WIP branch,
durable but not git-canonical) ≠ *preserved*
(repo-native, committed + reachable + indexed) ≠
*canonical* (accepted spec) ≠ *operational*
(enforced by tooling). Never call TaskUpdate-only
work *"done."* Verbatim-preservation trigger: when
the human maintainer / external reviewers send an
architecture-changing / doctrine-superseding /
multi-AI review packet, preserve verbatim in
`docs/research/` BEFORE summarizing.
Magnitude classifier: small correction → task;
implementation readiness → task + notes; doctrine
correction → memory file; superseding architecture
→ research preservation + memory absorb +
supersession note. Carved blade: *"A directive
that lives only in a conversation is not a
directive. It is weather. Substrate or it didn't
happen."* CLAUDE.md-level so it is 100% loaded at
every wake, alongside verify-before-deferring,
future-self-not-bound, never-be-idle, and
version-currency. Full reasoning:
`memory/feedback_otto_363_substrate_or_it_didnt_happen_no_invisible_directives_aaron_amara_2026_04_29.md`.
- **Tick must never stop.** When running under
`/loop` autonomous mode (cron fires every minute
per `docs/AUTONOMOUS-LOOP.md`), the tick is the
Expand Down
Loading
Loading