Cold-read triage of the ~34 uncalibrated baseline-audit findings (C13–C46) that never got a second hostile pass. An independent Opus reader classified each against the current code; every disposition was grep-verified in the main session. Result: 0 still-real, 23 already-fixed, 1 outdated-drop (24 grouped/sub-claim entries). No inline code fix needed — the v4.0.0 + S13–S16 remediation had already closed every still-real item (dead lint, 11 orphan agents, carousel full-deck clipboard, router tiering, onboarding inline, de-AI gate, video gate, post-feedback-monitor->Opus, series-path parameterization, SKILL roster). Deliverable: docs/remediation/c13-c46-triage.md (disposition record) + docs/remediation/review.md (S17 review, ALLOW). /trekreview: brief-conformance 0 findings; code-correctness 2 MAJOR in the triage doc's own prose (one overclaim, one line-pointer) FIXED in-session — no false-green disposition. Gate: test-runner.sh 74/0/0, hooks node --test 98/98, analytics 116/116. M0 (per-user data-dir migration) deferred to the UI track. Remediation COMPLETE. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
11 KiB
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.mddescription/intro prose still says "Norwegian", but the agent body resolves the language via thelanguageparameter (defaulten), so behavior is generalized. Legacy wording, not a defect.- "LinkedIn thought leadership" phrases in
commands/linkedin.md,onboarding.md,post.md,README.mddescribe 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,239andcommands/profile.md:67is 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 betweensetup.md(define 5) andonboarding.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.