@skill-map/cli 0.59.0 → 0.60.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.
Files changed (43) hide show
  1. package/dist/cli/tutorial/sm-tutorial/SKILL.md +12 -5
  2. package/dist/cli/tutorial/sm-tutorial/references/fixtures.md +15 -4
  3. package/dist/cli/tutorial/sm-tutorial/references/part-cli.md +3 -3
  4. package/dist/cli/tutorial/sm-tutorial/references/part-connect-harness.md +19 -15
  5. package/dist/cli/tutorial/sm-tutorial/references/part-daily-loop.md +4 -2
  6. package/dist/cli/tutorial/sm-tutorial/references/part-fundamentals.md +59 -44
  7. package/dist/cli/tutorial/sm-tutorial/references/part-project-kickoff.md +18 -0
  8. package/dist/cli.js +160 -76
  9. package/dist/index.js +3 -3
  10. package/dist/kernel/index.d.ts +20 -0
  11. package/dist/kernel/index.js +3 -3
  12. package/dist/ui/chunk-4N3NRZEH.js +809 -0
  13. package/dist/ui/chunk-5SSKJ7AM.js +1 -0
  14. package/dist/ui/{chunk-WB7FKIBP.js → chunk-7VUEZZFJ.js} +1 -1
  15. package/dist/ui/{chunk-P2DAPRK7.js → chunk-7X3DZNG4.js} +1 -1
  16. package/dist/ui/chunk-AKKFFP7Y.js +1 -0
  17. package/dist/ui/chunk-F7TCJIHA.js +1843 -0
  18. package/dist/ui/{chunk-JA4Z74I3.js → chunk-FRUHVCND.js} +1 -1
  19. package/dist/ui/{chunk-K2MAVAHG.js → chunk-GKQA75EF.js} +1 -1
  20. package/dist/ui/chunk-HQ6M2HXK.js +369 -0
  21. package/dist/ui/chunk-JRVAI7GI.js +2 -0
  22. package/dist/ui/chunk-JTCIY3SL.js +742 -0
  23. package/dist/ui/chunk-MBBJJEUX.js +917 -0
  24. package/dist/ui/{chunk-LCOYSPKE.js → chunk-MGWGV4VD.js} +1 -1
  25. package/dist/ui/chunk-N6MUHKWR.js +105 -0
  26. package/dist/ui/chunk-OGXBHDY4.js +1 -0
  27. package/dist/ui/{chunk-KHARMPTZ.js → chunk-OVVTCPBJ.js} +1 -1
  28. package/dist/ui/{chunk-UBQUCSQ4.js → chunk-Q4PXVDJA.js} +1 -1
  29. package/dist/ui/chunk-X7FXLWQA.js +3 -0
  30. package/dist/ui/chunk-ZYPXVXYF.js +4 -0
  31. package/dist/ui/index.html +1 -1
  32. package/dist/ui/main-UJBBRSBH.js +4 -0
  33. package/package.json +2 -2
  34. package/dist/ui/chunk-BCEJCDZB.js +0 -3
  35. package/dist/ui/chunk-DPLNM4UD.js +0 -2
  36. package/dist/ui/chunk-G3ZVF4TM.js +0 -1
  37. package/dist/ui/chunk-H6O2DYVT.js +0 -1110
  38. package/dist/ui/chunk-KJZQIUZA.js +0 -917
  39. package/dist/ui/chunk-Q2A6FWC7.js +0 -4
  40. package/dist/ui/chunk-QVNZN5F7.js +0 -1843
  41. package/dist/ui/chunk-SXXFDP6V.js +0 -1
  42. package/dist/ui/chunk-YHJL5LP3.js +0 -913
  43. package/dist/ui/main-PHRAKC4A.js +0 -4
@@ -394,11 +394,18 @@ When a part begins, honour its `preflight` from the manifest:
394
394
  (`node_modules/`, `public/`) are appended to the universal
395
395
  `.skillmapignore` pre-flight already wrote, so the tutorial's own
396
396
  `.claude/skills/sm-tutorial/` files stay out of the scan even on a
