severally-mcp 2.0.0 → 2.3.1

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 (40) hide show
  1. package/CODE_OF_CONDUCT.md +83 -0
  2. package/CONFIG.md +13 -7
  3. package/README.ja.md +157 -77
  4. package/README.md +162 -81
  5. package/bin/severally-mcp.mjs +3 -0
  6. package/config.example.json +26 -0
  7. package/docs/how-it-works.ja.md +11 -3
  8. package/docs/how-it-works.md +12 -4
  9. package/docs/install.ja.md +25 -6
  10. package/docs/install.md +30 -7
  11. package/package.json +5 -3
  12. package/plugins/severally/.claude-plugin/plugin.json +1 -1
  13. package/plugins/severally/.codex-plugin/plugin.json +4 -2
  14. package/plugins/severally/.mcp.json +2 -1
  15. package/plugins/severally/dist/severally-mcp.mjs +29639 -28215
  16. package/plugins/severally/skills/_template/SKILL.md.tmpl +19 -23
  17. package/plugins/severally/skills/_template/reference.md.tmpl +22 -10
  18. package/plugins/severally/skills/antigravity/severally/SKILL.md +19 -23
  19. package/plugins/severally/skills/antigravity/severally/reference.md +22 -10
  20. package/plugins/severally/skills/claude/severally/SKILL.md +19 -23
  21. package/plugins/severally/skills/claude/severally/reference.md +22 -10
  22. package/plugins/severally/skills/codex/severally/SKILL.md +19 -23
  23. package/plugins/severally/skills/codex/severally/reference.md +22 -10
  24. package/plugins/severally/skills/opencode/severally/SKILL.md +19 -23
  25. package/plugins/severally/skills/opencode/severally/reference.md +22 -10
  26. package/scripts/init-config.mjs +1 -1
  27. package/scripts/install.mjs +124 -9
  28. package/src/adapters/antigravity-sandbox.mjs +5 -1
  29. package/src/adapters/codex.mjs +17 -6
  30. package/src/brief.mjs +38 -16
  31. package/src/consultants.mjs +31 -10
  32. package/src/expose-paths.mjs +68 -5
  33. package/src/jobs.mjs +294 -56
  34. package/src/policy.mjs +49 -11
  35. package/src/redact.mjs +20 -1
  36. package/src/run.mjs +38 -5
  37. package/src/schema.mjs +35 -12
  38. package/src/server.mjs +96 -120
  39. package/src/status.mjs +63 -0
  40. package/src/store.mjs +44 -1
@@ -5,9 +5,9 @@ description: Use when a decision deserves a second, independent mind - an archit
5
5
 
6
6
  # Consulting a peer agent
7
7
 
8
- You have three peers, each reached through the `severally` MCP server as a fresh child session. They can
9
- search and browse the web. They cannot edit files, reach the network outside search/browse, load MCP tools,
10
- see your session, or consult anyone else. In practice they know only what you put in the brief and the files you expose to them.{{EXECUTION_CAVEAT}}
8
+ You have three peers, each reached through the `severally` MCP server as a fresh child session that can read files
9
+ and search the web, but not edit them, load MCP tools, see your session or consult anyone else. Each knows only
10
+ what you put in the brief and the files you expose to it.{{EXECUTION_CAVEAT}}
11
11
 
12
12
  ## A normal consultation is three calls
13
13
 
@@ -22,13 +22,14 @@ see your session, or consult anyone else. In practice they know only what you pu
22
22
  }})
