@skill-map/cli 0.68.0 → 0.69.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 (34) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +14 -15
  2. package/dist/cli/tutorial/sm-tutorial/fixtures-data/manifest.json +0 -3
  3. package/dist/cli/tutorial/sm-tutorial/references/_core.md +15 -6
  4. package/dist/cli/tutorial/sm-tutorial/references/_manifest.json +93 -119
  5. package/dist/cli/tutorial/sm-tutorial/references/_manifest.yml +46 -70
  6. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +5 -6
  7. package/dist/cli/tutorial/sm-tutorial/references/part-authoring.md +23 -6
  8. package/dist/cli/tutorial/sm-tutorial/references/part-basic-daily.md +98 -76
  9. package/dist/cli/tutorial/sm-tutorial/references/part-basic-fundamentals.md +21 -20
  10. package/dist/cli/tutorial/sm-tutorial/references/part-basic-kickoff.md +151 -6
  11. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +1 -1
  12. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +114 -100
  13. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +27 -31
  14. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +171 -14
  15. package/dist/cli/tutorial/sm-tutorial/scripts/state.js +4 -4
  16. package/dist/cli.js +708 -334
  17. package/dist/conformance/index.js +3 -3
  18. package/dist/index.js +11 -10
  19. package/dist/kernel/index.d.ts +27 -17
  20. package/dist/kernel/index.js +11 -10
  21. package/dist/migrations/001_initial.sql +7 -3
  22. package/dist/ui/chunk-E7GLGHVY.js +1 -0
  23. package/dist/ui/chunk-RLRSNHYG.js +3 -0
  24. package/dist/ui/{chunk-4F53HBGG.js → chunk-RRRXQNG6.js} +1 -1
  25. package/dist/ui/{chunk-3GDWM5VM.js → chunk-SI4MGFOW.js} +1 -1
  26. package/dist/ui/index.html +1 -1
  27. package/dist/ui/{main-ZYRIR6DB.js → main-23NGLEUB.js} +3 -3
  28. package/migrations/001_initial.sql +7 -3
  29. package/package.json +2 -2
  30. package/dist/cli/tutorial/sm-tutorial/references/part-basic-connect.md +0 -166
  31. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +0 -175
  32. package/dist/ui/chunk-BJUBDHJR.js +0 -3
  33. package/dist/ui/chunk-PU5OP5RN.js +0 -1
  34. /package/dist/ui/{chunk-KMHXNOFZ.js → chunk-SXSNTF26.js} +0 -0
@@ -155,11 +155,8 @@ Tell the tester:
155
155
  > the link finds the real file and draws a solid arrow. Same kind of
156
156
  > note, one `.md` apart: one resolves, the other does not.
157
157
  >
158
- > One word on solidity: skill-map draws each connector's **confidence**
159
- > as opacity. Both drawn arrows are fully solid (1.00) because each
160
- > lands on a real file; the broken one would read 0.50 (a penalty, not
161
- > "half sure") and is not drawn at all. The exact per-link numbers live
162
- > in the inspector, next chapter.
158
+ > 💡 Tip: if the nodes are crowded, the map toolbar has a **Re-arrange
159
+ > layout** button that tidies things up.
163
160
  >
164
161
  > Confirm when you see the two arrows plus the broken-reference marker
165
162
  > on the hub. If an arrow is missing, refresh the browser and let me
@@ -175,9 +172,6 @@ by hand in `edit-link`). If an arrow is missing, do not advance. Mark
175
172
  The canvas only draws the resolved arrows; the full per-link breakdown,
176
173
  including the broken one, lives in the Inspector. Open it on the hub.
177
174
 
178
- > 💡 Tip: if the nodes are crowded, the map toolbar has a **Re-arrange
179
- > layout** button that tidies things up.
180
- >
181
175
  > 🆕 Open the Inspector for **Demo TODO list** (click the node). Find
182
176
  > the **Connections** section: **Outgoing** and **Incoming**.
183
177
  > Demo TODO list lists **3 links** under Outgoing (the canvas drew two
@@ -192,6 +186,10 @@ including the broken one, lives in the Inspector. Open it on the hub.
192
186
  > Open `demo-guideline` and it shows **0**: the broken link never landed
193
187
  > on it. Three outgoing links on the hub, but only two reach a node.
194
188
  >
189
+ > 💡 Tip: skill-map draws each connector's **confidence** as opacity.
190
+ > Both drawn arrows are solid (1.00) because each lands on a real file;
191
+ > the broken one is flagged instead of drawn.
192
+ >
195
193
  > Let me know when you see it.
196
194
 
197
195
  Mark `inspector`: done.
@@ -250,17 +248,19 @@ each ends with its own confirmation. Do NOT prepend an intro line to a block.
250
248
  > Tell me when the tree is open.
251
249
 
252
250
  > At the top of the sidebar there's a search box (placeholder
253
- > `Search…`). Type `guideline`. Watch both halves: the tree narrows to
254
- > the two guideline nodes and the **Map** drops every node except those
255
- > two. The search matches a node's name, path, or description, and
256
- > filters live, no Enter needed.
251
+ > `Search…`). Type `guideline`. Watch the tree narrow to the two
252
+ > guideline nodes. The search matches a node's name, path, or
253
+ > description, and filters live, no Enter needed. The **Map** stays
254
+ > put: by default the search filters only the files list, not the map
255
+ > (the tip below changes that).
257
256
  >
