@seanyao/roll 4.714.2 → 4.717.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.
@@ -221,6 +221,8 @@ building ──attest earned──► publishable ──push+PR──► awaitin
221
221
  - 完全跳过预检:`loop_safety.skip_network_check: true`(FIX-1025)——当你确认所配置的服务可直连、不希望被任何固定主机探测拦住时使用。
222
222
  - English: the precheck defaults to `github.com:443`. For a domestic-only workflow, point it at a host you actually need via `loop_safety.probe_url`, or opt out entirely with `loop_safety.skip_network_check: true` — so a dropped VPN never halts loop/release when every configured provider is directly reachable.
223
223
  - Warm session 复用:`loop_safety.session_reuse: true` 只表达复用意图;必须同时设置 `loop_safety.resume_scope: same-story` 才会在同一 story 重试时复用 codex session。缺省、非法值或未设置 `resume_scope` 都按 `off` 处理,跨卡复用保持禁用。
224
+ - Builder 硬轮换:`loop_safety.builder_no_consecutive_repeat`(默认开)保证任意连续两个 cycle 的 builder agent 不相同——上一个 cycle 的 builder 被从本次 execute 池中硬排除。池缩到只剩上一个 builder 时**失败即声(ALERT + pending)**,绝不静默重复、绝不空转;轮换真正发生时记 `builder:rotation` 事件可审计。设 `builder_no_consecutive_repeat: false` 关闭;仅约束 builder(Evaluator 独立性靠 fresh session,不靠排除品牌)。
225
+ - English: `loop_safety.builder_no_consecutive_repeat` (default on) forbids two consecutive cycles from sharing a Builder — the previous cycle's builder is hard-excluded from the execute pool. If that empties the pool it fails loud (ALERT + pending), never repeating silently; a real rotation records a `builder:rotation` audit event. Set `false` to disable. Builder-only (Evaluator independence comes from fresh sessions, not brand exclusion).
224
226
 
225
227
  策略是规则源——它不直接执行动作,而是被其他上下文读取并遵循。
226
228
 
package/guide/INDEX.md CHANGED
@@ -9,6 +9,7 @@
9
9
  | AGENTS.md | Roll Project — Internal Conventions | convention | 2026-05-28 |
10
10
  | CONTRIBUTING.md | Contributing to Roll | convention | 2026-05-23 |
11
11
  | guide/en/ai-agents.md | Roll — AI Agent Support | guide | 2026-06-30 |
12
+ | guide/en/browser-operations.md | Roll — Browser Operations (managed + interactive lanes) | guide | 2026-07-15 |
12
13
  | guide/en/acceptance-evidence.md | Acceptance Evidence — roll attest / Evidence lifecycle | guide | 2026-07-02 |
13
14
  | guide/en/changelog.md | Roll — Changelog | guide | 2026-05-21 |
14
15
  | guide/en/configuration.md | Roll — Configuration | guide | 2026-07-02 |
@@ -39,6 +40,7 @@
39
40
  | guide/en/testing.md | Roll — Testing Workflow | guide | 2026-05-23 |
40
41
  | guide/en/testing/quality-rubric.md | Test Quality Rubric | guide | 2026-05-23 |
41
42
  | guide/zh/ai-agents.md | Roll — AI Agent 支持 | guide | 2026-06-30 |
43
+ | guide/zh/browser-operations.md | Roll — 浏览器操作(受管通道 + 交互通道) | guide | 2026-07-15 |
42
44
  | guide/zh/changelog.md | Roll — Changelog (中文) | guide | 2026-05-21 |
43
45
  | guide/zh/configuration.md | Roll — 配置 | guide | 2026-07-02 |
44
46
  | guide/zh/conventions.md | Roll — 约定与 AGENTS.md | guide | 2026-07-02 |
@@ -53,6 +53,12 @@ the archive rebuild; they are a convenience/archive view, not the delivery-truth
53
53
  `roll attest` also runs standalone — without an intent map every AC renders as
54
54
  🟧 Claimed, honestly.
55
55
 
56
+ Captured artifacts render by their actual media type, not the capture lane that
57
+ produced them. Image files (`png`, `jpg`, `jpeg`, `webp`, or `gif`, including a
58
+ recognised image signature without an extension) render as images; text output
59
+ such as `.txt` or `.log` is escaped and shown inline in a readable `<pre>`
60
+ block. A terminal capture may therefore appear in either form.
61
+
56
62
  ## Gate policy
57
63
 
58
64
  The attest gate is **hard by default**. A delivered story with ACs but no fresh,
@@ -108,6 +114,66 @@ renderer forces it down to 🟧 Claimed and lists it under **Discrepancies**.
108
114
  evidence; it is explicitly not the same as an agent-confirmed `pass`. Verbal