23
23
  ```
24
24
 
25
- 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits up to 45 seconds for
26
- the answer by itself; call it again while `status` is `running`, and work on something independent in between.
25
+ 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits for the answer by itself,
26
+ up to a limit the server sets (45 seconds, or ten minutes where the client allows it); call it again while
27
+ `status` is `running`. To work on something independent meanwhile, ask for a shorter wait (`reference.md`).
27
28
  3. **Check one point, report, and record it once** (see **Before you hand the decision back**).
28
29
 
29
- That is the whole routine. The rest of the record — more verdicts, a prediction and reflection, follow-ups,
30
- the export into the repository, the details of reading a fan-out — is in `reference.md`, in the same
31
- directory as this file. Read it only for a decision you will have to justify later, or when you follow up.
30
+ That is the whole routine. The rest — follow-ups, a prediction and reflection, the export, reading a fan-out
31
+ in detail — is in `reference.md`, in the same directory as this file. Read it for a decision you will have to
32
+ justify later, or when you follow up.
32
33
 
33
34
  ## Pick the consultant
34
35
 
@@ -42,12 +43,10 @@ costs one consultation's quota per consultant. Narrow to `target` (singular) onl
42
43
  specific peer, or when the decision clearly does not warrant that much. This is the one rule for how many to
43
44
  ask.
44
45
 
45
- A consultant is one CLI running one model, and the operator decides which ones exist. `consult_start`'s
46
- description lists the ones this machine can actually reach as `name: CLI, model`. When the user names one,
47
- pass **the word the user used** as `target` — a name, a CLI (`codex`, `agy`), a vendor or a model
48
- (「Claude Opusと相談して」 is `target: "claude opus"`) — and let the server resolve it. A word that fits several
49
- comes back as `target_ambiguous` with the candidates: ask the user which one they meant. One that is not
50
- installed comes back as `target_unavailable` with the available list: take that as final and tell the user.
46
+ The operator decides which consultants exist; `consult_start`'s description lists the ones this machine can
47
+ actually reach. When the user names one, pass **the word the user used** as `target`
48
+ (「Claude Opusと相談して」 is `target: "claude opus"`). `target_ambiguous`: ask the user which one they meant.
49
+ `target_unavailable`: take the available list as final and tell the user.
51
50
 
52
51
  **Do not pick a model yourself.** When the user named no one, ask everyone; overriding the operator's
53
52
  consultants on your own judgement — including after a `usage_limit` failure — substitutes a different mind
@@ -61,9 +60,8 @@ answer can say which model answered.
61
60
 
62
61
  ## When this is worth it
63
62
 
64
- When a wrong answer is expensive or hard to undo: an architectural or interface decision, a data migration, a
65
- security or concurrency design; two options that still look close; an investigation that has stalled after two
66
- failed attempts; or the user asked. Not for routine edits, a rename, a test that just needs writing, or
63
+ When a wrong answer is expensive or hard to undo (an interface, a migration, a security or concurrency design),
64
+ two options still look close, an investigation has stalled after two attempts, or the user asked. Not for
67
65
  anything you would be comfortable defending on your own.
68
66
 
69
67
  **Before you ask the user to approve a change that is hard to reverse** and nobody else has reviewed it,
@@ -80,15 +78,13 @@ Pass `initiator: "user"` when the user asked for the consultation; leave it out
80
78
  - **Ask one decidable question.** What runs out the clock is scope, not brief length: when the budget runs out
81
79
  the session is killed and you get nothing. Split "research everything about X" or three questions at once,
82
80
  and ask the one whose answer changes what you do next.
83
- - **Hand over the code.** The consultant starts in an empty working directory and is not told where your
84
- repository is. Name the files by absolute path in `context.expose_paths` in this first call (at most 20
85
- entries, 500 files, 5 MB; never your home directory or one holding keys), or pass
81
+ - **Hand over the code.** The consultant is not told where your repository is. Name the files by absolute path
82
+ in `context.expose_paths` (a repository root works; never your home directory or one holding keys), or pass
86
83
  `context.expose_diff: { repo: "<absolute path>" }` for a change you are making. When `consult_start` answers
87
84
  `files_exposed: 0` and the question is about code, `consult_cancel` and start again with `expose_paths`.
88
85
  - **Put the load-bearing facts in `context.facts`**, and test output or a log in `context.artifacts`.
89
- - **The mode follows from the context.** Leave `mode` out: no proposal is `explore`, a proposal is `review`, a
90
- proposal with `counterpoints` (the other side's claims) is `debate`. To gather opinions without showing your
91
- own, leave `context.proposal` empty; a reviewed plan is answered around the plan.
86
+ - **Leave `mode` out**; it follows from the context. To gather opinions without showing your own, leave
87
+ `context.proposal` empty: a reviewed plan is answered around the plan.
92
88
  - A constraint is read as fixed and will not be challenged; if it is your own call, put it under `facts` with
93
89
  its reason. For material that must not leave the machine through a URL, pass `network: "off"`.
94
90
 
@@ -17,9 +17,8 @@ checked as given: the server rejects a first-round `explore` that carries a prop
17
17
  anchoring-sensitive — if you want your plan critiqued, that is `review`.
18
18
 
19
19
  **For a decision heavy enough to be worth two consultations**, ask `explore` first on the facts alone, then
20
- `review` with the proposal, and read what the first raised that the second never did. Measured on this
21
- project: repeat runs of the identical brief did not move the bottom line, while withholding the proposal once
22
- did, and the withheld run was the only one to question what the decision was even about.
20
+ `review` with the proposal, and read what the first raised that the second never did. A consultant that sees
21
+ your proposal tends to answer around it; one that does not is more likely to question the framing itself.
23
22
 
24
23
  ## A brief for a decision you will live with
25
24
 
@@ -70,10 +69,14 @@ names. Your own CLI is a fresh session but not another lineage, and its `quality
70
69
  consultants of one vendor.
71
70
 
72
71
  Send **one** `targets` call: every consultant receives the byte-identical brief, which is what makes the answers
73
- comparable. Poll the single group with `consult_get({ group_id })` and stop it with
74
- `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap (nine by default, shared by
75
- every severally session on this machine) and one consultation's quota per consultant, and `targets` is refused
76
- on a follow-up.
72
+ comparable (on a follow-up to the group, the same new question, with each one's own earlier rounds). Poll the single group with `consult_get({ group_id })` and stop it with
73
+ `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap per consultant (nine by default,
74
+ shared by every severally session on this machine; the group starts only if every member gets one) and one
75
+ consultation's quota per consultant. To ask every member again, follow up the group: `followup_to: "<group_id>"`
76
+ with no `target` or `targets` (see Follow-ups).
77
+
78
+ While you wait, `consult_get` blocks for up to its limit (ten minutes where the client allows it). To work on
79
+ something independent in between, pass a shorter `wait_ms` and come back.
77
80
 
