@erclx/canon 5.77.0 → 5.79.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.
Files changed (125) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/claude/.claude-plugin/plugin.json +1 -1
  3. package/claude/skills/app-drive/REQUIREMENT.md +12 -0
  4. package/claude/skills/app-drive/SKILL.md +44 -8
  5. package/claude/skills/app-drive/references/config.md +18 -8
  6. package/claude/skills/app-drive/references/drive-record.md +4 -0
  7. package/claude/skills/auto-ship/REQUIREMENT.md +1 -1
  8. package/claude/skills/auto-ship/SKILL.md +5 -4
  9. package/claude/skills/auto-ship/references/draft-mark.md +33 -15
  10. package/claude/skills/auto-ship/references/failure-recovery.md +4 -2
  11. package/claude/skills/auto-ship/references/ui-checklist.md +9 -1
  12. package/claude/skills/code-craft/REQUIREMENT.md +1 -1
  13. package/claude/skills/code-craft/SKILL.md +7 -0
  14. package/claude/skills/code-craft/references/adopted.md +8 -0
  15. package/claude/skills/git-followup/SKILL.md +1 -0
  16. package/claude/skills/git-pr/REQUIREMENT.md +2 -0
  17. package/claude/skills/git-pr/SKILL.md +2 -0
  18. package/claude/skills/git-pr/references/final-command.md +34 -2
  19. package/claude/skills/git-pr/references/pr.md +1 -1
  20. package/claude/skills/git-ship/REQUIREMENT.md +2 -2
  21. package/claude/skills/git-ship/SKILL.md +16 -11
  22. package/claude/skills/git-ship/references/ci-watch.md +28 -4
  23. package/claude/skills/markdown-craft/references/markdown.md +4 -4
  24. package/claude/skills/plan-feature/references/plan.md +2 -0
  25. package/claude/skills/pr-evidence/SKILL.md +6 -1
  26. package/claude/skills/pr-evidence/references/evidence.md +1 -0
  27. package/claude/skills/pr-evidence/references/reel.md +9 -1
  28. package/claude/skills/review-address/SKILL.md +2 -1
  29. package/claude/skills/review-craft/references/ui.md +13 -1
  30. package/claude/skills/review-pr/references/body-variants.md +2 -0
  31. package/claude/skills/review-pr/references/close-out.md +2 -0
  32. package/claude/skills/review-pr/references/key-changes.md +2 -1
  33. package/claude/skills/review-pr/references/post.md +1 -0
  34. package/claude/skills/review-ui/REQUIREMENT.md +1 -0
  35. package/claude/skills/review-ui/SKILL.md +2 -2
  36. package/claude/skills/review-ui/references/driving.md +32 -4
  37. package/claude/skills/review-ui/references/post.md +6 -2
  38. package/claude/skills/role-orchestrator/REQUIREMENT.md +1 -1
  39. package/claude/skills/role-orchestrator/SKILL.md +4 -4
  40. package/claude/skills/role-orchestrator/references/orchestrator-hand-launch.md +2 -0
  41. package/claude/skills/role-orchestrator/references/orchestrator-handback.md +1 -1
  42. package/claude/skills/role-orchestrator/references/orchestrator-limit-stops.md +47 -0
  43. package/claude/skills/role-orchestrator/references/orchestrator-output.md +24 -1
  44. package/claude/skills/role-orchestrator/references/orchestrator-poll.md +3 -2
  45. package/claude/skills/role-orchestrator/references/orchestrator-review-dispatch.md +35 -4
  46. package/claude/skills/role-orchestrator/references/orchestrator-reviewer-launch.md +1 -1
  47. package/claude/skills/role-orchestrator/references/orchestrator-sweep.md +3 -1
  48. package/claude/skills/role-worker/SKILL.md +2 -1
  49. package/claude/skills/task-board/SKILL.md +1 -0
  50. package/claude/skills/task-board/references/tasks.md +1 -0
  51. package/claude/skills/test-craft/SKILL.md +1 -0
  52. package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
  53. package/claude/skills/ui-checklist/SKILL.md +2 -1
  54. package/claude/skills/ui-craft/references/capture.md +16 -0
  55. package/claude/skills/ui-film/REQUIREMENT.md +2 -2
  56. package/claude/skills/ui-film/SKILL.md +6 -1
  57. package/claude/skills/ui-film/references/compose-craft.md +68 -11
  58. package/claude/skills/ui-film/references/config.md +2 -2
  59. package/claude/skills/ui-film/references/handoff.md +1 -1
  60. package/claude/skills/ui-film/references/harness.md +71 -0
  61. package/claude/skills/ui-film/references/take-craft.md +42 -17
  62. package/docs/workflow/ai-workflow.md +1 -1
  63. package/docs/workflow/operating-model.md +6 -5
  64. package/docs/workflow/parallel-features.md +2 -1
  65. package/docs/workflow/visual-design-workflow.md +2 -1
  66. package/governance/ledger/skills/code-craft/SKILL.md +9 -0
  67. package/governance/ledger/skills/test-craft/SKILL.md +1 -0
  68. package/governance/ledger/skills/ui-craft/capture.md +18 -5
  69. package/package.json +4 -3
  70. package/src/commands/pr.ts +255 -46
  71. package/src/commands/sessions.ts +88 -6
  72. package/src/commands/take.ts +12 -1
  73. package/src/commands/tasks.ts +41 -2
  74. package/src/design/components.ts +5 -107
  75. package/src/design/favicon.ts +21 -17
  76. package/src/design/render.ts +9 -27
  77. package/src/design/template.ts +42 -0
  78. package/src/design/templates/favicon.svg +17 -0
  79. package/src/design/templates/hand-drawn-figure.css +54 -0
  80. package/src/design/templates/preview.html +27 -0
  81. package/src/design/templates/scrollbar.css +29 -0
  82. package/src/design/templates/status.css +24 -0
  83. package/src/gate/embedded.ts +400 -0
  84. package/src/gate/stages.ts +8 -0
  85. package/src/git/files.ts +5 -2
  86. package/src/indexes/frontmatter.ts +27 -6
  87. package/src/indexes/render.ts +21 -3
  88. package/src/markdown/colons.ts +14 -4
  89. package/src/markdown/heading-case.ts +9 -2
  90. package/src/pr/bijection.ts +8 -0
  91. package/src/pr/evidence.ts +81 -13
  92. package/src/pr/frames.ts +1 -6
  93. package/src/pr/health.ts +63 -15
  94. package/src/pr/lift.ts +77 -9
  95. package/src/pr/links.ts +160 -0
  96. package/src/pr/local.ts +17 -4
  97. package/src/pr/paths.ts +20 -2
  98. package/src/pr/rest.ts +2 -0
  99. package/src/pr/review-scope.ts +28 -0
  100. package/src/pr/review-state.ts +5 -5
  101. package/src/pr/waiver.ts +45 -0
  102. package/src/sessions/stop.ts +145 -0
  103. package/src/sessions/transfer/bundle.ts +1 -1
  104. package/src/take/camera.ts +337 -208
  105. package/src/take/encode.ts +16 -42
  106. package/src/take/film.ts +7 -1
  107. package/src/take/frame-clock.ts +46 -0
  108. package/src/take/log.ts +43 -2
  109. package/src/take/perform.ts +85 -13
  110. package/src/take/plan.ts +26 -5
  111. package/src/take/reel.ts +30 -5
  112. package/src/take/screencast.ts +223 -13
  113. package/src/take/stepper.ts +24 -4
  114. package/src/tasks/holders.ts +198 -0
  115. package/src/tasks/validate.ts +148 -0
  116. package/src/commands/fixtures/gh.sh +0 -64
  117. package/src/take/fixtures/busy.html +0 -107
  118. package/src/take/fixtures/fade.html +0 -49
  119. package/src/take/fixtures/fetch.html +0 -38
  120. package/src/take/fixtures/input.html +0 -138
  121. package/src/take/zoom/NOTICE.md +0 -45
  122. package/src/take/zoom/math-utils.ts +0 -69
  123. package/src/take/zoom/region-utils.ts +0 -55
  124. package/src/take/zoom/spring.ts +0 -133
  125. /package/src/sessions/{transfer/transcript.ts → transcript.ts} +0 -0
