projectstore-claude 0.30.2 β†’ 0.30.4

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.
Files changed (32) hide show
  1. package/node_modules/projectstore/.claude-plugin/marketplace.json +1 -1
  2. package/node_modules/projectstore/.claude-plugin/plugin.json +1 -1
  3. package/node_modules/projectstore/AGENTS.md +7 -5
  4. package/node_modules/projectstore/README.md +3 -3
  5. package/node_modules/projectstore/agents/clerk.md +2 -2
  6. package/node_modules/projectstore/commands/agents.md +43 -28
  7. package/node_modules/projectstore/commands/bind.md +1 -1
  8. package/node_modules/projectstore/commands/doctor.md +19 -3
  9. package/node_modules/projectstore/commands/reconcile.md +2 -2
  10. package/node_modules/projectstore/commands/review.md +1 -1
  11. package/node_modules/projectstore/commands/story.md +2 -1
  12. package/node_modules/projectstore/docs/getting-started.md +1 -1
  13. package/node_modules/projectstore/docs/harnesses.md +3 -2
  14. package/node_modules/projectstore/harnesses/claude-code.json +40 -1
  15. package/node_modules/projectstore/harnesses/codex.json +50 -14
  16. package/node_modules/projectstore/package.json +1 -1
  17. package/node_modules/projectstore/scripts/agents-change.mjs +64 -10
  18. package/node_modules/projectstore/scripts/build-adapters.mjs +28 -13
  19. package/node_modules/projectstore/scripts/cli.mjs +32 -9
  20. package/node_modules/projectstore/scripts/configure-menu.mjs +133 -6
  21. package/node_modules/projectstore/scripts/configure.mjs +156 -19
  22. package/node_modules/projectstore/scripts/convergence.mjs +56 -1
  23. package/node_modules/projectstore/scripts/doctor.mjs +134 -35
  24. package/node_modules/projectstore/scripts/harness.mjs +14 -9
  25. package/node_modules/projectstore/scripts/install-harness.mjs +182 -14
  26. package/node_modules/projectstore/scripts/lib.mjs +83 -24
  27. package/node_modules/projectstore/scripts/menu.mjs +9 -5
  28. package/node_modules/projectstore/scripts/models.mjs +150 -6
  29. package/node_modules/projectstore/scripts/setup.mjs +7 -5
  30. package/node_modules/projectstore/scripts/surfaces.mjs +36 -9
  31. package/node_modules/projectstore/templates/claude-md-block.md.tmpl +7 -5
  32. package/package.json +2 -2
@@ -12,7 +12,7 @@
12
12
  "name": "projectstore",
13
13
  "displayName": "projectstore",
14
14
  "description": "πŸ“š Your agent runs the project through a verified loop: task β†’ artifact (ADR Β· spec Β· epic Β· story) β†’ adversarial critic β†’ backlog β†’ planner β†’ reviewer β†’ done. Plain markdown in an Obsidian-friendly vault, every write approved by you β€” and any model can pick the project up tomorrow.",