78
81
  `comparison.by_target` holds, per consultant: stance, summary, confidence, evidence basis, finding points (each
79
82
  with its `id` and severity), `severity_counts`, `decision_changers`, alternatives, unknowns (`u1` …),
@@ -93,7 +96,7 @@ Reading them against each other:
93
96
  4. **Read `decision_changers` before spending a follow-up**: a consultant that named the condition under which
94
97
  it would change its mind has told you what evidence to go get.
95
98
  5. **Spend a follow-up only on a divergence that would change your decision**, sent only to the consultant
96
- whose reading it belongs to.
99
+ whose reading it belongs to, or to the whole group (`followup_to: "<group_id>"`) when it concerns all of them.
97
100
  6. **A stance every consultant shares is not evidence that the plan was checked.** Look for a premise they all
98
101
  rely on and none could verify; name it only if you can actually identify one.
99
102
 
@@ -123,14 +126,23 @@ in `failure.detail`, which tells you whether to retry with a longer budget or a
123
126
 
124
127
  By default a chain has five rounds: one initial round plus up to four follow-ups
125
128
  (`followup_to: "<previous job_id>"`); the operator can configure 1–20 (`server.max_rounds`), and
126
- `rounds_remaining` says what is left. A follow-up starts in a fresh working directory with no files: pass
129
+ `rounds_remaining` says what is left. `followup_to: "<group_id>"`, with no `target` or `targets`, sends the same new
130
+ question to every member of a fan-out, each continuing from its own latest round with its own history; a member
131
+ that is still running, never answered or has used its rounds is listed under `skipped` and not asked.
132
+
133
+ A follow-up needs only `followup_to` and the new `question`:
134
+ `consult_start({ request: { followup_to: "<job_id>", question: "..." } })`. The consultant, the mode, `network` and what
135
+ the earlier round was given (objective, constraints, success criteria, facts, proposal, counterpoints,
136
+ artifacts) carry over, and the brief restates them; a field you pass replaces the earlier one, an empty list
137
+ included. A follow-up starts in a fresh working directory with no files: pass
127
138
  `context.expose_from_parent: true` to copy again, as they are now, the paths the earlier round exposed (a changed
128
139
  or vanished entry is marked), and leave it off when the follow-up does not need them.
129
140
 
130
141
  Spend follow-ups only where you and the consultant actually diverge: quote the specific point, give the evidence
131
142
  that answers it, and ask what would change their view. Write your verdicts with `consult_record` first: the
132
143
  consultant is shown each earlier point with your verdict, so it answers what your checking found instead of
133
- restating it. A follow-up works across a server restart.
144
+ restating it. A follow-up works across a server restart; `consult_list` shows an earlier session's
145
+ consultations with their `job_id` and `group_id`.
134
146
 
135
147
  After each follow-up, state in one sentence the cause you still differ on. If it is the same as last round and
136
148
  the round brought no new evidence and no new condition that would change the judgement, stop and hand the user
@@ -5,9 +5,9 @@ description: Use when a decision deserves a second, independent mind - an archit
5
5
 
6
6
  # Consulting a peer agent
7
7
 
8
- You have three peers, each reached through the `severally` MCP server as a fresh child session. They can
9
- search and browse the web. They cannot edit files, reach the network outside search/browse, load MCP tools,
10
- see your session, or consult anyone else. In practice they know only what you put in the brief and the files you expose to them.
8
+ You have three peers, each reached through the `severally` MCP server as a fresh child session that can read files
9
+ and search the web, but not edit them, load MCP tools, see your session or consult anyone else. Each knows only
10
+ what you put in the brief and the files you expose to it.
11
11
 
12
12
  One caveat on that list: a consultant can read local files. Its writes are blocked,
13
13
  its network reaches only web search and browsing (none with `network: "off"`), credential and history
@@ -29,13 +29,14 @@ copied read-only into its working directory. The Codex consultant additionally h
29
29
  }})
