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

106 lines
11 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.

# 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.