@seanyao/roll 4.630.2 → 4.702.2
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 +64 -0
- package/README.md +65 -56
- package/conventions/global/AGENTS.md +8 -7
- package/dist/roll.mjs +12909 -8532
- package/docs/INDEX.md +32 -0
- package/docs/architecture.md +444 -0
- package/docs/difftest-freeze-paradigm.md +113 -0
- package/docs/live-console.md +203 -0
- package/docs/manifesto.md +65 -0
- package/docs/migration/role-taxonomy-v4.md +60 -0
- package/docs/verification.md +83 -0
- package/guide/INDEX.md +86 -0
- package/guide/assets/layouts/cards-2.png +0 -0
- package/guide/assets/layouts/cards-3.png +0 -0
- package/guide/assets/layouts/cards-4.png +0 -0
- package/guide/assets/layouts/compare.png +0 -0
- package/guide/assets/layouts/highlight.png +0 -0
- package/guide/assets/layouts/pipeline.png +0 -0
- package/guide/assets/layouts/plain.png +0 -0
- package/guide/assets/layouts/quote.png +0 -0
- package/guide/assets/layouts/timeline.png +0 -0
- package/guide/en/acceptance-evidence.md +231 -0
- package/guide/en/ai-agents.md +185 -0
- package/guide/en/backlog-github-sync.md +108 -0
- package/guide/en/changelog.md +66 -0
- package/guide/en/configuration.md +112 -0
- package/guide/en/consistency.md +58 -0
- package/guide/en/conventions.md +113 -0
- package/guide/en/dream.md +121 -0
- package/guide/en/faq.md +855 -0
- package/guide/en/feedback.md +31 -0
- package/guide/en/getting-started.md +103 -0
- package/guide/en/installation.md +86 -0
- package/guide/en/legacy-onboarding.md +195 -0
- package/guide/en/loop-data-layout.md +256 -0
- package/guide/en/loop-driven-architecture.md +186 -0
- package/guide/en/loop.md +1324 -0
- package/guide/en/methodology.md +715 -0
- package/guide/en/migration-2.0.md +154 -0
- package/guide/en/overview.md +190 -0
- package/guide/en/pairing.md +151 -0
- package/guide/en/patterns/README.md +76 -0
- package/guide/en/patterns/graft-pattern.md +110 -0
- package/guide/en/patterns/replant-pattern.md +114 -0
- package/guide/en/patterns/seed-pattern.md +132 -0
- package/guide/en/peer.md +71 -0
- package/guide/en/pr-review.md +62 -0
- package/guide/en/practices/engineering-common-sense.md +395 -0
- package/guide/en/pricing.md +116 -0
- package/guide/en/project-setup.md +126 -0
- package/guide/en/roll-doc-audit.md +98 -0
- package/guide/en/skills.md +206 -0
- package/guide/en/test-isolation.md +51 -0
- package/guide/en/testing/quality-rubric.md +340 -0
- package/guide/en/testing.md +123 -0
- package/guide/en/tools.md +173 -0
- package/guide/skills.md +30 -0
- package/guide/zh/acceptance-evidence.md +194 -0
- package/guide/zh/ai-agents.md +170 -0
- package/guide/zh/backlog-github-sync.md +105 -0
- package/guide/zh/changelog.md +57 -0
- package/guide/zh/configuration.md +99 -0
- package/guide/zh/consistency.md +48 -0
- package/guide/zh/conventions.md +96 -0
- package/guide/zh/dream.md +97 -0
- package/guide/zh/faq.md +773 -0
- package/guide/zh/feedback.md +30 -0
- package/guide/zh/getting-started.md +96 -0
- package/guide/zh/installation.md +83 -0
- package/guide/zh/legacy-onboarding.md +192 -0
- package/guide/zh/loop-data-layout.md +236 -0
- package/guide/zh/loop-driven-architecture.md +186 -0
- package/guide/zh/loop.md +1124 -0
- package/guide/zh/methodology.md +702 -0
- package/guide/zh/migration-2.0.md +154 -0
- package/guide/zh/overview.md +186 -0
- package/guide/zh/pairing.md +117 -0
- package/guide/zh/patterns/README.md +74 -0
- package/guide/zh/patterns/graft-pattern.md +108 -0
- package/guide/zh/patterns/replant-pattern.md +112 -0
- package/guide/zh/patterns/seed-pattern.md +130 -0
- package/guide/zh/peer.md +63 -0
- package/guide/zh/pr-review.md +54 -0
- package/guide/zh/practices/engineering-common-sense.md +393 -0
- package/guide/zh/pricing.md +97 -0
- package/guide/zh/project-setup.md +114 -0
- package/guide/zh/roll-doc-audit.md +90 -0
- package/guide/zh/skills.md +191 -0
- package/guide/zh/test-isolation.md +46 -0
- package/guide/zh/testing/quality-rubric.md +284 -0
- package/guide/zh/testing.md +116 -0
- package/guide/zh/tools.md +173 -0
- package/package.json +4 -1
- package/skills/README.md +1 -0
- package/skills/roll-.qa/SKILL.md +1 -1
- package/skills/roll-.review/SKILL.md +1 -1
- package/skills/roll-build/SKILL.md +1 -1
- package/skills/roll-build/references/full-contract.md +16 -13
- package/skills/roll-design/SKILL.md +3 -3
- package/skills/roll-design/references/full-contract.md +17 -13
- package/skills/roll-fix/SKILL.md +1 -1
- package/skills/roll-fix/references/full-contract.md +13 -10
- package/skills/roll-peer/SKILL.md +1 -1
- package/skills/roll-prime/SKILL.md +77 -0
- package/skills/roll-prime/references/explorer-annex.md +39 -0
- package/skills/roll-prime/references/supervisor-prompt.md +165 -0
- package/skills/route-cases/skills.json +10 -0
- package/template/AGENTS.md +3 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Acceptance Review Page — `roll attest`
|
|
2
|
+
|
|
3
|
+
Every delivered story can carry a **single-file Acceptance Review Page**: per-AC
|
|
4
|
+
verdicts with the artifacts that back them, openable offline, printable to PDF,
|
|
5
|
+
readable by non-engineers.
|
|
6
|
+
|
|
7
|
+
## Where Review Pages live
|
|
8
|
+
|
|
9
|
+
Every story has ONE home — its card folder under the epic:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
.roll/features/<epic>/<id>/<run-id>/<id>-review.html ← Acceptance Review Page (self-contained)
|
|
13
|
+
.roll/features/<epic>/<id>/<run-id>/<id>-report.html ← legacy report alias (one release cycle)
|
|
14
|
+
.roll/features/<epic>/<id>/<run-id>/evidence.json ← collected hard facts
|
|
15
|
+
.roll/features/<epic>/<id>/<run-id>/evidence/ ← raw command/test artifacts
|
|
16
|
+
.roll/features/<epic>/<id>/<run-id>/screenshots/ ← visual proof, when relevant
|
|
17
|
+
.roll/features/<epic>/<id>/ac-map.json ← AC → evidence intent map
|
|
18
|
+
.roll/features/<epic>/<id>/latest ← symlink to the newest run
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Runs are timestamped and never overwritten. The backlog `✅ Done` row links to
|
|
22
|
+
`latest/<id>-review.html`; CHANGELOG bullets may carry an invisible
|
|
23
|
+
`<!-- evidence: ... -->` marker for traceability.
|
|
24
|
+
|
|
25
|
+
**The story's `latest/<id>-review.html` is the human acceptance entry.** A
|
|
26
|
+
story is accepted by opening its own Acceptance Review Page — not a global archive/index page.
|
|
27
|
+
`roll attest` is story-scoped: it writes only this story's Review Page, the legacy report alias, and the
|
|
28
|
+
`latest` pointer. It does not refresh any global archive, epic, or front-page
|
|
29
|
+
HTML. Those board pages, when you want them, are rendered on demand with
|
|
30
|
+
the archive rebuild; they are a convenience/archive view, not the delivery-truth surface.
|
|
31
|
+
|
|
32
|
+
## Lifecycle in three stages
|
|
33
|
+
|
|
34
|
+
1. Open the evidence frame. At the beginning of a loop cycle the runner creates
|
|
35
|
+
the timestamped run directory and exports it to the inner agent as
|
|
36
|
+
`ROLL_RUN_DIR`. The derived directories `ROLL_EVIDENCE_DIR` and
|
|
37
|
+
`ROLL_SCREENSHOTS_DIR` point at `<run-id>/evidence/` and
|
|
38
|
+
`<run-id>/screenshots/`.
|
|
39
|
+
2. Collect during execution. `roll test` writes command output and summaries
|
|
40
|
+
into `ROLL_EVIDENCE_DIR`; visual lanes write screenshots into
|
|
41
|
+
`ROLL_SCREENSHOTS_DIR` when the surface requires inspection. The agent keeps
|
|
42
|
+
`ac-map.json` in the story card root, mapping each AC to the evidence files
|
|
43
|
+
that support it, with a status per AC: `pass` · `readonly` · `partial` ·
|
|
44
|
+
`claimed` · `missing`.
|
|
45
|
+
3. Close with the hard attest gate. The runner calls
|
|
46
|
+
`roll attest <story-id> --run-dir "$ROLL_RUN_DIR"` at the end of delivery.
|
|
47
|
+
`roll attest` sweeps the hard facts (TCR commits, latest CI run, optional
|
|
48
|
+
deploy probe, test-pass proof), renders the Acceptance Review Page, and moves `latest` to the
|
|
49
|
+
run. That is all it writes — it is story-scoped. It does not mount a story
|
|
50
|
+
archive delivery section, regenerate `.roll/index.json`, or refresh any global
|
|
51
|
+
archive/epic/front page (run the archive rebuild on demand for those board pages).
|
|
52
|
+
|
|
53
|
+
`roll attest` also runs standalone — without an intent map every AC renders as
|
|
54
|
+
🟧 Claimed, honestly.
|
|
55
|
+
|
|
56
|
+
## Gate policy
|
|
57
|
+
|
|
58
|
+
The attest gate is **hard by default**. A delivered story with ACs but no fresh,
|
|
59
|
+
contentful report is blocked rather than marked `✅ Done`. During an explicit
|
|
60
|
+
migration window a project may set `.roll/policy.yaml` to soft mode:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
loop_safety:
|
|
64
|
+
attest_gate: soft
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Soft mode records the gap and raises the same audit signal, but it does not
|
|
68
|
+
block the delivery cycle. Treat it as temporary compatibility, not the default.
|
|
69
|
+
|
|
70
|
+
## The red line
|
|
71
|
+
|
|
72
|
+
An AC with **zero evidence** can never claim `pass`: the renderer forces it
|
|
73
|
+
down to 🟧 Claimed and lists it under **Discrepancies**. Verbal completion
|
|
74
|
+
("I confirmed it works") is exactly what this rules out.
|
|
75
|
+
|
|
76
|
+
## Declaring visual evidence at design time
|
|
77
|
+
|
|
78
|
+
`roll story validate` checks, at design time, that a spec is *born* with a
|
|
79
|
+
visual-evidence AC (and, for a web surface, a declared product page to capture).
|
|
80
|
+
Two rules decide what the validator recognises:
|
|
81
|
+
|
|
82
|
+
- **The `[visual-evidence]` marker is authoritative.** An AC item that opens with
|
|
83
|
+
a literal `[visual-evidence]` marker *is* a visual-evidence AC — on its own, no
|
|
84
|
+
matter what words follow. You do not need to also write "screenshot" / "截图":
|
|
85
|
+
the marker is your explicit declaration. (Without the marker, the validator
|
|
86
|
+
still recognises unambiguous nouns like `screenshot` / `截图` / `录屏`.)
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
- [ ] [visual-evidence] headless capture of the Now landing and each tab
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- **The declared surface wins over AC text.** Once a spec has a visual-evidence
|
|
93
|
+
AC, its surface is read from the frontmatter first:
|
|
94
|
+
- a declared `deliverable_url:` (alias `screenshot_url:`) ⇒ **web** — the card
|
|
95
|
+
has committed to a real product page, so it owes a web screenshot;
|
|
96
|
+
- a declared `physical_terminal:` ⇒ **terminal** with a stricter contract — the
|
|
97
|
+
report must contain a real macOS `Terminal.app` screenshot captured from
|
|
98
|
+
screen pixels. Headless stdout, transcript-rendered images, and HTML replays
|
|
99
|
+
are rejected for this contract;
|
|
100
|
+
- else a declared `deliverable_cmd:` ⇒ **terminal** — a CLI deliverable that
|
|
101
|
+
rides the terminal-capture lane;
|
|
102
|
+
- else the AC text decides (web / terminal / ambiguous).
|
|
103
|
+
|
|
104
|
+
So a card that declares `deliverable_url: .roll/features/agents.html` is judged
|
|
105
|
+
a **web** surface even when its AC prose mentions a `roll` command.
|
|
106
|
+
|
|
107
|
+
## Evidence Modes
|
|
108
|
+
|
|
109
|
+
Stories may declare `evidence_mode:` in frontmatter, or an Evaluation contract
|
|
110
|
+
may declare `- evidence_mode: ...`. Roll also derives a mode for Evaluator
|
|
111
|
+
prompts, but only an explicit non-visual mode changes the screenshot gate.
|
|
112
|
+
That explicit mode is not a blank override: a declared URL, terminal command,
|
|
113
|
+
physical terminal, or visual-evidence AC still escalates to the relevant capture
|
|
114
|
+
gate.
|
|
115
|
+
|
|
116
|
+
| Mode | Required proof | Screenshot policy |
|
|
117
|
+
|------|----------------|-------------------|
|
|
118
|
+
| `visual_ui` | rendered visual capture, functional/smoke check, CI | required |
|
|
119
|
+
| `cli_output` | stdout/stderr snapshot, exit code, command fixture or focused test, CI | conditional; required for terminal/TUI visual changes |
|
|
120
|
+
| `refactor_contract` | focused tests, typecheck/build, grep/no-old-symbol checks, CI | not required unless visual risk is present |
|
|
121
|
+
| `data_state` | fixture replay, event assertions, idempotency/concurrency coverage, CI | not required unless visual risk is present |
|
|
122
|
+
| `docs_content` | rendered text checks, link checks, diff review, CI | conditional; required for layout changes |
|
|
123
|
+
|
|
124
|
+
`screenshot_exempt:` should name or imply the alternate matrix, preferably by
|
|
125
|
+
pairing it with `evidence_mode: refactor_contract`, `data_state`, or
|
|
126
|
+
`docs_content`. QA/Evaluator may escalate any non-visual mode back to a screenshot
|
|
127
|
+
gate when a visual surface changed, an AC explicitly asks for visual evidence, or
|
|
128
|
+
prior evidence exposes rendering/layout risk; the escalation reason must be
|
|
129
|
+
recorded.
|
|
130
|
+
|
|
131
|
+
## External tool readiness
|
|
132
|
+
|
|
133
|
+
Visual evidence uses machine-level tools that are declared explicitly and probed
|
|
134
|
+
at startup:
|
|
135
|
+
|
|
136
|
+
- `macOS screencapture` — physical Terminal.app / browser-window screenshot
|
|
137
|
+
capture. It is built into macOS, but Terminal.app, the stable roll capture
|
|
138
|
+
host, must have Screen Recording permission. Missing permission means attest
|
|
139
|
+
records an honest screenshot skip; headless, transcript-rendered, and HTML
|
|
140
|
+
reproduction images do not count as screenshot evidence. A successful
|
|
141
|
+
interactive `Terminal.app` permission probe is cached under `ROLL_HOME` so
|
|
142
|
+
repeated `roll doctor` / setup checks do not keep re-triggering the macOS
|
|
143
|
+
prompt; if permission was just granted, restart Terminal.app before trusting
|
|
144
|
+
the cache.
|
|
145
|
+
- `Playwright Chromium` — optional headless web capture for `roll attest` and
|
|
146
|
+
archive screenshots. Install with `npx playwright install chromium`.
|
|
147
|
+
|
|
148
|
+
`roll doctor` always prints the current availability, permission state, impact,
|
|
149
|
+
and repair command for these tools. Use `roll doctor --tools` when you only want
|
|
150
|
+
the focused tool and Terminal.app Screen Recording readiness view. `roll init`
|
|
151
|
+
and `roll loop go` run the same probe at startup; in an interactive terminal they ask whether to install/open
|
|
152
|
+
the missing setup steps, and in automation they stay silent unless
|
|
153
|
+
`ROLL_EXTERNAL_TOOLS=yes` or `ROLL_EXTERNAL_TOOLS=no` is set. Choosing `no`
|
|
154
|
+
prints the evidence impact and continues without changing the machine.
|
|
155
|
+
|
|
156
|
+
The machine Agents page (`.roll/features/agents.html`) includes the same tool
|
|
157
|
+
status block so a reviewer can see whether evidence capture depends on
|
|
158
|
+
machine setup rather than story code.
|
|
159
|
+
|
|
160
|
+
## Review Score fold
|
|
161
|
+
|
|
162
|
+
When `.roll/notes/` carries the story's Review Score entry, the report ends
|
|
163
|
+
with a collapsed *Review Score · 评审分* section. No entry → no section. The
|
|
164
|
+
Review Score is produced by a fresh-session peer Reviewer, never by the
|
|
165
|
+
building agent.
|
|
166
|
+
|
|
167
|
+
## Where cards come from — `roll idea`
|
|
168
|
+
|
|
169
|
+
Add a card with one natural-language sentence:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
roll idea "Refund flow is broken for partial payments"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`roll idea` auto-classifies it (bug → FIX / feature → IDEA), assigns the
|
|
176
|
+
next id in that family, lint-checks the description, infers the right epic
|
|
177
|
+
folder, and mints the full card folder (spec.md + story page + index
|
|
178
|
+
refresh). All in one command.
|
|
179
|
+
|
|
180
|
+
For explicit control over id and epic, the internal `roll story new` is
|
|
181
|
+
available:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
roll story new US-PAY-001 --title "Refund flow" --epic payments
|
|
185
|
+
# the ONE minting entry: card folder + backlog row + index refresh in one step.
|
|
186
|
+
# Batch minting: add --no-index per card, finish with a single the archive rebuild.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Both channels write the frontmatter'd `spec.md`, the story page skeleton,
|
|
190
|
+
and refresh `.roll/index.json`. They refuse to overwrite an existing card —
|
|
191
|
+
cards are born once, then evolved by hand. Skills never hand-create card
|
|
192
|
+
files; the `cards` consistency dimension fails the release gate on any
|
|
193
|
+
live backlog row without a card.
|
|
194
|
+
|
|
195
|
+
## Static Archive — the archive rebuild
|
|
196
|
+
|
|
197
|
+
the archive rebuild is an on-demand repair/archive renderer. It regenerates browsable,
|
|
198
|
+
three-layer static HTML pages (every page is self-contained, localized with one
|
|
199
|
+
visible language at a time, theme-aware, printable):
|
|
200
|
+
|
|
201
|
+
```
|
|
202
|
+
.roll/features/index.html ← archive front page (Story / Cycle /
|
|
203
|
+
Release), truth strip, searchable epic cards
|
|
204
|
+
.roll/features/<epic>/index.html ← epic page: epic ledger + stories in three
|
|
205
|
+
groups (merged / in a cycle / in backlog)
|
|
206
|
+
.roll/features/<epic>/<id>/index.html ← story archive: five stations — Definition,
|
|
207
|
+
Design, Execution, Delivery (attest banner
|
|
208
|
+
+ per-AC evidence blocks), Retrospective
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Every figure is computed from the truth model — anchors -> selectors -> adapter
|
|
212
|
+
-> projections — never typed in. Story facts compare backlog claims with merge
|
|
213
|
+
and evidence truth; Cycle facts use TerminalOutcome records; Release facts use
|
|
214
|
+
the latest gate verdict and active waiver. The guiding line: **backlog is wish,
|
|
215
|
+
main is truth, done ≡ merged.**
|
|
216
|
+
|
|
217
|
+
The archive front page keeps unknown visible. `?` means the fact is absent
|
|
218
|
+
or outside the known schema; `0` means a known zero. A premature backlog
|
|
219
|
+
`✅ Done` row is treated as a claim that conflicts with truth and is rendered as
|
|
220
|
+
drift, not as delivered work.
|
|
221
|
+
|
|
222
|
+
On story archive pages, screenshot evidence remains a thumbnail linked to the
|
|
223
|
+
full image. Text evidence such as Vitest output is read from the referenced
|
|
224
|
+
evidence file and shown inline under the AC in a folded, scrollable block; if
|
|
225
|
+
the file is missing or unreadable, the page shows an explicit unavailable state.
|
|
226
|
+
|
|
227
|
+
The current delivery truth remains story-scoped attest plus CLI-first
|
|
228
|
+
observability (`roll status`, `roll loop watch`, `roll loop runs`,
|
|
229
|
+
`roll loop cycle <id>`). Use the archive rebuild by hand for reconciliation, archive
|
|
230
|
+
export, CI artifacts, or migration repair; rebuild mode re-renders every story
|
|
231
|
+
page from source after hand-merges or history migrations.
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# Roll — AI Agent Support
|
|
2
|
+
|
|
3
|
+
Roll treats AI agents as a scoped pool of execution identities. The current
|
|
4
|
+
model is:
|
|
5
|
+
|
|
6
|
+
```text
|
|
7
|
+
Scope -> Role -> Binding -> Agent -> optional Model
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
The same shape repeats at every level. A machine can declare the agents it has,
|
|
11
|
+
a project can bind roles for its work, and a story or skill can narrow those
|
|
12
|
+
bindings when needed.
|
|
13
|
+
|
|
14
|
+
## Agent-Domain Files
|
|
15
|
+
|
|
16
|
+
- `~/.roll/agents.yaml` is Machine Scope. It declares the local agent pool and
|
|
17
|
+
machine-level roles such as `supervise`.
|
|
18
|
+
- `.roll/agents.yaml` is Project Scope. It binds project/story roles such as
|
|
19
|
+
`supervise`, `execute`, and `evaluate`.
|
|
20
|
+
|
|
21
|
+
`~/.roll/config.yaml` may still exist for generic preferences and legacy
|
|
22
|
+
migration input, but it is no longer the primary authoring surface for agent
|
|
23
|
+
semantics. Use:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
roll agent # show Machine Scope, Project Scope, roles, pool, and legacy inputs
|
|
27
|
+
roll agent migrate --dry-run # preview conversion from legacy files
|
|
28
|
+
roll agent migrate # write roll-agents/v1 files
|
|
29
|
+
roll agent list # show installed agents
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Roles
|
|
33
|
+
|
|
34
|
+
Roll uses three core Agent-domain roles:
|
|
35
|
+
|
|
36
|
+
- `supervise` — coordinates at project level. In guided mode this may be the
|
|
37
|
+
current agent session you are talking to; in autonomous mode Roll resolves the
|
|
38
|
+
role and drives the loop.
|
|
39
|
+
- `execute` — builds or fixes a story through the selected skill workflow.
|
|
40
|
+
- `evaluate` — reviews, scores, or checks the delivery in a fresh session.
|
|
41
|
+
|
|
42
|
+
**Who played each role in a finished cycle?** After a cycle runs, the resolved
|
|
43
|
+
roles are not a mystery you have to reconstruct from logs. Run
|
|
44
|
+
`roll loop cycle <id> --roles` to see exactly who was Builder and who was Evaluator,
|
|
45
|
+
which peers were consulted, and which single score the gate accepted. The same
|
|
46
|
+
cast is written to `summary.md` / `summary.json` and embedded in the story's
|
|
47
|
+
Execution Cast report block. See
|
|
48
|
+
[Cycle Role Visibility](./loop.md#cycle-role-visibility) for the full surface.
|
|
49
|
+
|
|
50
|
+
Project defaults normally bind story roles:
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
schema: roll-agents/v1
|
|
54
|
+
scope: project
|
|
55
|
+
inherits: machine
|
|
56
|
+
defaults:
|
|
57
|
+
story:
|
|
58
|
+
roles:
|
|
59
|
+
execute:
|
|
60
|
+
kind: select
|
|
61
|
+
from: [kimi, codex, pi]
|
|
62
|
+
require: [execute]
|
|
63
|
+
strategy: first-available
|
|
64
|
+
evaluate:
|
|
65
|
+
kind: select
|
|
66
|
+
from: [claude, codex, kimi, pi, agy, reasonix, cursor]
|
|
67
|
+
require: [evaluate]
|
|
68
|
+
strategy: health-aware
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Machine scope can declare a supervisor and the local pool:
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
schema: roll-agents/v1
|
|
75
|
+
scope: machine
|
|
76
|
+
agents:
|
|
77
|
+
codex:
|
|
78
|
+
capabilities: [supervise, execute, evaluate]
|
|
79
|
+
kimi:
|
|
80
|
+
capabilities: [execute, evaluate]
|
|
81
|
+
roles:
|
|
82
|
+
supervise:
|
|
83
|
+
use: codex
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Fair Eligibility
|
|
87
|
+
|
|
88
|
+
Static config lists fair candidates. It should not permanently exclude a
|
|
89
|
+
supported agent because of an old auth, VPN, account, or network incident.
|
|
90
|
+
Runtime health is checked when Roll resolves or spawns the role:
|
|
91
|
+
|
|
92
|
+
- unavailable candidates are skipped for the current resolution;
|
|
93
|
+
- the skip is recorded as a runtime fact;
|
|
94
|
+
- the static pool remains fair until you intentionally narrow it.
|
|
95
|
+
|
|
96
|
+
Unknown or unregistered agent names fail loud during config parsing.
|
|
97
|
+
|
|
98
|
+
`health-aware` is the selection strategy for open role casting. It keeps the
|
|
99
|
+
same installed pool visible for Designer, Builder, Evaluator, and Peer Reviewer
|
|
100
|
+
unless an owner policy narrows the pool, then ranks candidates with recent
|
|
101
|
+
health signals, role capability tags, successful deliveries, recent use, and
|
|
102
|
+
cost band. A degraded candidate stays visible with warnings, but a healthy
|
|
103
|
+
candidate with the right capability wins. A cheap weaker agent can remain
|
|
104
|
+
eligible for focused work while ranking lower for broad or high-risk Builder
|
|
105
|
+
work.
|
|
106
|
+
|
|
107
|
+
Use the route trace when you need to see the cast instead of guessing:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
roll supervisor route --role builder --story US-123
|
|
111
|
+
roll supervisor route --role evaluator --story US-123 --json
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The trace lists every candidate, eligibility, score reasons, warnings, skipped
|
|
115
|
+
runtime facts, selected agent, strategy, and source binding.
|
|
116
|
+
|
|
117
|
+
## Guided vs Autonomous Mode
|
|
118
|
+
|
|
119
|
+
In guided mode, you can keep working in the current agent window. That session
|
|
120
|
+
acts as the supervisor front door: it can inspect `roll agent`, run migrations,
|
|
121
|
+
and ask Roll to continue through the CLI.
|
|
122
|
+
|
|
123
|
+
In autonomous mode, you do not open multiple agent windows manually. The loop
|
|
124
|
+
resolves `supervise`, `story.execute`, and `story.evaluate`, then spawns fresh
|
|
125
|
+
agent sessions for the roles through the configured bindings.
|
|
126
|
+
|
|
127
|
+
## Supported Agents
|
|
128
|
+
|
|
129
|
+
| Agent | CLI command | Notes |
|
|
130
|
+
|-------|-------------|-------|
|
|
131
|
+
| Claude Code | `claude` | Anthropic coding agent. |
|
|
132
|
+
| Kimi CLI | `kimi-code` (legacy: `kimi-cli` / `kimi`) | Moonshot coding agent. |
|
|
133
|
+
| Codex CLI | `codex` | OpenAI coding agent; `openai` aliases to `codex`. |
|
|
134
|
+
| Antigravity | `agy` | Google Antigravity agent; legacy `gemini` aliases to `agy`. |
|
|
135
|
+
| Pi | `pi` | The `deepseek` alias resolves to `pi`. |
|
|
136
|
+
| Reasonix | `reasonix` | DeepSeek-native coding agent; requires `DEEPSEEK_API_KEY`. |
|
|
137
|
+
| Cursor | `cursor-agent` | Cursor headless agent; day-one usage is recorded as `?` until parseable token/cost output is available. |
|
|
138
|
+
|
|
139
|
+
Agent-specific behavior belongs in one profile, not in downstream runner gates:
|
|
140
|
+
|
|
141
|
+
1. Add the public registry entry in `packages/core/src/agent/specs.ts`.
|
|
142
|
+
2. Add or update the runner profile in `packages/cli/src/runner/agent-spawn.ts`.
|
|
143
|
+
3. Keep executor, attest, pairing, and scoring code agent-agnostic.
|
|
144
|
+
4. Add unit coverage for the profile and registry entry.
|
|
145
|
+
|
|
146
|
+
## Agent Toolchain Health (US-V4-022)
|
|
147
|
+
|
|
148
|
+
Supervisor treats agent toolchain health as part of coordination, not as an
|
|
149
|
+
owner-side mystery. It scans warnings, auth/network status, polluted skill
|
|
150
|
+
roots, stale setup sync, and worktree permission failures, then classifies them
|
|
151
|
+
into one of four operational categories:
|
|
152
|
+
|
|
153
|
+
- **auth_block** — "403", "please run /login", "Unauthorized" → `pause_for_owner`
|
|
154
|
+
- **network_block** — `ECONNREFUSED`, `ETIMEDOUT`, DNS failure → `continue`
|
|
155
|
+
(transient; loop retries or breathes)
|
|
156
|
+
- **setup_skill_root_pollution** — Reasonix auxiliary-dir warnings, skills with no
|
|
157
|
+
description → `create_fix` → routed to the delta team as a FIX
|
|
158
|
+
- **worktree_permission_failure** — `EACCES` / "permission denied" on a worktree
|
|
159
|
+
path → `pause_for_owner`
|
|
160
|
+
|
|
161
|
+
When the signal is setup/skill-root pollution, Supervisor must **not** label it
|
|
162
|
+
as auth-blocked. It routes the repair to the backlog/delta team as a FIX,
|
|
163
|
+
instead of asking the owner to debug ad hoc. Supervisor coordinates and
|
|
164
|
+
diagnoses these issues but does not become the Builder or Evaluator, and it does
|
|
165
|
+
not auto-delete global files.
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
roll supervisor health # human-readable health board
|
|
169
|
+
roll supervisor health --json # machine-readable classifications
|
|
170
|
+
roll supervisor next # next card + agent health summary
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Legacy Compatibility
|
|
174
|
+
|
|
175
|
+
Older projects may still contain `.roll/local.yaml agent`, `.roll/pairing.yaml`,
|
|
176
|
+
or v3 route slots in `.roll/agents.yaml`. `roll agent` shows them under
|
|
177
|
+
`Legacy compatibility`, and `roll agent migrate` converts their useful data into
|
|
178
|
+
the scoped model. They remain readable compatibility inputs, not the primary
|
|
179
|
+
agent-management model.
|
|
180
|
+
|
|
181
|
+
## See Also
|
|
182
|
+
|
|
183
|
+
- [configuration.md](configuration.md) — config and policy files
|
|
184
|
+
- [pairing.md](pairing.md) — evaluate-role review and scoring
|
|
185
|
+
- [loop.md](loop.md) — autonomous role resolution
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# roll backlog sync — pull GitHub Issues into your backlog
|
|
2
|
+
|
|
3
|
+
`roll backlog sync` pulls issues from a GitHub repository and writes them
|
|
4
|
+
into your local `.roll/backlog.md`. It is single-direction
|
|
5
|
+
(issues → backlog) in v1: nothing is written back to GitHub.
|
|
6
|
+
|
|
7
|
+
`roll backlog sync` 把 GitHub Issues 拉进本地 `.roll/backlog.md`。
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
The sync resolves a GitHub token in this order:
|
|
12
|
+
|
|
13
|
+
1. `$GITHUB_TOKEN` — set it in your environment or CI secrets.
|
|
14
|
+
2. `gh auth token` — falls back to the GitHub CLI if you have run
|
|
15
|
+
`gh auth login`.
|
|
16
|
+
|
|
17
|
+
If neither is available the command stops and tells you how to set one.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
export GITHUB_TOKEN=ghp_xxx
|
|
21
|
+
# or, if you use the GitHub CLI:
|
|
22
|
+
gh auth login
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick start
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
# First sync must name the repo explicitly:
|
|
29
|
+
roll backlog sync --repo seanyao/roll-meta
|
|
30
|
+
|
|
31
|
+
# Preview without writing anything:
|
|
32
|
+
roll backlog sync --repo seanyao/roll-meta --dry-run
|
|
33
|
+
|
|
34
|
+
# Only pull issues carrying specific labels (OR semantics):
|
|
35
|
+
roll backlog sync --repo seanyao/roll-meta --label P1,bug
|
|
36
|
+
|
|
37
|
+
# After the first run the repo is remembered, so you can omit --repo:
|
|
38
|
+
roll backlog sync
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Flags
|
|
42
|
+
|
|
43
|
+
| Flag | Notes |
|
|
44
|
+
|--------------|-------|
|
|
45
|
+
| `--repo` | `owner/repo`. Required on the first sync; afterwards read from config. |
|
|
46
|
+
| `--dry-run` | Compute the diff and print it, but leave `.roll/backlog.md` unchanged. |
|
|
47
|
+
| `--label` | Comma-separated label filter. May repeat. Matches any (OR). |
|
|
48
|
+
|
|
49
|
+
## label → type mapping
|
|
50
|
+
|
|
51
|
+
The issue's labels decide the backlog type prefix. The first matching
|
|
52
|
+
label wins; with no match the default is `US`.
|
|
53
|
+
|
|
54
|
+
| GitHub label | Backlog type |
|
|
55
|
+
|-----------------------------|--------------|
|
|
56
|
+
| `bug` | `FIX` |
|
|
57
|
+
| `enhancement` / `feature` / `US` | `US` |
|
|
58
|
+
| `refactor` | `REFACTOR` |
|
|
59
|
+
| (no matching label) | `US` |
|
|
60
|
+
|
|
61
|
+
Issue state maps to the status column: `open` → `📋 Todo`,
|
|
62
|
+
`closed` → `✅ Done`. The issue title becomes the row description.
|
|
63
|
+
|
|
64
|
+
## IDs and idempotency
|
|
65
|
+
|
|
66
|
+
Each issue gets a stable backlog id `GH-<number>` (e.g. issue #13 →
|
|
67
|
+
`GH-13`), combined with the type prefix (`US-GH-13`, `FIX-GH-13`).
|
|
68
|
+
|
|
69
|
+
Sync is idempotent: a second run skips any issue whose id already exists
|
|
70
|
+
in `.roll/backlog.md` — it never overwrites the status or description of
|
|
71
|
+
an existing row, and prints `skipped (already exists): GH-13`. Each run
|
|
72
|
+
ends with a summary:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
added: 2, skipped: 5, total issues: 7
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`--dry-run` prints the same diff with `+` (would add) and `=` (would
|
|
79
|
+
skip) markers and never touches the file.
|
|
80
|
+
|
|
81
|
+
## Configuration: `.roll/local.yaml`
|
|
82
|
+
|
|
83
|
+
After a successful real sync the resolved repo, labels and timestamp are
|
|
84
|
+
persisted so later runs can omit `--repo`:
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
backlog_sync:
|
|
88
|
+
repo: seanyao/roll-meta
|
|
89
|
+
direction: issues-to-backlog
|
|
90
|
+
labels: []
|
|
91
|
+
last_sync_at: 2026-05-28T10:00:00Z
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
| Field | Meaning |
|
|
95
|
+
|-----------------|---------|
|
|
96
|
+
| `repo` | Default `owner/repo` for flagless syncs. |
|
|
97
|
+
| `direction` | Always `issues-to-backlog` in v1. |
|
|
98
|
+
| `labels` | Default label filter; an explicit `--label` flag overrides it. |
|
|
99
|
+
| `last_sync_at` | Timestamp of the last successful sync. |
|
|
100
|
+
|
|
101
|
+
An explicit flag always overrides the persisted config. If
|
|
102
|
+
`.roll/local.yaml` has no `backlog_sync:` block, the first sync must pass
|
|
103
|
+
`--repo`.
|
|
104
|
+
|
|
105
|
+
## Not in v1
|
|
106
|
+
|
|
107
|
+
Two-way write-back, Projects/Milestones mapping, PR linking, non-GitHub
|
|
108
|
+
platforms, and custom mapping rules are out of scope for v1.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Roll — Changelog
|
|
2
|
+
|
|
3
|
+
Roll keeps `CHANGELOG.md` in sync automatically. You never have to write or
|
|
4
|
+
update it manually.
|
|
5
|
+
|
|
6
|
+
## How It Works
|
|
7
|
+
|
|
8
|
+
1. `$roll-build` (or `$roll-fix`) delivers a story and stages `CHANGELOG.md`.
|
|
9
|
+
2. The story completion commit includes `CHANGELOG.md` — no separate commit.
|
|
10
|
+
3. On release, Roll's release process renames `## Unreleased` to the version tag.
|
|
11
|
+
|
|
12
|
+
## What Gets Written
|
|
13
|
+
|
|
14
|
+
The `$roll-.changelog` skill reads `BACKLOG.md` and writes a bullet for each
|
|
15
|
+
completed story or fix. It filters for user-visible changes only:
|
|
16
|
+
|
|
17
|
+
**Written:**
|
|
18
|
+
- New commands users can invoke
|
|
19
|
+
- Bug fixes users would notice
|
|
20
|
+
- Visible behavior changes (layout, output, speed)
|
|
21
|
+
- Install / upgrade changes
|
|
22
|
+
|
|
23
|
+
**Skipped:**
|
|
24
|
+
- Internal refactors
|
|
25
|
+
- Test infrastructure changes
|
|
26
|
+
- Developer-only bug fixes
|
|
27
|
+
- Implementation details
|
|
28
|
+
|
|
29
|
+
The skill enforces a style gate — bullets are short, plain-language,
|
|
30
|
+
user-facing. Technical jargon triggers a rewrite loop.
|
|
31
|
+
|
|
32
|
+
## Release-ready sections
|
|
33
|
+
|
|
34
|
+
`roll release` treats the changelog as ready in either shape: an
|
|
35
|
+
`## Unreleased` section with bullets, **or** a pre-written next-version
|
|
36
|
+
section at the top (`## v3.608.1 — 2026-06-08`) naming a version newer than
|
|
37
|
+
package.json's current — the release flow's own convention. A first section
|
|
38
|
+
matching the current version means everything is already shipped.
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
## Unreleased
|
|
42
|
+
- **Added**: `roll loop runs` — instantly see what loop ran and when
|
|
43
|
+
- **Fixed**: `roll update` no longer reports the wrong version after upgrading
|
|
44
|
+
|
|
45
|
+
## v2026.05.07
|
|
46
|
+
- ...
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## First-Time Backfill
|
|
50
|
+
|
|
51
|
+
If your project has no `CHANGELOG.md` yet, `$roll-.changelog` creates one
|
|
52
|
+
and backfills all historical completed stories, grouped by date.
|
|
53
|
+
|
|
54
|
+
## Manual Trigger
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
$roll-.changelog # stage CHANGELOG.md (call from within a build session)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
When called outside a build session (standalone), it stages and commits
|
|
61
|
+
with `chore: sync changelog`.
|
|
62
|
+
|
|
63
|
+
## See Also
|
|
64
|
+
|
|
65
|
+
- [loop.md](loop.md) — loop triggers changelog automatically after each story
|
|
66
|
+
- [skills.md](skills.md) — `roll-.changelog` in the support skills table
|