diff --git a/CHANGELOG.md b/CHANGELOG.md index 517d2532..96dee162 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,51 @@ All notable changes to codexclaw are documented here. The format follows ## [Unreleased] +## [0.2.28] - 2026-09-14 + +### Fixed + +- `cxc-loop` `references/durable-goalplan.md` documented mandatory goalplan + registration without documenting the command that performs it. `add-criterion` + was absent from the CLI surface list while the schema advertised `criteria[]` + field names, so the natural first call — `--id c1 --scenario ... --expected-evidence ...` + — failed with `--criterion "" is required`, and `update_goal + {status:"complete"}` stayed hook-denied behind GOAL-COMPLETE-GATE-01. The real + signature is now listed (`--criterion [--surface logic|web|tui]`), `init` + shows its repeatable `[--criterion ]...` form, and a duplicate scenario + text is documented as a rejection (#170). +- Criterion ids are generated, not chosen. `meet-criterion --id ` read as if + the caller picks the id the way `add-work-phase --id wp1` does, so an agent that + assumed `c1` at registration would later record no evidence for a criterion it + believed it met. The reference now states that ids are assigned as `c-1`, + `c-2`, ... (max existing `c-N` + 1, in registration order) and are read back from + `cxc loop show` or the goalplan file. `criteria[]` also regains its missing + `surface` field, with per-field provenance: `scenario` and `surface` are + CLI-settable, `id` and `status` are derived, `expectedEvidence` has no + `add-criterion` flag, and `capturedEvidence` comes from `meet-criterion + --evidence` (#171). +- DISPATCH-SURFACE-01 was correct in substance but ordered so that an orchestrator + over-rotated to threads for every unit of work. Four STRICT blocks pushed toward + threads while the correcting sentence — in-lane subagents cannot collide because + the worktrees differ — sat in the last paragraph of + `cxc-pabcd` `references/dispatch-surfaces.md`. The composition rule now sits + inside the invariant itself: a **lane** is thread work, a **worker inside a lane** + is subagent work. DISPATCH-ROUTE-01 gained the matching route line, `cxc-loop` + `SKILL.md` mirrors the clause, and `structure/20_pabcd_dispatch_doctrine.md` + gains the worker row in its translation table (#172). + +### Added + +- DELEGATE-MODEL-LIST-01 (STRICT) in `cxc-pabcd` `references/delegation.md`: the + model-override list advertised by the host `spawn_agent` description is a hint, + not an allowlist, and is known to be incomplete. A user-named model is passed + through as given; only a real spawn rejection is evidence of unavailability; a + genuine failure is reported rather than silently substituted. Measured + 2026-09-14: `spawn_agent({ model: "devin/swe-2" })` spawned and ran to a final + message while the advertised list omitted that model, which had previously caused + a requested worker ratio to be re-planned around threads (#173). + + ## [0.2.27] - 2026-09-13 ### Added diff --git a/cli/package.json b/cli/package.json index 60e4b356..35567416 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/cli", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "codexclaw CLI — status, subagent config, provider toggle, GUI launcher.", diff --git a/devlog/_plan/260914_skill_doc_triage_release/000_plan.md b/devlog/_plan/260914_skill_doc_triage_release/000_plan.md new file mode 100644 index 00000000..4a1735a8 --- /dev/null +++ b/devlog/_plan/260914_skill_doc_triage_release/000_plan.md @@ -0,0 +1,68 @@ +# 000 — Ship the #170-#173 reference-doc fixes as codexclaw 0.2.28 + +## Objective + +Take the four skill-reference fixes already green on PR #174 through the full +promotion path — dev, then main, then a published Release — and close #170-#173. + +## Why this is a unit and not a fast-path record + +The code change itself is C1 (documentation only, no runtime behavior). The +DELIVERY is not: it crosses two protected-ish integration lines, regenerates the +release inventory, and ends in an irreversible publication whose gate fails closed. +UNIT-RESIDENCE-01 applies to the release, and LOOP-DOCS-FIRST-01 is STRICT for a +HOTL goal loop, so the roadmap is written to diff level before the first merge. + +## Constraints + +- User authorization (2026-09-14): run as cxc-loop, push dev, merge to main, and + deploy/release. Nothing wider. +- No local product suite, typecheck, build or install. The only admissible proof is + hosted CI at the exact head SHA plus the Release workflow's own gate. +- The release gate reads workflow conclusions BY SHA. A green run from a + neighbouring commit does not count. +- Do not implement the #175 branch-deletion fix in this unit. Report only. + +## Starting state (measured 2026-09-14) + +| Fact | Value | +|---|---| +| PR #174 | base `dev`, head `7036f9b8`, MERGEABLE / CLEAN, 14/14 checks pass | +| Version, every surface | `0.2.27` (manifest and inventory carry `+codex.20260913080217`) | +| Measured suite, hosted | `tests 3150` — CI run 34790437740, job 103813520900 | +| Published tests badge | `3,150` — already agrees, so the badge does not move | +| `dev` | recreated this session at `main` tip `9e279a45` after it was deleted | +| Open issues to close | #170, #171, #172, #173 | + +## Work-phase map + +| Phase | Deliverable | Doc | Depends on | +|---|---|---|---| +| wp1 | This roadmap, committed before any merge or version edit | `000` | — | +| wp2 | #174 merged to `dev`; exact-SHA CI + WSL + Packed install green on the new `dev` head | `010` | wp1 | +| wp3 | 0.2.28 prepared on `dev`: every version surface, CHANGELOG, regenerated inventory | `020` | wp2 | +| wp4 | Promotion PR merged to `main`; Release workflow publishes v0.2.28; #170-#173 closed; `dev` restored | `030` | wp3 | + +## Release path (docs-site/src/content/docs/development/release.md) + +1. Land on `dev`, green on that exact commit. +2. Bump every surface `check-versions.mjs` enumerates. +3. Regenerate the inventory with the measured test count. +4. Merge the `dev` -> `main` promotion PR. +5. Run the Release workflow against `main`. + +## Known hazard carried through every phase + +`delete_branch_on_merge` is **true** on this repository, and `dev` is not +protected. The promotion PR's head branch IS `dev`, so merging wp4 deletes `dev` +immediately. This already happened once after PR #169 and is why `dev` was missing +at the start of this session. wp4 therefore ends by recreating `dev` from `main`. +Issue #175 tracks the permanent fix; it is out of scope here. + +## Terminal outcomes + +DONE requires all eight registered criteria met with proof captured this session. +BLOCKED is a hosted check that fails and cannot be resolved in scope. NEEDS_HUMAN +is a burned version tag or a gate demand outside the authorized scope. UNSAFE is +any force-push of a shared branch or any fabricated receipt — never do either. + diff --git a/devlog/_plan/260914_skill_doc_triage_release/010_wp2_land_pr174_on_dev.md b/devlog/_plan/260914_skill_doc_triage_release/010_wp2_land_pr174_on_dev.md new file mode 100644 index 00000000..df7c0c84 --- /dev/null +++ b/devlog/_plan/260914_skill_doc_triage_release/010_wp2_land_pr174_on_dev.md @@ -0,0 +1,49 @@ +# 010 — wp2: land PR #174 on dev + +## Goal + +`dev` contains the four reference-doc fixes, and the resulting `dev` head SHA +carries its own green CI, WSL and Packed install lifecycle conclusions. + +## Precondition + +PR #174 is MERGEABLE / CLEAN at head `7036f9b8` with 14/14 checks passing. Re-read +it immediately before merging; do not trust the value recorded in `000`. + +## Action + + gh pr merge 174 -R lidge-jun/codexclaw --merge + +Merge commit, not squash: the repository's integration history uses merge commits +(`Merge pull request #169 from lidge-jun/dev`) and the promotion path reads that +shape. `delete_branch_on_merge` removes the topic branch +`codex/260914-skill-doc-triage-170-173` automatically, which is correct for a +topic branch. + +## Why a separate CI generation is required + +The PR checks ran against `7036f9b8`. Merging produces a NEW commit on `dev`, and +the release gate resolves conclusions by SHA. Workflow triggers: + +| Workflow | Runs on push to `dev` | Runs on PR | +|---|---|---| +| CI (`ci.yml`) | yes | yes | +| WSL (`wsl.yml`) | yes | **no** | +| Packed install (`packed-install.yml`) | yes | yes | + +WSL never ran for PR #174 by design, so the `dev` push is the FIRST evidence that +lane produces for this change. It is also the longest lane at 13-14 minutes. + +## Verification + + DEV_SHA=$(gh api repos/lidge-jun/codexclaw/commits/dev --jq .sha) + gh run list -R lidge-jun/codexclaw --commit "$DEV_SHA" + +Require conclusion `success` for CI, WSL and Packed install lifecycle at that SHA. +Record the SHA and the run ids as c-2 evidence. + +## Exit + +wp2 closes when `dev` head is green on all three lanes. A failure here is fixed +forward on `dev`; do not revert the merge. + diff --git a/devlog/_plan/260914_skill_doc_triage_release/020_wp3_prepare_0_2_28.md b/devlog/_plan/260914_skill_doc_triage_release/020_wp3_prepare_0_2_28.md new file mode 100644 index 00000000..99b293e9 --- /dev/null +++ b/devlog/_plan/260914_skill_doc_triage_release/020_wp3_prepare_0_2_28.md @@ -0,0 +1,66 @@ +# 020 — wp3: prepare codexclaw 0.2.28 on dev + +## Goal + +Every version surface reads `0.2.28`, the CHANGELOG describes the change, and the +inventory is regenerated from the measured hosted test count. + +## Version surfaces — the exact list `check-versions.mjs` enumerates + +`collectSurfaces()` builds this set. Build metadata (`+codex.`) is permitted +ONLY where marked; a plain surface carrying `+` is a violation. + +| # | Surface | Path | `0.2.27` -> `0.2.28` | Metadata | +|---|---|---|---|---| +| 1 | root package | `package.json` | `"version": "0.2.28"` | no | +| 2 | plugin manifest | `plugins/codexclaw/.codex-plugin/plugin.json` | `"version": "0.2.28+codex."` | **yes** | +| 3-11 | 9 components | `plugins/codexclaw/components/{bg-wake,config-guard,cxc-ops,messenger-bridge,pabcd-state,provider-bridge,recall,skill-search,subagent-config}/package.json` | `"version": "0.2.28"` | no | +| 12 | inventory package | `plugins/codexclaw/inventory.json` -> `plugin.packageVersion` | `"0.2.28"` | no | +| 13 | inventory manifest | `plugins/codexclaw/inventory.json` -> `plugin.manifestVersion` | `"0.2.28+codex."` | **yes** | + +`plugins/codexclaw/gui/package.json` and `cli/package.json` are declared workspaces +(`workspaces: ["plugins/codexclaw/components/*", "plugins/codexclaw/gui", "cli"]`) +but are NOT enumerated by `collectSurfaces()` — it walks `components/` only. Both +read `0.2.27` today. Bump both to `0.2.28` for consistency with the rest of the +workspace; the checker will not complain either way, so this is a tidiness rule, +not a gate. Do not invent a surface the checker does not read. + +Verify with: + + node plugins/codexclaw/scripts/check-versions.mjs 0.2.28 + +## Inventory regeneration + + node plugins/codexclaw/scripts/inventory.mjs --write --tests 3150 + +`3150` is the `tests` line from hosted CI run 34790437740, job 103813520900, at +head `7036f9b8` — NOT a local run and NOT the `pass` count, which is +environment-dependent because CI skips the repo-map live smoke. + +The published badge in `README.md`, `README.ko.md` and `README.zh.md` already reads +`3,150`, so this change adds no tests and the badge should not move. If +`--write` moves it, the count is wrong — re-measure rather than editing by hand. +`--write` also refreshes the inventory hash the release gate compares against. + +## CHANGELOG + +Insert a `## [0.2.28] - 2026-09-14` section directly under `## [Unreleased]`, in +the existing `### Fixed` / `### Added` voice. It must name all four issues and say +what an agent could not do before: + +- `add-criterion` missing from the documented CLI surface (#170) +- generated `c-N` criterion ids vs. the `--id` the doc implies (#171) +- in-lane workers are subagents, stated inside DISPATCH-SURFACE-01 (#172) +- DELEGATE-MODEL-LIST-01: the advertised override list is a hint (#173) + +## Delivery + +A single commit on a topic branch off `dev`, PR to `dev`, merged once green. +Do not commit directly to `dev`. + + Title: chore(release): prepare codexclaw 0.2.28 + +## Exit + +wp3 closes when the prep PR is merged and the new `dev` head is green on CI, WSL +and Packed install. diff --git a/devlog/_plan/260914_skill_doc_triage_release/030_wp4_promote_and_release.md b/devlog/_plan/260914_skill_doc_triage_release/030_wp4_promote_and_release.md new file mode 100644 index 00000000..03ede77f --- /dev/null +++ b/devlog/_plan/260914_skill_doc_triage_release/030_wp4_promote_and_release.md @@ -0,0 +1,84 @@ +# 030 — wp4: promote to main and publish v0.2.28 + +## Goal + +`main` carries 0.2.28, the Release workflow publishes it, #170-#173 close, and +`dev` survives. + +## Step 1 — promotion PR + + gh pr create -R lidge-jun/codexclaw --base main --head dev \ + --title "chore(release): promote codexclaw 0.2.28 to main" + +`enforce-target` requires PRs to target `dev`, with exactly one exemption: a +`dev` -> `main` PR whose head repo is this repository. A fork branch merely named +`dev` is not exempt, because the check compares `head.repo.full_name`. This PR +qualifies, so no `[WRONG BRANCH]` prefix should appear. If one does, the exemption +did not match and that is a real finding, not a cosmetic one. + +### `main` is ruleset-protected + +Ruleset `protect-main` (id 20884837, enforcement `active`, **no bypass actors**) +applies `deletion`, `non_fast_forward` and `required_status_checks` to +`refs/heads/main`. Six contexts are required: + + ci + artifact (ubuntu-latest) / artifact (windows-latest) / artifact (macos-latest) + install (ubuntu-latest) / install (macos-latest) + +`strict_required_status_checks_policy` is **false**, so the PR does not have to be +rebased onto the latest `main` before merging. No bypass actor exists, so +`--admin` is not available here — the six contexts must genuinely pass. Note that +WSL and the Windows `install` lane are NOT required contexts, so a red WSL lane +does not block the merge even though wp2 still wants it green as release evidence. + +Merge once green. Record the merge commit SHA on `main` — that SHA is what the +release dispatch must pin. + +## Step 2 — dev will be deleted; restore it + +`delete_branch_on_merge` is true and the promotion PR's head branch IS `dev`. +Merging deletes it, exactly as happened after PR #169. Immediately after the merge: + + git fetch origin --prune + git ls-remote --heads origin refs/heads/dev + # if absent: + git push origin origin/main:refs/heads/dev + +This satisfies c-8. The permanent fix is issue #175 and is out of scope here. + +## Step 3 — release dispatch + +Wait for CI, WSL and Packed install to conclude `success` on the `main` merge SHA +first. `cxc release verify` reads those conclusions by SHA and fails closed; a +dispatch before they finish reports `platform-ci is missing`. + + gh workflow run release.yml -R lidge-jun/codexclaw --ref main \ + -f version=0.2.28 -f prerelease=false -f dry_run=false \ + -f expected_sha=
+ +`expected_sha` is mandatory and exists because branches move between the audit and +the dispatch. Use `workflow_dispatch`, not the `push: tags` trigger. + +**Trap.** Ruleset `protect-release-tags` (id 20884836) applies `deletion`, +`non_fast_forward` and `update` to `refs/tags/v*` with no bypass actors, so a +version tag cannot be moved or removed once pushed. If a dispatch fails AFTER the +tag is pushed, `v0.2.28` is burned and cannot be reused; that is a NEEDS_HUMAN +outcome, not something to work around. Verified 2026-09-14: tags run to `v0.2.27` +and `v0.2.28` is still free. This is why the gate runs before publication and why +the dispatch is pinned to an audited SHA. + +## Step 4 — close the issues + +PR #174 carries `Closes #170`-`#173`, but it targeted `dev`. GitHub auto-closes +only on merge into the DEFAULT branch, which is `main`, so the promotion merge is +what closes them. Verify explicitly rather than assuming: + + gh issue view 170 -R lidge-jun/codexclaw --json state + +If any remain open, close them with a comment pointing at the release. + +## Exit + +wp4 closes when the Release workflow concluded `success`, GitHub Release `v0.2.28` +exists, #170-#173 are CLOSED, and `dev` resolves on the remote. diff --git a/package-lock.json b/package-lock.json index 8293c454..92619242 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "codexclaw", - "version": "0.2.27", + "version": "0.2.28", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codexclaw", - "version": "0.2.27", + "version": "0.2.28", "license": "MIT", "workspaces": [ "plugins/codexclaw/components/*", @@ -20,7 +20,7 @@ }, "cli": { "name": "@codexclaw/cli", - "version": "0.2.27", + "version": "0.2.28", "bin": { "codexclaw": "bin/codexclaw.mjs" } @@ -1953,43 +1953,43 @@ }, "plugins/codexclaw/components/bg-wake": { "name": "@codexclaw/bg-wake", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/config-guard": { "name": "@codexclaw/config-guard", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/cxc-ops": { "name": "@codexclaw/cxc-ops", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/messenger-bridge": { "name": "@codexclaw/messenger-bridge", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/pabcd-state": { "name": "@codexclaw/pabcd-state", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/provider-bridge": { "name": "@codexclaw/provider-bridge", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/recall": { "name": "@codexclaw/recall", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/skill-search": { "name": "@codexclaw/skill-search", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/components/subagent-config": { "name": "@codexclaw/subagent-config", - "version": "0.2.27" + "version": "0.2.28" }, "plugins/codexclaw/gui": { "name": "@codexclaw/gui", - "version": "0.2.27", + "version": "0.2.28", "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1" diff --git a/package.json b/package.json index aa4f2a6d..1c59c329 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codexclaw", - "version": "0.2.27", + "version": "0.2.28", "private": true, "description": "cli-jaw-style dev discipline + multi-model subagents for the OpenAI Codex runtime.", "type": "module", diff --git a/plugins/codexclaw/.codex-plugin/plugin.json b/plugins/codexclaw/.codex-plugin/plugin.json index e32e8bff..c69bd20f 100644 --- a/plugins/codexclaw/.codex-plugin/plugin.json +++ b/plugins/codexclaw/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "codexclaw", - "version": "0.2.27+codex.20260913080217", + "version": "0.2.28+codex.20260914090142", "description": "cli-jaw-style dev discipline (dev skills + PABCD) and multi-model subagents for the OpenAI Codex runtime, with optional opencodex provider routing.", "author": { "name": "lidge-jun", diff --git a/plugins/codexclaw/components/bg-wake/package.json b/plugins/codexclaw/components/bg-wake/package.json index 8149f16f..f7bc4c32 100644 --- a/plugins/codexclaw/components/bg-wake/package.json +++ b/plugins/codexclaw/components/bg-wake/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/bg-wake", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Background task registry + completion wake for Codex. Registers detached commands, then wakes the agent through the Stop hook when they finish.", diff --git a/plugins/codexclaw/components/config-guard/package.json b/plugins/codexclaw/components/config-guard/package.json index 84777db7..b85ee1bf 100644 --- a/plugins/codexclaw/components/config-guard/package.json +++ b/plugins/codexclaw/components/config-guard/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/config-guard", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Controlled feature-flag activation: enables only codexclaw's declared [features] flags via the official `codex features` CLI, with a revert manifest and backup.", diff --git a/plugins/codexclaw/components/cxc-ops/package.json b/plugins/codexclaw/components/cxc-ops/package.json index 0943d64a..749f9e2a 100644 --- a/plugins/codexclaw/components/cxc-ops/package.json +++ b/plugins/codexclaw/components/cxc-ops/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/cxc-ops", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "codexclaw ops CLI — doctor (plugin health), reset (scoped state cleanup).", diff --git a/plugins/codexclaw/components/messenger-bridge/package.json b/plugins/codexclaw/components/messenger-bridge/package.json index 7c4064ff..330e25cf 100644 --- a/plugins/codexclaw/components/messenger-bridge/package.json +++ b/plugins/codexclaw/components/messenger-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/messenger-bridge", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "codexclaw messenger bridge — cxc serve HTTP server + SQLite state substrate (zero third-party deps).", diff --git a/plugins/codexclaw/components/pabcd-state/package.json b/plugins/codexclaw/components/pabcd-state/package.json index 84594ab4..7fd08899 100644 --- a/plugins/codexclaw/components/pabcd-state/package.json +++ b/plugins/codexclaw/components/pabcd-state/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/pabcd-state", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "IPABCD finite-state machine backed by per-session .codexclaw/sessions/.json + shared ledger.jsonl.", diff --git a/plugins/codexclaw/components/provider-bridge/package.json b/plugins/codexclaw/components/provider-bridge/package.json index 7ccae716..9dbdda4a 100644 --- a/plugins/codexclaw/components/provider-bridge/package.json +++ b/plugins/codexclaw/components/provider-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/provider-bridge", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Detect-only opencodex (ocx) status probe at session start; graceful native path when absent.", diff --git a/plugins/codexclaw/components/recall/package.json b/plugins/codexclaw/components/recall/package.json index 5ac2f46b..492c8ae0 100644 --- a/plugins/codexclaw/components/recall/package.json +++ b/plugins/codexclaw/components/recall/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/recall", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Read-only chat/memory recall search over the Codex session root (~/.codex): date-pruned rollout scan + thread/memory sqlite enrichment.", diff --git a/plugins/codexclaw/components/skill-search/package.json b/plugins/codexclaw/components/skill-search/package.json index 9fce4382..d1a52605 100644 --- a/plugins/codexclaw/components/skill-search/package.json +++ b/plugins/codexclaw/components/skill-search/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/skill-search", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Remote dormant-skill search over cli-jaw-skills / Hermes / ClawHub / gh code search. Zero-dep, TTL-cached, adapter-preamble output. No local vendoring.", diff --git a/plugins/codexclaw/components/subagent-config/package.json b/plugins/codexclaw/components/subagent-config/package.json index 635828a1..73ee02d1 100644 --- a/plugins/codexclaw/components/subagent-config/package.json +++ b/plugins/codexclaw/components/subagent-config/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/subagent-config", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "Stores subagent model/prompt config; serves it to the GUI and an MCP tool.", diff --git a/plugins/codexclaw/gui/package.json b/plugins/codexclaw/gui/package.json index e84a39b1..7d2da05c 100644 --- a/plugins/codexclaw/gui/package.json +++ b/plugins/codexclaw/gui/package.json @@ -1,6 +1,6 @@ { "name": "@codexclaw/gui", - "version": "0.2.27", + "version": "0.2.28", "private": true, "type": "module", "description": "codexclaw local dashboard (Vite + React) — subagent config, prompts, provider link bar.", diff --git a/plugins/codexclaw/inventory.json b/plugins/codexclaw/inventory.json index 04f943ab..826d83d5 100644 --- a/plugins/codexclaw/inventory.json +++ b/plugins/codexclaw/inventory.json @@ -2,8 +2,8 @@ "schemaVersion": 1, "plugin": { "name": "codexclaw", - "manifestVersion": "0.2.27+codex.20260913080217", - "packageVersion": "0.2.27" + "manifestVersion": "0.2.28+codex.20260914090142", + "packageVersion": "0.2.28" }, "skills": [ { @@ -297,55 +297,55 @@ { "folder": "bg-wake", "packageName": "@codexclaw/bg-wake", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "config-guard", "packageName": "@codexclaw/config-guard", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "cxc-ops", "packageName": "@codexclaw/cxc-ops", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "messenger-bridge", "packageName": "@codexclaw/messenger-bridge", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "pabcd-state", "packageName": "@codexclaw/pabcd-state", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "provider-bridge", "packageName": "@codexclaw/provider-bridge", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "recall", "packageName": "@codexclaw/recall", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "skill-search", "packageName": "@codexclaw/skill-search", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true }, { "folder": "subagent-config", "packageName": "@codexclaw/subagent-config", - "version": "0.2.27", + "version": "0.2.28", "hasTests": true } ] diff --git a/plugins/codexclaw/skills/loop/SKILL.md b/plugins/codexclaw/skills/loop/SKILL.md index 4c013087..05497080 100644 --- a/plugins/codexclaw/skills/loop/SKILL.md +++ b/plugins/codexclaw/skills/loop/SKILL.md @@ -88,13 +88,14 @@ Keep explicit-only skills and leaf-safe delivery restrictions intact. task with its own goal and PABCD state, and with `environment: worktree` its own checkout — `environment: local` shares the project checkout instead. Work that needs its own branch, checkout, or merge/CI lane is thread work: N parallel lanes - means N worktree threads. Spawning N subagents for N branches puts N writers - on one HEAD. Concurrent subagents need non-overlapping write scopes and must - never run branch-level git operations at the same time. A request for parallel - branch or worktree lanes **is** the user request that creating those threads - needs — the lanes are the mechanism the work requires, so do not downgrade them - onto the shared tree to avoid creating tasks. If the shape is unclear, ask once - naming what you would create, then continue. + means N worktree threads, and the workers inside each lane are that lane's + subagents, not threads of their own. Spawning N subagents for N branches puts + N writers on one HEAD. Concurrent subagents need non-overlapping write scopes + and must never run branch-level git operations at the same time. A request for + parallel branch or worktree lanes **is** the user request that creating those + threads needs — the lanes are the mechanism the work requires, so do not + downgrade them onto the shared tree to avoid creating tasks. If the shape is + unclear, ask once naming what you would create, then continue. Details and the measured evidence: [Dispatch surfaces](../pabcd/references/dispatch-surfaces.md). - ORCH-MANDATE-01 (STRICT): a claimed active loop needs real persisted FSM evidence, not narrated phase names. Read actual session state before entry or re-entry. diff --git a/plugins/codexclaw/skills/loop/references/durable-goalplan.md b/plugins/codexclaw/skills/loop/references/durable-goalplan.md index 5dfff7e2..9cb034aa 100644 --- a/plugins/codexclaw/skills/loop/references/durable-goalplan.md +++ b/plugins/codexclaw/skills/loop/references/durable-goalplan.md @@ -57,8 +57,13 @@ This is the on-disk shape under `.codexclaw/goalplans//goalplan.json` Task ids and task dependency references are phase-local: `task.dependsOn` names existing task ids in the same work phase, never a task in another phase. A done task carries a non-empty `outcome`; a pending task has no outcome. -- `criteria[]` — each `{ id, scenario, expectedEvidence, capturedEvidence, status: open|met }`. - A criterion only reaches `met` when `capturedEvidence` is non-empty (fresh proof, not memory). +- `criteria[]` — each `{ id, scenario, surface, expectedEvidence, capturedEvidence, status: open|met }`. + `scenario` is the `--criterion` text and `surface` comes from `--surface` (default + `logic`); `id` is auto-assigned and `status` is derived. `expectedEvidence` has no + CLI flag on `add-criterion` — it stays `""` unless set via a steering batch op or a + hand edit — so do not plan on passing it. `capturedEvidence` is written by + `meet-criterion --evidence`. A criterion only reaches `met` when `capturedEvidence` + is non-empty (fresh proof, not memory). - `host` — `GoalplanHostLink { armed, armedAt, source: freeze|none }`. `armed` is provenance, intended to read true only after a freeze-boundary arm (the MAIN session created a host goal). No shipped CLI flips it automatically and codexclaw never writes the goal DB itself; treat it @@ -66,17 +71,23 @@ This is the on-disk shape under `.codexclaw/goalplans//goalplan.json` ### CLI surface -- `cxc loop init --objective "" [--session ]` — creates the local - artifact and binds it to the session when a session id is supplied; it never - writes the host goal DB. +- `cxc loop init --objective "" [--session ] [--criterion ]...` — + creates the local artifact and binds it to the session when a session id is + supplied; it never writes the host goal DB. Repeat `--criterion` once per + criterion to register them at init. - `cxc loop show --slug ""` — renders the current plan summary. - `cxc loop validate --slug ""` — runs the E8 quality gate; it FAILS unless the plan is complete and every `met` criterion carries `capturedEvidence`. - `cxc loop ready (--slug | --objective | --session ) [--json]` - `cxc loop add-work-phase --session --id --title [--depends-on ]...` - `cxc loop add-task --session --work-phase --id --title [--depends-on ]...` +- `cxc loop add-criterion --session --criterion [--surface logic|web|tui]` — + registers a criterion whose scenario is the `--criterion` text. There is no `--id`: + ids are assigned as `c-1`, `c-2`, ... (max existing `c-N` + 1, in registration + order). A duplicate scenario text is rejected. - `cxc loop complete-task --session --work-phase --id --outcome ` -- `cxc loop meet-criterion --session --id --evidence ` +- `cxc loop meet-criterion --session --id --evidence ` — `--id` takes + a generated `c-N` id; read it from `cxc loop show` or the goalplan file. - `cxc goalplan *` — deprecated alias for the same behavior during migration. Repeat `--depends-on` once per prerequisite; comma-separated values are one id. Existing dependencies are diff --git a/plugins/codexclaw/skills/pabcd/references/delegation.md b/plugins/codexclaw/skills/pabcd/references/delegation.md index 0f0b2474..2d4e76cc 100644 --- a/plugins/codexclaw/skills/pabcd/references/delegation.md +++ b/plugins/codexclaw/skills/pabcd/references/delegation.md @@ -140,6 +140,16 @@ The schema marks no argument required, but the runtime still rejects a spawn carrying neither `message` nor `items`. `nickname` is a display label: never address an agent by it. A completed agent holds a concurrency slot until closed. +**DELEGATE-MODEL-LIST-01 (STRICT).** The model-override list in the host tool +description is a hint, not an allowlist, and is known to be incomplete. When the +user names a worker model, pass it through as given. Only a real spawn rejection +is evidence of unavailability; absence from the description is not. If a +requested model genuinely fails to spawn, say so to the user — do not substitute +a different model and silently re-plan the ratio. Measured on 2026-09-14: +`spawn_agent({ model: "devin/swe-2" })` returned `{ agent_id, nickname }` and +the child ran to a final message on the parent's branch, while the advertised +list still omitted it; re-confirmed the same day in a second session. + ### V2 — the task-shaped family | Concern | V2 | diff --git a/plugins/codexclaw/skills/pabcd/references/dispatch-surfaces.md b/plugins/codexclaw/skills/pabcd/references/dispatch-surfaces.md index 4c24fdb2..3f6b07f1 100644 --- a/plugins/codexclaw/skills/pabcd/references/dispatch-surfaces.md +++ b/plugins/codexclaw/skills/pabcd/references/dispatch-surfaces.md @@ -22,6 +22,10 @@ Isolation comes from the environment, not from being a task. A `local` thread is an independent owner sharing one checkout; a `worktree` thread is an independent owner with its own. Lane work needs the second. +A **lane** is thread work; a **worker inside a lane** is subagent work. N lanes +means N worktree threads, and the workers inside each lane are that lane's +subagents — they cannot collide across lanes because the worktrees differ. + Say which one you are creating, in those words, before you create it. ## What actually differs @@ -76,6 +80,8 @@ Route by what the work needs to own, not by how parallel it is: one per lane, created with `environment: worktree`. A `local` thread does not give the lane a checkout of its own. - Needs its own goal or its own PABCD cycle -> **thread**. +- Is a bounded slice inside a lane that already owns its checkout -> **subagent** + of that lane's thread. - Is a bounded slice of the tree you are already editing, returning evidence or a patch rather than owning a branch -> **subagent**. - Is read-only research -> **subagent**, by default. It cannot collide because it diff --git a/structure/20_pabcd_dispatch_doctrine.md b/structure/20_pabcd_dispatch_doctrine.md index d1d8fad7..ef76fcbb 100644 --- a/structure/20_pabcd_dispatch_doctrine.md +++ b/structure/20_pabcd_dispatch_doctrine.md @@ -28,6 +28,7 @@ move; the machinery does not. | Boss agent | the main Codex session (you) | | Employee (`cli-jaw dispatch --agent`) | a Codex `spawn_agent` subagent (`explorer`/`worker`) — a leaf in the parent's own working directory, no goal, no FSM | | A parallel lane that owns its own branch/checkout | a separate Codex task (`create_thread`) with its own worktree, goal and FSM — not a subagent | +| A worker inside one of those lanes | a `spawn_agent` subagent of that lane's thread, running in that lane's worktree — workers are not lanes | | Employee registry (server) | role TOMLs in `plugins/codexclaw/agents/` (prompt sources only) | | `cli-jaw orchestrate I/P/A/B/C/D` (HTTP) | `cxc orchestrate I/P/A/B/C/D` (agent-gated CLI over `.codexclaw/`) | | `--attest` gate (`orchestrator/attestation.ts`) | `cxc orchestrate --attest` (same JSON gate) |