@@ -45,6 +45,7 @@ Two reviews run beside each other and finish on their own clocks.
45
45
  - `canon:review-pr` reads the code and the stills in the evidence comment, and posts under `## Review`.
46
46
  - `canon:review-ui` never reads the diff. It drives each checklist box in the running app through `canon browser`, which runs the pinned `@playwright/cli`, and posts under `## UI review`.
47
47
  - Every box gets one verdict, being pass, fail, needs eyes, or not driven.
48
+ - A page that shows its start state only behind a token or a signed-in route names that path as `access` in `canon/config/app-drive.toml`, and the pass opens its address behind it.
48
49
  - The pass refuses rather than download a browser. Install it once per machine with `canon browser install-browser chromium`.
49
50
 
50
51
  After the boxes, `review-ui` sweeps every route they reached:
@@ -63,7 +64,7 @@ A UI review stays open while the branch owes a fix. Three things owe one:
63
64
 
64
65
  Two kinds of result report without holding the review open.
65
66
 
66
- - A taste box needs eyes, so the pass captures both themes and leaves the call to you.
67
+ - A taste box needs eyes, so the pass captures both themes and leaves the call to you. A checklist holding only taste boxes gets no UI reviewer at all, and the lift does not wait for one.
67
68
  - Every other probe result, and every axe `incomplete`, is a reading to confirm, since each probe carries a known class of false finding.
