@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,204 @@
1
+ [← cadence](../README.md)
2
+
3
+ # deliver
4
+
5
+ A delivery is done when its checks pass, not when a tool says "success".
6
+
7
+ ```yaml
8
+ # cadence.yaml, at the repository root
9
+ deliver:
10
+ ci: github # github | none | { command: "…" } (default: none)
11
+ ciTimeout: 1800 # seconds
12
+ deploy: # sh commands, in order, at the repo root
13
+ - ./scripts/deploy.sh "$CADENCE_SHORT"
14
+ verify: # at least one; retried every 10 s until verifyTimeout
15
+ - url: https://app.example.com/api/health
16
+ status: 200 # default 200
17
+ - url: https://app.example.com/version.txt
18
+ contains: "${SHORT}"
19
+ - command: kubectl rollout status deploy/app --timeout=60s
20
+ verifyTimeout: 300
21
+ deployTimeout: 1800 # seconds, per deploy command
22
+ ```
23
+
24
+ A public title (`public:`) longer than the site's Plan page accepts fails its build. Declare the limit
25
+ in `cadence.yaml` and it is caught before the push:
26
+
27
+ ```yaml
28
+ news:
29
+ publicTitleMax: 80 # characters; without the key, `raf check` warns at 80 in a project that has a news directory
30
+ ```
31
+
32
+ `raf check` also warns (`⚠`, not an error: exit code 0 if nothing else is wrong) about every visible lot, dropped ones excepted, that has no public title: the site would show its technical title (a done lot cited by a News entry is spared: the site reuses that entry's title). Fix it with `raf public <id> "…"`. On a plan kept by another tool (read-only), the warning only applies if `plan.fields` maps a `public` field, or if some lot already carries a literal `public:` key (a field left out is read under its own name): without either there is no public title to set, so it would come back at every session.
33
+
34
+ With the key, `raf public`, `raf add --public`, `raf done` (on a lot whose public title is too long) and
35
+ `cadence news new` (its title) refuse above it; without it, only `raf check` warns.
36
+
37
+ ```sh
38
+ cadence deliver --dry-run # preconditions, then the resolved steps; nothing runs
39
+ cadence deliver # 0 delivered and verified · 1 a step failed · 2 refused before acting
40
+ ```
41
+
42
+ - **Preconditions**: no modified tracked file; `HEAD` is on a remote branch (the
43
+ CI can only build what was pushed); no other delivery running (a lock whose
44
+ process died is removed with a warning); with `ci: github`, `gh` installed and
45
+ logged in.
46
+ - Every command is killed when it exceeds its budget (CI, `deployTimeout`, what is
47
+ left of `verifyTimeout`) and reported as "délai dépassé". Killed means the
48
+ whole tree, followed while the command runs: every 200 ms cadence lists the
49
+ command's descendants and remembers each process it has seen with its start
50
+ time, so a process whose parent exits (re-parented to init — a background
51
+ child of a script, `sh`'s fork for each command) stays known. To kill, cadence
52
+ takes every remembered process still alive with the same start time (never a
53
+ recycled pid) plus all its current descendants, stops each one first
54
+ (`SIGSTOP`, the tree is re-read until nothing new appears), then kills them
55
+ (`SIGKILL`). This happens on a delay overrun, and at once when cadence
56
+ receives `SIGTERM`. On Ctrl-C or a hangup the tree has already received the
57
+ signal from the terminal: cadence gives the whole followed set, not just the
58
+ command, up to 2 seconds to finish (a script's `trap`, git removing its
59
+ `index.lock`), carries on the moment none of it is alive, and kills what is
60
+ left after the 2 seconds, a background child that ignores Ctrl-C included. If
61
+ the command was never listed (process list unreadable from the start), the
62
+ grace lasts as long as the command itself is alive, and what remains after
63
+ 2 seconds is killed through the same fallback (the command itself only). The
64
+ same fallback applies when the process list fails while the command runs and
65
+ is still failing when the kill comes (the last listing is not trusted after
66
+ 1 second): only the command is killed, its descendants survive, and cadence
67
+ says so once on stderr.
68
+ A delay overrun and `SIGTERM` give no grace: a script's own `trap` does not
69
+ get to finish there. The lock is held until the followed set is empty: when
70
+ cadence dies of the signal it dies after the tree, and its stale lock, which
71
+ the next delivery removes, leaves nothing of the first delivery running.
72
+ What can still outlive cadence and run concurrently with the next delivery:
73
+ a process that leaves the tree before cadence first sees it (a daemon's
74
+ double fork, `setsid`, `nohup … &` from a shell that exits, all within less
75
+ than 200 ms), a process of another user that cadence may not signal (`sudo`),
76
+ a background process still running when the command returns normally (it is
77
+ neither waited for nor killed), and everything if cadence itself is killed
78
+ with `SIGKILL` (`kill -9`, the OOM killer).
79
+ Where the process list cannot be read (no `/proc` and `ps` failing), cadence
80
+ can only kill the root command (`sh`): it leads no group of its own, since it
81
+ is deliberately kept in cadence's group, so its descendants are not killed and
82
+ survive it. A list that fails for more than a second is no longer
83
+ trusted (a followed pid may have been recycled): nothing is signalled from it.
84
+ cadence says so once on stderr when the list is unavailable.
85
+ - Commands run in cadence's own process group and session, attached to the
86
+ terminal: `ssh`, `sudo` or `pinentry` can prompt on `/dev/tty`, and Ctrl-C or
87
+ closing the terminal stops the running command together with cadence (within
88
+ the limits above).
89
+ - **CI** `github`: polls `gh run list --commit <sha>` every 15 s; no run after
90
+ 5 minutes is a failure (you probably pushed another commit than the one you
91
+ deliver); every run must end `success`, `skipped` or `neutral`. `gh` errors
92
+ are retried, and reported with their cause after 5 minutes.
93
+ - Commands get `CADENCE_SHA`, `CADENCE_SHORT` (7 characters) and `CADENCE_BRANCH`;
94
+ `${SHA}` and `${SHORT}` are replaced in `url` and `contains`.
95
+ - On success the lots cited by the commits since the previous delivery are
96
+ listed, so you can `raf done` those whose effect you have seen. With a
97
+ read-only plan, only the lots that were in progress when the delivery started
98
+ are listed: an id quoted in a message for context (a finished lot, a
99
+ reservation number that looks like one) is not a delivered lot. Plan upkeep
100
+ commits (see "Plan upkeep needs no lot") are skipped in that list: they cite
101
+ lots without delivering anything.
102
+ - With [`docs.articles`](news.md#an-article-elsewhere-that-follows-the-delivery), a green delivery of lots with a
103
+ public title also opens the lot `Article <project> à rafraîchir` in the plan.
104
+
105
+ ## A project with its own delivery script
106
+
107
+ A project that already delivers with its own script (CI wait, deploy, business
108
+ checks) plugs it in instead of rewriting it as `ci` / `deploy` / `verify`:
109
+
110
+ ```yaml
111
+ deliver:
112
+ script: ./scripts/ship.sh "$CADENCE_SHORT" # replaces ci and deploy
113
+ allowDirty: true # optional: a modified tree is reported, not refused
114
+ deployTimeout: 3600 # seconds, for the whole script
115
+ verify: [] # optional here: the script's own checks count
116
+ ```
117
+
118
+ ```sh
119
+ cadence deliver -- api frontend --news docs/changelog/x.md -- map # everything after the first « -- » goes to the script
120
+ cadence deliver --dry-run -- api # shows the full command, runs nothing
121
+ cadence deliver --sha 6b0d9aa -- api # an earlier pushed commit instead of HEAD
122
+ ```
123
+
124
+ `--sha` (any mode) delivers a pushed commit other than `HEAD` — for a CI that
125
+ builds each service only on the commit that touched it. `allowDirty` suits a
126
+ working tree shared by several sessions when the delivery starts from a pushed
127
+ sha and never from local files; without it a modified tree is refused.
128
+
129
+ cadence keeps what the script usually lacks: the preconditions (clean tree, pushed
130
+ `HEAD`), the lock (never two deliveries at once), the delivery log and the lots
131
+ delivered. Arguments are quoted for `sh`, so spaces and quotes reach the script
132
+ intact. If the script commits and pushes during the delivery (stamping a
133
+ changelog entry, say), the new `HEAD` is the sha recorded as delivered. Exit code
134
+ 0 of the script means delivered; `verify` checks, if any, run after it.
135
+
136
+ ## verify: replay the effect checks, outside a delivery
137
+
138
+ A green delivery says the effect was right *then*. `cadence verify` replays the
139
+ `deliver.verify` checks of `cadence.yaml` at any time — no CI, no deploy, no lock,
140
+ no journal entry, nothing written.
141
+
142
+ ```sh
143
+ cadence verify # one pass, one line per check, then a one-line summary
144
+ cadence verify --retry 60 # retry each failing check for up to 60 s (deliver's 300 s is not applied)
145
+ cadence verify --sha 6b0d9aa # the sha that replaces ${SHA} / ${SHORT} (default: see below)
146
+ ```
147
+
148
+ ```
149
+ ✓ GET https://ol.example/api/health → 200
150
+ ✗ GET https://ol.example/api/lineup → 200, contient « "starters" » — « "starters" » absent de la réponse
151
+ verify : 1 effet rouge sur 2 vérifications
152
+ ```
153
+
154
+ Exit code: **0** every check green · **1** at least one red effect · **2** nothing
155
+ to verify or invalid configuration.
156
+
157
+ **Which sha is expected.** By default `${SHA}` / `${SHORT}` is the last recorded
158
+ delivery (else `HEAD`). One case differs: a project with `ci: none` (the default) and
159
+ **neither** deploy commands (`deliver.deploy`) nor a delivery script — a host that
160
+ builds every push, like Cloudflare Pages — delivers by pushing, and every push counts,
161
+ plan-maintenance commits included. The expected sha is then the head of the tracked
162
+ upstream branch (`origin/<branch>`, as last fetched — `verify` does no network git),
163
+ **provided that upstream is the remote's production branch**: read without network from
164
+ `refs/remotes/origin/HEAD` (set by `git clone` or `git remote set-head origin <branch>`);
165
+ when that reference does not exist locally (repository created with `git init` + push),
166
+ `main` then `master` are taken as the production branch. A work branch pushed with `-u`
167
+ is not published by such a host, so it keeps the default rule. A project with `ci: github`
168
+ or a `ci.command` and no deploy also keeps the last delivery. When local `HEAD` is ahead
169
+ of the upstream, the report says so first — `2 commit(s) non poussé(s) — l'effet vérifié
170
+ est celui de origin/main` — so a red there reads "waiting for a push", not "broken
171
+ effect". `session start` uses the same rule; `--sha` always wins.
172
+
173
+ Time limits differ from deliver's. `verify` runs all the checks **in parallel**,
174
+ each try with the whole 120 s limit (a `url` request gives up after 20 s; a slow
175
+ check is killed at its limit, "délai dépassé", and takes nothing from the others); results are printed in the order
176
+ of `cadence.yaml`. Retries repeat every 10 s (deliver's interval) up to `--retry`
177
+ seconds for each check on its own, so a run lasts at most `--retry` + 120 s.
178
+ deliver, by contrast, runs its checks one after the other, retries each until
179
+ `verifyTimeout` (300 s by default) is spent, and stops at the first check that
180
+ never turns green. The check code is deliver's own (`url` / `status` /
181
+ `contains` / `command`, same messages). A project with
182
+ a delivery script (`deliver.script`) and no `verify` declares no effect checks —
183
+ `verify` says so and exits 2 (its script's own checks stay its business); add
184
+ `deliver.verify` to replay some.
185
+
186
+ Each `command` check of `verify` (and of `session start`) runs in a process group
187
+ of its own, detached from the terminal (no `/dev/tty`: a check must not prompt).
188
+ At its time limit the whole group is killed, so no child survives it; Ctrl-C,
189
+ `SIGTERM` or a closed terminal is passed on to the running checks before cadence
190
+ exits. As the checks run together, the output of their commands may interleave;
191
+ the result lines come after it, in order.
192
+
193
+ Make `verify` count: a health endpoint stays green while the data is wrong (a
194
+ lineup served empty for 38 h behind a green `/api/health`). Add a check on the
195
+ content that matters, e.g. `url: …/api/lineup` with `contains: '"starters"'`.
196
+
197
+ `cadence session start` runs the same checks in parallel (one try each, command
198
+ output muted), each with a 10 s limit, so the whole step takes about 10 s at worst;
199
+ it is not deliver's `verifyTimeout`, and there is no retry. It adds an
200
+ **"Effets en production"** section to the morning report: a single `✓` line when
201
+ everything is green, the red effects and the summary otherwise. It is a fact like
202
+ the others: it never changes the exit code, and an unreachable network shows up
203
+ as red lines ("erreur réseau") without blocking the session. No section for a
204
+ project without `deliver.verify`.
@@ -0,0 +1,101 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1290 372" width="1290" height="372" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#e6edf3">
2
+ <title>The lead drives the waves</title>
3
+ <desc>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.</desc>
4
+ <defs><marker id="arr3" 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="1290" height="372" fill="#0d1117"/>
6
+ <rect x="0" y="30" width="1290" height="90" fill="#161b22"/>
7
+ <rect x="0" y="230" width="1290" height="90" fill="#161b22"/>
8
+ <text x="12" y="71" text-anchor="start" font-weight="600" font-size="13.5" fill="#e6edf3">Human</text>
9
+ <text x="12" y="88" text-anchor="start" font-size="11.5" fill="#8b949e">chooses, decides</text>
10
+ <text x="12" y="171" text-anchor="start" font-weight="600" font-size="13.5" fill="#e6edf3">Lead</text>
11
+ <text x="12" y="188" text-anchor="start" font-size="11.5" fill="#8b949e">short session</text>
12
+ <text x="12" y="271" text-anchor="start" font-weight="600" font-size="13.5" fill="#e6edf3">orchestrate</text>
13
+ <text x="12" y="288" text-anchor="start" font-size="11.5" fill="#8b949e">fresh sessions</text>
14
+ <text x="200" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">1 TOUR</text>
15
+ <text x="344" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">2 WAVE</text>
16
+ <text x="488" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">3 RELAY</text>
17
+ <text x="632" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">4 TABLE</text>
18
+ <text x="776" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">5 RE-CHECK</text>
19
+ <text x="920" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">6 DELIVERY</text>
20
+ <text x="1064" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">7 THRESHOLD</text>
21
+ <text x="1208" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#8b949e">8 CLOSE</text>
22
+ <rect x="136" y="46" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
23
+ <text x="200" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Chooses</text>
24
+ <text x="200" y="86.5" text-anchor="middle" font-size="11.5" fill="#8b949e">lots + order</text>
25
+ <rect x="424" y="46" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="6 4"/>
26
+ <text x="488" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Answers</text>
27
+ <text x="488" y="86.5" text-anchor="middle" font-size="11.5" fill="#8b949e">on a question</text>
28
+ <rect x="712" y="46" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="6 4"/>
29
+ <text x="776" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">UX verdict</text>
30
+ <text x="776" y="86.5" text-anchor="middle" font-size="11.5" fill="#8b949e">or lead (lead.ux)</text>
31
+ <rect x="1144" y="46" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
32
+ <text x="1208" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Report</text>
33
+ <text x="1208" y="86.5" text-anchor="middle" font-size="11.5" fill="#8b949e">1 line / project</text>
34
+ <rect x="136" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
35
+ <text x="200" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">lead tour</text>
36
+ <text x="200" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">3 proposals</text>
37
+ <rect x="280" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
38
+ <text x="344" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Starts</text>
39
+ <text x="344" y="186.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">--wave</text>
40
+ <rect x="424" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
41
+ <text x="488" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Relays</text>
42
+ <text x="488" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">1 sentence / line</text>
43
+ <rect x="568" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
44
+ <text x="632" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Triages</text>
45
+ <text x="632" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">observable bug → lot</text>
46
+ <rect x="712" y="146" width="128" height="58" rx="6" fill="#0c2d6b" stroke="#58a6ff" stroke-width="2"/>
47
+ <text x="776" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Re-verifies</text>
48
+ <text x="776" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">tests · build · check</text>
49
+ <rect x="856" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
50
+ <text x="920" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Delivers</text>
51
+ <text x="920" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">push + deliver</text>
52
+ <rect x="1000" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
53
+ <text x="1064" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">&lt; 60 % ?</text>
54
+ <text x="1064" y="186.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">session context</text>
55
+ <rect x="1144" y="146" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
56
+ <text x="1208" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Close</text>
57
+ <text x="1208" y="186.5" text-anchor="middle" font-size="11.5" fill="#8b949e">if ≥ 60 %</text>
58
+ <rect x="280" y="246" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
59
+ <text x="344" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Lots</text>
60
+ <text x="344" y="286.5" text-anchor="middle" font-size="11.5" fill="#8b949e">figure 2, per lot</text>
61
+ <rect x="424" y="246" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
62
+ <text x="488" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">journal.log</text>
63
+ <text x="488" y="286.5" text-anchor="middle" font-size="11.5" fill="#8b949e">1 line / transition</text>
64
+ <rect x="568" y="246" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
65
+ <text x="632" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Final table</text>
66
+ <text x="632" y="286.5" text-anchor="middle" font-size="11.5" fill="#8b949e">ready · handed back</text>
67
+ <rect x="856" y="246" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
68
+ <text x="920" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">qa-reviewer</text>
69
+ <text x="920" y="286.5" text-anchor="middle" font-size="11.5" fill="#8b949e">read only</text>
70
+ <rect x="1000" y="246" width="128" height="58" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
71
+ <text x="1064" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">--continue</text>
72
+ <text x="1064" y="286.5" text-anchor="middle" font-size="11.5" fill="#8b949e">next ready lot</text>
73
+ <polyline points="180,146 180,106" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
74
+ <polyline points="264,75 344,75 344,144" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
75
+ <text x="300" y="68" text-anchor="middle" font-size="11.5" fill="#8b949e">priority</text>
76
+ <polyline points="408,175 422,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
77
+ <polyline points="552,175 566,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
78
+ <polyline points="696,175 710,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
79
+ <polyline points="840,175 854,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
80
+ <polyline points="984,175 998,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
81
+ <polyline points="1128,175 1142,175" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
82
+ <polyline points="344,204 344,244" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
83
+ <text x="350" y="228" text-anchor="start" font-size="11.5" fill="#8b949e">starts</text>
84
+ <polyline points="408,275 422,275" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
85
+ <polyline points="552,275 566,275" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
86
+ <polyline points="488,246 488,206" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
87
+ <text x="494" y="230" text-anchor="start" font-size="11.5" fill="#8b949e">journal</text>
88
+ <polyline points="488,146 488,106" fill="none" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="5 4" marker-end="url(#arr3)"/>
89
+ <text x="494" y="130" text-anchor="start" font-size="11.5" fill="#8b949e">question</text>
90
+ <polyline points="632,246 632,206" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
91
+ <text x="638" y="230" text-anchor="start" font-size="11.5" fill="#8b949e">wave ends</text>
92
+ <polyline points="776,146 776,106" fill="none" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="5 4" marker-end="url(#arr3)"/>
93
+ <text x="782" y="130" text-anchor="start" font-size="11.5" fill="#8b949e">captures</text>
94
+ <polyline points="920,204 920,244" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
95
+ <text x="926" y="228" text-anchor="start" font-size="11.5" fill="#8b949e">if a page changes</text>
96
+ <polyline points="1064,204 1064,244" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
97
+ <text x="1070" y="228" text-anchor="start" font-size="11.5" fill="#8b949e">yes</text>
98
+ <polyline points="1208,146 1208,106" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
99
+ <polyline points="1064,304 1064,346 344,346 344,306" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr3)"/>
100
+ <text x="704" y="340" text-anchor="middle" font-size="11.5" fill="#8b949e">next wave, without asking the human again</text>
101
+ </svg>
@@ -0,0 +1,101 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1290 372" width="1290" height="372" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#1f2328">
2
+ <title>The lead drives the waves</title>
3
+ <desc>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.</desc>
4
+ <defs><marker id="arr3" 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="1290" height="372" fill="#ffffff"/>
6
+ <rect x="0" y="30" width="1290" height="90" fill="#f6f8fa"/>
7
+ <rect x="0" y="230" width="1290" height="90" fill="#f6f8fa"/>
8
+ <text x="12" y="71" text-anchor="start" font-weight="600" font-size="13.5" fill="#1f2328">Human</text>
9
+ <text x="12" y="88" text-anchor="start" font-size="11.5" fill="#57606a">chooses, decides</text>
10
+ <text x="12" y="171" text-anchor="start" font-weight="600" font-size="13.5" fill="#1f2328">Lead</text>
11
+ <text x="12" y="188" text-anchor="start" font-size="11.5" fill="#57606a">short session</text>
12
+ <text x="12" y="271" text-anchor="start" font-weight="600" font-size="13.5" fill="#1f2328">orchestrate</text>
13
+ <text x="12" y="288" text-anchor="start" font-size="11.5" fill="#57606a">fresh sessions</text>
14
+ <text x="200" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">1 TOUR</text>
15
+ <text x="344" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">2 WAVE</text>
16
+ <text x="488" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">3 RELAY</text>
17
+ <text x="632" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">4 TABLE</text>
18
+ <text x="776" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">5 RE-CHECK</text>
19
+ <text x="920" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">6 DELIVERY</text>
20
+ <text x="1064" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">7 THRESHOLD</text>
21
+ <text x="1208" y="20" text-anchor="middle" font-weight="600" font-size="12" letter-spacing="0.7" fill="#57606a">8 CLOSE</text>
22
+ <rect x="136" y="46" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
23
+ <text x="200" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Chooses</text>
24
+ <text x="200" y="86.5" text-anchor="middle" font-size="11.5" fill="#57606a">lots + order</text>
25
+ <rect x="424" y="46" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5" stroke-dasharray="6 4"/>
26
+ <text x="488" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Answers</text>
27
+ <text x="488" y="86.5" text-anchor="middle" font-size="11.5" fill="#57606a">on a question</text>
28
+ <rect x="712" y="46" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5" stroke-dasharray="6 4"/>
29
+ <text x="776" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">UX verdict</text>
30
+ <text x="776" y="86.5" text-anchor="middle" font-size="11.5" fill="#57606a">or lead (lead.ux)</text>
31
+ <rect x="1144" y="46" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
32
+ <text x="1208" y="71.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Report</text>
33
+ <text x="1208" y="86.5" text-anchor="middle" font-size="11.5" fill="#57606a">1 line / project</text>
34
+ <rect x="136" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
35
+ <text x="200" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">lead tour</text>
36
+ <text x="200" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">3 proposals</text>
37
+ <rect x="280" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
38
+ <text x="344" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Starts</text>
39
+ <text x="344" y="186.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">--wave</text>
40
+ <rect x="424" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
41
+ <text x="488" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Relays</text>
42
+ <text x="488" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">1 sentence / line</text>
43
+ <rect x="568" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
44
+ <text x="632" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Triages</text>
45
+ <text x="632" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">observable bug → lot</text>
46
+ <rect x="712" y="146" width="128" height="58" rx="6" fill="#ddf4ff" stroke="#0969da" stroke-width="2"/>
47
+ <text x="776" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Re-verifies</text>
48
+ <text x="776" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">tests · build · check</text>
49
+ <rect x="856" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
50
+ <text x="920" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Delivers</text>
51
+ <text x="920" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">push + deliver</text>
52
+ <rect x="1000" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
53
+ <text x="1064" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">&lt; 60 % ?</text>
54
+ <text x="1064" y="186.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">session context</text>
55
+ <rect x="1144" y="146" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
56
+ <text x="1208" y="171.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Close</text>
57
+ <text x="1208" y="186.5" text-anchor="middle" font-size="11.5" fill="#57606a">if ≥ 60 %</text>
58
+ <rect x="280" y="246" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
59
+ <text x="344" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Lots</text>
60
+ <text x="344" y="286.5" text-anchor="middle" font-size="11.5" fill="#57606a">figure 2, per lot</text>
61
+ <rect x="424" y="246" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
62
+ <text x="488" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">journal.log</text>
63
+ <text x="488" y="286.5" text-anchor="middle" font-size="11.5" fill="#57606a">1 line / transition</text>
64
+ <rect x="568" y="246" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
65
+ <text x="632" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Final table</text>
66
+ <text x="632" y="286.5" text-anchor="middle" font-size="11.5" fill="#57606a">ready · handed back</text>
67
+ <rect x="856" y="246" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
68
+ <text x="920" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">qa-reviewer</text>
69
+ <text x="920" y="286.5" text-anchor="middle" font-size="11.5" fill="#57606a">read only</text>
70
+ <rect x="1000" y="246" width="128" height="58" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
71
+ <text x="1064" y="271.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">--continue</text>
72
+ <text x="1064" y="286.5" text-anchor="middle" font-size="11.5" fill="#57606a">next ready lot</text>
73
+ <polyline points="180,146 180,106" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
74
+ <polyline points="264,75 344,75 344,144" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
75
+ <text x="300" y="68" text-anchor="middle" font-size="11.5" fill="#57606a">priority</text>
76
+ <polyline points="408,175 422,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
77
+ <polyline points="552,175 566,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
78
+ <polyline points="696,175 710,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
79
+ <polyline points="840,175 854,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
80
+ <polyline points="984,175 998,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
81
+ <polyline points="1128,175 1142,175" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
82
+ <polyline points="344,204 344,244" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
83
+ <text x="350" y="228" text-anchor="start" font-size="11.5" fill="#57606a">starts</text>
84
+ <polyline points="408,275 422,275" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
85
+ <polyline points="552,275 566,275" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
86
+ <polyline points="488,246 488,206" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
87
+ <text x="494" y="230" text-anchor="start" font-size="11.5" fill="#57606a">journal</text>
88
+ <polyline points="488,146 488,106" fill="none" stroke="#57606a" stroke-width="1.5" stroke-dasharray="5 4" marker-end="url(#arr3)"/>
89
+ <text x="494" y="130" text-anchor="start" font-size="11.5" fill="#57606a">question</text>
90
+ <polyline points="632,246 632,206" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
91
+ <text x="638" y="230" text-anchor="start" font-size="11.5" fill="#57606a">wave ends</text>
92
+ <polyline points="776,146 776,106" fill="none" stroke="#57606a" stroke-width="1.5" stroke-dasharray="5 4" marker-end="url(#arr3)"/>
93
+ <text x="782" y="130" text-anchor="start" font-size="11.5" fill="#57606a">captures</text>
94
+ <polyline points="920,204 920,244" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
95
+ <text x="926" y="228" text-anchor="start" font-size="11.5" fill="#57606a">if a page changes</text>
96
+ <polyline points="1064,204 1064,244" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
97
+ <text x="1070" y="228" text-anchor="start" font-size="11.5" fill="#57606a">yes</text>
98
+ <polyline points="1208,146 1208,106" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
99
+ <polyline points="1064,304 1064,346 344,346 344,306" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr3)"/>
100
+ <text x="704" y="340" text-anchor="middle" font-size="11.5" fill="#57606a">next wave, without asking the human again</text>
101
+ </svg>
@@ -0,0 +1,38 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 190" width="1100" height="190" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#e6edf3">
2
+ <title>Life of a lot in the plan</title>
3
+ <desc>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.</desc>
4
+ <defs><marker id="arr1" 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="1100" height="190" fill="#0d1117"/>
6
+ <rect x="20" y="40" width="110" height="56" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
7
+ <text x="75" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">todo</text>
8
+ <text x="75" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">raf add</text>
9
+ <rect x="230" y="40" width="130" height="56" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
10
+ <text x="295" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">doing</text>
11
+ <text x="295" y="79.5" text-anchor="middle" font-size="11.5" fill="#8b949e">commits « Lx »</text>
12
+ <rect x="470" y="40" width="170" height="56" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
13
+ <text x="555" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Verdicts recorded</text>
14
+ <text x="555" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">raf review · raf ux</text>
15
+ <rect x="740" y="40" width="110" height="56" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
16
+ <text x="795" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">done</text>
17
+ <text x="795" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">raf done</text>
18
+ <rect x="950" y="40" width="130" height="56" rx="6" fill="#0c2d6b" stroke="#58a6ff" stroke-width="2"/>
19
+ <text x="1015" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Delivered</text>
20
+ <text x="1015" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">cadence deliver</text>
21
+ <polyline points="130,68 228,68" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr1)"/>
22
+ <text x="180" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">raf start</text>
23
+ <polyline points="360,68 468,68" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr1)"/>
24
+ <text x="415" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">reviews</text>
25
+ <polyline points="640,68 738,68" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr1)"/>
26
+ <text x="690" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">gates passed</text>
27
+ <polyline points="850,68 948,68" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr1)"/>
28
+ <text x="900" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">push</text>
29
+ <text x="75" y="124" text-anchor="middle" font-size="11.5" fill="#8b949e">raf drop → dropped</text>
30
+ <text x="295" y="124" text-anchor="middle" font-size="11.5" fill="#8b949e">pre-commit: hook.autostart</text>
31
+ <text x="295" y="140" text-anchor="middle" font-size="11.5" fill="#8b949e">warn · refuse · start</text>
32
+ <text x="555" y="124" text-anchor="middle" font-size="11.5" fill="#8b949e">review: any lot with commits</text>
33
+ <text x="555" y="140" text-anchor="middle" font-size="11.5" fill="#8b949e">ux: visible lot</text>
34
+ <text x="795" y="124" text-anchor="middle" font-size="11.5" fill="#8b949e">refused with an open sub-task</text>
35
+ <text x="1015" y="124" text-anchor="middle" font-size="11.5" fill="#8b949e">CI of the sha → deploy</text>
36
+ <text x="1015" y="140" text-anchor="middle" font-size="11.5" fill="#8b949e">→ effect checks</text>
37
+ <text x="1015" y="164" text-anchor="middle" font-size="11.5" fill="#8b949e">visible lot: news entry + capture</text>
38
+ </svg>
@@ -0,0 +1,38 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 190" width="1100" height="190" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#1f2328">
2
+ <title>Life of a lot in the plan</title>
3
+ <desc>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.</desc>
4
+ <defs><marker id="arr1" 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="1100" height="190" fill="#ffffff"/>
6
+ <rect x="20" y="40" width="110" height="56" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
7
+ <text x="75" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">todo</text>
8
+ <text x="75" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">raf add</text>
9
+ <rect x="230" y="40" width="130" height="56" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
10
+ <text x="295" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">doing</text>
11
+ <text x="295" y="79.5" text-anchor="middle" font-size="11.5" fill="#57606a">commits « Lx »</text>
12
+ <rect x="470" y="40" width="170" height="56" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
13
+ <text x="555" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Verdicts recorded</text>
14
+ <text x="555" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">raf review · raf ux</text>
15
+ <rect x="740" y="40" width="110" height="56" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
16
+ <text x="795" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">done</text>
17
+ <text x="795" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">raf done</text>
18
+ <rect x="950" y="40" width="130" height="56" rx="6" fill="#ddf4ff" stroke="#0969da" stroke-width="2"/>
19
+ <text x="1015" y="64.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Delivered</text>
20
+ <text x="1015" y="79.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">cadence deliver</text>
21
+ <polyline points="130,68 228,68" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr1)"/>
22
+ <text x="180" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">raf start</text>
23
+ <polyline points="360,68 468,68" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr1)"/>
24
+ <text x="415" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">reviews</text>
25
+ <polyline points="640,68 738,68" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr1)"/>
26
+ <text x="690" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">gates passed</text>
27
+ <polyline points="850,68 948,68" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr1)"/>
28
+ <text x="900" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">push</text>
29
+ <text x="75" y="124" text-anchor="middle" font-size="11.5" fill="#57606a">raf drop → dropped</text>
30
+ <text x="295" y="124" text-anchor="middle" font-size="11.5" fill="#57606a">pre-commit: hook.autostart</text>
31
+ <text x="295" y="140" text-anchor="middle" font-size="11.5" fill="#57606a">warn · refuse · start</text>
32
+ <text x="555" y="124" text-anchor="middle" font-size="11.5" fill="#57606a">review: any lot with commits</text>
33
+ <text x="555" y="140" text-anchor="middle" font-size="11.5" fill="#57606a">ux: visible lot</text>
34
+ <text x="795" y="124" text-anchor="middle" font-size="11.5" fill="#57606a">refused with an open sub-task</text>
35
+ <text x="1015" y="124" text-anchor="middle" font-size="11.5" fill="#57606a">CI of the sha → deploy</text>
36
+ <text x="1015" y="140" text-anchor="middle" font-size="11.5" fill="#57606a">→ effect checks</text>
37
+ <text x="1015" y="164" text-anchor="middle" font-size="11.5" fill="#57606a">visible lot: news entry + capture</text>
38
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1010 140" width="1010" height="140" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#e6edf3">
2
+ <title>Putting cadence itself in service</title>
3
+ <desc>The cadence code on the PATH is a separate worktree, updated only by npm run service on a reviewed sha; a wave cannot put unreviewed code in service.</desc>
4
+ <defs><marker id="arr4" 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="1010" height="140" fill="#0d1117"/>
6
+ <rect x="20" y="38" width="220" height="62" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
7
+ <text x="130" y="65.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Working repository</text>
8
+ <text x="130" y="80.5" text-anchor="middle" font-size="11.5" fill="#8b949e">waves, build = typecheck only</text>
9
+ <rect x="320" y="38" width="260" height="62" rx="6" fill="#0c2d6b" stroke="#58a6ff" stroke-width="2"/>
10
+ <text x="450" y="65.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">npm run service -- &lt;sha&gt;</text>
11
+ <text x="450" y="80.5" text-anchor="middle" font-size="11.5" fill="#8b949e">ancestor of HEAD · cited lots done</text>
12
+ <rect x="660" y="38" width="220" height="62" rx="6" fill="#0d1117" stroke="#8b949e" stroke-width="1.5"/>
13
+ <text x="770" y="65.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">Service worktree</text>
14
+ <text x="770" y="80.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#8b949e">~/.local/share/cadence</text>
15
+ <text x="945" y="74" text-anchor="middle" font-weight="600" font-size="13.5" fill="#e6edf3">PATH</text>
16
+ <polyline points="240,69 318,69" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr4)"/>
17
+ <text x="279" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">the lead,</text>
18
+ <text x="279" y="92" text-anchor="middle" font-size="11.5" fill="#8b949e">after review</text>
19
+ <polyline points="580,69 658,69" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr4)"/>
20
+ <text x="619" y="60" text-anchor="middle" font-size="11.5" fill="#8b949e">build</text>
21
+ <polyline points="880,69 918,69" fill="none" stroke="#8b949e" stroke-width="1.5" marker-end="url(#arr4)"/>
22
+ <text x="450" y="126" text-anchor="middle" font-size="11.5" fill="#8b949e">a dropped lot whose every commit is undone by a revert no longer blocks</text>
23
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1010 140" width="1010" height="140" role="img" font-family="-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif" font-size="13" fill="#1f2328">
2
+ <title>Putting cadence itself in service</title>
3
+ <desc>The cadence code on the PATH is a separate worktree, updated only by npm run service on a reviewed sha; a wave cannot put unreviewed code in service.</desc>
4
+ <defs><marker id="arr4" 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="1010" height="140" fill="#ffffff"/>
6
+ <rect x="20" y="38" width="220" height="62" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
7
+ <text x="130" y="65.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Working repository</text>
8
+ <text x="130" y="80.5" text-anchor="middle" font-size="11.5" fill="#57606a">waves, build = typecheck only</text>
9
+ <rect x="320" y="38" width="260" height="62" rx="6" fill="#ddf4ff" stroke="#0969da" stroke-width="2"/>
10
+ <text x="450" y="65.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">npm run service -- &lt;sha&gt;</text>
11
+ <text x="450" y="80.5" text-anchor="middle" font-size="11.5" fill="#57606a">ancestor of HEAD · cited lots done</text>
12
+ <rect x="660" y="38" width="220" height="62" rx="6" fill="#ffffff" stroke="#57606a" stroke-width="1.5"/>
13
+ <text x="770" y="65.5" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">Service worktree</text>
14
+ <text x="770" y="80.5" text-anchor="middle" font-size="11.5" font-family="ui-monospace,SFMono-Regular,Menlo,monospace" fill="#57606a">~/.local/share/cadence</text>
15
+ <text x="945" y="74" text-anchor="middle" font-weight="600" font-size="13.5" fill="#1f2328">PATH</text>
16
+ <polyline points="240,69 318,69" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr4)"/>
17
+ <text x="279" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">the lead,</text>
18
+ <text x="279" y="92" text-anchor="middle" font-size="11.5" fill="#57606a">after review</text>
19
+ <polyline points="580,69 658,69" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr4)"/>
20
+ <text x="619" y="60" text-anchor="middle" font-size="11.5" fill="#57606a">build</text>
21
+ <polyline points="880,69 918,69" fill="none" stroke="#57606a" stroke-width="1.5" marker-end="url(#arr4)"/>
22
+ <text x="450" y="126" text-anchor="middle" font-size="11.5" fill="#57606a">a dropped lot whose every commit is undone by a revert no longer blocks</text>
23
+ </svg>