@skill-map/cli 0.53.0 → 0.53.2

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.
@@ -148,25 +148,28 @@ Apply §Provider detection from `_core.md`. Persist the result into
148
148
  > Got the second terminal open and anchored to the folder? Confirm
149
149
  > before we move on.
150
150
 
151
- ### 5. Lay the Part 0 fixture and route
151
+ ### 5. Write the universal files and show the menu
152
152
 
153
- Part 0 (`fundamentals`) is `preflight: taught-init`: pre-lay its
154
- fixture now (silently), so the tester's `sm init` in the `init`
155
- chapter produces a clean scan, but the tester runs `sm init`
156
- themselves. Write, substituting `<provider_dir>` per detection:
153
+ Pre-flight does NOT pre-lay any part's fixture and does NOT auto-enter
154
+ a part. It writes only the two files every part needs, then routes to
155
+ the menu:
157
156
 
158
- - `<provider_dir>/agents/demo-agent.md` (the single boot node).
159
- - `.skillmapignore` (block below). Write it NOW, before `sm init`,
160
- so the first scan never sees the tutorial's own files. `sm init`
161
- only writes `.skillmapignore` when absent, so this stays put.
162
157
  - `findings.md` (block below).
163
- - `tutorial-state.yml` (template below).
158
+ - `tutorial-state.yml` (template below; it starts with `parts: {}`,
159
+ empty, a part's entry is added the first time the tester picks it).
164
160
 
165
- Then **route** per §Routing in `_core.md`: no prior state → enter
166
- Part 0 at chapter `init`, **with no menu**. After Part 0 closes,
167
- render the ToC menu.
161
+ Then **route** per §Routing + menu in `_core.md`: render the **start
162
+ menu** (numbered, Part 0 the prologue as option 1, the recommended
163
+ first pick). The tester picks a part by number; that part's own
164
+ `preflight` (see §Entering a part) lays its fixture when it begins.
165
+ Part 0's demo fixture (the `demo-agent` + the demo `.skillmapignore`,
166
+ blocks below) is laid by its `taught-init` entry, not here.
168
167
 
169
- ## Fixture blocks (Part 0 / `taught-init`)
168
+ ## Fixture and state templates
169
+
170
+ The `findings.md` and `tutorial-state.yml` here are universal (written
171
+ in pre-flight); the `demo-agent.md` + the demo `.skillmapignore` are
172
+ Part 0's fixture (laid by its `taught-init` entry).
170
173
 
171
174
  `<provider_dir>/agents/demo-agent.md`:
172
175
  ```markdown
@@ -245,33 +248,39 @@ tutorial:
245
248
  provider: "<claude | agent-skills | antigravity>"
246
249
  tester:
247
250
  level: 2
251
+ parts: {} # filled in as the tester picks parts from the menu
252
+ findings_file: "./findings.md"
253
+ ```
254
+
255
+ When the tester picks a part from the menu, add its `parts.<id>`
256
+ entry the first time it starts, seeded from the manifest, e.g.:
257
+
258
+ ```yaml
248
259
  parts:
249
260
  fundamentals:
250
- status: "in_progress" # not_started | in_progress | done | declined
261
+ status: "in_progress" # not_started | in_progress | done | declined | skipped
251
262
  chapters:
252
263
  init: { status: "pending" } # pending | done | failed | skipped
253
264
  kinds: { status: "pending" }
254
- first-edit: { status: "pending" }
255
- connectors: { status: "pending" }
256
- inspector: { status: "pending" }
257
- edit-link: { status: "pending" }
258
- workspace: { status: "pending" }
259
- ignore: { status: "pending" }
260
- findings_file: "./findings.md"
265
+ # one row per chapter in the part's manifest entry
261
266
  ```
262
267
 
263
- When the tester enters another part from the menu, add a
264
- `parts.<id>` entry for it (with a `chapters` map seeded from the
265
- manifest) the first time it starts. Planned parts are not tracked
266
- until they have content.
268
+ Planned parts are not tracked until they have content. Parts the
269
+ `seed` mechanism fast-forwards past are recorded with `status:
270
+ "skipped"`.
267
271
 
268
272
  ## Entering a part
269
273
 
270
274
  When a part begins, honour its `preflight` from the manifest:
271
275
 
272
- - **`taught-init`** (Part 0): the fixture + `.skillmapignore` were
273
- pre-laid in pre-flight; the tester runs `sm init` inside the
274
- first chapter. Nothing to do here.
276
+ - **`taught-init`** (Part 0): silently, before the tester's `sm init`
277
+ in the `init` chapter, `Write` the demo fixture (the
278
+ `<provider_dir>/agents/demo-agent.md` boot node + the demo
279
+ `.skillmapignore`, both in the §Fixture blocks above), substituting
280
+ `<provider_dir>` per detection. Write `.skillmapignore` BEFORE the
281
+ tester runs `sm init` so the first scan never sees the tutorial's
282
+ own files (`sm init` only writes that file when absent). The tester
283
+ runs `sm init` themselves in the first chapter.
275
284
  - **`portfolio-init`** (Part 1 `project-kickoff`): the campaign's
