@skill-map/cli 0.61.0 → 0.61.1

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.
@@ -161,11 +161,19 @@ cd <cwd>
161
161
  > Got the second terminal open and anchored to the folder? Confirm
162
162
  > before we move on.
163
163
 
164
+ **HARD STOP here.** This message ends at the confirmation question
165
+ above, that is its own beat. Do NOT run step 5, do NOT render the
166
+ menu, do NOT add a "meanwhile / mientras tanto" bridge in the same
167
+ message. Wait for the tester to confirm the second terminal is open
168
+ and anchored; only then continue to step 5.
169
+
164
170
  ### 5. Initialise state, lay the universal files, show the menu
165
171
 
166
- Pre-flight does NOT pre-lay any part's fixture and does NOT auto-enter
167
- a part. It initialises state, lays the universal files every part
168
- needs, then routes to the menu. All silent (backstage):
172
+ **Run this only after the tester has confirmed step 4.** Pre-flight
173
+ does NOT pre-lay any part's fixture and does NOT auto-enter a part. It
174
+ initialises state, lays the universal files every part needs, then
175
+ routes to the menu. The init + lay are silent (backstage); the menu is
176
+ the first thing the tester sees in this post-confirmation message:
169
177
 
170
178
  - Create the state file (carries the detected provider, the running
171
179
  `sm version`, the cwd, and the tester's language):
@@ -280,8 +288,12 @@ the `__PROVIDER__` token and skip kinds the provider does not claim.
280
288
  `fixtures.js clear portfolio --provider <provider>`, `rm -rf .skill-map`.
281
289
  2. `fixtures.js seed prologue-built --provider <provider> --lang <lang>`
282
290
  (lays the six demo nodes, wires the hub, drops `private-credentials`).
291
+ Run this ALWAYS, even if a demo fixture from a prior prologue run is
292
+ on disk, so the deliberate broken reference is the pristine
293
+ `prologue-built` state, not whatever the tester edited in the
294
+ prologue (they resolve it by hand in `edit-link`).
283
295
  3. `sm init` (single `.claude/` marker, no lens prompt), then `sm scan`.
284
- If the demo was already on disk and `.skill-map/` exists, just `sm scan`.
296
+ If `.skill-map/` already exists, skip the init and just `sm scan`.
285
297
 
286
298
  - **`seed`** (campaign parts `connect-harness`, `daily-loop`): builds
287
299
  on the accumulating portfolio, but the tester may have jumped here.
@@ -23,12 +23,10 @@
23
23
  "public/index.html",
24
24
  "public/about.html",
25
25
  "public/projects.html",
26
- "public/posts.html",
27
26
  "public/style.css",
28
27
  "docs/STYLE.md",
29
28
  "docs/DEPLOY.md",
30
29
  "docs/DEPLOYMENT.md",
31
- "docs/draft.md",
32
30
  "__PROVIDER__/agents/content-editor.md",
33
31
  "__PROVIDER__/skills/check-links",
34
32
  "__PROVIDER__/commands/publish.md",
@@ -4,8 +4,6 @@ description: |
4
4
  Example agent that handles read and shell tasks. Solo node at
5
5
  boot; gets connected to the rest of the demo fixture during the
6
6
  Live UI step.
7
- tools: [Read, Bash]
8
- model: sonnet
9
7
  ---
10
8
 
11
9
  # demo-agent
@@ -4,8 +4,6 @@ description: |
4
4
  Agente de ejemplo que maneja tareas de lectura y de shell. Nodo
5
5
  suelto al arranque; se conecta con el resto del set de prueba
6
6
  durante el paso de la UI en vivo.
7
- tools: [Read, Bash]
8
- model: sonnet
9
7
  ---
10
8
 
11
9
  # demo-agent
@@ -338,6 +338,11 @@ For every chapter:
338
338
  Inviolable rule #6, NO "¿seguimos?"). `pace` only decides batching:
339
339
  `per-step` presents one chapter per exchange, `auto-advance` may
340
340
  chain chapters that need no tester action into one response.
341
+ **Either pace still emits every chapter's `Capítulo S.N` Announcement
342
+ (step 1).** `auto-advance` drops only the inter-chapter "¿seguimos?"
343
+ pause, never the per-chapter announcement, so any chapter with a
344
+ tester-facing beat always opens with its number, even when it
345
+ follows straight on from the previous one.
341
346
 
342
347
  ## Routing + menu (orchestrator)
343
348
 
@@ -69,7 +69,7 @@
69
69
  },