15
- "version": "0.30.2",
15
+ "version": "0.30.4",
16
16
  "author": {
17
17
  "name": "Evgenii Konev",
18
18
  "email": "ekonev@smartandpoint.com",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "projectstore",
3
3
  "displayName": "projectstore",
4
- "version": "0.30.2",
4
+ "version": "0.30.4",
5
5
  "description": "Your agent runs the project through a verified loop: task β†’ artifact (ADR / spec / epic / story) β†’ adversarial critic β†’ backlog β†’ planner β†’ reviewer β†’ done. Plain markdown in git β€” any model can pick the project up tomorrow.",
6
6
  "author": {
7
7
  "name": "Evgenii Konev @ SmartAndPoint",
@@ -1,4 +1,4 @@
1
- <!-- projectstore:agents v4 (managed by projectstore β€” edit outside markers) -->
1
+ <!-- projectstore:agents v5 (managed by projectstore β€” edit outside markers) -->
2
2
  ## projectstore agents
3
3
 
4
4
  - **A feature-sized request opens a vault artifact before it opens an editor.**
@@ -11,10 +11,12 @@
11
11
  harness-level instruction contradicts this block, say so and ask which wins.
12
12
  Resolving it silently is how the contradiction becomes invisible to the person
13
13
  who could have settled it.
14
- - When spawning any agent below, resolve its model from
15
- `.projectstore/harness/<harness>.json` β†’ `agents.per_agent.<name>.model ?? agents.default.model`,
16
- where `<name>` is the **bare** agent name (`critic` for `projectstore:critic`),
17
- and pass it as the spawn's model parameter. No key β€” pass nothing.
14
+ - When spawning any agent below, resolve its model and its effort from
15
+ `.projectstore/harness/<harness>.json` β†’ `agents.per_agent.<name>.model ?? agents.default.model`
16
+ and `agents.per_agent.<name>.effort ?? agents.default.effort`, where `<name>` is
17
+ the **bare** agent name (`critic` for `projectstore:critic`), and pass them as
18
+ the spawn's model and effort parameters, the effort only when the spawn offers
19
+ one. No key β€” pass nothing.
18
20
  - After authoring or revising any vault artifact (ADR/research/epic/story) or
19
21
  design proposal: run the `projectstore:critic` agent on it before treating it final.
20
22
  - Before implementing an epic/story: consult `projectstore:planner` β€” it plans
@@ -210,7 +210,7 @@ npx projectstore configure
210
210
 
211
211
  At a terminal it opens a settings menu that works like a monitor's: ↑ and ↓ move, β†’ opens a group or a setting in a frame beside it, space chooses, ← goes back, and Enter shows the plan. A second Enter writes it. Under the frames, a few lines say what the row under the cursor means. The settings:
212
212
 
213
- - each agent's model, per harness. Claude Code offers its aliases: `fable`, `opus`, `sonnet` and `haiku`. Codex offers its own list of models, with its descriptions. With `ANTHROPIC_API_KEY` set, each alias also names the newest model of its line. A list is kept for a day in projectstore's user cache, and "refresh the list" asks again;
213
+ - each agent's model and effort, per harness. Claude Code offers its aliases: `fable`, `opus`, `sonnet` and `haiku`. Codex offers its own list of models, with its descriptions. With `ANTHROPIC_API_KEY` set, each alias also names the newest model of its line. A list is kept for a day in projectstore's user cache, and "refresh the list" asks again. Each agent's effort sits under its model: Claude Code's levels, `low` to `max`, or the levels that Codex model lists. With none set, a Claude Code agent runs at its frontmatter's level (`max`, the clerk `low`) and a Codex one at its model's own default;
214
214
  - the status line and the band above the prompt (Claude Code);
215
215
  - the vault's template language, the default author and tags;
216
216
  - the vault's spec policy and lifecycle gates.
@@ -221,11 +221,11 @@ Without a terminal it prints every setting with its current value and where it l
221
221
  npx projectstore configure --set agents.critic=fable --set statusline=on
222
222
  ```
223
223
 
224
- `--dry-run` shows the plan and writes nothing, and `--json` returns the settings as one envelope. In a project that uses two harnesses, an agent's model names its overlay with `--harness <id>`.
224
+ An agent's effort is its own key: `--set agents.critic.effort=xhigh`. `--dry-run` shows the plan and writes nothing, and `--json` returns the settings as one envelope. In a project that uses two harnesses, an agent's model or effort names its overlay with `--harness <id>`.
225
225
 
226
226
  Each setting has exactly one writer, and the plan says which file it changes:
227
227
 
228
- - **The agents' models** live in `.projectstore/harness/<harness>.json`. That file is committed, so a change there is a team change.
228
+ - **The agents' models and efforts** live in `.projectstore/harness/<harness>.json`. That file is committed, so a change there is a team change.
229
229
  - **The status line, the band, the language and the other binding keys** live in `.projectstore/projectstore.json`, which stays on this machine.
230
230
  - **The spec policy and the lifecycle gates** live in the vault's `.projectstore.json`, which commits with the vault. Setting `spec_policy=required` records when it took effect; stories closed before then are exempt.
231
231
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  name: clerk
3
- description: Sonnet (max-effort) write ceremony executor for projectstore vaults β€” the roster's sole write-capable agent, and its least autonomous. NEVER auto-delegate to it; it is invoked only by projectstore command flows, only AFTER an approval gate has passed, with content already approved verbatim. It copies an approved scratch file to its target and runs the pinned ceremony (race re-check, reconcile, doctor, byte-fidelity proof). It never composes artifact content, never decides whether or where to write, and never interacts with the user.
3
+ description: Sonnet (low-effort) write ceremony executor for projectstore vaults β€” the roster's sole write-capable agent, and its least autonomous. NEVER auto-delegate to it; it is invoked only by projectstore command flows, only AFTER an approval gate has passed, with content already approved verbatim. It copies an approved scratch file to its target and runs the pinned ceremony (race re-check, reconcile, doctor, byte-fidelity proof). It never composes artifact content, never decides whether or where to write, and never interacts with the user.
4
4
  model: sonnet
5
- effort: max
5
+ effort: low
6
6
  tools: Read, Grep, Glob, Bash, Write
7
7
  ---
8
8
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: Manage bundled-agent integration in this project β€” register/unregister the routing block in CLAUDE.md/AGENTS.md, inspect state, or configure which model its agents run on.
2
+ description: Manage bundled-agent integration in this project β€” register/unregister the routing block in CLAUDE.md/AGENTS.md, inspect state, or configure which model each of its agents runs on and at what effort.
3
3
  argument-hint: "<register | unregister | status | configure>"
4
4
  ---
5
5
 
@@ -12,7 +12,10 @@ subcommand (`.projectstore/projectstore.json`; else point to `/projectstore:bind
12
12
  1. **Ask** via AskUserQuestion: "Register projectstore's agents in
13
13
  CLAUDE.md/AGENTS.md so every session routes to them (critic after
14
14
  authoring artifacts, planner before implementing, reviewer before commit)?
15
- [Yes / No]". On No, stop.
15
+ [Yes / No]". On No, stop. When the block is already there marked newer
16
+ than this copy's template (doctor's info, or `status` showing
17
+ `ours-newer`), name both numbers in the question: registering writes this
18
+ copy's older block over the one marked vN.
16
19
  2. **Run the verb** and print its output verbatim:
17
20
  ```bash
18
21
  node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" install --harness claude-code --surface agents_block --project "${CLAUDE_PROJECT_DIR}"
@@ -53,21 +56,21 @@ subcommand (`.projectstore/projectstore.json`; else point to `/projectstore:bind
53
56
 
54
57
  Run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" plan --json --surface agents_block --project "${CLAUDE_PROJECT_DIR}"`
55
58
  and report each item's `state` from `result.items[]` β€” the bin wraps the plan in its envelope (`ours-current`, `ours-stale` with its reason,
56
- `ours-absent`, or a refusal). Then:
59
+ `ours-newer` β€” marked above this copy's template: install, upgrade and setup leave it, and a named run such as `register` writes this copy's over it β€” `ours-absent`, or a refusal). Then:
57
60
 