276
285
  real project begins. Backstage, before the tester's `sm init` in
277
286
  the `kickoff` chapter: (1) if the prologue ran first in this dir,
@@ -337,11 +346,13 @@ and the part's `pace`.
337
346
 
338
347
  All three are specified in `_core.md`:
339
348
 
340
- - **Routing + menu**: §Routing + menu. The first-timer skips the
341
- menu and lands in Part 0; the menu (the ToC rendered from
342
- `_manifest.yml`, completed chapters ticked, `planned` parts hidden,
343
- `prereq` gating only the parts that have no `seed`) appears after a
344
- part closes or on resume.
349
+ - **Routing + menu**: §Routing + menu. The session always starts at
350
+ the **numbered start menu** (Part 0 is option 1, the recommended
351
+ first pick); the menu (the ToC from `_manifest.yml`, numbered,
352
+ completed parts ticked, `planned` parts hidden, `prereq` gating only
353
+ the parts that have no `seed`) is the entry point on the first
354
+ invocation and after every part closes / on resume. Render it with
355
+ the format in `_core.md` §Menu format.
345
356
  - **Resume / restart**: §Resume / restart. On start-over, the exact
346
357
  wipe list is whatever the tester's parts actually created:
347
358
  `tutorial-state.yml`, `findings.md`, `.skillmapignore`,
@@ -38,8 +38,11 @@ loanwords embedded in Spanish prose:
38
38
  - `connector` / `edge` → `conector` (**NEVER** `arista`, even
39
39
  though it is the common graph translation; skill-map's house
40
40
  word is `conector` everywhere).
41
- - `watcher` `observador` (or rephrase: "skill-map sigue tus
42
- cambios").
41
+ - `watcher` and `browser` stay **English**, do NOT translate them to
42
+ `observador` / `navegador`. They are words the tester reads in
43
+ skill-map's own UI and docs, keep them recognisable. If a bare
44
+ English noun reads oddly mid-sentence, rephrase ("skill-map sigue
45
+ tus cambios" instead of forcing "el watcher detecta...").
43
46
  - `scan` (verb) → `escanear`; `scan` (noun) → `escaneo`.
44
47
  - `node` → `nodo`; `link` → `enlace` or `vínculo`; `fixture` →
45
48
  `set de prueba`; `pre-flight` → `preparación inicial`;
@@ -49,10 +52,9 @@ loanwords embedded in Spanish prose:
49
52
  …), CLI verbs (`sm init`, `sm watch`), and code identifiers stay
50
53
  English, that's the public surface, not jargon.
51
54
 
52
- Anti-pattern (do NOT emit): "aparecen los otros tres kinds", "el
53
- watcher detectó el cambio", "vamos a hacer un scan ahora". Correct:
54
- "aparecen los otros tres tipos", "skill-map detectó el cambio",
55
- "vamos a escanear ahora". These translations apply to **chapter
55
+ Anti-pattern (do NOT emit): "aparecen los otros tres kinds", "vamos a
56
+ hacer un scan ahora". Correct: "aparecen los otros tres tipos", "vamos
57
+ a escanear ahora" (and `watcher` / `browser` stay as-is in English). These translations apply to **chapter
56
58
  titles** too: a `title` like `"First scan of the fixture"` is
57
59
  announced as `"Primer escaneo del set de prueba"`. Never emit a
58
60
  chapter title (or any tester-facing prose) in English while the
@@ -175,19 +177,24 @@ first kind quoted, the second kind never.
175
177
  the output or replies "OK" / "done". Only then advance.
176
178
  4. **Persist progress after every chapter.** Update the state file
177
179
  (`parts.<id>.chapters.<id>.status` = `done` / `failed` /
178
- `skipped` + a timestamp). Mirror the same status on the harness
179
- task via `TaskUpdate`; the harness list is the in-session view,
180
- the state file is the cross-session source of truth.
180
+ `skipped` + a timestamp). The state file is the ONLY progress
181
+ tracker. Do NOT create harness tasks (`TaskCreate` / `TaskUpdate`)
182
+ for tutorial progress, they clutter the tester's task list and add
183
+ nothing the state file does not already hold.
181
184
  5. **If the tester reports anything weird**, offer to record it in
182
185
  `findings.md` (in the cwd). Reactive, not proactive: only offer
183
186
  the findings log when the tester flags something, asks "is that
184
187
  normal?", or pastes an error. Never on a clean OK.
