agent-bios 0.10.0 → 0.12.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.
@@ -1,43 +1,37 @@
1
1
  schema_version = 1
2
2
 
3
+ # `bare_launch_args` are appended ONLY on a bare launch — no preset, no --custom, no
4
+ # --dry-run — where nothing else decides policy. A configured launch projects the
5
+ # preset's own policy (`claude_permission_mode` / `codex_execution_policy`) and never
6
+ # carries these: with them, a preset that chose `standard` would launch with
7
+ # `--dangerously-skip-permissions` from here. The key was `passthrough_args`, which read
8
+ # as universal and made that omission look like a defect (round 18, #3).
3
9
  [backends.codex]
4
10
  command = "codex"
5
- passthrough_args = []
11
+ bare_launch_args = []
6
12
 
7
13
  [backends.claude]
8
14
  command = "claude"
9
- passthrough_args = ["--dangerously-skip-permissions"]
15
+ bare_launch_args = ["--dangerously-skip-permissions"]
10
16
 
11
17
  # Optional dependencies. `command` gates the route: unresolvable means the route
12
18
  # is unavailable and the review setup degrades without it. `install` is the single
13
19
  # source for both the one-line hint shown when it is missing and what
14
- # `agent-bios install --with <name>` runs.
15
- [capabilities.onto]
16
- command = "onto"
17
- install = "npm i -g onto-mcp"
18
- # How this tool exposes an operation. The adapter is a protocol codec owned by core,
19
- # never a method identity, so a second method reusing the tag is data-only.
20
- # `evidence` names what this tool reports back about the dispatch it performed, and a
21
- # receipt missing any of it is not credited. These three are what onto's override already
22
- # returns on its warning channel. They are here because of a measured incident, not a
23
- # guess: an override that reached no seat resolved to a default provider with a null model
24
- # and did NOT fail, so a reporter with nothing to check would have called it a success.
25
- offers = [{ operation = "structured-review", adapter = "mcp-stdio-v1", hosts = ["codex", "claude"], evidence = ["reached_seat", "billing_mode", "auth_defaulted"] }]
26
-
27
- # ── dynamic workflow, one concept and two host-bound tools ─────────────────
28
- # `ultracode` runs ON CLAUDE and `ultracode-for-codex` runs ON CODEX — the names say which,
29
- # and getting them the wrong way round is the mistake to avoid: the package name is
30
- # "ultracode, ported for codex", not "the codex one is the real one".
31
- #
32
- # What they are FOR, which is what a reader choosing between reviewers actually needs:
33
- # both drive a dynamic workflow, used here as a flexible many-perspective check on an
34
- # IMPLEMENTATION — does it function, does it survive an adversary, does the logic hold,
35
- # does it hold under a real scenario, does it hold under stress. That makes them
36
- # COMPLEMENTARY to onto rather than competing with it: onto looks hardest at whether
37
- # authority, gates and harness are consistent with each other. The two are independently
38
- # selectable, and both single-sided choices are legitimate — a thing whose whole point is
39
- # that it WORKS can be reviewed by the workflow alone, and a logic-bearing document,
40
- # ontology, harness or gate can be reviewed by onto alone.
20
+ # `agent-bios install --with <name>` runs. How a tool exposes an operation is its
21
+ # `offers` list: the adapter there is a protocol codec owned by core, never a method
22
+ # identity, so a second method reusing the tag is data-only, and `evidence` names what
23
+ # the tool reports back about the dispatch it performed — a receipt missing any of it
24
+ # is not credited.
25
+
26
+ # ── deep review, one concept and two host-bound mechanisms ─────────────────
27
+ # Both shipped deep reviewers are the host CLIs themselves nothing to install beyond
28
+ # the CLI, which is a host rather than a reviewer. `ultracode` runs ON CLAUDE (the
29
+ # Claude Code workflow keyword); `codex-exec` runs ON CODEX (the CLI's non-interactive
30
+ # exec mode). What they are FOR: a deep check on an IMPLEMENTATION does it function,
31
+ # does it survive an adversary, does the logic hold, does it hold under a real scenario,
32
+ # does it hold under stress. The Claude side fans that across many agents; the Codex
33
+ # side hands the whole packet to one frontier-effort pass. Personal or third-party
34
+ # reviewers register in the user-owned methods file, never here.
41
35
 