30
30
  ```
31
31
 
32
- 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits up to 45 seconds for
33
- the answer by itself; call it again while `status` is `running`, and work on something independent in between.
32
+ 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits for the answer by itself,
33
+ up to a limit the server sets (45 seconds, or ten minutes where the client allows it); call it again while
34
+ `status` is `running`. To work on something independent meanwhile, ask for a shorter wait (`reference.md`).
34
35
  3. **Check one point, report, and record it once** (see **Before you hand the decision back**).
35
36
 
36
- That is the whole routine. The rest of the record — more verdicts, a prediction and reflection, follow-ups,
37
- the export into the repository, the details of reading a fan-out — is in `reference.md`, in the same
38
- directory as this file. Read it only for a decision you will have to justify later, or when you follow up.
37
+ That is the whole routine. The rest — follow-ups, a prediction and reflection, the export, reading a fan-out
38
+ in detail — is in `reference.md`, in the same directory as this file. Read it for a decision you will have to
39
+ justify later, or when you follow up.
39
40
 
40
41
  ## Pick the consultant
41
42
 
@@ -53,12 +54,10 @@ costs one consultation's quota per consultant. Narrow to `target` (singular) onl
53
54
  specific peer, or when the decision clearly does not warrant that much. This is the one rule for how many to
54
55
  ask.
55
56
 
56
- A consultant is one CLI running one model, and the operator decides which ones exist. `consult_start`'s
57
- description lists the ones this machine can actually reach as `name: CLI, model`. When the user names one,
58
- pass **the word the user used** as `target` — a name, a CLI (`codex`, `agy`), a vendor or a model
59
- (「Claude Opusと相談して」 is `target: "claude opus"`) — and let the server resolve it. A word that fits several
60
- comes back as `target_ambiguous` with the candidates: ask the user which one they meant. One that is not
61
- installed comes back as `target_unavailable` with the available list: take that as final and tell the user.
57
+ The operator decides which consultants exist; `consult_start`'s description lists the ones this machine can
58
+ actually reach. When the user names one, pass **the word the user used** as `target`
59
+ (「Claude Opusと相談して」 is `target: "claude opus"`). `target_ambiguous`: ask the user which one they meant.
60
+ `target_unavailable`: take the available list as final and tell the user.
62
61
 
63
62
  **Do not pick a model yourself.** When the user named no one, ask everyone; overriding the operator's
64
63
  consultants on your own judgement — including after a `usage_limit` failure — substitutes a different mind
@@ -72,9 +71,8 @@ answer can say which model answered.
72
71
 
73
72
  ## When this is worth it
74
73
 
75
- When a wrong answer is expensive or hard to undo: an architectural or interface decision, a data migration, a
76
- security or concurrency design; two options that still look close; an investigation that has stalled after two
77
- failed attempts; or the user asked. Not for routine edits, a rename, a test that just needs writing, or
74
+ When a wrong answer is expensive or hard to undo (an interface, a migration, a security or concurrency design),
75
+ two options still look close, an investigation has stalled after two attempts, or the user asked. Not for
78
76
  anything you would be comfortable defending on your own.
79
77
 
80
78
  **Before you ask the user to approve a change that is hard to reverse** and nobody else has reviewed it,
@@ -91,15 +89,13 @@ Pass `initiator: "user"` when the user asked for the consultation; leave it out
91
89
  - **Ask one decidable question.** What runs out the clock is scope, not brief length: when the budget runs out
92
90
  the session is killed and you get nothing. Split "research everything about X" or three questions at once,
93
91
  and ask the one whose answer changes what you do next.
94
- - **Hand over the code.** The consultant starts in an empty working directory and is not told where your
95
- repository is. Name the files by absolute path in `context.expose_paths` in this first call (at most 20
96
- entries, 500 files, 5 MB; never your home directory or one holding keys), or pass
92
+ - **Hand over the code.** The consultant is not told where your repository is. Name the files by absolute path
93
+ in `context.expose_paths` (a repository root works; never your home directory or one holding keys), or pass
97
94
  `context.expose_diff: { repo: "<absolute path>" }` for a change you are making. When `consult_start` answers
98
95
  `files_exposed: 0` and the question is about code, `consult_cancel` and start again with `expose_paths`.
99
96
  - **Put the load-bearing facts in `context.facts`**, and test output or a log in `context.artifacts`.
100
- - **The mode follows from the context.** Leave `mode` out: no proposal is `explore`, a proposal is `review`, a
101
- proposal with `counterpoints` (the other side's claims) is `debate`. To gather opinions without showing your
102
- own, leave `context.proposal` empty; a reviewed plan is answered around the plan.
97
+ - **Leave `mode` out**; it follows from the context. To gather opinions without showing your own, leave
98
+ `context.proposal` empty: a reviewed plan is answered around the plan.
103
99
  - A constraint is read as fixed and will not be challenged; if it is your own call, put it under `facts` with
104
100
  its reason. For material that must not leave the machine through a URL, pass `network: "off"`.
105
101
 
@@ -17,9 +17,8 @@ checked as given: the server rejects a first-round `explore` that carries a prop
17
17
  anchoring-sensitive — if you want your plan critiqued, that is `review`.
18
18
 
19
19
  **For a decision heavy enough to be worth two consultations**, ask `explore` first on the facts alone, then
20
- `review` with the proposal, and read what the first raised that the second never did. Measured on this
21
- project: repeat runs of the identical brief did not move the bottom line, while withholding the proposal once
22
- did, and the withheld run was the only one to question what the decision was even about.
20
+ `review` with the proposal, and read what the first raised that the second never did. A consultant that sees
21
+ your proposal tends to answer around it; one that does not is more likely to question the framing itself.
23
22
 
24
23
  ## A brief for a decision you will live with
25
24
 
@@ -70,10 +69,14 @@ names. Your own CLI is a fresh session but not another lineage, and its `quality
70
69
  consultants of one vendor.
71
70
 
72
71
  Send **one** `targets` call: every consultant receives the byte-identical brief, which is what makes the answers