397
- direct jump here. Then run `sm init` if `.skill-map/` is missing
398
- (it will not overwrite that `.skillmapignore`), then `sm scan` so
399
- the map reflects the seeded harness. Mark the skipped
400
- predecessor campaign parts `skipped` in the state (they stay in the
401
- menu for later). Then emit exactly ONE tester-facing line:
397
+ direct jump here. Then provision the DB if `.skill-map/` is missing,
398
+ with the **non-interactive lens recipe**: the seeded portfolio has
399
+ BOTH a root `AGENTS.md` (an `openai` marker) and `.claude/` (a
400
+ `claude` marker), so a plain `sm init` would stop on the
401
+ `⚠ Multiple provider markers detected` prompt with no tester to
402
+ answer it. Instead run `sm init --no-scan` (skips first-scan
403
+ detection, never prompts; it will not overwrite that
404
+ `.skillmapignore`), then `sm config set activeProvider claude`, then
405
+ `sm scan` so the map reflects the seeded harness under the claude
406
+ lens. (If `.skill-map/` already exists, just `sm scan`.) Mark the
407
+ skipped predecessor campaign parts `skipped` in the state (they stay
408
+ in the menu for later). Then emit exactly ONE tester-facing line:
402
409
 
403
410
  > I set the project up to where this part begins, so you can start
404
411
  > here. The earlier parts that build up to this are still in the