42
36
  [capabilities.ultracode]
43
37
  # Not a separate tool: the Claude Code CLI's own dynamic workflow, opened by putting the
@@ -55,17 +49,24 @@ command = "${backend}"
55
49
  # claude only: the keyword trigger is a Claude Code feature, so a codex seat cannot run it.
56
50
  offers = [{ operation = "workflow-review", adapter = "host-workflow-v1", hosts = ["claude"] }]
57
51
 
58
- [capabilities.ultracode-for-codex]
59
- command = "ultracode-for-codex"
60
- install = "npm i -g ultracode-for-codex"
61
- # codex only, and this is the tool's nature rather than a policy: it drives the Codex
62
- # app-server and takes its model catalog from there, so a reviewer seated on the
63
- # claude host is a seat it cannot fill. Declaring both hosts made a codex-main launch
64
- # emit "run ultracode-for-codex on claude-fable-5", which cannot work.
52
+ [capabilities.codex-exec]
53
+ # The Codex CLI's own non-interactive exec mode. As with `ultracode` above, the command
54
+ # IS the configured backend — `${backend}` and not a duplicated literal, because a
55
+ # duplicated default breaks for anyone whose backend is a wrapper or an absolute path.
56
+ # No `install`: that field is EXECUTED by `agent-bios install --with`, and a missing
57
+ # codex CLI is a missing host, not a missing reviewer.
58
+ command = "${backend}"
59
+ # codex only, and this is the tool's nature rather than a policy: `exec`,
60
+ # `-s read-only`, `-c model_reasoning_effort` and `-c service_tier` are Codex CLI
61
+ # surface (verified against installed codex-cli 0.146.0), so a claude seat cannot
62
+ # run it. `-s read-only` pins the sandbox the descriptor promises; what stays
63
+ # inherited is the ambient ~/.codex configuration (AGENTS.md, config.toml), so
64
+ # this reviewer is read-only but not hermetic — the codex-run wrapper remains the
65
+ # hermetic dispatch when that matters.
65
66
  #
66
- # Between the two, this review is available CROSS-FAMILY from either main — which the
67
- # codex arm previously had no way to express, and so silently went without.
68
- offers = [{ operation = "workflow-review", adapter = "host-workflow-v1", hosts = ["codex"] }]
67
+ # Between the two, this review is available CROSS-FAMILY from a claude main — the
68
+ # opposite family's CLI is dispatched as a fresh read-only subprocess.
69
+ offers = [{ operation = "exec-review", adapter = "exec-stdio-v1", hosts = ["codex"] }]
69
70
 
70
71
  # ── review methods (DESIGN.md §1) ───────────────────────────────────────────
71
72
  # Data only. Adding a method here — including one this repo has never seen — must
@@ -92,59 +93,33 @@ aggregation = "majority"
92
93
  severity_emits = ["blocker", "high", "medium", "low", "info"]
93
94
  severity_map = { blocker = "blocker", high = "high", medium = "medium", low = "low", info = "info" }
94
95
 