73
- comparable. Poll the single group with `consult_get({ group_id })` and stop it with
74
- `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap (nine by default, shared by
75
- every severally session on this machine) and one consultation's quota per consultant, and `targets` is refused
76
- on a follow-up.
72
+ comparable (on a follow-up to the group, the same new question, with each one's own earlier rounds). Poll the single group with `consult_get({ group_id })` and stop it with
73
+ `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap per consultant (nine by default,
74
+ shared by every severally session on this machine; the group starts only if every member gets one) and one
75
+ consultation's quota per consultant. To ask every member again, follow up the group: `followup_to: "<group_id>"`
76
+ with no `target` or `targets` (see Follow-ups).
77
+
78
+ While you wait, `consult_get` blocks for up to its limit (ten minutes where the client allows it). To work on
79
+ something independent in between, pass a shorter `wait_ms` and come back.
77
80
 
78
81
  `comparison.by_target` holds, per consultant: stance, summary, confidence, evidence basis, finding points (each
79
82
  with its `id` and severity), `severity_counts`, `decision_changers`, alternatives, unknowns (`u1` …),
@@ -93,7 +96,7 @@ Reading them against each other:
93
96
  4. **Read `decision_changers` before spending a follow-up**: a consultant that named the condition under which
94
97
  it would change its mind has told you what evidence to go get.
95
98
  5. **Spend a follow-up only on a divergence that would change your decision**, sent only to the consultant
96
- whose reading it belongs to.
99
+ whose reading it belongs to, or to the whole group (`followup_to: "<group_id>"`) when it concerns all of them.
97
100
  6. **A stance every consultant shares is not evidence that the plan was checked.** Look for a premise they all
98
101
  rely on and none could verify; name it only if you can actually identify one.
99
102
 
@@ -123,14 +126,23 @@ in `failure.detail`, which tells you whether to retry with a longer budget or a
123
126
 
124
127
  By default a chain has five rounds: one initial round plus up to four follow-ups
125
128
  (`followup_to: "<previous job_id>"`); the operator can configure 1–20 (`server.max_rounds`), and
126
- `rounds_remaining` says what is left. A follow-up starts in a fresh working directory with no files: pass
129
+ `rounds_remaining` says what is left. `followup_to: "<group_id>"`, with no `target` or `targets`, sends the same new
130
+ question to every member of a fan-out, each continuing from its own latest round with its own history; a member
131
+ that is still running, never answered or has used its rounds is listed under `skipped` and not asked.
132
+
133
+ A follow-up needs only `followup_to` and the new `question`:
134
+ `consult_start({ request: { followup_to: "<job_id>", question: "..." } })`. The consultant, the mode, `network` and what
135
+ the earlier round was given (objective, constraints, success criteria, facts, proposal, counterpoints,
136
+ artifacts) carry over, and the brief restates them; a field you pass replaces the earlier one, an empty list
137
+ included. A follow-up starts in a fresh working directory with no files: pass
127
138
  `context.expose_from_parent: true` to copy again, as they are now, the paths the earlier round exposed (a changed
128
139
  or vanished entry is marked), and leave it off when the follow-up does not need them.
129
140
 
130
141
  Spend follow-ups only where you and the consultant actually diverge: quote the specific point, give the evidence
131
142
  that answers it, and ask what would change their view. Write your verdicts with `consult_record` first: the
132
143
  consultant is shown each earlier point with your verdict, so it answers what your checking found instead of
133
- restating it. A follow-up works across a server restart.
144
+ restating it. A follow-up works across a server restart; `consult_list` shows an earlier session's
145
+ consultations with their `job_id` and `group_id`.
134
146
 
135
147
  After each follow-up, state in one sentence the cause you still differ on. If it is the same as last round and
136
148
  the round brought no new evidence and no new condition that would change the judgement, stop and hand the user
@@ -6,9 +6,9 @@ allowed-tools: mcp__plugin_severally_severally__consult_get mcp__severally__cons
6
6
 
7
7
  # Consulting a peer agent
8
8
 
9
- You have three peers, each reached through the `severally` MCP server as a fresh child session. They can
10
- search and browse the web. They cannot edit files, reach the network outside search/browse, load MCP tools,
11
- see your session, or consult anyone else. In practice they know only what you put in the brief and the files you expose to them.
9
+ You have three peers, each reached through the `severally` MCP server as a fresh child session that can read files
10
+ and search the web, but not edit them, load MCP tools, see your session or consult anyone else. Each knows only
11
+ what you put in the brief and the files you expose to it.
12
12
 
13
13
  One caveat on that list: a consultant can read local files. Its writes are blocked,
14
14
  its network reaches only web search and browsing (none with `network: "off"`), credential and history
@@ -30,13 +30,14 @@ copied read-only into its working directory. The Codex consultant additionally h
30
30
  }})