58
61
  - Block: present in which file, marker version vs the installed template, agent
59
62
  names vs the layout roster.
60
63
  - Model: run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents show --json --project "${CLAUDE_PROJECT_DIR}"`
61
64
  and report `result.resolved` β€” per roster agent, the model the verb would
62
65
  pass and its `source` (`per_agent`, `default`, or `null`: the agent's own
63
- frontmatter), resolved by the verb over the active harness's overlay
66
+ frontmatter), and the effort with its `effort_source` the same way, resolved by the verb over the active harness's overlay
64
67
  (`result.path`) so nothing here re-derives it; `result.unknown` (configured
65
68
  names no roster agent carries β€” nothing runs under them), `result.rejected`
66
69
  (keys the overlay may not carry) and `result.agents_in_binding` (a pre-0.28
67
70
  leftover; point at `upgrade`), and
68
71
  whether `CLAUDE_CODE_SUBAGENT_MODEL` is set (it overrides everything) and
69
- whether `CLAUDE_CODE_EFFORT_LEVEL` is set (ADR-008 makes it the only thing that
70
- can move the agents off `effort: max`, and it beats frontmatter). **Warn when
72
+ whether `CLAUDE_CODE_EFFORT_LEVEL` is set (it outranks every configured effort
73
+ and the frontmatter: with it set, the spawn offers no effort parameter). **Warn when
71
74
  `result.resolved.clerk.model` is anything but `sonnet` or `haiku`** (that
72
75
  literal pair is the rule, so it is never re-derived; an unknown custom id also
73
76
  warns, with "verify it is cheap"): the clerk transcribes approved
@@ -79,7 +82,7 @@ and report each item's `state` from `result.items[]` β€” the bin wraps the plan
79
82
  and point at `configure` to clean them up β€” do not present them as the active
80
83
  configuration, because they are not.
81
84
 
82
- ## `configure` β€” model per invocation, recorded in config (ADR-008)
85
+ ## `configure` β€” model and effort per invocation, recorded in config (ADR-008; the effort ADR)
83
86
 
84
87
  > **Why there are no override copies here.** ADR-003 wrote
85
88
  > `<project>/.claude/agents/<name>.md` believing an equal `name:` shadows the
@@ -97,14 +100,15 @@ and report each item's `state` from `result.items[]` β€” the bin wraps the plan
97
100
  effort. The one exception is the clerk, which only transcribes approved
98
101
  content β€” it stays cheap regardless of the preset."* Options: keep bundled default (`opus`) / `fable` / `sonnet` /
99
102
  custom model ID (free-form). Offer the current session's model as a hint
100
- option β€” you know what you are running on. **Do not ask about effort** β€” see
101
- step 5. **`inherit` is no longer offered**: it meant "follow the session's
103
+ option β€” you know what you are running on. Then ask the effort for the
104
+ preset β€” `low` / `medium` / `high` / `xhigh` / `max`, or "leave it to the
105
+ frontmatter" (`max`) β€” see step 5. **`inherit` is no longer offered**: it meant "follow the session's
102
106
  model", and that cannot be expressed per invocation β€” passing nothing falls
103
107
  through to the bundled `model: opus`, not to the session. A user who wants
104
108
  session-follow behaviour should pick their session's model explicitly, or set
105
109
  `CLAUDE_CODE_SUBAGENT_MODEL=inherit`, which does mean exactly that.
106
- 2. **Optional follow-up**: "configure individually?" β†’ per-agent model for each
107
- roster agent. Skippable.
110
+ 2. **Optional follow-up**: "configure individually?" β†’ per-agent model and
111
+ effort for each roster agent. Skippable.
108
112
  3. **Apply**: after the AskUserQuestion, run the verb and print its output β€”
109
113
  `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents configure --harness claude-code --default <model> [--agent <name>=<model> …] --project "${CLAUDE_PROJECT_DIR}"`
110
114
  (naming the harness is the confirmation; the verb writes
@@ -120,24 +124,31 @@ and report each item's `state` from `result.items[]` β€” the bin wraps the plan
120
124
  the emptied block. A name outside the layout's roster is a usage error
121
125
  naming the roster β€” a model written under a name no agent carries would
122
126
  never run. That file is the whole output of this command β€” **never write
123
- an agent copy into `.claude/agents/`**. The verb never writes an `effort`
124
- key; one already inside the agents block is dropped by the next `configure`
125
- write and named in its preview, and until then doctor reports it as a key the
126
- overlay may not carry β€” it has no effect (the effort you configured is not
127
- the effort that runs).
127
+ an agent copy into `.claude/agents/`**. `agents configure` keeps every
128
+ effort the overlay holds; `--reset` drops them with the models.
129
+ **Efforts** chosen in steps 1–2 are written by `configure`, the one verb
130
+ with effort keys β€” preview first, then apply after the same approval:
131
+ `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" configure --set agents.default.effort=<level> [--set agents.<name>.effort=<level> …] --harness claude-code --dry-run --project "${CLAUDE_PROJECT_DIR}"`,
132
+ then the same command without `--dry-run`. `-` as the level clears one. A
133
+ default effort with no clerk effort named pins the clerk's effort to `low`
134
+ and says so, as a default model pins its model: the clerk transcribes.
128
135
  4. **Migrate away from copies**: if `.claude/agents/` holds copies carrying