70
70
  {
71
71
  "id": "manual",
72
- "title": "The handbook and CLAUDE.md (@AGENTS.md)",
72
+ "title": "The handbook (AGENTS.md) and CLAUDE.md",
73
73
  "est_min": 2
74
74
  },
75
75
  {
@@ -132,19 +132,14 @@
132
132
  "est_min": 3
133
133
  },
134
134
  {
135
- "id": "add-page",
136
- "title": "Add a page with your agent",
137
- "est_min": 4
138
- },
139
- {
140
- "id": "orphan-draft",
141
- "title": "A page nobody links to yet",
135
+ "id": "preview",
136
+ "title": "Bring it up and see your site",
142
137
  "est_min": 2
143
138
  },
144
139
  {
145
- "id": "wire-and-improve",
146
- "title": "Wire the draft in",
147
- "est_min": 3
140
+ "id": "add-page",
141
+ "title": "Add a page with your agent",
142
+ "est_min": 4
148
143
  },
149
144
  {
150
145
  "id": "broken-ref",
@@ -162,8 +157,8 @@
162
157
  "est_min": 4
163
158
  },
164
159
  {
165
- "id": "sidecar",
166
- "title": "Annotate the handbook (.sm and consent)",
160
+ "id": "stability",
161
+ "title": "Set a node's stability (and the `.sm` sidecar)",
167
162
  "est_min": 3
168
163
  },
169
164
  {
@@ -113,7 +113,7 @@ parts:
113
113
  status: active
114
114
  chapters:
115
115
  - id: kickoff ; title: "Start the portfolio (sm init on the real skeleton)" ; est_min: 2
116
- - id: manual ; title: "The handbook and CLAUDE.md (@AGENTS.md)" ; est_min: 2
116
+ - id: manual ; title: "The handbook (AGENTS.md) and CLAUDE.md" ; est_min: 2
117
117
  - id: first-agent ; title: "The first harness agent (content-editor)" ; est_min: 2
118
118
  - id: real-kinds ; title: "The real kinds in context" ; est_min: 2
119
119
 
@@ -144,13 +144,12 @@ parts:
144
144
  status: active
145
145
  chapters:
146
146
  - id: setup ; title: "Make it yours, make it presentable" ; est_min: 3
147
+ - id: preview ; title: "Bring it up and see your site" ; est_min: 2
147
148
  - id: add-page ; title: "Add a page with your agent" ; est_min: 4
148
- - id: orphan-draft ; title: "A page nobody links to yet" ; est_min: 2
149
- - id: wire-and-improve ; title: "Wire the draft in" ; est_min: 3
150
149
  - id: broken-ref ; title: "A rename breaks a link" ; est_min: 4
151
150
  - id: reserved ; title: "A reserved name collides" ; est_min: 2
152
151
  - id: publish ; title: "Ship it: run /publish for real" ; est_min: 4
153
- - id: sidecar ; title: "Annotate the handbook (.sm and consent)" ; est_min: 3
152
+ - id: stability ; title: "Set a node's stability (and the `.sm` sidecar)" ; est_min: 3
154
153
  - id: golive ; title: "Your portfolio, live next to the graph" ; est_min: 3
155
154
 
156
155
  # ----- parked: MCP returns later as its own iteration (body kept in part-mcp.md) -----
@@ -70,9 +70,8 @@ entered out of order.
70
70
 
71
71
  `manifest.json#footprints` lists the full on-disk reach of each
72
72
  fixture, INCLUDING files a part's later chapters add (the daily loop's
73
- `docs/draft.md`, `public/style.css` + generated pages, the renamed
74
- `new-page` command, `AGENTS.sm`; the portfolio's `DEPLOYMENT.md`
75
- rename). `fixtures.js clear <footprint>` (part-entry resets) and
73
+ `public/style.css` + generated pages, the renamed `new-page` command,
74
+ `AGENTS.sm`; the portfolio's `DEPLOYMENT.md` rename). `fixtures.js clear <footprint>` (part-entry resets) and
76
75
  `state.js wipe` (start-over) both read it, so the per-fixture path list
77
76
  lives in ONE place. Add or drop a harness file there.