68
69
 
69
70
  At the time of writing, the gated axe classes are contrast, target size, accessible names, labels, alt text, document title and language, valid ARIA, and nested interactive controls. A rule leaves the list on its first false finding, so `canon drive --help` and the `review-ui` skill carry the current one.
@@ -42,6 +42,15 @@ Parnas's paper refused a read at its ACM DOI, `10.1145/361598.361623`, so the ro
42
42
  | Rules free of transport and storage | [Cockburn, Hexagonal Architecture](https://alistair.cockburn.us/hexagonal-architecture/): an application "developed and tested in isolation from its eventual run-time devices and databases" | 2026-10-24 |
43
43
  | No ports and adapters for record CRUD | [Microsoft, Design a DDD-oriented microservice](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/ddd-oriented-microservice): "Simpler responsibilities, like a CRUD service, can be managed with simpler approaches." | 2026-10-24 |
44
44
 
45
+ ## Give another language its own file
46
+
47
+ | Bullet | Source | Read |
48
+ | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
49
+ | A long page, stylesheet, or script out | [Meszaros, Inline Resource](http://xunitpatterns.com/Inline%20Resource.html): "If the contents of the resource are large, chances are high that you are also suffering from Eager Test" | 2026-11-03 |
50
+ | A branching script out at any length | House choice: the `ci-workflow` skill already moves a `run:` step past one guard to a script, and a fake that branches is shared by many tests, so no test reads it as its own input | 2026-11-03 |
51
+ | An interpolating template stays in code | House choice: a template built from data is code generating output, and a file holding it would carry placeholders no linter for its language reads either | 2026-11-03 |
52
+ | Short input under test stays inline | [Meszaros, Obscure Test](http://xunitpatterns.com/Obscure%20Test.html): with a Mystery Guest "the test reader is not able to see the cause and effect between fixture and verification logic" | 2026-11-03 |
53
+
45
54
  ## Check your own diff
46
55
 
47
56
  | Bullet | Source | Read |
@@ -44,6 +44,7 @@ The field is software testing practice. Software Engineering at Google carries t
44
44
  | Test data through a factory or builder | [Pryce, Test Data Builders](http://www.natpryce.com/articles/000714.html): "For each class you want to use in a test, create a Builder for that class", one that "Initialises its instance variables to commonly used or safe values" | 2026-10-24 |
45
45
  | Assert through the public surface | [Software Engineering at Google, ch. 12](https://abseil.io/resources/swe-book/html/ch12.html): tests should "make calls against its public API rather than its implementation details" | 2026-10-24 |
46
46
  | Real, then fake, then stub, mock last | [addyosmani/agent-skills, Test-Driven Development](https://github.com/addyosmani/agent-skills/blob/c004a74/skills/test-driven-development/SKILL.md): "Preference order (most to least preferred): 1. Real implementation", then fake, stub, and mock | 2026-10-24 |
47
+ | A long fixture in its own file | [Meszaros, Inline Resource](http://xunitpatterns.com/Inline%20Resource.html): "If the contents of the resource are large, chances are high that you are also suffering from Eager Test" | 2026-11-03 |
47
48
 
48
49
  ## Hold the structure floors
49
50
 
@@ -16,11 +16,24 @@ The rule states canon's own evidence procedure for a rendered change, so most ro
16
16
 
17
17
  ## When to capture
18
18
 
19
- | Bullet | Source | Read |
20
- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
21
- | Preview, not dev server | House choice: a dev server injects overlays and skips the production build's transforms, so its frame differs from what ships | 2026-10-18 |
22
- | Every theme, and again | House choice: a defect in the dark theme passes a light-only capture, and a repair inside a shared stylesheet can cancel a rule written earlier in the same file | 2026-10-18 |
23
- | Read the capture before the pull request | House choice: a defect visible in the worker's own capture, such as a 20px target under the 24px bullet in `pointer.md`, reached review because nobody read the frame against the checklist first, and each review round re-runs both reviews. The skill ships with the plugin, so the bullet carries a report-if-missing clause | 2026-10-23 |
19
+ | Bullet | Source | Read |
20
+ | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
21
+ | Preview, not dev server | House choice: a dev server injects overlays and skips the production build's transforms, so its frame differs from what ships | 2026-10-18 |
22
+ | Every theme, and again | House choice: a defect in the dark theme passes a light-only capture, and a repair inside a shared stylesheet can cancel a rule written earlier in the same file | 2026-10-18 |
23
+ | Read the capture before the pull request | House choice: a defect visible in the worker's own capture, such as a 20px target under the 24px bullet in `pointer.md`, reached review because nobody read the frame against the checklist first, and each review round re-runs both reviews. The skill ships with the plugin, so the bullet carries a report-if-missing clause | 2026-10-23 |
24
+ | A case per added or altered state | House choice: workers read the old rule as covering new surfaces only, so new states of captured surfaces shipped with no case and the next pull request met the same thin fixture. Proof is owed by default. | 2026-11-03 |
25
+ | States that count as visible | House choice: a focus ring, an outline, a toast, a tooltip, a size change from server-written markup, and a state reachable only by interaction each show on a page, and workers filed them as behavior with nothing to capture | 2026-11-03 |
26
+ | Exemption stated in the pull request body | House choice: the reviewer needs the path and the reason in front of them to accept it, and a line in the body is the one place both reviewers read | 2026-11-03 |
27
+ | Reviewer accepts through the waiver line | House choice: the lift reads waivers from the newest review pass alone, so only that line holds the draft mark open to a painted path with no case | 2026-11-03 |
28
+ | Uncovered painted path stays in draft | House choice: a painted path with neither a case nor a waiver is the gap the lift refuses, so the rule names the outcome a worker meets | 2026-11-03 |
29
+
30
+ ## When the fixture cannot reach a state
31
+
32
+ | Bullet | Source | Read |
33
+ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- |
34
+ | Extend the fixture in the same branch | House choice: a drive fixture lacking a state made a box or reel skip and close, and only the building session can add the state before the pull request opens | 2026-11-03 |
35
+ | Never record the state as a skip | House choice: a skip leaves the fixture as thin as it was, so the next pull request meets the same gap and skips again | 2026-11-03 |
36
+ | State the setup inline with no fixture file | House choice: a project with no `canon/config/app-drive.toml` drives the served root, so a fixture file is not owed and the setup goes on the box, as `(local only)` already does | 2026-11-03 |
24
37
 
25
38
  ## What a capture covers
26
39
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/canon",
3
3
  "type": "module",
4
- "version": "5.77.0",
4
+ "version": "5.79.0",
5
5
  "description": "Runs your agent's work and keeps its code good, on one setup for every repo.",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -18,6 +18,7 @@
18
18
  "tsconfig.json",
19
19
  "assets/brand/mark.svg",
20
20
  "!scripts/eval",
21
+ "!src/**/fixtures/**",
21
22
  "!**/*.test.ts",
22
23
  "!**/*.test.tsx"
23
24
  ],
@@ -74,8 +75,8 @@
74
75
  "astro": "^6.1.9",
75
76
  "husky": "^9.1.7",
76
77
  "micromatch": "^4.0.8",
77
- "oxfmt": "0.74.0",
78
- "oxlint": "1.89.0",
78
+ "oxfmt": "0.75.0",
79
+ "oxlint": "1.90.0",
79
80
  "prettier": "^3.8.1",
80
81
  "prettier-plugin-astro": "^0.14.1",
81
82
  "prettier-plugin-tailwindcss": "^0.8.1",