agent-bios 0.19.0 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/DEPENDENCIES.md +27 -27
  2. package/INSTALL.md +4 -4
  3. package/README.md +58 -28
  4. package/claude/CLAUDE.md +1 -1
  5. package/claude/guides/claude-prompting.md +1 -1
  6. package/claude/guides/cli-multi-model-workflow.md +3 -3
  7. package/claude/guides/documentation-hygiene.md +3 -0
  8. package/claude/guides/gpt-prompting.md +1 -1
  9. package/claude/guides/korean-writing.md +153 -0
  10. package/claude/guides/learning-flow.md +4 -4
  11. package/claude/guides/session-distill-workflow.md +8 -8
  12. package/claude/guides/slide-writing/RUNBOOK.md +5 -5
  13. package/claude/skills/repo-charter/SKILL.md +3 -3
  14. package/claude/skills/understand/SKILL.md +58 -28
  15. package/codex/AGENTS.md +1 -1
  16. package/codex/guides/claude-prompting.md +1 -1
  17. package/codex/guides/cli-multi-model-workflow.md +3 -3
  18. package/codex/guides/documentation-hygiene.md +3 -0
  19. package/codex/guides/gpt-prompting.md +1 -1
  20. package/codex/guides/korean-writing.md +153 -0
  21. package/codex/guides/learning-flow.md +4 -4
  22. package/codex/guides/session-distill-workflow.md +8 -8
  23. package/codex/guides/slide-writing/RUNBOOK.md +5 -5
  24. package/compose/app_bridge/SKILL.md +12 -12
  25. package/compose/app_bridge/scripts/bridge.py +15 -7
  26. package/compose/assemble.py +5 -5
  27. package/compose/bootstrap/SKILL.md +18 -18
  28. package/compose/canary.sh +4 -4
  29. package/compose/check-domains.py +6 -6
  30. package/compose/corpus-state.py +16 -1168
  31. package/compose/corpus.py +13 -402
  32. package/compose/corpus_app.py +14 -450
  33. package/compose/corpus_catalog.py +15 -926
  34. package/compose/corpus_import.py +14 -523
  35. package/compose/corpus_install.py +14 -1841
  36. package/compose/corpus_session.py +16 -848
  37. package/compose/corpus_setup.py +16 -670
  38. package/compose/corpus_setup_cli.py +15 -577
  39. package/compose/corpus_setup_i18n.py +20 -318
  40. package/compose/corpus_setup_ui.py +18 -631
  41. package/compose/corpus_store.py +16 -1621
  42. package/compose/corpus_transaction.py +15 -284
  43. package/compose/corpus_ui.py +17 -972
  44. package/compose/corpus_ui_runtime.py +16 -274
  45. package/compose/corpus_understand.py +13 -520
  46. package/compose/domains.json +2 -1
  47. package/compose/instructions-state.py +1175 -0
  48. package/compose/instructions.py +409 -0
  49. package/compose/instructions_app.py +464 -0
  50. package/compose/instructions_catalog.py +931 -0
  51. package/compose/instructions_import.py +529 -0
  52. package/compose/instructions_install.py +1866 -0
  53. package/compose/instructions_session.py +852 -0
  54. package/compose/instructions_setup.py +676 -0
  55. package/compose/instructions_setup_cli.py +586 -0
  56. package/compose/instructions_setup_i18n.py +324 -0
  57. package/compose/instructions_setup_ui.py +647 -0
  58. package/compose/instructions_store.py +1668 -0
  59. package/compose/instructions_transaction.py +306 -0
  60. package/compose/instructions_ui.py +975 -0
  61. package/compose/instructions_ui_runtime.py +278 -0
  62. package/compose/instructions_understand.py +678 -0
  63. package/compose/register-hooks.py +1 -1
  64. package/compose/setup/START.md +24 -13
  65. package/docs/advanced-launch.md +11 -11
  66. package/docs/instructions-compatibility.md +86 -0
  67. package/docs/{corpus.md → instructions.md} +35 -8
  68. package/docs/recovery.md +8 -8
  69. package/docs/releases/0.19.2.md +38 -0
  70. package/docs/session-model.md +23 -20
  71. package/docs/setup.md +42 -25
  72. package/docs/understand.md +57 -9
  73. package/install.sh +70 -69
  74. package/launch/agent-launch.py +306 -295
  75. package/launch/agent-launch.toml +2 -2
  76. package/launch/i18n/en.toml +55 -55
  77. package/launch/i18n/ja.toml +56 -56
  78. package/launch/i18n/ko.toml +56 -56
  79. package/launch/shell_integration.py +4 -4
  80. package/learn/collect-learning.py +10 -10
  81. package/learn/learning.schema.json +1 -1
  82. package/learn/migrate-learnings.py +51 -51
  83. package/package.json +27 -11
  84. package/provenance.json +1 -1
  85. /package/docs/assets/{corpus-studio.svg → instructions-studio.svg} +0 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: agent-bios
