@mmerterden/multi-agent-pipeline 17.5.1 → 18.0.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 +276 -0
- package/README.md +59 -1
- package/README.tr.md +57 -0
- package/docs/adr/0011-dormant-ci.md +25 -1
- package/docs/features.md +24 -0
- package/docs/server-readiness.md +188 -0
- package/docs/token-budget-history.md +1 -1
- package/index.js +16 -1
- package/install/_common.mjs +42 -17
- package/install/_dev-only-files.mjs +8 -0
- package/install/_unattended-profile.mjs +113 -0
- package/install/index.mjs +48 -0
- package/install/templates/claude-hooks.json +13 -1
- package/manifest.json +1049 -0
- package/package.json +5 -2
- package/pipeline/commands/multi-agent/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/feedback/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/graph/SKILL.md +1 -1
- package/pipeline/commands/multi-agent/issue/SKILL.md +13 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +13 -1
- package/pipeline/commands/multi-agent/resume/SKILL.md +16 -1
- package/pipeline/commands/multi-agent/setup/SKILL.md +14 -16
- package/pipeline/commands/multi-agent/status/SKILL.md +52 -21
- package/pipeline/commands/multi-agent/update/SKILL.md +13 -56
- package/pipeline/lib/_jira-auth.sh +8 -0
- package/pipeline/lib/analysis-jira-write.sh +32 -0
- package/pipeline/lib/ask-choice.sh +13 -2
- package/pipeline/lib/autopilot-state.sh +8 -0
- package/pipeline/lib/fatal.mjs +129 -0
- package/pipeline/lib/figma-mcp-refresh.sh +18 -0
- package/pipeline/lib/figma-screenshot.sh +18 -0
- package/pipeline/lib/invoked-directly.mjs +43 -0
- package/pipeline/lib/jira-publish.sh +42 -0
- package/pipeline/lib/md2confluence-v3.py +47 -0
- package/pipeline/lib/outbound-gate.mjs +175 -0
- package/pipeline/lib/plan-todos.sh +27 -6
- package/pipeline/lib/post-pr-review.sh +77 -8
- package/pipeline/lib/repo-hygiene.sh +8 -3
- package/pipeline/lib/require-jq.sh +40 -0
- package/pipeline/lib/run-paths.sh +335 -0
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +70 -0
- package/pipeline/multi-agent-refs/features/code-graph.md +20 -0
- package/pipeline/multi-agent-refs/features/cost-analysis.md +93 -0
- package/pipeline/multi-agent-refs/features/doctor.md +68 -0
- package/pipeline/multi-agent-refs/features/maturity-followup.md +166 -0
- package/pipeline/multi-agent-refs/features/package-manager.md +80 -0
- package/pipeline/multi-agent-refs/features/usage-reporting.md +79 -0
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/verify.md +83 -0
- package/pipeline/multi-agent-refs/phases/operations.md +13 -2
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +6 -3
- package/pipeline/multi-agent-refs/phases/phase-3-dev.md +8 -2
- package/pipeline/multi-agent-refs/phases/phase-4-review.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/unattended-contract.md +129 -0
- package/pipeline/preferences-template.json +1 -1
- package/pipeline/schemas/agent-state.schema.json +122 -11
- package/pipeline/schemas/prefs.schema.json +35 -0
- package/pipeline/schemas/token-budget.json +2 -2
- package/pipeline/scripts/_run-paths.mjs +372 -0
- package/pipeline/scripts/aggregate-metrics.mjs +64 -64
- package/pipeline/scripts/autopilot-arming.mjs +2 -1
- package/pipeline/scripts/autopilot-intake.mjs +2 -1
- package/pipeline/scripts/autopilot-runner.mjs +206 -2
- package/pipeline/scripts/build-references.mjs +2 -1
- package/pipeline/scripts/build-stack-plugins.mjs +10 -2
- package/pipeline/scripts/capture-evidence.sh +7 -2
- package/pipeline/scripts/classify-plan-safety.mjs +2 -1
- package/pipeline/scripts/cost-analyze.mjs +600 -0
- package/pipeline/scripts/cost-budget-check.mjs +4 -12
- package/pipeline/scripts/council-view.mjs +2 -1
- package/pipeline/scripts/crush-json.mjs +2 -1
- package/pipeline/scripts/diff-explain.mjs +6 -9
- package/pipeline/scripts/diff-risk-score.mjs +2 -1
- package/pipeline/scripts/doctor.mjs +203 -4
- package/pipeline/scripts/evidence-gate.mjs +9 -3
- package/pipeline/scripts/feedback-send.mjs +13 -3
- package/pipeline/scripts/gc-abandoned.sh +29 -13
- package/pipeline/scripts/gc-worktrees.sh +11 -4
- package/pipeline/scripts/github-ssh-setup.sh +64 -7
- package/pipeline/scripts/graph-mermaid.mjs +4 -2
- package/pipeline/scripts/graph-report.mjs +155 -1
- package/pipeline/scripts/keychain-save.sh +101 -30
- package/pipeline/scripts/learn-from-transcripts.mjs +2 -1
- package/pipeline/scripts/learning-curve.mjs +34 -29
- package/pipeline/scripts/make-manifest.mjs +199 -0
- package/pipeline/scripts/maturity-followup.mjs +294 -0
- package/pipeline/scripts/migrate-prefs.mjs +2 -1
- package/pipeline/scripts/migrate-state.mjs +94 -4
- package/pipeline/scripts/package-manager.mjs +310 -0
- package/pipeline/scripts/phase-banner.sh +6 -2
- package/pipeline/scripts/phase-tracker.sh +41 -3
- package/pipeline/scripts/plan-coverage-gate.mjs +6 -2
- package/pipeline/scripts/pre-commit-check.sh +7 -0
- package/pipeline/scripts/pre-push-check.sh +7 -0
- package/pipeline/scripts/purge.sh +23 -6
- package/pipeline/scripts/render-agent-log-cost.sh +9 -2
- package/pipeline/scripts/render-cost-summary.sh +9 -2
- package/pipeline/scripts/render-work-summary.sh +11 -4
- package/pipeline/scripts/review-file-filter.mjs +4 -2
- package/pipeline/scripts/review-scope.mjs +2 -1
- package/pipeline/scripts/routine-registry.mjs +2 -1
- package/pipeline/scripts/run-aggregator.mjs +13 -14
- package/pipeline/scripts/run-metrics.mjs +3 -1
- package/pipeline/scripts/runs-index.mjs +343 -0
- package/pipeline/scripts/scorecard-snapshot.mjs +178 -0
- package/pipeline/scripts/search-logs.sh +18 -0
- package/pipeline/scripts/test-gap-scan.mjs +2 -1
- package/pipeline/scripts/test-integrity-gate.mjs +2 -1
- package/pipeline/scripts/update-issue-progress.sh +56 -7
- package/pipeline/scripts/usage-register.mjs +271 -0
- package/pipeline/scripts/usage-report.mjs +14 -3
- package/pipeline/scripts/validate-analysis-doc.mjs +2 -1
- package/pipeline/scripts/validate-code-graph.mjs +6 -3
- package/pipeline/scripts/validate-complaint-doc.mjs +2 -1
- package/pipeline/scripts/validate-diff-risk.mjs +6 -3
- package/pipeline/scripts/validate-test-gap.mjs +6 -3
- package/pipeline/scripts/validate-triage.mjs +3 -1
- package/pipeline/scripts/verify-citations.mjs +4 -2
- package/pipeline/scripts/verify.mjs +327 -0
- package/pipeline/scripts/worktree-finalize.sh +13 -4
- package/pipeline/scripts/write-state.mjs +154 -15
- package/pipeline/skills/.skill-manifest.json +6 -6
- package/pipeline/skills/.skills-index.json +56 -1
- package/pipeline/skills/shared/README.md +8 -3
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +14 -0
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +14 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +13 -0
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +33 -9
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +6 -0
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/package_app.sh +4 -1
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/setup_dev_signing.sh +4 -1
- package/pipeline/skills/shared/external/macos-spm-app-packaging/assets/templates/sign-and-notarize.sh +2 -1
- package/pipeline/skills/skills-index.md +6 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# Unattended contract (`MULTI_AGENT_UNATTENDED=1`)
|
|
2
|
+
|
|
3
|
+
<!-- toc -->
|
|
4
|
+
- [What the variable means](#what-the-variable-means)
|
|
5
|
+
- [The three effects](#the-three-effects)
|
|
6
|
+
- [What it does NOT do](#what-it-does-not-do)
|
|
7
|
+
- [Who honours it](#who-honours-it)
|
|
8
|
+
- [The model side already has a contract](#the-model-side-already-has-a-contract)
|
|
9
|
+
- [Default behaviour is unchanged, and a gate says so](#default-behaviour-is-unchanged-and-a-gate-says-so)
|
|
10
|
+
- [The permission posture](#the-permission-posture)
|
|
11
|
+
<!-- /toc -->
|
|
12
|
+
|
|
13
|
+
## What the variable means
|
|
14
|
+
|
|
15
|
+
`MULTI_AGENT_UNATTENDED=1` is the operator stating that **nobody is watching
|
|
16
|
+
this process**, and it is the only way to state it reliably.
|
|
17
|
+
|
|
18
|
+
The usual test for that is `[ -t 0 ]`: no terminal, no human. It is wrong in
|
|
19
|
+
both directions on a server. A run under `screen`, `tmux`, `ssh -t` or a login
|
|
20
|
+
shell HAS a terminal and still has nobody in front of it, so the test says
|
|
21
|
+
"ask" and the process waits for an answer that will never come - printing
|
|
22
|
+
nothing, exiting never, and looking exactly like slow work. That is the failure
|
|
23
|
+
this contract exists to remove, and it is not hypothetical: two setup scripts
|
|
24
|
+
shipped that way.
|
|
25
|
+
|
|
26
|
+
The variable is opt-in and defaults to absent. Nothing in this file describes
|
|
27
|
+
behaviour that changes on a machine that does not set it.
|
|
28
|
+
|
|
29
|
+
## The three effects
|
|
30
|
+
|
|
31
|
+
**1. No prompt blocks.** Every shell entry point that asks a question either
|
|
32
|
+
resolves it from a documented default or refuses with a reason on stderr and a
|
|
33
|
+
non-zero exit. Waiting is never one of the outcomes. Refusing beats hanging:
|
|
34
|
+
one of them can be read in a log.
|
|
35
|
+
|
|
36
|
+
**2. Output is greppable.** Colour is off even when stdout is a terminal.
|
|
37
|
+
ANSI escapes in a log file make it unsearchable, and on a server the terminal
|
|
38
|
+
that is attached is not the one anyone reads.
|
|
39
|
+
|
|
40
|
+
**3. A secret is never a prompt.** Credentials arrive through stdin or a file
|
|
41
|
+
path, never through an interactive read and never through an environment
|
|
42
|
+
variable. An env value is inherited by every child process and is visible to
|
|
43
|
+
`ps e` on some systems; a pipe stays in the one process that needs it.
|
|
44
|
+
|
|
45
|
+
## What it does NOT do
|
|
46
|
+
|
|
47
|
+
- It does not grant permissions. An unattended run still needs a permission
|
|
48
|
+
posture, which is a separate opt-in (`install --unattended`) and a separate
|
|
49
|
+
doctor check.
|
|
50
|
+
- It does not suppress errors. A run that cannot proceed still fails; it just
|
|
51
|
+
fails visibly instead of hanging.
|
|
52
|
+
- It does not change any default. With the variable unset, every script below
|
|
53
|
+
behaves exactly as it did before this contract existed.
|
|
54
|
+
|
|
55
|
+
## Who honours it
|
|
56
|
+
|
|
57
|
+
Paths below are install-relative: `lib/` and `scripts/` under the host root,
|
|
58
|
+
which is `~/.claude`, `~/.copilot` or `~/.codex` depending on the install. A
|
|
59
|
+
ref that ships to users must not name a checkout path, because a run happens
|
|
60
|
+
in the user's worktree and the checkout is not there.
|
|
61
|
+
|
|
62
|
+
| Entry point | Without the variable | With `MULTI_AGENT_UNATTENDED=1` |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `lib/ask-choice.sh` | TTY: renders the menu and reads. No TTY: first option, notice on stderr | First option (or `ASK_CHOICE_DEFAULT`), never prompts |
|
|
65
|
+
| `scripts/github-ssh-setup.sh` | TTY: three questions. No TTY: refuses, naming `SSH_SETUP_EMAIL` | Refuses the same way even with a terminal |
|
|
66
|
+
| `scripts/keychain-save.sh` | TTY: menu + secret prompt. No TTY: refuses, naming `--stdin` / `--json` | Refuses the same way even with a terminal |
|
|
67
|
+
| `scripts/phase-banner.sh` | Colour when stdout is a TTY and `TERM != dumb` | Plain text |
|
|
68
|
+
|
|
69
|
+
Anything not in this table does not read the variable. That is deliberate: a
|
|
70
|
+
list of four that is true beats a claim of coverage that is not.
|
|
71
|
+
|
|
72
|
+
## The model side already has a contract
|
|
73
|
+
|
|
74
|
+
The prompt-level question - what an agent does when it would call
|
|
75
|
+
`AskUserQuestion` and no one can answer - is `refs/picker-contract.md`, section
|
|
76
|
+
"Autopilot / non-interactive contract", and it predates this file. It resolves
|
|
77
|
+
from the remembered choice first, then the documented default, and records
|
|
78
|
+
which rule fired so the run stays readable afterwards.
|
|
79
|
+
|
|
80
|
+
The two are different layers and should not be merged. The picker contract
|
|
81
|
+
governs a model deciding; this file governs a process waiting. A run on a
|
|
82
|
+
server needs both, and only one of them can be enforced by a gate.
|
|
83
|
+
|
|
84
|
+
## Default behaviour is unchanged, and a gate says so
|
|
85
|
+
|
|
86
|
+
`smoke-unattended-profile.sh` (a maintainer gate, not shipped) asserts both directions. With the variable set,
|
|
87
|
+
each entry point above resolves or refuses under a hard timeout. With it unset,
|
|
88
|
+
each one produces byte-identical output to the behaviour it had before - the
|
|
89
|
+
assertion that matters most, because the whole point is that a local
|
|
90
|
+
interactive machine is not affected by any of this.
|
|
91
|
+
|
|
92
|
+
## The permission posture
|
|
93
|
+
|
|
94
|
+
Everything above concerns a process that would otherwise WAIT. There is a second
|
|
95
|
+
way an unattended run stops, and it does not wait at all.
|
|
96
|
+
|
|
97
|
+
autopilot spawns its child with `--permission-prompts none`. That stops Claude
|
|
98
|
+
Code from ASKING; it grants nothing. The tools the child then calls still have
|
|
99
|
+
to be allowed, and on a fresh machine they are not - so the run stops at the
|
|
100
|
+
first tool call, with no prompt anywhere for a person to answer. From the
|
|
101
|
+
outside it is indistinguishable from a queue with nothing to do.
|
|
102
|
+
|
|
103
|
+
`install --unattended` writes the profile that closes it:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npx @mmerterden/multi-agent-pipeline install --unattended --dry-run # show it
|
|
107
|
+
npx @mmerterden/multi-agent-pipeline install --unattended # write it
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Three properties, each one a promise to somebody who did not ask for this:
|
|
111
|
+
|
|
112
|
+
1. A DEFAULT install writes no permissions at all. Widening a permission set is
|
|
113
|
+
not something an installer does to a person who wanted files copied.
|
|
114
|
+
2. The profile is printed in full, with a reason per line, BEFORE anything is
|
|
115
|
+
written. "The installer changed my permissions" must never be a thing
|
|
116
|
+
discovered afterwards.
|
|
117
|
+
3. It is additive and idempotent. An entry a person added by hand survives, a
|
|
118
|
+
narrower rule is kept alongside, unrelated settings are untouched, and a
|
|
119
|
+
second run changes nothing. A `settings.json` that does not parse is refused
|
|
120
|
+
rather than overwritten.
|
|
121
|
+
|
|
122
|
+
The entries are broad, and that breadth is what unattended operation costs
|
|
123
|
+
rather than an oversight: a run builds and tests whatever the target repo uses,
|
|
124
|
+
so an allowlist narrow enough to be interesting is one the first unfamiliar repo
|
|
125
|
+
stops at. `doctor --profile=server` reports `unattended-permissions` against the
|
|
126
|
+
same rule the writer applies, so the two cannot disagree.
|
|
127
|
+
|
|
128
|
+
`smoke-unattended-install-profile.sh` asserts all of it, including that a plain
|
|
129
|
+
install still writes nothing.
|
|
@@ -97,7 +97,9 @@
|
|
|
97
97
|
"enum": ["remote", "local"],
|
|
98
98
|
"description": "Where the candidate ref list came from. local means the fetch failed and the list is the local cache plus local heads - possibly stale, possibly incomplete."
|
|
99
99
|
},
|
|
100
|
-
"chosen": {
|
|
100
|
+
"chosen": {
|
|
101
|
+
"type": "string"
|
|
102
|
+
},
|
|
101
103
|
"ambiguous": {
|
|
102
104
|
"type": "boolean",
|
|
103
105
|
"description": "Two or more candidates tied at the top score. Autopilot may not record derived when this is true."
|
|
@@ -107,8 +109,13 @@
|
|
|
107
109
|
"additionalProperties": false,
|
|
108
110
|
"description": "The release-branch template inferred from the refs that exist, never from a built-in table.",
|
|
109
111
|
"properties": {
|
|
110
|
-
"template": {
|
|
111
|
-
|
|
112
|
+
"template": {
|
|
113
|
+
"type": "string"
|
|
114
|
+
},
|
|
115
|
+
"members": {
|
|
116
|
+
"type": "integer",
|
|
117
|
+
"minimum": 0
|
|
118
|
+
}
|
|
112
119
|
}
|
|
113
120
|
},
|
|
114
121
|
"candidates": {
|
|
@@ -118,9 +125,18 @@
|
|
|
118
125
|
"additionalProperties": false,
|
|
119
126
|
"required": ["branch"],
|
|
120
127
|
"properties": {
|
|
121
|
-
"branch": {
|
|
122
|
-
|
|
123
|
-
|
|
128
|
+
"branch": {
|
|
129
|
+
"type": "string"
|
|
130
|
+
},
|
|
131
|
+
"score": {
|
|
132
|
+
"type": "number"
|
|
133
|
+
},
|
|
134
|
+
"refs": {
|
|
135
|
+
"type": "array",
|
|
136
|
+
"items": {
|
|
137
|
+
"type": "string"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
124
140
|
"evidence": {
|
|
125
141
|
"type": "array",
|
|
126
142
|
"items": {
|
|
@@ -140,26 +156,121 @@
|
|
|
140
156
|
"ref-provenance"
|
|
141
157
|
]
|
|
142
158
|
},
|
|
143
|
-
"detail": {
|
|
159
|
+
"detail": {
|
|
160
|
+
"type": "string"
|
|
161
|
+
}
|
|
144
162
|
}
|
|
145
163
|
}
|
|
146
164
|
}
|
|
147
165
|
}
|
|
148
166
|
}
|
|
149
167
|
},
|
|
150
|
-
"notes": {
|
|
168
|
+
"notes": {
|
|
169
|
+
"type": "array",
|
|
170
|
+
"items": {
|
|
171
|
+
"type": "string"
|
|
172
|
+
}
|
|
173
|
+
},
|
|
151
174
|
"askedOnIssue": {
|
|
152
175
|
"type": ["object", "null"],
|
|
153
176
|
"additionalProperties": false,
|
|
154
177
|
"description": "The one comment autopilot is allowed to post when the derivation is ambiguous, gated by prefs.global.baseBranchEvidence.autopilotAsksOnIssue (default false). A question, never a state change: no transition, no close, no assignee. Posting it trips circuit-breaker trigger 6 and the run waits for resume.",
|
|
155
178
|
"properties": {
|
|
156
|
-
"target": {
|
|
157
|
-
|
|
158
|
-
|
|
179
|
+
"target": {
|
|
180
|
+
"type": "string"
|
|
181
|
+
},
|
|
182
|
+
"url": {
|
|
183
|
+
"type": "string"
|
|
184
|
+
},
|
|
185
|
+
"at": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"format": "date-time"
|
|
188
|
+
}
|
|
159
189
|
}
|
|
160
190
|
}
|
|
161
191
|
}
|
|
162
192
|
},
|
|
193
|
+
"maturity": {
|
|
194
|
+
"type": "object",
|
|
195
|
+
"additionalProperties": false,
|
|
196
|
+
"description": "How ready the fetched item was to be developed. Produced by lib/issue-fetcher.sh, which owns the gap codes and their localized wording. Declared as of v17.6.0 - it had been written by every issue-shaped run since long before and read by Phase 0, Phase 4 and the clarifier, while this schema forbade it under additionalProperties: false.",
|
|
197
|
+
"properties": {
|
|
198
|
+
"score": {
|
|
199
|
+
"type": ["integer", "null"],
|
|
200
|
+
"minimum": 0,
|
|
201
|
+
"maximum": 100,
|
|
202
|
+
"description": "100 minus 40 per blocker and 10 per warning. Null for free-text input: there is no item to be immature."
|
|
203
|
+
},
|
|
204
|
+
"blockers": {
|
|
205
|
+
"type": "array",
|
|
206
|
+
"items": {
|
|
207
|
+
"type": "string"
|
|
208
|
+
},
|
|
209
|
+
"description": "Stable gap codes that stop a run: status_closed, already_resolved, description_empty."
|
|
210
|
+
},
|
|
211
|
+
"warnings": {
|
|
212
|
+
"type": "array",
|
|
213
|
+
"items": {
|
|
214
|
+
"type": "string"
|
|
215
|
+
},
|
|
216
|
+
"description": "Stable gap codes that do not stop a run on their own."
|
|
217
|
+
},
|
|
218
|
+
"summary": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"description": "The blockers and warnings rendered in outputLanguage. The one place this wording exists; maturity-followup.mjs quotes it rather than re-deriving it."
|
|
221
|
+
},
|
|
222
|
+
"accepted": {
|
|
223
|
+
"type": "array",
|
|
224
|
+
"items": {
|
|
225
|
+
"type": "string"
|
|
226
|
+
},
|
|
227
|
+
"description": "Gap codes a human explicitly waved through at the interactive maturity step. Recording WHICH gap was accepted is what separates an informed continue from a skipped check."
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
"maturityFollowup": {
|
|
232
|
+
"type": "object",
|
|
233
|
+
"additionalProperties": false,
|
|
234
|
+
"required": ["gaps", "askedAt"],
|
|
235
|
+
"description": "v17.6.0+ - the record of an autopilot run having asked about an immature item (refs/features/maturity-followup.md). Absent means never asked, which is what makes the first pass distinguishable from every pass after it.",
|
|
236
|
+
"properties": {
|
|
237
|
+
"gaps": {
|
|
238
|
+
"type": "array",
|
|
239
|
+
"items": {
|
|
240
|
+
"type": "string"
|
|
241
|
+
},
|
|
242
|
+
"description": "Sorted and deduplicated, so the next pass's comparison is stable rather than order-dependent."
|
|
243
|
+
},
|
|
244
|
+
"askedAt": {
|
|
245
|
+
"type": "string",
|
|
246
|
+
"format": "date-time"
|
|
247
|
+
},
|
|
248
|
+
"target": {
|
|
249
|
+
"type": "object",
|
|
250
|
+
"additionalProperties": false,
|
|
251
|
+
"properties": {
|
|
252
|
+
"kind": {
|
|
253
|
+
"type": "string",
|
|
254
|
+
"enum": ["jira", "github", "confluence", "analysis", "unknown"]
|
|
255
|
+
},
|
|
256
|
+
"key": {
|
|
257
|
+
"type": ["string", "null"]
|
|
258
|
+
},
|
|
259
|
+
"url": {
|
|
260
|
+
"type": ["string", "null"]
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
},
|
|
264
|
+
"commentUrl": {
|
|
265
|
+
"type": ["string", "null"]
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"waitingFor": {
|
|
270
|
+
"type": "string",
|
|
271
|
+
"enum": ["maturity", "user-channels-choice"],
|
|
272
|
+
"description": "The step a paused run must RE-ENTER, as opposed to the phase it should continue past. Declared as of v17.6.0: Phase 7's channels pause has written it since long before, and resume/SKILL.md never read it, so that pause was resumable only in prose. resume reads this first and falls back to currentPhase + 1 when it is absent. maturity: Phase 0's maturity step, with the item re-fetched (refs/features/maturity-followup.md). user-channels-choice: Phase 7's channels menu, with the stored channelsInput."
|
|
273
|
+
},
|
|
163
274
|
"workspaceSource": {
|
|
164
275
|
"type": "string",
|
|
165
276
|
"enum": ["asked", "command", "autopilot"],
|
|
@@ -969,6 +969,28 @@
|
|
|
969
969
|
}
|
|
970
970
|
}
|
|
971
971
|
},
|
|
972
|
+
"maturityFollowup": {
|
|
973
|
+
"type": "object",
|
|
974
|
+
"additionalProperties": false,
|
|
975
|
+
"description": "v17.6.0+ - what to do about an item the maturity check finds is not ready (refs/features/maturity-followup.md). The check has always produced a machine-readable gap list and then thrown it away: a blocker halted the run, the queue moved on, and the item stayed exactly as immature as it was found.",
|
|
976
|
+
"properties": {
|
|
977
|
+
"askInteractively": {
|
|
978
|
+
"type": "boolean",
|
|
979
|
+
"default": true,
|
|
980
|
+
"description": "An interactive blocker asks at the maturity step - open the item and fix it, continue without it (recording which gap was waved through), or abort - instead of ending the run with a summary. False restores the old halt."
|
|
981
|
+
},
|
|
982
|
+
"autopilotCommentsOnIssue": {
|
|
983
|
+
"type": "boolean",
|
|
984
|
+
"default": false,
|
|
985
|
+
"description": "OFF by default, and an outward-facing write. When on, an autopilot run posts ONE comment on the Jira or GitHub item asking for what is missing, then halts on the circuit breaker and waits for resume. A question, never a state change: no transition, no resolution, no assignee, no label, no close. The body uses Ref:, never Closes:/Fixes:/Resolves:, and its copy follows outputLanguage. It never comments twice for the same gap set - a changed item is re-checked, and only a DIFFERENT gap set earns a second comment."
|
|
986
|
+
},
|
|
987
|
+
"commentOnWarnings": {
|
|
988
|
+
"type": "boolean",
|
|
989
|
+
"default": false,
|
|
990
|
+
"description": "Treat warnings like blockers. Off by default because warnings have always auto-continued under autopilot, and converting them to halts in a release would stall queues overnight on items that ran fine yesterday. The gaps are recorded either way."
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
},
|
|
972
994
|
"baseBranchEvidence": {
|
|
973
995
|
"type": "object",
|
|
974
996
|
"additionalProperties": false,
|
|
@@ -1975,6 +1997,19 @@
|
|
|
1975
1997
|
"description": "Prefix of the identity label a created issue carries. The label is how a second run, on a second machine or by a second analyst, finds the tree it already made instead of opening a duplicate."
|
|
1976
1998
|
}
|
|
1977
1999
|
}
|
|
2000
|
+
},
|
|
2001
|
+
"mcpSurface": {
|
|
2002
|
+
"type": "object",
|
|
2003
|
+
"additionalProperties": false,
|
|
2004
|
+
"description": "v17.6.0+ - how many MCP servers this host has registered. Every registered server's tool list is charged against the context window on EVERY turn, and the user adds them one at a time without ever seeing the running total; our own toolkit contributes 99 tools by itself. `doctor` reports the count, it never disables anything.",
|
|
2005
|
+
"properties": {
|
|
2006
|
+
"infoAbove": {
|
|
2007
|
+
"type": "integer",
|
|
2008
|
+
"minimum": 0,
|
|
2009
|
+
"default": 8,
|
|
2010
|
+
"description": "Report the registered-server count once it exceeds this. The number is JUDGEMENT, not a measurement - it exists so the threshold is visible and adjustable instead of hidden in the script. 0 reports the count always."
|
|
2011
|
+
}
|
|
2012
|
+
}
|
|
1978
2013
|
}
|
|
1979
2014
|
}
|
|
1980
2015
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"max_tokens": 6500
|
|
14
14
|
},
|
|
15
15
|
"phase-3-dev": {
|
|
16
|
-
"max_tokens":
|
|
16
|
+
"max_tokens": 9450
|
|
17
17
|
},
|
|
18
18
|
"phase-4-review": {
|
|
19
19
|
"max_tokens": 15150
|
|
@@ -28,5 +28,5 @@
|
|
|
28
28
|
"max_tokens": 6350
|
|
29
29
|
}
|
|
30
30
|
},
|
|
31
|
-
"total_max_tokens":
|
|
31
|
+
"total_max_tokens": 63150
|
|
32
32
|
}
|