fix(linkedin-studio): S26 harden linkedin — re-source router copy to "LinkedIn Studio", queue S29 terminology-scrub

Router hardening (routing/agent/grant axes all PASS). Operator terminology rule: the "thought leadership" phrase must not appear in the plugin. Re-sourced the 2 occurrences in commands/linkedin.md (:4 frontmatter description, :16 body) to "LinkedIn Studio". Routing 28/28 + agent-pointers 10/10 resolve; grant-hygiene clean (no Glob orphan — third front-door). Surfaced plugin-wide (~85 lines / ~45 files) and promoted to S29 terminology-scrub in docs/hardening/plan.md.
This commit is contained in:
Kjell Tore Guttormsen 2026-06-19 21:52:58 +02:00
commit 47782eb91d
3 changed files with 61 additions and 4 deletions

View file

@ -1762,3 +1762,51 @@ read, pattern greps) from a tool, never by reasoning.
did not). `linkedin` (S26) still to check independently.
---
### /linkedin:linkedin — top router (five-journey menu + status line + queue glance); routes to every command/agent, executes nothing (S26)
**CLASS: routing** (the master router over the whole surface — the largest routing check: 28 command
pointers + 10 agent pointers). Predicate: every emitted `/linkedin:Y` resolves to `commands/Y.md`; every
"Suggest `X` agent" resolves to `agents/X.md`; bidirectional grant-hygiene; "delegates only" (shows
menu/status, never executes).
**TEST (tool-grounded).**
- Routing (main axis): **28/28 distinct `/linkedin:Y` targets resolve** to `commands/Y.md` (menu `:66-127`,
ask-menu `:136-140`, direct-routing `:157-198`) — the full sub-command surface (+`linkedin` itself = 29).
- Agent pointers (axis d): **10/10** "Suggest `X` agent" resolve to `agents/X.md` (analytics-interpreter,
content-optimizer, content-planner, content-repurposer, differentiation-checker, engagement-coach,
network-builder, post-feedback-monitor, trend-spotter, voice-trainer).
- Grant-hygiene (bidirectional): `allowed-tools` = Read/Bash/AskUserQuestion (`:8-11`); each has a body home
— Read→state status line (`:20`), Bash→node queue-manager block (`:34-42`), AskUserQuestion→sub-choice
(`:145`); **no ungranted tool referenced, no Glob at all** — third front-door is clean (unlike create's
Glob-orphan / measure's Glob-via-Step-0).
- Delegates-only: body routes/suggests; `:146` "invoke it directly" = hand-off to the command, not
self-execution. No drafting / number-crunch. PASS.
- Graceful degrade (axis d): no-state fallback (`:28`) + empty-queue fallback (`:57`). PASS.
- Persona (ICP author types `/linkedin`): graceful-degrade path — no fixture (pure routing prose).
**FINDING (terminology — operator rule surfaced this session): "thought leadership" must not appear in the
plugin (it is named LinkedIn Studio).** linkedin.md used it at `:4` (frontmatter description) + `:16` (body).
**HARDEN (2 edits, 1 file — `commands/linkedin.md`).**
1. [REWORK · terminology] `:4` "Main router for LinkedIn **thought leadership** commands" → "Main router for
**LinkedIn Studio** commands".
2. [REWORK · terminology] `:16` "You are a LinkedIn **thought leadership** assistant" → "You are the
**LinkedIn Studio** assistant".
**VERIFY.**
- Re-grep final: "thought leadership" in linkedin.md → **NONE**; `:4`/`:16` show "LinkedIn Studio".
- Routing/agent axes unchanged: 28 + 10 targets all resolve.
- `git diff --stat` = 1 file, **+2/2**.
- `bash scripts/test-runner.sh``Passed: 81 · Failed: 0 · Warnings: 0`, **exit 0**; counts **29/19**
unchanged (.md-only prose edit).
- Disposition: **FIXED** (2 edits, 1 file) · 0 deferrals · routing **PASS**, agent-wiring **PASS**,
grant-hygiene **PASS** (clean — no orphan; third front-door has no Glob), delegates-only **PASS**.
**SURFACED (out of scope → queued as S29).** "thought leadership" appears plugin-wide on **85 lines across
~45 files** (commands, agents, references incl. the filename `references/thought-leadership-angles.md`,
skills, plus historical CHANGELOG/docs). Promoted to a dedicated terminology-scrub pass **S29**
(`docs/hardening/plan.md`); the user-facing-vs-historical boundary + the file rename are open scoping
questions for that pass.
---

View file

@ -91,7 +91,7 @@ that exercises the command's real path:
| S5 carousel | S12 firsthour | S19 strategy | S26 linkedin |
| S6 video | S13 calendar | S20 competitive | S27 ref-consistency A |
| S7 batch | S14 import | S21 monetize | S28 ref-consistency B |
| S8 pipeline | S15 report | S22 outreach | |
| S8 pipeline | S15 report | S22 outreach | S29 terminology-scrub |
*S9 newsletter (16-phase) may split into S9a/S9b. Otherwise one command = one session.
@ -107,7 +107,16 @@ SSOT-reconciliation of the documented divergences, same tool-grounded discipline
- **S28 (B) — format magnitudes → SSOT:** `commands/video.md:69` + `references/linkedin-formats.md`
(the "30% zero-distribution" claim vs SSOT native-video framing).
Run after S26; order adjustable. These edit already-hardened files surgically and are
**S29 — terminology scrub: "thought leadership" → "LinkedIn Studio" / neutral (added 2026-06-19,
operator-approved during S26).** The phrase must not appear anywhere in the plugin (it is named LinkedIn
Studio; see auto-memory `no-thought-leadership-phrase`). S26 fixed the 2 occurrences in
`commands/linkedin.md`; **~85 lines across ~45 files remain** (commands, agents, references — incl. the
filename `references/thought-leadership-angles.md` — skills, plus historical CHANGELOG/docs). Open scoping
questions for this pass: (a) user-facing surface only, or include historical CHANGELOG/docs too? (b) the
`thought-leadership-angles.md` rename is its own sub-step — every pointer to the filename must update with
it. Same tool-grounded discipline (read-and-show → grep-confirm → re-grep final); hardening-class.
Run after S26; order adjustable (S27 → S28 → S29). These edit already-hardened files surgically and are
hardening-class (commit local, no push).
## End-of-session ritual (every session — STATE.md handoff baked in)