feat(linkedin-studio): S14 — journey layer (create/measure front-doors + 5-journey router), v4.1.0

14a's cold command-rationalization found ZERO redundancy across the 27 commands
(no defensible merge/cut), so the operator reframed S14 from "merge/cut" to
"add a journey layer over the kept atomics".

- Add /linkedin:create + /linkedin:measure — delegate-only guided front-doors
  (Read/Glob/AskUserQuestion only; route to the command that owns the work)
- Re-tier commands/linkedin.md into 5 journeys (Start/Create/Engage/Measure/Grow);
  onboarding/strategy elevated as Start/Grow front-doors; Engage = calendar+firsthour tier
- 14a honesty nits: router now lists firsthour; calendar cross-links to firsthour;
  competitive confirmed UNGATED (the claimed 1K-gating inconsistency was unfounded)
- Lockstep: EXPECT_COMMANDS 27->29, v4.0.0->4.1.0 across plugin.json / README badges /
  plugin+root CLAUDE.md / README / CHANGELOG; new README commands-badge lint guard
- 14a deliverable corrected: multiplatform entry added (26/27 -> 27/27), header counts,
  competitive nit withdrawn
- Independent /trekreview (2 Opus reviewers) raised 3 MAJORs (stale commands badge,
  router competitive self-contradiction, STATE.md count) — ALL remediated in-session;
  verdict ALLOW

Gate: test-runner.sh 74/0/0; node --test 98/98; commands=29; v4.1.0 consistent.
Additive/minor — no command removed/renamed/behavior-changed; reload registers create+measure.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-05-30 21:27:06 +02:00
commit baca30feb1
16 changed files with 885 additions and 208 deletions

View file

