# C13–C46 Triage — disposition of the uncalibrated audit findings

> **Session:** S17 (last finish-plan session). **Source:** the ~34 findings the
> 2026-05-29 baseline audit (`docs/critical-review-2026-05-29.local.md`) flagged in
> §10 as *file-evidenced but uncalibrated* — never put through the second hostile-read
> pass that calibrated C1–C12. **Method:** independent COLD read delegated to an Opus
> Agent (no drafting-session context), every disposition then **grep-verified in the
> main session** against the current code (v4.1.0). Triage only changes state by
> *recording a disposition*; any still-real finding is fixed inline before this file is
> committed.

## How the ~34 canonical findings map here

The audit never persisted a discrete `C13 … C46` list — §10 reports "46 total canonical
findings", of which 12 (C1–C12) were calibrated and remediated in v4.0.0, leaving **~34
uncalibrated (C13–C46)**. The published audit body is the canonical record: it surfaces
the load-bearing uncalibrated ones as `[unverified-major]` / `[unverified-minor]` and
folds the rest into §5 / §6 / §9 prose. The 24 grouped findings below cover that set;
several are multi-sub-claim bundles (F-VIDEO = 3, F-SKILL-ROUTER = 3, F-GENERALIZE = 2),
which expands the count toward ~34 when each sub-claim is counted. The §3/§3b numeric
algorithm-claim rows were the *calibrated* C1–C12 set (carousel 6.6 %/1.92 %, comment
15x/5x, link penalty, 360Brew name/date) — already remediated in v4.0.0 and enforced by
`test-runner.sh` Section 8; not re-triaged here, confirmed green.

## Disposition summary