185
- 6. **One step at a time inside a chapter.** Finish a chapter (mark
186
- it `done`), then **auto-advance** to the next chapter's
187
- Announcement in the same response, unless the manifest entry is
188
- `pace: per-step` (then ask "¿seguimos?" between steps, as the
189
- fundamentals part does today). The continue-prompt at a **part
190
- boundary** routes back to the ToC menu.
188
+ 6. **The chapter's confirmation IS the go-ahead.** When the tester
189
+ confirms a chapter, mark it `done` and advance straight to the next
190
+ chapter's Announcement. NEVER ask a separate "¿seguimos?" / "shall
191
+ we continue?" between chapters, the per-chapter confirmation already
192
+ gates advancement and a second question is exactly the redundancy
193
+ testers complain about. The ONLY continue-prompt is at a **part
194
+ boundary**, where you route back to the ToC menu. (`pace` controls
195
+ batching only, see the per-step cycle: `per-step` walks one chapter
196
+ per exchange, `auto-advance` may chain chapters that need no tester
197
+ action; neither asks "¿seguimos?".)
191
198
  7. **If the state file already exists** when invoked, do not
192
199
  overwrite anything. Read it, show progress, offer to continue,
193
200
  pick another part, or start over (the last requires explicit
@@ -242,46 +249,87 @@ today. The detection wiring is here so mirrored skills at
242
249
 
243
250
  ## Per-step cycle (inside a chapter)
244
251
 
245
- When you enter a part, call `TaskCreate` once with one task per
246
- chapter in that part's `chapters` list. Update each to
247
- `in_progress` when its block begins and `completed` when it ends.
252
+ A **chapter is the unit of confirmation**. Walk it as ONE beat:
253
+ announce it, do the preparation, hand the tester everything they need
254
+ to do, and ask for confirmation **exactly once, at the end**. Do NOT
255
+ pepper a chapter with several "tell me when…" / "¿viste X?" prompts,
256
+ bundle the actions into a single instruction ("hacé A, después B, y
257
+ avisame cuando el mapa muestre …"). Split a chapter's confirmation
258
+ ONLY when a later action genuinely cannot start until the tester
259
+ finished an earlier one (e.g. they must have the browser open before
260
+ they can watch a node change), and even then keep it to the minimum.
261
+ Never call `TaskCreate` / `TaskUpdate` (Inviolable rule #4).
248
262
 
249
- For every step in a chapter:
263
+ For every chapter:
250
264
 
251
265
  1. **Announcement**: "Capítulo N: `<title>`. ~M min." then a blank
252
266
  line, then (optionally) one sentence of context on its own
253
267
  paragraph. `N` is the 1-based index of the chapter inside its
254
- part; it resets per part. The context paragraph renders ONLY
255
- when the source has a `**Context**:` field; if omitted, announce
256
- the title alone. The title comes from the chapter's `title` in
268
+ part; it resets per part. The context paragraph renders ONLY when
269
+ the source has a `**Context**:` field; if omitted, announce the
270
+ title alone. The title comes from the chapter's `title` in
257
271
  `_manifest.yml` (translated per §Tone), not the internal id.
258
- 2. **Preparation** (if applicable): create or modify files, show
259
- the path and a short preview.
260
- 3. **Commands to run**: a ` ```bash ` block.
261
- 4. **Pause**: "Run that and paste me the output (or say OK)."
262
- 5. **Verification**: read their reply. If something errored,
263
- suggest a fix before advancing. If fine, mark `done`. Honour the
264
- part's `pace`: `auto-advance` moves straight into the next
265
- chapter's Announcement; `per-step` asks "¿seguimos?" first.
272
+ 2. **Preparation** (if applicable): create or modify the fixture
273
+ files the chapter calls for (silently, per §Silence).
274
+ 3. **The tester's part**: the command block(s) and instructions,
275
+ bundled into one flow, closed by the single confirmation.
276
+ 4. **Verification**: read their reply. If something errored, suggest
277
+ a fix before advancing. If fine, mark `done` and move straight into
278
+ the next chapter's Announcement (the confirmation is the go-ahead,
279
+ Inviolable rule #6, NO "¿seguimos?"). `pace` only decides batching:
280
+ `per-step` presents one chapter per exchange, `auto-advance` may
281
+ chain chapters that need no tester action into one response.
266
282
 
267
283
  ## Routing + menu (orchestrator)
268
284
 
269
- - **No state (first-timer)**: enter the first `spine` part of
270
- lowest `order` (Part 0) at its chapter 1, **with no ToC** (the
271
- onboarding flow is a single continuous path; never expose the
272
- part split).
273
- - **After a part closes, or state exists**: render the **ToC menu**
274
- from `_manifest.yml`, parts in `order` with their chapters,
275
- completed chapters prefixed `✓ `. A part with a `seed` (the campaign
276
- parts) is **always shown**, even out of order: its `preflight: seed`
277
- fast-forwards the project into it (SKILL.md §Entering a part). A part
278
- with a `prereq` but NO `seed` (Part 7 `cli`) is shown only once its
279
- `prereq` is `done`. Parts with `status: planned` (no `step_file`) are
280
- NOT shown. Let the tester pick; walk that part; return to the menu
281
- when it ends.
282
- - **Adding content** is data-only: a new chapter in a part (or a
283
- new `part-<id>.md` + a manifest row). Keep chapter-id prefixes
284
- matching the file name so dispatch stays mechanical.
285
+ - **Always start at the menu.** On the first invocation (no state)
286
+ AND after any part closes / on resume, render the **start menu**:
287
+ the book ToC, numbered, and let the tester pick a part by number.
288
+ Part 0 (the prologue) is option 1, the recommended starting point,
289
+ so a brand-new tester just types `1`. Do NOT auto-enter a part; the
290
+ menu is the entry point every time. On later renders, prefix any
291
+ completed part's title with `✓ `.
292
+ - **Which parts to list**: parts in `order`, `status: active` only
293
+ (`planned` parts are hidden). A part with a `seed` (the campaign
294
+ parts) is always shown, even out of order, its `preflight: seed`
295
+ fast-forwards the project into it (SKILL.md §Entering a part). A
296
+ part with a `prereq` but NO `seed` (Part 7 `cli`) is shown only once
297
+ its `prereq` is `done`.
298
+ - **After the tester picks**: walk that part; when it ends, return to
299
+ this menu.
300
+ - **Adding content** is data-only: a new chapter in a part (or a new
301
+ `part-<id>.md` + a manifest row). Keep chapter-id prefixes matching
302
+ the file name so dispatch stays mechanical.
303
+
304
+ ### Menu format
305
+
306
+ Render the menu numbered and formatted (NOT a bare list), translated
307
+ to the tester's language. A one-line intro, then per part a **bold
308
+ numbered title line** (number + title + `(~M min)`) as plain prose,
309
+ immediately followed by a single-level `> ` blockquote one-line
310
+ description (what the part covers, derived from its title + chapters).
311
+ NO blank line between a title and its description; ONE blank line
312
+ between parts; NO outer blockquote around the whole menu. Close with a
313
+ short "¿Cuál?" / "Which one?" on its own line. Sample (Claude variant,
314
+ fill the parts and durations from `_manifest.yml`):
315
+
316
+ ```
317
+ ¿Por dónde querés arrancar? Podés volver al menú cuando termines cada parte.
318
+
319
+ **1. El mapa en vivo** (~12 min)
320
+ > El prólogo: corrés `sm`, abrís el browser y ves el mapa actualizarse en vivo mientras editás `.md`. Si es tu primera vez, empezá por acá.
321
+
322
+ **2. El proyecto desde cero** (~8 min)
323
+ > Arrancás un proyecto real (un portfolio) y su harness `.claude/`.
324
+
325
+ ¿Cuál?
326
+ ```
327
+
328
+ This menu is the ONE exception to the "wrap tester-facing prose in a
329
+ single blockquote" rule: the intro, the bold titles and the trailing
330
+ "¿Cuál?" are plain prose; only the description lines carry `> `. On
331
+ non-Claude hosts the `> ` collapses to plain prose, indent each
332
+ description two spaces so it stays subordinate to its title.
285
333
 
286
334
  ## Resume / restart
287
335
 
@@ -1,6 +1,6 @@
1
1
  # Part 0: The live map (prologue) - step library
2
2
 
3
- The live-UI prologue: the tester runs `sm init`, opens the browser, and watches the map update in real time as files are written and edited. `pace: per-step` (ask "¿seguimos?" between steps), `preflight: taught-init` (the tester runs `sm init` as the first taught step, not pre-flight), and the chapters lay the basics fixture progressively, one node at a time. Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
3
+ The live-UI prologue: the tester runs `sm init`, opens the browser, and watches the map update in real time as files are written and edited. `pace: per-step` (one chapter per exchange; the chapter's own confirmation advances to the next, NO separate "¿seguimos?"), `preflight: taught-init` (the tester runs `sm init` as the first taught step, not pre-flight), and the chapters lay the basics fixture progressively, one node at a time. Shared conventions (tone, provider detection / substitution, the `> ` rendering rule, the per-step cycle) live in `_core.md`; do not restate them here.
4
4
 
5
5
  ## Chapter `init` - Your first node (~2 min)
6
6
 
@@ -8,47 +8,25 @@ The live-UI prologue: the tester runs `sm init`, opens the browser, and watches
8
8
 
9
9
  ```bash
10
10
  sm init
11
- ls -la .skill-map/
11
+ sm
12
12
  ```
13
13
 
14
- Expected: `.skill-map/skill-map.db` appears (plus config files). The initial scan reports a small node / link / issue count from the demo-agent fixture, NOT 14+ phantom issues from the tutorial's own prose: pre-flight already wrote `.skillmapignore` with the right exclusions in place, so `sm init` leaves that file alone (it only writes when absent) and the scan never sees `sm-tutorial.md` / `findings.md` / `tutorial-state.yml`.
14
+ Expected: `.skill-map/skill-map.db` appears (plus config files), and the initial scan reports a small node / link count from the demo-agent fixture. `sm init` runs and exits; `sm` then starts the UI server and stays running. (Agent context, do not narrate: pre-flight's `.skillmapignore` keeps the tutorial's own files, `sm-tutorial.md` / `findings.md` / `tutorial-state.yml`, out of the scan; `sm init` leaves that file alone since it only writes when absent.)
15
15
 
16
- Before launching the server, ask the tester to set up a **side-by-side view** so they can watch the magic happen without alt-tabbing every step. Tell the tester:
16
+ Give the tester the whole flow in one message with ONE confirmation, do NOT pause for the `sm init` output separately. Don't hardcode the URL, the verb logs the bound `http://host:port` after listen. Tell the tester:
17
17
 
18
- > Now arrange your screen so the **browser** (where the **Map**
19
- > updates in real time) and **this chat** are both visible at once
20
- >, typical layout is browser on the left half, chat on the right
21
- > (or any split that lets you see both). The terminal running
22
- > `sm` can stay off to the side; it just prints scan progress
23
- > lines and you don't need to read them.
18
+ > First, **open your browser** and put it side by side with this
19
+ > chat (browser on one half, chat on the other, any split that lets
20
+ > you see both) so you can watch the **Map** update in real time.
24
21
  >
25
- > Tell me when you're set up and we start.
26
-
27
- Wait for confirmation before moving on. Once they're ready, prompt them to launch the server and open the link it prints, without hardcoding the URL here, since the verb itself is the source of truth (it logs the bound `http://host:port` after listen):
28
-
29
- > Run `sm`. After a couple of seconds it will print a line with the
30
- > URL where the UI is listening, copy that link and open it in the
31
- > browser you just arranged. Tell me when you see the page load.
32
-
33
- Wait for confirmation that the page loaded. Then tell the tester:
34
-
35
- > You'll see exactly **one node** in the **Map**: `demo-agent`
36
- > (kind `agent`). That's our starting point.
22
+ > Then, in your second terminal, run the two commands above: `sm
23
+ > init` sets the project up (it creates `.skill-map/` and runs a
24
+ > first scan), and `sm` boots the live UI. After a couple of seconds
25
+ > `sm` prints a URL, copy it and open it in your browser. The
26
+ > terminal keeps printing scan lines, you don't need to read them.
37
27
  >
38
- > The workspace opens **map-first**: the canvas fills the screen and
39
- > the **Files** panel sits collapsed against the left edge. Click the
40
- > expand handle on the far left (the `>` arrow, its tooltip reads
41
- > "Expand files panel") to open it.
42
- >
43
- > Now walk the two views before we go on:
44
- > 1. **Map**: the single agent node on the canvas.
45
- > 2. **Files**: one row, with path / kind / metadata.
46
- >
47
- > Then, back in **Map**, click the node: the **Inspector** panel
48
- > slides out with its frontmatter (the YAML block at the top of
49
- > every `.md`, between the two `---` lines) and its links.
50
- >
51
- > Did the node show up?
28
+ > You'll see one node in the **Map**: `demo-agent`. Tell me when the
29
+ > page is open showing it.
52
30
 
53
31
  Wait for confirmation. Mark `init`: done.
54
32
 
@@ -149,7 +127,7 @@ Create these four files (with `Write`), exactly in this order. Per §Provider de
149
127
  Tell the tester:
150
128
 
151
129
  > Look at the browser. Four new nodes should have popped in:
152
- > `demo-skill`, `demo-command`, `notes/todo`, and `demo-guideline`.
130
+ > `demo-skill`, `demo-command`, **Demo TODO list**, and `demo-guideline`.
153
131
  > Five total now, **still unconnected**: they're floating dots.
154
132
  > The viewport auto-fits whenever a node is added or removed, so
155
133
  > all five should be visible without panning.
@@ -182,11 +160,6 @@ Tell the tester:
182
160
  > the field you'll edit next, so leave the card open and the
183
161
  > change will be obvious.
184
162
  >
185
- > ⚠ Heads-up: the inspector header shows a couple of action
186
- > buttons (**Bump version**, **Refresh body**). **Don't click
187
- > them yet**, they write files to your project and we cover that
188
- > flow deliberately in the annotations chapter. For now, just look.
189
- >
190
163
  > Now open `.claude/agents/demo-agent.md` in your editor of
191
164
  > choice. In the **frontmatter** at the top of the file, change
192
165
  > the `description:` field to any text you want, the actual
@@ -210,9 +183,9 @@ You edit `notes/todo.md` so it becomes the **hub** that points to each of the ot
210
183
  - a `/slash` token → kind `invokes`
211
184
  - a markdown link `[text](path)` → kind `references`
212
185
 
213
- Four bullets, three kinds (the `invokes` kind shows up twice because both the command and the skill are addressed by slash).
186
+ Five bullets, three kinds: `invokes` and `mentions` each appear twice, `references` once. The last two bullets both point at the **same** node (`demo-guideline`), on purpose: a markdown link AND an `@`-mention of it, so the next beat can contrast their confidence (the file link is certain, the name drop is a softer guess).
214
187
 
215
- Apply with `Edit` on `notes/todo.md` (do not rewrite the file). Per §Provider detection, **substitute `.claude/` with the detected `<provider_dir>` and drop any bullet whose target node was not created in the `kinds` chapter** (on `agent-skills` / Antigravity there is no agent and no command → skip the `@demo-agent` and `/demo-command` bullets, two connectors land).
188
+ Apply with `Edit` on `notes/todo.md` (do not rewrite the file). Per §Provider detection, **substitute `.claude/` with the detected `<provider_dir>` and drop any bullet whose target node was not created in the `kinds` chapter** (on `agent-skills` / Antigravity there is no agent and no command → skip the `@demo-agent` and `/demo-command` bullets; the `@demo-guideline` mention stays and is the faint connector on those providers too).
216
189
 
217
190
  **Edit `notes/todo.md`**: append these bullets after the `# Pending` heading:
218
191
 
@@ -222,32 +195,34 @@ Apply with `Edit` on `notes/todo.md` (do not rewrite the file). Per §Provider d
222
195
  - [ ] Trigger /demo-skill when the input lands.
223
196
  - [ ] Re-read the
224
197
  [demo-guideline](./demo-guideline.md) before shipping.
198
+ - [ ] Ping @demo-guideline if the conventions change.
225
199
  ```
226
200
 
227
201
  Tell the tester:
228
202
 
229
- > Look at the magic again. `notes/todo` is now the hub: four
230
- > arrows light up between it and the other nodes, and the UI
231
- > palette colours each arrow by the link kind it carries:
203
+ > Look at the magic again. **Demo TODO list** is now the hub: five
204
+ > arrows light up between it and the other nodes, and the UI palette
205
+ > colours each arrow by the link kind it carries:
232
206
  >
233
- > - `notes/todo → demo-agent` (kind: `mentions`)
234
- > - `notes/todo → demo-command` (kind: `invokes`)
235
- > - `notes/todo → demo-skill` (kind: `invokes`)
236
- > - `notes/todo → demo-guideline` (kind: `references`)
207
+ > - `Demo TODO list → demo-agent` (kind: `mentions`)
208
+ > - `Demo TODO list → demo-command` (kind: `invokes`)
209
+ > - `Demo TODO list → demo-skill` (kind: `invokes`)
210
+ > - `Demo TODO list → demo-guideline` (kind: `references`, the markdown link)
211
+ > - `Demo TODO list → demo-guideline` (kind: `mentions`, the @ handle)
237
212
  >
238
213
  > The kind comes from the syntax in the bullet: an `@handle` is
239
- > always a mention, a `/command` is always an invoke, a markdown
240
- > link is always a reference. Four arrows, three kinds, three
241
- > colours on the canvas (the two `invokes` share a colour, as you
242
- > would expect).
214
+ > always a mention, a `/skill` or `/command` is always an invoke, a
215
+ > markdown link is always a reference. Five arrows, three kinds.
243
216
  >
244
- > Notice too that the connectors have different transparency.
245
- > Skill-map estimates how sure it is of each connection: a
246
- > `[text](file.md)` that points at a real file (confidence 1.00,
247
- > now that the target exists) looks solid, while an `@handle` that
248
- > resolves to no node sits at 0.5 (ambiguous) and looks
249
- > translucent. The opacity tells that story at a glance: the more
250
- > solid the arrow, the more reliable the inference.
217
+ > Now look closely: the two arrows to **demo-guideline** are not
218
+ > equally solid. Skill-map draws each connector's **confidence** as
219
+ > opacity, how sure it is the link is real. The markdown link
220
+ > `[demo-guideline](./demo-guideline.md)` points at a real file, so
221
+ > it's certain (1.00) and looks solid; the `@demo-guideline` mention
222
+ > is a looser name drop, a softer guess (0.50), so it's drawn fainter.
223
+ > A glance at the map tells you which links are rock solid and which
224
+ > are skill-map's best guess; the exact number per link is in the
225
+ > inspector, next chapter.
251
226
  >
252
227
  > Confirm when you see it. If a connector is missing, refresh the
253
228
  > browser and let me know.
@@ -258,25 +233,27 @@ If a connector is missing, do not advance, the next chapter inspects the same hu
258
233
 
259
234
  The connector opacity tells the confidence story at a glance; the exact per-link breakdown lives in the Inspector. Open it on the hub so the tester registers the surface before the `edit-link` chapter changes topology.
260
235
 
261
- > 🆕 Open the Inspector for `notes/todo` (click the node on the
262
- > map). Scroll down to the **Linked nodes** panel: it has two
263
- > sections, **Outgoing** and **Incoming**. `notes/todo` lists 4
264
- > links under Outgoing (it's the hub pointing at four nodes) and 0
265
- > under Incoming; if you open the Inspector for any of the four
266
- > targeted nodes, you'll see 1 under Incoming. Each row shows the
267
- > link kind (`mentions`, `invokes`, `references`) and a badge with
268
- > its confidence: the numeric value (`1.00`, `0.50`, ).
236
+ > 🆕 Open the Inspector for **Demo TODO list** (click the node on
237
+ > the map). **Expand** the **Connections** section (it's collapsed
238
+ > by default): it has two sections, **Outgoing** and **Incoming**.
239
+ > Demo TODO list lists **5 links** under Outgoing (the hub) and 0
240
+ > under Incoming; open the Inspector for a targeted node to see its
241
+ > Incoming count (demo-guideline shows **2**, the reference plus the
242
+ > mention; the others 1 each). Each row shows the link kind
243
+ > (`mentions`, `invokes`, `references`) and a badge with its
244
+ > confidence: the numeric value. Here you'll see the contrast in
245
+ > numbers, the `references` to demo-guideline reads `1.00`, the
246
+ > `mentions` of it reads `0.50`.
247
+ >
248
+ > 💡 Tip: if all these changes left the nodes crowded together, the
249
+ > map toolbar has a **Re-arrange layout** button (tooltip "Re-arrange
250
+ > the visible nodes"): it tidies the layout so everything reads
251
+ > better. If you've moved nodes by hand it asks for confirmation
252
+ > first, otherwise it just re-arranges.
269
253
  >
270
254
  > Let me know when you see it.
271
255
 
272
- After the tester confirms, drop this tip:
273
-
274
- > 💡 Tip: if all these changes left the nodes crowded together,
275
- > the map toolbar has a **Reset layout** button: it re-runs the
276
- > auto-layout so everything reads better. It asks for confirmation
277
- > because it discards any positions you moved by hand.
278
-
279
- Wait for confirmation. Mark `inspector`: done.
256
+ Mark `inspector`: done.
280
257
 
281
258
  ## Chapter `edit-link` - Edit a link, the topology changes (~3 min)
282
259
 
@@ -288,7 +265,7 @@ The server has been live since the `init` chapter, leave it running; this chapte
288
265
  > delete the bullet that contains `@demo-agent`. Save. Watch the
289
266
  > UI.
290
267
  >
291
- > Expected: the `notes/todo → demo-agent` connector (kind:
268
+ > Expected: the `Demo TODO list → demo-agent` connector (kind:
292
269
  > `mentions`) disappears in real time. The two nodes stay in the
293
270
  > **Map**; only the edge goes.
294
271
 
@@ -296,19 +273,18 @@ You verify by reading `notes/todo.md` to confirm the change was applied. (On `ag
296
273
 
297
274
  ## Chapter `workspace` - Navigate the workspace (files, search, isolate) (~2 min)
298
275
 
299
- **Context**: you've built the graph and understood it; this beat is about *moving around* it. The workspace has two halves: the **Map** you've been working in, and a **Files** panel, a folder tree of every node. You'll open that tree, filter it with the search box, and use **isolate** to collapse the map down to a single node and the things it touches. No file edits here, pure navigation, and the same `sm` session you booted back in the `init` chapter is still running.
276
+ **Context**: you've built the graph and understood it; this beat is about *moving around* it. The workspace has two halves: the **Map** you've been working in, and a **Files** panel, a folder tree of every node. You'll open that tree and filter it with the search box. No file edits here, pure navigation, and the same `sm` session you booted back in the `init` chapter is still running.
300
277
 
301
278
  Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer nodes (`demo-skill` plus the two `notes/` files), so swap the node names below for ones that exist in that set; the gestures are identical.
302
279
 
303
280
  **Beat 1, open the Files panel (tester does this).**
304
281
 
305
- > Make sure the **Files** panel is open, the one you expanded back
306
- > in the first chapter on the left edge. If you collapsed it since,
307
- > click the expand handle (the `>` arrow, tooltip "Expand files
308
- > panel") to reopen it. The sidebar shows a **folder tree** (a
309
- > nested view of your folders and the nodes inside them): your five
310
- > nodes grouped under `.claude/` and `notes/`, each row showing its
311
- > kind and how many links go in and out.
282
+ > Open the **Files** panel. It sits collapsed against the left edge
283
+ > by default: click the expand handle there (the `>` arrow, its
284
+ > tooltip reads "Expand files panel"). The sidebar opens into a
285
+ > **folder tree** (a nested view of your folders and the nodes inside
286
+ > them): your five nodes grouped under `.claude/` and `notes/`, each
287
+ > row showing its kind and how many links go in and out.
312
288
  >
313
289
  > Tell me when the tree is open.
314
290
 
@@ -318,27 +294,26 @@ Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer
318
294
  > `Search…`). Type `guideline`. Watch both halves at once: the tree
319
295
  > narrows down to `demo-guideline` and the **Map** drops every node
320
296
  > except `demo-guideline`. The search matches a node's name, path,
321
- > tags or description, and filters live as you type, no Enter
322
- > needed.
297
+ > or description, and filters live as you type, no Enter needed.
323
298
  >
324
299
  > Now clear the box. All five nodes come back, in both the tree and
325
300
  > the Map. Confirm you saw it filter and then restore.
326
301
 
327
302
  **Beat 3, isolate (tester does this).**
328
303
 
329
- > Last one. In the tree, find the `notes/todo` row: at its right
330
- > edge there's a small **sitemap** icon (its tooltip reads "Isolate
331
- > this node and its direct links on the map"). Click it.
304
+ > Last one. In the tree, find the **Demo TODO list** row: at its
305
+ > right edge there's a small **sitemap** icon (its tooltip reads
306
+ > "Isolate this node and its direct links on the map"). Click it.
332
307
  >
333
- > The Map collapses to `notes/todo` plus only the nodes it links to
334
- > (`demo-command`, `demo-skill`, `demo-guideline`). `demo-agent`,
335
- > which lost its only connector back in the last step, drops out of
336
- > view, and the Inspector opens on `notes/todo`. That's how you
308
+ > The Map collapses to **Demo TODO list** plus only the nodes it
309
+ > links to (`demo-command`, `demo-skill`, `demo-guideline`).
310
+ > `demo-agent`, which lost its only connector back in the last step,
311
+ > drops out of view, and the Inspector opens on **Demo TODO list**.
312
+ > That's how you
337
313
  > focus on one node's neighborhood when a map gets busy.
338
314
  >
339
315
  > To bring the rest back, look at the toolbar along the bottom of
340
- > the Map: there's a **Show all** button (an eye icon, tooltip
341
- > "Clear the map selection and show every node again"). Click it and
316
+ > the Map: there's a **Show all** button (an eye icon). Click it and
342
317
  > all five nodes return.