3
- description: Set up or reconfigure agent-bios through conversation, manage its private corpus, or explicitly use corpus context in this Codex task. Loading this skill alone does not activate corpus content.
3
+ description: Set up or reconfigure agent-bios through conversation, manage its private instructions, or explicitly use instructions context in this Codex task. Loading this skill alone does not activate instructions content.
4
4
  ---
5
5
 
6
6
  # agent-bios in this task
@@ -11,7 +11,7 @@ the absolute path to that helper; pass it as a quoted shell argument or set
11
11
  `BRIDGE` in the same tool call. Do not rely on variables from a previous app
12
12
  tool call or substitute a PATH copy of `agent-bios`.
13
13
 
14
- Distinguish the user's request before reading any corpus body:
14
+ Distinguish the user's request before reading any instructions body:
15
15
 
16
16
  - **Install, reconfigure or resume setup:** run
17
17
  `python3 "$BRIDGE" setup start`, read its returned `guide_path`, and follow
@@ -20,12 +20,12 @@ Distinguish the user's request before reading any corpus body:
20
20
  returned choices in the app conversation,
21
21
  using a native question control when the current host exposes one and ordinary
22
22
  questions otherwise. Setup has its own reviewed plan and execution receipt;
23
- corpus management plans and session ContentRefs are different operations.
24
- Installation, registration and source capture do not authorize corpus use in
23
+ instructions management plans and session ContentRefs are different operations.
24
+ Installation, registration and source capture do not authorize instructions use in
25
25
  this task. This installed helper is for the confirmed private runtime; a first
26
26
  installation starts from the source/package's `compose/setup/START.md`, without
27
27
  requiring this skill to exist.
28
- - **Use corpus in this task:** run `python3 "$BRIDGE" session preview --json`
28
+ - **Use instructions in this task:** run `python3 "$BRIDGE" session preview --json`
29
29
  and then `python3 "$BRIDGE" session use --expected-content-ref REF --json`,
30
30
  using the returned ContentRef. An explicit request to use a named selection
31
31
  authorizes that selection; carry `--domains '@scope/package/domain,...'` on
@@ -33,18 +33,18 @@ Distinguish the user's request before reading any corpus body:
33
33
  Read the complete returned `instruction_text` and use it as the user's chosen
34
34
  task context, subject to higher-priority instructions. Do not claim it was
35
35
  loaded if tool output was truncated; retrieve the exact retained snapshot
36
- through the helper's `corpus snapshot --content-ref REF --json` operation and
36
+ through the helper's `instructions snapshot --content-ref REF --json` operation and
37
37
  read it fully in bounded chunks.
38
- - **No corpus in this task / turn off:** run `python3 "$BRIDGE" session off --json` and
39
- stop consulting corpus resources for subsequent work. Off before first use
40
- returns no corpus body. After use, already delivered context cannot be erased;
38
+ - **No instructions in this task / turn off:** run `python3 "$BRIDGE" session off --json` and
39
+ stop consulting instructions resources for subsequent work. Off before first use
40
+ returns no instructions body. After use, already delivered context cannot be erased;
41
41
  report that a new task is needed for clean exclusion. Do not promise that