129
136
  `# source: projectstore v…`, they are pre-ADR-008 leftovers that override
130
137
  nothing. Offer to delete them **one approval per file** (matching `/projectstore:doctor --fix`), project scope only β€” a copy in `~/.claude/agents/` needs a manual removal, and you should say so rather than implying this command will handle it.
131
138
  Copies WITHOUT the provenance marker are user-authored β€” never touch them,
132
139
  never mention deleting them.
133
- 5. **Effort is not configurable per project.** The bundled agents ship
134
- `effort: max`, which is the recommended value, and there is no
135
- per-invocation effort parameter β€” only frontmatter, settings, or
136
- `CLAUDE_CODE_EFFORT_LEVEL`. If the user asks for a different effort, say
137
- that plainly and point at the env var; do not write a copy to achieve it.
140
+ 5. **Effort rides the spawn, like the model.** The overlay's
141
+ `agents.per_agent.<name>.effort ?? agents.default.effort` is passed as the
142
+ spawn's effort parameter; with none, the bundled agents run at their
143
+ frontmatter's `effort: max`, and the clerk at its `effort: low`. A level outside `low`, `medium`, `high`,
144
+ `xhigh`, `max` is written with a warning and refused by the spawn. Do not
145
+ write a copy to achieve an effort.
138
146
  6. **Honesty notes to print**: an org `availableModels` allowlist silently
139
147
  downgrades excluded models; the `CLAUDE_CODE_SUBAGENT_MODEL` env var
140
- overrides everything configured here, per-invocation parameter included.
148
+ overrides everything configured here, per-invocation parameter included;
149
+ `CLAUDE_CODE_EFFORT_LEVEL` overrides every configured effort, and a
150
+ `maxEffortLevel` setting or an organization's effort cap still limits the
151
+ level an agent runs at.
141
152
  `/projectstore:doctor` validates config shape and reports leftover copies β€”
142
153
  not entitlement, and not whether a given spawn actually passed the model.
143
154
  7. **No restart is needed** β€” nothing about the agent list changed. The model
@@ -154,16 +165,17 @@ node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model <name> --json --p
154
165
  ```
155
166
 
156
167
  and passes `result.model` as the spawn's model parameter β€” `null` means pass
157
- nothing, the agent's own frontmatter decides. The verb applies
158
- `agents.per_agent.<name>.model ?? agents.default.model ?? null` over
168
+ nothing, the agent's own frontmatter decides β€” and `result.effort` as its
169
+ effort parameter when it is not `null` and the spawn offers one. The verb applies
170
+ `agents.per_agent.<name>.model ?? agents.default.model ?? null` (and the same
171
+ two terms for `effort`) over
159
172
  `<project>/.projectstore/harness/<harness>.json` (the active harness's
160
173
  overlay); besides the agents block itself (harness-neutral prose with no bin
161
174
  to call β€” it states the rule as a file read, deliberately), nothing else
162
175
  restates that rule. Never guess a model.
163
176
 
164
177
  `agents.default` is optional and often absent (a per-agent-only config is normal);
165
- the resolution must tolerate that. An `effort` key, if present, is a pre-ADR-008
166
- leftover: ignore it.
178
+ the resolution must tolerate that, and so must an effort set without a model.
167
179
 
168
180
  **Coverage, stated honestly.** This reaches spawns made by this plugin's commands
169
181
  and spawns a session makes while following the registration block. It does *not*
@@ -174,7 +186,10 @@ path, at the cost of applying to every subagent on the machine.
174
186
 
175
187
  ## Notes
176
188
 
177
- - Uninstalling the plugin removes these commands but NOT the block β€” run
189
+ - `/plugin uninstall` removes these commands but NOT the block β€” run
178
190
  `unregister` first, or delete everything between the
179
- `<!-- projectstore:agents -->` markers by hand.
191
+ `<!-- projectstore:agents -->` markers by hand. From a terminal in the
192
+ project, the package's bare `uninstall` removes the block too. A one-harness
193
+ `--harness` run keeps a block in `AGENTS.md` that another harness still
194
+ reads; `uninstall --surface agents_block` removes it outright.
180
195
  - Never write any file without AskUserQuestion approval.
@@ -111,7 +111,7 @@ Steps:
111
111
 
112
112
  8. **Agent registration** (v0.13, ADR-002): ask via AskUserQuestion β€” "Register projectstore's agents in CLAUDE.md/AGENTS.md so every session routes to them (critic after authoring artifacts, planner before implementing, reviewer before commit)? [Yes (Recommended) / No]". On Yes, run `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" install --harness claude-code --surface agents_block --project "${CLAUDE_PROJECT_DIR}"` and print its output (it renders from the layout's roster, migrates rather than duplicates, previews every write, and applies because the harness is named). On a rebind where a block already exists the verb reports it current or replaces it in place β€” do not re-ask blindly.
113
113
 