258
- > Now clear the box. All four nodes come back, in both the tree and the
259
- > Map. Confirm you saw it filter and then restore.
257
+ > Now clear the box. All four nodes come back in the tree. Confirm you
258
+ > saw it filter and then restore.
260
259
 
261
- > Last one. In the tree, find the **Demo TODO list** row: at its right
262
- > edge there's a small **sitemap** icon (tooltip "Isolate this node and
263
- > its direct links on the map"). Click it.
260
+ > Last one. In the tree, find the `notes/todo` row (the **Demo TODO
261
+ > list** hub, the tree labels rows by file name): at its right edge
262
+ > there's a small **sitemap** icon (tooltip "Isolate this node and its
263
+ > direct links on the map"). Click it.
264
264
  >
265
265
  > The Map collapses to **Demo TODO list** plus only the nodes it draws
266
266
  > an arrow to (`demo-skill`, `demo-guideline2`). That's how you focus on
@@ -271,8 +271,9 @@ each ends with its own confirmation. Do NOT prepend an intro line to a block.
271
271
  > four nodes return.
272
272
  >
273
273
  > 💡 Tip: the map-icon button next to the search box controls whether
274
- > the search also filters the **Map** (on by default). Click it to
275
- > filter only the files list, leaving the map in place.
274
+ > the search also filters the **Map** (off by default, which is why the
275
+ > map stayed put while only the tree narrowed). Click it on if you want
276
+ > a search to filter the map too.
276
277
  >
277
278
  > Did the map isolate and then restore?
278
279
 
@@ -314,7 +315,7 @@ host-dependent rendering rule. Per Inviolable rule #2, the agent does NOT touch
314
315
  ├── .agents/skills/
315
316
  │ ├── demo-skill/SKILL.md
316
317
  │ └── sm-tutorial/SKILL.md ← the tutorial you loaded
317
- ├── .skill-map/ ← project DB + settings (managed)
318
+ ├── .skill-map/ ← project DB + settings
318
319
  ├── .skillmapignore ← the file we're about to edit
319
320
  └── notes/
320
321
  ├── todo.md
@@ -1,4 +1,4 @@
1
- # Part 1 (basic track): The project from zero (step library, `kickoff-*` ids)
1
+ # Part 1 (basic track): The harness from zero (step library, `kickoff-*` ids)
2
2
 
3
3
  The campaign turns real here for the **basic track** (the open-standard family:
4
4
  `agent-skills`, `antigravity`). After the abstract prologue, the tester starts an
@@ -6,9 +6,12 @@ actual project: a tiny personal **portfolio website**, fully static, served by a
6
6
  ~15-line Express server, plus the `.agents/skills/` **harness** that maintains
7
7
  it. skill-map maps the harness (the `.md` assets and how they reference each
8
8
  other); the site itself is plain HTML the harness produces (the daily loop, Part
9
- 3, runs and ships it). This lens authors only **skills** and **markdown notes**,
10
- and they connect by **markdown references** (`[text](path)`). `pace: per-step`,
11
- `preflight: portfolio-init`. Shared conventions live in `_core.md`. Narrate with
9
+ 2, runs and ships it). This lens authors only **skills** and **markdown notes**,
10
+ and they connect by **markdown references** (`[text](path)`). This part runs end
11
+ to end: it boots the project and grows its harness members (the `kickoff` to
12
+ `real-kinds` chapters), then wires them into a connected graph (the `check-links`
13
+ to `confidence` chapters). `pace: per-step`, `preflight: portfolio-init`. Shared
14
+ conventions live in `_core.md`. Narrate with
12
15
  `<provider_dir>` = `.agents/skills`.
13
16
 
14
17
  The orchestrator's `portfolio-init` pre-flight (backstage, silent) has already
@@ -94,7 +97,7 @@ Tell the tester:
94
97
 
95
98
  > I added the first real member of your harness: a skill called `content-editor`