@ -0,0 +1,154 @@
# LinkedIn Studio — Journey-Layer Design (S14)
> **Supersedes the S14 "merge/cut" framing.** 14a's cold review found 27 commands
> with **zero redundancy** (subsumption fails pairwise) — the surface is over-grown
> in *count*, not in *redundancy*. The operator therefore reframed S14 from
> "rationalize by cutting" to "**add a journey layer over the kept atomics**." This
> doc is the build contract. It also **absorbs S15's router-tiering** (finish-plan
> B2) — the router is re-tiered here, journey-style, so S15 collapses into S14.
## Decisions locked (operator, 2026-05-30)
1. **Architecture = journey layer.** Keep all 27 atomic commands as the *execution
tier*; add journey *front-door* orchestrators as the *primary surface*; subagents
remain the engine (no Workflow-tool / deep-research adoption — both are wrong-fit
for an everyday product surface, see the session reasoning).
2. **Realization = 2 new + 2 elevated.** Add `create` + `measure` as new front-doors;
elevate existing `onboarding` (Start) and `strategy` (Grow); **Engage** stays a
router-tier relay (`calendar` + `firsthour`), no front-door. Atomics → "advanced"
tier under each journey.
3. **Version = v4.1.0 (minor), NOT v5.0.0.** Honest SemVer: this is additive (2 new
commands) + presentation (router retier) + one tiny doc-vs-behavior reconcile
(`competitive`). No removal, rename, or behavior break on existing commands.
Precedent: v3.1.0 added 3 agents as a MINOR with a "reload required" note — same
shape. Reload note applies (the 2 new commands register at session reload).
## Journey taxonomy (5 journeys + router)
`Improve` is **not** a separate journey: improving is the action *after* measuring
(audit→fix, ab-test, `content-optimizer`), not a distinct entry. The operator's
"Improve + Analyze" is therefore folded into **Measure** (the measure→optimize loop).
| Journey | Front-door | Atomics (advanced tier) |
|---------|-----------|--------------------------|
| **Start** | `onboarding` *(elevate — exists)* | setup · first-post |
| **Create** | **`create`** *(NEW)* | post · quick · react · carousel · video · multiplatform · batch · newsletter · pivot · headless-review · pipeline |
| **Engage** | *(router-tier — relay, no front-door)* | calendar · firsthour |
| **Measure** | **`measure`** *(NEW — `analyze` name is taken, so no collision)* | import · report · analyze · audit · ab-test |
| **Grow** | `strategy` *(elevate — exists)* | profile · competitive · monetize ⚿ · outreach ⚿ |
| *(map)* | `linkedin` router | — |
⚿ = unlocks/soft-gates at ~1K followers. Count: Start 3 + Create 11 + Engage 2 +
Measure 5 + Grow 5 + router 1 = **27 atomics** + **2 new front-doors** = **29**.
## The two new front-door commands
Both are **thin guided routers** — they add *navigation* (a single "what do you
want?" entry), not duplicated logic. They **delegate** to the atomic that owns the
work. No drafting/analysis logic is copied into them.
### `commands/create.md` — Content-creation front-door
- **Purpose:** one guided entry for "make something" when the user hasn't already
named the format.
- **Flow:** `AskUserQuestion` "What do you want to create?" →
- Short substantial post → `post`
- Quick 5-min post → `quick`
- React to a URL / article / news → `react`
- Carousel / document → `carousel`
- Video script → `video`
- Adapt for another platform → `multiplatform`
- A full week (batch) → `batch`
- Long-form / newsletter / essay → `newsletter`
- Then hand off to the chosen command (it owns the work).
- **Triggers (undirected create intent only — must NOT steal `post`/`quick` direct
intent):** "create", "make something", "create content", "what should I make",
"new content", "help me create", "linkedin create".
- **allowed-tools:** Read, Glob, AskUserQuestion. **No Write** (it delegates).
### `commands/measure.md` — Performance/insight front-door
- **Purpose:** one guided entry for "understand how I'm doing."
- **Flow:** `AskUserQuestion` "What do you want to do?" →
- Import a new analytics CSV → `import`
- Weekly / monthly report → `report`
- Diagnose a problem (reach dropped, low engagement) → `analyze`
- Quarterly strategy audit → `audit`
- Design / review an A/B test → `ab-test`
- Then hand off to the chosen command.
- **Triggers (undirected measure intent):** "measure", "how am I doing", "my
performance", "show my analytics", "performance overview", "linkedin measure".
- **allowed-tools:** Read, Glob, AskUserQuestion. **No Write** (it delegates).
## Elevation (2) — presentation only, no behavior change
- **`onboarding` = Start front-door.** Already the cohesive wizard. Router presents
it as the Start journey entry; body unchanged (optional one-line "Start journey"
framing only).
- **`strategy` = Grow front-door.** Already the phase/trajectory/authority hub.
Router presents it as the Grow journey entry; body unchanged.
## Router re-tiering (`commands/linkedin.md`) — absorbs S15 B2
Restructure the menu into the 5 journeys, each headed by its front-door with the
atomics listed beneath as "also / advanced":
- **Start**`onboarding` · setup · first-post
- **Create**`create` · post · quick · react · carousel · video · multiplatform · batch · newsletter · pivot · headless-review · pipeline
- **Engage** → calendar · firsthour *(tier, no front-door)*
- **Measure**`measure` · import · report · analyze · audit · ab-test
- **Grow**`strategy` · profile · competitive · monetize ⚿ · outreach ⚿
- Keep the status line (weekly progress / streak / follower phase) + queue summary.
- **Fixes nit #1:** `/linkedin:firsthour` is now listed (under Engage) — the router
previously listed only the `post-feedback-monitor` agent there.
## Honesty nits fixed in lockstep (from 14a)
1. **Router omits `firsthour`** → fixed by the retier (Engage tier lists it).
2. **`calendar``firsthour` trigger overlap** → `calendar.md`'s publish-action
first-hour block gets a one-line cross-link: "for the full worked sprint plan,
run `/linkedin:firsthour`."
3. **`competitive` gating doc-vs-behavior** → **14a's nit was unfounded** (verified
against the files: CLAUDE.md `:64`, README `:222`, the router, and the command body
all leave `competitive` **ungated** — only `monetize`/`outreach` carry "(unlocks at
~1K)"). There is no inconsistency to fix. Competitive analysis helps at any stage
(especially early positioning), so it stays ungated. Action: place it in the Grow
tier marked **"Any phase"** (no ⚿), and add a one-line note to the router's gating
rule that `competitive` is explicitly not gated. (An interim router edit that
mistakenly added a ~1K marker was reverted in the same pass.)
## 14a doc correction (`command-rationalization.md`)
- Add the missing **`multiplatform`** entry: **keep** (unique Twitter/X-thread +
cross-platform surface; subsumption fails as a cut), flagged **thinnest /
develop-candidate** (only command that inlines static templates instead of
delegating — could use `content-repurposer`). Belongs in **Create**.
- Fix the two header-count typos (Group C "(4)"→3; Group F "(4)"→5).
- Corrected tally: **keep 27 (27/27 covered)** · 0 merge · 0 cut · 1 develop-candidate.
## Count / version / roster lockstep (the release mechanics)
- `scripts/test-runner.sh`: `EXPECT_COMMANDS` **27 → 29**.
- Version **4.0.0 → 4.1.0** everywhere it appears (version-sync rule: grep both
`4.0.0` and the `27`-count claims).
- Three-doc rule (same commit / immediately after):
- `CLAUDE.md` (plugin): command table +2 rows, count 27→29, version, v4.1.0 para.
- `README.md` (plugin): command table, count, version, CHANGELOG entry.
- Root `README.md` (marketplace): the linkedin-studio line.
- Also: `CHANGELOG.md` if present; any SKILL roster enumerating commands; the router
roster (done above); `STATE.md` count block (27→29, version 4.1.0).
## Verification (testable — gate before push)
- `ls commands/*.md | wc -l` == **29**.
- `bash scripts/test-runner.sh` exit **0** (EXPECT_COMMANDS=29; stat/version/model
consistency + render-chain + $-safety guards all green).
- `node --test hooks/scripts/__tests__/*.test.mjs` — all pass (no hook logic touched
→ expect the existing **98**).
- `grep -rn "4\.0\.0\|27 command" commands README.md CLAUDE.md` (user-facing) → 0
stale hits (historical CHANGELOG mentions allowed).
- Router renders 5 journeys; primary tier = the 5 front-doors (`create`, `measure`,
`onboarding`, `strategy` + Engage tier); atomics nested; 1K-gated flagged;
`firsthour` present.
- `create` / `measure`: valid frontmatter, `AskUserQuestion` routing, **delegate
only** (grep shows no inlined drafting/analysis logic, no `Write` in create/measure).
- `/trekreview --project docs/remediation/`**ALLOW** (no WARN-override) → commit
(own files only) → push origin.
## Out of scope (this session / S14)
- Aggressive consolidation / folding atomics (operator chose keep-all).
- Building the `multiplatform` "develop" (content-repurposer wiring) — recorded as a
keep + develop-candidate, not built unless requested.
- S16 (saves) / S17 (C13C46) — later finish-plan steps.
- UI-brief M0 (move mutable data out of tree) — pending; conflicts with S16, not S14.