31
31
  ```
32
32
 
33
- 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits up to 45 seconds for
34
- the answer by itself; call it again while `status` is `running`, and work on something independent in between.
33
+ 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits for the answer by itself,
34
+ up to a limit the server sets (45 seconds, or ten minutes where the client allows it); call it again while
35
+ `status` is `running`. To work on something independent meanwhile, ask for a shorter wait (`reference.md`).
35
36
  3. **Check one point, report, and record it once** (see **Before you hand the decision back**).
36
37
 
37
- That is the whole routine. The rest of the record — more verdicts, a prediction and reflection, follow-ups,
38
- the export into the repository, the details of reading a fan-out — is in `reference.md`, in the same
39
- directory as this file. Read it only for a decision you will have to justify later, or when you follow up.
38
+ That is the whole routine. The rest — follow-ups, a prediction and reflection, the export, reading a fan-out
39
+ in detail — is in `reference.md`, in the same directory as this file. Read it for a decision you will have to
40
+ justify later, or when you follow up.
40
41
 
41
42
  ## Pick the consultant
42
43
 
@@ -54,12 +55,10 @@ costs one consultation's quota per consultant. Narrow to `target` (singular) onl
54
55
  specific peer, or when the decision clearly does not warrant that much. This is the one rule for how many to
55
56
  ask.
56
57
 
57
- A consultant is one CLI running one model, and the operator decides which ones exist. `consult_start`'s
58
- description lists the ones this machine can actually reach as `name: CLI, model`. When the user names one,
59
- pass **the word the user used** as `target` — a name, a CLI (`codex`, `agy`), a vendor or a model
60
- (「Claude Opusと相談して」 is `target: "claude opus"`) — and let the server resolve it. A word that fits several
61
- comes back as `target_ambiguous` with the candidates: ask the user which one they meant. One that is not
62
- installed comes back as `target_unavailable` with the available list: take that as final and tell the user.
58
+ The operator decides which consultants exist; `consult_start`'s description lists the ones this machine can
59
+ actually reach. When the user names one, pass **the word the user used** as `target`
60
+ (「Claude Opusと相談して」 is `target: "claude opus"`). `target_ambiguous`: ask the user which one they meant.
61
+ `target_unavailable`: take the available list as final and tell the user.
63
62
 
64
63
  **Do not pick a model yourself.** When the user named no one, ask everyone; overriding the operator's
65
64
  consultants on your own judgement — including after a `usage_limit` failure — substitutes a different mind
@@ -73,9 +72,8 @@ answer can say which model answered.
73
72
 
74
73
  ## When this is worth it
75
74
 
76
- When a wrong answer is expensive or hard to undo: an architectural or interface decision, a data migration, a
77
- security or concurrency design; two options that still look close; an investigation that has stalled after two
78
- failed attempts; or the user asked. Not for routine edits, a rename, a test that just needs writing, or
75
+ When a wrong answer is expensive or hard to undo (an interface, a migration, a security or concurrency design),
76
+ two options still look close, an investigation has stalled after two attempts, or the user asked. Not for
79
77
  anything you would be comfortable defending on your own.
80
78
 
81
79
  **Before you ask the user to approve a change that is hard to reverse** and nobody else has reviewed it,
@@ -92,15 +90,13 @@ Pass `initiator: "user"` when the user asked for the consultation; leave it out
92
90
  - **Ask one decidable question.** What runs out the clock is scope, not brief length: when the budget runs out
93
91
  the session is killed and you get nothing. Split "research everything about X" or three questions at once,
94
92
  and ask the one whose answer changes what you do next.
95
- - **Hand over the code.** The consultant starts in an empty working directory and is not told where your
96
- repository is. Name the files by absolute path in `context.expose_paths` in this first call (at most 20
97
- entries, 500 files, 5 MB; never your home directory or one holding keys), or pass
93
+ - **Hand over the code.** The consultant is not told where your repository is. Name the files by absolute path
94
+ in `context.expose_paths` (a repository root works; never your home directory or one holding keys), or pass
98
95
  `context.expose_diff: { repo: "<absolute path>" }` for a change you are making. When `consult_start` answers
99
96
  `files_exposed: 0` and the question is about code, `consult_cancel` and start again with `expose_paths`.
100
97
  - **Put the load-bearing facts in `context.facts`**, and test output or a log in `context.artifacts`.
101
- - **The mode follows from the context.** Leave `mode` out: no proposal is `explore`, a proposal is `review`, a
102
- proposal with `counterpoints` (the other side's claims) is `debate`. To gather opinions without showing your
103
- own, leave `context.proposal` empty; a reviewed plan is answered around the plan.
98
+ - **Leave `mode` out**; it follows from the context. To gather opinions without showing your own, leave
99
+ `context.proposal` empty: a reviewed plan is answered around the plan.
104
100
  - A constraint is read as fixed and will not be challenged; if it is your own call, put it under `facts` with
105
101
  its reason. For material that must not leave the machine through a URL, pass `network: "off"`.
106
102
 
@@ -17,9 +17,8 @@ checked as given: the server rejects a first-round `explore` that carries a prop
17
17
  anchoring-sensitive — if you want your plan critiqued, that is `review`.
18
18
 
19
19
  **For a decision heavy enough to be worth two consultations**, ask `explore` first on the facts alone, then
20
- `review` with the proposal, and read what the first raised that the second never did. Measured on this
21
- project: repeat runs of the identical brief did not move the bottom line, while withholding the proposal once
22
- did, and the withheld run was the only one to question what the decision was even about.
20
+ `review` with the proposal, and read what the first raised that the second never did. A consultant that sees
21
+ your proposal tends to answer around it; one that does not is more likely to question the framing itself.
23
22
 
24
23
  ## A brief for a decision you will live with
25
24
 
@@ -70,10 +69,14 @@ names. Your own CLI is a fresh session but not another lineage, and its `quality
70
69
  consultants of one vendor.
