@seanyao/roll 3.606.2 → 3.606.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seanyao/roll",
3
- "version": "3.606.2",
3
+ "version": "3.606.3",
4
4
  "description": "Roll \u2014 Roll out features with AI agents",
5
5
  "packageManager": "pnpm@11.1.3",
6
6
  "scripts": {
@@ -576,18 +576,66 @@ Follow the repo's deployment path (Vercel / Railway / etc.) and record the deplo
576
576
 
577
577
  Runs ONLY on a ✅ Gate PASS (a FAIL retry must not mint a misleading report). Non-blocking: any failure here → WARN, continue to Phase 11.
578
578
 
579
+ 0. **Before/after pairing (owner ruling 2026-06-06)**: when the story CHANGES
580
+ existing behavior, capture the prior state (`screenshots/before-*.png`)
581
+ before building and the new state (`screenshots/after-*.png`) at acceptance —
582
+ contrast is the clearest evidence. Brand-new capability with no prior state:
583
+ skip the pair; capture the new surface only.
584
+
579
585
  1. **Dump raw evidence** produced in this session to story-level dirs:
580
- `.roll/verification/{ID}/evidence/*.txt` (command outputs, curl, logs) and
581
- `.roll/verification/{ID}/screenshots/*.png` (when the story has a UI surface web/iOS/Android per project type).
582
- 2. **Write the intent map** `.roll/verification/{ID}/ac-map.json` for EVERY AC (ids `{ID}:AC1..n`) pick `pass|readonly|partial|claimed|missing` and reference only evidence that exists (paths relative to the run dir; story-level dirs are reachable as `../evidence/...` / `../screenshots/...`):
586
+ `.roll/features/<epic>/{ID}/screenshots/*.png` the DEFAULT evidence class for
587
+ every surface, **CLI included** (US-ATTEST-010): text evidence is the agent's
588
+ own report (nothing stops a fabricated `echo "✓ passed" > evidence.txt`); a
589
+ screenshot is an OS-level capture of really-rendered pixels — an independent
590
+ channel with a categorically higher forgery cost. Combined with the
591
+ never-overwritten run dirs (D4) and the render-layer red line, it is the
592
+ strongest link in the evidence chain.
593
+ `.roll/features/<epic>/{ID}/evidence/*.txt` (resolve `<epic>` via `.roll/index.json`; `roll attest` writes the report there as `{ID}-report.html`) — supplementary (searchable,
594
+ copyable); keep raw command outputs here, but do not let a text file be the
595
+ ONLY evidence for an AC that has a visible surface.
596
+
597
+ **CLI capture recipe**: run the verifying command in a REAL terminal (the
598
+ tmux observation window `roll-loop-<slug>` is a natural target — display the
599
+ proof there), then `screencapture -x -R <window-rect>` (macOS) into
600
+ `screenshots/`. Capture ONLY the relevant work area — a focused window, not
601
+ the whole desktop. Unattended cycles: drive the capture from the dispatcher
602
+ (deterministic), never hand-craft an image; if the capture channel is
603
+ unavailable (no GUI session / no permission), fall back to text evidence and
604
+ mark the AC `partial` with a note — never fake a screenshot.
605
+ 2. **Write the intent map** `.roll/features/<epic>/{ID}/ac-map.json` — for EVERY AC (ids `{ID}:AC1..n`) pick `pass|readonly|partial|claimed|missing` and reference only evidence that exists (paths relative to the run dir; story-level dirs are reachable as `../evidence/...` / `../screenshots/...`):
583
606
 
584
607
  ```json
585
608
  [{ "ac": "{ID}:AC1", "status": "pass",
586
- "evidence": [{ "kind": "text", "label": "vitest", "textFile": "../evidence/vitest.txt" }] }]
609
+ "evidence": [
610
+ { "kind": "screenshot", "label": "terminal run (real pixels)", "href": "../screenshots/ac1-terminal.png" },
611
+ { "kind": "text", "label": "vitest (supplementary)", "textFile": "../evidence/vitest.txt" }
612
+ ] }]
587
613
  ```
588
614
 
589
615
  No evidence for an AC → say `claimed` yourself; the renderer enforces that downgrade anyway (red line) and lists it under Discrepancies.
590
- 3. **Run** `roll attest {ID}` (add `--deploy-url <url>` when one exists). The report lands at `.roll/verification/{ID}/latest/report.html`.
616
+ 3. **Run** `roll attest {ID}` (add `--deploy-url <url>` when one exists). The report lands at `.roll/features/<epic>/{ID}/latest/{ID}-report.html` (archive-per-card layout, US-META-001). The report is now layered (US-ATTEST-013): card context + conclusion/business badges + key screenshots up front, technical ANSI/command output folded into collapsed `<details>`, and a closing block (quality gate + evidence index + self-score).
617
+ 4. **Design QA checklist (US-ATTEST-013) — READABILITY ONLY**. After the report
618
+ renders, open it and run the checklist below. This is a presentation review of
619
+ the rendered HTML, NOT an evidence review.
620
+ **HARD RULE: this checklist NEVER changes any AC's status, evidence, or
621
+ `pass|readonly|partial|fail|blocked|claimed|missing` verdict.** Those are
622
+ fixed at step 2 (the ac-map) and enforced by the render-layer red line. If a
623
+ readability item fails, fix the *presentation* (a missing context field, an
624
+ uncropped screenshot, a layout overflow) — never edit a verdict to make the
625
+ report look cleaner.
626
+ - [ ] **首屏 10s 可懂** — a product/business reviewer grasps what shipped and
627
+ whether it passed within ten seconds, without scrolling into the technical fold.
628
+ - [ ] **390 / 320px 无横滚** — no horizontal scroll at mobile widths; before/after
629
+ pairs stack rather than overflow.
630
+ - [ ] **打印可读** — print preview (or print-to-PDF) is legible; AC cards don't
631
+ split awkwardly across pages.
632
+ - [ ] **状态不只靠颜色** — every status reads from its icon + bilingual word, not
633
+ color alone (colorblind-safe).
634
+ - [ ] **截图裁切与清晰度** — screenshots are cropped to the relevant work area and
635
+ legible; no full-desktop captures, no blurry/half-rendered frames.
636
+ If you cannot open the report (headless cycle), note that the design QA was
637
+ deferred and say so in the cycle report — do NOT silently skip it, and do NOT
638
+ substitute it for an evidence judgement.
591
639
 
592
640
  ### Phase 11: Write Back Status (REQUIRED)
593
641
 
@@ -343,18 +343,69 @@ Verify the shipped fix on the deployed target:
343
343
 
344
344
  Runs ONLY on a ✅ Gate PASS (a FAIL retry must not mint a misleading report). Non-blocking: any failure here → WARN, continue to Step 11.
345
345
 
346
+ 0. **Before/after pairing (owner ruling 2026-06-06)**: for a FIX, capture the
347
+ BROKEN state at reproduction time (screenshot when the surface is visible —
348
+ terminal run, panel, page) into `screenshots/before-*.png`; after the fix
349
+ passes, capture the SAME surface into `screenshots/after-*.png`. The pair is
350
+ the strongest possible fix evidence — reviewers see the delta, not a claim.
351
+ Behavior-changing stories: same pattern where a prior state exists.
352
+ Brand-new capability with nothing to contrast: skip — never stage a fake
353
+ "before".
354
+
346
355
  1. **Dump raw evidence** produced in this session to story-level dirs:
347
- `.roll/verification/{ID}/evidence/*.txt` (command outputs, curl, logs) and
348
- `.roll/verification/{ID}/screenshots/*.png` (when the story has a UI surface web/iOS/Android per project type).
349
- 2. **Write the intent map** `.roll/verification/{ID}/ac-map.json` for EVERY AC (ids `{ID}:AC1..n`) pick `pass|readonly|partial|claimed|missing` and reference only evidence that exists (paths relative to the run dir; story-level dirs are reachable as `../evidence/...` / `../screenshots/...`):
356
+ `.roll/features/<epic>/{ID}/screenshots/*.png` the DEFAULT evidence class for
357
+ every surface, **CLI included** (US-ATTEST-010): text evidence is the agent's
358
+ own report (nothing stops a fabricated `echo "✓ passed" > evidence.txt`); a
359
+ screenshot is an OS-level capture of really-rendered pixels — an independent
360
+ channel with a categorically higher forgery cost. Combined with the
361
+ never-overwritten run dirs (D4) and the render-layer red line, it is the
362
+ strongest link in the evidence chain.
363
+ `.roll/features/<epic>/{ID}/evidence/*.txt` (resolve `<epic>` via `.roll/index.json`; `roll attest` writes the report there as `{ID}-report.html`) — supplementary (searchable,
364
+ copyable); keep raw command outputs here, but do not let a text file be the
365
+ ONLY evidence for an AC that has a visible surface.
366
+
367
+ **CLI capture recipe**: run the verifying command in a REAL terminal (the
368
+ tmux observation window `roll-loop-<slug>` is a natural target — display the
369
+ proof there), then `screencapture -x -R <window-rect>` (macOS) into
370
+ `screenshots/`. Capture ONLY the relevant work area — a focused window, not
371
+ the whole desktop. Unattended cycles: drive the capture from the dispatcher
372
+ (deterministic), never hand-craft an image; if the capture channel is
373
+ unavailable (no GUI session / no permission), fall back to text evidence and
374
+ mark the AC `partial` with a note — never fake a screenshot.
375
+ 2. **Write the intent map** `.roll/features/<epic>/{ID}/ac-map.json` — for EVERY AC (ids `{ID}:AC1..n`) pick `pass|readonly|partial|claimed|missing` and reference only evidence that exists (paths relative to the run dir; story-level dirs are reachable as `../evidence/...` / `../screenshots/...`):
350
376
 
351
377
  ```json
352
378
  [{ "ac": "{ID}:AC1", "status": "pass",
353
- "evidence": [{ "kind": "text", "label": "vitest", "textFile": "../evidence/vitest.txt" }] }]
379
+ "evidence": [
380
+ { "kind": "screenshot", "label": "terminal run (real pixels)", "href": "../screenshots/ac1-terminal.png" },
381
+ { "kind": "text", "label": "vitest (supplementary)", "textFile": "../evidence/vitest.txt" }
382
+ ] }]
354
383
  ```
355
384
 
356
385
  No evidence for an AC → say `claimed` yourself; the renderer enforces that downgrade anyway (red line) and lists it under Discrepancies.
357
- 3. **Run** `roll attest {ID}` (add `--deploy-url <url>` when one exists). The report lands at `.roll/verification/{ID}/latest/report.html`.
386
+ 3. **Run** `roll attest {ID}` (add `--deploy-url <url>` when one exists). The report lands at `.roll/features/<epic>/{ID}/latest/{ID}-report.html` (archive-per-card layout, US-META-001). The report is now layered (US-ATTEST-013): card context + conclusion/business badges + key screenshots up front, technical ANSI/command output folded into collapsed `<details>`, and a closing block (quality gate + evidence index + self-score). A FIX usually carries a before/after pair (`screenshots/before-*.png` + `after-*.png`) — the坏态/好态 contrast is the clearest proof a bug is gone.
387
+ 4. **Design QA checklist (US-ATTEST-013) — READABILITY ONLY**. After the report
388
+ renders, open it and run the checklist below. This is a presentation review of
389
+ the rendered HTML, NOT an evidence review.
390
+ **HARD RULE: this checklist NEVER changes any AC's status, evidence, or
391
+ `pass|readonly|partial|fail|blocked|claimed|missing` verdict.** Those are
392
+ fixed at step 2 (the ac-map) and enforced by the render-layer red line. If a
393
+ readability item fails, fix the *presentation* (a missing context field, an
394
+ uncropped screenshot, a layout overflow) — never edit a verdict to make the
395
+ report look cleaner.
396
+ - [ ] **首屏 10s 可懂** — a reviewer grasps what was fixed and whether it passed
397
+ within ten seconds, without scrolling into the technical fold.
398
+ - [ ] **390 / 320px 无横滚** — no horizontal scroll at mobile widths; before/after
399
+ pairs stack rather than overflow.
400
+ - [ ] **打印可读** — print preview (or print-to-PDF) is legible; AC cards don't
401
+ split awkwardly across pages.
402
+ - [ ] **状态不只靠颜色** — every status reads from its icon + bilingual word, not
403
+ color alone (colorblind-safe).
404
+ - [ ] **截图裁切与清晰度** — screenshots are cropped to the relevant work area and
405
+ legible; no full-desktop captures, no blurry/half-rendered frames.
406
+ If you cannot open the report (headless cycle), note that the design QA was
407
+ deferred and say so in the cycle report — do NOT silently skip it, and do NOT
408
+ substitute it for an evidence judgement.
358
409
 
359
410
  ### 11. Write Back Status (when tracking is needed)
360
411