@sylad/cadence 1.6.0 → 1.7.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 (41) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.md +45 -1734
  4. package/agents/acceptance-writer.md +1 -0
  5. package/dist/audit.js +4 -3
  6. package/dist/cli.js +4 -4
  7. package/dist/orchestrate/accept.js +8 -3
  8. package/dist/orchestrate/briefs.js +1 -1
  9. package/dist/orchestrate/command.js +3 -0
  10. package/dist/orchestrate/cycle.js +68 -6
  11. package/docs/cadence-hud.md +50 -0
  12. package/docs/corrections.md +24 -0
  13. package/docs/cycle-vague-dark.svg +42 -0
  14. package/docs/cycle-vague-light.svg +42 -0
  15. package/docs/deliver.md +204 -0
  16. package/docs/fonctionnement-lead-dark.svg +101 -0
  17. package/docs/fonctionnement-lead-light.svg +101 -0
  18. package/docs/fonctionnement-lot-dark.svg +38 -0
  19. package/docs/fonctionnement-lot-light.svg +38 -0
  20. package/docs/fonctionnement-service-dark.svg +23 -0
  21. package/docs/fonctionnement-service-light.svg +23 -0
  22. package/docs/fonctionnement-wave-dark.svg +66 -0
  23. package/docs/fonctionnement-wave-light.svg +66 -0
  24. package/docs/fonctionnement.md +106 -0
  25. package/docs/lead-workflow-dark.svg +200 -0
  26. package/docs/lead-workflow-light.svg +200 -0
  27. package/docs/lead.md +147 -0
  28. package/docs/news.md +245 -0
  29. package/docs/orchestrate.md +639 -0
  30. package/docs/overview.md +27 -0
  31. package/docs/raf.md +192 -0
  32. package/docs/releasing.md +59 -0
  33. package/docs/session.md +107 -0
  34. package/docs/skills.md +76 -0
  35. package/docs/spec.md +60 -0
  36. package/docs/stabilite.md +35 -0
  37. package/docs/whats-new.md +81 -0
  38. package/package.json +28 -1
  39. package/templates/acceptation-runner.mjs +1 -1
  40. package/templates/fiche-back.yaml +1 -1
  41. package/templates/fiche.yaml +1 -1