@@ -163,13 +163,22 @@ No frontmatter: a real handbook is plain prose (this repo's own
163
163
  `name:` that differs from the filename only confuses the tester. The
164
164
  node displays by its path, `AGENTS.md`.
165
165
 
166
+ **No backtick-wrapped relative `.md` paths in the body either.**
167
+ `core/backtick-path` (Decision #127) turns a `` `docs/STYLE.md` `` written
168
+ inside a code span into a `points` link, and at kickoff (before the
169
+ `docs/` files exist) that link lands as a broken reference, which would
170
+ break the "one lonely node" beat the `kickoff` chapter promises. Name the
171
+ docs in prose (the style guide, the deploy runbook), never as backticked
172
+ paths. They become real nodes in the `real-kinds` chapter and are wired
173
+ in explicitly in Part 2.
174
+
166
175
  ```markdown
167
176
  # Portfolio handbook
168
177
 
169
178
  A small static portfolio site, served by Express (`server.js`). The
170
179
  `.claude/` harness maintains it: an agent writes the pages, a skill
171
- checks the links, a command publishes. The conventions live in
172
- `docs/STYLE.md`; the deploy steps in `docs/DEPLOY.md`.
180
+ checks the links, a command publishes. The conventions live in the
181
+ style guide; the deploy steps in the deploy runbook.
173
182
  ```
174
183
 
175
184
  ### File: `server.js` (not scanned; runnable scaffolding)
@@ -255,8 +264,10 @@ have at the END of the part just before the one being entered.
255
264
 
256
265
  NOT cumulative and NOT the portfolio: this is the **Part 0 demo
257
266
  fixture**, the six standalone demo nodes with `notes/todo` wired as the
258
- hub, the clean state (`✓ No issues`) at the end of the prologue's
259
- connector chapters. Part 5 only reads it. Because it is a different
267
+ hub, the state at the end of the prologue's connector chapters: five hub
268
+ links, one of them (`@demo-guideline`, a bare mention that resolves to no
269
+ agent) a deliberate broken reference that `sm check` reports as a single
270
+ `reference-broken` error. Part 5 only reads it. Because it is a different
260
271
  fixture from the portfolio, entry first resets any portfolio on disk
261
272
  (see SKILL.md §Entering a part, the `cli` case).
262
273
 
@@ -13,7 +13,7 @@ sm show .claude/skills/demo-skill/SKILL.md
13
13
  sm check
14
14
  ```
15
15
 
16
- Expected: you see the 6 fixture nodes listed with their kind: `demo-skill` (skill), `demo-agent` (agent), `demo-command` (command), `notes/todo` (`markdown`, the catch-all per the `kinds` chapter), and the two guideline notes `notes/demo-guideline` and `notes/demo-guideline2` (both `markdown`, the hub's confidence pair: a faint `mentions` at 0.50 and a resolved `references` at 1.00). `check` reads the persisted `scan_issues` table, it does NOT re-walk the filesystem. The fixture is clean (the connector / inspector chapters captured the latest state before Ctrl+C), so the verb prints `✓ No issues`. We will plant one in the `issues` chapter and watch the rule catch it after a fresh `sm scan`.
16
+ Expected: you see the 6 fixture nodes listed with their kind: `demo-skill` (skill), `demo-agent` (agent), `demo-command` (command), `notes/todo` (`markdown`, the catch-all per the `kinds` chapter), and the two guideline notes `notes/demo-guideline` and `notes/demo-guideline2` (both `markdown`, the hub's resolution pair: a broken `mentions` at 0.50 and a resolved `references` at 1.00). `check` reads the persisted `scan_issues` table, it does NOT re-walk the filesystem. The prologue fixture carries one deliberate broken reference (the bare `@demo-guideline` mention from the `connectors` chapter resolves to no agent), so `sm check` reports `1 error` (`reference-broken` on `notes/todo.md`), NOT `✓ No issues`. The `issues` chapter plants a SECOND broken ref and watches the rule catch it after a fresh `sm scan`.
17
17
 
18
18
  Mark `browse`: done.
19
19
 
@@ -33,7 +33,7 @@ Mark `graph-export`: done.
33
33
 
34
34
  ## Chapter `issues` - Issues and broken refs (--analyzers, --json) (~3 min)
35
35
 
36
- `reference-broken` is one of the deterministic rules `sm check` runs. We'll plant one and watch it surface, that's the easiest way to internalise that it is an **issue** on a node, NOT a connector and NOT the same thing as an "orphan".
36
+ `reference-broken` is one of the deterministic rules `sm check` runs. The hub already carries one broken reference from the prologue (the bare `@demo-guideline` mention that resolves to no agent); we'll plant a second, an explicit markdown link to a missing file, and watch the rule catch it too, that's the easiest way to internalise that it is an **issue** on a node, NOT a connector and NOT the same thing as an "orphan".
37
37
 
38
38
  > ℹ️ `reference-broken` is one of ~16 built-in rules. Others surface
39
39
  > different families: `core/name-reserved` (a file shadows a vendor
@@ -61,7 +61,7 @@ sm check --analyzers reference-broken
61
61
  sm check --json
62
62
  ```
63
63
 
64
- Expected: the error surfaces the dangling link from `notes/todo.md` to the non-existent `missing-page.md`. The `--analyzers` filter lets you focus on a single issue type; `--json` emits the structured payload (useful for CI / scripting). When done, the tester can leave the bullet in place or delete it, the rest of the deep-dive doesn't depend on it.
64
+ Expected: `sm check` now reports **2 errors**, both `reference-broken` on `notes/todo.md`, the pre-existing `@demo-guideline` mention from the prologue plus the freshly planted `[flow diagram](./missing-page.md)` you just added (the dangling markdown link to the non-existent `missing-page.md`). The `--analyzers reference-broken` filter narrows `sm check` to a single rule (still both rows here, since both are that rule); `--json` emits the structured payload (useful for CI / scripting). When done, the tester can leave the bullet in place or delete it, the rest of the deep-dive doesn't depend on it.
65
65
 
66
66
  Mark `issues`: done.
67
67
 
@@ -140,16 +140,17 @@ Wait for confirmation. You MAY use `Read` on the two files afterwards to verify
140
140
 
141
141
  ## Chapter `confidence` - How sure is each link (~3 min)
142
142
 
143
- **Context**: skill-map estimates 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 faint, low-confidence case is the one the tester met in the prologue (the bare `@demo-guideline` mention that had nothing to resolve to). 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.
143
+ **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.
144
144
 
145
145
  No file edits in this chapter, pure observation on the graph the tester just built.
146
146
 
147
147
  Tell the tester:
148
148
 
149
149
  > Last beat of this part: how sure is skill-map about each connection?
150
- > It estimates a **confidence** for every link and draws it as opacity:
151
- > the surer a connection is real, the more solid the arrow; the less
152
- > sure, the more translucent.
150
+ > It records a **confidence** for every link and draws it as opacity:
151
+ > a link that resolves to a real node is solid (**1.00**), a link that
152
+ > does not lands fainter, so a glance at the **Map** separates the
153
+ > solid wiring from the problem links.
153
154
  >
154
155
  > Open the Inspector for the `publish` node (click it on the **Map**).
155
156
  > Scroll down to the **Connections** panel and read the **Outgoing**
@@ -164,18 +165,21 @@ Tell the tester:
164
165
  >
165
166
  > Your whole harness reads solid because every link lands on a real
166
167
  > node, that is what a clean, fully wired graph looks like. So what
167
- > does a *low*-confidence connector look like? You saw one back in the
168
- > prologue: `@demo-guideline` was a bare `@`-mention pointing at a
169
- > note, and a bare `@handle` only firmly resolves to an agent, so it
170
- > had nothing to land on and stayed a soft guess at **0.50**, drawn
171
- > translucent. The fix there was one character: `@demo-guideline2.md`,
172
- > the same handle plus a `.md`, resolved to the real file and jumped to
173
- > **1.00**.
168
+ > does a link that does NOT resolve look like? You saw one back in the
169
+ > prologue: `@demo-guideline` was a bare `@`-mention, and a bare
170
+ > `@handle` only resolves to an agent. `demo-guideline` is a note, so
171
+ > it had nothing to land on: skill-map drew no arrow and flagged it as
172
+ > a **broken reference**, its confidence knocked down to **0.50** by
173
+ > the broken penalty. The fix there was one character:
174
+ > `@demo-guideline2.md`, the same handle plus a `.md`, resolved to the
175
+ > real file and drew a solid arrow at **1.00**.
174
176
  >
175
- > The number is the certainty, and the opacity on the canvas is just
176
- > that number drawn as transparency: a glance at the **Map** tells you
177
- > which connections are rock solid and which are skill-map's best
178
- > guess.
177
+ > So confidence here is really about resolution: **1.00** for a link
178
+ > that lands on a real node, **0.50** for one flagged broken. There is
179
+ > a third rung, **0.10**, for a link that resolves to a real file the
180
+ > runtime would ignore (a reserved name); you meet that one in the
181
+ > daily-loop part. The opacity on the canvas is just that number drawn
182
+ > as transparency.
179
183
  >
180
184
  > Do you see every badge reading 1.00 in the Inspector?
181
185
 
@@ -330,8 +330,10 @@ sm check
330
330
  > ```
331
331
  >
332
332
  > That is the `reference-broken` analyzer: a link whose target no longer exists.
333
- > On the Map the `publish → docs/DEPLOY.md` arrow has gone faint. `sm check` runs
334
- > the full analyzer catalogue (around a dozen rules); to narrow it to one rule:
333
+ > On the Map the `publish → docs/DEPLOY.md` arrow has disappeared: a broken link
334
+ > resolves to no node, so skill-map stops drawing it and flags the `publish` card
335
+ > with a red error instead. `sm check` runs the full analyzer catalogue (around a
336
+ > dozen rules); to narrow it to one rule:
335
337
 
336
338
  ```bash
337
339
  sm check --analyzers reference-broken
@@ -32,7 +32,7 @@ Wait for confirmation. Mark `init`: done.
32
32
 
33
33
  ## Chapter `kinds` - The other kinds appear (~1 min)
34
34
 
35
- Leave the browser open and the terminal with `sm` running. You create five more nodes **without any cross-fixture links** yet, pure standalone nodes, so the tester sees five new dots pop in. Three new **kinds** show up in this step (skill, command, markdown); the last two files are sibling `markdown` notes (`demo-guideline`, `demo-guideline2`) the hub in the `connectors` chapter reaches two ways, a faint mention that can't resolve and the same handle plus `.md` that resolves to a real file.
35
+ Leave the browser open and the terminal with `sm` running. You create five more nodes **without any cross-fixture links** yet, pure standalone nodes, so the tester sees five new dots pop in. Three new **kinds** show up in this step (skill, command, markdown); the last two files are sibling `markdown` notes (`demo-guideline`, `demo-guideline2`) the hub in the `connectors` chapter reaches two ways, a bare mention that resolves to nothing (which lands as a broken reference, no arrow drawn) and the same handle plus `.md` that resolves to a real file (a solid arrow).
36
36
 
37
37
  Create these five files (with `Write`), exactly in this order. Per §Provider detection, **substitute `.claude/` with the detected `<provider_dir>` and skip files whose kind is not in the provider's supported set** (`agent-skills` / Antigravity: skip both `demo-agent` and `demo-command`, only the skill + the three markdown notes remain). Adjust the node count, the "five new nodes" message, and the file list shown to the tester in the sample below accordingly:
38
38
 
@@ -87,15 +87,17 @@ Create these five files (with `Write`), exactly in this order. Per §Provider de
87
87
  ```
88
88
 
89
89
  4. `notes/demo-guideline.md`, second `kind: markdown` node, reached
90
- in the `connectors` chapter by a bare `@`-mention that can't
91
- resolve, so it stays skill-map's faintest connector:
90
+ in the `connectors` chapter by a bare `@`-mention that resolves to
91
+ no agent, so it surfaces as a broken reference instead of a drawn
92
+ connector:
92
93
  ```markdown
93
94
  ---
94
95
  name: demo-guideline
95
96
  description: |
96
97
  Static reference notes the rest of the demo points at. The hub
97
- reaches it with a bare `@`-mention, which stays a faint guess
98
- (0.50) because it can't resolve to a known entity.
98
+ reaches it with a bare `@`-mention, which resolves to no agent,
99
+ so skill-map flags it as a broken reference (0.50) instead of
100
+ drawing an arrow.
99
101
  ---
100
102
 
101
103
  # Demo Guideline
@@ -187,9 +189,9 @@ You edit `notes/todo.md` so it becomes the **hub** that points to each of the ot
187
189
  - an `@handle.md` token (a `@` handle that ends in a file extension) → kind `references`
188
190
  - a `/slash` token → kind `invokes`
189
191
 
190
- Five bullets, three kinds: `invokes` and `mentions` each appear twice, `references` once. The last two bullets are the confidence lesson: a bare `@demo-guideline` mention (which can't resolve, so it stays a faint guess) next to `@demo-guideline2.md`, the same handle shape plus a `.md` extension that points at a real sibling file (so it resolves and lands certain). Two separate nodes, two clearly different confidences.
192
+ Five bullets, three kinds: `invokes` and `mentions` each appear twice, `references` once. The last two bullets are the resolution lesson: a bare `@demo-guideline` mention (which resolves to no agent, so it lands as a broken reference and draws no arrow) next to `@demo-guideline2.md`, the same handle shape plus a `.md` extension that points at a real sibling file (so it resolves and draws a solid arrow). Two separate nodes, one broken and one resolved. Five bullets but only four arrows on the canvas.
191
193
 
192
- 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 two guideline bullets stay, so the confidence contrast, faint mention 0.50 vs resolved reference 1.00, is intact on those providers too).
194
+ 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 two guideline bullets stay, so the resolution contrast, broken mention 0.50 (no arrow drawn) vs resolved reference 1.00 (solid arrow), is intact on those providers too).
193
195
 
194
196
  **Edit `notes/todo.md`**: append these bullets after the `# Pending` heading:
195
197
 
@@ -203,59 +205,70 @@ Apply with `Edit` on `notes/todo.md` (do not rewrite the file). Per §Provider d
203
205
 
204
206
  Tell the tester:
205
207
 
206
- > Look at the magic again. **Demo TODO list** is now the hub: five
207
- > arrows light up between it and the other nodes, and the UI palette
208
- > colours each arrow by the link kind it carries:
208
+ > Look at the magic again. **Demo TODO list** is now the hub. You
209
+ > wrote five linking bullets, and **four arrows** light up between it
210
+ > and the other nodes, each coloured by the link kind it carries:
209
211
  >
210
- > - `Demo TODO list → demo-agent` (kind: `mentions`)
212
+ > - `Demo TODO list → demo-agent` (kind: `mentions`, the bare `@` handle resolves to a real agent)
211
213
  > - `Demo TODO list → demo-command` (kind: `invokes`)
212
214
  > - `Demo TODO list → demo-skill` (kind: `invokes`)
213
- > - `Demo TODO list → demo-guideline` (kind: `mentions`, the bare `@` handle)
214
215
  > - `Demo TODO list → demo-guideline2` (kind: `references`, the `@` handle with a `.md` extension)
215
216
  >
216
217
  > The kind comes from the syntax in the bullet: an `@handle` is a
217
218
  > mention, a `/skill` or `/command` is an invoke, and an `@handle`
218
219
  > that ends in a file extension (`@name.md`) is a reference, the
219
- > extension turns the name drop into a file pointer. Five arrows,
220
- > three kinds.
220
+ > extension turns the name drop into a file pointer.
221
221
  >
222
- > Now look closely: the two guideline arrows are not equally solid.
223
- > Skill-map draws each connector's **confidence** as opacity, how
224
- > sure it is the link resolves to something real:
222
+ > So why four arrows for five bullets? The fifth bullet,
223
+ > `@demo-guideline`, is a bare `@`-mention, and a bare mention only
224
+ > resolves to an *agent*. `demo-guideline` is a note, not an agent, so
225
+ > the mention resolves to nothing: skill-map draws no arrow (there is
226
+ > no node for it to land on) and instead flags the hub with a
227
+ > **broken reference**, a red error marker on the **Demo TODO list**
228
+ > card. Compare it with the bullet right after: `@demo-guideline2.md`
229
+ > adds the `.md`, so skill-map reads a file pointer, finds the real
230
+ > `demo-guideline2.md` node, and draws a solid arrow to it. Same
231
+ > handle, one `.md` apart, and one resolves while the other breaks.
232
+ > (That is also why `@demo-agent` drew fine: a bare mention DOES
233
+ > resolve when the target is a real agent.)
225
234
  >
226
- > - `@demo-guideline` is a bare `@`-mention. A bare mention only
227
- > firmly resolves to an *agent*, and `demo-guideline` is a note,
228
- > not an agent, so skill-map keeps it a soft guess (0.50), drawn
229
- > faint. (That's also why `@demo-agent` above is solid: it does
230
- > resolve to a real agent.)
231
- > - `@demo-guideline2.md` adds the `.md`, so skill-map reads a file
232
- > pointer, finds the real `demo-guideline2.md` node, and is certain
233
- > (1.00), drawn solid.
235
+ > One word on solidity: skill-map draws each connector's
236
+ > **confidence** as opacity, and every arrow you see here is fully
237
+ > solid (1.00) because each one lands on a real node. The faint,
238
+ > partial case (a link to a real file the runtime would ignore) shows
239
+ > up later in the campaign; for now the rule is simple, a reference
240
+ > that resolves draws a solid arrow, a reference that points at
241
+ > nothing is not drawn at all and gets flagged instead. The exact
242
+ > per-link numbers live in the inspector, next chapter.
234
243
  >
235
- > Same handle, one `.md` apart, and the confidence jumps from a guess
236
- > to a certainty. A glance at the map tells you which links are rock
237
- > solid and which are skill-map's best guess; the exact number per
238
- > link is in the inspector, next chapter.
239
- >
240
- > Confirm when you see it. If a connector is missing, refresh the
241
- > browser and let me know.
244
+ > Confirm when you see the four arrows plus the broken-reference
245
+ > marker on the hub. If an arrow is missing, refresh the browser and
246
+ > let me know.
242
247
 
243
- If a connector is missing, do not advance, the next chapter inspects the same hub edit. Mark `connectors`: done.
248
+ Expected: four drawn arrows plus one `core/reference-broken` error on `notes/todo.md` for the unresolved `@demo-guideline` mention (the prologue carries this single deliberate error from here on; it is the broken-reference preview the campaign and CLI parts build on). If an arrow is missing, do not advance, the next chapter inspects the same hub edit. Mark `connectors`: done.
244
249
 
245
250
  ## Chapter `inspector` - The inspector and connections (~1 min)
246
251
 
247
- 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.
252
+ The canvas only draws the resolved arrows; the full per-link breakdown, including the broken one that never drew, lives in the Inspector. Open it on the hub so the tester registers the surface before the `edit-link` chapter changes topology.
248
253
 
249
254
  > 🆕 Open the Inspector for **Demo TODO list** (click the node on
250
255
  > the map). **Expand** the **Connections** section (it's collapsed
251
256
  > by default): it has two sections, **Outgoing** and **Incoming**.
252
- > Demo TODO list lists **5 links** under Outgoing (the hub) and 0
253
- > under Incoming; open the Inspector for a targeted node to see its
254
- > Incoming count (each node the hub points at shows **1**). Each row
255
- > shows the link kind (`mentions`, `invokes`, `references`) and a
256
- > badge with its confidence: the numeric value. Here you'll see the
257
- > contrast in numbers, the `mentions` to `demo-guideline` reads
258
- > `0.50`, while the `references` to `demo-guideline2` reads `1.00`.
257
+ > Demo TODO list lists **5 links** under Outgoing (the canvas drew
258
+ > four arrows, but the data keeps the broken `@demo-guideline` mention
259
+ > as a fifth row) and 0 under Incoming. Each row shows the link kind
260
+ > (`mentions`, `invokes`, `references`) and a badge with its
261
+ > confidence: the numeric value. Here you'll see the contrast, the
262
+ > `references` to `demo-guideline2` reads `1.00` (resolved), while the
263
+ > `mentions` to `demo-guideline` reads `0.50` and is marked broken,
264
+ > that 0.5 is the broken-reference penalty, not a "halfway sure".
265
+ >
266
+ > Now open the Inspector for a couple of the targets to read their
267
+ > Incoming count. The four resolved targets (`demo-agent`,
268
+ > `demo-command`, `demo-skill`, `demo-guideline2`) each show **1**
269
+ > incoming. Open `demo-guideline` and it shows **0**: the broken
270
+ > mention never landed on it, so nothing points in. Five outgoing
271
+ > links on the hub, but only four of them reach a node.
259
272
  >
260
273
  > 💡 Tip: if all these changes left the nodes crowded together, the
261
274
  > map toolbar has a **Re-arrange layout** button (tooltip "Re-arrange
@@ -319,10 +332,12 @@ Per §Provider detection, on `agent-skills` / Antigravity the fixture has fewer
319
332
  > "Isolate this node and its direct links on the map"). Click it.
320
333
  >
321
334
  > The Map collapses to **Demo TODO list** plus only the nodes it
322
- > links to (`demo-command`, `demo-skill`, `demo-guideline`,
335
+ > draws an arrow to (`demo-command`, `demo-skill`,
323
336
  > `demo-guideline2`).
324
- > `demo-agent`, which lost its only connector back in the last step,
325
- > drops out of view, and the Inspector opens on **Demo TODO list**.
337
+ > Two nodes drop out of view: `demo-agent`, which lost its only
338
+ > connector back in the last step, and `demo-guideline`, whose bare
339
+ > mention never resolved so it has no drawn connector either. The
340
+ > Inspector opens on **Demo TODO list**.
326
341
  > That's how you
327
342
  > focus on one node's neighborhood when a map gets busy.
328
343
  >
@@ -28,6 +28,17 @@ disk. The orchestrator's `portfolio-init` already cleared it during
28
28
  pre-flight, so the tester sees only the portfolio. If anything demo
29
29
  lingers, mention it once and move on.
30
30
 
31
+ **Context (agent, do not narrate the plumbing): the lens prompt.**
32
+ Unlike the prologue (a pure `.claude/` project that auto-detected
33
+ `claude` silently), this project has a root `AGENTS.md` (a filesystem
34
+ marker for the `openai` lens) sitting next to the `.claude/` folder
35
+ (the `claude` marker, where the tutorial skill itself lives). With two
36
+ markers present, `sm init`'s first scan can NOT auto-pick a lens and
37
+ asks the tester to choose (`⚠ Multiple provider markers detected`).
38
+ The portfolio is a Claude project, so the answer is `claude`. The
39
+ prompt is expected, blessed behaviour; the tester just needs to know
40
+ which option to pick, so the message below previews it.
41
+
31
42
  ```bash
32
43
  sm init
33
44
  sm
@@ -40,6 +51,13 @@ Tell the tester:
40
51
  > `.claude/` folder is the **harness** (the helpers that maintain the
41
52
  > site). skill-map maps that harness.
42
53
  >
54
+ > Run `sm init`. This folder has both a root `AGENTS.md` and a
55
+ > `.claude/` folder, so skill-map can't tell on its own which runtime
56
+ > you're authoring for and asks:
57
+ > `⚠ Multiple provider markers detected. Pick the active lens: 1) claude 2) openai`.
58
+ > Type `1` (or `claude`) and press Enter, this is a Claude project.
59
+ > Then run `sm` to boot the live UI.
60
+ >
43
61
  > Open the URL `sm` printed. You'll see **one node**: `AGENTS.md`,
44
62
  > the project's handbook (the operating manual for the site).
45
63
  > `server.js`, `package.json` and the HTML under `public/` are not