109
115
  completion ("I confirmed it works") is exactly what this rules out.
110
116
 
117
+ ## Outward behavior verification
118
+
119
+ Some ACs describe behavior Roll cannot prove locally — a real
120
+ `npm i -g github:owner/repo`, a published CLI's first run, a live OAuth
121
+ callback. A build or `npm pack` succeeding does **not** prove any of these; a
122
+ simulation is not the outward promise. Marking such an AC "manual-only" and
123
+ letting it render green is the same as substituting *not run* for *passed*.
124
+
125
+ When a story or fix documents an external install / publish / login channel, the
126
+ relevant AC must declare **one** explicit verification path in its Evaluation
127
+ contract — Roll never infers "outward" from prose:
128
+
129
+ ```yaml
130
+ expected_evidence:
131
+ - kind: external-smoke # real command in an isolated env
132
+ target: npm i -g github:owner/repo#<commit> && repo --version
133
+ proves: the documented git-install channel installs and starts clean
134
+ outward:
135
+ mode: external-smoke
136
+ command: npm i -g github:owner/repo#<commit> && repo --version
137
+ environment: release # ci | nightly | release
138
+ timeout_sec: 180
139
+ - kind: owner-attested # human sign-off when no smoke can cover it
140
+ proves: the production OAuth callback round-trips
141
+ outward:
142
+ mode: owner-attested
143
+ reason: needs a real third-party account; no safe automated path exists
144
+ approvalRef: https://github.com/owner/repo/issues/1343
145
+ ```
146
+
147
+ The attest report renders an **Outward verification** banner and table near the
148
+ top. Only a real smoke pass (or a valid, unexpired owner attestation) is green:
149
+
150
+ | Resolved state | Report line | Green? |
151
+ |----------------|-------------|--------|
152
+ | `verified` | `VERIFIED (external smoke)` / `VERIFIED (owner-attested)` | yes |
153
+ | `verified-in-simulation` | `verified-in-simulation — simulation only, NOT accepted` | **no** |
154
+ | `unverified-external` | `UNVERIFIED — external smoke not run` (or `owner attestation pending`) | **no** |
155
+ | `failed-external` | `FAILED — external smoke` | **no** |
156
+
157
+ A single non-`verified` outward AC turns the banner red — the delivery cannot
158
+ overstate its outward behavior. `npm pack`–style simulation evidence is kept and
159
+ labeled `verified-in-simulation`, but it never substitutes for a real smoke.
160
+
161
+ ### Release / nightly smoke setup
162
+
163
+ External smoke runs in an **isolated** environment — a fresh temporary
164
+ `HOME`/`PREFIX`/working directory — and executes only the exact command template
165
+ declared in the spec, with controlled variables. Its artifact records exit code,
166
+ version, and a redacted stdout/stderr summary; credentials are never written.
167
+
168
+ Point the runner at an environment with `ROLL_SMOKE_ENV=release` (or `ci` /
169
+ `nightly`); a declaration whose `environment` does not match the current one is
170
+ reported `unverified`, never silently skipped. **No real publish or account
171
+ action is ever automatic**: nothing that pushes a package, mutates a remote
172
+ account, or spends money runs without a declared authority (an `external-smoke`
173
+ command you wrote into the spec, or an `owner-attested` approval reference). If no
174
+ matching smoke environment exists, the AC stays `unverified` and the report stays
175
+ non-green — it is never auto-promoted to a manual pass.
176
+
111
177
  ## Declaring visual evidence at design time
112
178
 
113
179
  `roll story validate` checks, at design time, that a spec is *born* with a
@@ -23,7 +23,7 @@ migration input, but it is no longer the primary authoring surface for agent
23
23
  semantics. Use:
24
24
 
25
25
  ```bash
26
- roll agent # show Machine Scope, Project Scope, roles, pool, and legacy inputs
26
+ roll agent # show Machine Scope, effective Project Scope, and installed pool
27
27
  roll agent migrate --dry-run # preview conversion from legacy files
28
28
  roll agent migrate # write roll-agents/v1 files
29
29
  roll agent list # show installed agents
@@ -170,13 +170,13 @@ roll supervisor health --json # machine-readable classifications
170
170
  roll supervisor next # next card + agent health summary
171
171
  ```
172
172
 
173
- ## Legacy Compatibility
173
+ ## Migration from Older Agent Config
174
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.
175
+ Older projects may contain `.roll/local.yaml agent`, `.roll/pairing.yaml`, or v3
176
+ route slots in `.roll/agents.yaml`. These are not runtime inputs. Run
177
+ `roll agent migrate --dry-run` to preview their one-time conversion, then
178
+ `roll agent migrate` to write scoped bindings. A loop that encounters v3 route
179
+ slots fails loudly instead of silently using a second configuration model.
180
180
 
181
181
  ## See Also
182
182