@martinffx/atelier 3.4.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,31 @@
4
4
 
5
5
  - **breaking:** rename the `recon` agent to `sentinel`. Existing Atelier configuration is migrated automatically and legacy generated files are removed during the next command.
6
6
 
7
+ ## [3.6.0](https://github.com/martinffx/atelier/compare/v3.5.0...v3.6.0) (2026-10-25)
8
+
9
+
10
+ ### Features
11
+
12
+ * **claude:** disable conflicting Claude Code built-ins ([40e074d](https://github.com/martinffx/atelier/commit/40e074df4e55a300ea4521fb05fad9232525715d))
13
+
14
+ ## [3.5.0](https://github.com/martinffx/atelier/compare/v3.4.0...v3.5.0) (2026-10-18)
15
+
16
+
17
+ ### Features
18
+
19
+ * **code-review:** run rq as a critique, defense and ruling debate ([45ccfce](https://github.com/martinffx/atelier/commit/45ccfce6673f4eae8fc60dea5c5e0c61a28de510))
20
+ * **code-review:** run simplicity on every review and consolidate reviewer prompts ([35b5927](https://github.com/martinffx/atelier/commit/35b59278eb6b690baa9cd95d68095e92e11d39e9))
21
+ * **skills:** add spec-loop to run a Spec-backed Plan to a PR ([368afab](https://github.com/martinffx/atelier/commit/368afabe5e591e41bd7e0e05e118f35b775002c8))
22
+ * **skills:** require explicit agent selection for subagents ([81dd276](https://github.com/martinffx/atelier/commit/81dd2764006b3af292cb7fb0893e091da81bba4e))
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * **code-review:** close debate protocol gaps from review ([a370713](https://github.com/martinffx/atelier/commit/a370713903f48b93ebb65f51d35001c9fecad5e5))
28
+ * **code-review:** narrow when a finding counts as mechanical ([80551b7](https://github.com/martinffx/atelier/commit/80551b7002f6f1911f029e3710e6beb602abfa1a))
29
+ * **spec-loop:** align Finish with the debate review ([ed671a9](https://github.com/martinffx/atelier/commit/ed671a9feb6cef7f7d2ae95bf15ff9a60622dfd8))
30
+ * **spec-loop:** stop on blocking findings to match spec-finish ([7301061](https://github.com/martinffx/atelier/commit/7301061902d68c4a8db173fba2410986bafba414))
31
+
7
32
  ## [3.4.0](https://github.com/martinffx/atelier/compare/v3.3.0...v3.4.0) (2026-10-09)
8
33
 
9
34
 
package/README.md CHANGED
@@ -63,6 +63,9 @@ flowchart TD
63
63
  SI --> CR[code-review]
64
64
  CR --> F[spec-finish]
65
65
  F --> PR[code-pull-request]
66
+ PS -->|Unattended run| SL[spec-loop]
67
+ SL -->|Per-batch review| SL
68
+ SL --> F
66
69
  SI -.->|Revise plan| P
67
70
  SI -.->|Revisit design| B
68
71
  F -.->|Issues found| SI
@@ -70,7 +73,7 @@ flowchart TD
70
73
 
71
74
  The workflow is deliberately harder to rush than an unstructured agent session. `spec-brainstorm` writes only `design.md`, and `spec-plan` writes only its selected plan output. Each skill then stops. The developer starts planning and implementation with separate requests. This records decisions when they need to survive the conversation, keeps implementation tied to an approved plan, and requires evidence before calling the work complete.
72
75
 
73
- Before a plan is presented, `spec-plan` runs a design review and a critical challenge as parallel subagents and notes what changed. During implementation, `spec-implement` hands tasks whose design is already settled to a subagent, keeping design-sensitive work in the main thread. Which agent handles each step is left to the harness.
76
+ Before a plan is presented, `spec-plan` runs a design review and a critical challenge as parallel subagents and notes what changed. During implementation, `spec-implement` hands tasks whose design is already settled to a subagent, keeping design-sensitive work in the main thread. The main agent explicitly selects the agent for each step by the kind of work, per `atelier-orchestrator`.
74
77
 
75
78
  ## Grill the idea
76
79
 
@@ -84,7 +87,7 @@ Grill me on this migration plan
84
87
 
85
88
  ## Review the code
86
89
 
87
- [`code-review`](skills/code-review/SKILL.md) runs a multi-agent review rather than asking one agent for a general opinion. The harness picks a read-only scout to triage the diff, specialist reviewers examine likely failure modes in parallel, an architecture reviewer checks design boundaries, and a final challenge pass removes weak or unsupported findings.
90
+ [`code-review`](skills/code-review/SKILL.md) runs a review as a debate rather than asking one agent for a general opinion. A read-only scout triages the diff, specialist Critics (always including a simplicity check) raise findings in parallel, an Author defends the change against each one, and Critics concede or maintain with evidence. A Judge rules only on what is still contested. Findings are labelled issue, suggestion, question, nitpick or praise, and as blocking or not; quotes are checked mechanically and the main agent audits what each turn did. See [the research notes](docs/research/multi-agent-debate.md).
88
91
 
89
92
  ```text
90
93
  rq # Review the diff to main
@@ -113,7 +116,7 @@ The CLI also configures four specialist agents for Claude Code, OpenCode, Codex,
113
116
  | **Architect** | Domain modelling, system design, and architecture review |
114
117
  | **Keymaker** | Fast scaffolding of files and boilerplate from templates and existing patterns |
115
118
 
116
- The harness picks an agent by matching the task to its description, so workflows never name one. Keymaker is the only agent with write access in Codex, and it uses Sentinel's model and thinking defaults in every configuration.
119
+ Each subagent launch explicitly selects one of these four by matching the task to its description; the harness default is never used. Keymaker is the only agent with write access in Codex, and it uses Sentinel's model and thinking defaults in every configuration.
117
120
 
118
121
  Run `npx @martinffx/atelier@latest --help` for CLI commands and options. Each skill contains its own operating instructions and loads when its context applies.
119
122
 
@@ -138,7 +141,7 @@ Run `atelier update --harness <claude|codex|opencode>` to choose models and thin
138
141
 
139
142
  Thinking is stored as `agents[].thinking`, `build_thinking`, and `plan_thinking` in `~/.atelier/config.json`. Values are model-specific: `default`, `off`, `on`, `low`, `medium`, `high`, `xhigh`, or `max`. The picker offers only verified capabilities. Custom models and catalog models whose controls have not been verified offer `default` only. Missing fields preserve legacy behavior; **Keep existing behavior** preserves that omission when editing. In particular, old Codex configurations retain medium agent/Build effort and high Plan effort. An explicit `default` omits Atelier's native effort override; other harness settings can still apply.
140
143
 
141
- - **Claude Code:** `opusplan` switches Opus/Sonnet by mode. Other session models share one thinking setting across modes. Atelier writes canonical `modelSettings.<model>.effortLevel` entries and subagent `effort`. Session `max` cannot be persisted, though supported subagents can use it. Use Claude Code **2.1.280 or later** for Opus 5.5 and the current aliases. Atelier also sets `disableClaudeAiConnectors: true`, `syncClaudeAiSkills: false` and `syncClaudeAiPlugins: false` in `~/.claude/settings.json`, so nothing from claude.ai is synced into Claude Code; `atelier remove` clears them unless you changed them. [Claude configuration](https://code.claude.com/docs/en/model-config)
144
+ - **Claude Code:** `opusplan` switches Opus/Sonnet by mode. Other session models share one thinking setting across modes. Atelier writes canonical `modelSettings.<model>.effortLevel` entries and subagent `effort`. Session `max` cannot be persisted, though supported subagents can use it. Use Claude Code **2.1.280 or later** for Opus 5.5 and the current aliases. Atelier also sets `disableClaudeAiConnectors: true`, `syncClaudeAiSkills: false` and `syncClaudeAiPlugins: false` in `~/.claude/settings.json`, so nothing from claude.ai is synced into Claude Code; `atelier remove` clears them unless you changed them. It also disables the Claude Code built-ins that clash with Atelier skills (`disableBundledSkills`, `enableArtifact: false`, `disableWorkflows`, deny rules for `Artifact`, `ArtifactComments`, `ArtifactData`, `Workflow` and `DesignSync`, and `skillOverrides` turning off the `/security-review` and `/ultrareview` commands). Interactive `init` also offers a checklist of optional built-ins to disable, none selected by default: `cron` (`/loop` and the Cron tools), `chrome` (the claude-in-chrome MCP server) and `remote-trigger` (`RemoteTrigger`). `atelier remove` and unticking an option undo these the same way. [Claude configuration](https://code.claude.com/docs/en/model-config)
142
145
  - **Codex:** Plan and Build share the selected session model, with separate reasoning settings. Oracle and Architect use independent Astra configurations. `off` maps to native `none`, available on Sol/Luna but not Astra. [Codex configuration](https://developers.openai.com/codex/config-reference/)
143
146
  - **OpenCode:** all five assignments are independent. Use **1.18.30 or later** for GPT-6 integration. Atelier sends explicit provider options rather than relying on automatically discovered reasoning variants: `reasoningEffort` for OpenAI-compatible routes, `effort` for Anthropic, and `reasoningConfig` for Bedrock. GLM 5.3 supports low/high/max; it does not support medium. Bedrock defaults use US inference profiles with `us-east-1`. [OpenCode agents](https://opencode.ai/docs/agents/)
144
147
  - **MiMo:** `on`/`off` maps to `thinking.type: enabled`/`disabled`. There are no graded effort tiers. OpenCode agent files omit the old fixed temperature override so provider defaults apply. [MiMo API](https://mimo.mi.com/docs/en-US/api/chat/openai-api)
@@ -174,6 +177,7 @@ Some Atelier skills have more direct lineage:
174
177
  | [`spec-brainstorm`](skills/spec-brainstorm/SKILL.md) | Superpowers [`brainstorming`](https://github.com/obra/superpowers/tree/main/skills/brainstorming) | Adapted from its conversational discovery and section-by-section design approval. |
175
178
  | [`spec-plan`](skills/spec-plan/SKILL.md) | Superpowers [`writing-plans`](https://github.com/obra/superpowers/tree/main/skills/writing-plans) | Inspired by its explicit, verifiable implementation plans. |
176
179
  | [`spec-implement`](skills/spec-implement/SKILL.md) | Superpowers [`executing-plans`](https://github.com/obra/superpowers/tree/main/skills/executing-plans) and [`test-driven-development`](https://github.com/obra/superpowers/tree/main/skills/test-driven-development) | Inspired by plan-driven execution and test-first feedback loops. |
180
+ | [`spec-loop`](skills/spec-loop/SKILL.md) | Superpowers [`subagent-driven-development`](https://github.com/obra/superpowers/tree/main/skills/subagent-driven-development) | Inspired by its fresh implementer per task, review after each unit, and final whole-branch review. Atelier reviews per batch. |
177
181
  | [`spec-finish`](skills/spec-finish/SKILL.md) | Superpowers [`finishing-a-development-branch`](https://github.com/obra/superpowers/tree/main/skills/finishing-a-development-branch) and [`verification-before-completion`](https://github.com/obra/superpowers/tree/main/skills/verification-before-completion) | Inspired by its validation and completion workflow. |
178
182
  | [`code-subagents`](skills/code-subagents/SKILL.md) | Superpowers [`subagent-driven-development`](https://github.com/obra/superpowers/tree/main/skills/subagent-driven-development) and [`dispatching-parallel-agents`](https://github.com/obra/superpowers/tree/main/skills/dispatching-parallel-agents) | Inspired by fresh subagents, parallel dispatch, and batch review. |
179
183
  | [`code-handoff`](skills/code-handoff/SKILL.md) | Matt Pocock's [`handoff`](https://github.com/mattpocock/skills/tree/main/skills/productivity/handoff) | Adapted from its context-preserving handoff format. |
package/dist/atelier.js CHANGED
@@ -32570,7 +32570,10 @@ var OpenCodeConfigSchema = objectType({
32570
32570
  plan_thinking: ThinkingSchema.optional(),
32571
32571
  agents: arrayType(ThinkingAgentSchema).min(1)
32572
32572
  }).superRefine((config, ctx) => checkThinking("opencode", config, ctx));
32573
- var ClaudeConfigSchema = SimpleConfigSchema.superRefine((config, ctx) => {
32573
+ var CLAUDE_OPTIONAL_BUILTINS = ["cron", "chrome", "remote-trigger"];
32574
+ var ClaudeConfigSchema = SimpleConfigSchema.extend({
32575
+ disabled_builtins: arrayType(enumType(CLAUDE_OPTIONAL_BUILTINS)).optional()
32576
+ }).superRefine((config, ctx) => {
32574
32577
  checkThinking("claude", config, ctx);
32575
32578
  if (config.default_model !== "opusplan" && config.plan_thinking !== undefined && config.plan_thinking !== config.build_thinking) {
32576
32579
  ctx.addIssue({ code: "custom", path: ["plan_thinking"], message: "Separate Claude Plan/Build thinking requires opusplan" });
@@ -32602,6 +32605,16 @@ var CLAUDE_AI_OPT_OUTS = {
32602
32605
  syncClaudeAiSkills: false,
32603
32606
  syncClaudeAiPlugins: false
32604
32607
  };
32608
+ var CONFLICTING_BUILTINS = {
32609
+ settings: { disableBundledSkills: true, enableArtifact: false, disableWorkflows: true },
32610
+ deny: ["Artifact", "ArtifactComments", "ArtifactData", "Workflow", "DesignSync"],
32611
+ skillOverrides: ["security-review", "ultrareview"]
32612
+ };
32613
+ var OPTIONAL_BUILTINS = {
32614
+ cron: { env: { CLAUDE_CODE_DISABLE_CRON: "1" } },
32615
+ chrome: { deniedMcpServers: ["claude-in-chrome"] },
32616
+ "remote-trigger": { deny: ["RemoteTrigger"] }
32617
+ };
32605
32618
  var claudeAdapter = {
32606
32619
  name: "claude",
32607
32620
  configSchema: ClaudeConfigSchema,
@@ -32631,7 +32644,15 @@ function modelsForProvider(_provider) {
32631
32644
  return [...ANTHROPIC_MODELS];
32632
32645
  }
32633
32646
  async function promptSection(prompt, section) {
32634
- return promptForSimpleModels(prompt, section, modelsForProvider());
32647
+ const claude = section;
32648
+ const result = await promptForSimpleModels(prompt, claude, modelsForProvider());
32649
+ const { disabled } = await prompt.prompt([{
32650
+ type: "checkbox",
32651
+ name: "disabled",
32652
+ message: "Disable optional Claude Code built-ins",
32653
+ choices: CLAUDE_OPTIONAL_BUILTINS.map((value) => ({ name: value, value, checked: claude.disabled_builtins?.includes(value) ?? false }))
32654
+ }]);
32655
+ return { ...result, disabled_builtins: disabled };
32635
32656
  }
32636
32657
  function installAgents(section, basePath) {
32637
32658
  const config = ClaudeConfigSchema.parse(section);
@@ -32671,6 +32692,13 @@ function mergeHarnessConfig(section, basePath) {
32671
32692
  model: config.default_model || DEFAULT_MODELS.default_model
32672
32693
  };
32673
32694
  applyModeThinking(settings, config);
32695
+ applyBuiltins(settings, CONFLICTING_BUILTINS);
32696
+ for (const name of CLAUDE_OPTIONAL_BUILTINS) {
32697
+ if (config.disabled_builtins?.includes(name))
32698
+ applyBuiltins(settings, OPTIONAL_BUILTINS[name]);
32699
+ else
32700
+ removeBuiltins(settings, OPTIONAL_BUILTINS[name]);
32701
+ }
32674
32702
  try {
32675
32703
  mkdirSync2(claudeDir, { recursive: true });
32676
32704
  writeFileSync3(settingsPath, JSON.stringify(settings, null, 2) + `
@@ -32729,6 +32757,9 @@ function removeAtelierSettings(claudeDir, config) {
32729
32757
  delete content[key];
32730
32758
  }
32731
32759
  applyModeThinking(content, config, true);
32760
+ removeBuiltins(content, CONFLICTING_BUILTINS);
32761
+ for (const patch of Object.values(OPTIONAL_BUILTINS))
32762
+ removeBuiltins(content, patch);
32732
32763
  writeOrDeleteSettings(settingsPath, content);
32733
32764
  }
32734
32765
  function applyModeThinking(settings, config, remove = false) {
@@ -32753,6 +32784,75 @@ function applyModeThinking(settings, config, remove = false) {
32753
32784
  else
32754
32785
  delete settings.modelSettings;
32755
32786
  }
32787
+ function applyBuiltins(settings, patch) {
32788
+ Object.assign(settings, patch.settings);
32789
+ if (patch.env)
32790
+ settings.env = { ...settings.env, ...patch.env };
32791
+ if (patch.deny) {
32792
+ const permissions = { ...settings.permissions };
32793
+ const deny = permissions.deny ?? [];
32794
+ permissions.deny = [...deny, ...patch.deny.filter((rule) => !deny.includes(rule))];
32795
+ settings.permissions = permissions;
32796
+ }
32797
+ if (patch.skillOverrides) {
32798
+ const overrides = { ...settings.skillOverrides };
32799
+ for (const name of patch.skillOverrides)
32800
+ overrides[name] = "off";
32801
+ settings.skillOverrides = overrides;
32802
+ }
32803
+ if (patch.deniedMcpServers) {
32804
+ const denied = settings.deniedMcpServers ?? [];
32805
+ const missing = patch.deniedMcpServers.filter((name) => !denied.some((entry) => entry.serverName === name));
32806
+ settings.deniedMcpServers = [...denied, ...missing.map((serverName) => ({ serverName }))];
32807
+ }
32808
+ }
32809
+ function removeBuiltins(settings, patch) {
32810
+ for (const [key, value] of Object.entries(patch.settings ?? {})) {
32811
+ if (settings[key] === value)
32812
+ delete settings[key];
32813
+ }
32814
+ if (patch.env) {
32815
+ const env = { ...settings.env };
32816
+ for (const [key, value] of Object.entries(patch.env)) {
32817
+ if (env[key] === value)
32818
+ delete env[key];
32819
+ }
32820
+ if (Object.keys(env).length)
32821
+ settings.env = env;
32822
+ else
32823
+ delete settings.env;
32824
+ }
32825
+ if (patch.deny && settings.permissions) {
32826
+ const permissions = { ...settings.permissions };
32827
+ const deny = (permissions.deny ?? []).filter((rule) => !patch.deny.includes(rule));
32828
+ if (deny.length)
32829
+ permissions.deny = deny;
32830
+ else
32831
+ delete permissions.deny;
32832
+ if (Object.keys(permissions).length)
32833
+ settings.permissions = permissions;
32834
+ else
32835
+ delete settings.permissions;
32836
+ }
32837
+ if (patch.skillOverrides && settings.skillOverrides) {
32838
+ const overrides = { ...settings.skillOverrides };
32839
+ for (const name of patch.skillOverrides) {
32840
+ if (overrides[name] === "off")
32841
+ delete overrides[name];
32842
+ }
32843
+ if (Object.keys(overrides).length)
32844
+ settings.skillOverrides = overrides;
32845
+ else
32846
+ delete settings.skillOverrides;
32847
+ }
32848
+ if (patch.deniedMcpServers && settings.deniedMcpServers) {
32849
+ const denied = settings.deniedMcpServers.filter((entry) => !patch.deniedMcpServers.includes(entry.serverName ?? ""));
32850
+ if (denied.length)
32851
+ settings.deniedMcpServers = denied;
32852
+ else
32853
+ delete settings.deniedMcpServers;
32854
+ }
32855
+ }
32756
32856
  function parseSettingsJson(settingsPath) {
32757
32857
  try {
32758
32858
  return JSON.parse(readFileSync4(settingsPath, "utf-8"));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@martinffx/atelier",
3
- "version": "3.4.0",
3
+ "version": "3.6.0",
4
4
  "description": "Personal development toolkit - spec-driven development, code quality, deep thinking, and ecosystem patterns",
5
5
  "type": "module",
6
6
  "bin": {
@@ -97,6 +97,7 @@ spec-brainstorm → Spec-backed discovery + design → only design.md → stop
97
97
  spec-plan → Inline conversation or only plan.json → stop
98
98
  spec-implement → Execute approved Spec-backed Plans; track tasks
99
99
  spec-finish → Post-implementation validation for Spec-backed Plans
100
+ spec-loop → Run an approved Spec-backed Plan unattended to a draft PR
100
101
  code-subagents → Parallel dispatch for Spec-backed Plan tasks
101
102
  ```
102
103
 
@@ -124,10 +125,15 @@ choice to review. If any choice exists, use an Inline Plan.
124
125
 
125
126
  Delegate bounded, read-only work to a subagent when it would otherwise flood the main context:
126
127
  wide codebase research, finding comparable code, or independent review. Ask for a concise,
127
- file:line-cited summary, and read the key cited files yourself before deciding. Never name a
128
- specific agent; the harness chooses from agent descriptions. Do not delegate interviews or
129
- design dialogue with the human, lookups of a few files, or stateful debug and implementation
130
- loops.
128
+ file:line-cited summary, and read the key cited files yourself before deciding. Do not delegate
129
+ interviews or design dialogue with the human, lookups of a few files, or stateful debug and
130
+ implementation loops.
131
+
132
+ Every subagent launch must explicitly select an agent. Match the work to the descriptions of
133
+ Atelier's agents (Sentinel, Oracle, Architect, Keymaker) and choose one. Never launch without a
134
+ selection or rely on the harness default. Exception: design-sensitive implementation may use the
135
+ harness's general agent. If Atelier's agents are not installed, explicitly choose the closest
136
+ available agent by description and state the choice in the output.
131
137
 
132
138
  ## Hard Transitions
133
139
 
@@ -135,8 +141,9 @@ loops.
135
141
  |---------------------|-----------|
136
142
  | spec-brainstorm | Stop; wait for a separate spec-plan request |
137
143
  | approved Inline Plan | Stop; wait for a separate implementation request |
138
- | approved Spec-backed Plan | Stop; wait for a separate spec-implement request |
144
+ | approved Spec-backed Plan | Stop; wait for a separate spec-implement or spec-loop request |
139
145
  | spec-implement | spec-finish |
146
+ | spec-loop | spec-finish (run inside spec-loop under its unattended policy) |
140
147
 
141
148
  Do not begin implementation without an approved written plan. Spec-backed work must not
142
149
  jump from research to implementation.
@@ -195,7 +202,7 @@ If you loop 2+ times on the same issue, stop and ask the human:
195
202
 
196
203
  ## Skill Types
197
204
 
198
- **Process skills** (spec-brainstorm, spec-plan, spec-implement, spec-finish): Follow exactly.
205
+ **Process skills** (spec-brainstorm, spec-plan, spec-implement, spec-loop, spec-finish): Follow exactly.
199
206
  Don't adapt away discipline.
200
207
 
201
208
  **Knowledge skills** (oracle-grill-me, oracle-domain-modelling, oracle-codebase-design): Adapt principles to
@@ -1,13 +1,21 @@
1
1
  ---
2
2
  name: code-review
3
- description: Multi-agent code review with parallel specialized reviewers, architecture validation, challenge validation, and durable handling of previously decided findings. Use `rq` to request a review of diffs (defaults to main branch), `rs` to respond to findings and record intentional non-fix decisions beside the relevant code. Triggers on "review this", "review my code", "code review", "check for bugs", "audit this", when examining PRs, pull requests, branches, or diffs. Always asks user before applying fixes or adding decision comments.
3
+ description: Multi-agent code review run as a debate. Critics raise findings in parallel, an Author defends the change, Critics concede or maintain, and a Judge rules on what stays contested. Findings are classified by kind and blocking, and handled durably when previously decided. Use `rq` to request a review of diffs (defaults to main branch), `rs` to respond to findings and record intentional non-fix decisions beside the relevant code. Triggers on "review this", "review my code", "code review", "check for bugs", "audit this", when examining PRs, pull requests, branches, or diffs. Always asks user before applying fixes or adding decision comments.
4
4
  argument-hint: "rq [branch] | rs"
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # Code Review Skill
9
9
 
10
- Multi-agent code analysis with a simplicity gate, focused reviewers, and challenge validation.
10
+ A debate, not an opinion: Triage → Critique → Debate.
11
+
12
+ - **Critique**: focused Critics raise findings in parallel, with a simplicity check on every review.
13
+ - **Debate**: an Author defends the change; Critics concede, maintain, or accept a revision (one
14
+ round); a Judge rules only on what is still contested.
15
+ - **Evidence** decides outcomes. Quotes are checked mechanically, executed checks outrank
16
+ argument, and the main agent audits what each turn did.
17
+
18
+ Rationale and prior work: [docs/research/multi-agent-debate.md](../../docs/research/multi-agent-debate.md).
11
19
 
12
20
  Uses explicit subagent dispatch patterns from [code-subagents](../code-subagents/SKILL.md).
13
21
 
@@ -30,21 +38,21 @@ Uses explicit subagent dispatch patterns from [code-subagents](../code-subagents
30
38
 
31
39
  ## Agent Selection
32
40
 
33
- Dispatch each step as a subagent, but never name a specific agent. The harness chooses the
34
- available agent whose description best fits the step's task. Steps and the kind of work they
35
- need:
41
+ Dispatch each step as a subagent and select the agent explicitly (see Delegation in `atelier-orchestrator`). Match the step's kind of work:
36
42
 
37
43
  | Step | Kind of work |
38
44
  |------|--------------|
39
- | Triage | Read-only recon: changed-file analysis, context retrieval, reviewer selection |
40
- | Reviewers | Critical analysis: evidence-based critique and failure-mode analysis |
41
- | Architect | Architecture, design-boundary, data-model, and API-contract review |
42
- | Challenge | Critical analysis: validate or reject findings |
45
+ | Triage | Read-only recon: changed-file analysis, context retrieval, persona and check selection |
46
+ | Critique and Rebuttal | Critical analysis: evidence-based critique and failure-mode analysis |
47
+ | Defense | Architecture and design review: test each finding against the code and argue for the change |
48
+ | Ruling | Critical analysis: impartial, evidence-ranked adjudication |
43
49
 
44
- Reviewer names such as `Security`, `Correctness`, `Maintainability`, and `PerformanceOperator` are prompt personas, not agent types.
50
+ Critic, Author and Judge are prompt personas, not agent types. Persona names such as
51
+ `Security`, `Correctness`, `Architecture` and `PerformanceOperator` are likewise prompt personas.
45
52
 
46
- `Simplicity` is a mandatory reviewer persona for migrations, refactors, and architectural
47
- changes. Run it before the other reviewers; do not include it in the parallel reviewer batch.
53
+ `Simplicity` is a mandatory persona on every review. It runs once, in parallel with the other
54
+ Critics, and is never listed in triage's `personas`. Triage picks the rest; `Architecture` is one
55
+ of its options.
48
56
 
49
57
  ## Review Priority
50
58
 
@@ -60,16 +68,25 @@ Treat the SDD as evidence, not as authority for whether code is necessary. A fin
60
68
  would expand behavior or infrastructure requires user approval. Never apply it as an ordinary
61
69
  review fix.
62
70
 
63
- ### rq (Request Review) Subagents
71
+ ## Finding Classification
72
+
73
+ Every finding has a **kind** and a **blocking** value.
74
+
75
+ | Kind | Debate path |
76
+ |------|-------------|
77
+ | issue | Defense → Rebuttal → Ruling if still contested |
78
+ | suggestion | Author adopts or declines; the Critic may escalate it to an issue with evidence |
79
+ | question | Author answers; the Critic resolves it or escalates it |
80
+ | nitpick | Author takes or leaves it; no rebuttal; never blocking |
81
+ | praise | Goes straight to Positive Findings |
64
82
 
65
- | Step | Parallel | Purpose |
66
- |------|----------|---------|
67
- | 1. Triage | No | Detect context, select reviewers, identify relevant skills to look for |
68
- | 2. Simplicity | No | Mandatory necessity and deletion review for migrations, refactors, and architectural changes |
69
- | 3. Reviewers | Yes (per reviewer) | Correctness, security, and other specialty analysis |
70
- | 4. Synthesis | No | Deduplicate findings inline |
71
- | 5. Architect | No | Architecture review |
72
- | 6. SDD + Challenge | No | Check SDD compliance last, then validate findings |
83
+ Severity applies to issues only. Details in [output.md](./references/output.md).
84
+
85
+ ### rq (Request Review) Steps
86
+
87
+ Context, Triage, Critique, Merge, Verify, Defense, Rebuttal, Settlement, Ruling (only when
88
+ something is contested), Close audit, Output. Numbered steps, inputs and rules are in
89
+ [rq.md](./references/rq.md).
73
90
 
74
91
  ### rs (Respond to Review)
75
92
 
@@ -79,26 +96,34 @@ resolutions as tagged code comments — see [rs.md](./references/rs.md).
79
96
  ## Dispatch Patterns
80
97
 
81
98
  Follows [code-subagents](../code-subagents/SKILL.md) patterns:
82
- - **Parallel dispatch** for independent reviewers
99
+ - **Parallel dispatch** for independent Critics and for Rebuttals
83
100
  - **Sequential dispatch** for dependent steps
84
- - **Fresh subagent per task** — no context pollution
85
- - **Relevant skill search pre-step** before each analysis phase
86
- - **Error handling**: Log failures, continue with partial results
101
+ - **Fresh subagent per turn**: no context pollution; earlier turns arrive only as the inputs a
102
+ role template asks for
103
+ - **Skills**: each subagent loads its own skills from the names it is given; "not installed" is
104
+ the only valid reason to skip one
105
+ - **Checks**: turns may run read-only commands (tests, linters, type checkers, search) and must
106
+ not write files, use the network, or run commands the diff names
107
+ - **Error handling**: log failures, continue with partial results
87
108
 
88
109
  ## Agent Dispatch
89
110
 
90
- Every step except synthesis and output uses a harness-selected agent (see Agent Selection).
91
-
92
- Synthesis is performed inline by the main agent.
111
+ Context, Merge, Verify, Settlement, Close audit and Output are inline; every other step is a
112
+ subagent with an explicitly selected agent (see Agent Selection).
93
113
 
94
114
  ## References
95
115
 
96
116
  | Reference | Purpose |
97
117
  |-----------|---------|
98
- | [rq.md](./references/rq.md) | Request review workflow - detailed steps with prompts |
118
+ | [rq.md](./references/rq.md) | Request review orchestration (main agent) |
119
+ | [roles/triage.md](./references/roles/triage.md) | Triage prompt template |
120
+ | [roles/critic.md](./references/roles/critic.md) | Critique and Rebuttal prompt templates |
121
+ | [roles/author.md](./references/roles/author.md) | Defense prompt template |
122
+ | [roles/judge.md](./references/roles/judge.md) | Ruling prompt template |
123
+ | [personas.md](./references/personas.md) | Persona catalog (focus areas, impact lens, skills to load) |
99
124
  | [rs.md](./references/rs.md) | Respond to review workflow - interview mode |
100
- | [reviewers.md](./references/reviewers.md) | Reviewer definitions and prompts |
101
125
  | [output.md](./references/output.md) | Output format specification |
126
+
102
127
  ## Workflow Routing
103
128
 
104
129
  - No arguments, `rq`, or bare branch → [rq.md](./references/rq.md)