71
70
 
72
71
  Send **one** `targets` call: every consultant receives the byte-identical brief, which is what makes the answers
73
- comparable. Poll the single group with `consult_get({ group_id })` and stop it with
74
- `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap (nine by default, shared by
75
- every severally session on this machine) and one consultation's quota per consultant, and `targets` is refused
76
- on a follow-up.
72
+ comparable (on a follow-up to the group, the same new question, with each one's own earlier rounds). Poll the single group with `consult_get({ group_id })` and stop it with
73
+ `consult_cancel({ group_id })`. A fan-out takes one slot of the concurrency cap per consultant (nine by default,
74
+ shared by every severally session on this machine; the group starts only if every member gets one) and one
75
+ consultation's quota per consultant. To ask every member again, follow up the group: `followup_to: "<group_id>"`
76
+ with no `target` or `targets` (see Follow-ups).
77
+
78
+ While you wait, `consult_get` blocks for up to its limit (ten minutes where the client allows it). To work on
79
+ something independent in between, pass a shorter `wait_ms` and come back.
77
80
 
78
81
  `comparison.by_target` holds, per consultant: stance, summary, confidence, evidence basis, finding points (each
79
82
  with its `id` and severity), `severity_counts`, `decision_changers`, alternatives, unknowns (`u1` …),
@@ -93,7 +96,7 @@ Reading them against each other:
93
96
  4. **Read `decision_changers` before spending a follow-up**: a consultant that named the condition under which
94
97
  it would change its mind has told you what evidence to go get.
95
98
  5. **Spend a follow-up only on a divergence that would change your decision**, sent only to the consultant
96
- whose reading it belongs to.
99
+ whose reading it belongs to, or to the whole group (`followup_to: "<group_id>"`) when it concerns all of them.
97
100
  6. **A stance every consultant shares is not evidence that the plan was checked.** Look for a premise they all
98
101
  rely on and none could verify; name it only if you can actually identify one.
99
102
 
@@ -123,14 +126,23 @@ in `failure.detail`, which tells you whether to retry with a longer budget or a
123
126
 
124
127
  By default a chain has five rounds: one initial round plus up to four follow-ups
125
128
  (`followup_to: "<previous job_id>"`); the operator can configure 1–20 (`server.max_rounds`), and
126
- `rounds_remaining` says what is left. A follow-up starts in a fresh working directory with no files: pass
129
+ `rounds_remaining` says what is left. `followup_to: "<group_id>"`, with no `target` or `targets`, sends the same new
130
+ question to every member of a fan-out, each continuing from its own latest round with its own history; a member
131
+ that is still running, never answered or has used its rounds is listed under `skipped` and not asked.
132
+
133
+ A follow-up needs only `followup_to` and the new `question`:
134
+ `consult_start({ request: { followup_to: "<job_id>", question: "..." } })`. The consultant, the mode, `network` and what
135
+ the earlier round was given (objective, constraints, success criteria, facts, proposal, counterpoints,
136
+ artifacts) carry over, and the brief restates them; a field you pass replaces the earlier one, an empty list
137
+ included. A follow-up starts in a fresh working directory with no files: pass
127
138
  `context.expose_from_parent: true` to copy again, as they are now, the paths the earlier round exposed (a changed
128
139
  or vanished entry is marked), and leave it off when the follow-up does not need them.
129
140
 
130
141
  Spend follow-ups only where you and the consultant actually diverge: quote the specific point, give the evidence
131
142
  that answers it, and ask what would change their view. Write your verdicts with `consult_record` first: the
132
143
  consultant is shown each earlier point with your verdict, so it answers what your checking found instead of
133
- restating it. A follow-up works across a server restart.
144
+ restating it. A follow-up works across a server restart; `consult_list` shows an earlier session's
145
+ consultations with their `job_id` and `group_id`.
134
146
 
135
147
  After each follow-up, state in one sentence the cause you still differ on. If it is the same as last round and
136
148
  the round brought no new evidence and no new condition that would change the judgement, stop and hand the user
@@ -5,9 +5,9 @@ description: Use when a decision deserves a second, independent mind - an archit
5
5
 
6
6
  # Consulting a peer agent
7
7
 
8
- You have three peers, each reached through the `severally` MCP server as a fresh child session. They can
9
- search and browse the web. They cannot edit files, reach the network outside search/browse, load MCP tools,
10
- see your session, or consult anyone else. In practice they know only what you put in the brief and the files you expose to them.
8
+ You have three peers, each reached through the `severally` MCP server as a fresh child session that can read files
9
+ and search the web, but not edit them, load MCP tools, see your session or consult anyone else. Each knows only
10
+ what you put in the brief and the files you expose to it.
11
11
 
12
12
  One caveat on that list: a consultant can read local files. Its writes are blocked,
13
13
  its network reaches only web search and browsing (none with `network: "off"`), credential and history
@@ -29,13 +29,14 @@ copied read-only into its working directory.
29
29
  }})
30
30
  ```