@@ -0,0 +1,66 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1320 350" width="1320" height="350" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#e6edf3">
2
+ <title>A lot inside an orchestrate wave</title>
3
+ <desc>A lot without commits starts with a precheck (unless orchestrate.precheck is false), then by type through spec, mockup or sheet review and sealed acceptance tests, or straight to the implementation; then the code review, corrections (two passes, a third if the review converges), the UX pass if visible, once, after the compliant code review, and an automatic raf review.</desc>
4
+ <defs><marker id="arr2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#8b949e"/></marker></defs>
5
+ <rect width="1320" height="350" fill="#0d1117"/>
6
+ <rect x="20" y="140" width="120" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="6 4"/>
7
+ <text x="80" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Precheck</text>
8
+ <text x="80" y="177.5" text-anchor="middle" font-size="11.5" fill="#8b949e">local or Sonnet</text>
9
+ <text x="80" y="212" text-anchor="middle" font-size="11.5" fill="#8b949e">already delivered?</text>
10
+ <text x="80" y="227" text-anchor="middle" font-size="11.5" fill="#8b949e">yes → handed to the lead</text>
11
+ <polyline points="140,166 165,166 165,60 198,60" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
12
+ <polyline points="165,166 198,166" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
13
+ <polyline points="165,166 165,272 728,272" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
14
+ <text x="200" y="26" text-anchor="start" font-size="11.5" fill="#8b949e">screen: page only</text>
15
+ <rect x="200" y="34" width="130" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
16
+ <text x="265" y="56.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Spec</text>
17
+ <text x="265" y="71.5" text-anchor="middle" font-size="11.5" fill="#8b949e">mockup + sheet</text>
18
+ <rect x="360" y="34" width="150" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
19
+ <text x="435" y="56.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Mockup review</text>
20
+ <text x="435" y="71.5" text-anchor="middle" font-size="11.5" fill="#8b949e">ux-reviewer · ≤ 2</text>
21
+ <polyline points="330,60 358,60" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
22
+ <polyline points="510,60 558,60" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
23
+ <text x="200" y="132" text-anchor="start" font-size="11.5" fill="#8b949e">spec: true</text>
24
+ <rect x="200" y="140" width="130" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
25
+ <text x="265" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Back-end spec</text>
26
+ <text x="265" y="177.5" text-anchor="middle" font-size="11.5" fill="#8b949e">cases · rules · contracts</text>
27
+ <rect x="360" y="140" width="150" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
28
+ <text x="435" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Sheet review</text>
29
+ <text x="435" y="177.5" text-anchor="middle" font-size="11.5" fill="#8b949e">code-reviewer · ≤ 2</text>
30
+ <polyline points="330,166 358,166" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
31
+ <polyline points="510,166 558,166" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
32
+ <rect x="560" y="34" width="130" height="158" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="6 4"/>
33
+ <text x="625" y="98" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Accept</text>
34
+ <text x="625" y="116" text-anchor="middle" font-size="11.5" fill="#8b949e">red tests</text>
35
+ <text x="625" y="131" text-anchor="middle" font-size="11.5" fill="#8b949e">sealed</text>
36
+ <text x="625" y="146" text-anchor="middle" font-size="11.5" fill="#8b949e">if orchestrate.accept</text>
37
+ <polyline points="690,166 728,166" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
38
+ <text x="200" y="262" text-anchor="start" font-size="11.5" fill="#8b949e">any other lot, component and journey included, unless it already has a sheet</text>
39
+ <rect x="730" y="140" width="130" height="158" rx="6" fill="#0c2d6b" stroke="#58a6ff" stroke-width="2"/>
40
+ <text x="795" y="208" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Implementation</text>
41
+ <text x="795" y="223" text-anchor="middle" font-size="11.5" fill="#8b949e">test first</text>
42
+ <text x="795" y="238" text-anchor="middle" font-size="11.5" fill="#8b949e">commits citing the lot</text>
43
+ <rect x="888" y="193" width="140" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
44
+ <text x="958" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Code review</text>
45
+ <text x="958" y="230.5" text-anchor="middle" font-size="11.5" fill="#8b949e">Opus, Sonnet if ≤ 0.25 d</text>
46
+ <polyline points="860,219 886,219" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
47
+ <rect x="1050" y="193" width="140" height="52" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="6 4"/>
48
+ <text x="1120" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">UX pass</text>
49
+ <text x="1120" y="230.5" text-anchor="middle" font-size="11.5" fill="#8b949e">visible lot · once, last</text>
50
+ <polyline points="1028,219 1048,219" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
51
+ <rect x="1050" y="286" width="140" height="48" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
52
+ <text x="1120" y="306.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Correction</text>
53
+ <text x="1120" y="321.5" text-anchor="middle" font-size="11.5" fill="#8b949e">fresh session</text>
54
+ <polyline points="1100,245 1100,284" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
55
+ <text x="1094" y="270" text-anchor="end" font-size="11.5" fill="#8b949e">not compliant</text>
56
+ <polyline points="1140,286 1140,247" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
57
+ <text x="1147" y="262" text-anchor="start" font-size="11.5" fill="#8b949e">≤ 2 passes,</text>
58
+ <text x="1147" y="277" text-anchor="start" font-size="11.5" fill="#8b949e">3rd if it converges</text>
59
+ <rect x="1230" y="193" width="80" height="52" rx="6" fill="#0c2d6b" stroke="#58a6ff" stroke-width="2"/>
60
+ <text x="1270" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">raf review</text>
61
+ <text x="1270" y="230.5" text-anchor="middle" font-size="11.5" fill="#8b949e">recorded</text>
62
+ <polyline points="1190,219 1228,219" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr2)"/>
63
+ <text x="900" y="162" text-anchor="start" font-size="11.5" fill="#8b949e">small lot: one pass,</text>
64
+ <text x="900" y="177" text-anchor="start" font-size="11.5" fill="#8b949e">review-small if visible</text>
65
+ <text x="1210" y="186" text-anchor="middle" font-size="11.5" fill="#8b949e">compliant</text>
66
+ </svg>
@@ -0,0 +1,66 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1320 350" width="1320" height="350" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#1f2328">
2
+ <title>A lot inside an orchestrate wave</title>
3
+ <desc>A lot without commits starts with a precheck (unless orchestrate.precheck is false), then by type through spec, mockup or sheet review and sealed acceptance tests, or straight to the implementation; then the code review, corrections (two passes, a third if the review converges), the UX pass if visible, once, after the compliant code review, and an automatic raf review.</desc>
4
+ <defs><marker id="arr2" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#57606a"/></marker></defs>
5
+ <rect width="1320" height="350" fill="#ffffff"/>
6
+ <rect x="20" y="140" width="120" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5" stroke-dasharray="6 4"/>
7
+ <text x="80" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Precheck</text>
8
+ <text x="80" y="177.5" text-anchor="middle" font-size="11.5" fill="#57606a">local or Sonnet</text>
9
+ <text x="80" y="212" text-anchor="middle" font-size="11.5" fill="#57606a">already delivered?</text>
10
+ <text x="80" y="227" text-anchor="middle" font-size="11.5" fill="#57606a">yes → handed to the lead</text>
11
+ <polyline points="140,166 165,166 165,60 198,60" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
12
+ <polyline points="165,166 198,166" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
13
+ <polyline points="165,166 165,272 728,272" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
14
+ <text x="200" y="26" text-anchor="start" font-size="11.5" fill="#57606a">screen: page only</text>
15
+ <rect x="200" y="34" width="130" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
16
+ <text x="265" y="56.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Spec</text>
17
+ <text x="265" y="71.5" text-anchor="middle" font-size="11.5" fill="#57606a">mockup + sheet</text>
18
+ <rect x="360" y="34" width="150" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
19
+ <text x="435" y="56.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Mockup review</text>
20
+ <text x="435" y="71.5" text-anchor="middle" font-size="11.5" fill="#57606a">ux-reviewer · ≤ 2</text>
21
+ <polyline points="330,60 358,60" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
22
+ <polyline points="510,60 558,60" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
23
+ <text x="200" y="132" text-anchor="start" font-size="11.5" fill="#57606a">spec: true</text>
24
+ <rect x="200" y="140" width="130" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
25
+ <text x="265" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Back-end spec</text>
26
+ <text x="265" y="177.5" text-anchor="middle" font-size="11.5" fill="#57606a">cases · rules · contracts</text>
27
+ <rect x="360" y="140" width="150" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
28
+ <text x="435" y="162.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Sheet review</text>
29
+ <text x="435" y="177.5" text-anchor="middle" font-size="11.5" fill="#57606a">code-reviewer · ≤ 2</text>
30
+ <polyline points="330,166 358,166" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
31
+ <polyline points="510,166 558,166" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
32
+ <rect x="560" y="34" width="130" height="158" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5" stroke-dasharray="6 4"/>
33
+ <text x="625" y="98" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Accept</text>
34
+ <text x="625" y="116" text-anchor="middle" font-size="11.5" fill="#57606a">red tests</text>
35
+ <text x="625" y="131" text-anchor="middle" font-size="11.5" fill="#57606a">sealed</text>
36
+ <text x="625" y="146" text-anchor="middle" font-size="11.5" fill="#57606a">if orchestrate.accept</text>
37
+ <polyline points="690,166 728,166" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
38
+ <text x="200" y="262" text-anchor="start" font-size="11.5" fill="#57606a">any other lot, component and journey included, unless it already has a sheet</text>
39
+ <rect x="730" y="140" width="130" height="158" rx="6" fill="#ddf4ff" stroke="#0969da" stroke-width="2"/>
40
+ <text x="795" y="208" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Implementation</text>
41
+ <text x="795" y="223" text-anchor="middle" font-size="11.5" fill="#57606a">test first</text>
42
+ <text x="795" y="238" text-anchor="middle" font-size="11.5" fill="#57606a">commits citing the lot</text>
43
+ <rect x="888" y="193" width="140" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
44
+ <text x="958" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Code review</text>
45
+ <text x="958" y="230.5" text-anchor="middle" font-size="11.5" fill="#57606a">Opus, Sonnet if ≤ 0.25 d</text>
46
+ <polyline points="860,219 886,219" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
47
+ <rect x="1050" y="193" width="140" height="52" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5" stroke-dasharray="6 4"/>
48
+ <text x="1120" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">UX pass</text>
49
+ <text x="1120" y="230.5" text-anchor="middle" font-size="11.5" fill="#57606a">visible lot · once, last</text>
50
+ <polyline points="1028,219 1048,219" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
51
+ <rect x="1050" y="286" width="140" height="48" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
52
+ <text x="1120" y="306.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Correction</text>
53
+ <text x="1120" y="321.5" text-anchor="middle" font-size="11.5" fill="#57606a">fresh session</text>
54
+ <polyline points="1100,245 1100,284" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
55
+ <text x="1094" y="270" text-anchor="end" font-size="11.5" fill="#57606a">not compliant</text>
56
+ <polyline points="1140,286 1140,247" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
57
+ <text x="1147" y="262" text-anchor="start" font-size="11.5" fill="#57606a">≤ 2 passes,</text>
58
+ <text x="1147" y="277" text-anchor="start" font-size="11.5" fill="#57606a">3rd if it converges</text>
59
+ <rect x="1230" y="193" width="80" height="52" rx="6" fill="#ddf4ff" stroke="#0969da" stroke-width="2"/>
60
+ <text x="1270" y="215.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">raf review</text>
61
+ <text x="1270" y="230.5" text-anchor="middle" font-size="11.5" fill="#57606a">recorded</text>
62
+ <polyline points="1190,219 1228,219" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr2)"/>
63
+ <text x="900" y="162" text-anchor="start" font-size="11.5" fill="#57606a">small lot: one pass,</text>
64
+ <text x="900" y="177" text-anchor="start" font-size="11.5" fill="#57606a">review-small if visible</text>
65
+ <text x="1210" y="186" text-anchor="middle" font-size="11.5" fill="#57606a">compliant</text>
66
+ </svg>
@@ -0,0 +1,106 @@
1
+ # How cadence works
2
+
3
+ A versioned plan (`raf`) tied to the commits, waves of fresh sessions driven by a program
4
+ (`cadence orchestrate`), a lead that decides and re-verifies, then deliveries proved by their effect.
5
+ Four figures go from the isolated lot to the tool itself. Dashed boxes are conditional steps; a
6
+ box with a blue outline is where the work is kept or checked.
7
+
8
+ ## 1. The life of a lot in the plan
9
+
10
+ <picture>
11
+ <source media="(prefers-color-scheme: dark)" srcset="fonctionnement-lot-dark.svg">
12
+ <img alt="A lot goes from todo to doing, receives commits that cite it, gets its review and UX verdicts, becomes done, then is delivered by cadence deliver" src="fonctionnement-lot-light.svg">
13
+ </picture>
14
+
15
+ The plan (`docs/plan/raf.yaml`, or the file `cadence.yaml` names) is the single source of truth:
16
+ `raf check` reports every commit that cites no lot (unless a motivated `raf ignore` covers it).
17
+ `hook.autostart` in `cadence.yaml` sets what the pre-commit hook does with a commit that cites a lot
18
+ still `todo`: `warn` (the default), `refuse`, or `start` it in the same commit. `raf done` is refused
19
+ while a sub-task is open. A delivery is finished only when its effect checks pass.
20
+
21
+ ## 2. A lot inside a wave
22
+
23
+ <picture>
24
+ <source media="(prefers-color-scheme: dark)" srcset="fonctionnement-wave-dark.svg">
25
+ <img alt="A lot without commits starts with a precheck (unless disabled), then by type through spec, mockup or sheet review and sealed acceptance tests, or straight to the implementation; then the UX pass if visible, the code review, corrections and an automatic raf review" src="fonctionnement-wave-light.svg">
26
+ </picture>
27
+
28
+ A lot without commits yet starts with the **precheck** (unless `orchestrate.precheck: false`; a lot that already has commits is never pre-checked): is the deliverable already there? « Yes » hands the lot back
29
+ to the lead; « partial » passes what exists to the implementation. Then:
30
+
31
+ - `screen: page` only: **spec** (mockup and screen sheet), **mockup review** (`ux-reviewer`, two
32
+ passes at most), then **accept**. `screen: component` and `screen: journey` lots take the ordinary
33
+ path, unless their sheet already exists.
34
+ - `spec: true` (a lot with a behaviour to pin down and no screen): **back-end spec** (cases, rules,
35
+ contracts), **sheet review** (`code-reviewer` in sheet mode, two passes at most), then **accept**.
36
+ A mixed lot (a page whose sheet has a `sujet` block) gets both reviews and a single second spec pass.
37
+ - **accept** writes the acceptance tests from the sheet, committed red and locked, when the project
38
+ declares `orchestrate.accept`.
39
+ - every other lot goes straight to the **implementation**: test first, commits that cite the lot.
40
+
41
+ After the implementation: the **code review** (Opus, Sonnet for a lot of 0.25 day or less); a
42
+ **correction** in a fresh session if the review is not compliant, two passes at most, and a third
43
+ only when the review converges (the count of blocking + major findings dropped and only one is
44
+ left), each followed by a review. A compliant review makes the program record `raf review` itself;
45
+ for a `visible` lot whose project says how to see its app (`orchestrate.ux`), the **UX pass** comes
46
+ once, after the compliant code review (a blocking or major UX finding sends the lot to a correction,
47
+ then the code review, then the UX pass again).
48
+ A small lot (estimate of 0.5 day or less, or `quickwin`) has a single review pass, with no separate UX pass:
49
+ `review-small` covering code and usability when the lot is `visible`, a code `review` otherwise.
50
+
51
+ ## 3. The lead drives the waves
52
+
53
+ <picture>
54
+ <source media="(prefers-color-scheme: dark)" srcset="fonctionnement-lead-dark.svg">
55
+ <img alt="Three lanes: the human chooses and decides, the lead starts, relays, re-verifies and delivers, the orchestrate program runs the lots and chains the next wave while the context stays under 60 percent" src="fonctionnement-lead-light.svg">
56
+ </picture>
57
+
58
+ The lead does not code and never commits where a wave runs. It re-verifies itself (git log, tests,
59
+ build, `raf check`) before `raf done`, delivers one project at a time, and never pushes above a
60
+ handed-back lot (only « livrable jusqu'à `<sha>` »). The UX verdict is the human's, or the lead's
61
+ when the parent folder's `cadence.yaml` says `lead.ux: lead`; the human is then asked only at the
62
+ slightest doubt. The step-by-step version, with its three lanes, is in [lead.md](lead.md).
63
+
64
+ ## 4. Putting cadence itself in service
65
+
66
+ <picture>
67
+ <source media="(prefers-color-scheme: dark)" srcset="fonctionnement-service-dark.svg">
68
+ <img alt="The cadence code on the PATH is a separate worktree, updated only by npm run service on a reviewed sha" src="fonctionnement-service-light.svg">
69
+ </picture>
70
+
71
+ On the cadence repository itself, the `raf` and `cadence` commands of the `PATH` do not read the
72
+ working repository's `dist/`: they read a separate worktree under `~/.local/share/cadence`, updated
73
+ only by `npm run service -- <sha>`. The command refuses a sha that is not an ancestor of `HEAD` and a
74
+ sha whose cited lots are not `done`, so a wave cannot put unreviewed code in service. In the
75
+ working repository, `npm run build` is a typecheck only. A `dropped` lot whose every commit is undone
76
+ by a `git revert` under the sha no longer blocks.
77
+
78
+ ## Budget of a lot
79
+
80
+ The budget a wave gives a lot is derived from its estimate, measured on the runs of the project:
81
+
82
+ | Lot | Budget |
83
+ |---|---|
84
+ | up to 0.5 day | 540 k tokens |
85
+ | 0.5 to 1 day | 750 k |
86
+ | beyond | 570 k per day, 750 k at least |
87
+ | `screen: page` | 1.3 M at least, or the ordinary budget + 450 k if that is more |
88
+ | `spec: true` | ordinary budget + 450 k |
89
+ | fix pass and short review | 155 k reserved |
90
+
91
+ The final review is always played; the budget bounds the writing passes. A `screen: component` or
92
+ `screen: journey` lot takes the ordinary budget, unless its sheet already exists: it then gets the
93
+ `screen: page` budget.
94
+
95
+ ## Permanent rules
96
+
97
+ - **Session cap.** As many sessions or subagents running at once as the cap (2 by default, set by the
98
+ human with `CADENCE_MAX_SESSIONS` or `--max-sessions`). The lead never raises it itself.
99
+ - Never two sessions in the same repository at the same time.
100
+ - A session cannot ask the human anything: it stops and reports, and the lead brings the question back.
101
+ - A sealed acceptance test that contradicts its sheet is corrected by the lead with
102
+ `cadence spec reseal <lot> <test> --reason "…"`, never by editing `acceptation.json`.
103
+ - Deliveries and the `raf ux` / `raf review` verdicts belong to the lead, one project at a time.
104
+
105
+ See also the [orchestrate](orchestrate.md#orchestrate) page and the
106
+ [lead tour](lead.md#lead-tour).
@@ -0,0 +1,200 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1650 810" width="1650" height="810" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#e6edf3">
2
+ <title>Workflow of the lead skill in three lanes: the human, the lead session, and the orchestrate program with its agents</title>
3
+ <defs><marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#8b949e"/></marker>
4
+ <marker id="arrw" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#ff7b72"/></marker></defs>
5
+ <rect width="1650" height="810" fill="#0d1117"/>
6
+ <text x="825" y="34" text-anchor="middle" font-size="18" font-weight="600">The lead workflow: decide at the top, work in fresh sessions</text>
7
+ <rect x="10" y="70" width="1630" height="200" fill="#161b22" stroke="#30363d"/>
8
+ <line x1="150" y1="70" x2="150" y2="270" stroke="#30363d"/>
9
+ <text x="24" y="146" font-weight="700" font-size="15" fill="#d29922">Human</text>
10
+ <text x="24" y="166" font-size="11.5" fill="#8b949e">chooses, answers,</text>
11
+ <text x="24" y="181" font-size="11.5" fill="#8b949e">gives the UX verdict</text>
12
+ <rect x="10" y="270" width="1630" height="200" fill="#0d1117" stroke="#30363d"/>
13
+ <line x1="150" y1="270" x2="150" y2="470" stroke="#30363d"/>
14
+ <text x="24" y="339" font-weight="700" font-size="15" fill="#58a6ff">Lead session</text>
15
+ <text x="24" y="359" font-size="11.5" fill="#8b949e">stays small:</text>
16
+ <text x="24" y="374" font-size="11.5" fill="#8b949e">reads, decides, checks,</text>
17
+ <text x="24" y="389" font-size="11.5" fill="#8b949e">delivers</text>
18
+ <rect x="10" y="470" width="1630" height="320" fill="#161b22" stroke="#30363d"/>
19
+ <line x1="150" y1="470" x2="150" y2="790" stroke="#30363d"/>
20
+ <text x="24" y="606" font-weight="700" font-size="15" fill="#3fb950">orchestrate</text>
21
+ <text x="24" y="626" font-size="11.5" fill="#8b949e">program and agents</text>
22
+ <text x="24" y="641" font-size="11.5" fill="#8b949e">(fresh short sessions)</text>
23
+ <text x="240" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">1 Tour</text>
24
+ <text x="420" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">2 Wave</text>
25
+ <text x="600" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">3 Relay</text>
26
+ <text x="780" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">4 Review</text>
27
+ <text x="960" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">5 Re-check</text>
28
+ <text x="1140" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">6 Delivery</text>
29
+ <text x="1320" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">7 Threshold</text>
30
+ <text x="1500" y="88" text-anchor="middle" font-size="11.5" font-weight="600" fill="#8b949e">8 Close</text>
31
+ <g id="tour"><rect x="161" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
32
+ <text x="240" y="358.5" text-anchor="middle" font-weight="600" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">cadence lead tour</text>
33
+ <text x="240" y="374.5" text-anchor="middle">one line per project</text>
34
+ <text x="240" y="390.5" text-anchor="middle">+ three proposals</text>
35
+ </g>
36
+ <g id="choose"><rect x="161" y="137" width="158" height="66" rx="8" fill="#3d2e00" stroke="#d29922" stroke-width="1.5"/>
37
+ <text x="240" y="158.5" text-anchor="middle" font-weight="600">Picks the lots</text>
38
+ <text x="240" y="174.5" text-anchor="middle">and the order</text>
39
+ <text x="240" y="190.5" text-anchor="middle">(the priority)</text>
40
+ </g>
41
+ <g id="launch"><rect x="341" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
42
+ <text x="420" y="358.5" text-anchor="middle" font-weight="600">Starts the wave</text>
43
+ <text x="420" y="374.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">orchestrate … --wave</text>
44
+ <text x="420" y="390.5" text-anchor="middle">in the background</text>
45
+ </g>
46
+ <g id="precheck"><rect x="161" y="508" width="158" height="82" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
47
+ <text x="240" y="529.5" text-anchor="middle" font-weight="600">Precheck</text>
48
+ <text x="240" y="545.5" text-anchor="middle">local model or Sonnet:</text>
49
+ <text x="240" y="561.5" text-anchor="middle">already delivered?</text>
50
+ <text x="240" y="577.5" text-anchor="middle">yes → back to lead</text>
51
+ </g>
52
+ <g id="spec"><rect x="341" y="480" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
53
+ <text x="420" y="501.5" text-anchor="middle" font-weight="600">Spec (screen: page)</text>
54
+ <text x="420" y="517.5" text-anchor="middle">spec-writer: mockup</text>
55
+ <text x="420" y="533.5" text-anchor="middle">+ sheet, 1440 / 390</text>
56
+ </g>
57
+ <g id="mockup"><rect x="521" y="480" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
58
+ <text x="600" y="501.5" text-anchor="middle" font-weight="600">Mockup review</text>
59
+ <text x="600" y="517.5" text-anchor="middle">ux-reviewer, 2 passes</text>
60
+ <text x="600" y="533.5" text-anchor="middle">max, then handed back</text>
61
+ </g>
62
+ <g id="backspec"><rect x="341" y="552" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
63
+ <text x="420" y="573.5" text-anchor="middle" font-weight="600">Back-end spec</text>
64
+ <text x="420" y="589.5" text-anchor="middle">spec: true: cases,</text>
65
+ <text x="420" y="605.5" text-anchor="middle">rules, contracts</text>
66
+ </g>
67
+ <g id="sheetreview"><rect x="521" y="552" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
68
+ <text x="600" y="573.5" text-anchor="middle" font-weight="600">Sheet review</text>
69
+ <text x="600" y="589.5" text-anchor="middle">code-reviewer, 2</text>
70
+ <text x="600" y="605.5" text-anchor="middle">passes max</text>
71
+ </g>
72
+ <g id="accept"><rect x="701" y="480" width="158" height="138" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
73
+ <text x="780" y="543" text-anchor="middle" font-weight="600">Accept</text>
74
+ <text x="780" y="559" text-anchor="middle">red tests + lock</text>
75
+ <text x="780" y="575" text-anchor="middle">if accept declared</text>
76
+ </g>
77
+ <g id="implement"><rect x="341" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5"/>
78
+ <text x="420" y="671.5" text-anchor="middle" font-weight="600">Implementation</text>
79
+ <text x="420" y="687.5" text-anchor="middle">test first, commits</text>
80
+ <text x="420" y="703.5" text-anchor="middle">cite the lot</text>
81
+ </g>
82
+ <g id="relay"><rect x="521" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
83
+ <text x="600" y="358.5" text-anchor="middle" font-weight="600">Relays the journal</text>
84
+ <text x="600" y="374.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">tail -F journal.log</text>
85
+ <text x="600" y="390.5" text-anchor="middle">one sentence per line</text>
86
+ </g>
87
+ <g id="answer"><rect x="521" y="137" width="158" height="66" rx="8" fill="#3d2e00" stroke="#d29922" stroke-width="1.5"/>
88
+ <text x="600" y="158.5" text-anchor="middle" font-weight="600">Answers a question</text>
89
+ <text x="600" y="174.5" text-anchor="middle">the lead never</text>
90
+ <text x="600" y="190.5" text-anchor="middle">answers for them</text>
91
+ </g>
92
+ <g id="uxpass"><rect x="521" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
93
+ <text x="600" y="671.5" text-anchor="middle" font-weight="600">UX pass</text>
94
+ <text x="600" y="687.5" text-anchor="middle">visible lot + app</text>
95
+ <text x="600" y="703.5" text-anchor="middle">declared; vs mockup</text>
96
+ </g>
97
+ <g id="codereview"><rect x="701" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5"/>
98
+ <text x="780" y="671.5" text-anchor="middle" font-weight="600">Code review</text>
99
+ <text x="780" y="687.5" text-anchor="middle">Opus (Sonnet ≤ 0.25 d)</text>
100
+ <text x="780" y="703.5" text-anchor="middle">records raf review</text>
101
+ </g>
102
+ <g id="fix"><rect x="881" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
103
+ <text x="960" y="671.5" text-anchor="middle" font-weight="600">Correction</text>
104
+ <text x="960" y="687.5" text-anchor="middle">new session, 2 passes</text>
105
+ <text x="960" y="703.5" text-anchor="middle">3rd if it converges</text>
106
+ </g>
107
+ <g id="table"><rect x="701" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
108
+ <text x="780" y="358.5" text-anchor="middle" font-weight="600">Final table</text>
109
+ <text x="780" y="374.5" text-anchor="middle">ready · handed back</text>
110
+ <text x="780" y="390.5" text-anchor="middle">· « livrable jusqu'à »</text>
111
+ </g>
112
+ <g id="recheck"><rect x="881" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
113
+ <text x="960" y="358.5" text-anchor="middle" font-weight="600">Re-verifies itself</text>
114
+ <text x="960" y="374.5" text-anchor="middle">git log · tests · build</text>
115
+ <text x="960" y="390.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">raf check</text>
116
+ </g>
117
+ <g id="uxverdict"><rect x="881" y="137" width="158" height="66" rx="8" fill="#3d2e00" stroke="#d29922" stroke-width="1.5"/>
118
+ <text x="960" y="158.5" text-anchor="middle" font-weight="600">Looks at the captures</text>
119
+ <text x="960" y="174.5" text-anchor="middle">UX verdict →</text>
120
+ <text x="960" y="190.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">raf ux (visible lot)</text>
121
+ </g>
122
+ <g id="done"><rect x="1061" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
123
+ <text x="1140" y="358.5" text-anchor="middle" font-weight="600" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">raf done</text>
124
+ <text x="1140" y="374.5" text-anchor="middle">then push</text>
125
+ <text x="1140" y="390.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">cadence deliver</text>
126
+ </g>
127
+ <g id="qa"><rect x="1061" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5" stroke-dasharray="5 3"/>
128
+ <text x="1140" y="671.5" text-anchor="middle" font-weight="600">qa-reviewer</text>
129
+ <text x="1140" y="687.5" text-anchor="middle">reads only; blocking</text>
130
+ <text x="1140" y="703.5" text-anchor="middle">findings → the human</text>
131
+ </g>
132
+ <g id="ctx"><rect x="1241" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
133
+ <text x="1320" y="358.5" text-anchor="middle" font-weight="600">Context under 60 %?</text>
134
+ <text x="1320" y="374.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">session context</text>
135
+ <text x="1320" y="390.5" text-anchor="middle">error = at threshold</text>
136
+ </g>
137
+ <g id="next"><rect x="1241" y="650" width="158" height="66" rx="8" fill="#0f2d1a" stroke="#3fb950" stroke-width="1.5"/>
138
+ <text x="1320" y="671.5" text-anchor="middle" font-weight="600">Next wave</text>
139
+ <text x="1320" y="687.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">… --continue</text>
140
+ <text x="1320" y="703.5" text-anchor="middle">draws the next ready lot</text>
141
+ </g>
142
+ <g id="close"><rect x="1421" y="337" width="158" height="66" rx="8" fill="#0c2d6b" stroke="#58a6ff" stroke-width="1.5"/>
143
+ <text x="1500" y="358.5" text-anchor="middle" font-weight="600">Close</text>
144
+ <text x="1500" y="374.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">session-close</text>
145
+ <text x="1500" y="390.5" text-anchor="middle" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" font-size="11.5">session next ×3</text>
146
+ </g>
147
+ <g id="report"><rect x="1421" y="137" width="158" height="66" rx="8" fill="#3d2e00" stroke="#d29922" stroke-width="1.5"/>
148
+ <text x="1500" y="158.5" text-anchor="middle" font-weight="600">One line per project</text>
149
+ <text x="1500" y="174.5" text-anchor="middle">delivered · in progress</text>
150
+ <text x="1500" y="190.5" text-anchor="middle">· blocked (and why)</text>
151
+ </g>
152
+ <polyline points="240,337 240,203" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
153
+ <text x="248" y="236" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">proposals</text>
154
+ <polyline points="319,170 420,170 420,337" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
155
+ <text x="414" y="164" text-anchor="end" font-size="11" fill="#8b949e" class="lbl">choice</text>
156
+ <polyline points="499,683 521,683" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
157
+ <polyline points="679,683 701,683" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
158
+ <polyline points="859,683 881,683" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
159
+ <polyline points="960,650 960,632 820,632 820,650" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
160
+ <text x="968" y="626" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">then review again</text>
161
+ <polyline points="870,683 870,430 780,430 780,403" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
162
+ <text x="876" y="446" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">wave ends</text>
163
+ <polyline points="510,683 510,430 600,430 600,403" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
164
+ <text x="516" y="646" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">journal</text>
165
+ <polyline points="630,337 630,203" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
166
+ <text x="636" y="236" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">question</text>
167
+ <polyline points="570,203 570,337" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
168
+ <text x="564" y="236" text-anchor="end" font-size="11" class="lbl" fill="#8b949e">--resume --answer</text>
169
+ <polyline points="859,370 881,370" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
170
+ <polyline points="960,203 960,337" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
171
+ <text x="968" y="236" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">on the human's verdict,</text>
172
+ <text x="968" y="251" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">or the lead's (lead.ux: lead)</text>
173
+ <polyline points="1039,370 1061,370" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
174
+ <polyline points="1140,403 1140,650" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
175
+ <polyline points="1320,403 1320,650" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
176
+ <text x="1326" y="440" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">yes: chain</text>
177
+ <polyline points="1399,370 1421,370" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
178
+ <text x="1410" y="329" text-anchor="middle" font-size="11" fill="#8b949e" class="lbl">≥ 60 %: close</text>
179
+ <polyline points="1500,337 1500,203" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
180
+ <polyline points="1320,716 1320,746 420,746 420,716" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
181
+ <text x="870" y="740" text-anchor="middle" font-size="11" fill="#8b949e" class="lbl">next wave: back to step 2, the limits still apply</text>
182
+ <rect x="170" y="760" width="22" height="14" rx="3" fill="none" stroke="#8b949e" stroke-dasharray="5 3"/>
183
+ <text x="200" y="771" font-size="11.5" fill="#8b949e">conditional step</text>
184
+ <text x="340" y="771" font-size="11.5" fill="#8b949e">The lead never commits where a wave runs, and never delivers two projects at once. At most as many sessions or subagents as the cap the human sets (CADENCE_MAX_SESSIONS, 2 by default).</text>
185
+ <polyline points="420,403 420,440 240,440 240,508" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
186
+ <polyline points="319,549 330,549 330,513 341,513" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
187
+ <polyline points="330,549 330,585 341,585" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
188
+ <polyline points="499,513 521,513" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
189
+ <polyline points="679,513 701,513" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
190
+ <polyline points="499,585 521,585" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
191
+ <polyline points="679,585 701,585" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
192
+ <polyline points="240,590 240,683 341,683" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
193
+ <polyline points="780,618 780,634 420,634 420,650" fill="none" stroke="#8b949e" stroke-width="1.6" marker-end="url(#arr)"/>
194
+ <text x="232" y="640" text-anchor="end" font-size="11" fill="#8b949e" class="lbl">other lots</text>
195
+ <text x="232" y="655" text-anchor="end" font-size="11" fill="#8b949e" class="lbl">go straight on</text>
196
+ <text x="890" y="508" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">lots with screen: page</text>
197
+ <text x="890" y="523" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">spec, mockup, accept</text>
198
+ <text x="890" y="568" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">lots with spec: true</text>
199
+ <text x="890" y="583" text-anchor="start" font-size="11" fill="#8b949e" class="lbl">spec, sheet review, accept</text>
200
+ </svg>