114
- 9. **Agent model preset** (v0.13, ADR-003; mechanism per ADR-008): ask via AskUserQuestion β€” include this line in the question text: *"These agents don't write code β€” they are critics, planners, and reviewers; they perform best on strong models at high effort."* Options: **Keep bundled default β€” opus** (Recommended) / **fable** / **sonnet**. Do not offer `inherit` β€” it cannot be expressed per invocation (see `commands/agents.md`). Do not offer effort β€” it is not configurable per project (the bundled agents already run at `max`). Free-form model IDs and per-agent tuning live in `/projectstore:agents configure` β€” mention it. A non-default choice runs the `configure` apply flow from `commands/agents.md`, which writes the config only β€” **never an agent copy**. Skippable.
114
+ 9. **Agent model preset** (v0.13, ADR-003; mechanism per ADR-008): ask via AskUserQuestion β€” include this line in the question text: *"These agents don't write code β€” they are critics, planners, and reviewers; they perform best on strong models at high effort."* Options: **Keep bundled default β€” opus** (Recommended) / **fable** / **sonnet**. Do not offer `inherit` β€” it cannot be expressed per invocation (see `commands/agents.md`). Do not ask effort here β€” until one is set, the bundled agents run at their frontmatter's `max`, and the clerk at `low`. Free-form model IDs, per-agent tuning and each agent's effort live in `/projectstore:agents configure` β€” mention it. A non-default choice runs the `configure` apply flow from `commands/agents.md`, which writes the config only β€” **never an agent copy**. Skippable.
115
115
 
116
116
  10. **Print summary**: confirm the bind, list the layout's folders, suggest next commands (`/projectstore:status`, `/projectstore:adr "<first decision>"`, `/projectstore:epic <ID> "<title>"`).
117
117
 
@@ -42,6 +42,10 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
42
42
  the verb adds the import. For another harness the finding names its own
43
43
  `--harness`; relay that command. Never Edit or Write the block yourself β€”
44
44
  the verb is its only writer (install spec, contract 6).
45
+ - `agents-block` **info** that the block is "marked vN, newer than this
46
+ copy's vM" β†’ **report only.** Install, upgrade and setup leave such a block as it is (install spec, contract 6 as amended
47
+ 2026-10-14). Relay the finding and its command verbatim; run it only if
48
+ the user asks, because it writes this copy's older block over the one marked vN.
45
49
  - `statusline` issues β†’ offer running `/projectstore:statusline on|off`,
46
50
  which installs or removes the entry and the launcher behind a preview
47
51
  (the SessionStart hook only refreshes an entry that already exists), and
@@ -106,13 +110,21 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
106
110
  verbatim, run from a terminal outside this session.
107
111
  - `overlay-forbidden-key` / `overlay-unparseable` (issue) β†’
108
112
  `.projectstore/harness/<id>.json` carries a key an overlay may not (only
109
- `agents.default.model` and `agents.per_agent.<name>.model` are read) or is
113
+ `agents.default.model`, `agents.default.effort`,
114
+ `agents.per_agent.<name>.model` and `agents.per_agent.<name>.effort` are
115
+ read) or is
110
116
  not JSON. Print the finding. A key inside the agents block goes away on the
111
117
  next `/projectstore:agents configure` write; a key outside it, and a parse
112
118
  error, are the user's to edit β€” never rewrite the file yourself.
113
119
  - `overlay-unknown-agent` (warn) β†’ the overlay configures a name no roster
114
120
  agent carries (a typo, or a newer package's agent): nothing runs under it.
115
- Point at `/projectstore:agents configure` with the roster's names.
121
+ Point at `/projectstore:agents configure` with the roster's names; a name
122
+ outside the roster is refused by both writers, so removing one is
123
+ `agents configure --reset` or the user's own edit of the file.
124
+ - `overlay-unknown-effort` (warn) β†’ the overlay sets an effort the harness's
125
+ levels lack (a typo, or a leftover such as `Max`): a spawn may refuse it.
126
+ Point at `/projectstore:agents configure`, which writes efforts through
127
+ `configure --set agents.<name>.effort=<level>`; `-` clears one.
116
128
  - `plugin-registration` (info) β†’ nothing to repair; it names where the npm
117
129
  registration loads from. As an **issue** β€” stale, or two enabled copies β€”
118
130
  print the finding and relay its command verbatim (the package runner's
@@ -128,7 +140,11 @@ You are running projectstore diagnostics (ADR-005: umbrella doctor).
128
140
  - `harness` (info) β†’ nothing to repair; it names what `install` can target.
129
141
  - `mcp` β†’ the plugin-bundled `.mcp.json` is missing or does not launch
130
142
  `bin/projectstore.mjs mcp`: the install is incomplete β€” the fix is the
131
- host's update path (`/plugin update`), never a hand-written file.
143
+ update for the channel this copy was installed through (`/plugin update`
144
+ for a git-marketplace copy; for the npm registration, the package's
145
+ `upgrade` from a terminal in the project, outside this session β€” the
146
+ `plugin-registration` finding spells the command), never a hand-written
147
+ file.
132
148
  - `override-copies` β†’ a copy carrying the provenance marker overrides nothing
133
149
  (ADR-008): offer to **delete** it (approval-gated, one prompt per file), and
134
150
  say that `/projectstore:agents configure` now records the model in
@@ -38,8 +38,8 @@ You are reconciling the vault's derived views with their source of truth (frontm
38
38
  content is authored by the context-holder, the write ceremony by a clerk").
39
39
  When the approved set contains two or more targets, hand steps 6-7 to
40
40
  `projectstore:clerk`: pass the exact selector list from step 4's preview and
41
- the expectation that doctor ends clean. **Model (ADR-008)**: resolve
42
- the model with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing);
41
+ the expectation that doctor ends clean. **Model and effort (ADR-008)**: resolve
42
+ them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing), and `result.effort` as its effort parameter when it is not `null` and the spawn offers one;
43
43
  missing key, `inherit`, or unreadable config β†’ pass nothing and let the