31
31
 
32
- 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits up to 45 seconds for
33
- the answer by itself; call it again while `status` is `running`, and work on something independent in between.
32
+ 2. **`consult_get({ group_id })`** (`consult_get({ job_id })` for one consultant). It waits for the answer by itself,
33
+ up to a limit the server sets (45 seconds, or ten minutes where the client allows it); call it again while
34
+ `status` is `running`. To work on something independent meanwhile, ask for a shorter wait (`reference.md`).
34
35
  3. **Check one point, report, and record it once** (see **Before you hand the decision back**).
35
36
 
36
- That is the whole routine. The rest of the record — more verdicts, a prediction and reflection, follow-ups,
37
- the export into the repository, the details of reading a fan-out — is in `reference.md`, in the same
38
- directory as this file. Read it only for a decision you will have to justify later, or when you follow up.
37
+ That is the whole routine. The rest — follow-ups, a prediction and reflection, the export, reading a fan-out
38
+ in detail — is in `reference.md`, in the same directory as this file. Read it for a decision you will have to
39
+ justify later, or when you follow up.
39
40
 
40
41
  ## Pick the consultant
41
42
 
@@ -53,12 +54,10 @@ costs one consultation's quota per consultant. Narrow to `target` (singular) onl
53
54
  specific peer, or when the decision clearly does not warrant that much. This is the one rule for how many to
54
55
  ask.
55
56
 
56
- A consultant is one CLI running one model, and the operator decides which ones exist. `consult_start`'s
57
- description lists the ones this machine can actually reach as `name: CLI, model`. When the user names one,
58
- pass **the word the user used** as `target` — a name, a CLI (`codex`, `agy`), a vendor or a model
59
- (「Claude Opusと相談して」 is `target: "claude opus"`) — and let the server resolve it. A word that fits several
60
- comes back as `target_ambiguous` with the candidates: ask the user which one they meant. One that is not
61
- installed comes back as `target_unavailable` with the available list: take that as final and tell the user.
57
+ The operator decides which consultants exist; `consult_start`'s description lists the ones this machine can
58
+ actually reach. When the user names one, pass **the word the user used** as `target`
59
+ (「Claude Opusと相談して」 is `target: "claude opus"`). `target_ambiguous`: ask the user which one they meant.
60
+ `target_unavailable`: take the available list as final and tell the user.
62
61
 
63
62
  **Do not pick a model yourself.** When the user named no one, ask everyone; overriding the operator's
64
63
  consultants on your own judgement — including after a `usage_limit` failure — substitutes a different mind
@@ -72,9 +71,8 @@ answer can say which model answered.
72
71
 
73
72
  ## When this is worth it
74
73
 
75
- When a wrong answer is expensive or hard to undo: an architectural or interface decision, a data migration, a
76
- security or concurrency design; two options that still look close; an investigation that has stalled after two
77
- failed attempts; or the user asked. Not for routine edits, a rename, a test that just needs writing, or
74
+ When a wrong answer is expensive or hard to undo (an interface, a migration, a security or concurrency design),
75
+ two options still look close, an investigation has stalled after two attempts, or the user asked. Not for
78
76
  anything you would be comfortable defending on your own.
79
77
 
80
78
  **Before you ask the user to approve a change that is hard to reverse** and nobody else has reviewed it,
@@ -91,15 +89,13 @@ Pass `initiator: "user"` when the user asked for the consultation; leave it out
91
89
  - **Ask one decidable question.** What runs out the clock is scope, not brief length: when the budget runs out
92
90
  the session is killed and you get nothing. Split "research everything about X" or three questions at once,
93
91
  and ask the one whose answer changes what you do next.
94
- - **Hand over the code.** The consultant starts in an empty working directory and is not told where your
95
- repository is. Name the files by absolute path in `context.expose_paths` in this first call (at most 20
96
- entries, 500 files, 5 MB; never your home directory or one holding keys), or pass
92
+ - **Hand over the code.** The consultant is not told where your repository is. Name the files by absolute path
93
+ in `context.expose_paths` (a repository root works; never your home directory or one holding keys), or pass
97
94
  `context.expose_diff: { repo: "<absolute path>" }` for a change you are making. When `consult_start` answers
98
95
  `files_exposed: 0` and the question is about code, `consult_cancel` and start again with `expose_paths`.
99
96
  - **Put the load-bearing facts in `context.facts`**, and test output or a log in `context.artifacts`.
100
- - **The mode follows from the context.** Leave `mode` out: no proposal is `explore`, a proposal is `review`, a
101
- proposal with `counterpoints` (the other side's claims) is `debate`. To gather opinions without showing your
102
- own, leave `context.proposal` empty; a reviewed plan is answered around the plan.
97
+ - **Leave `mode` out**; it follows from the context. To gather opinions without showing your own, leave
98
+ `context.proposal` empty: a reviewed plan is answered around the plan.
103
99
  - A constraint is read as fixed and will not be challenged; if it is your own call, put it under `facts` with
104
100
  its reason. For material that must not leave the machine through a URL, pass `network: "off"`.
105
101