ktg-plugin-marketplace/plugins/linkedin-studio/docs/remediation/command-rationalization.md
Kjell Tore Guttormsen baca30feb1 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>
2026-05-30 21:27:06 +02:00

375 lines
40 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Command-Surface Rationalization — Step 14a
_Remediation Voyage, command-surface pass. Independent, COLD read of all 27
command files in `commands/*.md` (full bodies, not just frontmatter), with the
router (`commands/linkedin.md`), `CLAUDE.md`, and `README.md` as the map of the
intended surface. Written 2026-05-30. ANALYSIS ONLY — no command file was edited,
merged, deleted, or renamed; the single deliverable is this document._
> **Correction (post-review, 2026-05-30).** The first pass omitted `multiplatform`
> (covered 26/27) and mis-stated two group-header counts; it also raised a
> `competitive` 1K-gating inconsistency that did **not** survive verification. All
> three are fixed below: `multiplatform` now has its own entry (Group B), the Group
> C/F headers read 3/5, and the `competitive` nit is withdrawn (CLAUDE.md `:64`,
> README `:222`, the router, and the command body all leave it ungated). Net finding
> is unchanged — **keep 27, 0 merge, 0 cut** — now genuinely covering all 27.
## Method note
The fixtures here are **the command files themselves** — each command's purpose,
its full workflow body, its frontmatter `description` (the trigger-phrase set that
governs how it gets invoked), and the sibling surfaces it touches. The discipline
is borrowed verbatim from `docs/remediation/overlap-measurement.md` (whose SUBJECT
is the 7 long-form review *agents*, not the commands — kept strictly separate
here): for every overlap I apply the **subsumption test** — _does either command's
catch-set / surface fully contain the other's?_ — and the trim rule: **merge or
cut ONLY where a command catches nothing a sibling doesn't; if the redundancy is
justified, record it and KEEP; if I can't decide, record "inconclusive — retain
pending operator view" and do NOT trim.** Default-to-keep under uncertainty. This
plugin already over-grew once (24→27), so the bias is honest-surface, not
consolidation-for-its-own-sake and not growth-for-its-own-sake. Every
recommendation is grounded in a citable trigger set, workflow step, or sibling
surface — no taste-based cuts.
A leverage note used throughout: a command's **invocation leverage** is the
product of (a) trigger-phrase breadth in its `description` and (b) how likely a
user is to actually type the intent when a *broader* command already catches it.
A command whose entire trigger set is a strict subset of a broader command's, and
which adds no unique workflow, is the classic merge/cut candidate.
---
## Group A — Entry / router (1)
### `linkedin` (router)
- **Purpose** — Status line (weekly progress, streak, follower phase) + upcoming/overdue queue + a menu/router that disambiguates to the right subcommand.
- **Overlap with siblings** — Structurally overlaps *every* command (it lists them), but that is its job, not redundancy. No subsumption either way: the router holds no content-production surface, the leaf commands hold no menu/status surface.
- **Invocation leverage** — Highest-traffic entry point: triggers on the bare `"linkedin"`, `"/linkedin"`, `"linkedin help"`. This is the front door.
- **Recommendation** — **keep.**
- **Rationale** — Structural and the single highest-leverage surface. Judged on grouping honesty: the grouping is broadly honest (Getting Started / Content Creation / Strategy / Post-Publish / Growth+Monetization), and it correctly soft-gates the 1K commands. One honest-surface nit for the operator (not a cut): it lists `post-feedback-monitor` as an *agent* under "Post-Publish Monitoring" but does not list the new `/linkedin:firsthour` command in that section — the router's own map is one release behind the surface it routes to.
---
## Group B — Short-form creation (7)
### `post`
- **Purpose** — Full interactive post creation (angle → format → draft → quality/de-AI gate → refine), targeting 1,2001,800-char substantial posts.
- **Overlap with siblings** — `quick` (short 150500-char path), `react` (URL-sourced), `pipeline` (post + schedule + monitor). Subsumption test: `post` does NOT subsume `quick` (different length band + 3-line formula + 8 templates) and `quick` does not subsume `post` (no refinement cycle, no `content-optimizer` delegation). `post` is the body that `pipeline` wraps but `pipeline` adds scheduling/queue/first-hour that `post` lacks; neither subsumes the other.
- **Invocation leverage** — Very high; broad trigger set ("create linkedin post", "write a post", "turn this into a post"). Core entry point alongside `quick`.
- **Recommendation** — **keep.**
- **Rationale** — Distinct length/depth tier with a unique refinement+optimizer surface; one of the two highest-traffic creation commands.
### `quick`
- **Purpose** — 5-minute 3-line-formula post (150500 chars) AND the home of the 8 post-type templates (reaction/tip/observation/hot-take/failure/question/curation/one-liner).
- **Overlap with siblings** — `post` (longer tier), `first-post` (which explicitly reuses `quick`'s 3-line formula). Subsumption test: `quick` uniquely owns the template library and the short-length band; `post` owns the long band. The two are explicitly cross-referenced ("When to Upgrade → `/linkedin:post`"). No subsumption.
- **Invocation leverage** — High; broad trigger set including the absorbed `templates` intent ("post template", "give me a template", "fill in the blank post"). This absorption was the v2.0.0 consolidation — confirmed intact in the body (Step 1 hosts the template library).
- **Recommendation** — **keep.**
- **Rationale** — Holds the unique short-form length tier + the entire template surface that `templates` was folded into. Cutting it would orphan the templates.
### `react`
- **Purpose** — URL-to-post pipeline: fetch external content (article/news/research/YouTube), extract, pick a reaction angle, draft in voice; includes a multi-URL comparison path.
- **Overlap with siblings** — `post` (could in principle ingest a URL via WebFetch — `post` Step 1 even mentions "If they provide a URL, use WebFetch"). Subsumption test: `react` has a unique surface `post` lacks — the multi-source comparison/synthesis path (Steps 1b8b), the content-type→angle table tuned to *reactions*, and the "react, don't summarize / your take is the hook" discipline. `post` does not subsume that. `react` does not subsume `post` (no general-topic drafting).
- **Invocation leverage** — High and unambiguous: "react to this", "this article", "this url", "share this news". The router routes any bare URL here. A user with a link will not naturally type `/linkedin:post`.
- **Recommendation** — **keep.**
- **Rationale** — Genuinely unique URL-ingestion + multi-source-synthesis surface and a distinct, frequently-typed intent.
### `pipeline`
- **Purpose** — End-to-end lifecycle orchestrator: ideation → draft → optimize → **schedule/queue** → 5x5x5 pre-engagement → publish → first-hour → 48h analysis.
- **Overlap with siblings** — This is the densest overlap node. It re-does `post`'s drafting (Step 2), `calendar`'s queueing (Step 4 Option 3 calls the same `queue-manager.mjs` `queueAdd`), the 5x5x5/first-hour plan (now also `firsthour`'s job), and points to `analyze` at the end. Subsumption test: no *single* sibling subsumes `pipeline` — it is the only command that strings the whole chain into one guided run with explicit step gates. But `pipeline` is itself **a thinner re-statement of `post` + `calendar` (+ `firsthour`)**: every individual capability it offers exists, more developed, in those leaf commands (its draft step is a condensed `post`; its schedule step is a condensed `calendar`; its first-hour step is a condensed `firsthour`).
- **Invocation leverage** — Moderate-to-low as a *natural* type. Trigger set ("pipeline", "full workflow", "end to end", "idea to post") is narrow and jargon-y; in practice a user wanting to create+schedule will type `/linkedin:post` then `/linkedin:calendar`. It reads as a workflow-orchestrator showcase more than a daily entry point.
- **Recommendation** — **keep** (with a flag) — leaning **inconclusive**.
- **Rationale** — No clean subsumption (it uniquely *sequences* the chain), so the trim rule says retain. But it is the surface most worth the operator's scrutiny: its value is the *orchestration*, and that value erodes as `post`/`calendar`/`firsthour` each grow richer than `pipeline`'s inlined condensations. Flagged in the honest-uncertainty list. If the operator ever wants to shrink the surface, this is the first place a defensible merge could be argued (→ `post`, preserving the explicit schedule+first-hour hand-off chain) — but the evidence does not *compel* it.
### `carousel`
- **Purpose** — Structured slide-by-slide carousel/document generator with template selection, per-slide copy, caption, de-AI gate, and optional mcp-image slide generation.
- **Overlap with siblings** — `multiplatform` (has a "LinkedIn → Presentation Slides" template) and `post` (notes "could also work as a carousel — run `/linkedin:carousel`"). Subsumption test: `multiplatform`'s slide template is a 10-line generic outline; `carousel` is a full format engine (5 templates, per-slide char rules, mcp-image generation, carousel quality checklist). `multiplatform` does not remotely subsume it. `carousel` owns the highest-engagement organic format end-to-end.
- **Invocation leverage** — High and specific: "carousel", "slide deck", "pdf post", "swipe post", "document post". A distinct format intent users type directly.
- **Recommendation** — **keep.**
- **Rationale** — Deep, unique format surface with image generation; not subsumed by anything.
### `video`
- **Purpose** — Video script generator (talking-head/screen-rec/slideshow, 30s2min) with pacing/visual/energy cues, captions, thumbnail, first comment, a video quality gate, and delegation to `video-scripter`.
- **Overlap with siblings** — `multiplatform` ("LinkedIn → YouTube Script" template). Subsumption test: `multiplatform`'s YouTube template is a generic timing outline; `video` is a full LinkedIn-native scripting engine (word-budget math, muted-autoplay test, completeness gate, `video-scripter` agent). No subsumption — and they target different platforms (LinkedIn-native vs. YouTube adaptation).
- **Invocation leverage** — High and specific: "video script", "talking head script", "record a video". Direct format intent.
- **Recommendation** — **keep.**
- **Rationale** — Unique LinkedIn-native video surface + dedicated agent; the `multiplatform` overlap is a thin adaptation template, not a substitute.
### `multiplatform`
- **Purpose** — Adapt existing LinkedIn content for other platforms: a Twitter/X thread, a generic presentation deck, or a YouTube script. Long-form is explicitly routed out to `/linkedin:newsletter`.
- **Overlap with siblings** — `carousel` (its "Presentation Slides" template) and `video` (its "YouTube Script" template). Subsumption test: `multiplatform`'s slide/YouTube blocks are ~10-line generic outlines, while `carousel` is a full LinkedIn-native carousel engine and `video` a full LinkedIn-native scripting engine — neither subsumes the other, and they target different outputs (LinkedIn-native vs. Twitter / YouTube / generic deck). Critically, the **Twitter/X-thread** adaptation path exists in **no other command**. No subsumption.
- **Invocation leverage** — Moderate; "adapt for twitter", "cross-post", "repurpose for", "turn into thread". A distinct cross-platform intent, but lower-traffic than the native creation commands.
- **Recommendation** — **keep** (flag: **develop-candidate**).
- **Rationale** — Unique cross-platform / Twitter surface; subsumption fails as a cut. But it is the **thinnest** command in the set — the only one that inlines static templates instead of delegating, where the `content-repurposer` agent already exists to power a richer adaptation. Keep now; a future *develop* (wire `content-repurposer`, deepen the per-platform output) is the defensible improvement, not a merge/cut.
---
## Group C — Long-form (3)
### `newsletter`
- **Purpose** — The single long-form orchestrator: a fixed 16-phase, multi-session pipeline (research → skeleton/spine gates → draft → fact-check → editorial → persona sweep → headless review → visual assets → lock → hook gate → schedule) with maintained edition-state.
- **Overlap with siblings** — `headless-review` and `pivot` are *phases/companions* of this command (Step 6.5 and the lock-precondition re-open). Subsumption test: `newsletter` invokes the headless package inline (Step 6.5) and runs the pivot heuristic as a lock precondition (Step 8) — so it functionally *contains* both. But containment ≠ the companions are redundant (see their entries: the value is fresh-session isolation and a named re-open ritual, which `newsletter` cannot itself provide). No short-form command overlaps it; `multiplatform` explicitly routes all long-form here.
- **Invocation leverage** — High for its niche; the sole entry for "newsletter", "long-form", "essay", "series article".
- **Recommendation** — **keep.**
- **Rationale** — The entire long-form spine; nothing else does this and everything long-form routes to it.
### `headless-review`
- **Purpose** — Cold/adversarial review package run on a FROZEN draft with starved context — `content-reviewer` + `language-reviewer` + `fact-reviewer` + `persona-reviewer` (resonance/conversion), consolidated into one operator-gated report. Standalone surface for `newsletter` Step 6.5.
- **Overlap with siblings** — `newsletter` (Step 6.5 fans the same package inline). Subsumption test: this is the calibration case (c) the brief flags. Does `newsletter` Step 6.5 subsume `headless-review`? **No** — and the command's own body states *why*: the cardinal value is **Layer 1 fresh-session isolation** ("the parent itself then has no drafting transcript"). When the package runs inline inside the drafting `newsletter` session it carries exactly the framing-bias the package exists to eliminate. The standalone command is the *only* way to get a genuinely cold parent context. So the standalone surface has a unique catch (true independence) the inline phase structurally cannot.
- **Invocation leverage** — Moderate; specific trigger set ("headless review", "cold review", "adversarial review", "review the frozen draft"). Niche but real, and the recommended path is to type it *in a fresh session* — which is precisely an action a phase cannot perform.
- **Recommendation** — **keep** — justified standalone, not merely-as-a-phase.
- **Rationale** — Subsumption fails in the independence dimension: the fresh-session parent is a capability the `newsletter` phase cannot replicate. This is the "redundancy is justified — record and keep" case, mirroring the agent-overlap finding for the cold trio in `overlap-measurement.md`.
### `pivot`
- **Purpose** — A named ritual to re-open an already-cleared long-form edition after a substantive late change: logs `pivots[]`, resets `currentPhase`, un-locks, invalidates downstream verdicts, marks which gates must re-pass. Includes the >20%/>2-section heuristic.
- **Overlap with siblings** — `newsletter` (which runs the same heuristic as a Step 8 lock precondition and owns the gate re-runs). Subsumption test (calibration case c): does `newsletter` subsume `pivot`? **Partially but not fully.** `newsletter` Step 8 *detects* drift and *stops* the lock, but it explicitly **points the operator to `/linkedin:pivot`** to perform the state surgery (log the pivot entry, reset phase, un-lock, invalidate verdicts). `pivot` does NOT run the gates ("Do not run the gates yourself — `/linkedin:newsletter` owns the pipeline"); `newsletter` does NOT perform the re-open bookkeeping. The two are complementary halves of one ritual — clean separation, no subsumption.
- **Invocation leverage** — Low-to-moderate; narrow trigger set ("pivot", "re-open edition", "added a section", "changed the angle"). Rarely hit, but when hit it does deterministic state work no other command does.
- **Recommendation** — **keep.**
- **Rationale** — Holds a unique state-mutation surface (the re-open bookkeeping) that `newsletter` deliberately delegates out; not subsumed. Lower-traffic, but the trim rule retains a non-redundant specialist.
---
## Group D — Onboarding / setup (3)
### `onboarding`
- **Purpose** — Multi-step wizard chaining profile → personalization → first-post as one guided flow for brand-new installs, with an "already onboarded" short-circuit.
- **Overlap with siblings** — `setup` (Phase 2 is a condensed `setup`) and `first-post`/`profile` (Phases 1 and 3 route to them). Subsumption test (calibration case f): does `setup` + `first-post` subsume `onboarding`? **No.** `onboarding` uniquely provides the *cohesive single path* ("a single guided path instead of navigating 27 commands") and the cross-phase state logic (already-onboarded detection, score-gated branching, "what's next — your first week"). Notably it does NOT invoke the sub-commands directly — it tells the user to run them — so it is an orchestration/triage layer, not a duplicate of their bodies.
- **Invocation leverage** — Moderate; trigger set heavily overlaps `first-post` and `setup` ("get started", "just installed", "walk me through"). The router lists it first. Real risk: a "get started" user could land on `first-post` instead — but the intent ("walk me through *everything*") is distinct from "help me publish my first post".
- **Recommendation** — **keep.**
- **Rationale** — Unique cohesive-wizard surface + cross-phase triage state; it orchestrates rather than duplicates `setup`/`first-post`. No subsumption.
### `setup`
- **Purpose** — Guided personalization: computes the 8-category personalization score and runs 6 sub-workflows (voice samples → `voice-trainer`, case study, framework, post analysis, demographics, user profile) to populate asset templates.
- **Overlap with siblings** — `onboarding` Phase 2 (a 2-category condensation of this). Subsumption test: `onboarding` only ever touches the top-2 weighted categories and explicitly defers ("I'll run `/linkedin:setup` for the full setup"); `setup` owns all 8 categories, the full score dashboard, and the `voice-trainer` delegation. `onboarding` does not subsume it.
- **Invocation leverage** — High; broad trigger set ("setup", "personalize", "personalization score", "configure plugin", "my score", "fill in assets"). Also the router's destination for any score/asset-completeness query.
- **Recommendation** — **keep.**
- **Rationale** — The canonical, full-depth personalization surface; `onboarding`'s version is a deliberate condensation that defers back here.
### `first-post`
- **Purpose** — First-post accelerator: maximum hand-holding, voice quick-check, simple topic pick, 3-line draft (reuses `quick`'s formula), 4-item quality check, sets `first_post_date`, includes a guard that redirects returning users to `post`/`quick`.
- **Overlap with siblings** — `quick` (whose 3-line formula it reuses) and `onboarding` Phase 3 (which routes here). Subsumption test: does `quick` subsume `first-post`? **No.** `first-post` adds first-timer-specific scaffolding `quick` lacks: the welcome/expectation framing, the voice-from-scratch setup branch (samples vs. 5 questions), the "exists > perfect" philosophy, the new-creator 90-day-boost messaging, and the returning-user guard. Its whole value is the zero-to-one onboarding hand-holding, not the drafting mechanics.
- **Invocation leverage** — Moderate; "first post", "never posted", "new to linkedin". A genuinely distinct beginner intent.
- **Recommendation** — **keep.**
- **Rationale** — Unique first-timer scaffolding + the `first_post_date` side-effect; not subsumed by `quick`'s formula it borrows.
---
## Group E — Scheduling / publishing / post-publish (3)
### `batch`
- **Purpose** — Create a full week (35 posts) in one session from a theme/pillar: trend-spotter angles, `content-planner` plan, scheduling, draft files, queue entries, and a generated `.ics`.
- **Overlap with siblings** — `pipeline` (single post + schedule), `calendar` (queue management). Subsumption test: `batch` uniquely produces a *multi-post balanced week* with format/pillar rotation and `.ics` export; `pipeline` is single-post; `calendar` only manages an existing queue. No subsumption.
- **Invocation leverage** — High and specific: "batch content", "week of posts", "sunday prep". Distinct planning intent.
- **Recommendation** — **keep.**
- **Rationale** — Unique multi-post-week surface + iCal generation; the queue-write overlap with `calendar`/`pipeline` is shared *plumbing* (`queue-manager.mjs`), not a shared *surface*.
### `calendar`
- **Purpose** — View/manage the 14-day queue (reschedule/cancel/view-draft) AND host the **publish action** (mark-as-published → update queue+state → first-hour plan). Absorbed the former `publish` command (v2.0.0).
- **Overlap with siblings** — `firsthour` (its publish flow ends with a first-hour plan; `firsthour` is a richer standalone version), `pipeline`/`batch` (which write to the queue it reads). Subsumption test (calibration case d): does `calendar`'s publish action subsume `firsthour`? **No**`calendar`'s first-hour block is a static 6-line checklist + an optional `post-feedback-monitor` hand-off; `firsthour` builds a *worked, timestamped plan with named targets and draft comments* via `engagement-coach`. Conversely `firsthour` does not manage the queue. No subsumption.
- **Invocation leverage** — Very high; very broad trigger set spanning both calendar ("schedule", "queue", "upcoming") and publish ("mark as published", "just published", "post is live"). High-traffic.
- **Recommendation** — **keep.**
- **Rationale** — Canonical queue+publish surface that already absorbed `publish`; its first-hour checklist is a lightweight in-flow nudge, distinct from `firsthour`'s full sprint planner.
### `firsthour`
- **Purpose** — Post-publish first-hour / reply-loop sprint: delegates to `engagement-coach` for a timestamped target list (whales/inner-circle/ICP), draft self-comments + CEA replies in voice, a minute-by-minute timeline; persists via `recordFirstHourPlan`; hands off to `post-feedback-monitor`.
- **Overlap with siblings** — `calendar`'s publish-action first-hour block, and the `engagement-coach` / `post-feedback-monitor` agents it delegates to. Subsumption test (calibration case d): `firsthour` is the orphan-wiring command for `engagement-coach` (its raison d'être per CLAUDE.md/README). It uniquely produces a *worked* plan (named targets + draft comments + clipboard copy + state persistence) that neither `calendar` (static checklist) nor `post-feedback-monitor` (48h monitoring, different time window) provides. The three form a relay (firsthour → coach for the plan → feedback-monitor for the marathon), not a redundancy.
- **Invocation leverage** — Moderate; "first hour", "I just posted", "reply loop", "work my post". A real, frequently-recurring moment (every publish), but its trigger phrases partly collide with `calendar`'s "just published". Some users will reach the lighter `calendar` first-hour block instead of `firsthour`.
- **Recommendation** — **keep** (with a note).
- **Rationale** — Distinct worked-plan surface + it is the wiring point for an otherwise-orphaned agent (`engagement-coach`); cutting it would re-orphan that agent and undo a core v4.0.0 remediation goal. Note for the operator: the trigger overlap with `calendar`'s publish action means the two should cross-link (calendar's first-hour block could point to `/linkedin:firsthour` for the full plan) — a wiring nit, not a merge.
---
## Group F — Analytics (5)
### `analyze`
- **Purpose** — Performance *troubleshooting/diagnosis*: 6-symptom intake → diagnostic patterns → penalty checklist → severity assessment → 14-day recovery protocol. Optionally grounds in `analytics-interpreter` (interpret mode).
- **Overlap with siblings** — `audit`, `report`, `import` (calibration case h). Subsumption test: `analyze` is the only *diagnostic/recovery* surface (why is reach down, how do I recover). `report` is *reporting* (weekly numbers from imported data); `audit` is *strategy review* (quarterly top/bottom posts, topic mix); `import` is *ingestion*. Four different jobs on the analytics axis — none subsumes another; `analyze` even works with no imported data (self-report intake).
- **Invocation leverage** — High and distinct: "why isn't my content performing", "low reach", "reach dropped". A panic-moment intent users type directly.
- **Recommendation** — **keep.**
- **Rationale** — Unique troubleshooting/recovery surface; orthogonal to the other three analytics commands.
### `audit`
- **Purpose** — Periodic (quarterly) content-strategy audit: top/bottom performers, topic distribution vs. pillars, format mix, engagement trend, milestone progress, profile alignment — then routes the *fix* to `strategy` and the *profile deep-audit* to `profile`.
- **Overlap with siblings** — `analyze` (diagnosis), `report` (metrics), `strategy`/`profile` (which it explicitly defers to). Subsumption test: `audit` is the only *holistic strategy-review* surface (90-day lookback across topic/format/trajectory). It deliberately does NOT own trajectory prescription (delegates to `strategy`) or profile checklist (delegates to `profile`) — "audit names the gap; strategy prescribes the fix." That self-limiting design means it does not duplicate them; and `report`/`analyze` don't do the strategy lookback. No subsumption.
- **Invocation leverage** — Moderate; "content audit", "quarterly review", "review my content strategy". A periodic, distinct intent.
- **Recommendation** — **keep.**
- **Rationale** — Unique holistic-review surface with clean delegation boundaries to `strategy`/`profile`; not a duplicate of `analyze`/`report`.
### `import`
- **Purpose** — Ingest a LinkedIn analytics CSV (auto-detect from ~/Downloads, quick-import helper, the analytics-CLI npm-install fix), parse → JSON → anomaly detection → baseline update, then **delegates the analysis fan-out to `/linkedin:report`** (one analysis pipeline, not two).
- **Overlap with siblings** — `report` (which it now calls rather than re-implements). Subsumption test: `import` uniquely owns *data ingestion* (CSV detection, copy-to-exports, CLI invocation, baseline creation); `report` owns *presentation* of already-imported data. The Step 6 hand-off is the explicit de-duplication ("keeping a second analysis pipeline here drifted out of sync"). Clean separation — no subsumption, and a redundancy already removed.
- **Invocation leverage** — Moderate; "import analytics", "import CSV", "parse LinkedIn data". A distinct mechanical intent (you must import before you can report).
- **Recommendation** — **keep.**
- **Rationale** — Unique ingestion surface; the analysis overlap with `report` was already collapsed (delegation), which is exactly the discipline this audit endorses.
### `report`
- **Purpose** — Generate weekly/monthly/heatmap performance reports from imported data via the `trends` CLI: metrics table, top performers, 4-week trend, alert detection, `analytics-interpreter` (report mode) recommendations, markdown export.
- **Overlap with siblings** — `import` (which delegates *to* it), `analyze` (troubleshooting), `audit` (strategy review). Subsumption test: `report` is the only *recurring-numbers reporting* surface and the shared analysis engine `import` reuses. It does not diagnose recovery (`analyze`) or run the quarterly strategy lookback (`audit`). No subsumption.
- **Invocation leverage** — High and distinct: "weekly report", "performance report", "how did I do", "show my stats". Recurring intent.
- **Recommendation** — **keep.**
- **Rationale** — Canonical reporting engine, now the single analysis pipeline both it and `import` use; distinct from `analyze`/`audit`.
### `ab-test`
- **Purpose** — Full A/B testing lifecycle (design → log → analyze → history → suggest) with a directional-not-significant statistical honesty layer; delegates optimized-variant rewrites to `content-optimizer`.
- **Overlap with siblings** — `report`/`analyze` (it cross-references analytics data; offers "View weekly performance report"). Subsumption test: `ab-test` uniquely owns the *experiment* surface (hypothesis, variant design, running comparison, verdict heuristic). No other command designs or tracks experiments; it merely *reads* analytics for cross-reference. No subsumption.
- **Invocation leverage** — Moderate-to-high; specific trigger set ("A/B test", "test my hooks", "compare formats", "split test", "which hook works"). Distinct, directly-typed intent.
- **Recommendation** — **keep.**
- **Rationale** — Entirely unique experimentation surface; the analytics commands it links to don't touch experiments.
---
## Group G — Growth / strategy (2)
### `strategy`
- **Purpose** — Phase-based growth plan (Phase 04 by follower count) + trajectory overlay + authority-building/signature-content compounding (Phase 2+). The canonical trajectory source `audit` defers to. Absorbed the former `authority` command (v2.0.0).
- **Overlap with siblings** — `audit` (names the gap, routes here for the fix), `profile` (which `strategy` defers to for profile-alignment), `monetize` (Phase 3+ monetization setup is mentioned but not owned here). Subsumption test: `strategy` uniquely owns the phase roadmap + trajectory prescription + authority compounding. It explicitly delegates profile to `profile`. No subsumption.
- **Invocation leverage** — High; very broad trigger set ("growth plan", "build authority", "signature content", "linkedin roadmap", "my best content"). Also the router's destination for milestone/follower-progress and the below-1K nudge target.
- **Recommendation** — **keep.**
- **Rationale** — Deep, canonical growth+authority surface that absorbed `authority`; the hub other commands (`audit`, the 1K-gated ones) route toward.
### `profile`
- **Purpose** — The canonical profile/topic-relevance optimization checklist (7 sections: Headline/About/Experience/Featured/Skills/Network/Engagement) for the 2026 relevance model + the profile-SEO/search-surface layer. The single source `analyze`, `audit`, and `strategy` all defer to.
- **Overlap with siblings** — `analyze` (Step 6 "If Profile-Content Mismatch" routes here), `audit` (Step 6 routes here), `strategy` (authority audit defers profile signals here). Subsumption test: `profile` is explicitly the *canonical* profile audit — three siblings delegate to it rather than duplicate it. None subsumes it; it subsumes none of them (no content/analytics/growth surface). This is textbook clean delegation.
- **Invocation leverage** — High and specific: "optimize profile", "profile audit", "fix my profile", "why is my reach low" (profile angle). Distinct, directly-typed intent.
- **Recommendation** — **keep.**
- **Rationale** — The single profile source-of-truth that three other commands point to; cutting/merging it would scatter the checklist they deliberately centralized.
---
## Group H — Gated at ~1K followers (3)
### `monetize`
- **Purpose** — Monetization strategy: readiness scorecard, 4 stage-specific plans, lead-magnet blueprint, 4-week funnel, DM conversion workflow, CTA optimization, featured-section + revenue-model worksheets. Soft-gated at ~1K.
- **Overlap with siblings** — `strategy` (growth phases overlap the monetization stages; `strategy` Phase 3 mentions "lead magnets and monetization setup"), `outreach` (both 1K-gated revenue/opportunity surfaces). Subsumption test: `monetize` uniquely owns the *revenue mechanics* (pricing, offers, funnels, lead magnets, DM conversion). `strategy` only *mentions* monetization as a Phase 3+ focus area; it does not build a funnel or price an offer. `outreach` is collaborations/speaking, not products/funnels. No subsumption.
- **Invocation leverage** — Moderate; specific ("monetize", "lead generation", "consulting pipeline", "pricing strategy", "lead magnet"). Soft-gated, so naturally lower-frequency until the audience exists.
- **Recommendation** — **keep.**
- **Rationale** — Deep, unique revenue-mechanics surface; `strategy`'s monetization mention is a pointer, not a duplicate. The soft-gating is honest (works at any count, value compounds at 1K).
### `outreach`
- **Purpose** — Two-track orchestrator (collaborations + speaking) under one pitch paradigm: readiness, partner/event search + scoring, 12 collab formats + 4 talk templates, outreach messages, co-creation workflow + speaker portfolio, pipeline trackers (now state-persisted via `recordOutreachContact`), progression ladders. Absorbed the former `collab` + `speaking` commands (v2.0.0). Delegates to `network-builder`.
- **Overlap with siblings** — `monetize` (both 1K-gated), `strategy` (Phase 2+ collaborations). Subsumption test: `outreach` uniquely owns the partner/event pitch machinery. `strategy` only *names* collaborations as a focus area; `monetize` is products not partnerships. No subsumption. Internally it consolidated two commands and has an explicit capability checklist proving nothing was lost in that merge — a model of disciplined consolidation.
- **Invocation leverage** — Moderate; very broad trigger set spanning both tracks ("collaboration", "co-author", "speaking", "CFP", "pitch a talk", "outreach"). Soft-gated.
- **Recommendation** — **keep.**
- **Rationale** — Unique, deep two-track outreach surface that already consolidated `collab`+`speaking` cleanly; not subsumed.
### `competitive`
- **Purpose** — Competitive analysis of niche thought leaders: identify competitors (WebSearch), content/hook/engagement analysis, landscape map, gap analysis, differentiation strategy, inspired-not-copied takeaways.
- **Overlap with siblings** — `strategy` (differentiation is a growth lever there), `audit` (analyzes *your* content; this analyzes *others'*). Subsumption test: `competitive` is the only *external/competitor-facing* analysis surface. `audit` is inward-facing; `strategy` prescribes *your* plan, not a competitor scan. No subsumption.
- **Invocation leverage** — Low-to-moderate; specific ("competitive analysis", "analyze competitor", "what are others doing", "learn from others"). A periodic, distinct intent. CLAUDE.md/README describe it as 1K-gated in the same breath as monetize/outreach, though the file itself carries no gating logic.
- **Recommendation** — **keep** (with a minor honesty note).
- **Rationale** — Unique outward-facing competitive surface; nothing else scans competitors. Note: the router does not actually list `competitive` under the 1K-gated group nor apply the below-1K nudge to it (unlike `monetize`/`outreach`), and the command body has no follower check — a small documentation-vs-behavior inconsistency for the operator to reconcile, not a reason to merge or cut.
---
## Summary table
| Command | Recommendation | Merge target | One-line reason |
|---------|---------------|--------------|-----------------|
| `linkedin` | keep | — | Structural router; highest-leverage front door (minor map-staleness nit). |
| `post` | keep | — | Canonical long-band creation + refine/optimizer surface; core entry. |
| `quick` | keep | — | Unique short-band + the 8-template library `templates` folded into. |
| `react` | keep | — | Unique URL-ingestion + multi-source synthesis; directly-typed intent. |
| `pipeline` | keep (flag) | — | No clean subsumption, but a thin re-statement of `post`+`calendar`+`firsthour`; watch for erosion. |
| `carousel` | keep | — | Deep unique carousel/document engine + image generation. |
| `video` | keep | — | Unique LinkedIn-native video scripting + `video-scripter`. |
| `multiplatform` | keep (flag) | — | Unique Twitter/X + cross-platform surface; thinnest command, develop-candidate (could wire `content-repurposer`). |
| `newsletter` | keep | — | The long-form spine; everything long-form routes here. |
| `headless-review` | keep | — | Unique fresh-session cold-isolation a `newsletter` phase can't provide. |
| `pivot` | keep | — | Unique re-open state surgery `newsletter` delegates out. |
| `onboarding` | keep | — | Unique cohesive wizard + cross-phase triage; orchestrates, not duplicates. |
| `setup` | keep | — | Canonical full 8-category personalization; `onboarding` defers here. |
| `first-post` | keep | — | Unique first-timer scaffolding + `first_post_date` side-effect. |
| `batch` | keep | — | Unique multi-post-week + iCal; queue-write is shared plumbing. |
| `calendar` | keep | — | Canonical queue + publish action (absorbed `publish`). |
| `firsthour` | keep (note) | — | Unique worked first-hour plan; wiring point for orphaned `engagement-coach`. |
| `analyze` | keep | — | Unique troubleshooting/recovery surface; works without imported data. |
| `audit` | keep | — | Unique holistic strategy review; delegates fix to `strategy`/`profile`. |
| `import` | keep | — | Unique ingestion surface; analysis already delegated to `report`. |
| `report` | keep | — | Canonical reporting engine + shared analysis pipeline. |
| `ab-test` | keep | — | Entirely unique experimentation lifecycle. |
| `strategy` | keep | — | Canonical phase+trajectory+authority hub (absorbed `authority`). |
| `profile` | keep | — | Single profile source-of-truth three commands delegate to. |
| `monetize` | keep | — | Unique revenue-mechanics surface; honest soft-gating. |
| `outreach` | keep | — | Unique two-track pitch surface (absorbed `collab`+`speaking`). |
| `competitive` | keep (note) | — | Unique outward competitor scan; minor gating doc-vs-behavior nit. |
**Tally: keep 27 · merge 0 · cut 0.** Two keeps carry a flag — `pipeline` (inconclusive, retained) and `multiplatform` (develop-candidate).
---
## Count-impact summary (if every recommendation were applied as-is)
Every recommendation is **keep**. Therefore, if all were applied:
- **Commands removed:** 0 (0 cut + 0 merged-away).
- **Resulting count:** **27** — unchanged.
- **Lint / roster surfaces needing update:** **none.** `EXPECT_COMMANDS=27` in
`scripts/test-runner.sh` stays as-is; the CLAUDE.md command table (27), the
README command table, the `commands` header the lint checks, the router
`commands/linkedin.md`, and any SKILL roster all remain at 27. No roster
touched, no count contract changed.
This mirrors the agent-overlap outcome in `overlap-measurement.md` (no agent
trimmed → 19/27 baseline unchanged): the command surface, audited under the same
subsumption discipline, also holds — every command has a unique surface or a
justified redundancy, and the two prior consolidations (`templates`/`publish`/
`authority`/`collab`/`speaking``quick`/`calendar`/`strategy`/`outreach`, and
the `import``report` analysis delegation) have already removed the genuine
duplications. The surface is over-grown only in *count*, not in *redundancy*.
The recommendations are informational; the operator decides per command. Two
non-blocking honesty nits surfaced along the way (each a wiring/doc fix, not a
merge/cut; a claimed third was withdrawn on verification):
1. The router lists `post-feedback-monitor` (agent) under Post-Publish but not the
new `/linkedin:firsthour` command.
2. `calendar`'s publish-action first-hour block and `firsthour` share trigger
phrases ("just published") and should cross-link.
3. ~~`competitive` 1K-gating doc-vs-behavior.~~ **Withdrawn on verification:**
CLAUDE.md `:64`, README `:222`, the router, and the command body all leave
`competitive` ungated — only `monetize`/`outreach` carry "(unlocks at ~1K)".
No inconsistency exists; the claimed nit was unfounded.
---
## Honest-uncertainty list (inconclusive — retain pending operator view)
- **`pipeline`** — *inconclusive, retained.* It has no clean subsumption (it
uniquely *sequences* draft → schedule → first-hour → analysis into one guided
run), which under the trim rule mandates retention. But its constituent steps
are each a thinner inline condensation of richer leaf commands
(`post` / `calendar` / `firsthour`), and its trigger set is narrow/jargon-y, so
its real-world leverage as a *natural type* is the weakest in Group B. I could
not decide whether the orchestration value justifies the standalone command
versus folding its unique sequencing into `post` (with an explicit
schedule + first-hour hand-off). Per the methodology: **inconclusive — retain
pending operator view.** This is the one command where a future, operator-blessed
merge could be defensible; the evidence informs but does not compel it.
All other 26 commands are clear **keep** decisions with no residual uncertainty.