44
44
  agent's own frontmatter decide; never guess a model. The clerk applies
45
45
  through the core exactly as step 6 specifies and reports per target. A single
@@ -64,7 +64,7 @@ You are running a peer review on a projectstore artifact.
64
64
 
65
65
  Set the agent description to: `Peer-review of {{kind}} artifact at {{path}}`. Pass it as a foreground task (you need the result to continue).
66
66
 
67
- **Model (ADR-008)**: resolve it with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model critic --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing). Missing key, `inherit`, or unreadable config β†’ pass nothing and let the agent's own frontmatter decide; never guess a model. This is the only way the configured model reaches the agent β€” there are no override copies (`/projectstore:agents configure`). When falling back to `oh-my-claudecode:critic` or `general-purpose`, pass the same model.
67
+ **Model and effort (ADR-008)**: resolve them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model critic --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing), and `result.effort` as its effort parameter when it is not `null` and the spawn offers one. Missing key, `inherit`, or unreadable config β†’ pass nothing and let the agent's own frontmatter decide; never guess a model. This is the only way the configured model and effort reach the agent β€” there are no override copies (`/projectstore:agents configure`). When falling back to `oh-my-claudecode:critic` or `general-purpose`, pass the same model and effort.
68
68
 
69
69
  7. **Show findings**: print the agent's report verbatim. Number is its number.
70
70
 
@@ -80,7 +80,8 @@ the two cannot collide).
80
80
  files with different jobs: the scratch is what gets copied to the target;
81
81
  the baseline is what `--check` compares against. Handing `--check` the
82
82
  scratch makes it report drift on every run.
83
- - **Model (ADR-008)**: resolve it with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing).
83
+ - **Model and effort (ADR-008)**: resolve them with `node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" agents model clerk --json --project "${CLAUDE_PROJECT_DIR}"` and pass `result.model` as the spawn's model parameter (`null` β†’ pass nothing),
84
+ and `result.effort` as its effort parameter when it is not `null` and the spawn offers one.
84
85
  Missing key, `inherit`, or unreadable config β†’ pass nothing and let the
85
86
  agent's own frontmatter decide; never guess a model.
86
87
  - Capture doctor's summary line (`node "${CLAUDE_PLUGIN_ROOT}/bin/projectstore.mjs" doctor
@@ -97,7 +97,7 @@ After setup, every setting is one command away, from a terminal in your project:
97
97
  npx projectstore configure
98
98
  ```
99
99
 
100
- At a terminal it opens a settings menu: each agent's model, the status line and the band, the template language, and the vault's spec policy and lifecycle gates. ↑ and ↓ move, β†’ opens, space chooses, ← goes back, and Enter shows one plan; a second Enter writes it. A model is chosen from its harness's list: Claude Code's aliases, or Codex's own models. Without a terminal it prints the settings with their values and the file each one lives in. From a script or an agent, name the change; naming it is the confirmation:
100
+ At a terminal it opens a settings menu: each agent's model and effort, the status line and the band, the template language, and the vault's spec policy and lifecycle gates. ↑ and ↓ move, β†’ opens, space chooses, ← goes back, and Enter shows one plan; a second Enter writes it. A model is chosen from its harness's list: Claude Code's aliases, or Codex's own models. Without a terminal it prints the settings with their values and the file each one lives in. From a script or an agent, name the change; naming it is the confirmation:
101
101
 
102
102
  ```
103
103
  npx projectstore configure --set language=de --set lifecycle_gates=on
@@ -138,8 +138,9 @@ What is known, and how:
138
138
  - **Roles are rendered as orchestration skills.** Codex spawns subagents through
139
139
  its collaboration tool, not by loading a plugin's `agents/` directory. The
140
140
  six ProjectStore roles therefore ship as namespaced skills that resolve their
141
- configured model through the core and ask Codex to spawn the role. No effort
142
- is forced: it inherits unless the user has configured a model policy.
141
+ configured model and effort through the core and ask Codex to spawn the role
142
+ with them. With no effort configured, a role spawned on a configured model
143
+ runs at that model's own default level.
143
144
  - **Multi-file edits reach the activity log and entry rule when their paths
144
145
  are absolute.** Codex's `apply_patch` carries paths inside
145
146
  `tool_input.command`; the shared extractor reads every `Add`, `Update`,
@@ -49,7 +49,7 @@
49
49
  {
50
50
  "env": "CLAUDE_CODE_EFFORT_LEVEL",
51
51
  "kind": "effort",
52
- "beats": "agent frontmatter"
52
+ "beats": "the spawn's effort parameter and agent frontmatter: with it set, the Agent tool offers no effort parameter at all (measured 2026-10-14, 2.1.296)"
53
53
  },