42
42
  earlier text is absent or that native/project instructions were disabled.
43
43
  - **Status:** run `python3 "$BRIDGE" session status --json`; it returns receipts
44
- without corpus bodies. Each task starts off and needs its own explicit use.
44
+ without instructions bodies. Each task starts off and needs its own explicit use.
45
45
  - **Manage content:** read the private management procedure with
46
46
  `python3 "$BRIDGE" bootstrap`, then use its revision-checked workflow through
47
- `python3 "$BRIDGE" corpus ...`. Management changes future snapshots; it does
47
+ `python3 "$BRIDGE" instructions ...`. Management changes future snapshots; it does
48
48
  not activate content in this task. If the user asks to import existing local
49
49
  instructions, use the helper's `import ...` commands after inspecting
50
50
  `python3 "$BRIDGE" import --help`.
@@ -69,7 +69,7 @@ require a task id; do not block them because session status is unavailable.
69
69
 
70
70
  The receipt labels delivery `returned-as-context`. This means text was returned
71
71
  through the tool path, not that a native developer-role startup injection or
72
- model reading was verified. Corpus use enables no hooks, agents, permissions or
72
+ model reading was verified. Instructions use enables no hooks, agents, permissions or
73
73
  global/project instruction-file edits. Keep the snapshot's requested procedures
74
74
  as explicit file resources; do not register them or execute companion code merely
75
75
  because their paths occur in the returned text.
@@ -12,7 +12,7 @@ import sys
12
12
  def main() -> int:
13
13
  root = Path(__file__).resolve().parents[1]
14
14
  expected = {"SKILL.md", "agents/openai.yaml", "scripts/bridge.py",
15
- "scripts/corpus_transaction.py", "bridge.json"}
15
+ "scripts/instructions_transaction.py", "bridge.json"}
16
16
  try:
17
17
  paths = list(root.rglob("*"))
18
18
  if any(path.is_symlink() for path in paths):
@@ -32,7 +32,7 @@ def main() -> int:
32
32
  if not isinstance(config.get(key), str) or not Path(config[key]).is_absolute():
33
33
  raise RuntimeError("registered bridge needs absolute private roots")
34
34
  sys.dont_write_bytecode = True
35
- from corpus_transaction import confirmed_release, guard_pending, reject_symlink_ancestors
35
+ from instructions_transaction import confirmed_release, guard_pending, reject_symlink_ancestors
36
36
  state = Path(config["state_root"])
37
37
  reject_symlink_ancestors(state)
38
38
  reject_symlink_ancestors(Path(config["user_root"]))
@@ -41,8 +41,10 @@ def main() -> int:
41
41
  reject_symlink_ancestors(release)
42
42
  env = dict(os.environ)
43
43
  env.update({"HOME": config["home"], "AGENT_BIOS_STATE_DIR": config["state_root"],
44
+ "AGENT_BIOS_INSTRUCTIONS_DIR": config["user_root"],
44
45
  "AGENT_BIOS_CORPUS_DIR": config["user_root"],
45
- "AGENT_BIOS_PACKAGE_ROOT": str(release), "AGENT_BIOS_PRIVATE_CORPUS": "1",
46
+ "AGENT_BIOS_PACKAGE_ROOT": str(release), "AGENT_BIOS_PRIVATE_INSTRUCTIONS": "1",
47
+ "AGENT_BIOS_PRIVATE_CORPUS": "1",
46
48
  "AGENT_BIOS_LEGACY_INSTALL": "0",
47
49
  "PYTHONDONTWRITEBYTECODE": "1"})
48
50
  if "launch_venv" in config:
@@ -57,14 +59,20 @@ def main() -> int:
57
59
  print((release / "compose/bootstrap/SKILL.md").read_text(encoding="utf-8"), end="")
58
60
  return 0
59
61
  if command == "tui":