343
318
  >
344
319
  > Did the map isolate and then restore?
@@ -369,7 +344,7 @@ description: |
369
344
  API_TOKEN: example-not-real
370
345
  ```
371
346
 
372
- Confirm the file appears in the map as a sixth node (`notes/private-credentials`). The watcher sees it like any other `.md`, that's the point of the demo.
347
+ Confirm the file appears in the map as a sixth node (`notes/private-credentials`). The watcher sees it like any other `.md`, that's the point of the demo. (If the tester doesn't see it, they may need to click **Show all** in the map toolbar to clear any leftover selection.)
373
348
 
374
349
  **Beat 2, you show the project structure (the agent does this).**
375
350
 
@@ -403,14 +378,19 @@ Adjust the actual tree shown to whatever `ls -la` returns, the goal is "tester r
403
378
 
404
379
  Per Inviolable rule #2, the agent does NOT touch `.skillmapignore` with your `Edit` tool. Tell the tester to do it from their editor:
405
380
 
406
- > Last step. Open `.skillmapignore` (it's at the cwd root) in
407
- > your editor of choice. At the end of the file, on a new line,
408
- > append the literal pattern `notes/private-*.md`. Save the
409
- > file. The pattern uses a glob (same as `.gitignore`):
381
+ > Last step. Open `.skillmapignore` (it's at the cwd root) in your
382
+ > editor of choice. At the end of the file, on a new line, append
383
+ > this pattern:
384
+
385
+ ```
386
+ notes/private-*.md
387
+ ```
388
+
389
+ > Save the file. It's a glob (same as `.gitignore`):
410
390
  > `notes/private-*.md` matches `private-credentials.md` and any
411
391
  > future sibling `private-*.md`. A literal path
412
- > (`notes/private-credentials.md`) would also work, the glob
413
- > teaches the broader habit.
392
+ > (`notes/private-credentials.md`) would also work, the glob teaches
393
+ > the broader habit.
414
394
  >
415
395
  > Watch the browser when you save. The
416
396
  > `notes/private-credentials` node should disappear from the