**0 still-real · 23 already-fixed · 1 outdated-drop (deliberate decision)** across the 24
grouped/sub-claim entries in the table below (the audit bundles F-VIDEO into 3 sub-claims
and F-SKILL-ROUTER into 3; counting bundles as single groups gives "19 already-fixed, 1
outdated-drop", same verdict). No inline fix was required for S17. Gate at triage time:
`test-runner.sh` **74/0/0**, hooks `node --test` **98/98**, analytics `npm test`
**116/116**.

| ID | Finding (short) | Sev | Disposition | Evidence (current code) |
|----|-----------------|-----|-------------|--------------------------|
| **F-LINT** | Dead structural lint (29 failures; stale `linkedin:NAME.md` layout, 14-agent list, deleted `personalization-scorer`, fabricated `auto_discover`) | major | already-fixed | `scripts/test-runner.sh` runs **74 pass / 0 fail / 0 warn, exit 0**; derives counts dynamically + asserts `EXPECT_AGENTS/COMMANDS/REFS/SKILLS = 19/29/25/6` |
| **F-SCHED** | Auto-publish / scheduling boundary never disclosed | major | already-fixed | `README.md` Boundaries §; `commands/calendar.md:92-93` — tool does **not** post on your behalf |
| **F-PROFILE-SEO** | `/linkedin:profile` is a credibility checklist, not an SEO/search surface | minor | already-fixed | `commands/profile.md` Profile-SEO §: headline-as-highest-weight, per-section keyword table, search-index, semantic search |
| **F-VIDEO (a)** | No hard 9:16 (1080×1920) + 3-sec-hook gate | major | **outdated-drop** | Deliberate: `commands/video.md` — 4:5/1:1 for feed, 9:16 = opt-in; "3-sec hook" framed as cross-platform folklore, not a LinkedIn ranking signal |
| **F-VIDEO (b)** | 4:5 "preferred" vs "deprioritized" self-contradiction across files | major | already-fixed | Consistent "preferred" in `commands/video.md`, `references/video-strategy-guide.md`, `references/linkedin-formats.md`; no "deprioritized" string remains |
| **F-VIDEO (c)** | No caption / SRT output | major | already-fixed | `commands/video.md` (SRT upload / native auto-captions + caption block); `references/video-strategy-guide.md` |
| **F-VIDEO-TASK** | `video.md` had no `Task` tool to call its own agent | major | already-fixed | `commands/video.md:15` (`Task` in the allowed-tools block at `:8-16`); `:81` invokes `subagent_type: linkedin-studio:video-scripter` |
| **F-NEWSDIST** | Newsletter *distribution* mechanics omitted (notification leverage, cadence, funnel, cold-start) | minor | already-fixed | Distribution layer in `commands/newsletter.md` (delingstekst + hook gate); mechanics in `references/newsletter-strategy-guide.md`, linked from `strategy.md`/skills |
| **F-OUTREACH** | Templates-without-tracking (no pipeline state) | minor | already-fixed | `commands/outreach.md` pipeline board/tracker (Step 8); `hooks/scripts/state-updater.mjs` `recordOutreachContact()` |
| **F-DEAI** | No short-form de-AI/differentiation gate; `differentiation-checker`+`voice-trainer` orphaned | major | already-fixed | `differentiation-checker` wired in `post/quick/react/carousel/video` (5 cmds); `voice-trainer` in `setup.md` |
| **F-ONBOARD-INLINE** | Onboarding dead-ends at "go run /linkedin:first-post" | major | already-fixed | `commands/onboarding.md` — drafts the first post **inline**; "do NOT hand off to another command" |
| **F-ROUTER** | Flat 22-item router menu | major | already-fixed | `commands/linkedin.md` — five-journey tiering (Start·Create·Engage·Measure·Grow) + front-doors + ~1K soft-gating |
| **F-NEWS-BANNER** | No time/effort expectation atop `/linkedin:newsletter` | major | already-fixed | `commands/newsletter.md:25-28` — "multi-session, multi-gate (16 phases) … ~4–8+ hours" banner |
| **F-CAROUSEL-CLIP** | Only the caption copied, not the full deck | major | already-fixed | `commands/carousel.md:191` — "Assemble the entire deck — every slide's copy … into ONE clipboard payload" |
| **F-PILLAR-COUNT** | `setup.md` (5) vs `onboarding.md` (3-5) pillar disagreement | minor | already-fixed | The named disagreement is closed — both now **declare 5**: `commands/setup.md:312-313`, `commands/onboarding.md:155` (and `profile.md:155,198`). See note¹ — the surviving "3-5 core topics" strings are a distinct focus-discipline heuristic, not the pillar-count declaration. |
| **F-ORPHANS** | 11 of 19 agents never invoked by any command | major | already-fixed | All 11 wired — per-agent map below (each ≥1 command) |
| **F-PFM-MODEL** | `post-feedback-monitor` on Haiku doing numeric reasoning | minor | already-fixed | `agents/post-feedback-monitor.md:15` `model: opus`; lint Section 10 enforces model-consistency |
| **F-PERSONA-LAYER** | v3.1 per-artifact-persona resolution at the wrong layer | judgment | already-fixed | Resolution moved to orchestrator: `commands/newsletter.md` 4-tier fallback (edition-state → series file → plugin library → interactive); agent only documents the library |
| **F-TRIO-OVERLAP** | Measure review-trio overlap before defending the redundancy | major | already-fixed | `docs/remediation/overlap-measurement.md` measured catch-sets on the shared Del 4 edition → NO-TRIM (every gate ≥1 unique catch; the 4 overlaps justified, no subsumption) |
| **F-SKILL-ROUTER (a)** | Router skill still says "thought leadership plugin" | major | already-fixed | `skills/linkedin-studio/SKILL.md` — 0 occurrences of "thought leadership plugin"; named "LinkedIn Studio" |
| **F-SKILL-ROUTER (b)** | Router skill lists 14 agents | major | already-fixed | `skills/linkedin-studio/SKILL.md` "All Agents" table = **19** rows |
| **F-SKILL-ROUTER (c)** | Router skill omits `newsletter`/`headless-review`/`pivot`/`react` | major | already-fixed | `skills/linkedin-studio/SKILL.md` — all four present in the command table |
| **F-GENERALIZE** | Norwegian lock + private series-path default + undocumented env-var + non-shipping contract | major | already-fixed (M0 sub-claim correctly deferred) | Path parameterized `${LTL_SERIES_ROOT:-$HOME/linkedin-series}` (`commands/newsletter.md:46,148-149`, env-var documented); language configurable (`agents/language-reviewer.md`, default `en`); **no `/Users/ktg` or `maskinrommet/serier` in any shipping file**; contract has in-tree fallback (`references/longform-quality-rules.md`) |
| **F-COUNT-STRINGS** | Stale "25 commands"/count strings in onboarding/router/skill | minor | already-fixed | `commands/onboarding.md` says "29 commands"; remaining count strings are version-history prose; lint guards the current declarations |

## F-ORPHANS — per-agent wiring map (all 11 closed)

| Agent | Wired into (`subagent_type: linkedin-studio:<name>`) |
|-------|------------------------------------------------------|
| content-optimizer | `ab-test.md`, `post.md` |
| strategy-advisor | `strategy.md` |
| analytics-interpreter | `report.md`, `analyze.md` |
| engagement-coach | `firsthour.md` |
| content-planner | `pipeline.md`, `batch.md` |
| network-builder | `outreach.md` |
| trend-spotter | `pipeline.md`, `batch.md` |
| voice-trainer | `setup.md` |
| differentiation-checker | `post.md`, `quick.md`, `react.md`, `carousel.md`, `video.md` |
| post-feedback-monitor | `calendar.md`, `firsthour.md` |
| video-scripter | `video.md` |

## Non-findings (cosmetic only — no action; recorded so they aren't re-raised)

- **`agents/language-reviewer.md` description/intro prose** still says "Norwegian", but the
  agent *body* resolves the language via the `language` parameter (default `en`), so
  behavior is generalized. Legacy wording, not a defect.
- **"LinkedIn thought leadership" phrases** in `commands/linkedin.md`, `onboarding.md`,
  `post.md`, `README.md` describe the content *domain*, not the plugin *name* — the rename
  to "LinkedIn Studio" is complete. Not stale.
- **¹ "3-5 core topics" in `commands/analyze.md:58,239` and `commands/profile.md:67`** is a
  *focus-discipline heuristic* — a diagnostic/health-check tolerance band ("are you staying
  within a focused 3-5 range?"), NOT a declaration of the pillar count. The audit's
  F-PILLAR-COUNT finding was specifically the **declarative** disagreement between `setup.md`
  (define 5) and `onboarding.md` (3-5), which is resolved (both declare 5). The tolerance band
  is consistent advice (define 5; don't sprawl past it) and was deliberately left as-is —
  editing it would be out-of-scope scope creep on a finding the audit never raised. Recorded
  so the precise boundary of the closed finding isn't mistaken for a tree-wide claim.

## Scope boundary recorded

**M0 (move all mutable personal data out of the plugin tree into a per-user data dir)** is
the only audit-adjacent item deliberately **out of S13–S17 scope** — it belongs to the
separate UI/companion track (UI-brief §9b/M0). S16 routed analytics I/O through the
`getAnalyticsRoot()` seam so M0 can relocate the root in one place later. F-GENERALIZE's
*parameterize-the-path / document-the-override* sub-claims are closed here; its
*relocate-all-data* sub-claim is correctly deferred, not dropped.

## Verdict

Every C13–C46 grouping has a recorded disposition; **none is still-real**. With the gate
green, S17 — and the baseline-audit remediation as a whole — is complete.