95
- [review_methods.onto]
96
- label = "onto structured lens review"
97
- description = "Audits any target — code, a design doc, a whole repo — against the intent you state, looking hardest at whether authority, gates and harness are consistent with one another; complementary to the ultracode workflows rather than an alternative, and enough on its own for a logic-bearing document, ontology, harness or gate. Six lenses, cited issues, dissent kept as an artifact. Needs no diff. Returns a handle, not a result: poll 10+ min, and read record_status before believing a clean report."
98
- capability = "onto"
99
- operation = "structured-review"
100
- # `effort` is sent and `auth` is deliberately NOT. onto's per-call override REPLACES
101
- # a seat whose route differs, so what it omits is dropped rather than inherited —
102
- # which is why effort must be stated: this binding IS the reviewer's pinned rigour.
103
- # auth is the opposite case. onto selects the metered route only when a seat says so in
104
- # writing — `auth = "api_key"` or an `api_key_env` naming the variable to call — and
105
- # defaults to the subscription worker otherwise, so an omitted auth cannot land on
106
- # metered and stating one buys nothing. It does cost something: switching a seat to
107
- # oauth is a route change, so a user who deliberately chose metered loses both their
108
- # auth and the api_key_env that carried it. Omitting it lets onto's default protect the
109
- # unconfigured seat and its overlay preserve the configured one.
110
- instructions = 'call onto_review/onto_prepare_review with llmOverride={{"provider":"{provider}","model":"{model}","effort":"{effort}"}} so onto runs on {provider} at {effort}'
96
+ [review_methods.codex-exec]
97
+ label = "Codex deep exec review"
98
+ # Named for the mechanism, not for the legacy layer. The legacy route token `ultracode`
99
+ # used to BE its capability's key, so naming another tool with the bare name silently
100
+ # repointed the legacy route — the golden caught that, and the fix was to bind the legacy
101
+ # token to a capability explicitly (`LEGACY_ULTRACODE_CAPABILITY`) rather than let a setup
102
+ # name and a tool id be the same string.
103
+ description = "One deep pass by the Codex CLI in non-interactive exec mode: the whole packet handed to a single frontier-effort model rather than fanned out over agents. Use it on things that have to WORK when the strongest single reader beats many angles; the Claude-side workflow below is the fan-out counterpart. Reviews whatever packet you hand it on stdin, so it needs no working-tree state and nothing installed beyond the codex CLI itself."
104
+ capability = "codex-exec"
105
+ operation = "exec-review"
106
+ # The exec flags are the whole mechanism, so they are stated as literals rather than left
107
+ # to the dispatcher's memory. The severity ladder is stated too, and that is what makes
108
+ # the identity map below TRUE rather than copied: this reviewer has no vocabulary of its
109
+ # own it reports on the ladder because the request tells it to.
110
+ instructions = 'dispatch {command} exec -s read-only -m {model} -c model_reasoning_effort="{effort}" as a fresh read-only process with a self-contained review packet on stdin (the -s flag is what makes read-only true rather than promised; append -c service_tier="fast" only when a faster, shallower turnaround is explicitly wanted), and require every finding to carry one of {severities}'
111
111
  output = "review-v1"
112
- perspectives = ["axiology", "coverage", "evolution", "logic", "semantics", "structure"]
112
+ perspectives = ["deep-exec"]
113
113
  trials = 1
114
114
  order = "fixed"
115
115
  swap_augmentation = false
116
116
  aggregation = "union"
117
- # onto's own REVIEW_SEVERITY_ORDER is this same ladder — read in its source, not
118
- # assumed. Identity is correct here for a different reason than the panel below.
119
117
  severity_emits = ["blocker", "high", "medium", "low", "info"]
120
118
  severity_map = { blocker = "blocker", high = "high", medium = "medium", low = "low", info = "info" }
121
119
 
122
- [review_methods.ultracode-for-codex]
123
- label = "Ultracode workflow review (Codex)"
124
- # Named for the tool, not for the legacy layer. The legacy route token `ultracode` used to
125
- # BE this capability's key, so naming the Claude tool `ultracode` silently repointed the
126
- # legacy route at it — the golden caught that, and the fix was to bind the legacy token to
127
- # a capability explicitly (`LEGACY_ULTRACODE_CAPABILITY`) rather than let a setup name and
128
- # a tool id be the same string.
129
- description = "The same dynamic workflow, ported to Codex — same use: things that have to WORK, checked from many angles rather than one. Fans dozens of Codex agents over your UNCOMMITTED working-tree changes for file:line defects, each candidate verified by its own agent. Its built-in code-review fails before spawning anything when the tree holds no reviewable change — clean, or only types it excludes such as .java, Dockerfile or dist/. Passing that gate is not the same as your files being reviewed. Detached: launching exits 0 even when the run dies."
130
- capability = "ultracode-for-codex"
131
- operation = "workflow-review"
132
- instructions = "run {command} against a self-contained review packet on {model}/{effort}"
133
- output = "review-v1"
134
- perspectives = ["orchestration"]
135
- trials = 1
136
- order = "fixed"
137
- swap_augmentation = false
138
- aggregation = "union"
139
- # P0..P3 plus a null severity, taken from the tool's own result contract. The mapping
140
- # is the owner's call: the tool documents the vocabulary but not what each level
141
- # means, so it cannot be derived. "null" keys a finding the tool reports with none.
142
- severity_emits = ["P0", "P1", "P2", "P3", "null"]
143
- severity_map = { P0 = "blocker", P1 = "high", P2 = "medium", P3 = "low", null = "info" }
144
-
145
120
  [review_methods.ultracode]
