@sylad/cadence 0.10.1 → 0.12.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/.claude-plugin/marketplace.json +16 -3
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +219 -21
- package/agents/code-reviewer.md +8 -3
- package/agents/precheck-reader.md +14 -0
- package/agents/qa-reviewer.md +19 -2
- package/agents/ux-reviewer.md +1 -1
- package/bin/cadence.js +3 -2
- package/dist/audit.js +34 -7
- package/dist/cli.js +113 -13
- package/dist/config.js +104 -15
- package/dist/deliver.js +10 -3
- package/dist/news.js +17 -1
- package/dist/orchestrate/app.js +189 -0
- package/dist/orchestrate/briefs.js +16 -0
- package/dist/orchestrate/command.js +224 -45
- package/dist/orchestrate/cycle.js +208 -26
- package/dist/orchestrate/guard.js +148 -3
- package/dist/orchestrate/launch.js +43 -5
- package/dist/orchestrate/lock.js +19 -5
- package/dist/orchestrate/node-env.js +77 -0
- package/dist/orchestrate/pool.js +4 -3
- package/dist/orchestrate/registry.js +120 -0
- package/dist/orchestrate/schemas.js +7 -1
- package/dist/orchestrate/snapshot.js +99 -0
- package/dist/orchestrate/state.js +22 -0
- package/dist/orchestrate/table.js +11 -1
- package/dist/plan.js +29 -0
- package/dist/proc.js +19 -0
- package/dist/session.js +6 -3
- package/dist/state.js +34 -14
- package/package.json +1 -1
- package/skills/lead/SKILL.md +17 -8
- package/templates/orchestrate/fix-minors.md +3 -0
- package/templates/orchestrate/fix.md +4 -0
- package/templates/orchestrate/implement.md +5 -1
- package/templates/orchestrate/precheck.md +10 -0
- package/templates/orchestrate/review-recheck.md +2 -0
- package/templates/orchestrate/review-small.md +3 -0
- package/templates/orchestrate/review.md +2 -0
- package/templates/orchestrate/ux.md +2 -0
package/dist/state.js
CHANGED
|
@@ -61,38 +61,43 @@ export function readLock(dir) {
|
|
|
61
61
|
export function lockAlive(lock) {
|
|
62
62
|
return lock.unreadable ? lock.ageMs < 5_000 : pidAlive(lock.pid);
|
|
63
63
|
}
|
|
64
|
-
/** Pose
|
|
65
|
-
export function
|
|
66
|
-
const tmp =
|
|
67
|
-
writeFileSync(tmp,
|
|
64
|
+
/** Pose un fichier de façon atomique (lien vers un fichier complet : il n'existe jamais à moitié écrit) ; false s'il existe déjà (EEXIST) ; toute autre erreur est relancée. `tag` distingue les fichiers temporaires d'un même processus. */
|
|
65
|
+
export function linkNewFile(file, content, tag) {
|
|
66
|
+
const tmp = `${file}.${tag}.${Date.now()}.tmp`;
|
|
67
|
+
writeFileSync(tmp, content);
|
|
68
68
|
try {
|
|
69
|
-
linkSync(tmp,
|
|
69
|
+
linkSync(tmp, file);
|
|
70
70
|
return true;
|
|
71
71
|
}
|
|
72
|
-
catch {
|
|
73
|
-
|
|
72
|
+
catch (e) {
|
|
73
|
+
// Seul EEXIST veut dire « déjà là » ; EPERM, EMLINK… (pas de liens physiques ici) remontent au lieu de passer pour un verrou tenu.
|
|
74
|
+
if (e.code === 'EEXIST')
|
|
75
|
+
return false;
|
|
76
|
+
throw e;
|
|
74
77
|
}
|
|
75
78
|
finally {
|
|
76
79
|
rmSync(tmp, { force: true });
|
|
77
80
|
}
|
|
78
81
|
}
|
|
79
|
-
/**
|
|
80
|
-
|
|
81
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Retire un verrou périmé seulement s'il est encore celui qu'on a lu : il est écarté par renommage, `same` relit
|
|
84
|
+
* l'écart, et s'il a changé il est rendu à son nouveau porteur. Partagé par le verrou de livraison et celui de l'URL UX.
|
|
85
|
+
*/
|
|
86
|
+
export function removeStaleFile(file, same) {
|
|
87
|
+
const aside = `${file}.stale.${process.pid}`;
|
|
82
88
|
try {
|
|
83
|
-
renameSync(
|
|
89
|
+
renameSync(file, aside);
|
|
84
90
|
}
|
|
85
91
|
catch {
|
|
86
92
|
return false;
|
|
87
93
|
}
|
|
88
|
-
|
|
89
|
-
if (now && now.pid === seen.pid && now.sha === seen.sha && now.started === seen.started) {
|
|
94
|
+
if (same(aside)) {
|
|
90
95
|
rmSync(aside, { force: true });
|
|
91
96
|
return true;
|
|
92
97
|
}
|
|
93
98
|
// Un autre processus a pris le verrou entre-temps : le lui rendre.
|
|
94
99
|
try {
|
|
95
|
-
linkSync(aside,
|
|
100
|
+
linkSync(aside, file);
|
|
96
101
|
}
|
|
97
102
|
catch {
|
|
98
103
|
// Un troisième l'a déjà repris : le sien fait foi.
|
|
@@ -100,6 +105,21 @@ export function removeStaleLock(dir, seen) {
|
|
|
100
105
|
rmSync(aside, { force: true });
|
|
101
106
|
return false;
|
|
102
107
|
}
|
|
108
|
+
/** Cause d'une pose de verrou impossible, en une ligne : « verrou <chemin> : <errno> » (le code, sinon le message). */
|
|
109
|
+
export function lockFault(file, e) {
|
|
110
|
+
return `verrou ${file} : ${e?.code ?? (e instanceof Error ? e.message : String(e))}`;
|
|
111
|
+
}
|
|
112
|
+
/** Pose le verrou de façon atomique (lien vers un fichier complet) ; false s'il existe déjà. */
|
|
113
|
+
export function writeLock(dir, lock) {
|
|
114
|
+
return linkNewFile(lockPath(dir), JSON.stringify(lock), lock.pid);
|
|
115
|
+
}
|
|
116
|
+
/** Retire un verrou périmé seulement s'il est encore celui qu'on a lu ; sinon le laisse en place. */
|
|
117
|
+
export function removeStaleLock(dir, seen) {
|
|
118
|
+
return removeStaleFile(lockPath(dir), (aside) => {
|
|
119
|
+
const now = readLockFile(aside);
|
|
120
|
+
return !!now && now.pid === seen.pid && now.sha === seen.sha && now.started === seen.started;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
103
123
|
/** Retire le verrou s'il appartient à ce processus. */
|
|
104
124
|
export function releaseLock(dir, pid) {
|
|
105
125
|
const lock = readLock(dir);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sylad/cadence",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "A small, repo-native working method: a versioned plan linked to your commits, a changelog with screenshots, session rituals and deliveries proven by their effect.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Sylvain Ladoire",
|
package/skills/lead/SKILL.md
CHANGED
|
@@ -14,7 +14,13 @@ commands (its CLAUDE.md names them), never with `raf start|done|note|ux|review`.
|
|
|
14
14
|
|
|
15
15
|
## Limits that always apply
|
|
16
16
|
|
|
17
|
-
- **At most two subagents running at once.** Queue the rest.
|
|
17
|
+
- **At most two subagents running at once.** Queue the rest. The sessions of an orchestrated wave
|
|
18
|
+
(section 2b) count toward this limit: orchestrate sessions plus subagents never exceed two. A wave
|
|
19
|
+
already caps itself (`--max-sessions`, 2 by default, shared by every wave); before starting a
|
|
20
|
+
subagent, check `cadence orchestrate --status`, and while a wave runs, start none beyond the free
|
|
21
|
+
slots. Count the free slots from what `--status` shows per wave, not from the live sessions (a
|
|
22
|
+
wave's steps take a slot and give it back between two steps): 2 − Σ min(cap, number of repositories
|
|
23
|
+
of the wave that still have lots). Never raise `--max-sessions` above two to speed a wave up.
|
|
18
24
|
- **Never two subagents in the same repository at the same time**, and the lead does not commit in a
|
|
19
25
|
repository where a subagent is working.
|
|
20
26
|
- **Deliveries and `raf ux` / `raf review` verdicts are done by the lead, one project at a time** —
|
|
@@ -35,11 +41,12 @@ progress, then drift that blocks a delivery, then ready quick wins. **Stop and w
|
|
|
35
41
|
## 2. Delegation
|
|
36
42
|
|
|
37
43
|
The default way to delegate is **`cadence orchestrate`** (section 2b): a program, not a conversation, that runs
|
|
38
|
-
one fresh short session per step. When the lead delegates by hand, the brief is the template
|
|
39
|
-
`templates/orchestrate/implement.md` of the cadence package — the single source, tested
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
one fresh short session per step; the wave runs from a frozen copy of the cadence package, so it can orchestrate cadence itself and its templates can be edited meanwhile. When the lead delegates by hand, the brief is the template
|
|
45
|
+
`templates/orchestrate/implement.md` of the cadence package — the single source, tested. The lead runs
|
|
46
|
+
`cd <project> && raf start <lot>`, then starts from the brief written by `cadence orchestrate --dry-run
|
|
47
|
+
<project>:<lot>`: it is already rendered (`{{chemin}}`, `{{lot}}`, `{{titre}}`, `{{objectif}}` and `{{news}}`,
|
|
48
|
+
the News instruction of a `visible` lot, are filled in; it names no wave Playwright directory — a hand delegation has none — so the screenshot goes under the OS temp directory, then into `docs/nouveautes/captures/`). The lead only adjusts the goal to what done looks
|
|
49
|
+
like (the human's words) and keeps the rest verbatim.
|
|
43
50
|
|
|
44
51
|
A lot that adds or changes a screen is `visible`: after the implementation, have the
|
|
45
52
|
`ux-reviewer` agent review it (give it the URL or the way to run the app) and bring its verdict and
|
|
@@ -57,7 +64,9 @@ cadence orchestrate <project>:<lot> <project>:<lot>@haiku … [--budget 2M]
|
|
|
57
64
|
`cadence orchestrate --dry-run …` first when a precondition is in doubt. The program, not the lead, runs
|
|
58
65
|
for each lot a fresh short session per step — implementation (Sonnet), UX review if the lot is `visible`
|
|
59
66
|
and the project declares how to see its app (`orchestrate.ux` in `cadence.yaml`), code review last
|
|
60
|
-
(Opus, the `code-reviewer` agent
|
|
67
|
+
(Opus, the `code-reviewer` agent; Sonnet, with no pass on the minor findings, for a lot whose estimate is
|
|
68
|
+
≤ 0.25 d — `orchestrate.review` in `cadence.yaml`; a blocker or major finding still brings a correction and an
|
|
69
|
+
Opus review), a correction in a new session if the review is not compliant (two
|
|
61
70
|
passes at most) — and records `raf review` itself when the code review is compliant. The state is in
|
|
62
71
|
`.cadence/runs/<wave>/`, not in this conversation. `@haiku` only when the human writes it, for a
|
|
63
72
|
mechanical lot. Exit code: 0 all ready · 1 some lots handed back · 2 refused before acting · 3 wave
|
|
@@ -67,7 +76,7 @@ What the orchestrator does **not** do, and stays with the lead: choose the lots
|
|
|
67
76
|
questions back (`--resume --answer <project>:<lot> "…"`), look at the UX reviewer's captures and record
|
|
68
77
|
`raf ux` (the orchestrator reports its verdict, it never records it), re-verify (section 3, point 2),
|
|
69
78
|
`raf done`, push and deliver. Minor findings and proposed sub-tasks come back in the table: adding them to
|
|
70
|
-
the plan is the lead's decision. If an orchestrated wave is running in a repository, do not commit there
|
|
79
|
+
the plan is the lead's decision. A minor finding becomes a lot of its own only if it describes an observable bug (a wrong output, a crash, a measured regression); otherwise it stays a note of the originating lot, so that a review never feeds the next one. If an orchestrated wave is running in a repository, do not commit there
|
|
71
80
|
and do not deliver it (`cadence deliver` refuses).
|
|
72
81
|
|
|
73
82
|
## 3. Check
|
|
@@ -17,6 +17,9 @@ Minor choices to settle yourself, writing the alternative you did not take:
|
|
|
17
17
|
a spacing, colour or label value when a measurement or a rule justifies it; the URL of a link (the most general official page if a precise one is not certain);
|
|
18
18
|
a News entry: only if a finding asks for it; a written rule of the project's CLAUDE.md (apply it); who launches the review or UX pass (never the session: the program and the lead do).
|
|
19
19
|
"not my job to touch the plan" is not a question: say it in the report.
|
|
20
|
+
Never stop to ask about how to organise your own work (split or squash a commit, whether to continue): decide, list it under "choix", go on. A finding you contest is noted under "choix" with the evidence, not raised to the lead.
|
|
20
21
|
You are one short session of an orchestrated wave: do not launch subagents (the Agent tool is disabled).
|
|
21
22
|
Give your final report as the structured output (commits, tests, build, what you could not verify, choices).
|
|
22
23
|
{{reponse}}
|
|
24
|
+
{{captures}}
|
|
25
|
+
Browser (Playwright): if a Playwright MCP server is available in this session, it was launched by the orchestrator with its own output directory, in the orchestrator's run directory outside the repository: give screenshots, snapshots and traces a relative file name only (e.g. `page-home.png`), they land there. Never an absolute path, never the `--output-dir` option (the server's launch argument, which a session cannot set). If no such server is available, do not install or start one; if you use the Playwright CLI, write its outputs under the OS temp directory (or the temporary folder the project's CLAUDE.md names), never inside the repository, which must stay clean.
|
|
@@ -16,6 +16,10 @@ otherwise it is a choice: decide, write the alternative you did not take, go on.
|
|
|
16
16
|
a spacing, colour or label value when a measurement or a rule justifies it; the URL of a link (the most general official page if a precise one is not certain);
|
|
17
17
|
a News entry: only if a finding asks for it; a written rule of the project's CLAUDE.md (apply it); who launches the review or UX pass (never the session: the program and the lead do).
|
|
18
18
|
"not my job to touch the plan" is not a question: say it in the report.
|
|
19
|
+
Never stop to ask about how to organise your own work (split or squash a commit, order of the sub-parts, whether to continue, "I have no question"): decide, list it under "choix", go on. Leave "questions" empty rather than writing a placeholder such as "no question".
|
|
20
|
+
A finding you contest (it describes a state older than the code, or you think it wrong) is not a question and not a reason to stop: do not ask the lead to arbitrate. Write it under "choix" with the evidence (the command, the line, the commit), fix what is right, go on; the next fresh review re-reads it.
|
|
19
21
|
You are one short session of an orchestrated wave: do not launch subagents (the Agent tool is disabled).
|
|
20
22
|
Give your final report as the structured output (commits, tests, build, what you could not verify, choices, questions).
|
|
21
23
|
{{reponse}}
|
|
24
|
+
{{captures}}
|
|
25
|
+
Browser (Playwright): if a Playwright MCP server is available in this session, it was launched by the orchestrator with its own output directory, in the orchestrator's run directory outside the repository: give screenshots, snapshots and traces a relative file name only (e.g. `page-home.png`), they land there. Never an absolute path, never the `--output-dir` option (the server's launch argument, which a session cannot set). If no such server is available, do not install or start one; if you use the Playwright CLI, write its outputs under the OS temp directory (or the temporary folder the project's CLAUDE.md names), never inside the repository, which must stay clean.
|
|
@@ -5,14 +5,16 @@ Rules: test first; commit each sub-part as soon as its tests pass, with explicit
|
|
|
5
5
|
`git add -A` or `commit -a`), and a message that cites the lot (`feat({{lot}}): …`); run the project's
|
|
6
6
|
full test suite and build before reporting; do not push, deliver, run `raf done`, `raf ux` or
|
|
7
7
|
`raf review`.
|
|
8
|
+
Documentation: the project's README (and its usage documentation) describes the behaviour you deliver, updated in the same commits, like the CHANGELOG — a README that does not follow your change is a major finding of the review.
|
|
8
9
|
Decide minor interpretation questions yourself (the wording of a message, a name, a default, the
|
|
9
10
|
reading of an ambiguous line of the lot) and list each one under "choix" in your report, with the
|
|
10
11
|
alternative you did not take — the reviewer re-reads them. Stop and ask (under "questions") only on a real blocker.
|
|
11
12
|
A question is legitimate only if it names what it would change: the scope of the lot, the architecture, or a costly rollback (data, production, public API), AND the plan, its notes and the project's CLAUDE.md do not settle it;
|
|
12
13
|
otherwise it is a choice: decide, write the alternative you did not take, go on. Minor choices to settle yourself:
|
|
13
14
|
a spacing, colour or label value when a measurement or a rule justifies it; the URL of a link (the most general official page if a precise one is not certain);
|
|
14
|
-
a
|
|
15
|
+
a written rule of the project's CLAUDE.md (apply it); who launches the review or UX pass (never the session: the program and the lead do).
|
|
15
16
|
"not my job to touch the plan" is not a question: say it in the report.
|
|
17
|
+
Never stop to ask about how to organise your own work (split or squash a commit, order of the sub-parts, whether to continue, "I have no question"): decide, list it under "choix", go on. Leave "questions" empty rather than writing a placeholder such as "no question".
|
|
16
18
|
If the lot's commits already cover its open sub-tasks, do not ask whether to continue: make no commit and say so
|
|
17
19
|
in your report (the review that follows re-reads those commits). If they do not cover them all, implement the rest.
|
|
18
20
|
Report: commits (sha + subject), tests and build results with their numbers, what you could not
|
|
@@ -21,5 +23,7 @@ verify, choices made, open questions.
|
|
|
21
23
|
You are one short session of an orchestrated wave: do not launch subagents (the Agent tool is disabled).
|
|
22
24
|
Give your final report as the structured output, not as free text. If the plan is kept by the project's own tool
|
|
23
25
|
(read-only for `raf`), use that tool's commands named in the project's CLAUDE.md, never `raf start|done|note`.
|
|
26
|
+
{{news}}
|
|
24
27
|
{{commits}}
|
|
25
28
|
{{reponse}}
|
|
29
|
+
Browser (Playwright): if a Playwright MCP server is available in this session, it was launched by the orchestrator with its own output directory, in the orchestrator's run directory outside the repository: give screenshots, snapshots and traces a relative file name only (e.g. `page-home.png`), they land there. Never an absolute path, never the `--output-dir` option (the server's launch argument, which a session cannot set). If no such server is available, do not install or start one; if you use the Playwright CLI, write its outputs under the OS temp directory (or the temporary folder the project's CLAUDE.md names), never inside the repository, which must stay clean.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Pre-check for lot `{{lot}}` — "{{titre}}" — of the repository `{{chemin}}`, as the read-only pre-check reader.
|
|
2
|
+
Question: is the deliverable of this lot ALREADY in the repository (done by another lot, or by a correction)?
|
|
3
|
+
Goal of the lot: {{objectif}}
|
|
4
|
+
Read the lot, its notes and sub-tasks in the plan (`docs/plan/raf.yaml`, or the file named by `plan:` in `cadence.yaml`),
|
|
5
|
+
then look for the deliverable in the code and tests (`git log`, `grep`, reading the files the lot names). Do not
|
|
6
|
+
implement anything and do not run the full test suite: this is a quick look.
|
|
7
|
+
Answer `oui` only when every part of the lot is present, with a proof for each (file:line or commit sha); `partiel` when
|
|
8
|
+
some parts are present (say which); `non` otherwise. When in doubt, answer `non`: an implementation session follows.
|
|
9
|
+
You are read-only: do not modify, commit, push or run `raf start|done|note|review|ux`. Do not launch subagents.
|
|
10
|
+
Give your report as the structured output: `dejaPresent` (oui | partiel | non), `preuves` (the proofs), `resume` (one sentence).
|
|
@@ -4,7 +4,9 @@ treated them. Check that the minor findings fixed are fixed, that the fixes brok
|
|
|
4
4
|
rest of the lot is still sound: read the diff yourself from the commits that cite the lot
|
|
5
5
|
(`raf commits {{lot}}`, or `git log`), run the checks, report real defects only. A new minor finding
|
|
6
6
|
is reported, not a reason to ask for another pass. This is a code review only.
|
|
7
|
+
{{checks}}
|
|
7
8
|
{{choix}}
|
|
9
|
+
A proposed sub-task describes an observable bug (a wrong output, a crash, a measured regression); any other minor finding stays a note of this lot, not a sub-task.
|
|
8
10
|
You are read-only: do not modify, commit, push or run `raf review|ux|done`. Do not launch subagents.
|
|
9
11
|
Give your report as the structured output: counts of blocking / major / minor findings, each finding
|
|
10
12
|
(severity, file, line, text), proposed sub-tasks, what you could not verify, and the one-line verdict
|
|
@@ -3,9 +3,12 @@ This lot is small: one single pass covers the code review AND the usability revi
|
|
|
3
3
|
You are given the repository path and the lot id only: read the diff yourself from the commits that
|
|
4
4
|
cite the lot (`raf commits {{lot}}`, or `git log`), run the checks, report real defects only.
|
|
5
5
|
{{ux}}
|
|
6
|
+
{{checks}}
|
|
6
7
|
{{choix}}
|
|
8
|
+
A proposed sub-task describes an observable bug (a wrong output, a crash, a measured regression); any other minor finding stays a note of this lot, not a sub-task.
|
|
7
9
|
You are read-only: do not modify, commit, push or run `raf review|ux|done`. Do not launch subagents.
|
|
8
10
|
Give your report as the structured output: counts of blocking / major / minor findings (usability
|
|
9
11
|
findings included, each tied to a named rule — Nielsen heuristic or WCAG 2.2 AA criterion — or a
|
|
10
12
|
measurement), each finding (severity, file, line, text), proposed sub-tasks, what you could not
|
|
11
13
|
verify, and the one-line verdict for `raf review {{lot}}`.
|
|
14
|
+
Browser (Playwright): if a Playwright MCP server is available in this session, it was launched by the orchestrator with its own output directory, in the orchestrator's run directory outside the repository: give screenshots, snapshots and traces a relative file name only (e.g. `page-home.png`), they land there. Never an absolute path, never the `--output-dir` option (the server's launch argument, which a session cannot set). If no such server is available, do not install or start one; if you use the Playwright CLI, write its outputs under the OS temp directory (or the temporary folder the project's CLAUDE.md names), never inside the repository, which must stay clean.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
Review lot `{{lot}}` — "{{titre}}" — of the repository `{{chemin}}`, following your agent instructions.
|
|
2
2
|
You are given the repository path and the lot id only: read the diff yourself from the commits that
|
|
3
3
|
cite the lot (`raf commits {{lot}}`, or `git log`), run the checks, report real defects only.
|
|
4
|
+
{{checks}}
|
|
4
5
|
{{choix}}
|
|
6
|
+
A proposed sub-task describes an observable bug (a wrong output, a crash, a measured regression); any other minor finding stays a note of this lot, not a sub-task.
|
|
5
7
|
You are read-only: do not modify, commit, push or run `raf review|ux|done`. Do not launch subagents.
|
|
6
8
|
Give your report as the structured output: counts of blocking / major / minor findings, each finding
|
|
7
9
|
(severity, file, line, text), proposed sub-tasks, what you could not verify, and the one-line verdict
|
|
@@ -2,9 +2,11 @@ Review the usability and accessibility of lot `{{lot}}` — "{{titre}}" — of t
|
|
|
2
2
|
following your agent instructions. Read the diff yourself from the commits that cite the lot
|
|
3
3
|
(`raf commits {{lot}}`, or `git log`).
|
|
4
4
|
{{ux}}
|
|
5
|
+
A proposed sub-task describes an observable bug (a wrong output, a crash, a measured regression); any other minor finding stays a note of this lot, not a sub-task.
|
|
5
6
|
You are read-only: do not modify, commit, push or run `raf review|ux|done`. Do not launch subagents.
|
|
6
7
|
Ground every finding in a named rule (Nielsen heuristic, WCAG 2.2 AA criterion) or a measurement;
|
|
7
8
|
describe a mockup before proposing any redesign, never code it.
|
|
8
9
|
Give your report as the structured output: counts of blocking / major / minor findings, each finding
|
|
9
10
|
(severity, file, line, text), proposed sub-tasks, what you could not verify, and the one-line verdict
|
|
10
11
|
for `raf ux {{lot}}`.
|
|
12
|
+
Playwright (browser MCP): this session's Playwright server was launched by the orchestrator with its own output directory, which lies in the orchestrator's run directory, outside the repository. Every screenshot, snapshot and trace you take lands there, so give each one a relative file name only (e.g. `page-home.png`, `home-390px.png`): the lead will look at them in that directory. Never an absolute path (such as one under `/tmp`), never the `--output-dir` option (it is the server's launch argument, which a session cannot set), and never write browser outputs anywhere else; the repository must stay clean.
|