@erclx/canon 5.68.0 → 5.70.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 +36 -0
- package/README.md +33 -159
- package/assets/brand/mark.svg +17 -9
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/app-drive/REQUIREMENT.md +5 -5
- package/claude/skills/app-drive/SKILL.md +17 -6
- package/claude/skills/app-drive/references/drive-record.md +61 -8
- package/claude/skills/app-drive/references/isolate.md +1 -1
- package/claude/skills/canon-cli/SKILL.md +2 -2
- package/claude/skills/canon-feedback/REQUIREMENT.md +1 -1
- package/claude/skills/canon-feedback/SKILL.md +1 -1
- package/claude/skills/design-identity/REQUIREMENT.md +4 -4
- package/claude/skills/design-identity/SKILL.md +7 -7
- package/claude/skills/{pick-by-eye → design-pick}/REQUIREMENT.md +6 -6
- package/claude/skills/{pick-by-eye → design-pick}/SKILL.md +19 -10
- package/claude/skills/{pick-by-eye → design-pick}/references/board.md +17 -11
- package/claude/skills/design-pick/references/design-config.md +33 -0
- package/claude/skills/design-record/REQUIREMENT.md +2 -2
- package/claude/skills/design-record/SKILL.md +1 -1
- package/claude/skills/design-taste/REQUIREMENT.md +2 -2
- package/claude/skills/design-taste/SKILL.md +3 -3
- package/claude/skills/design-taste/references/preflight.md +1 -1
- package/claude/skills/git-issue/REQUIREMENT.md +1 -1
- package/claude/skills/git-issue/references/issue.md +1 -1
- package/claude/skills/plan-feature/SKILL.md +1 -1
- package/claude/skills/plan-feature/references/plan.md +21 -6
- package/claude/skills/plan-groundwork/SKILL.md +1 -1
- package/claude/skills/pr-evidence/references/evidence.md +2 -2
- package/claude/skills/role-orchestrator/references/orchestrator-launch.md +3 -3
- package/claude/skills/role-orchestrator/references/orchestrator-parked.md +1 -1
- package/claude/skills/role-orchestrator/references/orchestrator-planning-wait.md +24 -0
- package/claude/skills/role-planner/SKILL.md +4 -2
- package/claude/skills/role-worker/SKILL.md +5 -6
- package/claude/skills/task-board/references/tasks.md +1 -1
- package/claude/skills/task-complete/references/receipt-sweep.md +1 -1
- package/claude/skills/{ux-audit → ui-audit}/REQUIREMENT.md +3 -3
- package/claude/skills/{ux-audit → ui-audit}/SKILL.md +7 -7
- package/claude/skills/ui-checklist/REQUIREMENT.md +1 -1
- package/claude/skills/ui-craft/SKILL.md +1 -1
- package/claude/skills/ui-craft/references/copy.md +4 -1
- package/claude/skills/{ui-record → ui-film}/REQUIREMENT.md +6 -4
- package/claude/skills/{ui-record → ui-film}/SKILL.md +26 -13
- package/claude/skills/ui-film/references/compose-craft.md +81 -0
- package/claude/skills/{ui-record → ui-film}/references/config.md +9 -4
- package/claude/skills/{ui-record → ui-film}/references/handoff.md +17 -7
- package/claude/skills/{ui-record → ui-film}/references/pr-clip.md +5 -5
- package/claude/skills/{ui-record → ui-film}/references/take-craft.md +28 -2
- package/claude/skills/{ux-measure → ui-measure}/REQUIREMENT.md +3 -3
- package/claude/skills/{ux-measure → ui-measure}/SKILL.md +6 -6
- package/docs/agents/audits.md +1 -1
- package/docs/agents/migrate.md +13 -13
- package/docs/index.md +1 -0
- package/docs/migrations/by-hand.md +107 -0
- package/docs/migrations/by-verb.md +118 -0
- package/docs/migrations/index.md +14 -0
- package/docs/target/index.md +1 -2
- package/docs/target/projects.md +3 -3
- package/docs/target/sync.md +23 -3
- package/docs/workflow/ai-workflow.md +1 -1
- package/docs/workflow/skill-map-on-request.md +1 -2
- package/docs/workflow/skill-map.md +9 -10
- package/docs/workflow/visual-design-workflow.md +6 -1
- package/governance/ledger/claude/background.md +26 -0
- package/governance/ledger/skills/ui-craft/copy.md +8 -4
- package/governance/rules/claude/background.md +19 -0
- package/governance/stacks/base.toml +1 -0
- package/package.json +6 -4
- package/scripts/ci/install-playwright-deps.sh +52 -0
- package/scripts/core/design-sync.ts +204 -0
- package/scripts/core/regen-web-favicon.ts +27 -12
- package/scripts/core/regen-web-previews.ts +8 -1
- package/scripts/core/render-film.ts +179 -0
- package/src/capture/frame-values.ts +12 -12
- package/src/claude/cases/authoring.ts +2 -2
- package/src/claude/cases/misc.ts +1 -1
- package/src/claude/cases/setup.ts +0 -5
- package/src/claude/cases/workflow.ts +6 -6
- package/src/commands/fixtures/gh.sh +64 -0
- package/src/commands/gov.ts +33 -3
- package/src/commands/migrate.ts +12 -2
- package/src/commands/records.ts +3 -2
- package/src/commands/sandbox.ts +9 -2
- package/src/commands/take.ts +159 -11
- package/src/commands/tasks.ts +183 -0
- package/src/design/favicon.ts +85 -13
- package/src/design/reference.ts +98 -0
- package/src/design/render.ts +16 -14
- package/src/design/tokens.ts +4 -3
- package/src/gate/stages.ts +8 -2
- package/src/gov/audit.ts +48 -11
- package/src/gov/detect.ts +1 -1
- package/src/init/steps.ts +2 -2
- package/src/markdown/scope.ts +9 -14
- package/src/migrate/record-layout.ts +5 -3
- package/src/migrate/skill-names.ts +21 -4
- package/src/migrate/status.ts +3 -3
- package/src/records/validate.ts +15 -2
- package/src/sandbox/expect.ts +32 -0
- package/src/sandbox/headless/dispatch-shim.sh +15 -0
- package/src/sandbox/headless/dispatch.ts +12 -14
- package/src/sandbox/headless/run.ts +6 -3
- package/src/sandbox/stub-gh.sh +26 -0
- package/src/sandbox/stub-remote.ts +8 -29
- package/src/sync/engine.ts +1 -1
- package/src/take/camera.ts +100 -11
- package/src/take/film.ts +55 -4
- package/src/take/fixtures/input.html +138 -0
- package/src/take/keys.ts +193 -0
- package/src/take/log.ts +94 -1
- package/src/take/perform.ts +165 -10
- package/src/take/plan.ts +101 -6
- package/src/take/pointer.ts +2 -1
- package/src/take/screencast.ts +28 -3
- package/src/take/stepper.ts +141 -23
- package/src/take/zoom/NOTICE.md +1 -1
- package/src/tasks/launch-wait.ts +160 -0
- package/tooling/claude/reference.md +1 -1
- package/claude/skills/canon-feedback-triage/REQUIREMENT.md +0 -34
- package/claude/skills/canon-feedback-triage/SKILL.md +0 -98
- package/claude/skills/plan-ready/REQUIREMENT.md +0 -35
- package/claude/skills/plan-ready/SKILL.md +0 -136
- package/claude/skills/plan-ready/references/assembly.md +0 -75
- package/claude/skills/plan-ready/references/ready.md +0 -128
- package/docs/target/migrations.md +0 -203
- /package/claude/skills/{pick-by-eye → design-pick}/references/live-arms.md +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: ui-audit
|
|
3
3
|
description: Why UI roughness is reported against stated intent rather than taste, and why the audit observes without fixing
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# UI audit requirement
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
@@ -33,4 +33,4 @@ The pass slides into fixing what it finds, and then the audit and the change lan
|
|
|
33
33
|
- Feature planning, which `plan-feature` owns
|
|
34
34
|
- Verifying one specific change, which `ui-checklist` owns
|
|
35
35
|
- Defining the intent it audits against, which the design document owns
|
|
36
|
-
- Measuring what a running interface costs to paint, block, or shift, which `
|
|
36
|
+
- Measuring what a running interface costs to paint, block, or shift, which `ui-measure` owns, while contrast stays here as two color values off the stylesheet
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: Audits the current UI for incomplete, inconsistent, or confusing patterns. Reads DESIGN.md for intent, scans UI files, and outputs observations grouped by surface. Use when asked "audit the UX", "audit the UI", "UX audit", or "find UI roughness". Do NOT use for new feature planning or code changes, and do NOT use to measure what a running interface costs to paint, which is `
|
|
2
|
+
name: ui-audit
|
|
3
|
+
description: Audits the current UI for incomplete, inconsistent, or confusing patterns. Reads DESIGN.md for intent, scans UI files, and outputs observations grouped by surface. Use when asked "audit the UX", "audit the UI", "UX audit", or "find UI roughness". Do NOT use for new feature planning or code changes, and do NOT use to measure what a running interface costs to paint, which is `ui-measure`.
|
|
4
4
|
metadata:
|
|
5
5
|
family: check
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
# UI audit
|
|
9
9
|
|
|
10
10
|
## Guards
|
|
11
11
|
|
|
12
12
|
- If no UI files exist in the project (no JSX, TSX, Vue, Svelte, or HTML under `src/`), stop: `❌ No UI surfaces found to audit.`
|
|
13
|
-
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `
|
|
13
|
+
- If the request asks what the interface costs to paint, block, or shift at runtime, run nothing and name `ui-measure`, since this skill reads source and reaches no number a browser produces
|
|
14
14
|
- Contrast is the exception and stays here, since two color values in the stylesheet's custom properties compute it, and the design document's lead names that stylesheet
|
|
15
15
|
|
|
16
16
|
## Step 1: read context
|
|
@@ -65,7 +65,7 @@ If nothing is wrong, use: `✅ No observations.`
|
|
|
65
65
|
|
|
66
66
|
Derive `<slug>` per `${CLAUDE_SKILL_DIR}/../git-branch/references/slug.md`. Fall back to `latest` on an empty result.
|
|
67
67
|
|
|
68
|
-
- Write the full report to `.canon/review/
|
|
68
|
+
- Write the full report to `.canon/review/ui-audit-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
|
|
69
69
|
- The report is a main-root write, so it goes out as a heredoc, routed the way `session-worktree` states
|
|
70
70
|
- With no observations, write `✅ No observations.` to the file with a timestamp
|
|
71
71
|
- `.canon/review/` is gitignored, so do not stage or commit the file
|
|
@@ -76,7 +76,7 @@ Output only the summary line and the file path. Do not repeat the full report in
|
|
|
76
76
|
|
|
77
77
|
```plaintext
|
|
78
78
|
X observations across N surfaces.
|
|
79
|
-
📝 Wrote .canon/review/
|
|
79
|
+
📝 Wrote .canon/review/ui-audit-<slug>.md
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
If no observations: `✅ No observations. Wrote .canon/review/
|
|
82
|
+
If no observations: `✅ No observations. Wrote .canon/review/ui-audit-<slug>.md`
|
|
@@ -28,7 +28,7 @@ A file under a gitignored folder is unreadable to a pull request reviewer, and a
|
|
|
28
28
|
|
|
29
29
|
## Out of scope
|
|
30
30
|
|
|
31
|
-
- Judging whether the UI is any good, which `
|
|
31
|
+
- Judging whether the UI is any good, which `ui-audit` owns
|
|
32
32
|
- The rules for choosing a test layer, which `test-craft` owns
|
|
33
33
|
- Writing the test itself, which `test-first` owns
|
|
34
34
|
- Posting the checklist, which `pr-evidence` owns as the sole consumer of the handoff file
|
|
@@ -40,5 +40,5 @@ Read `${CLAUDE_SKILL_DIR}/references/adopted.md` only when extending this guidan
|
|
|
40
40
|
- How a surface looks, being the layer order, the coherence locks, and the defaults a model reaches for: `design-taste`
|
|
41
41
|
- The accepted designs under the design folder and how a reference lands there: `design-record`
|
|
42
42
|
- The visual checklist a reviewer reads beside the screenshots: `ui-checklist`
|
|
43
|
-
- Reading source for roughness a rule does not state: `
|
|
43
|
+
- Reading source for roughness a rule does not state: `ui-audit`
|
|
44
44
|
- Prose on the surface beyond its interface copy: the `write-human` skill
|
|
@@ -3,7 +3,10 @@
|
|
|
3
3
|
## Punctuation
|
|
4
4
|
|
|
5
5
|
- Write no em dash (`—`) or semicolon in rendered copy. Use a comma or a period, or restructure the sentence.
|
|
6
|
-
- Add no trailing
|
|
6
|
+
- Add no trailing period, colon, or exclamation mark to a heading, label, link, button, nav item, caption, status, or one-sentence tagline. Keep the question mark a question needs.
|
|
7
|
+
- Rewrite a two-sentence tagline as one sentence rather than keeping a period inside it.
|
|
8
|
+
- End a one-sentence error or validation message with no period, such as `Enter an email address`.
|
|
9
|
+
- Keep end punctuation on body copy, multi-sentence messages, and quoted text, which a reader reads as prose.
|
|
7
10
|
|
|
8
11
|
## Button copy
|
|
9
12
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: ui-
|
|
2
|
+
name: ui-film
|
|
3
3
|
description: Why recording a web app runs from beats the operator approved, one take per action, and stops at the clip a HyperFrames composition reads
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# UI
|
|
6
|
+
# UI film requirement
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
@@ -19,13 +19,15 @@ A session that does reach `canon take` writes the plan from its own reading of t
|
|
|
19
19
|
- The session looks at a still of each take before handing it off or posting it as a pull request reel, and names a beat that fell back to the real-time route
|
|
20
20
|
- HyperFrames receives the takes with what it needs to apply the camera and draw the cursor
|
|
21
21
|
|
|
22
|
-
One video keeps its plan, takes, and composition in one workspace the operator can find, backed up without its media.
|
|
22
|
+
One video keeps its plan, takes, and composition in one workspace the operator can find, backed up without its media. A README there records how to re-film the takes, and the composing session adds how to re-render.
|
|
23
|
+
|
|
24
|
+
A session composing the takes finds the footage guidance HyperFrames lacks, being captions over app UI, other shapes, a README loop, and sped-up clips.
|
|
23
25
|
|
|
24
26
|
## Must not
|
|
25
27
|
|
|
26
28
|
- Film before the operator approves, or with nobody there to approve, unless `pr-evidence` named pull request mode, whose still check stands in for the approval
|
|
27
29
|
- Write a tracked file, the config included
|
|
28
|
-
-
|
|
30
|
+
- Run the composition or render the video, or write any composition file
|
|
29
31
|
- Trigger on anything but a request to record or film the app
|
|
30
32
|
- Stay when no caller besides the operator reaches it, such as a pull request clip through `pr-evidence`, which a review checks
|
|
31
33
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: ui-
|
|
2
|
+
name: ui-film
|
|
3
3
|
description: Records real footage of a project's own web app for a video. Drafts a plain beat list from the ask, a HyperFrames storyboard, or a `ui-checklist`, gets the operator's approval, writes the take plan, films each beat through `canon take` as a sharp 4K clip with a click log and a per-frame camera track, and hands the set to HyperFrames to compose. Use when asked to "record the app", "film a demo of this feature", "get footage for the launch video", "record a clip for the pull request", or "shoot the takes for this storyboard". Do NOT use to compose, caption, or render the video, which HyperFrames owns, to drive a pull request's checklist, which is `review-ui`, or to drive the app looking for defects, which is `app-drive`.
|
|
4
4
|
metadata:
|
|
5
5
|
family: generate
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# UI
|
|
8
|
+
# UI film
|
|
9
9
|
|
|
10
10
|
A take is real footage of the app doing one thing, filmed so the edit can zoom into it without going soft. This skill turns an ask into beats the operator approves in plain words, films one take per beat, and hands HyperFrames the clips, the logs, and the camera tracks. Canon renders nothing past the clip.
|
|
11
11
|
|
|
@@ -71,12 +71,15 @@ canon take <url> .canon/video/<slug>/plan.json --out .canon/video/<slug>/takes -
|
|
|
71
71
|
|
|
72
72
|
Branch on the record's `reason`, never on the exit code, which a shell function wrapping `canon` can flatten to zero.
|
|
73
73
|
|
|
74
|
-
| Record
|
|
75
|
-
|
|
|
76
|
-
| No `reason`
|
|
77
|
-
| `target-missing`
|
|
78
|
-
| `
|
|
79
|
-
|
|
|
74
|
+
| Record | Route |
|
|
75
|
+
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
|
|
76
|
+
| No `reason` | Continue to the stills |
|
|
77
|
+
| `target-missing` with `fallback` | Check the access before the selector, per the note below the table |
|
|
78
|
+
| `target-missing` | Open the record's `still`, find the target the record's `beat` names on the page, fix the plan, and film once more |
|
|
79
|
+
| `server-unreachable` | Restart the server from Step 1 and film once more |
|
|
80
|
+
| Any other `reason` | Report the `reason` and `message` to the operator and stop, since each is a setup step |
|
|
81
|
+
|
|
82
|
+
A refusal carrying `fallback` means the screencast opened the address a second time, so a single-use link was spent before the step ran. Read `${CLAUDE_SKILL_DIR}/references/config.md` for the access the take opens with, and fix that before touching the target.
|
|
80
83
|
|
|
81
84
|
A second refusal of the same kind stops the run and reports both records.
|
|
82
85
|
|
|
@@ -85,30 +88,40 @@ A second refusal of the same kind stops the run and reports both records.
|
|
|
85
88
|
Open each beat's `takes/<dir>/still.jpg` before handing off, since a clip can film the wrong state cleanly. The verb writes it from the clip's closing frame, where the action's result shows.
|
|
86
89
|
|
|
87
90
|
- Say what each still shows beside the beat it belongs to
|
|
88
|
-
- Report a beat the record marks with `fallback` as filmed in real time at 1080p,
|
|
91
|
+
- Report a beat the record marks with `fallback` as filmed in real time at 1080p, whose zoom stops near 1.35x rather than 1.8x, and offer to re-film it with the beat's input simplified
|
|
89
92
|
|
|
90
93
|
## Step 5: hand off
|
|
91
94
|
|
|
92
|
-
Read `${CLAUDE_SKILL_DIR}/references/handoff.md` on reaching this step
|
|
95
|
+
Read `${CLAUDE_SKILL_DIR}/references/handoff.md` on reaching this step, for what HyperFrames receives, where each composition lives, and how one applies the camera track and draws the cursor. Read `${CLAUDE_SKILL_DIR}/references/compose-craft.md` beside it, for the footage rules the HyperFrames skills lack.
|
|
93
96
|
|
|
94
97
|
Close the throwaway copy per `isolate.md` when Step 1 built one, after the stills are read.
|
|
95
98
|
|
|
99
|
+
### Write the workspace README
|
|
100
|
+
|
|
101
|
+
Write the filming half of `.canon/video/<slug>/README.md`, so a later session can re-film without this one. The composing session adds the re-render half under its own heading, as `compose-craft.md` states.
|
|
102
|
+
|
|
103
|
+
- Name what was filmed, beat by beat, and how to re-film each one with `canon take`
|
|
104
|
+
- Say where each folder came from, being the plan, the takes, and the config keys the take read, with `access` described rather than copied when it carries a token
|
|
105
|
+
- Write the file whole through the main-root route when none exists, with the filming half under a `## Filming` heading
|
|
106
|
+
- Add a `## Filming` section when a README is already there, reading the file and writing it back whole, and never overwrite what another session wrote
|
|
107
|
+
- Replace an existing `## Filming` section in place on a re-film, since the commands in it changed
|
|
108
|
+
|
|
96
109
|
## Output
|
|
97
110
|
|
|
98
111
|
Emit the takes folder, one line per beat, and the next step.
|
|
99
112
|
|
|
100
113
|
```plaintext
|
|
101
|
-
🎬 Filmed .canon/video/<slug>/takes/
|
|
114
|
+
🎬 Filmed .canon/video/<slug>/takes/, re-film notes in .canon/video/<slug>/README.md
|
|
102
115
|
|
|
103
116
|
01-open-the-kit step 4.2 s the board's first page with its frames filled in
|
|
104
117
|
02-search-for-color screencast (fallback) 3.8 s the page list narrowed to two results
|
|
105
118
|
|
|
106
|
-
Next: load hyperframes to compose, reading takes/take.json and
|
|
119
|
+
Next: load hyperframes to compose, reading takes/take.json, handoff.md, and compose-craft.md
|
|
107
120
|
```
|
|
108
121
|
|
|
109
122
|
## What this delegates
|
|
110
123
|
|
|
111
124
|
- `app-drive`'s `isolate.md` owns the throwaway copy and its close
|
|
112
125
|
- `hyperframes-creative`'s story spine owns what a beat says to a viewer
|
|
113
|
-
- `hyperframes` and its sibling skills own composing, captioning, and rendering the video
|
|
126
|
+
- `hyperframes` and its sibling skills own composing, captioning, and rendering the video, and `compose-craft.md` adds only what app footage changes about their advice
|
|
114
127
|
- `review-ui` owns driving a pull request's checklist
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Compose craft
|
|
3
|
+
description: The footage rules a session composing ui-film takes follows where the HyperFrames skills say nothing, being captions over app UI, other shapes, the README loop, sped-up clips, storyboard headings, and the workspace README
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Compose craft
|
|
7
|
+
|
|
8
|
+
Read at Step 5 of `ui-film`, and by the session that composes the takes, which the handoff's next line points here. HyperFrames owns composing, captioning, and rendering, so this file carries only what app footage changes about its advice and restates none of it.
|
|
9
|
+
|
|
10
|
+
Each rule states the principle. Where a number appears, it is the case measured on one app's launch film, not a law for the next app.
|
|
11
|
+
|
|
12
|
+
## Contents
|
|
13
|
+
|
|
14
|
+
- [Captions over app footage](#captions-over-app-footage)
|
|
15
|
+
- [Other shapes](#other-shapes)
|
|
16
|
+
- [The README loop](#the-readme-loop)
|
|
17
|
+
- [Sped-up clips](#sped-up-clips)
|
|
18
|
+
- [Storyboard headings](#storyboard-headings)
|
|
19
|
+
- [The workspace README](#the-workspace-readme)
|
|
20
|
+
- [Sources](#sources)
|
|
21
|
+
|
|
22
|
+
## Captions over app footage
|
|
23
|
+
|
|
24
|
+
HyperFrames' caption guide places a landscape caption 80 to 120 px from the bottom and keeps it off a speaker's face. App footage has no speaker, and its bottom edge is often a toolbar where the beat's click lands.
|
|
25
|
+
|
|
26
|
+
- Pick one caption position for the whole film, clear of the app's chrome where actions land, and keep every caption there, since a caption that moves between beats makes the viewer hunt for it
|
|
27
|
+
- Back a caption over bright UI with the scrim HyperFrames' caption guide sizes to the text
|
|
28
|
+
- Snapshot each caption's moment, and move a caption only when it covers its own beat's action
|
|
29
|
+
- Write caption text by the interface copy rules in `ui-craft`'s `copy.md`, so a caption ends with no period
|
|
30
|
+
|
|
31
|
+
## Other shapes
|
|
32
|
+
|
|
33
|
+
Cut a square or vertical version only when the operator asks for one. A film with one shape needs nothing from this section, and the vertical caption band and safe boxes stay with HyperFrames' frame presets.
|
|
34
|
+
|
|
35
|
+
- Start each shape as its own HyperFrames project, as `hyperframes-studio` states for a different aspect, in the workspace folder `handoff.md` names for it
|
|
36
|
+
- Frame the shape by cropping a window of the page at 1x, never by scaling the 16:9 frame into it, since a page shrunk into a square leaves the action too small to read
|
|
37
|
+
- Pan the window along the camera track's view center, so it follows the action the zoom would have aimed at. Frameboard's square cut used a 1080x1080 window.
|
|
38
|
+
- Expect a screencast take to hold at 1x from a softer 1080p source, while a stepped take gives the same window two clip pixels per page pixel
|
|
39
|
+
|
|
40
|
+
## The README loop
|
|
41
|
+
|
|
42
|
+
Cut a README loop only when the operator asks for one. A README hero plays inline and silently, so it is a short loop rather than a cut of the film.
|
|
43
|
+
|
|
44
|
+
- Cut it from the raw take showing the app's core action, rather than from a render, in the workspace folder `handoff.md` names for it
|
|
45
|
+
- Crop it to the canvas, so no browser margin or page chrome outside the app shows
|
|
46
|
+
- End it on the finished state, held long enough to read before the loop restarts
|
|
47
|
+
- Export an animated WebP under about 2 MB, since a README renders one inline where a video needs a player. Frameboard's loop played inline at 1.72 MB.
|
|
48
|
+
|
|
49
|
+
## Sped-up clips
|
|
50
|
+
|
|
51
|
+
A clip the edit plays faster runs its zoom faster too, so a push that settled in real time pumps several times a beat.
|
|
52
|
+
|
|
53
|
+
- Rebuild the beat's track for the playback rate with `canon take camera <dir>/log.json --rate <n> --out <file>`, and drive the wrapper from that file rather than from `camera.json`
|
|
54
|
+
- Never scale `camera.json`'s times by hand, since the rebuilt track also keeps each push inside the 1 s ceiling at the new speed
|
|
55
|
+
- Keep a typing beat at a rate where each word still reads, since a viewer cannot read a fill that finishes in a few frames
|
|
56
|
+
|
|
57
|
+
## Storyboard headings
|
|
58
|
+
|
|
59
|
+
- Write each frame heading as `## Frame N: title`, since the dash form in HyperFrames' `storyboard-format.md` example fails the markdown audit
|
|
60
|
+
- Treat the parser's read of the colon form as assumed, since its lenient parse was not confirmed against its source
|
|
61
|
+
- Title each frame as the beat the operator approved, so the frame, the take's folder, and the caption share one name a reader can follow across all three
|
|
62
|
+
|
|
63
|
+
## The workspace README
|
|
64
|
+
|
|
65
|
+
Step 5 writes the filming half of `.canon/video/<slug>/README.md`. The composing session adds its own half under its own heading.
|
|
66
|
+
|
|
67
|
+
- Add how to re-render each project the workspace holds, naming its folder and the render command it runs
|
|
68
|
+
- Name any track rebuilt with `--rate`, with the command that rebuilt it, since a re-film overwrites `camera.json` and leaves a rebuilt track stale
|
|
69
|
+
- Leave the filming half as Step 5 wrote it, so the next session can re-film without reading the composition
|
|
70
|
+
|
|
71
|
+
## Sources
|
|
72
|
+
|
|
73
|
+
| Rule | Source |
|
|
74
|
+
| --------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
75
|
+
| Caption placement and scrim | HyperFrames' `captions.md`, adjusted for footage with chrome along its bottom edge |
|
|
76
|
+
| A new project per shape | `hyperframes-studio`'s brief step, which starts a new project for a different aspect |
|
|
77
|
+
| The 1080x1080 window | Frameboard's launch film, cut square from stepped takes |
|
|
78
|
+
| The 2 MB WebP loop | Frameboard's README hero, an animated WebP cut from a raw take, which played inline at 1.72 MB |
|
|
79
|
+
| Rebuilding a sped-up track | `canon take camera --help`, whose `--rate` divides every time in the log |
|
|
80
|
+
| Storyboard heading form | HyperFrames' `storyboard-format.md` and the markdown audit's character bans, with the colon read assumed |
|
|
81
|
+
| The README's two halves | Frameboard's workspace, whose README recorded how to re-film and re-render after a session ended |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: UI
|
|
2
|
+
title: UI film config
|
|
3
3
|
description: What a take reads from canon/config/app-drive.toml, the access key it adds, and what to ask when the file is absent
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# UI
|
|
6
|
+
# UI film config
|
|
7
7
|
|
|
8
|
-
Read at Step 1 of `ui-
|
|
8
|
+
Read at Step 1 of `ui-film`. A take shares its project's drive config at `canon/config/app-drive.toml` rather than keeping a second file, since both build and serve the same app. The skill reads the file and never writes it.
|
|
9
9
|
|
|
10
10
|
```toml
|
|
11
11
|
launch = "bun install --frozen-lockfile && bun run build && PREVIEW_PORT=4530 bun run preview"
|
|
@@ -28,7 +28,12 @@ access = "/write?token=demo"
|
|
|
28
28
|
- An absent `access` opens the served root
|
|
29
29
|
- `personas` and `proposals` belong to `app-drive`, and a take reads neither
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
### Single-use access
|
|
32
|
+
|
|
33
|
+
Every beat opens the address fresh in its own browser, so a link the app honors once, such as a single-use edit ticket, serves one beat alone. A beat that falls back to the screencast opens the address a second time, so the fallback spends the link too, even within one beat.
|
|
34
|
+
|
|
35
|
+
- Point `access` at a local redirect minting a fresh link per request, so each open gets its own, the one pattern that held across beats and fallbacks alike
|
|
36
|
+
- Run `canon take` once per beat with a freshly minted link only where no redirect can be served, with `"route": "screencast"` on each so no fallback reopens it
|
|
32
37
|
|
|
33
38
|
## When the file is absent
|
|
34
39
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: UI
|
|
2
|
+
title: UI film handoff
|
|
3
3
|
description: What HyperFrames receives from a take, the shape of the click log and camera track, and how a composition applies the camera and draws the cursor
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# UI
|
|
6
|
+
# UI film handoff
|
|
7
7
|
|
|
8
|
-
Read at Step 5 of `ui-
|
|
8
|
+
Read at Step 5 of `ui-film`. Canon stops at the clip, and a HyperFrames composition does the rest. This file states what the composition receives and how it uses each part, so a session composing later needs nothing from the session that filmed.
|
|
9
9
|
|
|
10
10
|
## What the takes folder holds
|
|
11
11
|
|
|
@@ -14,7 +14,7 @@ Read at Step 5 of `ui-record`. Canon stops at the clip, and a HyperFrames compos
|
|
|
14
14
|
| File | Holds |
|
|
15
15
|
| ------------- | ---------------------------------------------------------------------------- |
|
|
16
16
|
| `clip.mp4` | H.264 at 60 fps, 3840x2160 when frame stepped, 1920x1080 when screencast |
|
|
17
|
-
| `log.json` | Every move, click, typing burst, and scroll, with
|
|
17
|
+
| `log.json` | Every move, click, drag, key press, typing burst, and scroll, with its boxes |
|
|
18
18
|
| `camera.json` | One camera per frame of the clip, with the cursor and the click ring |
|
|
19
19
|
| `still.jpg` | The clip's closing frame, the check on each take, which no composition needs |
|
|
20
20
|
|
|
@@ -24,10 +24,10 @@ Every coordinate in the log and the track is in CSS pixels of a 1920x1080 page,
|
|
|
24
24
|
|
|
25
25
|
Each frame carries `scale`, the view's top-left `x` and `y`, the `cursor`, and `ring`.
|
|
26
26
|
|
|
27
|
-
- `scale` is 1 for the whole page and 1.8 at the deepest zoom
|
|
27
|
+
- `scale` is 1 for the whole page and 1.8 at the deepest zoom, or about 1.35 on a screencast beat, and holds at 1 on a beat whose plan set `push: false`
|
|
28
28
|
- `x` and `y` place the view's corner on the page, so the view spans `1920 / scale` by `1080 / scale` from there
|
|
29
29
|
- `cursor` is the pointer's position on the page
|
|
30
|
-
- `ring` runs from 0 to 1 across the 450 ms after a click and is `null` otherwise
|
|
30
|
+
- `ring` runs from 0 to 1 across the 450 ms after a click and is `null` otherwise. On a drag it grows to 0.3, holds there from press to release, and runs on to 1 from the release.
|
|
31
31
|
|
|
32
32
|
The track is final. It already carries the easing, the spring, and the hold, so a composition sets each frame's values and never tweens between them.
|
|
33
33
|
|
|
@@ -40,11 +40,19 @@ bunx -y hyperframes init .canon/video/<slug>/composition
|
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
- Use `bunx` when bun is available, falling back to `npx -y hyperframes init ...` otherwise
|
|
43
|
-
- Prefix the path with the main worktree root when running from a linked worktree, as `ui-
|
|
43
|
+
- Prefix the path with the main worktree root when running from a linked worktree, as `ui-film`'s write scope states
|
|
44
44
|
- Read each clip from `../takes/<dir>/clip.mp4`, relative to the project, rather than copying it in
|
|
45
45
|
- Leave renders in the project's `renders/` folder, which `canon records push` skips along with `takes/`, `snapshots/`, `node_modules/`, and any video file
|
|
46
46
|
- An image the composition adds under `assets/`, such as a logo, is backed up with the project's source
|
|
47
47
|
|
|
48
|
+
A cut in another shape and the README loop are each a project of their own beside `composition/`, so one shape's edit never reflows another's. Each reads the takes from `../takes/` the same way.
|
|
49
|
+
|
|
50
|
+
| Project | Holds |
|
|
51
|
+
| ---------------------- | ------------------------------------------------ |
|
|
52
|
+
| `composition/` | The main cut, in the takes' 16:9 shape |
|
|
53
|
+
| `composition-<shape>/` | One other shape, such as `composition-square/` |
|
|
54
|
+
| `readme-loop/` | The short silent loop a README plays as its hero |
|
|
55
|
+
|
|
48
56
|
Compose from a session started at the main worktree root. From a linked worktree or an isolated background session, `Write` and `Edit` refuse every file in `composition/` and redirect to a worktree copy no later session reads, so never take that redirect.
|
|
49
57
|
|
|
50
58
|
Where composing from the main root is not possible, write each file whole through the route `${CLAUDE_SKILL_DIR}/../session-worktree/references/main-root-writes.md` states.
|
|
@@ -62,6 +70,8 @@ The cursor stays outside the wrapper because a cursor inside it would scale with
|
|
|
62
70
|
|
|
63
71
|
## What the composition still owns
|
|
64
72
|
|
|
73
|
+
Read `${CLAUDE_SKILL_DIR}/references/compose-craft.md` for the captions, the other shapes, the loop, and a sped-up clip, where app footage changes what HyperFrames advises.
|
|
74
|
+
|
|
65
75
|
- The order and the cuts between takes, the captions, and any music or voice
|
|
66
76
|
- Whether a take plays whole or trimmed. A trim keeps the track aligned only when it shifts the track by the same frames.
|
|
67
77
|
- Motion blur stays off, by the operator's call on these takes
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Pull request clip
|
|
3
|
-
description: Pull request mode of ui-
|
|
3
|
+
description: Pull request mode of ui-film, run for pr-evidence with no operator present, covering the beat choice from the checklist, the length cap, the still check that stands in for approval, the reel flag, and the push to the frames branch
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Pull request clip
|
|
7
7
|
|
|
8
|
-
Read at the top of `ui-
|
|
8
|
+
Read at the top of `ui-film` when the caller names pull request mode. `pr-evidence` is the only caller, passing the pull request number, the `url` its `canon pr local` read returned, and the checklist text.
|
|
9
9
|
|
|
10
10
|
This mode films a short reel of what the checklist asks a reviewer to try, hosts it on `canon/frames`, and hands back the link or the reason it skipped.
|
|
11
11
|
|
|
@@ -25,7 +25,7 @@ The mode holds only while the caller names it. An ordinary run that finds a pull
|
|
|
25
25
|
- Skip Step 1's throwaway copy. Film the address the caller passed, joined to the config's `access` value, and start no server.
|
|
26
26
|
- Skip Step 2's approval. The beats come from a checklist a reviewer already reads, and the still check below is the guard against posting a wrong take.
|
|
27
27
|
- Skip Step 5's handoff and its output block, since the reel is the product and HyperFrames composes nothing here
|
|
28
|
-
- Write inside `.canon/tmp/ui-
|
|
28
|
+
- Write inside `.canon/tmp/ui-film/pr-<number>/` at the current worktree's root in place of the video workspace, since a reel is thrown away once posted
|
|
29
29
|
- Ask nothing at any step. Every stop below is a skip with a reason, since the ship chain runs this with nobody to answer.
|
|
30
30
|
|
|
31
31
|
## Choose the beats
|
|
@@ -43,7 +43,7 @@ Keep the whole reel at or under 12 seconds. Each beat opens and closes on a 0.6
|
|
|
43
43
|
## Film the reel
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
canon take <url> .canon/tmp/ui-
|
|
46
|
+
canon take <url> .canon/tmp/ui-film/pr-<number>/plan.json --out .canon/tmp/ui-film/pr-<number>/takes --reel .canon/tmp/ui-film/pr-<number>/reel.webp --json
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
Branch on the record's `reason`, never on the exit code.
|
|
@@ -69,7 +69,7 @@ Open each beat's `still.jpg`, the closing frame the record names in its `still`
|
|
|
69
69
|
Stamp the pass in compact UTC and push the file:
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
canon pr frames <number> --reel .canon/tmp/ui-
|
|
72
|
+
canon pr frames <number> --reel .canon/tmp/ui-film/pr-<number>/reel.webp --pass "$(date -u +%Y%m%dT%H%M%SZ)" --json
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
- `ok`: hold the record's `link`
|
|
@@ -5,7 +5,7 @@ description: The filming rules a take plan follows, the frame-stepping limits, a
|
|
|
5
5
|
|
|
6
6
|
# Take craft
|
|
7
7
|
|
|
8
|
-
Read at Step 3 of `ui-
|
|
8
|
+
Read at Step 3 of `ui-film`, before writing the first beat. `canon take --help` carries every step kind, the target forms, and each refusal code, so this file carries the judgment and leaves the vocabulary to the verb.
|
|
9
9
|
|
|
10
10
|
## Contents
|
|
11
11
|
|
|
@@ -15,6 +15,7 @@ Read at Step 3 of `ui-record`, before writing the first beat. `canon take --help
|
|
|
15
15
|
- [Targets](#targets)
|
|
16
16
|
- [The pointer](#the-pointer)
|
|
17
17
|
- [The zoom](#the-zoom)
|
|
18
|
+
- [The harness route](#the-harness-route)
|
|
18
19
|
- [Sources](#sources)
|
|
19
20
|
|
|
20
21
|
## The plan
|
|
@@ -44,6 +45,13 @@ A plan holds the approved beats in order. Each beat names its setup, which runs
|
|
|
44
45
|
- Reach the beat's start state through `setup`, since every beat opens the page fresh and nothing a setup step does is filmed
|
|
45
46
|
- Write the beat's `name` as the operator approved it, since it names the clip's folder
|
|
46
47
|
|
|
48
|
+
### Server state
|
|
49
|
+
|
|
50
|
+
Every beat reloads the page, never the server. An app holding its state in server memory keeps a change one beat made, so the next beat opens on it.
|
|
51
|
+
|
|
52
|
+
- Undo the change in the next beat's `setup`, or order the beats so each one's result is the next one's start
|
|
53
|
+
- Restart the server between beats only when neither works, since a restart costs the served address its warm start
|
|
54
|
+
|
|
47
55
|
## Frame-stepping limits
|
|
48
56
|
|
|
49
57
|
A step beat runs the page on a virtual clock, one frame per step. Most pages film this way, and some inputs are known to stall it.
|
|
@@ -52,10 +60,11 @@ A step beat runs the page on a virtual clock, one frame per step. Most pages fil
|
|
|
52
60
|
- A scroll has not been proven under frame stepping, and a smooth scroll can jump. Give a scroll its own beat so a fallback costs that beat alone.
|
|
53
61
|
- An animated GIF can freeze, so expect one to hold its first frame
|
|
54
62
|
- Set `"route": "screencast"` on a beat known to stall, rather than paying for the stall before the fallback
|
|
63
|
+
- Set a top-level `"route": "screencast"` on a plan whose page stalls on every beat, and a beat naming its own `route` keeps it
|
|
55
64
|
|
|
56
65
|
A fallback films the beat again from a fresh load, replaying its setup and the steps the stepper already ran. A beat whose steps persist in the app, such as a fill that renames something, would then start from the changed state, so set `"route": "screencast"` on it when it risks a stall.
|
|
57
66
|
|
|
58
|
-
A screencast beat films in real time at 1920x1080,
|
|
67
|
+
A screencast beat films in real time at 1920x1080, so its camera zooms only to about 1.35x before it would go soft. Tell the operator which beats ran that way.
|
|
59
68
|
|
|
60
69
|
### Reading a take back
|
|
61
70
|
|
|
@@ -68,6 +77,7 @@ Two rules hold once a beat is filmed.
|
|
|
68
77
|
|
|
69
78
|
- Prefer a stable attribute, such as an `aria-label`, a `data-testid`, or an `id`, over a position like `:nth-child`
|
|
70
79
|
- Use `text=<words>` for a control whose only stable handle is its label
|
|
80
|
+
- Target a control with no visible text, such as an icon button, by its `aria-label`, since `text=` finds nothing on it
|
|
71
81
|
- Use a `move` to a point only for a target the page reveals on hover, and follow it with the click
|
|
72
82
|
- Read each target off the served page before writing it. The verb refuses `target-missing` rather than filming a guess, and a refusal costs a reload.
|
|
73
83
|
|
|
@@ -86,6 +96,22 @@ The camera track already carries the zoom, so these rules decide what to film fo
|
|
|
86
96
|
- Expect a target filling most of the view to get less zoom, and one filling the page to get none
|
|
87
97
|
- The push reaches 90% of its depth in about 633 ms, inside the 1 s ceiling a push onto an action keeps
|
|
88
98
|
|
|
99
|
+
### Depth, opt-out, and speed
|
|
100
|
+
|
|
101
|
+
Three controls change the push itself.
|
|
102
|
+
|
|
103
|
+
- Expect a screencast beat's zoom to stop near 1.35x, since its clip has one pixel per page pixel, and a stepped beat's to reach 1.8x
|
|
104
|
+
- Set `"push": false` on a beat the edit holds wide, such as one showing a whole layout change. Its track keeps the cursor and the click ring and drops the zoom.
|
|
105
|
+
- Rebuild a beat's track with `canon take camera <dir>/log.json --rate <n> --out <file>` for a clip the edit plays `n` times faster, so the zoom settles on the clock a viewer sees
|
|
106
|
+
|
|
107
|
+
## The harness route
|
|
108
|
+
|
|
109
|
+
A beat driven from outside the page, such as a drag between two windows or an input the step kinds lack, cannot run as `canon take` steps. Until the verb can run an outside script itself, film it through a harness.
|
|
110
|
+
|
|
111
|
+
- Drive the beat from a Playwright script that records the page and writes a log in the shape of a take's `log.json`
|
|
112
|
+
- Build its camera track from that log with `canon take camera <log> --out <file>`, so the composition applies it like any other take
|
|
113
|
+
- Tell the operator which beats ran this way, since their clips carry the harness's resolution rather than the stepper's
|
|
114
|
+
|
|
89
115
|
## Sources
|
|
90
116
|
|
|
91
117
|
| Rule | Source |
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: ui-measure
|
|
3
3
|
description: Why a rendering cost question is answered with a number against a published threshold, and why the runner is detected rather than prescribed
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# UI measure requirement
|
|
7
7
|
|
|
8
8
|
## Gap
|
|
9
9
|
|
|
@@ -29,7 +29,7 @@ A session that does start one picks a runner on the spot, takes one noisy load,
|
|
|
29
29
|
|
|
30
30
|
## Out of scope
|
|
31
31
|
|
|
32
|
-
- Judging the interface against stated intent, and contrast, which `
|
|
32
|
+
- Judging the interface against stated intent, and contrast, which `ui-audit` owns from the stylesheet's color values
|
|
33
33
|
- Writing behavioral tests against the interface, which `test-first` and `test-craft` own
|
|
34
34
|
- Network waterfall, bundle size, and accessibility, which no skill measures
|
|
35
35
|
- Fixing what the reading found, which a separate change owns
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: Measures paint, processor, and layout cost against a running interface and reports numbers against published thresholds. Detects the project's existing browser harness rather than requiring one. Use when asked "how fast is this page", "measure the UI", "what does this cost to render", "check Core Web Vitals", or "profile the interface". Do NOT use to judge UI quality by reading source, which is `
|
|
2
|
+
name: ui-measure
|
|
3
|
+
description: Measures paint, processor, and layout cost against a running interface and reports numbers against published thresholds. Detects the project's existing browser harness rather than requiring one. Use when asked "how fast is this page", "measure the UI", "what does this cost to render", "check Core Web Vitals", or "profile the interface". Do NOT use to judge UI quality by reading source, which is `ui-audit`.
|
|
4
4
|
metadata:
|
|
5
5
|
family: check
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
# UI measure
|
|
9
9
|
|
|
10
10
|
Report numbers. A sentence about what the source looks like is what this exists to replace, so every finding is a reading beside the threshold it is measured against.
|
|
11
11
|
|
|
@@ -13,7 +13,7 @@ Report numbers. A sentence about what the source looks like is what this exists
|
|
|
13
13
|
|
|
14
14
|
- If the project names no command that serves an interface and the user names no URL, stop: `❌ Nothing to serve. Name a running URL or a command that starts one.`
|
|
15
15
|
- Test for a servable interface rather than source under a folder, since this measures what a browser receives and never reads the tree behind it
|
|
16
|
-
- If the request is about intent, consistency, missing states, or contrast, run nothing and name `
|
|
16
|
+
- If the request is about intent, consistency, missing states, or contrast, run nothing and name `ui-audit`. That skill reads source and this one runs the interface.
|
|
17
17
|
|
|
18
18
|
## Step 1: reach the interface
|
|
19
19
|
|
|
@@ -116,7 +116,7 @@ Report the reading and stop there. A remedy is a change with its own review, so
|
|
|
116
116
|
|
|
117
117
|
Derive `<slug>` per `${CLAUDE_SKILL_DIR}/../git-branch/references/slug.md`. Fall back to `latest` on an empty result.
|
|
118
118
|
|
|
119
|
-
- Write the full reading to `.canon/review/
|
|
119
|
+
- Write the full reading to `.canon/review/ui-measure-<slug>.md` at the main worktree root, resolved the way `session-worktree` does, creating the directory if needed and always overwriting
|
|
120
120
|
- The reading is a main-root write, so it goes out as a heredoc, routed the way `session-worktree` states
|
|
121
121
|
- `.canon/review/` is gitignored, so do not stage or commit the file
|
|
122
122
|
|
|
@@ -126,5 +126,5 @@ Output the summary line and the file path. Do not repeat the table in chat.
|
|
|
126
126
|
|
|
127
127
|
```plaintext
|
|
128
128
|
3 metrics measured against <url>. <n> past threshold.
|
|
129
|
-
📝 Wrote .canon/review/
|
|
129
|
+
📝 Wrote .canon/review/ui-measure-<slug>.md
|
|
130
130
|
```
|
package/docs/agents/audits.md
CHANGED
|
@@ -79,7 +79,7 @@ An audit that finds no corpus reports `absent`, which moves neither the verdict
|
|
|
79
79
|
| `secrets` | `canon secrets scan` | Credential-shaped values in the shipped tree | Gates |
|
|
80
80
|
| `labels` | `canon labels audit` | Changed paths no row of the label map reaches | Reports |
|
|
81
81
|
| `restated` | `canon gov restated` | Instructions `CLAUDE.md` states that a second surface states too | Reports |
|
|
82
|
-
| `rules` | `canon gov audit` | Rules past a shape limit, and here
|
|
82
|
+
| `rules` | `canon gov audit` | Rules past a shape limit, and here rules short of a ledger or out of step with one | Reports |
|
|
83
83
|
| `counts` | `canon gov counts` | Sentences stating a closed catalog's size that disagree with the tree | Reports |
|
|
84
84
|
| `census` | `canon census` | File count, extension breakdown, and line total | Reports |
|
|
85
85
|
| `deps` | `canon deps audit` | Advisories against the resolved dependencies | Reports |
|
package/docs/agents/migrate.md
CHANGED
|
@@ -8,22 +8,22 @@ kind: reference
|
|
|
8
8
|
|
|
9
9
|
`canon migrate <verb>` moves a project off a retired name or layout. Each verb reports its plan and writes nothing until `--write`, takes `--json`, and, except `rename`, takes `--root`. A second run rewrites nothing, which confirms the exclusions and markers fired.
|
|
10
10
|
|
|
11
|
-
| Verb | Moves
|
|
12
|
-
| ------------------ |
|
|
13
|
-
| `status` | Nothing. It lists every migration the project still needs, in run order.
|
|
14
|
-
| `rename` | The retired `aitk` name. `--scope target` rewrites toolkit-owned folders only.
|
|
15
|
-
| `skill-names` | Plugin skills off their `claude-` and `draft-` prefixes and other retired names, with every citation
|
|
16
|
-
| `records` | Session records from `.claude/` to `.canon/`, with every tracked citation
|
|
17
|
-
| `surface-roots` | Records such as `context/` and `REQUIREMENTS.md`, and the stamp folder, from `.claude/` to `canon/` by `git mv`
|
|
18
|
-
| `record-tree` | Citations inside the `.canon/` folders a session still follows, listed below the table
|
|
19
|
-
| `rule-layout` | A flat installed-rule layout onto the `canon/`-wrapped one
|
|
20
|
-
| `scratch-evidence` | A folder a durable record cites out of `.tmp/`, with its citations
|
|
21
|
-
| `record-layout` | Review receipts, memory archives, feedback, renders, picks, and
|
|
22
|
-
| `session-defaults` | The seeded session defaults into an existing `.claude/settings.json`, listed below the table
|
|
11
|
+
| Verb | Moves |
|
|
12
|
+
| ------------------ | --------------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| `status` | Nothing. It lists every migration the project still needs, in run order. |
|
|
14
|
+
| `rename` | The retired `aitk` name. `--scope target` rewrites toolkit-owned folders only. |
|
|
15
|
+
| `skill-names` | Plugin skills off their `claude-` and `draft-` prefixes and other retired names, with every citation |
|
|
16
|
+
| `records` | Session records from `.claude/` to `.canon/`, with every tracked citation |
|
|
17
|
+
| `surface-roots` | Records such as `context/` and `REQUIREMENTS.md`, and the stamp folder, from `.claude/` to `canon/` by `git mv` |
|
|
18
|
+
| `record-tree` | Citations inside the `.canon/` folders a session still follows, listed below the table |
|
|
19
|
+
| `rule-layout` | A flat installed-rule layout onto the `canon/`-wrapped one |
|
|
20
|
+
| `scratch-evidence` | A folder a durable record cites out of `.tmp/`, with its citations |
|
|
21
|
+
| `record-layout` | Review receipts, memory archives, feedback, renders, picks, evidence, and the design board into their current folders |
|
|
22
|
+
| `session-defaults` | The seeded session defaults into an existing `.claude/settings.json`, listed below the table |
|
|
23
23
|
|
|
24
24
|
`record-tree` follows citations in `diagrams`, `memory`, `plans`, `proposals`, `review`, `tasks`, and `teach`. `session-defaults` denies `Agent`, `Task`, and both merge commands, and turns auto memory off. The bullets below add detail per verb.
|
|
25
25
|
|
|
26
|
-
- `skill-names` takes no `--scope`, and skips the changelog, eval transcripts, and the pointer each renamed `draft-` skill leaves at its old name
|
|
26
|
+
- `skill-names` takes no `--scope`, and skips the changelog, eval transcripts, replay fixtures, and the pointer each renamed `draft-` skill leaves at its old name
|
|
27
27
|
- `surface-roots` moves `context/`, `wireframes/`, `ARCHITECTURE.md`, `REQUIREMENTS.md`, `DESIGN.md`, and the stamp folder, and leaves `rules/`, `skills/`, `hooks/`, and `settings.json` in place
|
|
28
28
|
- `rule-layout` classifies each flat file against the stamp as clean, edited, or unclaimed. Clean and edited files move untouched, and an unclaimed name stays.
|
|
29
29
|
- `record-layout` labels each evidence folder `(pick)` or `(evidence)` in the dry run
|