From 0788a030fa61ba6390f8793d430e1fe7f5cc5ce9 Mon Sep 17 00:00:00 2001 From: SUaDtL Date: Tue, 4 Aug 2026 07:32:21 -0400 Subject: [PATCH 1/3] fix(orchestrator): define the tier-1/tier-2 boundary so resolved intent routes instead of asking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CHANGELOG: the orchestrator no longer asks "did you mean" when it has already resolved the exact command and its complete argument — fully-resolved, non-destructive intent routes directly (ADR-0022 tier 1) Claude-Session: https://claude.ai/code/session_01QjJeSbcwPHwMmd6CEZeagB --- core/surface/ORCHESTRATOR.md | 13 +++++++++++-- package.json | 2 +- plugins/ca-codex/.codex-plugin/plugin.json | 2 +- plugins/ca-codex/ORCHESTRATOR.md | 13 +++++++++++-- plugins/ca-pi/ORCHESTRATOR.md | 13 +++++++++++-- plugins/ca-pi/package.json | 2 +- plugins/ca/.claude-plugin/plugin.json | 2 +- plugins/ca/ORCHESTRATOR.md | 13 +++++++++++-- 8 files changed, 48 insertions(+), 12 deletions(-) diff --git a/core/surface/ORCHESTRATOR.md b/core/surface/ORCHESTRATOR.md index 9c12ab3b..7c578e7a 100644 --- a/core/surface/ORCHESTRATOR.md +++ b/core/surface/ORCHESTRATOR.md @@ -158,11 +158,20 @@ user type. Route on understood intent, in three tiers (ADR-0022): 1. **Unambiguous and non-destructive** — route directly into the command. Name the route in one line as you take it. Every gate runs exactly as if the user had typed it. -2. **Probable** — ask once, naming the command ("did you mean `{{CMD:fix}}`?"). One approval, then - route. The user approves rather than retypes. +2. **Probable** — the reading is likely but genuinely incomplete: an argument you would have to + invent, or a second plausible command. Ask once, naming the best candidate ("did you mean + `{{CMD:fix}}`?"). One approval, then route — the user approves rather than retypes. 3. **Genuinely unclear** — emit the redirect (`{{PLUGIN_ROOT}}/includes/redirect.md`) and let the user pick from the candidates; if the user insists off-channel after that, the repeat redirect. +**The tier-1/tier-2 line is drawn by what is already resolved, not by temperament.** If you can name +the exact command and its complete argument — nothing left to invent, no competing candidate — the +intent *is* unambiguous: that is tier 1, route it. Asking "did you mean" while displaying the +fully-formed command is the retype ceremony ADR-0022 abolished, returned as a question; the +demonstration that you resolved the route is the reason to take it, never the thing to ask permission +for. Tier 2 exists for a genuinely incomplete reading, and for the destructive set below — nothing +else. + **Clarity and risk are separate axes.** Tier 1 requires BOTH unambiguous intent AND a non-destructive command. Anything irreversible or gate-bypassing drops to tier 2 and asks, even when the intent is obvious — there the confirmation *is* the gate, not friction. That set: `{{CMD:override}}`, merge to diff --git a/package.json b/package.json index 6a46a727..507b4e03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ca-pi", - "version": "0.2.0", + "version": "0.2.3", "private": true, "license": "AGPL-3.0-only", "engines": { diff --git a/plugins/ca-codex/.codex-plugin/plugin.json b/plugins/ca-codex/.codex-plugin/plugin.json index d7bef188..74823250 100644 --- a/plugins/ca-codex/.codex-plugin/plugin.json +++ b/plugins/ca-codex/.codex-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ca-codex", "description": "Governance kernel for OpenAI Codex CLI: the full codeArbiter surface — 37 ca-prefixed governance skills (spec-driven /feature pipeline, nine-gate commit gate, ADRs, audits) plus enforcement hooks (persona injection, blocking pre-exec and pre-write gates, append-only audit trail) — sharing one .codearbiter/ store with the Claude Code sibling plugin. Standalone: opt a repo in with ca-init; enforcement stays dormant until .codearbiter/CONTEXT.md carries 'arbiter: enabled'. Requires Python 3 and Codex >= 0.143.0. CI continuously verifies, through a real Codex host at 0.143.0 and 0.145.0, that the plugin installs, reads back enabled, and ships every hook script it declares; an advisory lane tracks npm latest for upstream drift. Hook FIRING - live persona injection and live blocks inside a turn - is verified by hand per release against docs/codex-parity-testing.md, because a turn needs a model and a provider credential cannot gate fork pull requests.", - "version": "0.4.0", + "version": "0.4.3", "author": { "name": "arbiterForge" }, diff --git a/plugins/ca-codex/ORCHESTRATOR.md b/plugins/ca-codex/ORCHESTRATOR.md index f5c86dc8..b6d86c2e 100644 --- a/plugins/ca-codex/ORCHESTRATOR.md +++ b/plugins/ca-codex/ORCHESTRATOR.md @@ -137,11 +137,20 @@ user type. Route on understood intent, in three tiers (ADR-0022): 1. **Unambiguous and non-destructive** — route directly into the command. Name the route in one line as you take it. Every gate runs exactly as if the user had typed it. -2. **Probable** — ask once, naming the command ("did you mean `$ca-fix`?"). One approval, then - route. The user approves rather than retypes. +2. **Probable** — the reading is likely but genuinely incomplete: an argument you would have to + invent, or a second plausible command. Ask once, naming the best candidate ("did you mean + `$ca-fix`?"). One approval, then route — the user approves rather than retypes. 3. **Genuinely unclear** — emit the redirect (`${CLAUDE_PLUGIN_ROOT}/includes/redirect.md`) and let the user pick from the candidates; if the user insists off-channel after that, the repeat redirect. +**The tier-1/tier-2 line is drawn by what is already resolved, not by temperament.** If you can name +the exact command and its complete argument — nothing left to invent, no competing candidate — the +intent *is* unambiguous: that is tier 1, route it. Asking "did you mean" while displaying the +fully-formed command is the retype ceremony ADR-0022 abolished, returned as a question; the +demonstration that you resolved the route is the reason to take it, never the thing to ask permission +for. Tier 2 exists for a genuinely incomplete reading, and for the destructive set below — nothing +else. + **Clarity and risk are separate axes.** Tier 1 requires BOTH unambiguous intent AND a non-destructive command. Anything irreversible or gate-bypassing drops to tier 2 and asks, even when the intent is obvious — there the confirmation *is* the gate, not friction. That set: `$ca-override`, merge to diff --git a/plugins/ca-pi/ORCHESTRATOR.md b/plugins/ca-pi/ORCHESTRATOR.md index 2d362dfc..93e4c91c 100644 --- a/plugins/ca-pi/ORCHESTRATOR.md +++ b/plugins/ca-pi/ORCHESTRATOR.md @@ -137,11 +137,20 @@ user type. Route on understood intent, in three tiers (ADR-0022): 1. **Unambiguous and non-destructive** — route directly into the command. Name the route in one line as you take it. Every gate runs exactly as if the user had typed it. -2. **Probable** — ask once, naming the command ("did you mean `/ca-fix`?"). One approval, then - route. The user approves rather than retypes. +2. **Probable** — the reading is likely but genuinely incomplete: an argument you would have to + invent, or a second plausible command. Ask once, naming the best candidate ("did you mean + `/ca-fix`?"). One approval, then route — the user approves rather than retypes. 3. **Genuinely unclear** — emit the redirect (`/includes/redirect.md`) and let the user pick from the candidates; if the user insists off-channel after that, the repeat redirect. +**The tier-1/tier-2 line is drawn by what is already resolved, not by temperament.** If you can name +the exact command and its complete argument — nothing left to invent, no competing candidate — the +intent *is* unambiguous: that is tier 1, route it. Asking "did you mean" while displaying the +fully-formed command is the retype ceremony ADR-0022 abolished, returned as a question; the +demonstration that you resolved the route is the reason to take it, never the thing to ask permission +for. Tier 2 exists for a genuinely incomplete reading, and for the destructive set below — nothing +else. + **Clarity and risk are separate axes.** Tier 1 requires BOTH unambiguous intent AND a non-destructive command. Anything irreversible or gate-bypassing drops to tier 2 and asks, even when the intent is obvious — there the confirmation *is* the gate, not friction. That set: `/ca-override`, merge to diff --git a/plugins/ca-pi/package.json b/plugins/ca-pi/package.json index 35bee47c..80d4010b 100644 --- a/plugins/ca-pi/package.json +++ b/plugins/ca-pi/package.json @@ -1,6 +1,6 @@ { "name": "ca-pi", - "version": "0.2.0", + "version": "0.2.3", "private": true, "license": "AGPL-3.0-only", "type": "module", diff --git a/plugins/ca/.claude-plugin/plugin.json b/plugins/ca/.claude-plugin/plugin.json index f963449c..5a864e3f 100644 --- a/plugins/ca/.claude-plugin/plugin.json +++ b/plugins/ca/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "name": "ca", "displayName": "codeArbiter", "description": "Orchestration layer for Claude Code. Routes every intent through gated skills and reviewer agents, drives spec-driven TDD, mechanically enforces the commit and audit-trail gates, decides via SMARTS, and keeps an append-only audit trail. Requires Python 3 on PATH. Dormant until you opt a repo in; run /ca:init to activate.", - "version": "2.11.1", + "version": "2.11.4", "author": { "name": "arbiterForge" }, "license": "AGPL-3.0-only", "homepage": "https://github.com/arbiterForge/codeArbiter", diff --git a/plugins/ca/ORCHESTRATOR.md b/plugins/ca/ORCHESTRATOR.md index 60b85a05..46582289 100644 --- a/plugins/ca/ORCHESTRATOR.md +++ b/plugins/ca/ORCHESTRATOR.md @@ -134,11 +134,20 @@ user type. Route on understood intent, in three tiers (ADR-0022): 1. **Unambiguous and non-destructive** — route directly into the command. Name the route in one line as you take it. Every gate runs exactly as if the user had typed it. -2. **Probable** — ask once, naming the command ("did you mean `/ca:fix`?"). One approval, then - route. The user approves rather than retypes. +2. **Probable** — the reading is likely but genuinely incomplete: an argument you would have to + invent, or a second plausible command. Ask once, naming the best candidate ("did you mean + `/ca:fix`?"). One approval, then route — the user approves rather than retypes. 3. **Genuinely unclear** — emit the redirect (`${CLAUDE_PLUGIN_ROOT}/includes/redirect.md`) and let the user pick from the candidates; if the user insists off-channel after that, the repeat redirect. +**The tier-1/tier-2 line is drawn by what is already resolved, not by temperament.** If you can name +the exact command and its complete argument — nothing left to invent, no competing candidate — the +intent *is* unambiguous: that is tier 1, route it. Asking "did you mean" while displaying the +fully-formed command is the retype ceremony ADR-0022 abolished, returned as a question; the +demonstration that you resolved the route is the reason to take it, never the thing to ask permission +for. Tier 2 exists for a genuinely incomplete reading, and for the destructive set below — nothing +else. + **Clarity and risk are separate axes.** Tier 1 requires BOTH unambiguous intent AND a non-destructive command. Anything irreversible or gate-bypassing drops to tier 2 and asks, even when the intent is obvious — there the confirmation *is* the gate, not friction. That set: `/ca:override`, merge to From 14d3249709ab5226296b136147c22537cd735947 Mon Sep 17 00:00:00 2001 From: SUaDtL Date: Tue, 4 Aug 2026 07:33:22 -0400 Subject: [PATCH 2/3] chore(ca-pi): changelog entry for the tier-1/tier-2 orchestrator fix Required by ca-pi's release guard (tools/build-host-packages.py --release-guard-base), which enforces a changelog entry alongside any version advance. Claude-Session: https://claude.ai/code/session_01QjJeSbcwPHwMmd6CEZeagB --- plugins/ca-pi/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/ca-pi/CHANGELOG.md b/plugins/ca-pi/CHANGELOG.md index 3b25e536..bc82cd23 100644 --- a/plugins/ca-pi/CHANGELOG.md +++ b/plugins/ca-pi/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to `ca-pi` are documented in this file. ## [Unreleased] +## [0.2.3] - 2026-08-04 + +### Fixed + +- ORCHESTRATOR.md §6 now defines the tier-1/tier-2 boundary operationally: a fully-resolved command with a complete argument routes directly (ADR-0022 tier 1) instead of asking "did you mean" while displaying the already-resolved command (#595). + ## [0.2.0] - 2026-08-01 ### Added From b9b20c56b17df015c991f2f85970c8c21e20bb9d Mon Sep 17 00:00:00 2001 From: SUaDtL Date: Tue, 4 Aug 2026 07:39:34 -0400 Subject: [PATCH 3/3] fix(release-surfaces): propagate the ca/ca-codex version bumps to README and CHANGELOG.md The version-gate PR bumped plugins/ca and plugins/ca-codex manifests without updating the three surfaces derived from them: the README version badge, the README "currently ships `ca-codex ...`" line the site generator test asserts against, and ca's CHANGELOG.md top section, which the release-trace hook contract requires to equal the manifest version. CHANGELOG: no user-facing behavior change beyond the prior commit's fix; this corrects the README badge/ships-line and adds ca's CHANGELOG.md section to match the version bump already shipped Claude-Session: https://claude.ai/code/session_01QjJeSbcwPHwMmd6CEZeagB --- CHANGELOG.md | 12 ++++++++++++ README.md | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7933577b..7e4717d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,18 @@ predate the plugin rewrite and are grouped by date. ## [Unreleased] +## [2.11.4] — 2026-08-04 + +### Fixed + +- The orchestrator no longer asks "did you mean" when it has already resolved + the exact command and its complete argument. `ORCHESTRATOR.md` §6 now draws + the tier-1/tier-2 boundary (ADR-0022) by what is already resolved rather than + by temperament: an exact command with a complete argument and no competing + candidate is unambiguous by definition and routes directly. Tier 2 is + reserved for a genuinely incomplete reading — an argument you'd have to + invent, or a second plausible command — and the destructive set. + ## [2.11.1] — 2026-08-03 ### Fixed diff --git a/README.md b/README.md index 8ea04715..d512c05b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ project context. You decide. codeArbiter enforces. Claude Code plugin Codex plugin Pi Feature Forge preview -version 2.11.1 +version 2.11.4 commands skills agents @@ -119,7 +119,7 @@ Approve the normal plugin trust prompt, open the target repository, and continue ### Codex CLI -The public GitHub-slug flow is **available now**. The repository currently ships `ca-codex 0.4.0`; +The public GitHub-slug flow is **available now**. The repository currently ships `ca-codex 0.4.3`; the dated end-to-end public-install record discovered `ca-codex 0.2.4` from release `v2.8.13`. Current packaging and shared-core parity are continuously verified, while that dated live-install record stays labeled rather than being silently promoted to evidence for a newer adapter: