agent-bios 0.14.0 → 0.16.0
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 +35 -12
- package/README.md +346 -31
- package/claude/CLAUDE.md +2 -2
- package/claude/agents/frontier.md +1 -1
- package/claude/agents/sweep.md +3 -3
- package/claude/agents/workhorse.md +2 -2
- package/claude/guides/claude-prompting.md +119 -34
- package/claude/guides/cli-multi-model-workflow.md +33 -15
- package/claude/guides/gpt-prompting.md +148 -28
- package/claude/guides/review-request.md +27 -0
- package/claude/guides/session-distill-workflow.md +54 -2
- package/claude/guides/slide-writing/RUNBOOK.md +137 -0
- package/claude/guides/slide-writing/scripts/pair.py +979 -0
- package/claude/guides/slide-writing/scripts/render.mjs +82 -0
- package/claude/guides/slide-writing.md +195 -0
- package/claude/guides/svg-visualization-guide.md +9 -0
- package/claude/guides/verification-discipline.md +5 -1
- package/claude/hooks/tooling-gotchas-hook.py +7 -5
- package/codex/AGENTS.md +2 -2
- package/codex/agents/frontier.toml +2 -1
- package/codex/agents/reviewer.toml +1 -1
- package/codex/agents/sweep.toml +3 -3
- package/codex/agents/workhorse.toml +1 -1
- package/codex/config-additions.toml +1 -1
- package/codex/guides/claude-prompting.md +119 -34
- package/codex/guides/cli-multi-model-workflow.md +33 -15
- package/codex/guides/gpt-prompting.md +148 -28
- package/codex/guides/review-request.md +27 -0
- package/codex/guides/session-distill-workflow.md +54 -2
- package/codex/guides/slide-writing/RUNBOOK.md +137 -0
- package/codex/guides/slide-writing/scripts/pair.py +979 -0
- package/codex/guides/slide-writing/scripts/render.mjs +82 -0
- package/codex/guides/slide-writing.md +195 -0
- package/codex/guides/svg-visualization-guide.md +9 -0
- package/codex/guides/verification-discipline.md +5 -1
- package/compose/assemble.py +290 -14
- package/compose/bootstrap/SKILL.md +119 -0
- package/compose/check-domains.py +102 -9
- package/compose/corpus-state.py +1174 -0
- package/compose/corpus.py +387 -0
- package/compose/corpus_catalog.py +882 -0
- package/compose/corpus_install.py +1617 -0
- package/compose/corpus_session.py +726 -0
- package/compose/corpus_store.py +1414 -0
- package/compose/corpus_transaction.py +236 -0
- package/compose/corpus_ui.py +644 -0
- package/compose/domains.json +101 -100
- package/compose/write-update-cache.py +53 -0
- package/install.sh +174 -24
- package/launch/agent-launch.py +1327 -184
- package/launch/agent-launch.toml +12 -16
- package/launch/i18n/en.toml +113 -7
- package/launch/i18n/ja.toml +113 -7
- package/launch/i18n/ko.toml +113 -7
- package/learn/collect-learning.py +46 -19
- package/learn/migrate-learnings.py +10 -1
- package/package.json +13 -3
- package/provenance.json +1 -1
- package/session-cost.py +22 -2
- package/wrappers/codex-helm.sh +3 -3
package/DEPENDENCIES.md
CHANGED
|
@@ -8,12 +8,12 @@ Korean: [`ko/DEPENDENCIES.md`](ko/DEPENDENCIES.md). Dates = verification time; u
|
|
|
8
8
|
|
|
9
9
|
| Tool | Required by | Required capability | Verified |
|
|
10
10
|
| --- | --- | --- | --- |
|
|
11
|
-
| `codex` (codex-cli) | `
|
|
11
|
+
| `codex` (codex-cli) | `compose/corpus_session.py`, `launch/agent-launch.py`, `wrappers/codex-run.sh`, `wrappers/codex-helm.sh`; guide "Codex direct-drive" + "Session relocation" bindings | per-call `-c`; cwd-aware `app-server --stdio` `config/read`; durable `thread/start`, `thread/inject_items`, and `thread/read`; `codex resume`; existing `codex exec` and agent-config projection. The corpus session tests exercise config preservation and durable thread identity without a model turn | 0.153.4 · 2026-09-07 |
|
|
12
12
|
| `bash` | `install.sh`, `*/*.sh` | POSIX + arrays; runs on macOS system bash | 3.2.57 · 2026-07 |
|
|
13
|
-
| `python3` | `session-cost.py`, `launch/agent-launch.py` | stdlib
|
|
14
|
-
| `textual` (managed venv) | `launch/agent-launch.py`
|
|
13
|
+
| `python3` | `compose/corpus.py`, `compose/corpus_install.py`, `compose/corpus_session.py`, `compose/corpus_store.py`, `session-cost.py`, `launch/agent-launch.py` | Python 3.11+ stdlib (`tomllib`) owns every machine/non-TTY path, private file transaction, catalog/store operation, session journal, and numbered fallback. Textual is imported only for the interactive clients | 3.14.5 · 2026-09-07 |
|
|
14
|
+
| `textual` (managed venv) | `launch/agent-launch.py` preflight and `compose/corpus_ui.py` Corpus Studio; provisioner is `launch/provision-venv.sh` | Textual runtime in `~/.local/share/agent-launch/venv` (override `AGENT_LAUNCH_VENV`); each interactive client re-execs into it only on its TTY path. The private installer does not currently run the provisioner, so a fresh machine without that runtime uses numbered UI. Corpus Studio uses `Tree`, `MarkdownViewer(open_links=False)`, `TextArea(language="markdown")`, and `Select`; its numbered editor uses `$VISUAL`/`$EDITOR` when set | 8.2.8 · py 3.14.5 · 2026-09-07 |
|
|
15
15
|
| `jsonschema` (system python) | `learn/check-learning.py` (learning record gate; chained from `gates/check-parity.sh`) | JSON Schema Draft 2020-12 validator executing `learn/learning.schema.json` as the SSOT | 4.26.0 · 2026-07-20 |
|
|
16
|
-
| `zsh` | `launch/agent-launch.zsh` | functions, TTY tests, argument-preserving dispatch | 5.9 · 2026-07-13 |
|
|
16
|
+
| `zsh` | `launch/agent-launch.zsh` | legacy compatibility/regression path only: shell functions, TTY tests, argument-preserving dispatch. The private default does not install shell interception | 5.9 · 2026-07-13 |
|
|
17
17
|
| `git` | scripts, workflow (`origin/<base>..HEAD`, worktrees) | modern git; worktree support | 2.50.1 · 2026-07 |
|
|
18
18
|
| coreutils (`mktemp`, `cp`) | `codex-run.sh` hermetic home; `codex-helm.sh` managed home | BSD or GNU | 2026-07 |
|
|
19
19
|
|
|
@@ -21,8 +21,23 @@ Korean: [`ko/DEPENDENCIES.md`](ko/DEPENDENCIES.md). Dates = verification time; u
|
|
|
21
21
|
|
|
22
22
|
| CLI | Role | Required capability | Version owner |
|
|
23
23
|
| --- | --- | --- | --- |
|
|
24
|
-
| Claude Code | primary host
|
|
25
|
-
| Codex CLI | mirror host;
|
|
24
|
+
| Claude Code | primary host and `agent-launch` backend; native global/project loading remains native | `--model`; effort `low/medium/high/xhigh/max`; `--agents`; per-call `--append-system-prompt`; `--session-id` and `--resume`; `--mcp-config`; `--plugin-dir`; permission modes `acceptEdits/auto/bypassPermissions/manual/dontAsk/plan`. Default-off `--corpus-native` validates and supplies per-item plugin roots for installed corpus carriers; automatic SessionStart execution is observed. Authenticated corpus-agent execution and post-fix authenticated resume remain unverified | Environment Binding; installed CLI 2.1.263 checked 2026-09-08 |
|
|
25
|
+
| Codex CLI | mirror host and worker/reviewer runtime; native global/project loading remains native | private corpus composition preserves cwd-aware effective developer instructions, injects the selected snapshot per call, and pins the host id after `thread/start` + `thread/inject_items` + `thread/read`; see codex row above | Environment Binding + this file |
|
|
26
|
+
|
|
27
|
+
Optional user-global instruction exclusion in `compose/corpus_session.py` requires
|
|
28
|
+
Claude Code 2.1.263 or newer. Its native `claudeMdExcludes` setting is supplied once
|
|
29
|
+
through `--settings`; native configuration arrays union/deduplicate, but repeated
|
|
30
|
+
CLI `--settings` options replace one another, so the adapter refuses that collision.
|
|
31
|
+
Actual include/exclude/resume startup preserved project instruction sources and
|
|
32
|
+
omitted the global root/imports/user rules on 2026-09-08. Codex 0.153.4 has no
|
|
33
|
+
equivalent supported native control; exclusion is refused without changing its
|
|
34
|
+
execution sandbox or configuration home.
|
|
35
|
+
|
|
36
|
+
Claude Haiku 4.5 calls omit `--effort` and the native agent `effort` field.
|
|
37
|
+
The SWEEP-main route requires `--restricted`, `--tools`, `--strict-mcp-config`
|
|
38
|
+
and `--mcp-config`; installed Claude Code 2.1.263 accepts these parser options.
|
|
39
|
+
Its projection uses Read/Glob/Grep and an empty MCP configuration, with no child
|
|
40
|
+
delegation. This is a parser/projection check, not a new model-generation receipt.
|
|
26
41
|
|
|
27
42
|
## LLM models & providers — owned by `Environment Binding`
|
|
28
43
|
|
|
@@ -31,17 +46,21 @@ Concrete role-slot→model bindings live only in each guide's `Environment Bindi
|
|
|
31
46
|
- Providers: **Anthropic** (Claude — Fable/Opus/Sonnet/Haiku), **OpenAI** (GPT / Codex).
|
|
32
47
|
- Auth: Anthropic via Claude Code login; OpenAI via ChatGPT subscription or API key (`$CODEX_HOME/auth.json`).
|
|
33
48
|
|
|
34
|
-
##
|
|
49
|
+
## Private corpus assets
|
|
35
50
|
|
|
36
|
-
- **
|
|
51
|
+
- **Claude native corpus plugins** — default-off per-session `--corpus-native` builds one namespaced plugin root per installed hook/agent CorpusRef, validates it with `claude plugin validate`, and passes roots by `--plugin-dir`. Agent frontmatter stays authored; corpus-agent names are plugin-qualified rather than launcher tier names. Arbitrary prose cannot become executable because carrier provenance and hook `event`/`matcher` are structural requirements.
|
|
52
|
+
- **Codex custom agents** (`codex/agents/*.toml`) — role-template sources stored in the immutable private release. The default installer does not register templates in the native host home.
|
|
53
|
+
- **Corpus management bootstrap** (`compose/bootstrap/SKILL.md`) — copied into every activated immutable snapshot and named by exact private path in startup text. This is private procedure access, not a claim of native skill registration.
|
|
37
54
|
|
|
38
55
|
## Referenced / optional — not required by the core repo
|
|
39
56
|
|
|
57
|
+
- **Slide-writing static HTML/PDF companion** — the primary slide-writing guide needs no renderer. Its explicit static HTML/PDF job path uses Python 3.11+ standard libraries for preparation, binding checks, and result acceptance. Rendering additionally requires an explicit Node executable, Playwright module file, `pdf-lib` resolvable beside that module, and a Chromium-family browser executable. These are job-side dependencies, not installed by corpus delivery. Verified on 2026-09-09: Node 24.19.0, Playwright 1.62.1, pdf-lib 1.17.1, Chromium-family browser 152.0.7977.83. The companion runbook owns invocation and supported-format limits.
|
|
58
|
+
|
|
40
59
|
- **Deep review** — no separate tool on either side. The Codex-seat deep reviewer (`codex-exec`) is the `codex` CLI's own non-interactive exec mode: `codex exec -s read-only -m gpt-5.6-sol -c model_reasoning_effort="ultra"`, self-contained packet on stdin (`-s read-only`, `-c model_reasoning_effort` and `-c service_tier` verified against installed codex-cli 0.146.0; `-c service_tier="fast"` is the explicit faster, shallower opt-in; `-s read-only` enforces the promised sandbox — ambient `~/.codex` config stays inherited, so the route is read-only but not hermetic). The Claude-seat deep reviewer (**ultracode**) is the `claude` backend itself run headless with the keyword `ultracode` in the prompt — that keyword is what opens the Workflow tool for the turn (`workflowKeywordTriggerEnabled`, default true, read in the installed 2.1.220 bundle). Personal or third-party reviewers register in the user-owned `review-methods.local.toml`, never in the shipped config.
|
|
41
60
|
- **Cross-family review reviewers** — with `review_family=cross` (default), each main routes review to the opposite family. A Claude main dispatches gpt review via `$CODEX_HOME/bin/codex-run --profile hermetic` (and `codex-helm --mode review` for review fan-out) plus the deep `codex exec` pass above; a Codex main dispatches Claude review via the `claude` CLI (`claude -p --permission-mode plan` for native, and, for the workflow-orchestration route, the same `claude` CLI headless with the keyword `ultracode` in the prompt — the keyword trigger is what the injected contract names, so this is the mechanism to follow). The reviewer command, resolved path, and opposite-family tier bindings are named in the launch contract; an absent or unauthenticated route degrades to same-family native (PROPOSED). `review_family=same` restores same-family review.
|
|
42
61
|
- **codex-plugin-cc** (1.0.6; re-evaluated 2026-07-16) — spawns `codex app-server` with inherited env and no `--ignore-user-config`/`--profile`, so every run reads the real `~/.codex` (config.toml, auth, its MCP servers); it has no per-invocation hermetic reach, which is what makes it unfit as a **review** route: the reviewer would inherit the same config and AGENTS.md as the main, undercutting the independent lens `review_family=cross` exists to provide. The model *is* selectable (`--model`/`--effort`); what is dated is the bundled `gpt-5-4-prompting` skill, so passing a current model does not resolve it. **Not adopted**; `wrappers/codex-run.sh` is preferred for controlled reach. It does not touch Claude Code's `/code-review` (no `code-review.md`; it adds namespaced `/codex:*`), so it never made that route cross-family. Capability we lack and may still want independently: its opt-in `Stop` hook review gate.
|
|
43
62
|
- **MCP servers** (clickhouse, node_repl, …) — environment-specific; referenced by Environment Binding, not a core dependency. The launcher registers a stdio MCP server only for a user-registered capability whose offer declares the `mcp-stdio-v1` adapter; no shipped review method is MCP-backed.
|
|
44
|
-
- **spreadsheet-processing** (skill) — referenced by the
|
|
63
|
+
- **spreadsheet-processing** (skill) — referenced by the always-surface spreadsheet rule in an activated selection; present in the author's Claude Code and Codex environments. If absent, the rule's inline fallback (plain tools/code + real Excel-engine validation) applies.
|
|
45
64
|
|
|
46
65
|
## Untracked — dependencies, but excluded by design
|
|
47
66
|
|
|
@@ -59,18 +78,20 @@ printf '%s\n' "$codex_help" | grep -Eq '(^|[[:space:]])-c([,[:space:]]|$)' || {
|
|
|
59
78
|
printf '%s\n' "$codex_help" | grep -Eq '(^|[[:space:]])-C([,[:space:]]|$)' || { echo "missing codex flag: -C"; exit 1; }
|
|
60
79
|
printf '%s\n' "$codex_help" | grep -Eq '(^|[[:space:]])-p([,[:space:]]|$)' || { echo "missing codex flag: -p"; exit 1; }
|
|
61
80
|
printf '%s\n' "$codex_help" | grep -Eq '(^|[[:space:]])-s([,[:space:]]|$)' || { echo "missing codex flag: -s"; exit 1; }
|
|
62
|
-
claude --version; claude --help | grep -E -- '--model|--effort|--agents|--append-system-prompt|--mcp-config'
|
|
81
|
+
claude --version; claude --help | grep -E -- '--model|--effort|--agents|--append-system-prompt|--session-id|--resume|--mcp-config'
|
|
63
82
|
bash --version | head -1; zsh --version; python3 --version; git --version
|
|
64
83
|
AGENT_LAUNCH_VENV="${AGENT_LAUNCH_VENV:-$HOME/.local/share/agent-launch/venv}" bash launch/provision-venv.sh
|
|
65
84
|
"${AGENT_LAUNCH_VENV:-$HOME/.local/share/agent-launch/venv}/bin/python" -c 'import textual, sys; print("textual", textual.__version__, "py", sys.version.split()[0])'
|
|
85
|
+
python3 -m py_compile compose/corpus.py compose/corpus_catalog.py compose/corpus_install.py compose/corpus_session.py compose/corpus_store.py
|
|
86
|
+
"${AGENT_LAUNCH_VENV:-$HOME/.local/share/agent-launch/venv}/bin/python" -m unittest discover -s compose -p 'test_corpus*.py'
|
|
66
87
|
bash -n wrappers/codex-run.sh wrappers/codex-helm.sh gates/check-parity.sh launch/check-prompting-targets.sh launch/provision-venv.sh install.sh
|
|
67
88
|
zsh -n launch/agent-launch.zsh
|
|
68
89
|
python3 -c 'compile(open("launch/agent-launch.py").read(), "launch/agent-launch.py", "exec")'
|
|
69
90
|
./gates/check-parity.sh
|
|
70
91
|
./launch/check-prompting-targets.sh
|
|
71
92
|
python3 - <<'PY'
|
|
72
|
-
import
|
|
73
|
-
roots = [pathlib.Path("codex/agents")
|
|
93
|
+
import pathlib, tomllib
|
|
94
|
+
roots = [pathlib.Path("codex/agents")]
|
|
74
95
|
required = {"frontier.toml", "workhorse.toml", "sweep.toml", "reviewer.toml"}
|
|
75
96
|
for root in roots:
|
|
76
97
|
missing = required - {path.name for path in root.glob("*.toml")}
|
|
@@ -80,6 +101,8 @@ for root in roots:
|
|
|
80
101
|
print(f"agent TOML ok: {root}")
|
|
81
102
|
PY
|
|
82
103
|
wrappers/codex-helm.sh --dry-run --mode review "probe"
|
|
104
|
+
agent-bios verify
|
|
105
|
+
agent-bios corpus status --json
|
|
83
106
|
```
|
|
84
107
|
|
|
85
108
|
## Ownership
|
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# agent-bios
|
|
2
2
|
|
|
3
|
-
Single source of truth for the
|
|
3
|
+
Single source of truth for the instructions and scoped guides that an explicit
|
|
4
|
+
agent-bios launch supplies to Claude Code or Codex. Edit once; the private corpus
|
|
5
|
+
compiler projects the selected content for each activated session.
|
|
4
6
|
|
|
5
7
|
A deployable instruction corpus for coding agents, plus the CLI that
|
|
6
8
|
installs, verifies, and evolves it. The npm package ships the corpus; `install.sh` is both the
|
|
@@ -10,39 +12,49 @@ Korean reference: [`ko/`](ko/) mirrors every doc below — reference only, never
|
|
|
10
12
|
|
|
11
13
|
## Model
|
|
12
14
|
|
|
13
|
-
Two layers:
|
|
15
|
+
Two authored layers:
|
|
14
16
|
|
|
15
|
-
- **
|
|
16
|
-
- **Scoped guides** — `claude/guides/`,
|
|
17
|
+
- **Always-in-an-activated-session instructions** — `claude/CLAUDE.md` is the English canonical and `codex/AGENTS.md` its generated host projection. They hold compact invariants, decision principles, and guide pointers. A clean private install does not copy either file into a host's global discovery path; `compose/corpus_catalog.py` inventories their registered items and compiles the selected rules into an immutable session snapshot.
|
|
18
|
+
- **Scoped guides** — `claude/guides/`, with generated Codex mirrors. The snapshot compiler copies selected guides to private generation-qualified paths and emits their router. Procedures, tables, numbers, and environment-specific content live here.
|
|
17
19
|
|
|
18
20
|
## Principles
|
|
19
21
|
|
|
22
|
+
The `slide-writing` guide is selected through `office-work` and
|
|
23
|
+
`visualization-docs`. Its primary guide supplies the semantic criteria for every
|
|
24
|
+
slide or presentation task. Its companion runbook and scripts are used only for
|
|
25
|
+
an explicitly applicable static HTML/PDF job: preparation derives a job-local
|
|
26
|
+
criteria copy and `ORACLE.json`, then freezes them with the job inputs and runtime
|
|
27
|
+
version. Jobs stay outside immutable corpus snapshots; preparation and result
|
|
28
|
+
acceptance need Python, while rendering uses the optional dependencies listed in
|
|
29
|
+
`DEPENDENCIES.md`. Native presentation formats remain the user's choice; the
|
|
30
|
+
supplied renderer's mechanical checks apply only to its static HTML/PDF path.
|
|
31
|
+
|
|
20
32
|
- **Rule bodies never name concrete models or tools** — only role slots and tiers. Bindings live in each guide's `Environment Binding` (dated; expire ~8 weeks or on a newer model). New model → update that row + date; leave rules alone. Declared exceptions: sections whose subject is a concrete tool surface (the cli guide's Codex direct-drive section) and optional-capability names inventoried in `DEPENDENCIES.md` (e.g. the `spreadsheet-processing` skill) — the Adopting checklist below covers swapping both.
|
|
21
33
|
- **The Codex tree is generated, not mirrored by hand** — `gates/emit-mirrors.py` projects `claude/` → `codex/` and `ko/claude/` → `ko/codex/`, differing only in title and config-home variable (`$CLAUDE_CONFIG_DIR` ↔ `$CODEX_HOME`), plus one declared Codex-only standing-dispatch authorization required by Codex's trigger contract, inserted at a pinned position. It owns the projection rule; `gates/check-parity.sh` runs its `--check` and adds pointer resolvability, frontmatter, shared anchor phrases on the global↔guide restatement pairs that remain, and Codex role-binding / wrapper-default projections. Parity enforces content synchronization only; it does not guarantee both harnesses respond to the same wording with the same strength.
|
|
22
|
-
- **The
|
|
23
|
-
- **
|
|
24
|
-
- **
|
|
25
|
-
- **
|
|
26
|
-
- **
|
|
34
|
+
- **The always surface is a per-activated-session token budget** — every selected rule is supplied to that session and can be inherited by its children, so each added bullet dilutes the rest. A new always rule must name the bullet it displaces (or why none does); procedures, tables, numbers, and worked examples belong in guides.
|
|
35
|
+
- **Installation is storage, not activation** — `install` and `onboard` copy a validated immutable release into agent-bios-owned state and record a baseline plus selection. `verify` proves those stored bytes, the catalog, the baseline, and the owned launcher projection; it deliberately reports activation as unverified. Only a configured `agent-launch` resolves a snapshot and calls a host adapter.
|
|
36
|
+
- **The default installer leaves native host state alone** — it does not seed global `AGENTS.md`/`CLAUDE.md`, host skill/agent directories, hook settings, or shell interception. Existing installations keep their old global projection until `agent-bios migrate` previews and, with explicit apply confirmation, removes only proven legacy-owned material. `AGENT_BIOS_LEGACY_INSTALL=1` exists only for compatibility and migration regression coverage.
|
|
37
|
+
- **Source, snapshot, and session have separate lifetimes** — `CorpusStore` revision-checks private authoring, compiles content-addressed snapshots, and preserves prior snapshots. `corpus_session.py` records a host-observed session id before a pin counts as resumable; reset and later edits affect future snapshots, not an existing pin.
|
|
38
|
+
- **Learning evidence stays immutable** — capture events are host-qualified private JSONL records. A local edit is an overlay for later snapshots; promotion suppresses only an exact source revision when its replacement is proven in that snapshot. Local reset, removal, or migration makes no claim that an uploaded record was deleted.
|
|
27
39
|
- **`Evidence Base` (per guide) is the single owner of numbers.** Measure with `session-cost.py` (`agent-bios cost` on an installed package).
|
|
28
|
-
- **English is canonical and
|
|
40
|
+
- **English is canonical and shipped; Korean (`ko/`) is reference only.** The private catalog and snapshot compiler consume the fixed-name English sources.
|
|
29
41
|
|
|
30
42
|
## Layout
|
|
31
43
|
|
|
32
44
|
| Path | Role |
|
|
33
45
|
| --- | --- |
|
|
34
|
-
| `claude/CLAUDE.md`, `codex/AGENTS.md` |
|
|
35
|
-
| `claude/guides/*.md`, `codex/guides/*.md` | scoped
|
|
36
|
-
| `codex/agents/*.toml` | Codex
|
|
46
|
+
| `claude/CLAUDE.md`, `codex/AGENTS.md` | canonical and generated always-surface sources (en); shipped privately and selected into activated snapshots, never installed into native global files by default |
|
|
47
|
+
| `claude/guides/*.md`, `codex/guides/*.md` | scoped-guide sources copied to immutable private snapshots when selected |
|
|
48
|
+
| `codex/agents/*.toml` | Codex role-template sources retained in the private release; agent-item activation remains separately evidenced |
|
|
37
49
|
| `ko/**` | Korean mirror of every doc above + this README + DEPENDENCIES (reference only) |
|
|
38
|
-
| `launch/` | launch profile
|
|
39
|
-
| `compose/` | corpus
|
|
50
|
+
| `launch/` | launch profile and preflight TUI; `agent-launch.py` resolves a private snapshot for configured sessions, keeps Software Engineer / Vanilla bare, and routes resume through the recorded pin. The old shell interception remains only on the legacy compatibility path |
|
|
51
|
+
| `compose/` | corpus authority and clients: `corpus_catalog.py` inventory/compiler, `corpus_store.py` baseline/overlay/plan/snapshot store, `corpus.py` + `corpus_ui.py` machine/numbered/rich clients, `corpus_install.py` private install and migration, `corpus_session.py` host delivery and pins, and the immutable private management bootstrap |
|
|
40
52
|
| `learn/` | the collection loop — capture, record schema and its validator, curation intake, promotion manifest, redistribution, and the secret-redaction floor |
|
|
41
53
|
| `session-distill/` | the heavy curator pipeline that mines many sessions into corpus-grade items |
|
|
42
|
-
| `wrappers/` | internal
|
|
54
|
+
| `wrappers/` | internal host/review adapters carried by the private release; the default install does not populate native host bin directories |
|
|
43
55
|
| `gates/` | author-side verification (mirror generation, parity, lexicon, payload, assembler scenarios) — reachable only from a repo checkout, and `check-package.sh` fails if any of it enters the npm payload |
|
|
44
56
|
| `ontology/` | what a change obliges elsewhere — entities, obligation edges, and the service's routes, held against real source by `check-ontology.py`. `instances/graph.json` is canonical; `LEXICON.md`, the RDF views, the HTML map, and the competency/extension docs are generated from it |
|
|
45
|
-
| `install.sh`, `session-cost.py` | the
|
|
57
|
+
| `install.sh`, `session-cost.py` | the `agent-bios` command dispatcher/private installer entry and the cost meter |
|
|
46
58
|
| `decisions/` | the decision record for developing this repo — what was decided and which alternative it closed; author-side, never shipped |
|
|
47
59
|
| `packages/` | authored corpus packages, organized by package identity rather than by concept home |
|
|
48
60
|
| `.githooks/` | the pre-commit hook that runs the gates against the index, enabled per clone with `core.hooksPath` |
|
|
@@ -79,35 +91,336 @@ tree.
|
|
|
79
91
|
3. `./gates/check-parity.sh` must pass.
|
|
80
92
|
4. Commit, then deploy: `agent-bios install` (or `agent-bios update` from a clone).
|
|
81
93
|
|
|
82
|
-
## Install
|
|
94
|
+
## Install and activate
|
|
83
95
|
|
|
84
|
-
The
|
|
96
|
+
The npm package and command are both named `agent-bios`. Installation is always
|
|
97
|
+
explicit—never a package-manager postinstall side effect—and the default path stores
|
|
98
|
+
an immutable release and baseline under agent-bios-owned state. It installs the
|
|
99
|
+
`agent-launch` entrypoint and its own profile/catalog files, but does not change native
|
|
100
|
+
Claude/Codex globals, discovery directories, settings, hooks, or shell command
|
|
101
|
+
resolution.
|
|
85
102
|
|
|
86
103
|
```bash
|
|
87
104
|
npm install -g agent-bios
|
|
88
|
-
agent-bios install #
|
|
89
|
-
agent-bios onboard
|
|
90
|
-
agent-bios verify #
|
|
91
|
-
agent-bios status # show
|
|
105
|
+
agent-bios install # store an immutable private release and baseline
|
|
106
|
+
agent-bios onboard --domains builder-base,multi-agent-orchestration
|
|
107
|
+
agent-bios verify # verify stored bytes/catalog/baseline; not host activation
|
|
108
|
+
agent-bios status # show the private release, baseline, conflicts, and evidence state
|
|
109
|
+
agent-bios corpus # rich Corpus Studio in a TTY; list in a non-TTY
|
|
110
|
+
agent-bios reset # preview reset; keep sources, snapshots, and pins
|
|
111
|
+
agent-bios reset --apply --yes --expected-revision REV # use the revision returned by preview
|
|
112
|
+
agent-bios migrate # preview legacy global cleanup; --apply --yes performs it
|
|
92
113
|
agent-bios update # git pull + reinstall (clone), or print the npm update line
|
|
93
|
-
agent-bios uninstall # remove
|
|
114
|
+
agent-bios uninstall # remove owned runtime entries; retain user corpus and pinned sessions
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
From a clone, `bash install.sh install` is the same default path. The release lives
|
|
118
|
+
under `~/.local/share/agent-bios/runtime/releases/`; baseline tuples and transaction
|
|
119
|
+
journals live under that runtime root, immutable snapshots and pins under
|
|
120
|
+
`~/.local/share/agent-bios/sessions/`, and user packages, overlays, tombstones,
|
|
121
|
+
learnings, history, and trash under `~/.config/agent-bios/corpus/`. The corresponding
|
|
122
|
+
`AGENT_BIOS_STATE_DIR` and `AGENT_BIOS_CORPUS_DIR` environment variables relocate
|
|
123
|
+
those private roots; `AGENT_LAUNCH_VENV` relocates the optional Textual runtime.
|
|
124
|
+
The owned `agent-launch` entrypoint exports `AGENT_BIOS_PRIVATE_CORPUS=1` and the
|
|
125
|
+
immutable `AGENT_BIOS_PACKAGE_ROOT`; the launcher also recognizes the private install
|
|
126
|
+
record when the explicit marker is absent. These select the private runtime and do not
|
|
127
|
+
claim that any host session has loaded a snapshot.
|
|
128
|
+
|
|
129
|
+
`install`, `onboard`, `reset`, `migrate`, and `uninstall` expose dry-run or preview
|
|
130
|
+
paths appropriate to their mutations. A pre-existing owned launcher/profile path whose
|
|
131
|
+
bytes no longer match the recorded copy is reported as an owned-path conflict rather than
|
|
132
|
+
overwritten. `migrate` is the separate recovery-backed operation for a legacy global
|
|
133
|
+
installation: preview is the default, applying requires `--apply --yes`, ambiguous
|
|
134
|
+
ownership refuses the apply, and later private operations do not fall through to a
|
|
135
|
+
global writer. Setting `AGENT_BIOS_LEGACY_INSTALL=1` selects the old deployer only for
|
|
136
|
+
compatibility and migration regression work; it is not the user default.
|
|
137
|
+
|
|
138
|
+
The legacy compatibility deployer preserves guide paths named only by a previous
|
|
139
|
+
manifest when the current source no longer establishes their ownership. It names
|
|
140
|
+
these remnants for manual inspection and leaves them out of the new ownership
|
|
141
|
+
manifest, so later uninstall does not claim them. Current source-owned members
|
|
142
|
+
retain normal backup and selection cleanup; private snapshot installation uses its
|
|
143
|
+
own authoritative inventory.
|
|
144
|
+
|
|
145
|
+
After updating a legacy global installation, run `agent-bios migrate` before the
|
|
146
|
+
first private `install`. Its preview identifies exact managed regions, legacy
|
|
147
|
+
manifest paths and learning sources. `agent-bios migrate --apply --yes` backs up
|
|
148
|
+
the originals, transfers and verifies learning records, retires the legacy paths,
|
|
149
|
+
then installs the private release. A central-only Codex file and the unmodified
|
|
150
|
+
empty Claude learning seed do not require a learning JSONL file; actual learning
|
|
151
|
+
content without its source still requires attention.
|
|
152
|
+
|
|
153
|
+
An interrupted migration is visible in `status` and blocks configuration readers
|
|
154
|
+
and unrelated writes. Re-run `agent-bios migrate --apply --yes` to resume its
|
|
155
|
+
pinned release and recorded path versions. A completed private installation is
|
|
156
|
+
not repeated, and later cleanup cannot delete its replacement launcher/profile.
|
|
157
|
+
Intervening edits are preserved and reported instead of overwritten. Older
|
|
158
|
+
incomplete journals without replay evidence require reconciliation from their
|
|
159
|
+
backups rather than a guessed replay. Existing private-session replay retains the
|
|
160
|
+
previous confirmed release until migration completes.
|
|
161
|
+
|
|
162
|
+
Before applying or resuming, stop the old global collectors that can still append a native
|
|
163
|
+
learning JSONL or rewrite its native prose/entry file. The migration checks the
|
|
164
|
+
recorded native state immediately before commit, but no filesystem check can make
|
|
165
|
+
a noncooperating writer atomic after that final observation. If it reports a
|
|
166
|
+
changed native target, preserve only the affected paths and restore only those
|
|
167
|
+
paths to the journal's recorded `after` state before resuming the old migration.
|
|
168
|
+
Do not replace a whole native directory or edit the journal.
|
|
169
|
+
|
|
170
|
+
For a validated late-input recovery, set `JOURNAL` to the one `NEEDS_RECOVERY`
|
|
171
|
+
migration journal and pass only the specific changed JSONL, prose, or entry paths
|
|
172
|
+
that its error named. This makes a new durable copy under that journal's existing
|
|
173
|
+
`backup_root`, verifies the copy, and then restores a changed target from its
|
|
174
|
+
recorded `after` bytes/existence/mode or an input-only path to its recorded
|
|
175
|
+
unchanged existence. It rejects a path absent from the journal, symlinks, and
|
|
176
|
+
non-regular files before writing any backup. New private journals retain exact
|
|
177
|
+
bytes for input-only native files, so the command can restore an originally
|
|
178
|
+
present input while preserving its current mode (or using `0600` if it is
|
|
179
|
+
absent). Historic digest-only journals still need an external byte-identical
|
|
180
|
+
backup; the command refuses to invent their missing bytes.
|
|
181
|
+
|
|
182
|
+
```sh
|
|
183
|
+
JOURNAL="${AGENT_BIOS_STATE_DIR:-$HOME/.local/share/agent-bios}/runtime/migrations/<migration-id>/journal.json"
|
|
184
|
+
python3 - "$JOURNAL" \
|
|
185
|
+
"$HOME/.codex/personal/learnings.jsonl" <<'PY'
|
|
186
|
+
import base64, hashlib, json, os, sys, tempfile
|
|
187
|
+
from pathlib import Path
|
|
188
|
+
|
|
189
|
+
journal = Path(sys.argv[1])
|
|
190
|
+
data = json.loads(journal.read_text(encoding="utf-8"))
|
|
191
|
+
backup_root = Path(data.get("backup_root", ""))
|
|
192
|
+
if data.get("kind") != "migrate" or data.get("state") != "NEEDS_RECOVERY" or backup_root != journal.parent / "backup":
|
|
193
|
+
raise SystemExit("expected one validated NEEDS_RECOVERY migration journal")
|
|
194
|
+
targets = {Path(entry["path"]): entry for entry in data["paths"]}
|
|
195
|
+
inputs = {Path(path): version for path, version in data["inputs"].items()}
|
|
196
|
+
selected = [Path(value).expanduser() for value in sys.argv[2:]]
|
|
197
|
+
unknown = [str(path) for path in selected if path not in targets and path not in inputs]
|
|
198
|
+
if not selected or unknown:
|
|
199
|
+
raise SystemExit("name one or more exact journal paths; unknown: " + ", ".join(unknown))
|
|
200
|
+
|
|
201
|
+
planned = []
|
|
202
|
+
for path in selected:
|
|
203
|
+
entry = targets.get(path)
|
|
204
|
+
version = entry["after"] if entry is not None else inputs[path]
|
|
205
|
+
if path.is_symlink() or (path.exists() and not path.is_file()):
|
|
206
|
+
raise SystemExit(f"refusing unsafe native path: {path}")
|
|
207
|
+
root = next((parent for parent in (path.parent, *path.parents)
|
|
208
|
+
if parent.name in {".claude", ".codex"}), None)
|
|
209
|
+
if root is None or root.is_symlink():
|
|
210
|
+
raise SystemExit(f"recovery supports an exact Claude/Codex native path, not: {path}")
|
|
211
|
+
current = root
|
|
212
|
+
for part in path.relative_to(root).parts:
|
|
213
|
+
current /= part
|
|
214
|
+
if current.is_symlink():
|
|
215
|
+
raise SystemExit(f"refusing symlink ancestor: {current}")
|
|
216
|
+
planned.append((path, entry, version))
|
|
217
|
+
|
|
218
|
+
if backup_root.is_symlink() or (backup_root.exists() and not backup_root.is_dir()):
|
|
219
|
+
raise SystemExit(f"refusing unsafe recovery root: {backup_root}")
|
|
220
|
+
backup_root.mkdir(parents=True, exist_ok=True, mode=0o700)
|
|
221
|
+
recovery = Path(tempfile.mkdtemp(prefix="recovery-before-resume-", dir=backup_root)) / "files"
|
|
222
|
+
for path, entry, version in planned:
|
|
223
|
+
if path.exists():
|
|
224
|
+
saved = recovery / str(path).lstrip("/")
|
|
225
|
+
saved.parent.mkdir(parents=True, exist_ok=True)
|
|
226
|
+
before = path.read_bytes()
|
|
227
|
+
saved.write_bytes(before)
|
|
228
|
+
saved.chmod(path.stat().st_mode & 0o777)
|
|
229
|
+
if saved.read_bytes() != before:
|
|
230
|
+
raise SystemExit(f"backup did not verify: {saved}")
|
|
231
|
+
if not version["exists"]:
|
|
232
|
+
path.unlink(missing_ok=True)
|
|
233
|
+
continue
|
|
234
|
+
encoded = version.get("bytes_b64")
|
|
235
|
+
if not isinstance(encoded, str):
|
|
236
|
+
raise SystemExit(f"journal records only a digest for existing input; restore it from an exact external backup: {path}")
|
|
237
|
+
body = base64.b64decode(encoded.encode("ascii"), validate=True)
|
|
238
|
+
if hashlib.sha256(body).hexdigest() != version["sha256"]:
|
|
239
|
+
raise SystemExit(f"journal after bytes are invalid: {path}")
|
|
240
|
+
descriptor, temporary = tempfile.mkstemp(prefix=f".{path.name}.", dir=path.parent)
|
|
241
|
+
try:
|
|
242
|
+
with os.fdopen(descriptor, "wb") as output:
|
|
243
|
+
output.write(body)
|
|
244
|
+
output.flush()
|
|
245
|
+
os.fsync(output.fileno())
|
|
246
|
+
mode = entry["mode"] if entry is not None else (path.stat().st_mode & 0o777 if path.exists() else 0o600)
|
|
247
|
+
os.chmod(temporary, mode)
|
|
248
|
+
os.replace(temporary, path)
|
|
249
|
+
finally:
|
|
250
|
+
Path(temporary).unlink(missing_ok=True)
|
|
251
|
+
print(recovery)
|
|
252
|
+
PY
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Resume the old journal with `agent-bios migrate --apply --yes`. After it commits,
|
|
256
|
+
restore only the preserved late record (`B`) from the printed recovery directory
|
|
257
|
+
to its original native path, then run a fresh `agent-bios migrate` preview and
|
|
258
|
+
`agent-bios migrate --apply --yes`. The new migration imports `B` through the
|
|
259
|
+
normal learning-id deduplication path. Leave every other recovery copy in place
|
|
260
|
+
as evidence; it is not an instruction to restore all saved native files.
|
|
261
|
+
|
|
262
|
+
```sh
|
|
263
|
+
RECOVERY_BACKUP='<the directory printed above>'
|
|
264
|
+
B="$HOME/.codex/personal/learnings.jsonl" # the one path you deliberately preserved
|
|
265
|
+
cp "$RECOVERY_BACKUP/${B#/}" "$B"
|
|
266
|
+
agent-bios migrate
|
|
267
|
+
agent-bios migrate --apply --yes
|
|
94
268
|
```
|
|
95
269
|
|
|
96
|
-
|
|
270
|
+
Corpus Studio and the machine CLI are views over the same `CorpusStore`. The CLI
|
|
271
|
+
provides `list`, `search`, `show`, `history`, `status`, and `snapshot`; mutations are
|
|
272
|
+
semantic JSON passed to `plan`, followed by `apply PLAN --expected-revision REV`.
|
|
273
|
+
Implemented operations are create, update (including consumption surface), remove,
|
|
274
|
+
installed-item restore, personal-item recover, selection, reset, and rollback. Stable
|
|
275
|
+
`CorpusRef` identities survive those changes. The current `ContentRef` hashes the
|
|
276
|
+
baseline, resolved selection, authoring/item/learning/promotion digests, catalog and
|
|
277
|
+
store implementation digests, and management bootstrap. There is not yet a standalone undo command,
|
|
278
|
+
arbitrary package authoring/import, automatic semantic conflict resolution, or verified
|
|
279
|
+
native skill-menu registration; those design stages must not be inferred from the
|
|
280
|
+
library UI.
|
|
97
281
|
|
|
98
|
-
|
|
282
|
+
New personal identities are allocated once in the creation plan and remain stable
|
|
283
|
+
on retry; reset and history rollback do not make retired identities reusable.
|
|
284
|
+
Member files are the content authority: `primary_member` identifies the main file,
|
|
285
|
+
and `body` is its view or edit alias. The manager applies a body edit to that file
|
|
286
|
+
for all clients. Divergent older body/member values stay visible until an explicit
|
|
287
|
+
content choice reconciles them; old immutable snapshots are not rewritten.
|
|
99
288
|
|
|
100
|
-
|
|
289
|
+
Installation and rollback validate the target baseline and personal field/member
|
|
290
|
+
changes together. Conflicts preserve the current selection rather than dropping
|
|
291
|
+
items from a successful snapshot. Installation publishes a complete corpus/config
|
|
292
|
+
association under the same lock used by readers. Pending publication is disclosed
|
|
293
|
+
by status and prevents a new configured launch from reading mixed state; bare and
|
|
294
|
+
pinned replay can use the last confirmed immutable release.
|
|
295
|
+
|
|
296
|
+
Full reset returns an `expected_revision` in its preview. Pass that value with
|
|
297
|
+
`--apply --yes`; a changed preview is refused. Retry the accepted revision to finish
|
|
298
|
+
an interrupted reset, or review and accept a fresh revision to replace a stale
|
|
299
|
+
reset intent. Later user changes and replacement credentials are not overwritten
|
|
300
|
+
by the old intent. Nonsecret settings are archived; token bytes never are.
|
|
301
|
+
|
|
302
|
+
Native corpus consumption is default-off. `agent-bios corpus snapshot --host claude
|
|
303
|
+
--native --json` composes a preview; `agent-launch --corpus-native` opts one configured
|
|
304
|
+
Claude session into selected corpus hook and agent plugins. The compiler emits one
|
|
305
|
+
namespaced plugin root per stable CorpusRef and passes each root by `--plugin-dir` only
|
|
306
|
+
for that session. A native hook or agent must retain an installed Claude carrier and a
|
|
307
|
+
typed hook `event`/`matcher` binding; changing arbitrary prose into an `event` or
|
|
308
|
+
`delegated` surface cannot create executable behavior. Corpus agents retain their
|
|
309
|
+
authored frontmatter verbatim and are qualified by plugin namespace, distinct from the
|
|
310
|
+
launcher's bare tier agents.
|
|
311
|
+
|
|
312
|
+
Tier defaults come from the launch profile and the guides' Environment Binding
|
|
313
|
+
tables. Claude Haiku 4.5 has no effort parameter: its tier entry, native agent
|
|
314
|
+
definition and projected call omit it. SWEEP is one-rule-per-item read-only work.
|
|
315
|
+
As a main seat it disables child delegation and requires review off (for example,
|
|
316
|
+
Solo); a requested review needs a HELM or WORKHORSE main instead. Codex SWEEP mains
|
|
317
|
+
use a read-only sandbox; Claude SWEEP mains use restricted Read/Glob/Grep tools
|
|
318
|
+
and an empty, strict MCP configuration. Other main roles retain their selected
|
|
319
|
+
policies, and explicit personal model/effort overrides remain available.
|
|
320
|
+
|
|
321
|
+
The private install does not replace the `codex` or `claude` shell commands. Run
|
|
322
|
+
`agent-launch` explicitly to open the preflight, or pass `--preset NAME HOST` for a
|
|
323
|
+
configured non-interactive launch. Software Engineer / Vanilla structurally projects
|
|
324
|
+
no agent-bios snapshot, launch contract, tier binding, or permission flag. After a
|
|
325
|
+
fresh private install—or after an explicit legacy migration—the native CLI therefore
|
|
326
|
+
receives no automatic agent-bios content; the user's own native global and project
|
|
327
|
+
instructions still follow the host's normal loading rules. `--resume-session ID`
|
|
328
|
+
loads the recorded host/session pin rather than resolving current defaults.
|
|
329
|
+
|
|
330
|
+
Activated sessions include the user's global instruction documents by default.
|
|
331
|
+
**Custom → My global instruction files** can exclude them, or use
|
|
332
|
+
`agent-launch --preset balanced --exclude-global-instructions claude`. The CLI flag
|
|
333
|
+
sets Custom's initial choice; the final visible choice is what gets saved and run.
|
|
334
|
+
The choice is retained by managed resume, which cannot change it through a new flag.
|
|
335
|
+
|
|
336
|
+
Exclusion currently supports Claude Code 2.1.263 and newer: a per-call
|
|
337
|
+
`claudeMdExcludes` setting omits the global `CLAUDE.md`, its imports, and user
|
|
338
|
+
`rules/`. Project instructions and project memory remain, as do native settings,
|
|
339
|
+
authentication, tool registrations, and permissions. No global file is rewritten.
|
|
340
|
+
An existing CLI `--settings` argument, ambiguous relative/empty configuration home,
|
|
341
|
+
symlinks, glob characters in the configuration path, or a project/global file alias
|
|
342
|
+
is refused rather than replaced or silently included. Current Codex exclusion is
|
|
343
|
+
unavailable; its native loader has no selective global-document switch. Vanilla
|
|
344
|
+
and ordinary CLI launches retain their native loading behavior.
|
|
345
|
+
This controls automatic instruction loading, not file access or memory erasure:
|
|
346
|
+
tools can still open files, and project memory or prior conversation content can
|
|
347
|
+
contain instructions independently of the excluded documents.
|
|
348
|
+
|
|
349
|
+
The preflight keeps the current setup above each choice, supports the configured model
|
|
350
|
+
catalog and **Other**, and offers Builder presets, Software Engineer / Vanilla,
|
|
351
|
+
Session distill, Custom, Language, and **Corpus Studio**. Studio is the same backend as
|
|
352
|
+
`agent-bios corpus`: it searches and renders the library, edits Markdown and
|
|
353
|
+
consumption surface, and requires Preview then revision-bound Apply. In environments
|
|
354
|
+
without Textual, the corpus client and launcher retain numbered fallbacks; the corpus
|
|
355
|
+
editor uses `$VISUAL`/`$EDITOR` when available. Interface catalogs change only human
|
|
356
|
+
UI text; model-consumed corpus remains English.
|
|
357
|
+
|
|
358
|
+
Every arrow-key TUI selection screen keeps the complete current setup in a fixed top
|
|
359
|
+
panel, followed by the highlighted option's description and the option list. Custom
|
|
360
|
+
opens a persistent settings hub for the main tier, review setup, host policy, global instruction files, and tier
|
|
361
|
+
bindings. Every edit returns to that hub; **Start with these settings** is the final
|
|
362
|
+
launch confirmation, while **Exit without launching** cancels it. In the numbered
|
|
363
|
+
launcher fallback, `b` is the back command. These controls configure an explicit
|
|
364
|
+
agent-bios launch; they do not restore global installation or shell interception.
|
|
365
|
+
|
|
366
|
+
Review runs cross-family by default (`review_family`, default `cross`; `same` restores today's same-family projection): because the main's tiers are one model family, every dispatchable review route — native and the deep route — runs on the opposite family. The exception is `slash-review`, the host's own built-in review command (`/code-review` on Claude, with `ultra` for its deep multi-agent pass; `/review` on Codex): it needs no dependency and always resolves, but being the main's own command it cannot be dispatched cross-family, so under `cross` it runs as the same-family floor and its verdicts are labeled PROPOSED. A Claude main dispatches gpt/codex review (native via the `codex-run` reviewer wrapper resolved under `$CODEX_HOME/bin`, deep via plain `codex exec -m <frontier model> -c model_reasoning_effort="ultra"` with a self-contained packet on stdin — `-c service_tier="fast"` is the explicit faster, shallower opt-in); a Codex main dispatches Anthropic/Claude review (native via `claude -p --permission-mode plan`, deep via the `claude` CLI headless with the keyword `ultracode` in the prompt, which is what opens Claude Code's dynamic workflow for that turn). The concrete reviewer command, resolved absolute path, and opposite-family tier bindings are named in the injected session-start contract; cross-family reviewers are dispatched as read-only subprocesses, not CLI-native subagents, since neither CLI hosts the other family as a native subagent. When a cross-family route is unavailable at launch or unauthenticated at use time it degrades to same-family native subagent review labeled PROPOSED (family collapse) rather than blocking; a requested non-none review with no cross-family route and no same-family fallback (delegation off) stays fail-closed. A reviewer this launcher has never seen is yours to add: **Register another reviewer…** in the review editor asks for the descriptor a method needs, proves the candidate by running it through the real config reader before a byte is written, and appends it to `review-methods.local.toml` beside your config — a file the installer never deploys, verifies, or overwrites, whose entries face exactly the validation a shipped one does and whose name may not shadow a shipped method. A refusal shows the reader's own message and leaves that file byte-identical. Review setup means configured/requested; this launcher does not claim that review completed, and unavailable runtimes such as Ultrawork are not offered until integrated.
|
|
367
|
+
|
|
368
|
+
On the legacy compatibility path only, shell interception preserves argument-bearing
|
|
369
|
+
and non-TTY calls as direct backend invocations. The private default installs no shell
|
|
370
|
+
functions; a direct `agent-launch` call is the only entry that projects a launch
|
|
371
|
+
profile or corpus snapshot.
|
|
101
372
|
|
|
102
373
|
Direct `agent-launch` calls still require a valid profile to resolve the backend command and its default arguments. `--preset`, `--custom`, or `--dry-run` select the configured-launch path even when non-TTY or combined with `--no-tui`; a non-TTY bare `--dry-run` deterministically uses Balanced, and a custom profile without that preset must pass `--preset NAME`. Forwarded backend arguments are appended verbatim after the projected defaults; one that would override a projected option (the seat, the contract, delegation, policy) is refused at launch so the contract keeps describing the run, and the summary discloses forwarded arguments when present. For scripted configured launches, call `$HOME/.local/bin/agent-launch --preset NAME --yes HOST -- ...` or add `$HOME/.local/bin` to `PATH`. The summary goes to stderr so backend stdout stays machine-consumable.
|
|
103
374
|
|
|
104
|
-
|
|
375
|
+
When the internal Codex wrappers are available to a configured route, `codex-helm` follows the local CLI default and launches the HELM main with `--dangerously-bypass-approvals-and-sandbox`; an explicit `--sandbox MODE` disables bypass for that run regardless of flag order. `AGENTS.md` gives root/main local Codex sessions standing ordinary-subagent authorization when the delegation gates fire. A non-Ultra HELM main sets native multi-agent off by default and instructs HELM to send tiered dispatch through the internal `codex-run` adapter, where the selected model, effort, and sandbox are pinned; native multi-agent defaults on only when the HELM main itself is explicitly Ultra. FRONTIER is instructed to run as a separate `gpt-6-astra` root that is always read-only, at max by default, Ultra for genuinely divisible complex work, or a lower supported effort when cost or latency dominates. Because the HELM main has bypass authority and arbitrary expert `-c` by design, this dispatch route is an instruction-backed, live-E2E-verified default rather than a security boundary. Keep `codex-run` as the low-level internal adapter, not as a user-facing policy boundary. Both wrappers accept `-c key=value` as an expert override, and that override may intentionally change wrapper defaults for a single run. The private installer keeps wrapper files in its immutable release rather than populating `$CODEX_HOME/bin`; a route that still names a native-home wrapper is unavailable until its adapter path is resolved.
|
|
105
376
|
|
|
106
|
-
`claude-run` is the Claude-side adapter
|
|
377
|
+
`claude-run` is the Claude-side review adapter carried by the release, and it takes `--model` and `--effort` to pin the seat. Omitting either warns and dispatches anyway, matching `codex-run`: refusing outright turned "the review ran unpinned" into "the review did not run", which is the worse of the two. The honest signal is downstream instead — an unpinned dispatch can name no seat, so it emits no receipt and the method adjudicates to UNKNOWN rather than to a clean pass. Its default denies the mutating tools, which is not the OS-level sandbox its Codex twin gets — do not read the two defaults as equivalent guarantees.
|
|
107
378
|
|
|
108
379
|
**Review receipts.** A launch reports what it *projected*, because at launch no review has run — so a clean verdict without a receipt is PROPOSED, never ACHIEVED. Given `REVIEW_RECEIPT_DIR`, both adapters record what they observed of the dispatch they just performed: exit status, a hash of the packet fed in, a hash of the bytes returned, and the seat actually sent. Unset, they behave exactly as they would otherwise and write nothing. `agent-launch --fold-receipts DIR PACKET MAIN_DISPATCH_ID` folds a run into a `ReviewReceipts/v1` bundle — several passes of one method become the one record it is judged on — and `agent-launch --verify-receipts PLAN BUNDLE` adjudicates it, exiting non-zero unless every selected method verified. Adapting another tool needs no change here: call `agent-launch --emit-receipt` from your adapter and prove it conforms with `agent-launch --check-adapter SEAT -- CMD`, which is adjudicated by the same code that credits a real review. A receipt is still written by whoever ran the review, so this buys drift rather than honesty: what it stops is a reviewer that quietly never ran, returned nothing, or exited non-zero reading as a clean pass.
|
|
109
380
|
|
|
110
|
-
`agent-bios verify`
|
|
381
|
+
`agent-bios verify` checks the recorded immutable release file-by-file, reloads a
|
|
382
|
+
non-empty catalog from that release, matches the store's last successful baseline to
|
|
383
|
+
the install record, and verifies the owned launcher/profile/status projections. Its
|
|
384
|
+
result says `activation: unverified`: neither stored bytes nor a dry-run argv proves a
|
|
385
|
+
host loaded the snapshot.
|
|
386
|
+
|
|
387
|
+
Corpus selection seeds future activated sessions, not plain CLI/Vanilla. A one-off
|
|
388
|
+
`--corpus-domains` selection applies only to that launch. The store composes an
|
|
389
|
+
immutable `ContentRef`; Codex startup preserves the effective native developer
|
|
390
|
+
instructions, injects the private corpus and dynamic launch contract, creates and
|
|
391
|
+
reads back a durable host thread, then records its pin. Claude uses the per-call
|
|
392
|
+
append and requested session id and records a pin only after observing that id in the
|
|
393
|
+
native session log. Real-host probes cover Codex and Claude first-turn delivery,
|
|
394
|
+
including corpus propagation to a launcher-generated Claude workhorse. Claude
|
|
395
|
+
resume restores the pin's exact environment provenance rather than changing an unset
|
|
396
|
+
config-home variable into an explicit default. Post-fix authenticated resume remains
|
|
397
|
+
unverified. Snapshot pin integrity alone does
|
|
398
|
+
not establish that a resumed model request succeeded.
|
|
399
|
+
|
|
400
|
+
The native Claude plugin bootstrap has advertised four selected plugin roots and three
|
|
401
|
+
qualified corpus agents. An edited corpus `SessionStart` hook ran once automatically
|
|
402
|
+
through its generated plugin, without a manual `--settings` file. Authenticated resume
|
|
403
|
+
and native corpus-agent execution remain to be verified. This remains separate
|
|
404
|
+
from the earlier launcher-tier child evidence. Native skill-menu registration remains
|
|
405
|
+
unverified.
|
|
406
|
+
|
|
407
|
+
Pins preserve environment provenance rather than reconstructing it: the host's
|
|
408
|
+
config-home variable, and `HOME` when needed for default lookup, retain their
|
|
409
|
+
recorded unset, set, or explicitly empty state. A relative native home is resolved
|
|
410
|
+
from the recorded canonical cwd. Pins lacking that context fail explicitly at resume;
|
|
411
|
+
it is never inferred from the caller's environment.
|
|
412
|
+
|
|
413
|
+
Named native Codex profiles (`--profile` / `-p`) are not supported for private
|
|
414
|
+
activation by the verified 0.153.4 adapter: that host exposes profiles on runtime
|
|
415
|
+
commands but not its effective-config app-server surface. The launcher refuses
|
|
416
|
+
this combination before creating a session rather than substituting base settings.
|
|
417
|
+
Plain CLI/Vanilla profile use is unchanged.
|
|
418
|
+
|
|
419
|
+
Every activated snapshot retains the immutable private management bootstrap and puts
|
|
420
|
+
its exact path in the injected startup text, so `$corpus` has private procedure access
|
|
421
|
+
even without native skill discovery. Selected requested procedures are exposed the same
|
|
422
|
+
way. This is not a claim that either host registered them in its native skill menu;
|
|
423
|
+
native skill registration remains unverified.
|
|
111
424
|
|
|
112
425
|
## Adopting elsewhere
|
|
113
426
|
|
|
@@ -115,4 +428,6 @@ Keep the rule layers. Swap checklist: every line carrying the `(private)` privat
|
|
|
115
428
|
|
|
116
429
|
## Scope
|
|
117
430
|
|
|
118
|
-
|
|
431
|
+
The repository and npm package contain corpus sources and private runtime machinery,
|
|
432
|
+
not a user's authoring state, learning events, snapshots, pins, activation journals,
|
|
433
|
+
credentials, native settings, or generated temporary files.
|