146
121
  label = "Ultracode workflow review (Claude)"
147
- description = "Claude Code's own dynamic workflow, on Claude. Decomposes the request across many agents and adversarially verifies each candidate finding before it survives. Use it on things that have to WORK — functional, adversarial, logic, scenario and stress passes — where onto is the one to reach for when the question is whether authority, gates and harness agree. Reviews whatever packet you hand it, so it needs no working-tree state. The keyword in the prompt is what opens the workflow: without it the turn is an ordinary session that will answer, plausibly, alone. PRECONDITION this launcher cannot establish: the keyword trigger must be enabled (`workflowKeywordTriggerEnabled`, default true, verified in claude 2.1.220). A resolvable claude CLI proves the command exists, not that the workflow opens — with that setting off the review runs as an ordinary session and would report as though it were orchestrated."
122
+ description = "Claude Code's own dynamic workflow, on Claude. Decomposes the request across many agents and adversarially verifies each candidate finding before it survives. Use it on things that have to WORK — functional, adversarial, logic, scenario and stress passes; the Codex-side deep exec review above is the single-reader counterpart. Reviews whatever packet you hand it, so it needs no working-tree state. The keyword in the prompt is what opens the workflow: without it the turn is an ordinary session that will answer, plausibly, alone. PRECONDITION this launcher cannot establish: the keyword trigger must be enabled (`workflowKeywordTriggerEnabled`, default true, verified in claude 2.1.220). A resolvable claude CLI proves the command exists, not that the workflow opens — with that setting off the review runs as an ordinary session and would report as though it were orchestrated."
148
123
  capability = "ultracode"
149
124
  operation = "workflow-review"
150
125
  # The keyword is the whole mechanism, so it is stated as a literal rather than left to the