78
77
 
@@ -32,7 +32,7 @@ Wait for confirmation. Mark `check-links`: done.
32
32
 
33
33
  On `agent-skills` / Antigravity there is no `command` kind, so skip this whole chapter and fold its purpose into the prose of the next one.
34
34
 
35
- Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. Backstage, get the content: `node .claude/skills/sm-tutorial/scripts/fixtures.js cat harness --file "__PROVIDER__/commands/publish.md" --provider <provider> --lang <lang>`, then render it in the fenced block the tester copies. The frontmatter fence (`---`) MUST sit on column 0 with no leading spaces: present the block below exactly as written, and if the tester pastes it indented, have them strip the leading whitespace. An indented `---` does not parse as YAML, so the `publish` node would land without its `name` or `description`.
35
+ Tell the tester to create the file themselves (it is their project's file, Inviolable rule #2). Substitute `<provider_dir>` per `_core.md` in the path you give them. Backstage, get the content: `node .claude/skills/sm-tutorial/scripts/fixtures.js cat harness --file "__PROVIDER__/commands/publish.md" --provider <provider> --lang <lang>`, then render it as a **top-level fenced code block**: at column 0, NOT inside the `> ` blockquote and with NO leading indentation, so the tester's copy keeps every line flush left. The frontmatter fences (`---`) MUST land on column 0. If the block is rendered (or pasted) indented, the opening and closing `---` shift off column 0, the YAML never parses, and the `publish` node loads body-only without its `name` / `description` (`sm check` then warns `frontmatter-malformed`). Present the block below exactly as written.
36
36
 
37
37
  > Create `.claude/commands/publish.md` with exactly this content (the first line is `---`, nothing before it):
38
38
 
@@ -78,7 +78,7 @@ Continue the tester message:
78
78
  >
79
79
  > Did the three arrows appear?
80
80
 
81
- Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed. Mark `publish`: done.
81
+ Wait for confirmation. You MAY use `Read` on the file afterwards to verify it landed, in particular that the opening and closing `---` are flush at column 0. If a later `sm check` flags `frontmatter-malformed` on `publish.md`, the fences got indented on paste: have the tester re-align every line flush left (strip the leading spaces so `---` is at column 0), then the next scan reads it clean. Mark `publish`: done.
82
82
 
83
83
  ## Chapter `links` - The handbook becomes the hub (~4 min)
84
84
 
@@ -122,7 +122,7 @@ Wait for confirmation. You MAY use `Read` on the two files afterwards to verify
122
122
 
123
123
  ## Chapter `confidence` - How sure is each link (~3 min)
124
124
 
125
- **Context**: skill-map records how sure it is of every connection and shows that as opacity. In this harness every link resolves to a real node, so they all read solid (1.00); the broken-reference case is the one the tester met in the prologue (the bare `@demo-guideline` mention that resolved to no agent, drawn as no arrow and flagged `reference-broken` at 0.50). Here we open the Inspector on a real harness node, read the all-solid numbers, and point back to that prologue contrast. Mirrors the prologue's connectors beat on the portfolio.
125
+ **Context**: skill-map records how sure it is of every connection and shows that as opacity. In this harness every link resolves to a real node, so they all read solid (1.00); the broken-reference case is the one the tester met in the prologue (the `@demo-guideline` reference skill-map could not resolve, drawn as no arrow and flagged `reference-broken` at 0.50, then resolved by hand with `.md`). Here we open the Inspector on a real harness node, read the all-solid numbers, and point back to that prologue contrast. Mirrors the prologue's connectors beat on the portfolio.
126
126
 
127
127
  No file edits in this chapter, pure observation on the graph the tester just built.
128
128
 
@@ -147,14 +147,13 @@ Tell the tester:
147
147
  >
148
148
  > Your whole harness reads solid because every link lands on a real
149
149
  > node, that is what a clean, fully wired graph looks like. So what
150
- > does a link that does NOT resolve look like? You saw one back in the
151
- > prologue: `@demo-guideline` was a bare `@`-mention, and a bare
152
- > `@handle` only resolves to an agent. `demo-guideline` is a note, so
153
- > it had nothing to land on: skill-map drew no arrow and flagged it as
154
- > a **broken reference**, its confidence knocked down to **0.50** by
155
- > the broken penalty. The fix there was one character:
156
- > `@demo-guideline2.md`, the same handle plus a `.md`, resolved to the
157
- > real file and drew a solid arrow at **1.00**.
150
+ > does a link that does NOT resolve look like? You met one back in the
151
+ > prologue: `@demo-guideline` was a reference skill-map could not
152
+ > resolve, it had nothing to land on, so skill-map drew no arrow and
153
+ > flagged it as a **broken reference**, its confidence knocked down to
154
+ > **0.50** by the broken penalty. The fix was one character: adding
155
+ > `.md` (`@demo-guideline.md`) turned it into a file reference to the
156
+ > real `demo-guideline.md`, and it drew a solid arrow at **1.00**.
158
157
  >
159
158
  > So confidence here is really about resolution: **1.00** for a link
160
159
  > that lands on a real node, **0.50** for one flagged broken. There is
@@ -32,6 +32,15 @@ landed (this keeps the node-count promises honest). If the subagent is not
32
32
  invocable in the tester's setup, act as the `content-editor` yourself following
33
33
  its rules and `docs/STYLE.md`, so the beat still lands.
34
34
 
35
+ **Live-map note (read once).** Every chapter here is watched on the live
36
+ **Map**, so skill-map's UI (`sm`) MUST be running before you start, watcher
37
+ picking up edits. In the full campaign the tester booted it back in the kickoff
38
+ chapter and kept it open; if they entered this part directly (via seed) or
39
+ closed it, have them start it now, run `sm` from the project root and open the
40
+ URL it prints, before the first chapter. This part has NO `sm scan` / `sm check`
41
+ steps: the watcher re-scans on every save, and the Map shows new nodes,
42
+ broken-reference markers, and confidence live.
43
+
35
44
  ---
36
45
 
37
46
  **Act A - Add**
@@ -160,16 +169,31 @@ footer.site { border-top: 1px solid var(--border); padding: 2rem 0; color: var(-
160
169
  </html>
161
170
  ```
162
171
 
163
- Then tell the tester to serve it (the tester runs these; do not run them):
172
+ Tell the tester the face is on (no serving yet, that is the next chapter):
173
+
174
+ > I gave your site a face: a shared stylesheet plus a styled **Home** and
175
+ > **About** page, named after you. These are Layer 2 (the harness's output), so
176
+ > the **Map** did not move, and that is correct: skill-map maps the harness (the
177
+ > `.md` files, Layer 1), not the HTML it produces. Next we bring it up so you
178
+ > can see it.
179
+
180
+ Mark `setup`: done. Auto-advance to `preview`.
181
+
182
+ ## Chapter `preview` - Bring it up and see your site (~2 min)
183
+
184
+ **Context**: the first look. The site is styled but the tester has only seen it
185
+ as files; now serve it and open it in the browser, the early payoff before the
186
+ daily loop fills it with pages. The tester runs the commands themselves (one of
187
+ the few non-`sm` beats); guide them, do not run them.
164
188
 
165
189
  ```bash
166
190
  npm install
167
191
  node server.js
168
192
  ```
169
193
 
170
- > Your portfolio has a face now. `npm install` pulls the one small library the
171
- > server needs (Express, on the Node you already have), and `node server.js`
172
- > starts it and prints a line like `Listening on http://localhost:3000`.
194
+ > Bring your site up. `npm install` pulls the one small library the server needs
195
+ > (Express, on the Node you already have), and `node server.js` starts it and
196
+ > prints a line like `Listening on http://localhost:3000`.
173
197
  >
174
198
  > Open `http://localhost:3000`: there is your site, named after you, with a
175
199
  > clean layout. Click **About** and back to **Home**.
@@ -182,7 +206,11 @@ node server.js
182
206
  >
183
207
  > Does the site load and look clean?
184
208
 
185
- Wait for confirmation. Mark `setup`: done. Auto-advance to `add-page`.
209
+ Wait for confirmation. If `node server.js` reports `Cannot find module
210
+ 'express'`, `npm install` did not run first, run it (it reads `package.json` and
211
+ pulls Express), then retry; if `npm install` itself fails, check they are in the
212
+ project root and Node is on PATH. Mark `preview`: done. Auto-advance to
213
+ `add-page`.
186
214
 
187
215
  ## Chapter `add-page` - Add a page with your agent (~4 min)
188
216
 
@@ -209,6 +237,10 @@ following the agent's own steps and `docs/STYLE.md` (the shared shell, link
209
237
  home nav. Do NOT write any `.md`, do NOT touch the harness. Then `Read` the file
210
238
  it produced.
211
239
 
240
+ Report back using the block below as the template: adapt the page name and add a
241
+ one-line description of what it actually wrote, but keep the ENTIRE report inside
242
+ the `> ` blockquote, do NOT drop the bar when you personalise it.
243
+
212
244
  > Your `content-editor` ran for real and wrote `public/projects.html`, linked
213
245
  > from the home nav. Refresh the site: the new page is there, in the same style
214
246
  > as the rest.
@@ -219,88 +251,12 @@ it produced.
219
251
  >
220
252
  > See the new page on the site, and the Map unchanged?
221
253
 
222
- Wait for confirmation. Mark `add-page`: done. Auto-advance to `orphan-draft`.
223
-
224
- ## Chapter `orphan-draft` - A page nobody links to yet (~2 min)
225
-
226
- **Context**: mid-day you jot an idea for the next page but do not wire it up yet.
227
- skill-map shows it as an **orphan**: a real node with nothing pointing at it.
228
-
229
- **Preparation**: `Write` `docs/draft.md` (markdown kind):
230
- ```markdown
231
- ---
232
- name: draft
233
- description: |
234
- A rough idea for the next page. Not linked from anywhere yet.
235
- ---
236
-
237
- # Draft
238
-
239
- Notes toward a posts page. Nothing wired up.
240
- ```
241
-
242
- Tell the tester to run:
243
-
244
- ```bash
245
- sm scan
246
- sm show docs/draft.md
247
- ```
248
-
249
- > A new `docs/draft` node appeared on the Map as a floating dot, no arrows in or
250
- > out. `sm show docs/draft.md` has no "Links in" section: nothing references it.
251
- > That is an **orphan**, a valid node with no incoming links.
252
- >
253
- > An orphan is NOT an error: run `sm check` and the harness still reads clean.
254
- > It is just a node nobody points at yet. Keep three ideas apart: an **orphan**
255
- > (a real node, no incoming link), a **broken reference** (a link with no target
256
- > on the other end), and an **issue** (a rule violation `sm check` flags). You
257
- > will meet the other two in a moment.
258
- >
259
- > See the floating dot, and the empty "Links in"?
260
-
261
- Wait for confirmation. Mark `orphan-draft`: done. Auto-advance to `wire-and-improve`.
254
+ Wait for confirmation. Mark `add-page`: done. Auto-advance to `broken-ref`.
262
255
 
263
256
  ---
264
257
 
265
258
  **Act B - Modify / improve**
266
259
 
267
- ## Chapter `wire-and-improve` - Wire the draft in (~3 min)
268
-
269
- **Context**: you turn the draft into a real page and link it, so it stops being
270
- an orphan. Two moves: the `content-editor` writes the actual page (Layer 2), and
271
- you add a link to the draft note from the handbook (Layer 1), which gives the
272
- orphan an incoming edge.
273
-
274
- **Preparation**: invoke the `content-editor` via the Task tool (real-execution
275
- contract) to write `public/posts.html` from the draft idea (a couple of short
276
- sample posts, shared shell, nav link back to Home). `Read` it afterwards.
277
-
278
- Then tell the tester to wire the note in (their file, Inviolable rule #2):
279
-
280
- > Two moves to close the loop on that draft. First, I had your `content-editor`
281
- > turn it into a real page: `public/posts.html` now exists (Layer 2, so the Map
282
- > stays put for it). Second, your turn: open `AGENTS.md` and add this line to
283
- > the body, so the handbook actually points at the draft note:
284
- >
285
- > ```markdown
286
- > - The next page started as notes in [draft](docs/draft.md).
287
- > ```
288
- >
289
- > Save it, then re-scan and look at the draft again:
290
-
291
- ```bash
292
- sm scan
293
- sm show docs/draft.md
294
- ```
295
-
296
- > `docs/draft` is no longer an orphan: `sm show` now lists `Links in (1)
297
- > ← references AGENTS.md`, and on the Map the floating dot is connected to the
298
- > handbook. One incoming link is all it took to fold it into the graph.
299
- >
300
- > Did the draft connect to the handbook?
301
-
302
- Wait for confirmation. Mark `wire-and-improve`: done. Auto-advance to `broken-ref`.
303
-
304
260
  ## Chapter `broken-ref` - A rename breaks a link (~4 min)
305
261
 
306
262
  **Context**: real reorganizing breaks things, and this is where skill-map earns
@@ -311,60 +267,41 @@ On `agent-skills` / Antigravity there is no `/publish` command holding the deplo
311
267
  link; use the variant in the note at the end of this chapter (rename
312
268
  `docs/STYLE.md` to break the `content-editor`'s style-guide reference instead).
313
269
 
314
- **Preparation**: none (the tester drives).
270
+ **Preparation**: none (the tester drives). Everything here is watched live on
271
+ the Map; no `sm` commands.
315
272
 
316
273
  Tell the tester to rename the deploy runbook (their file):
317
274
 
318
275
  ```bash
319
276
  mv docs/DEPLOY.md docs/DEPLOYMENT.md
320
- sm scan
321
- sm check
322
277
  ```
323
278
 
324
279
  > You renamed the deploy runbook, but `/publish` still links to the old path.
325
- > `sm check` flags it:
326
- >
327
- > ```
328
- > sm check: 1 error
280
+ > Watch the **Map**: the `publish → docs/DEPLOY.md` arrow disappears (a broken
281
+ > link resolves to no node, so skill-map stops drawing it) and the `publish`
282
+ > card gets a red **broken-reference** marker, a link whose target no longer
283
+ > exists. Open the `publish` node's inspector and the broken reference is listed
284
+ > there.
329
285
  >
330
- > .claude/commands/publish.md
331
- > ✕ reference-broken Broken references reference → docs/DEPLOY.md
332
- > ```
333
- >
334
- > That is the `reference-broken` analyzer: a link whose target no longer exists.
335
- > On the Map the `publish → docs/DEPLOY.md` arrow has disappeared: a broken link
336
- > resolves to no node, so skill-map stops drawing it and flags the `publish` card
337
- > with a red error instead. `sm check` runs the full analyzer catalogue (around a
338
- > dozen rules); to narrow it to one rule:
339
-
340
- ```bash
341
- sm check --analyzers reference-broken
342
- ```
343
-
344
286
  > Now fix it the way you would for real: open `.claude/commands/publish.md` and
345
- > point the deploy-runbook link at `docs/DEPLOYMENT.md` (the new name). Then
346
- > re-scan and re-check:
347
-
348
- ```bash
349
- sm scan
350
- sm check
351
- ```
352
-
353
- > `✓ No issues`. The arrow is solid again. That is the daily safety net: rename
354
- > and move things freely, and skill-map tells you exactly what you forgot to
355
- > update, before it ships broken.
287
+ > point the deploy-runbook link at `docs/DEPLOYMENT.md` (the new name). Save.
288
+ >
289
+ > Watch the **Map** again: the arrow snaps back, solid, and the red marker
290
+ > clears, all live, no command to run. That is the daily safety net: rename and
291
+ > move things freely, and skill-map shows you exactly what you forgot to update
292
+ > before it ships broken.
356
293
  >
357
- > Did `sm check` go from 1 error back to clean?
294
+ > Did the broken marker appear and then clear?
358
295
 
359
- Wait for confirmation. The harness MUST read `✓ No issues` before Act C (the
360
- real `/publish` later follows this runbook). Mark `broken-ref`: done.
361
- Auto-advance to `reserved`.
296
+ Wait for confirmation. The harness MUST be clean again (the red marker gone)
297
+ before Act C (the real `/publish` later follows this runbook). Mark `broken-ref`:
298
+ done. Auto-advance to `reserved`.
362
299
 
363
300
  On `agent-skills` / Antigravity (no `command` kind), run the same beat on a link
364
301
  that exists there: `mv docs/STYLE.md docs/STYLE-GUIDE.md`, which breaks the
365
- `content-editor` skill's `[style guide]` reference; `sm check` flags
366
- `reference-broken` on the `content-editor`; fix the link in the skill body and
367
- re-check to clean.
302
+ `content-editor` skill's `[style guide]` reference; the Map flags the broken
303
+ reference on the `content-editor`; fix the link in the skill body and watch it
304
+ clear.
368
305
 
369
306
  ## Chapter `reserved` - A reserved name collides (~2 min)
370
307
 
@@ -390,41 +327,24 @@ description: |
390
327
  Creates a blank page so you can start writing.
391
328
  ```
392
329
 
393
- Tell the tester to scan and check:
330
+ The watcher picks up the new command. Tell the tester:
394
331
 
395
- ```bash
396
- sm scan
397
- sm check
398
- ```
399
-
400
- > `sm check` warns:
401
- >
402
- > ```
403
- > sm check: 1 warning
332
+ > I added a command named `init`. Watch the **Map**: the new `init` command node
333
+ > appears, but flagged with a **warning** marker. Open its inspector: it reads
334
+ > `name-reserved`, `init` shadows one of Claude Code's own slash commands (like
335
+ > `/help`, `/clear`, `/config`), so the runtime would silently ignore your file,
336
+ > it never runs. The fix is a name the runtime does not own.
404
337
  >
405
- > .claude/commands/init.md
406
- > ⚠ name-reserved .claude/commands/init.md shadows a built-in claude command. The runtime ignores this file in favour of its own built-in. Rename the file or `frontmatter.name` to a non-reserved value.
407
- > ```
338
+ > Rename it to `new-page`: rename the file `.claude/commands/init.md` to
339
+ > `.claude/commands/new-page.md`, AND change `frontmatter.name` to `new-page`
340
+ > and the H1 to `# new-page` (a command's H1 stays a plain title, never
341
+ > `# /new-page`). Save.
408
342
  >
409
- > `init` is one of Claude Code's own slash commands (like `/help`, `/clear`,
410
- > `/config`), so your file would be silently ignored, it never runs. The fix is
411
- > to give it a name the runtime does not own.
412
-
413
- Rename the command to `new-page`: rename the file `.claude/commands/init.md` to
414
- `.claude/commands/new-page.md`, AND change `frontmatter.name` to `new-page` and
415
- the H1 to `# new-page` (a command's H1 stays a plain title, never `# /new-page`).
416
- Then have the tester re-scan and re-check:
417
-
418
- ```bash
419
- sm scan
420
- sm check
421
- ```
422
-
423
- > `✓ No issues`. Notice what cleared the warning: changing the **name**, not
424
- > just the filename. The reserved check looks at the command's name (its
425
- > `frontmatter.name`), which is why the warning told you to rename "the file or
426
- > `frontmatter.name`". Now `new-page` is yours and the runtime will actually run
427
- > it.
343
+ > Watch the **Map** again: the warning clears and the node is now `new-page`,
344
+ > all live. Notice what cleared it: changing the **name** (`frontmatter.name`),
345
+ > not just the filename, the reserved check looks at the command's name, which
346
+ > is why the warning said to rename "the file or `frontmatter.name`". Now
347
+ > `new-page` is yours and the runtime will actually run it.
428
348
  >
429
349
  > Did the warning clear after the rename?
430
350
 
@@ -446,9 +366,8 @@ On `agent-skills` / Antigravity there is no `/publish` command: run the
446
366
  `check-links` skill directly over `public/`, then follow `docs/DEPLOYMENT.md` by
447
367
  hand. Everything else in this chapter is identical.
448
368
 
449
- **Preparation**: make sure the pages exist (`index`, `about`, `projects`,
450
- `posts` from the earlier chapters; lay any that are missing from the templates in
451
- `setup`). When the tester asks to publish, **execute the publish flow for real**
369
+ **Preparation**: make sure the pages exist (`index`, `about`, `projects` from the
370
+ earlier chapters; lay any that are missing from the templates in `setup`). When the tester asks to publish, **execute the publish flow for real**
452
371
  by following `.claude/commands/publish.md`: run the `check-links` logic over
453
372
  every `.html` under `public/` (does each internal `href` resolve to a file that
454
373
  exists?); if any link is broken, brief the `content-editor` to fix it and
@@ -479,49 +398,42 @@ conditional on the real result):
479
398
  >
480
399
  > Did the publish run report the link check clean?
481
400
 
482
- Wait for confirmation. Mark `publish`: done. Auto-advance to `sidecar`.
401
+ Wait for confirmation. Mark `publish`: done. Auto-advance to `stability`.
483
402
 
484
- ## Chapter `sidecar` - Annotate the handbook (.sm and consent) (~3 min)
403
+ ## Chapter `stability` - Set a node's stability (and the `.sm` sidecar) (~3 min)
485
404
 
486
- **Context**: skill-map keeps its own metadata in co-located `.sm` sidecars, right
487
- next to each file, leaving the vendor file untouched. Writing the first one needs
488
- your consent. Good moment now that the site shipped: leave a metadata note on the
489
- handbook.
405
+ **Context**: real maintenance includes marking how mature each piece is. skill-map
406
+ lets you tag a node's **stability** (`experimental` / `stable` / `deprecated`)
407
+ from the inspector. That is skill-map's own metadata, so it lands in a co-located
408
+ **`.sm` sidecar** next to the file (the vendor file stays untouched), and the
409
+ first `.sm` write asks for your consent. Good moment now that the site shipped:
410
+ mark the handbook as the stable core it is.
490
411
 
491
412
  **Preparation**: none for a first-time tester. (If re-entering a dir where the
492
413
  sidecar already exists, reset consent first with `rm -f AGENTS.sm
493
- .skill-map/settings.local.json` so the prompt shows again.)
414
+ .skill-map/settings.local.json` so the consent prompt shows again.)
494
415
 
495
416
  Tell the tester:
496
417
 
497
- ```bash
498
- sm sidecar annotate AGENTS.md
499
- ```
500
-
501
- > The first time you write a `.sm`, skill-map asks for consent: answer `y` at the
502
- > `[Y/n]` prompt. It then scaffolds `AGENTS.sm` next to `AGENTS.md`:
418
+ > Your harness shipped, so let's mark the handbook as the **stable** core it is.
419
+ > Open the Inspector for the `AGENTS` node (click it on the **Map**) and find the
420
+ > **stability** action (the action button in the inspector). Click it and pick
421
+ > `stable` from the list.
503
422
  >
504
- > ```
505
- > ✓ Created AGENTS.sm. Edit it, then run `sm bump AGENTS.md` to commit the version.
506
- > ```
423
+ > The first time skill-map writes its own metadata it asks for **consent**:
424
+ > confirm it in the dialog that pops up. Two things happen at once: a `stable`
425
+ > badge appears on the `AGENTS` node, and skill-map creates a **`.sm` sidecar**
426
+ > (`AGENTS.sm`) right next to the handbook to hold that metadata, your `AGENTS.md`
427
+ > itself is never touched. Your consent is remembered for the project, so it
428
+ > will not ask again.
507
429
  >
508
- > Look at the two new artifacts:
509
-
510
- ```bash
511
- cat AGENTS.sm
512
- cat .skill-map/settings.local.json
513
- ```
514
-
515
- > `AGENTS.sm` holds an `identity:` block (hashes that tie it to the live file)
516
- > and an empty `annotations: {}` ready for you to fill in. And
517
- > `.skill-map/settings.local.json` now records your consent,
518
- > `{ "allowEditSmFiles": true }`, so skill-map will not ask again in this
519
- > project. Open the Inspector for the `AGENTS` node: it now has a **Metadata**
520
- > section it did not have before.
430
+ > That sidecar is where skill-map keeps what it knows about a node that does not
431
+ > belong in the vendor file (stability, version, tags). You just wrote your first
432
+ > one, by clicking, no command needed.
521
433
  >
522
- > See `AGENTS.sm` and the consent flag?
434
+ > See the `stable` badge on the handbook?
523
435
 
524
- Wait for confirmation. Mark `sidecar`: done. Auto-advance to `golive`.
436
+ Wait for confirmation. Mark `stability`: done. Auto-advance to `golive`.
525
437
 
526
438
  ## Chapter `golive` - Your portfolio, live next to the graph (~3 min)
527
439
 
@@ -542,9 +454,8 @@ node server.js
542
454
  > Last step, the fun one. `npm install` confirms the one small library is there,
543
455
  > and `node server.js` starts the server (`Listening on http://localhost:3000`).
544
456
  >
545
- > Open `http://localhost:3000` and click through Home, About, Projects, and
546
- > Posts, the pages your harness produced and shipped through the publish flow you
547
- > just ran.
457
+ > Open `http://localhost:3000` and click through Home, About, and Projects, the
458
+ > pages your harness produced and shipped through the publish flow you just ran.
548
459
  >
549
460
  > Now take it in at once. On one side, your real running portfolio, named after
550
461
  > you, that you could deploy as-is. On the other, the skill-map graph of the