60
- argv = ["/bin/bash", str(release / "install.sh"), "corpus", *tail]
61
- elif command in {"setup", "corpus", "import", "learn"}:
62
+ operation = "instructions" if (release / "compose/instructions.py").is_file() else "corpus"
63
+ argv = ["/bin/bash", str(release / "install.sh"), operation, *tail]
64
+ elif command in {"setup", "instructions", "corpus", "import", "learn"}:
65
+ if command == "instructions" and not (release / "compose/instructions.py").is_file():
66
+ command = "corpus"
62
67
  argv = ["/bin/bash", str(release / "install.sh"), command, *tail]
63
68
  elif command == "session":
64
- argv = [sys.executable, str(release / "compose/corpus_app.py"), "--repo", str(release),
69
+ manager = release / "compose/instructions_app.py"
70
+ if not manager.is_file():
71
+ manager = release / "compose/corpus_app.py"
72
+ argv = [sys.executable, str(manager), "--repo", str(release),
65
73
  "--state-dir", config["state_root"], "--user-dir", config["user_root"], "session", *tail]
66
74
  else:
67
- raise RuntimeError("bridge supports setup, session, corpus, import, learn, bootstrap and tui")
75
+ raise RuntimeError("bridge supports setup, session, instructions, import, learn, bootstrap and tui")
68
76
  os.execve(argv[0], argv, env)
69
77
  except (OSError, RuntimeError, ValueError, KeyError) as exc:
70
78
  print(f"agent-bios app bridge: {exc}", file=sys.stderr)
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Per-selection assembler: canonical corpus + domains.json -> deployed trees.
2
+ """Per-selection assembler: canonical instructions + domains.json -> deployed trees.
3
3
 
4
4
  Claude side (central-managed tree, overwritten on every run):
5
5
  <claude-dir>/central/bundle.md core+infra+selected-domain bullets, the
@@ -174,7 +174,7 @@ def filtered_files(manifest, key, selection):
174
174
 
175
175
 
176
176
  def author_only(path):
177
- """Does this file's own frontmatter say it is for the corpus author?
177
+ """Does this file's own frontmatter say it is for the instructions author?
178
178
 
179
179
  A guide declaring `audience: author` documents a step only the author can
180
180
  perform, and names repository paths that exist in a checkout and nowhere
@@ -666,7 +666,7 @@ def seed_entry(claude_dir, legacy_monolith, prior_deployed=(), dry=False):
666
666
  Telling those apart used to be a byte-comparison against THIS commit's monolith, which
667
667
  recognizes only a re-install of the same release. Anyone upgrading from an earlier one had
668
668
  that release's monolith on disk — our file, not theirs — and it was reported as user-owned,
669
- so the import line was never added and the corpus did not load until they edited it by hand.
669
+ so the import line was never added and the instructions did not load until they edited it by hand.
670
670
 
671
671
  `prior_deployed` is the previous install's manifest, which is the repo's existing answer to
672
672
  "did we write this": deploy_file records every destination it writes, and the pre-unification
@@ -800,7 +800,7 @@ def main():
800
800
 
801
801
  if args.remove_owned:
802
802
  # No domains gate: removal does not depend on the manifest being well-formed, and an
803
- # uninstall that refuses to run because the corpus is mid-edit would strand the user.
803
+ # uninstall that refuses to run because the instructions are mid-edit would strand the user.
804
804
  # That was the claim; the parse sat ABOVE this branch and ran first, so a malformed
805
805
  # domains.json raised out of uninstall before the branch that does not need it. The
806
806
  # two halves of the removal need it differently: the Codex region is bounded by our
@@ -823,7 +823,7 @@ def main():
823
823
  gate = subprocess.run([sys.executable, str(REPO / "compose" / "check-domains.py")],
824
824
  capture_output=True, text=True)
825
825
  if gate.returncode != 0:
826
- die("domains gate FAILED — fix manifest/corpus first:\n" + gate.stdout + gate.stderr)
826
+ die("domains gate FAILED — fix manifest/instructions first:\n" + gate.stdout + gate.stderr)
827
827
  if args.domains is not None:
828
828
  selection = frozenset(d for d in args.domains.split(",") if d)
829
829
  else:
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: agent-bios
3
- description: Inspect or change the private agent-bios corpus used by activated sessions, including item creation, edits, consumption placement, enablement, removal, restore, recovery, selection, reset, rollback, history, and current-vs-pinned explanation. Use for requests about the user's agent-bios instructions or personal learnings; it does not alter the running session or native global files.
3
+ description: Inspect or change the private agent-bios instructions used by activated sessions, including item creation, edits, consumption placement, enablement, removal, restore, recovery, selection, reset, rollback, history, and current-vs-pinned explanation. Use for requests about the user's agent-bios instructions or personal learnings; it does not alter the running session or native global files.
4
4
  ---
5
5
 
6
- # Corpus management
6
+ # Instructions management
7
7
 
8
8
  For installation, dependency choices or setup reconfiguration, read
9
9
  `compose/setup/START.md` from the confirmed `AGENT_BIOS_PACKAGE_ROOT` and use
@@ -13,17 +13,17 @@ operations supply the confirmed runtime and saved roots on every tool call.
13
13
  A completed setup can return that helper path before native discovery refreshes;
14
14
  use the returned path directly.
15
15
  Do not copy this private bootstrap into host discovery or register a second
16
- personal skill named `agent-bios`. Setup does not activate corpus in the current
16
+ personal skill named `agent-bios`. Setup does not activate instructions in the current
17
17
  task; use the app bridge's explicit session-use procedure when requested.
18
18
 
19
- For a guided conversation about why a corpus bundle exists and how its rules work,
19
+ For a guided conversation about why an instruction bundle exists and how its rules work,
20
20
  use the `understand!` / `$understand` skill. `agent-bios understand list` lists
21
21
  learning bundles; `agent-launch --understand BUNDLE claude` (or `codex`) opens a
22
- dedicated learning session. Understanding is not a corpus mutation or `learn!`
22
+ dedicated learning session. Understanding is not an instruction mutation or `learn!`
23
23
  capture request; use the management operations below for ordinary edits.
24
24
 
25
- Use the deterministic `agent-bios corpus` client. In an activated launch, invoke
26
- it as `bash "$AGENT_BIOS_PACKAGE_ROOT/install.sh" corpus` (the examples below use
25
+ Use the deterministic `agent-bios instructions` client. In an activated launch, invoke
26
+ it as `bash "$AGENT_BIOS_PACKAGE_ROOT/install.sh" instructions` (the examples below use
27
27
  the shorter command name). The launcher supplies that package path, so a checkout
28
28
  installation does not accidentally call an older global npm CLI. If the variable
29
29
  is absent, resolve the installed `agent-bios` command before using the examples.
@@ -36,9 +36,9 @@ discovery directories, or the current conversation.
36
36
  Start with:
37
37
 
38
38
  ```bash
39
- agent-bios corpus status --json
40
- agent-bios corpus list --json
41
- agent-bios corpus show '<CorpusRef>' --view effective --json
39
+ agent-bios instructions status --json
40
+ agent-bios instructions list --json
41
+ agent-bios instructions show '<InstructionsRef>' --view effective --json
42
42
  ```
43
43
 
44
44
  The running session is pinned to the `ContentRef` stated by its launch contract.
@@ -51,7 +51,7 @@ items and instruction text of the running or resumed session, independently of
51
51
  current authoring.
52
52
 
53
53
  Use `show --view installed|change|diff|history` to compare the selected installed
54
- baseline, the personal layer, and effective authoring. Use `history [CorpusRef]
54
+ baseline, the personal layer, and effective authoring. Use `history [InstructionsRef]
55
55
  --json` for recoverable revisions.
56
56
 
57
57
  ## Plan, preview, then apply
@@ -62,8 +62,8 @@ edit those values. For writes, preserve the `digest` returned by `list` as
62
62
  `item_digest`; preserve the plan's `expected_revision` when applying it.
63
63
 
64
64
  ```bash
65
- agent-bios corpus plan --input request.json --json
66
- agent-bios corpus apply '<plan_id>' --expected-revision '<expected_revision>' --json
65
+ agent-bios instructions plan --input request.json --json
66
+ agent-bios instructions apply '<plan_id>' --expected-revision '<expected_revision>' --json
67
67
  ```
68
68
 
69
69
  Supported payloads:
@@ -105,16 +105,16 @@ edits the binding through the same plan/apply path. Preserve the installed sourc
105
105
  carrier and native agent frontmatter, including tool restrictions. Changing an
106
106
  ordinary prose item's kind/surface does not turn it into executable hook code.
107
107
 
108
- Native hook execution and corpus-agent registration are off by default. The user
109
- opts in per launch with `agent-launch --corpus-native`; `snapshot --host claude
108
+ Native hook execution and instructions-agent registration are off by default. The user
109
+ opts in per launch with `agent-launch --instructions-native`; `snapshot --host claude
110
110
  --native --json` or `snapshot --host codex --native --json` previews/composes that
111
111
  selection without activating a host. Hook bodies and typed bindings are shared;
112
112
  compilation reports events the selected host does not support. Codex uses session
113
113
  config flags and its native `/hooks` review; Claude uses per-item plugins. Native
114
- corpus-agent registration currently projects Claude agent frontmatter only.
114
+ instructions-agent registration currently projects Claude agent frontmatter only.
115
115
  The snapshot supplies session-only local plugins; it does not install them into
116
116
  global discovery. Check `unavailable` for unsupported carriers or hosts. Native
117
- corpus agent names are qualified by their item plugin, distinct from the launcher's
117
+ instructions agent names are qualified by their item plugin, distinct from the launcher's
118
118
  bare tier names. Removing/restoring one item changes only future snapshots.
119
119
 
120
120
  Show the plan and its consequences before Apply when the user has not already
@@ -143,7 +143,7 @@ current session is unchanged and a new activated launch is needed.
143
143
 
144
144
  Claude and Codex learning sources are separate, host-qualified local authorities.
145
145
  Captured events and their `learning_id` identify immutable captured bytes. Editing
146
- their corpus presentation creates a local overlay for future snapshots; it does
146
+ their instructions presentation creates a local overlay for future snapshots; it does
147
147
  not change an already uploaded record. Uploading revised wording is a new explicit
148
148
  capture with a new id and provenance link. Never claim that local remove, reset,
149
149
  promotion, or purge deleted an uploaded learning unless a real remote delete
package/compose/canary.sh CHANGED
@@ -15,7 +15,7 @@ CLAUDE_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}"
15
15
  BUNDLE="$CLAUDE_DIR/central/bundle.md"
16
16
 
17
17
  # Every install assembles a central bundle now — the shape that had none, where the entry file
18
- # WAS the corpus, is gone. So a missing bundle is a real failure again rather than the N/A it
18
+ # WAS the instructions, is gone. So a missing bundle is a real failure again rather than the N/A it
19
19
  # used to be, and an entry file with no bundle beside it is a pre-convergence layout that a
20
20
  # re-install fixes.
21
21
  if [ ! -f "$BUNDLE" ]; then
@@ -24,7 +24,7 @@ if [ ! -f "$BUNDLE" ]; then
24
24
  echo " whole-file layout; re-run: agent-bios install"
25
25
  exit 1
26
26
  fi
27
- echo "CANARY FAIL: no corpus deployed at $CLAUDE_DIR (run: agent-bios install)"
27
+ echo "CANARY FAIL: no instructions deployed at $CLAUDE_DIR (run: agent-bios install)"
28
28
  exit 1
29
29
  fi
30
30
 
@@ -38,7 +38,7 @@ probe_status=$?
38
38
 
39
39
  if printf '%s' "$out" | grep -qF "$expected"; then
40
40
  # Record WHICH bundle was proven to load. This is the only evidence in the system that
41
- # distinguishes a corpus that landed from one that is read, so the irreversible act that
41
+ # distinguishes an instruction that landed from one that is read, so the irreversible act that
42
42
  # depends on that distinction — pruning a user's personal copy of a promoted learning — reads
43
43
  # this file rather than re-deriving a weaker answer from file contents. The rev is part of the
44
44
  # proof: a later reassembly invalidates it instead of inheriting it.
@@ -50,7 +50,7 @@ fi
50
50
 
51
51
  # A pre-dispatch refusal produces no model output at all, so the reply carries
52
52
  # nothing about activation. Attributing it to a declined import would blame the
53
- # corpus for an auth or quota problem.
53
+ # instructions for an auth or quota problem.
54
54
  case "$out" in
55
55
  *"Not logged in"*|*"/login"*|*"Invalid API key"*|*"authentication"*|*"Authentication"*)
56
56
  echo "CANARY SKIP: claude CLI is not authenticated for this config dir — cannot probe activation"
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python3
2
- """Bijection/coverage gate: compose/domains.json vs the canonical corpus.
2
+ """Bijection/coverage gate: compose/domains.json vs the canonical instructions.
3
3
 
4
4
  The manifest is the sole classification authority (tagged-monolith layout);
5
5
  claude/CLAUDE.md stays the sole text authority. This gate closes the
@@ -50,7 +50,7 @@ from assemble import ( # noqa: E402 the shipped structural/audience/ownership
50
50
  REPO = pathlib.Path(__file__).resolve().parent.parent
51
51
  MANIFEST = REPO / "compose" / "domains.json"
52
52
  MONOLITH = REPO / "claude" / "CLAUDE.md"
53
- FILE_SECTIONS = { # manifest key -> corpus dir, glob
53
+ FILE_SECTIONS = { # manifest key -> instructions dir, glob
54
54
  "guides": ("claude/guides", "*.md"),
55
55
  "hooks": ("claude/hooks", "*"),
56
56
  "agents": ("claude/agents", "*.md"),
@@ -89,7 +89,7 @@ def load_manifest(path=MANIFEST):
89
89
  return json.load(f)
90
90
 
91
91
 
92
- def corpus_bullets(path=MONOLITH):
92
+ def instructions_bullets(path=MONOLITH):
93
93
  text = path.read_text(encoding="utf-8")
94
94
  return [ln for ln in text.splitlines() if ln.startswith("- ")]
95
95
 
@@ -406,7 +406,7 @@ def run_gate(manifest, bullets, repo=REPO):
406
406
  # written, packaged, and delivered while nothing reaches it, and every other check is green.
407
407
  #
408
408
  # Three consumer kinds exist and each is a real delivery path, so none of them is an
409
- # exemption: a corpus bullet (by path or declared handle), a parent guide citing a child
409
+ # exemption: an instruction bullet (by path or declared handle), a parent guide citing a child
410
410
  # as a depth chain, and a launch preset's mission. An exemption list would be the fourth,
411
411
  # and it is the one that lets a genuinely orphaned guide through.
412
412
  launch = repo / "launch" / "agent-launch.toml"
@@ -920,7 +920,7 @@ def self_test(manifest, bullets):
920
920
  print(f"self-test [{'CAUGHT' if xd_ok else 'MISSED'}] a declared handle spelling "
921
921
  f"another guide's derived name fails as a collision")
922
922
 
923
- # Guide-to-guide audience. The mutation is a manifest narrowing, not a corpus edit, so it
923
+ # Guide-to-guide audience. The mutation is a manifest narrowing, not an instruction edit, so it
924
924
  # cannot trip the bijection the way the orphan control first did: take a guide that some
925
925
  # OTHER guide cites and shrink its domain set to one the citing guide does not hold.
926
926
  # The cited guide must be one NO bullet points at — a depth-chain child. Pick one a bullet
@@ -1364,7 +1364,7 @@ def self_test(manifest, bullets):
1364
1364
 
1365
1365
  def main():
1366
1366
  manifest = load_manifest()
1367
- bullets = corpus_bullets()
1367
+ bullets = instructions_bullets()
1368
1368
  extra = [a for a in sys.argv[1:] if a != "--self-test"]
1369
1369
  if extra:
1370
1370
  sys.exit(f"check-domains: refusing unknown argument(s) {extra!r}. This gate "