54
54
  {
55
55
  "env": "CLAUDE_CODE_SUBAGENT_MODEL",
@@ -534,6 +534,45 @@
534
534
  "cheap_model": "sonnet",
535
535
  "cheap_model_evidence": "measured",
536
536
  "cheap_model_reason": "The model the clerk is pinned to when a strong default would otherwise lift it (ADR-008). A literal here, in the one file allowed to name a harness's vocabulary; it used to be a literal in scripts/cli.mjs, which made `agents configure --harness codex` write an Anthropic model name into a Codex overlay. MEASURED in the sense that matters: this is the model the clerk has been running on since ADR-008, in this repository, and tests/overlay.test.mjs asserts the pin end to end.",
537
+ "effort": {
538
+ "spawn_param": "effort",
539
+ "spawn_param_evidence": "measured",
540
+ "spawn_param_reason": "The Agent tool's `effort` parameter, an enum of the five levels below, in the tool schema Claude Code 2.1.296 gave a session on 2026-10-14 (documented from 2.1.292). A plugin agent with `effort: max` in its frontmatter, spawned with `effort: \"xhigh\"`, ran every request at xhigh; spawned with none, at max (subagent transcripts). An off-enum level fails the tool's schema and no subagent starts. So the overlay's effort is passed here, as the model is (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", decision 2).",
541
+ "levels": [
542
+ {
543
+ "id": "low",
544
+ "description": "The fastest and cheapest: little thinking before an answer."
545
+ },
546
+ {
547
+ "id": "medium",
548
+ "description": "Balances speed and depth: thinks where the task needs it."
549
+ },
550
+ {
551
+ "id": "high",
552
+ "description": "Thinks longer before answering, for harder work."
553
+ },
554
+ {
555
+ "id": "xhigh",
556
+ "description": "Extended thinking for hard reviews, plans and designs."
557
+ },
558
+ {
559
+ "id": "max",
560
+ "description": "The most thinking Claude Code allows: the level the bundled agents' frontmatter names, the clerk's excepted."
561
+ }
562
+ ],
563
+ "levels_reason": "The Agent tool's enum, measured. Claude Code lowers a level a model does not support to the highest one it does (documented), so one list serves every alias and no catalog is read.",
564
+ "strict": true,
565
+ "strict_reason": "The spawn takes these levels and nothing else: an off-enum level (ultra) failed the Agent tool's schema and no subagent started (measured 2026-10-14, 2.1.296). So a level off this list is written with a note that the spawn refuses it.",
566
+ "unset": {
567
+ "value": "frontmatter",
568
+ "row": "use frontmatter",
569
+ "model_default": false,
570
+ "reason": "With no effort passed, the agent runs at its frontmatter's effort β€” max for every bundled agent but the clerk, which runs at low β€” whatever model is passed (transcripts of 2026-10-11/12)."
571
+ },
572
+ "cheap": "low",
573
+ "cheap_evidence": "chosen",
574
+ "cheap_reason": "The clerk's level, in its frontmatter and as its pin under a default effort (the effort ADR, decision 6): it copies an approved file and runs a pinned ceremony. Chosen by the maintainer on 2026-10-14 (\"ΠΊΠ»Π΅Ρ€ΠΊΠ° Π΄Π° Π½Π° Π»ΠΎΡƒ\"), as on Codex."
575
+ },
537
576
  "models": {
538
577
  "spawn_takes": "alias",
539
578
  "spawn_takes_evidence": "measured",
@@ -339,25 +339,61 @@
339
339
  "update_instructions": "From a terminal in the project, run `npx projectstore@<version> upgrade --harness codex` and restart Codex afterwards, so the new skills and hooks are loaded. The run fetches the shell at that version, atomically replaces its stable source, and `codex plugin add projectstore@projectstore-npx` materialises the new version; this was measured across two dev builds on codex-cli 0.153.4.",
340
340
  "agent_translation": {
341
341
  "carries_model": false,
342
- "carries_model_reason": "The surface projectstore ships β€” a plugin's agents/ entry β€” carries no model on Codex: surfaces.agents is supported:false because no route from a plugin's agents/ directory to collaborationspawn_agent has been found (measured). Codex DOES have a definition file that carries model and effort, recorded below, but it is project- or user-scoped and not plugin-shippable, so contract 12 holds as written: what we ship cannot carry a model. Was true here until 2026-09-08, which contradicted both contract 12 and this file's own agents row.",
342
+ "carries_model_reason": "The surface projectstore ships β€” a plugin's agents/ entry β€” carries no model on Codex: surfaces.agents is supported:false because no route from a plugin's agents/ directory to collaborationspawn_agent has been found (measured). Codex DOES have a definition file that carries model and effort, recorded below, but it is project- or user-scoped and not plugin-shippable, so contract 12 holds as written: what we ship cannot carry a model. Was true here until 2026-09-08, which contradicted both contract 12 and this file's own agents row. What the plugin's role skills pass instead is a value at spawn: `spawn_agent` takes `model` and `reasoning_effort` (measured 2026-10-14, effort block below).",
343
343
  "definition_file": ".codex/agents/<name>.toml",
344
344
  "definition_file_evidence": "documented",
345
- "definition_file_reason": "Codex agent definitions are TOML under .codex/agents/ (project) or ~/.codex/agents/ (personal) and accept `model`, `model_reasoning_effort`, `sandbox_mode` and `mcp_servers`. Documented at learn.chatgpt.com/docs/agent-configuration/subagents, read 2026-09-08; NOT measured, and not reachable from a plugin today. This is the route the rendering story (Per-agent effort returns, PS-AGENTS) has to decide on, and B4 has to measure.",
345
+ "definition_file_reason": "Codex agent definitions are TOML under .codex/agents/ (project) or ~/.codex/agents/ (personal) and accept `model`, `model_reasoning_effort`, `sandbox_mode` and `mcp_servers`. Documented at learn.chatgpt.com/docs/agent-configuration/subagents, read 2026-09-08; NOT measured, and not reachable from a plugin. Not used: the spawn carries model and effort, so no definition is rendered (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", alternative A).",
346
346
  "cheap_model": "gpt-5.6-luna",
347
347
  "cheap_model_evidence": "chosen",
348
348
  "cheap_model_reason": "CHOSEN, not measured: the verified plugin session exercised the rendered skill surface, not this optional model pin. It reaches a user's overlay β€” `agents configure --harness codex` writes it as the clerk's pin β€” so if the id is wrong the failure is at spawn time, on the harness, not here. The transcriber's model. gpt-5.6-luna at $0.20/$1.20 per Mtok is the cost tier gpt-5.6-sol ($4/$20) is twenty times above, and the clerk composes nothing: it copies an approved file and runs a pinned ceremony (ADR-008). Chosen 2026-09-08 from the published model list, by the same reasoning that pins the clerk to the cheap tier on Claude Code.",
349
- "effort_levels": [
350
- "low",
351
- "medium",
352
- "high",
353
- "xhigh",
354
- "max",
355
- "ultra"
356
- ],
357
- "effort_key": "model_reasoning_effort",
358
- "effort_evidence": "documented",
359
- "effort_precedence": "explicit spawn value, then the [agents] default from config, then the parent agent's value. A model chosen without an effort uses that model's default effort.",
360
- "effort_reason": "Recorded, not yet consumed: the overlay's allowlist rejects an effort key and rewrites it out, deliberately, until the story Per-agent effort returns decides whether a role's effort travels in a rendered definition or at spawn. Documented 2026-09-08; the `ultra` level is Codex's and is not a level Claude Code accepts.",
349
+ "effort": {
350
+ "spawn_param": "reasoning_effort",
351
+ "spawn_param_evidence": "measured",
352
+ "spawn_param_reason": "`collaboration.spawn_agent` takes `reasoning_effort` beside `model`. Measured on codex-cli 0.162.1, 2026-10-14: a parent on gpt-5.6-sol at xhigh spawned gpt-5.6-luna at low, and the child's first turn_context reads gpt-5.6-luna, low. An effort with no model ran the parent's model at that effort.",
353
+ "levels": [
354
+ {
355
+ "id": "low",
356
+ "description": "Fast responses with lighter reasoning."
357
+ },
358
+ {
359
+ "id": "medium",
360
+ "description": "Balances speed and reasoning depth for everyday tasks."
361
+ },
362
+ {
363
+ "id": "high",
364
+ "description": "Greater reasoning depth for complex problems."
365
+ },
366
+ {
367
+ "id": "xhigh",
368
+ "description": "Extra high reasoning depth for complex problems."
369
+ },
370
+ {
371
+ "id": "max",
372
+ "description": "Maximum reasoning depth for the hardest problems."
373
+ },
374
+ {
375
+ "id": "ultra",
376
+ "description": "Maximum reasoning with automatic task delegation; not every model takes it."
377
+ }
378
+ ],
379
+ "levels_reason": "The floor, offered when the agent's model is not in a list that names its own levels: every level Codex's catalog listed on 2026-10-14, in its own words. Not every model takes every level (gpt-5.6-luna stops at max), which is why a listed model's own levels win.",
380
+ "catalog": {
381
+ "list": "supported_reasoning_levels",
382
+ "id": "effort",
383
+ "description": "description",
384
+ "default": "default_reasoning_level",
385
+ "reason": "Fields of a model entry in Codex's own catalog (models_cache.json, `codex debug models`), measured 2026-10-14 on codex-cli 0.162.1: each model lists the levels it takes as { effort, description } and names its default."
386
+ },
387
+ "unset": {
388
+ "value": "Codex decides",
389
+ "row": "let Codex decide",
390
+ "model_default": true,
391
+ "reason": "With no effort passed and a model passed, the child runs at that model's own default level, not the parent's: gpt-5.6-sol ran at low under an xhigh parent (measured 2026-10-14; Codex's subagents documentation says the same). With no model passed either, Codex's [agents] default, then the parent's effort (documented)."
392
+ },
393
+ "cheap": "low",
394
+ "cheap_evidence": "chosen",
395
+ "cheap_reason": "The clerk's level under a default effort (the ADR \"Agent effort is passed at spawn beside the model, from the overlay, in each harness's own levels\", decision 6): it copies an approved file and runs a pinned ceremony. Chosen by the maintainer on 2026-09-08 with its model: gpt-5.6-luna at the lowest level."
396
+ },
361
397
  "models": {
362
398
  "spawn_takes": "id",
363
399
  "spawn_takes_evidence": "documented",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectstore",
3
- "version": "0.30.2",
3
+ "version": "0.30.4",
4
4
  "description": "Your agent runs the project through a verified loop: task β†’ artifact (ADR / spec / epic / story) β†’ adversarial critic β†’ backlog β†’ planner β†’ reviewer β†’ done. Plain markdown in git β€” any model can pick the project up tomorrow.",
5
5
  "keywords": [
6
6
  "project-management",