@@ -167,9 +142,6 @@ severity_map = { blocker = "blocker", high = "high", medium = "medium", low = "l
167
142
  # the reverse map must be unique so it resolves to exactly one validatable seat.
168
143
  provider = "openai"
169
144
  models = ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"]
170
- # onto review seat used when a CROSS-family main (Claude) routes onto review to
171
- # this (gpt/codex) family; must be an onto review-role registered (provider, model).
172
- onto_review = { provider = "openai", model = "gpt-5.6-sol" }
173
145
 
174
146
  [hosts.codex.tiers.frontier]
175
147
  model = "gpt-5.6-sol"
@@ -209,9 +181,6 @@ sweep = "${CODEX_HOME}/agents/sweep.toml"
209
181
  [hosts.claude]
210
182
  provider = "anthropic"
211
183
  models = ["claude-fable-5", "claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5"]
212
- # onto review seat used when a CROSS-family main (Codex) routes onto review to
213
- # this (anthropic/claude) family; must be an onto review-role registered (provider, model).
214
- onto_review = { provider = "anthropic", model = "claude-fable-5" }
215
184
 
216
185
  [hosts.claude.tiers.frontier]
217
186
  model = "claude-fable-5"
@@ -241,7 +210,7 @@ claude_permission_mode = "bypassPermissions"
241
210
 
242
211
  [presets.deep-review]
243
212
  label = "Deep review"
244
- description = "HELM with hybrid onto, native, and Ultracode review at deep FRONTIER effort."
213
+ description = "HELM with the base panel plus the deep reviewer from the OTHER provider — Codex exec at ultra when you launch Claude, the Claude workflow when you launch Codex — at FRONTIER effort."
245
214
  mode = "builder"
246
215
  main_tier = "helm"
247
216
  frontier_effort = { codex = "ultra", claude = "max" }
@@ -261,7 +230,7 @@ claude_permission_mode = "bypassPermissions"
261
230
 
262
231
  [presets.solo]
263
232
  label = "Solo"
264
- description = "Single-model session: delegation off (no tier fan-out; the standing spawn policy is lifted), review via the host's own command only."
233
+ description = "Single-model session: delegation off (no tier fan-out; the standing spawn policy is lifted) and no review route requested review is whatever you run yourself."
265
234
  mode = "builder"
266
235
  main_tier = "helm"
267
236
  frontier_effort = "max"
@@ -318,22 +287,15 @@ tier = "helm"
318
287
  provider = "openai"
319
288
  tier = "frontier"
320
289
 
321
- [presets.deep-review.review.hosts.claude.methods."onto"]
322
- provider = "openai"
323
- tier = "frontier"
324
-
325
- [presets.deep-review.review.hosts.claude.methods."ultracode-for-codex"]
290
+ [presets.deep-review.review.hosts.claude.methods."codex-exec"]
326
291
  provider = "openai"
327
- tier = "frontier"
292
+ model = "gpt-5.6-sol"
293
+ effort = "ultra"
328
294
 
329
295
  [presets.deep-review.review.hosts.codex.base]
330
296
  provider = "anthropic"
331
297
  tier = "frontier"
332
298
 
333
- [presets.deep-review.review.hosts.codex.methods."onto"]
334
- provider = "anthropic"
335
- tier = "frontier"
336
-
337
299
  [presets.deep-review.review.hosts.codex.methods."ultracode"]
338
300
  provider = "anthropic"
339
301
  tier = "frontier"
@@ -350,22 +312,15 @@ tier = "workhorse"
350
312
  provider = "openai"
351
313
  tier = "frontier"
352
314
 
353
- [presets.session-distill.review.hosts.claude.methods."onto"]
315
+ [presets.session-distill.review.hosts.claude.methods."codex-exec"]
354
316
  provider = "openai"
355
- tier = "frontier"
356
-
357
- [presets.session-distill.review.hosts.claude.methods."ultracode-for-codex"]
358
- provider = "openai"
359
- tier = "frontier"
317
+ model = "gpt-5.6-sol"
318
+ effort = "ultra"
360
319
 
361
320
  [presets.session-distill.review.hosts.codex.base]
362
321
  provider = "anthropic"
363
322
  tier = "frontier"
364
323
 
365
- [presets.session-distill.review.hosts.codex.methods."onto"]
366
- provider = "anthropic"
367
- tier = "frontier"
368
-
369
324
  [presets.session-distill.review.hosts.codex.methods."ultracode"]
370
325
  provider = "anthropic"
371
326
  tier = "frontier"
@@ -4,10 +4,15 @@
4
4
  _agent_launch_direct() {
5
5
  local host="$1"
6
6
  shift
7
+ # `builtin command`, not bare `command`. The point of this line is to reach the real
8
+ # binary without re-entering a shell function, and zsh lets a user define `command()`
9
+ # — at which point the bare form calls THAT, and the direct path this wrapper exists to
10
+ # provide is handed to whatever the user's function does. `builtin` cannot be shadowed,
11
+ # so the resolution is the one the comment above already promised.
7
12
  if [[ "$host" == "claude" ]]; then
8
- command claude --dangerously-skip-permissions "$@"
13
+ builtin command claude --dangerously-skip-permissions "$@"
9
14
  else
10
- command codex "$@"
15
+ builtin command codex "$@"
11
16
  fi
12
17
  }
13
18
 
@@ -0,0 +1,186 @@
1
+ # UI text catalog: English, the reference key-set. Every `t("key")` in
2
+ # launch/agent-launch.py must exist here, and ko.toml/ja.toml must carry
3
+ # exactly this key-set — the parity gate holds all three, both directions.
4
+ # Chrome only: launch-contract text is never sourced from a catalog.
5
+
6
+ "mode.title" = "Mode"
7
+ "mode.swe.label" = "Software Engineer"
8
+ "mode.swe.description" = "Repo-scoped work that defers to the project's own AGENTS.md/CLAUDE.md: a bare Vanilla session, or Custom to configure one."
9
+ "mode.builder.label" = "Builder"
10
+ "mode.builder.description" = "Tune tiers, review routes, and permissions across fixed presets; includes Custom."
11
+ "mode.distill.label" = "Session distill"
12
+ "mode.distill.description" = "Enter the dedicated session-distill hub: status, packages, versions, and session start."
13
+
14
+ "language.label" = "Language"
15
+ "language.description" = "Choose the TUI language (English / 한국어 / 日本語). The corpus the AI consumes stays English; this changes the launcher's screens only."
16
+ "language.title" = "Language"
17
+ "language.en.description" = "Show the launcher's screens in English."
18
+ "language.ko.description" = "런처 화면을 한국어로 표시합니다."
19
+ "language.ja.description" = "ランチャーの画面を日本語で表示します。"
20
+
21
+ "corpus.label" = "Corpus packages"
22
+ "corpus.description" = "Choose which corpus domain packages are installed; applying runs the installer's onboard loop (install + activation canary)."
23
+ "corpus.title" = "Corpus packages"
24
+ "corpus.core.line" = "core + infra always install; the checklist covers the optional domain packages."
25
+ "corpus.toggle.description" = "Toggle this domain package. Nothing changes until Apply."
26
+ "corpus.apply.label" = "Apply selection{pending}"
27
+ "corpus.apply.description" = "Run agent-bios onboard with exactly the checked set; the installer deploys, canaries, and records the outcome."
28
+ "corpus.apply.unchanged" = "the checked set equals the applied one — nothing to apply"
29
+ "corpus.unavailable.line1" = "The corpus status projection is missing or predates domain reporting."
30
+ "corpus.none.line" = "This projection lists no optional domain packages — core and infra always install, so there is nothing to choose here."
31
+ "corpus.unavailable.line2" = "Run: agent-bios install (it rewrites the projection this screen reads)"
32
+ "corpus.back.hint" = "Return to the mode menu."
33
+
34
+ "wizard.title" = "Register another reviewer"
35
+ "wizard.id.label" = "Method id (kebab-case)"
36
+ "wizard.label.label" = "Label (shown in the method list)"
37
+ "wizard.description.label" = "Description (what it reviews best)"
38
+ "wizard.drives.title" = "What runs this reviewer?"
39
+ "wizard.drives.tool.label" = "An installed tool"
40
+ "wizard.drives.tool.description" = "The method drives a capability: a command this machine can resolve, with an operation/adapter/hosts offer."
41
+ "wizard.drives.panel.label" = "Fresh host subprocesses (panel-shaped)"
42
+ "wizard.drives.panel.description" = "No tool: isolated passes by the host CLI itself. If this lands on the main seat the review is graded perspective_floor — its perspectives are then the only thing separating it from you."
43
+ "wizard.cap.name.label" = "Capability name"
44
+ "wizard.cap.command.label" = "Command (resolved on PATH, or ${backend} for the host CLI)"
45
+ "wizard.cap.install.label" = "Install line (runs via agent-bios install --with; '-' for none)"
46
+ "wizard.cap.operation.label" = "Operation (the join key between method and offer)"
47
+ "wizard.cap.adapter.title" = "Adapter (core protocol codec)"
48
+ "wizard.cap.hosts.title" = "Which host seats can this tool fill?"
49
+ "wizard.cap.hosts.both" = "both (codex and claude)"
50
+ "wizard.perspectives.label" = "Perspectives (comma-separated; one is enough for a reviewer that reads in its own context)"
51
+ "wizard.perspectives.refused" = "Name at least one perspective — this is what the reviewer is told to look for."
52
+ "wizard.trials.label" = "Trials (isolated passes; 1 or more)"
53
+ "wizard.trials.refused" = "Needs a whole number of 1 or more."
54
+ "wizard.instructions.label" = "Instructions (slots: {command} {model} {effort} {provider} {host} {service_tier} {perspectives} {trials} {severities})"
55
+ "wizard.emits.label" = "Severity values YOUR reviewer reports, verbatim (comma-separated)"
56
+ "wizard.map.title" = "Map to the canonical ladder — {value}"
57
+ "wizard.confirm.title" = "The reader accepted this block — write it?"
58
+ "wizard.confirm.target" = "Appends to: {target}"
59
+ "wizard.confirm.write.label" = "Write it"
60
+ "wizard.confirm.write.description" = "Append atomically; your file's existing content is untouched."
61
+ "wizard.confirm.edit.label" = "Edit answers again"
62
+ "wizard.refused.title" = "The reader refused this block"
63
+ "wizard.refused.header" = "Validation is the reader's own; its message, verbatim:"
64
+ "wizard.refused.edit.label" = "Edit answers (kept as defaults)"
65
+ "wizard.refused.edit.description" = "Walk the questions again; every answer is pre-filled."
66
+ "wizard.refused.contract.label" = "Show the file contract"
67
+ "wizard.raced.line" = "The methods file changed while the wizard was open; nothing was written. Re-run the registration."
68
+ "wizard.postwrite.line" = "Post-write re-read did not show the method; the file was restored from your shell's perspective — inspect it by hand."
69
+ "wizard.postwrite.raced.line" = "Post-write re-read did not show the method, and the file changed underneath — another writer's edit was left exactly as it stands, not rolled back. Inspect it by hand."
70
+ "wizard.done.line" = "Registered and live in this launcher: {method_id}"
71
+
72
+ # Custom settings hub — the tiers, review, and execution policy of one launch.
73
+ "custom.title" = "Custom settings"
74
+ "custom.main.label" = "Main tier: {tier}"
75
+ "custom.main.description" = "Choose the primary orchestrator used for this session."
76
+ "custom.review.label" = "Review setup: {setup}"
77
+ "custom.review.description" = "Choose the review routes requested when review gates fire."
78
+ "custom.policy.label" = "Execution policy: {policy}"
79
+ "custom.policy.description" = "Choose the host-specific permission or sandbox behavior."
80
+ "custom.tier.description" = "Edit the {tier} model and reasoning effort, then return here."
81
+ "custom.save.label" = "Save these settings globally and start"
82
+ "custom.save.description" = "Save this setup as a named preset in your user config for reuse elsewhere, then launch."
83
+ "custom.save.prompt" = "Save as preset name"
84
+ "custom.start.label" = "Start with these settings"
85
+ "custom.start.description" = "Confirm the complete setup shown above and continue to launch."
86
+ "custom.exit.label" = "Exit without launching"
87
+ "custom.exit.description" = "Discard this launch and return to the shell."
88
+
89
+ "tier.title" = "Main tier"
90
+ "tier.frontier.description" = "Highest-capability specialist for hard, high-impact work and deep review."
91
+ "tier.helm.description" = "Primary orchestrator for planning, delegation, integration, and final decisions."
92
+ "tier.workhorse.description" = "Cost-conscious executor for high-volume implementation and analysis."
93
+ "tier.sweep.description" = "Fast, low-cost worker for narrow searches, checks, and mechanical tasks."
94
+
95
+ "model.title" = "{tier} model"
96
+ "model.use.description" = "Use {model} as this tier's model."
97
+ "model.other.label" = "Other (enter a model id)"
98
+ "model.other.description" = "Type any model id the backend accepts, even if it is not in the catalog."
99
+
100
+ "effort.title" = "{tier} effort"
101
+ "effort.low.description" = "Minimize reasoning cost and latency for straightforward work."
102
+ "effort.medium.description" = "Use moderate reasoning for routine work with some ambiguity."
103
+ "effort.high.description" = "Spend more reasoning on complex implementation and analysis."
104
+ "effort.xhigh.description" = "Use deeper reasoning for difficult coordination and high-impact decisions."
105
+ "effort.max.description" = "Use the host's strongest standard reasoning mode for frontier work."
106
+ "effort.ultra.description" = "Use Codex Ultra for exceptionally deep, divisible frontier work."
107
+ "effort.unsupported.host" = "not supported by {host}"
108
+ "effort.unsupported.model" = "not supported by {model}"
109
+
110
+ "policy.codex.title" = "Codex execution policy"
111
+ "policy.codex.bypass.label" = "Bypass approvals and sandbox"
112
+ "policy.codex.bypass.description" = "Run without Codex approval or sandbox restrictions."
113
+ "policy.codex.workspace-write.label" = "Workspace write sandbox"
114
+ "policy.codex.workspace-write.description" = "Allow workspace writes under Codex's workspace-write sandbox."
115
+ "policy.codex.read-only.label" = "Read-only sandbox"
116
+ "policy.codex.read-only.description" = "Allow inspection while blocking file writes through the Codex sandbox."
117
+ "policy.codex.standard.label" = "Standard"
118
+ "policy.codex.standard.description" = "Pass no policy flag; use Codex's own default approval and sandbox behavior."
119
+
120
+ "policy.claude.title" = "Claude permission mode (not an OS sandbox)"
121
+ "policy.claude.bypassPermissions.label" = "Bypass permissions"
122
+ "policy.claude.bypassPermissions.description" = "Skip Claude permission prompts; this is not an OS sandbox setting."
123
+ "policy.claude.acceptEdits.label" = "Accept edits"
124
+ "policy.claude.acceptEdits.description" = "Automatically accept file edits while retaining other permission checks."
125
+ "policy.claude.auto.label" = "Auto permissions"
126
+ "policy.claude.auto.description" = "Use Claude's automatic permission mode."
127
+ "policy.claude.manual.label" = "Manual permissions"
128
+ "policy.claude.manual.description" = "Ask before actions according to Claude's manual permission flow."
129
+ "policy.claude.dontAsk.label" = "Do not ask"
130
+ "policy.claude.dontAsk.description" = "Use Claude's dontAsk permission mode."
131
+ "policy.claude.plan.label" = "Plan mode"
132
+ "policy.claude.plan.description" = "Start Claude in planning mode without direct implementation."
133
+ "policy.claude.standard.label" = "Standard"
134
+ "policy.claude.standard.description" = "Pass no policy flag; use Claude's own default permission prompts."
135
+
136
+ # Session Distill area — corpus content versions, packages, and rollback.
137
+ "distill.title" = "Session Distill"
138
+ "distill.start.label" = "Start a session distill run"
139
+ "distill.start.description" = "Launch with the Session distill preset: the mission line directs the session to the workflow guide and the SSOT."
140
+ "distill.start.unavailable" = "preset {preset} not configured"
141
+ "distill.packages.label" = "Corpus packages"
142
+ "distill.packages.description" = "What corpus content is applied, as installable packages (v1: single core corpus)."
143
+ "distill.versions.label" = "Versions & rollback"
144
+ "distill.versions.description" = "Corpus content versions (distinct from system deployment); roll the corpus back or forward."
145
+ "distill.back.label" = "Back"
146
+ "distill.back.hint" = "Return to Session Distill."
147
+ "distill.back.launch" = "Return to the launch menu."
148
+ "distill.version.current" = "{version} (current)"
149
+ "distill.version.description" = "closed {closed} · commit {commit} · {summary}"
150
+ "distill.version.applied.title" = "{version} is the currently applied version"
151
+ "distill.version.applied.line" = "Select a different version to roll back or forward."
152
+ "distill.package.core.label" = "core corpus @ {version}"
153
+ "distill.package.core.description" = "All corpus domains in one package until domain packaging lands (backlog). Layers: {layers}. Per-domain selection, versions, and rollback will appear here."
154
+ "distill.rollback.title" = "Roll back corpus to {version}?"
155
+ "distill.rollback.cancel.label" = "Cancel"
156
+ "distill.rollback.cancel.description" = "Keep the currently deployed corpus content."
157
+ "distill.rollback.confirm.label" = "Roll back to {version}"
158
+ "distill.rollback.confirm.description" = "Re-deploys globals/guides/hooks as of that corpus version. System deployment (launcher, wrappers) stays current. Roll forward again by selecting the latest version."
159
+ "distill.rollback.done" = "Rollback complete."
160
+ "distill.rollback.failed" = "Rollback FAILED."
161
+
162
+ # Corpus status panel — shared by the Session Distill area and the checklist.
163
+ # Labels are padded to a column measured in display cells, so a translation may
164
+ # be any width without ragging the panel.
165
+ "panel.unprojected" = "corpus status not projected yet — run: agent-bios install"
166
+ "panel.version.label" = "Applied version"
167
+ "panel.mechanisms.label" = "Mechanisms"
168
+ "panel.ledger.label" = "Ledger"
169
+ "panel.domains.label" = "Domains"
170
+ "panel.rolled-back" = "(ROLLED BACK; latest is {latest})"
171
+ "panel.layers.none" = "none"
172
+ "panel.ledger.value" = "placed {placed} · incubating {incubating} · versions {versions}"
173
+ "panel.domains.unset" = "(none selected yet)"
174
+ "panel.last-apply" = "⚠ LAST APPLY {outcome} at {at} — requested: {requested}"
175
+ "corpus.core-only" = "core+infra only"
176
+
177
+ # Numbered-prompt chrome. These were printed as English literals from the renderer
178
+ # while every line of content around them was translated, so the Korean and Japanese
179
+ # screens answered in one language and asked in another.
180
+ "prompt.select" = "Select [{default}] ({actions}): "
181
+ "prompt.back" = "b back"
182
+ "prompt.cancel" = "q cancel"
183
+ "prompt.unavailable" = "Unavailable"
184
+ "prompt.unavailable.retry" = "Unavailable: {reason}. Select an enabled option."
185
+ "prompt.no.previous" = "No previous menu. Use q to cancel."
186
+ "prompt.corpus.header" = "-- Corpus status --"