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>
This commit is contained in:
Kjell Tore Guttormsen 2026-05-31 04:45:11 +02:00
commit 2633d329b2
2 changed files with 194 additions and 93 deletions

View file

@ -1,13 +1,13 @@
---
type: trekreview
review_version: "1.0"
task: "S16 — saves manual-entry surface (lifts the original Non-Goal): optional saves in the analytics data model (types + parser + weekly/monthly + CLI), built location-agnostic for M0 (option c); + S16-pre: close the deferred onboarding Write MAJOR"
task: "S17 — triage the ~34 uncalibrated audit findings (C13C46): classify each still-real / already-fixed / outdated-drop, close every still-real one, record disposition in docs/remediation/c13-c46-triage.md. Last finish-plan session."
slug: remediation
project_dir: docs/remediation/
brief_path: docs/remediation/brief.md
scope_sha_start: 8c52bdb
scope_sha_end: 8c52bdb
reviewed_files_count: 15
scope_sha_start: 55c94ee
scope_sha_end: 55c94ee
reviewed_files_count: 1
verdict: ALLOW
mode: default
effort: standard
@ -15,137 +15,132 @@ profile: premium
findings: []
---
# Review — linkedin-studio S16 (saves manual-entry + S16-pre onboarding Write)
# Review — linkedin-studio S17 (C13C46 triage)
## Executive Summary
**Verdict: ALLOW** for S16's delivered scope — 0 BLOCKER, 0 MAJOR, 0 MINOR, 0 SUGGESTION
**open** against the diff. Two independent reviewers (brief-conformance, code-correctness)
ran COLD, without cross-feeding, on the as-delivered uncommitted working tree (HEAD
`8c52bdb` + the S16 delta).
**Verdict: ALLOW** for S17's delivered scope — 0 BLOCKER, 0 MAJOR, 0 MINOR, 0 SUGGESTION
**open**. Two independent reviewers (brief-conformance, code-correctness) ran COLD, without
cross-feeding, on the as-delivered uncommitted working tree (HEAD `55c94ee` + the single new
file `docs/remediation/c13-c46-triage.md`).
- **brief-conformance-reviewer:** **0 findings.** Every Success Criterion traces to delivered
code (SC1 saves in types + parser + import/report; SC2 saves in the actionable-signal output;
SC3 dwell still explicitly unmeasurable, no fabricated field; SC4 backward-compat + no-crash;
SC5 onboarding `Write`). Every Non-Goal honored: **M0 not built** (I/O still routes through the
unmodified `getAnalyticsRoot()` seam — option (c)), dwell not fabricated, surface counts
(29/19/6/9) and version (v4.1.0) unchanged, no not-mine file touched.
- **code-correctness-reviewer:** **2 MAJOR — both in S16's own new code, both FIXED in-session**
(see Findings). Neither is pre-existing; both are lockstep misses in the saves parser delivered
this session, so per the operator rule ("in-session fix of the session's *own* misses =
completion") they were corrected here, not deferred.
S17 is a **triage session**: an independent Opus cold-reader classified every uncalibrated
audit finding (C13C46) against the current code, and the result was **0 still-real, 23
already-fixed, 1 outdated-drop** (across 24 grouped/sub-claim entries). Because nothing was
still-real, **S17 made no code change** — its sole deliverable is the disposition record. Every
"already-fixed" disposition was independently grep-verified in the main session before the doc
was written (orphan wiring, lint, carousel deck, SKILL roster, model tier, video-Task,
de-AI gate, series-path generalization).
The M0 conflict (UI-brief §9b) was reconciled **before** building, by operator decision =
**option (c): build now, location-agnostic**. The conformance reviewer independently confirmed
the build honors it (no new hardcoded `assets/analytics` path; `storage.ts` untouched).
- **brief-conformance-reviewer:** **0 findings.** The S17 success criterion ("every
uncalibrated audit finding C13C46 has a recorded disposition") is fully met — every
`[unverified-*]`-tagged finding and every uncalibrated §5/§6/§9 prose finding maps to a
disposition row; each is a valid single classification with cited current-code evidence; M0
is recorded as **deferred** (UI track), not done; the 3 not-mine untracked files are not
referenced; summary counts reconcile with the table rows.
- **code-correctness-reviewer:** **2 MAJOR — both in S17's own deliverable (the triage doc),
both FIXED in-session.** Neither is a false-green disposition: the reviewer independently
re-opened every spot-checked "already-fixed" row (incl. F-LINT, F-ORPHANS ×11,
F-SKILL-ROUTER a/b/c, F-CAROUSEL-CLIP, F-PFM-MODEL, F-DEAI, F-GENERALIZE, F-VIDEO-TASK) and
**every disposition held**. The 2 MAJORs were citation/overclaim defects in the doc's prose
(see Findings) — lockstep misses in the artifact written this session, so per the operator
rule ("in-session fix of the session's *own* misses = completion") they were corrected here.
## Coverage
Scope: HEAD `8c52bdb` (S15's commit) + the **uncommitted S16 working-tree delta** (annotated
`[uncommitted]` — a brief-level contract; the brief's Assumptions allow uncommitted review).
The 3 untracked not-mine files (`docs/linkedin-studio-persona-brief.md`, `…-ui-brief.md`,
`docs/voyage-build/progress.json`) are explicitly excluded from scope and from the commit.
**No silent skips.**
Scope: HEAD `55c94ee` (S16's commit) + the **uncommitted S17 working-tree delta** — one new
untracked file, `docs/remediation/c13-c46-triage.md` (annotated `[uncommitted]`; the brief's
Assumptions allow uncommitted review). The 3 untracked not-mine files
(`docs/linkedin-studio-persona-brief.md`, `…-ui-brief.md`, `docs/voyage-build/progress.json`)
are explicitly excluded from scope and from the commit. **No silent skips.**
| Treatment | Count | Notes |
|-----------|-------|-------|
| `deep-review` | 0 | nothing under `hooks/**` / `auth/**` / `crypto/**` / `**/security/**` (analytics CLI + one command frontmatter) |
| `summary-only` | 15 | analytics src (5) + analytics tests (3) + 2 fixtures + assets/analytics/README.md + README.md + CHANGELOG.md + commands/onboarding.md |
| `deep-review` | 0 | nothing under `hooks/**` / `auth/**` / `crypto/**` / `**/security/**` |
| `summary-only` | 1 | `docs/remediation/c13-c46-triage.md` (documentation deliverable; "correctness" = factual accuracy of the disposition claims) |
| `skip` | 0 | no lockfiles / svg / generated / dist |
**Execution criteria (orchestrator-run):**
- `npx tsc --noEmit` (analytics) → **clean** (the new `RankableMetric` type closes the
`metrics[keyof]` widening the optional `saves` would otherwise introduce in `alerts.ts` + `cli.ts`).
- `node --import tsx --test tests/*.test.ts` (analytics) → **116/116**.
**Execution criteria (orchestrator-run, at triage time):**
- `bash scripts/test-runner.sh`**74 passed / 0 failed / 0 warnings**, exit 0.
- `node --test hooks/scripts/__tests__/*.test.mjs`**98/98** (no hook logic changed).
- `ls commands/*.md`**29** (no surface-count change; no version bump — within-v4.1.0 refinement, S11S13 precedent).
- **E2E:** import + weekly + monthly with a saves fixture surfaces saves without crashing;
saves-free fixtures round-trip byte-identical; explicit `"0"``0`, blank/`"n/a"` → undefined.
- `node --import tsx --test tests/*.test.ts` (analytics) → **116/116** (no analytics code changed).
- tsc unchanged from S16's clean state (S17 touches no `.ts`).
- Disposition spot-checks: all ~15 sampled "already-fixed" rows independently confirmed against
current code; **no false-green** found.
## Findings
**0 open findings.** Code-correctness raised 2 MAJOR; both are **S16's own** new code (not
pre-existing — the saves parser is new this session), so both were **fixed in-session** as
completion of the delivered work, then re-verified green. Recorded below — not dropped, not
silenced.
**0 open findings.** Code-correctness raised 2 MAJOR; both are **S17's own** deliverable (the
triage doc written this session), so both were **fixed in-session** as completion of the
delivered work, then re-verified. Recorded below — not dropped, not silenced.
### [MAJOR — FIXED in-session] Non-numeric Saves cell silently coerced to 0 (`unknown != 0` contract violated)
### [MAJOR — FIXED in-session] F-PILLAR-COUNT prose overclaimed a tree-wide property
*Raised by code-correctness (`PLAN_EXECUTE_DRIFT`), `scripts/analytics/src/parsers/csv-parser.ts`.*
*Raised by code-correctness (`PLAN_EXECUTE_DRIFT`), `docs/remediation/c13-c46-triage.md`.*
The original guard `if (savesRaw && savesRaw.trim() !== "")` then `metrics.saves =
parseMetric(savesRaw)` gated only on emptiness; `parseMetric` ends in `parseFloat(...) || 0`
+ `Math.max(0, …)`, so a non-empty non-numeric cell (`"n/a"`, `"~40"`) or a negative value
flattened to **0** — surfaced as a confident "top engagement signal". This contradicts the
`unknown != 0` contract stated in the same diff (`types.ts` saves NOTE + the parser comment).
The F-PILLAR-COUNT row asserted "*no 3-5 pillar range remains*". The cited locations
(`setup.md:312`, `onboarding.md:155`) are accurate and the audit's actual finding — the
**declarative** disagreement between `setup.md` (define 5) and `onboarding.md` (3-5) — is
genuinely resolved (both declare 5). But the universal clause was false: `analyze.md:58,239`
and `profile.md:67` still carry "3-5 core topics". In a verification artifact whose value is
citation precision, asserting an unverified tree-wide property is an overclaim.
**Fix (this session):** added a dedicated `parseOptionalCount()` helper returning
`number | undefined` — blank / non-numeric / negative → `undefined`; a genuine number
(including explicit `"0"`) → that number; reuses the EU/US separator normalization. The saves
parse now routes through it. The blank-cell path is unchanged; the garbage/negative path now
honors the contract.
**Fix (this session):** narrowed the disposition to the named files (the closed finding) and
added **note¹** recording that the surviving "3-5 core topics" strings are a *focus-discipline
heuristic* (a health-check tolerance band), semantically distinct from the pillar-count
declaration, deliberately left as-is (editing them would be out-of-scope on a finding the audit
never raised). The disposition stays `already-fixed` and is now precise.
### [MAJOR — FIXED in-session] No test for the explicit-`0` vs non-numeric Saves boundary
### [MAJOR — FIXED in-session] F-VIDEO-TASK cited the wrong line for the `Task` tool
*Raised by code-correctness (`MISSING_TEST`), `scripts/analytics/tests/csv-parser.test.ts`.*
*Raised by code-correctness (`PLAN_EXECUTE_DRIFT`), `docs/remediation/c13-c46-triage.md`.*
The original saves tests covered `42`, blank→undefined, no-column→undefined, and
engagement-exclusion — but not the exact boundary where the parser's behavior diverged from
its intent: a literal `"0"` (genuine zero) vs a non-numeric cell (unknown).
The row cited `commands/video.md:8` for the `Task` allowed-tools entry; `:8` is the
`allowed-tools:` block header — the `Task` list item is at `:15`. The disposition is
substantively correct (`Task` is present; the `video-scripter` invocation at `:81` was cited
exactly), but the pointer landed on the block header.
**Fix (this session):** added `tests/fixtures/saves-edge-export.csv` (a `"0"` row + an `"n/a"`
row) and two cases pinning `saves === 0` for `"0"` and `saves === undefined` for non-numeric.
The non-numeric case was **red** before the parser fix above and **green** after (TDD), so the
contract boundary is now regression-guarded.
### [MAJOR — CLOSED] (carried from S15) onboarding Phase 2 file-saves need `Write`
*S15's deferred finding.* `commands/onboarding.md` Phase 2 saves voice/user-profile files but
the frontmatter omitted `Write`. **Closed in S16-pre:** `Write` added to `allowed-tools`
(matching `first-post.md:9-14`).
**Fix (this session):** corrected to `commands/video.md:15` (the `Task` list item, in the
`:8-16` block). Confirmed by direct read: line 15 is exactly ` - Task`.
## Remediation Summary
**Gate: ALLOW** for S16's delivered scope. brief-conformance is clean; code-correctness's two
MAJORs were S16's own lockstep misses (not pre-existing design findings), so both were fixed
in-session and re-verified (tsc clean, analytics 116/116, lint 74/0/0, hooks 98/98) — this is a
genuine ALLOW with **no open finding**, not a WARN-override. The M0 conflict was reconciled
before building (option c, location-agnostic); the conformance reviewer confirmed M0 was not
built and the data-dir seam (`getAnalyticsRoot()`) is untouched, so the planned migration
relocates the root in one place. The S15-deferred onboarding `Write` MAJOR is closed.
**Gate: ALLOW** for S17's delivered scope. brief-conformance is clean; code-correctness's two
MAJORs were S17's own lockstep misses in the triage doc (citation precision / prose overclaim,
**not** false-green dispositions — every spot-checked "already-fixed" row held), so both were
fixed in-session and re-verified — a genuine ALLOW with **no open finding**, not a
WARN-override.
Per Handover 6, this `review.md` is consumable by `/trekplan --brief …`. ALLOW → S16 commits +
pushes (own files only); the finish-plan continues at **S17** (C13C46 triage).
S17 closes the baseline-audit remediation: every uncalibrated finding C13C46 now has a
recorded disposition (0 still-real), the calibrated C1C12 set was remediated across v4.0.0 +
S13S16, and the gate (lint 74/0/0, hooks 98/98, analytics 116/116) is green. M0 (per-user
data-dir migration) is the sole audit-adjacent item deliberately deferred to the separate UI
track; S16 left the `getAnalyticsRoot()` seam so it relocates in one place.
Per Handover 6, this `review.md` is consumable by `/trekplan --brief …`. ALLOW → S17 commits +
pushes (own files only) → **remediation COMPLETE**.
```json
{
"verdict": "ALLOW",
"verdict_scope": "S16 delivered changes (saves manual-entry + S16-pre onboarding Write); 15 files",
"scope": { "sha_start": "8c52bdb", "sha_end": "8c52bdb", "reviewed_files_count": 15, "uncommitted_delta": true },
"verdict_scope": "S17 delivered changes (C13C46 triage disposition record); 1 file",
"scope": { "sha_start": "55c94ee", "sha_end": "55c94ee", "reviewed_files_count": 1, "uncommitted_delta": true },
"counts": { "BLOCKER": 0, "MAJOR": 0, "MINOR": 0, "SUGGESTION": 0 },
"findings": [],
"fixed_in_session": [
{
"severity": "MAJOR",
"title": "Non-numeric Saves cell silently coerced to 0 (unknown != 0 contract)",
"file": "scripts/analytics/src/parsers/csv-parser.ts",
"title": "F-PILLAR-COUNT prose overclaimed 'no 3-5 pillar range remains'",
"file": "docs/remediation/c13-c46-triage.md",
"rule_key": "PLAN_EXECUTE_DRIFT",
"resolution": "added parseOptionalCount() returning number|undefined (blank/non-numeric/negative -> undefined; genuine 0 kept); saves parse routes through it"
"resolution": "narrowed the disposition to the named files (setup.md/onboarding.md, the closed finding) + added note¹ recording analyze.md:58,239 / profile.md:67 as a distinct focus-discipline heuristic, not the pillar-count declaration"
},
{
"severity": "MAJOR",
"title": "No test for explicit-0 vs non-numeric Saves boundary",
"file": "scripts/analytics/tests/csv-parser.test.ts",
"rule_key": "MISSING_TEST",
"resolution": "added saves-edge-export.csv fixture + 2 cases (0 -> 0, n/a -> undefined); TDD red-before/green-after the parser fix"
},
{
"severity": "MAJOR",
"title": "onboarding Phase 2 file-saves need Write (carried from S15)",
"file": "commands/onboarding.md",
"title": "F-VIDEO-TASK cited video.md:8 for the Task entry, which is at :15",
"file": "docs/remediation/c13-c46-triage.md",
"rule_key": "PLAN_EXECUTE_DRIFT",
"resolution": "S16-pre: added Write to allowed-tools, matching first-post.md"
"resolution": "corrected citation to commands/video.md:15 (the Task list item in the :8-16 block); verified line 15 is exactly ' - Task'"
}
],
"deferred_findings": [],