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.
- package/DEPENDENCIES.md +27 -27
- package/INSTALL.md +4 -4
- package/README.md +58 -28
- package/claude/CLAUDE.md +1 -1
- package/claude/guides/claude-prompting.md +1 -1
- package/claude/guides/cli-multi-model-workflow.md +3 -3
- package/claude/guides/documentation-hygiene.md +3 -0
- package/claude/guides/gpt-prompting.md +1 -1
- package/claude/guides/korean-writing.md +153 -0
- package/claude/guides/learning-flow.md +4 -4
- package/claude/guides/session-distill-workflow.md +8 -8
- package/claude/guides/slide-writing/RUNBOOK.md +5 -5
- package/claude/skills/repo-charter/SKILL.md +3 -3
- package/claude/skills/understand/SKILL.md +58 -28
- package/codex/AGENTS.md +1 -1
- package/codex/guides/claude-prompting.md +1 -1
- package/codex/guides/cli-multi-model-workflow.md +3 -3
- package/codex/guides/documentation-hygiene.md +3 -0
- package/codex/guides/gpt-prompting.md +1 -1
- package/codex/guides/korean-writing.md +153 -0
- package/codex/guides/learning-flow.md +4 -4
- package/codex/guides/session-distill-workflow.md +8 -8
- package/codex/guides/slide-writing/RUNBOOK.md +5 -5
- package/compose/app_bridge/SKILL.md +12 -12
- package/compose/app_bridge/scripts/bridge.py +15 -7
- package/compose/assemble.py +5 -5
- package/compose/bootstrap/SKILL.md +18 -18
- package/compose/canary.sh +4 -4
- package/compose/check-domains.py +6 -6
- package/compose/corpus-state.py +16 -1168
- package/compose/corpus.py +13 -402
- package/compose/corpus_app.py +14 -450
- package/compose/corpus_catalog.py +15 -926
- package/compose/corpus_import.py +14 -523
- package/compose/corpus_install.py +14 -1841
- package/compose/corpus_session.py +16 -848
- package/compose/corpus_setup.py +16 -670
- package/compose/corpus_setup_cli.py +15 -577
- package/compose/corpus_setup_i18n.py +20 -318
- package/compose/corpus_setup_ui.py +18 -631
- package/compose/corpus_store.py +16 -1621
- package/compose/corpus_transaction.py +15 -284
- package/compose/corpus_ui.py +17 -972
- package/compose/corpus_ui_runtime.py +16 -274
- package/compose/corpus_understand.py +13 -520
- package/compose/domains.json +2 -1
- package/compose/instructions-state.py +1175 -0
- package/compose/instructions.py +409 -0
- package/compose/instructions_app.py +464 -0
- package/compose/instructions_catalog.py +931 -0
- package/compose/instructions_import.py +529 -0
- package/compose/instructions_install.py +1866 -0
- package/compose/instructions_session.py +852 -0
- package/compose/instructions_setup.py +676 -0
- package/compose/instructions_setup_cli.py +586 -0
- package/compose/instructions_setup_i18n.py +324 -0
- package/compose/instructions_setup_ui.py +647 -0
- package/compose/instructions_store.py +1668 -0
- package/compose/instructions_transaction.py +306 -0
- package/compose/instructions_ui.py +975 -0
- package/compose/instructions_ui_runtime.py +278 -0
- package/compose/instructions_understand.py +678 -0
- package/compose/register-hooks.py +1 -1
- package/compose/setup/START.md +24 -13
- package/docs/advanced-launch.md +11 -11
- package/docs/instructions-compatibility.md +86 -0
- package/docs/{corpus.md → instructions.md} +35 -8
- package/docs/recovery.md +8 -8
- package/docs/releases/0.19.2.md +38 -0
- package/docs/session-model.md +23 -20
- package/docs/setup.md +42 -25
- package/docs/understand.md +57 -9
- package/install.sh +70 -69
- package/launch/agent-launch.py +306 -295
- package/launch/agent-launch.toml +2 -2
- package/launch/i18n/en.toml +55 -55
- package/launch/i18n/ja.toml +56 -56
- package/launch/i18n/ko.toml +56 -56
- package/launch/shell_integration.py +4 -4
- package/learn/collect-learning.py +10 -10
- package/learn/learning.schema.json +1 -1
- package/learn/migrate-learnings.py +51 -51
- package/package.json +27 -11
- package/provenance.json +1 -1
- /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
|
|
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
|
|
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
|
-
|
|
24
|
-
Installation, registration and source capture do not authorize
|
|
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
|
|
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 `
|
|
36
|
+
through the helper's `instructions snapshot --content-ref REF --json` operation and
|
|
37
37
|
read it fully in bounded chunks.
|
|
38
|
-
- **No
|
|
39
|
-
stop consulting
|
|
40
|
-
returns no
|
|
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
|
|
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"
|
|
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.
|
|
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/
|
|
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
|
|
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), "
|
|
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
|
-
|
|
61
|
-
|
|
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
|
-
|
|
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,
|
|
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)
|
package/compose/assemble.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Per-selection assembler: canonical
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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
|
|
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
|
|
26
|
-
it as `bash "$AGENT_BIOS_PACKAGE_ROOT/install.sh"
|
|
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
|
|
40
|
-
agent-bios
|
|
41
|
-
agent-bios
|
|
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 [
|
|
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
|
|
66
|
-
agent-bios
|
|
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
|
|
109
|
-
opts in per launch with `agent-launch --
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
#
|
|
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"
|
package/compose/check-domains.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
"""Bijection/coverage gate: compose/domains.json vs the canonical
|
|
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 ->
|
|
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
|
|
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:
|
|
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
|
|
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 =
|
|
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 "
|