ktg-plugin-marketplace/plugins/linkedin-studio/docs/remediation/c13-c46-triage.md
Kjell Tore Guttormsen 2633d329b2 docs(linkedin-studio): S17 — C13–C46 triage (0 still-real) closes audit remediation
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>
2026-05-31 04:45:11 +02:00

11 KiB
Raw Permalink Blame History

C13C46 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 C1C12. 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 (C1C12) were calibrated and remediated in v4.0.0, leaving ~34 uncalibrated (C13C46). 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 C1C12 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) … ~48+ 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 S13S17 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 C13C46 grouping has a recorded disposition; none is still-real. With the gate green, S17 — and the baseline-audit remediation as a whole — is complete.