96
99
  > (its job is to write the site's pages). A new `skill` node appeared on the map.
97
- > Right now it stands alone; in the next part we wire it to the handbook and the
100
+ > Right now it stands alone; later in this part we wire it to the handbook and the
98
101
  > style guide.
99
102
  >
100
103
  > 💡 Tip: I create these harness files for you. If you'd like to see what's
@@ -135,6 +138,148 @@ Tell the tester:
135
138
  >
136
139
  > See the skill and the docs in the map?
137
140
 
138
- Wait for confirmation. Mark `real-kinds`: done. Last chapter of the part: apply
141
+ Wait for confirmation. Mark `real-kinds`: done.
142
+
143
+ ## Chapter `check-links` - The link checker (~3 min)
144
+
145
+ **Context**: the harness needs a guard that runs before publishing, a skill that
146
+ checks the site's internal links resolve before it ships. We only create the
147
+ `skill` node here; the `publish` skill in the next chapter is what calls it.
148
+
149
+ Lay the `check-links` skill (content lives in `fixtures-data/`). Backstage
150
+ (silent):
151
+
152
+ ```
153
+ node .claude/skills/sm-tutorial/scripts/fixtures.js lay harness --only "__PROVIDER__/skills/check-links/SKILL.md" --provider <provider> --lang <lang>
154
+ ```
155
+
156
+ Tell the tester:
157
+
158
+ > So I added that guard: a skill called `check-links`. A new `skill` node
159
+ > appeared on the **Map**, alone for now; the next chapter gives it a caller.
160
+ >
161
+ > See the new skill node?
162
+
163
+ Wait for confirmation. Mark `check-links`: done.
164
+
165
+ ## Chapter `publish` - The publish skill (~4 min)
166
+
167
+ **Context**: the chapter where the graph comes alive. The `publish` skill ties
168
+ three pieces together in one body: it points at the link checker, at the content
169
+ editor, and at the deploy runbook. On this lens all three are **markdown
170
+ references**, so three reference arrows light up from a single new node.
171
+
172
+ Tell the tester to create the file themselves (Inviolable rule #2). Render the
173
+ block as a **top-level fenced code block** at column 0, NOT inside the `> `
174
+ blockquote, so the frontmatter fences (`---`) land on column 0 (indented fences
175
+ never parse, and `sm check` then warns `frontmatter-malformed`).
176
+
177
+ > Create `<provider_dir>/publish/SKILL.md` with exactly this content (the first
178
+ > line is `---`, nothing before it):
179
+
180
+ ```markdown
181
+ ---
182
+ name: publish
183
+ description: |
184
+ Publishes the portfolio: runs the link check, hands off to the
185
+ content editor for any last fixes, then follows the deploy runbook.
186
+ ---
187
+
188
+ # publish
189
+
190
+ The one skill you run when the site is ready to go out.
191
+
192
+ ## Steps
193
+ 1. Run the [check-links](../check-links/SKILL.md) skill on the pages in public/. If it reports broken links, stop and fix them first.
194
+ 2. If a page needs a content fix, hand the change to [content-editor](../content-editor/SKILL.md).
195
+ 3. Follow the [deploy runbook](../../../docs/DEPLOY.md): regenerate pages, run the link check, start the server.
196
+ ```
197
+
198
+ Continue the tester message:
199
+
200
+ > Save it. Watch the **Map**: **three** new arrows light up at once from the new
201
+ > `publish` node, all of them `references` (the open standard's one connector),
202
+ > each landing on a real file:
203
+ >
204
+ > - `publish -> check-links` (the `[check-links](../check-links/SKILL.md)` link)
205
+ > - `publish -> content-editor` (the `[content-editor](../content-editor/SKILL.md)` link)
206
+ > - `publish -> docs/DEPLOY.md` (the `[deploy runbook](../../../docs/DEPLOY.md)` link)
207
+ >
208
+ > One node, three connectors, all references. On a vendor lens (claude/codex) the
209
+ > first two would be a `/`-invoke and an `@`-mention; the open standard wires
210
+ > everything with file links, and that is all this lens emits. The harness is
211
+ > starting to look like a real graph.
212
+ >
213
+ > 💡 Tip: to tidy the layout, click **Re-arrange layout** in the map toolbar.
214
+ >
215
+ > Did the three arrows appear?
216
+
217
+ Wait for confirmation. You MAY `Read` the file to verify the `---` fences are
218
+ flush at column 0 (if `sm check` flags `frontmatter-malformed`, the fences got
219
+ indented on paste, re-align every line flush left). Mark `publish`: done.
220
+
221
+ ## Chapter `links` - The handbook becomes the hub (~4 min)
222
+
223
+ **Context**: the handbook (`AGENTS.md`) has been a lonely node since the start of
224
+ this part. Here it becomes the hub: two bullets point it at the content editor
225
+ and the publish skill. We also give the content editor a reference to the style guide it follows.
226
+
227
+ Apply both edits (content lives in `fixtures-data/`). The first appends two hub
228
+ bullets (markdown links) to `AGENTS.md`; the second adds the style-guide
229
+ reference to the content-editor skill. Backstage (silent):
230
+
231
+ ```
232
+ node .claude/skills/sm-tutorial/scripts/fixtures.js edit agents-hub --provider <provider> --lang <lang>
233
+ node .claude/skills/sm-tutorial/scripts/fixtures.js edit content-editor-style --provider <provider> --lang <lang>
234
+ ```
235
+
236
+ Tell the tester:
237
+
238
+ > Two edits, and the **Map** fills in. Your handbook (`AGENTS.md`) is now the hub:
239
+ > it points at the content editor and at the publish skill. And the content
240
+ > editor now reaches the style guide it follows. New arrows, all `references`:
241
+ >
242
+ > - `AGENTS.md -> content-editor` (a `[content-editor](...)` link)
243
+ > - `AGENTS.md -> publish` (a `[publish](...)` link)
244
+ > - `content-editor -> docs/STYLE.md` (a `[style guide](...)` link)
245
+ >
246
+ > The whole harness is wired end to end now: the handbook reaches the work, the
247
+ > work reaches the docs, and `publish` pulls the publish flow together, every
248
+ > connection a markdown reference, the one link the open standard documents.
249
+ >
250
+ > Did the new arrows light up?
251
+
252
+ Wait for confirmation. You MAY `Read` the two files to verify. Mark `links`: done.
253
+
254
+ ## Chapter `confidence` - How sure is each link (~3 min)
255
+
256
+ No file edits, pure observation.
257
+
258
+ Tell the tester:
259
+
260
+ > Last beat of this part: how sure is skill-map about each connection? It records
261
+ > a **confidence** for every link and draws it as opacity: a link that resolves
262
+ > to a real file is solid (**1.00**), one that does not lands fainter, so a glance
263
+ > at the **Map** separates solid wiring from problem links.
264
+ >
265
+ > Open the Inspector for the `publish` node (click it). Scroll to the
266
+ > **Connections** panel and read the **Outgoing** rows. Each shows the link kind
267
+ > (`references`, the only kind here) and a confidence badge, every one reads
268
+ > **1.00**, because each link lands on a file that exists on disk.
269
+ >
270
+ > Your whole harness reads solid because every link resolves. So what does a link
271
+ > that does NOT resolve look like? You met one in the prologue: the
272
+ > `demo-guideline` link had no `.md`, so it pointed at a path that did not exist,
273
+ > skill-map drew no arrow and flagged it as a **broken reference**, confidence
274
+ > knocked to **0.50**. Adding `.md` turned it into a link that landed on the real
275
+ > file, and it drew a solid arrow at **1.00**.
276
+ >
277
+ > **IMPORTANT:** why does confidence matter? It mirrors how an agent resolves a
278
+ > reference, a deterministic name-and-path lookup, no guessing. That is cheaper
279
+ > and does not fail, the same reason a clean, well-named harness is worth keeping.
280
+ >
281
+ > Do you see every badge reading 1.00 in the Inspector?
282
+
283
+ Wait for confirmation. Mark `confidence`: done. Last chapter of the part: apply
139
284
  §Closing a part (name the part by its title, route back to the menu; do NOT lead
140
285
  into the next part from here).
@@ -1,4 +1,4 @@
1
- # Part 5: The CLI in depth - step library
1
+ # Part 3: The CLI for you and your agent - step library
2
2
 
3
3
  The deep-dive into the rest of the CLI: browsing verbs, ASCII graph + export, broken-ref issues, the `.sm` annotation consent prompt, and validating links to folders outside the scan scope. `pace: auto-advance` (walk straight into the next chapter's Announcement once one is marked done) and `preflight: seed` with the `prologue-built` snapshot: it self-seeds its own copy of the Part 0 demo fixture, so it works even if the campaign already replaced that fixture with the portfolio (see SKILL.md §Entering a part, the `cli` case). Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
@@ -1,4 +1,4 @@
1
- # Part 3: The daily loop (step library, `daily-loop`)
1
+ # Part 2: The daily loop (step library, `daily-loop`)
2
2
 
3
3
  The campaign's payoff and finale fused into one part: the tester operates the
4
4
  harness they built the way they would on any normal day, **for real**. Three
@@ -31,7 +31,7 @@ kind of those two nodes changes. Per chapter:
31
31
  - `broken-ref`: the deploy link that breaks lives in the `publish` SKILL; fix it
32
32
  in `.agents/skills/publish/SKILL.md` (not a `.claude/commands/` file).
33
33
  - `reserved`: Codex has no command, so create a SKILL with a reserved name
34
- instead, `Write` `.agents/skills/config/SKILL.md` named `config` (it shadows
34
+ instead, `Write` `.agents/skills/model/SKILL.md` named `model` (it shadows
35
35
  the open-standard `COMMONS_RESERVED_NAMES`); clear it by renaming the folder +
36
36
  `frontmatter.name` to `new-page`, exactly like the basic track's `reserved`
37
37
  chapter, on a skill.
@@ -62,9 +62,9 @@ broken-reference markers, and confidence live.
62
62
  ## Chapter `setup` - Make it yours and bring it up (~5 min)
63
63
 
64
64
  **Context**: the harness is wired (you built it in the earlier parts). Now you
65
- put it to work on a real day. First, make the site yours and give it a look you
66
- would not be embarrassed to share, then serve it and open it in the browser, the
67
- early payoff before the daily loop fills it with pages. The honest beat: the HTML
65
+ put it to work on a real day. First, make the site yours, about whatever you
66
+ like, then serve it and open it in the browser, the early payoff before the
67
+ daily loop fills it with pages. The honest beat: the HTML
68
68
  and CSS are Layer 2 (the harness's output); skill-map maps the harness (Layer 1,
69
69
  the `.md` files), so the site landing on disk does NOT move the graph, and that
70
70
  is correct, not a bug. The tester runs the serve commands themselves (one of the
@@ -72,10 +72,11 @@ few non-`sm` beats); guide them, do not run them.
72
72
 
73
73
  **Preparation**:
74
74
 
75
- 1. Ask the tester, in one short exchange: what the site should be called (their
76
- name or a title) and one line about what it is for. Keep it light; if they do
77
- not care, offer defaults ("My Portfolio" / "Small, sturdy things on the
78
- web"). Persist both with
75
+ 1. Ask the tester the two questions straight, with no "before we build, let's
76
+ make it yours" lead-in: what the site should be called (their name or a
77
+ title) and one line about what it is for. Keep it light; if they do not care,
78
+ offer defaults ("My Portfolio" / "Small, sturdy things on the web"). Persist
79
+ both with
79
80
  `node .claude/skills/sm-tutorial/scripts/state.js set-identity --name "<name>" --tagline "<tagline>"`
80
81
  (it writes `tester.site_identity` into `tutorial-state.json`).
81
82
  2. Backstage, `Write` `public/style.css` exactly as below (Layer 2, ignored by
@@ -208,12 +209,6 @@ node server.js
208
209
  > Open `http://localhost:3000`: there is your site, named after you, with a
209
210
  > clean layout. Click **About** and back to **Home**.
210
211
  >
211
- > Now glance at the Map: it did not move. Everything you watched grow on the
212
- > canvas is your harness, the `.md` files and how they reference each other
213
- > (Layer 1). The pages and the stylesheet are Layer 2, what the harness
214
- > produces, and skill-map maps the harness, not its output. Two layers, one
215
- > project.
216
- >
217
212
  > Does the site load and look clean?
218
213
 
219
214
  Wait for confirmation. If `node server.js` reports `Cannot find module
@@ -224,11 +219,6 @@ project root and Node is on PATH. Mark `setup`: done. Auto-advance to
224
219
 
225
220
  ## Chapter `add-page` - Add a page with your agent (~4 min)
226
221
 
227
- **Context**: the daily move. You want a new page, so you ask your
228
- `content-editor` to write it. This is the first time it runs **for real** (no
229
- more playing the agent). It reads `docs/STYLE.md` and the shared stylesheet and
230
- writes a new page into `public/`. The graph does not move (HTML is Layer 2).
231
-
232
222
  **Preparation**: none until the tester asks.
233
223
 
234
224
  Tell the tester:
@@ -259,6 +249,9 @@ the `> ` blockquote, do NOT drop the bar when you personalise it.
259
249
  > output; the harness on the canvas is Layer 1. Your nodes are not a diagram,
260
250
  > they are runnable, and you just ran one.
261
251
  >
252
+ > If the new page is not showing, refresh the browser with F5, the site does
253
+ > not reload on its own.
254
+ >
262
255
  > See the new page on the site, and the Map unchanged?
263
256
 
264
257
  Wait for confirmation. Mark `add-page`: done. Auto-advance to `broken-ref`.
@@ -269,14 +262,18 @@ Wait for confirmation. Mark `add-page`: done. Auto-advance to `broken-ref`.
269
262
 
270
263
  ## Chapter `broken-ref` - A rename breaks a link (~4 min)
271
264
 
272
- **Context**: real reorganizing breaks things, and this is where skill-map earns
273
- its keep. You rename a doc, and a link that pointed at the old name goes stale.
274
- skill-map catches it the moment you re-scan.
265
+ **Context**: the daily safety net, and where skill-map earns its keep: rename and
266
+ move things freely, and skill-map shows you exactly what you forgot to update
267
+ before it ships broken.
275
268
 
276
269
  **Preparation**: none (the tester drives). Everything here is watched live on
277
270
  the Map; no `sm` commands.
278
271
 
279
- Tell the tester to rename the deploy runbook (their file):
272
+ Tell the tester to free the third terminal, then rename the deploy runbook
273
+ themselves (their file):
274
+
275
+ > In your **third terminal** (the one running `node server.js`), press
276
+ > **Ctrl+C** to stop the site server, then rename the deploy runbook there:
280
277
 
281
278
  ```bash
282
279
  mv docs/DEPLOY.md docs/DEPLOYMENT.md
@@ -293,9 +290,7 @@ mv docs/DEPLOY.md docs/DEPLOYMENT.md
293
290
  > point the deploy-runbook link at `docs/DEPLOYMENT.md` (the new name). Save.
294
291
  >
295
292
  > Watch the **Map** again: the arrow snaps back, solid, and the red marker
296
- > clears, all live, no command to run. That is the daily safety net: rename and
297
- > move things freely, and skill-map shows you exactly what you forgot to update
298
- > before it ships broken.
293
+ > clears, all live, no command to run.
299
294
  >
300
295
  > Did the broken marker appear and then clear?
301
296
 
@@ -305,42 +300,36 @@ done. Auto-advance to `reserved`.
305
300
 
306
301
  ## Chapter `reserved` - A reserved name collides (~2 min)
307
302
 
308
- **Context**: you add a quick command to scaffold new pages and, without
309
- thinking, name it `init`, a name Claude Code already owns for its own slash
310
- command. skill-map warns you before the runtime silently ignores your file.
311
-
312
- **Preparation**: `Write` `.claude/commands/init.md`:
303
+ **Preparation**: `Write` `.claude/commands/model.md`:
313
304
  ```markdown
314
305
  ---
315
- name: init
306
+ name: model
316
307
  description: |
317
308
  Scaffolds a new empty page in public/ from the shared template.
318
309
  ---
319
310
 
320
- # init
311
+ # model
321
312
 
322
313
  Creates a blank page so you can start writing.
323
314
  ```
324
315
 
325
316
  The watcher picks up the new command. Tell the tester:
326
317
 
327
- > I added a command named `init`. Watch the **Map**: the new `init` command node
318
+ > I added a command named `model`. Watch the **Map**: the new `model` command node
328
319
  > appears, but flagged with a **warning** marker. Open its inspector: it reads
329
- > `name-reserved`, `init` shadows one of Claude Code's own slash commands (like
320
+ > `name-reserved`, `model` shadows one of Claude Code's own slash commands (like
330
321
  > `/help`, `/clear`, `/config`), so the runtime would silently ignore your file,
331
322
  > it never runs. The fix is a name the runtime does not own.
332
323
  >
333
- > Rename it to `new-page`: first rename the file `.claude/commands/init.md` to
324
+ > Rename it to `new-page`: first rename the file `.claude/commands/model.md` to
334
325
  > `.claude/commands/new-page.md`. Then open it in your text editor / IDE and, at
335
- > the top, where the frontmatter says `name: init`, change it to
336
- > `name: new-page`; also change the H1 to `# new-page` (a command's H1 stays a
337
- > plain title, never `# /new-page`). Save.
326
+ > the top, where the frontmatter says `name: model`, change it to
327
+ > `name: new-page`. Save.
338
328
  >
339
329
  > Watch the **Map** again: the warning clears and the node is now `new-page`,
340
- > all live. Notice what cleared it: changing the **name** (`frontmatter.name`),
341
- > not just the filename, the reserved check looks at the command's name, which
342
- > is why the warning said to rename "the file or `frontmatter.name`". Now
343
- > `new-page` is yours and the runtime will actually run it.
330
+ > all live. What cleared it was changing `frontmatter.name` (not just the
331
+ > filename), the reserved check looks at the name. Now `new-page` is yours and
332
+ > the runtime will run it.
344
333
  >
345
334
  > Did the warning clear after the rename?
346
335
 
@@ -352,90 +341,115 @@ Wait for confirmation. Mark `reserved`: done. Auto-advance to `publish`.
352
341
 
353
342
  ## Chapter `publish` - Ship it: run /publish for real (~4 min)
354
343
 
355
- **Context**: the harness is not a picture, it is a set of instructions, and
356
- `/publish` ties them together. You run it **for real** now: it invokes the link
357
- checker over your pages, briefs the `content-editor` if anything needs a fix,
358
- then follows the deploy runbook. This is the same Layer 1 / Layer 2 split, the
359
- pages are output, so the Map stays put while the pipeline runs.
344
+ **Context**: the publish flow only earns its keep when something is actually
345
+ wrong, so first you plant a real bug in the site, then watch `/publish` catch and
346
+ fix it for real.
360
347
 
361
348
  **Preparation**: make sure the pages exist (`index`, `about`, `projects` from the
362
- earlier chapters; lay any that are missing from the templates in `setup`). When the tester asks to publish, **execute the publish flow for real**
363
- by following `.claude/commands/publish.md`: run the `check-links` logic over
364
- every `.html` under `public/` (does each internal `href` resolve to a file that
365
- exists?); if any link is broken, brief the `content-editor` to fix it and
366
- re-run the check; then walk the deploy runbook steps. Do not role-play it.
349
+ earlier chapters; lay any that are missing from the templates in `setup`).
367
350
 
368
- Tell the tester:
351
+ This chapter has two beats: the tester breaks a link in the HTML first, then runs
352
+ `/publish` so the skill catches the break. The split is required, the publish run
353
+ cannot demonstrate the catch until the break is in place.
354
+
355
+ **Beat 1, plant the bug (the tester breaks the HTML, their file).** Tell the
356
+ tester:
357
+
358
+ > Before we ship, let's break something on purpose. Open `public/index.html` in
359
+ > your editor and find the **About** link in the top nav:
360
+ >
361
+ > ```html
362
+ > <a href="/about.html">About</a>
363
+ > ```
364
+ >
365
+ > Change the target to a typo that points at a page that does not exist, then
366
+ > save:
367
+ >
368
+ > ```html
369
+ > <a href="/abuot.html">About</a>
370
+ > ```
371
+ >
372
+ > Now watch the **Map**. Nothing happens: no arrow moves, no red marker. Back in
373
+ > the `broken-ref` chapter, breaking a link between your `.md` files lit up the
374
+ > graph the instant you saved. This break is invisible to it, and that is
375
+ > correct: skill-map maps your **harness** (the `.md` files, Layer 1), not the
376
+ > HTML pages it produces (Layer 2, your `public/` folder, which is even in
377
+ > `.skillmapignore`). A broken link inside your actual site never shows on the
378
+ > graph. The one thing that catches it is your `check-links` skill, which is
379
+ > exactly what `/publish` runs as its first step.
380
+ >
381
+ > Saved the typo, and the Map stayed unchanged?
382
+
383
+ Wait for confirmation. The Map MUST stay unchanged; if a marker appeared they
384
+ edited a `.md` by mistake, point them back at `public/index.html`.
369
385
 
370
- > The site is ready. Tell me to publish (or type `/publish`) and I'll run your
371
- > publish command for real: I follow its steps, run the link check across your
372
- > pages, fix anything through the `content-editor`, and walk the deploy runbook,
373
- > exactly what the command says to do.
386
+ **Beat 2, run /publish for real.** Tell the tester:
374
387
 
375
- After running the flow, report what actually happened (keep the promises
376
- conditional on the real result):
388
+ > Now ship it. Tell me to publish (or type `/publish`) and I'll run your publish
389
+ > command for real, exactly as written. (You can read the command anytime by
390
+ > clicking the `publish` node on the Map, then opening its **Body** section.)
391
+
392
+ When the tester asks to publish, **execute the publish flow for real** by
393
+ following `.claude/commands/publish.md`: run the `check-links` logic over every
394
+ `.html` under `public/` (does each internal `href` resolve to a file that
395
+ exists?), which now finds the planted typo; per step 2, brief the
396
+ `content-editor` to fix it (point the link back at `/about.html`), re-run the
397
+ check until it is clean, then walk the deploy runbook. Do not role-play it;
398
+ `Read` `public/index.html` before and after the fix so the report is honest.
399
+
400
+ After running the flow, report what actually happened:
377
401
 
378
402
  > Here is what just ran, for real:
379
403
  >
380
404
  > - **check-links** walked every page under `public/` and followed each internal
381
- > link. Result: 0 broken links. (Had it found one, the next step would have
382
- > briefed `content-editor` to fix it, then re-checked, that is what step 2 is
383
- > for.)
405
+ > link. It caught **1 broken link**: `/abuot.html` on `index.html`, the typo
406
+ > you planted. The graph never flagged it, but the skill did, because the skill
407
+ > reads your real pages.
408
+ > - **step 2 kicked in**: I briefed your `content-editor` to fix it. It pointed
409
+ > the link back at `/about.html`, and a re-run of **check-links** came back
410
+ > clean: 0 broken links.
384
411
  > - the **deploy runbook** (`docs/DEPLOYMENT.md`) lists the ship steps:
385
- > regenerate the pages (done), run the link check (done), start the server
386
- > (next chapter).
412
+ > regenerate the pages (done), run the link check (done, now clean), start the
413
+ > server (next chapter).
387
414
  >
388
- > And the Map did not move while the pipeline ran: the pages are Layer 2 output;
389
- > the harness on the canvas is Layer 1, and that is what skill-map maps.
390
- >
391
- > As you saw in the lines just above, I did not report anything odd: the link
392
- > check came back clean and `/publish` is wired correctly across your pages.
393
- > Shall we continue?
415
+ > That is the whole point of the harness: you broke the site, the graph stayed
416
+ > quiet because the HTML is its output and not its map, and your own publish
417
+ > command caught the break and fixed it before it shipped. Shall we continue?
394
418
 
395
- Wait for confirmation. Mark `publish`: done. Auto-advance to `stability`.
419
+ Wait for confirmation. The site MUST be clean again (the typo fixed) before
420
+ `golive`. Mark `publish`: done. Auto-advance to `stability`.
396
421
 
397
422
  ## Chapter `stability` - Set a node's stability (and the `.sm` sidecar) (~3 min)
398
423
 
399
- **Context**: real maintenance includes marking how mature each piece is. skill-map
400
- lets you tag a node's **stability** (`experimental` / `stable` / `deprecated`)
401
- from the inspector. That is skill-map's own metadata, so it lands in a co-located
402
- **`.sm` sidecar** next to the file (the vendor file stays untouched), and the
403
- first `.sm` write asks for your consent. Good moment now that the site shipped:
404
- mark the handbook as the stable core it is.
405
-
406
424
  **Preparation**: none for a first-time tester. (If re-entering a dir where the
407
425
  sidecar already exists, reset consent first with `rm -f AGENTS.sm
408
426
  .skill-map/settings.local.json` so the consent prompt shows again.)
409
427
 
410
428
  Tell the tester:
411
429
 
412
- > Your harness shipped, so let's mark the handbook as the **stable** core it is.
413
- > Open the Inspector for the `AGENTS` node (click it on the **Map**) and find the
414
- > **stability** action (the action button in the inspector). Click it and pick
415
- > `stable` from the list.
430
+ > Your harness shipped, so let's set its **stability**. Open the Inspector for
431
+ > the `AGENTS` node (click it on the **Map**) and click the **Set stability**
432
+ > button. Pick any of `experimental` / `stable` / `deprecated` from the list.
416
433
  >
417
434
  > The first time skill-map writes its own metadata it asks for **consent**:
418
- > confirm it in the dialog that pops up. Two things happen at once: a `stable`
419
- > badge appears on the `AGENTS` node, and skill-map creates a **`.sm` sidecar**
420
- > (`AGENTS.sm`) right next to the handbook to hold that metadata, your `AGENTS.md`
421
- > itself is never touched. Your consent is remembered for the project, so it
422
- > will not ask again.
435
+ > confirm it in the dialog that pops up. Two things happen at once: a stability
436
+ > badge for the stage you picked appears on the `AGENTS` node, and skill-map
437
+ > creates a **`.sm` sidecar file** (`AGENTS.sm`) right next to the handbook to
438
+ > hold that metadata, your `AGENTS.md` itself is never touched. Your consent is
439
+ > remembered for the project, so it will not ask again.
423
440
  >
424
441
  > That sidecar is where skill-map keeps what it knows about a node that does not
425
- > belong in the vendor file (stability, version, tags). You just wrote your first
426
- > one, by clicking, no command needed.
442
+ > belong in the vendor file (stability, version, tags).
427
443
  >
428
- > See the `stable` badge on the handbook?
444
+ > See the new stability badge on the handbook?
429
445
 
430
446
  Wait for confirmation. Mark `stability`: done. Auto-advance to `golive`.
431
447
 
432
- ## Chapter `golive` - Your portfolio, live next to the graph (~3 min)
448
+ ## Chapter `golive` - Your website, live next to the graph (~3 min)
433
449
 
434
- **Context**: the climax. Serve the finished multi-page site and click through it,
435
- ending with the running portfolio on one side and the full harness graph on the
436
- other. One of the few chapters where the tester runs non-`sm` commands
437
- themselves; guide them, do not run it for them. `npm install` is idempotent, so
438
- it is safe whether or not they ran it in `setup`.
450
+ One of the few chapters where the tester runs non-`sm` commands themselves;
451
+ guide them, do not run it for them. `npm install` is idempotent, so it is safe
452
+ whether or not they ran it in `setup`.
439
453
 
440
454
  **Preparation**: none. `server.js` / `package.json` exist from the kickoff; the
441
455
  pages exist from the earlier chapters.
@@ -451,7 +465,7 @@ node server.js
451
465
  > Open `http://localhost:3000` and click through Home, About, and Projects, the
452
466
  > pages your harness produced and shipped through the publish flow you just ran.
453
467
  >
454
- > Now take it in at once. On one side, your real running portfolio, named after
468
+ > Now take it in at once. On one side, your real running website, named after
455
469
  > you, that you could deploy as-is. On the other, the skill-map graph of the
456
470
  > harness that built it: the handbook, the content-editor, the style guide, the
457
471
  > publish command, the link checker, the deploy runbook, all wired together. You
@@ -466,7 +480,7 @@ Wait for confirmation. The tester runs the commands; do not run them. If
466
480
  server with Ctrl+C and apply the ports edge case.
467
481
 
468
482
  This is the campaign finale. Congratulate them plainly: they went from an empty
469
- directory to a real, running portfolio plus a complete map of its harness. Then
483
+ directory to a real, running website plus a complete map of its harness. Then
470
484
  invite them to keep going on their own:
471
485
 
472
486
  > And this site is yours to keep playing with: add more pages, refine the style