From 7362d8e4b1aacb5b4b2f338086180858908531df Mon Sep 17 00:00:00 2001 From: Kjell Tore Guttormsen Date: Fri, 19 Jun 2026 06:34:20 +0200 Subject: [PATCH] =?UTF-8?q?fix(linkedin-studio):=20S16=20harden=20analyze?= =?UTF-8?q?=20=E2=80=94=20drop=20unsourced=205+=20hashtags=20penalty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit S16 analyze through the v2 interactive quality gate (analytics/diagnostic class — prose-diagnosis + conditional agent-delegation, NOT CLI-backed: allowed-tools Read/AskUserQuestion/Task, no Bash). 1 finding, 1 surgical edit in commands/analyze.md, grep-confirmed + grounded persona sim (scenario 1, reach -50%): - FUNN (axis-b'): Step 4 penalty checklist asked 'Did you use 5+ hashtags in posts?' — a concrete-number penalty absent from BOTH the SSOT (algorithm-signals-reference.md: no hashtag claim, deliberately omitted) AND the cited troubleshooting-guide.md (its own checklist is 6 items, no hashtag). Command-only unsourced folklore. Dropped analyze.md:149; kept :150 'tag unrelated people for reach' (defensible — aligns with SSOT bait/pod-suppression direction, no numeric claim). Verified clean: interpret-mode wiring (analytics-interpreter resolves, real default mode agent:6,39,141), shared data-dir seam (analyze:41 <-> agent:49), /linkedin:profile cross-ref, graceful-degradation IF, saves/dwell honesty (no Bash, no over-promise). External-link hard-penalty framing in troubleshooting-guide.md:127 vs SSOT logged as reference-pass follow-up (out of S16 scope — not touched). Gate: test-runner 81/0/0 exit 0; counts 29/19 unchanged (.md-only). Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_016qgzo6rxthw7KuxHjn5vyE --- commands/analyze.md | 1 - docs/hardening/log.md | 51 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/commands/analyze.md b/commands/analyze.md index cdf15ce..8c706df 100644 --- a/commands/analyze.md +++ b/commands/analyze.md @@ -146,7 +146,6 @@ Run through this checklist: - [ ] Are topics all over the place recently? - [ ] Did you receive generic AI-like comments? - [ ] Did you post way more/less frequently than usual? -- [ ] Did you use 5+ hashtags in posts? - [ ] Did you tag unrelated people for reach? ## Step 5: Reach Drop Severity Assessment diff --git a/docs/hardening/log.md b/docs/hardening/log.md index e05de77..f5e0980 100644 --- a/docs/hardening/log.md +++ b/docs/hardening/log.md @@ -1237,3 +1237,54 @@ functionally safe but mis-labelled "(Step 3b)". Root cause: conflating "the phas post-fix (b N/A — not feed-emitting). --- + +### /linkedin:analyze — diagnose why content underperforms (reach drop / low traction / low engagement) → recovery plan, analytics grounded via analytics-interpreter + +**INTENT.** Prose-diagnosis + conditional agent-delegation — **NOT CLI-backed** (`allowed-tools: Read, +AskUserQuestion, Task`, no Bash, `analyze.md:9–12`). Measure-journey diagnostic. Steps 1–8 are a +faithful restatement of `references/troubleshooting-guide.md` (drop-% tiers, 14-day recovery protocol, +timeline table, prevention checklist). + +**SIMULATE.** ICP author, scenario 1 (reach −50 %, 1 wk ago, 2 off-pillar posts, 1 body-link). Step 1 +picks "Reach suddenly dropped" (`:32`); Step 2 analytics present → `Task +subagent_type: linkedin-studio:analytics-interpreter` interpret-mode (`:41`); Step 3 → pattern "Good +Content, Low Reach" (`:95–102`); Step 4 checklist flags external link + topic drift — **and, before fix, +asked "5+ hashtags?" (`:149`)**; Step 5 → "Algorithmic suppression likely" → 14-day recovery +(`:167–173`); Step 6 → `/linkedin:profile` (`:189`); Step 7 → "Moderate 50–70 %: 2–3 wks initial" +(`:231`). Friction: exactly one unsourced checklist item. + +**EVALUATE (4 axes; analytics-class predicate = graceful degradation + saves/dwell honesty).** +- **axis-a (intent): PASS** — faithful render of the cited guide; AskUserQuestion → framework → recovery + flow intact. +- **axis-b′ (algorithm-claim vs SSOT — feed-bar reframed since not feed-emitting): 1 FUNN.** `:149` + "Did you use 5+ hashtags in posts?" is a penalty check absent from **both** the SSOT + (`grep hashtag references/algorithm-signals-reference.md` = NONE — hashtags deliberately omitted) **and** + the cited `references/troubleshooting-guide.md` (NONE; its own penalty checklist is 6 items `:101–106`). + Command-only unsourced folklore carrying a concrete number ("5+"). +- **axis-c (saves/dwell honesty): PASS** — no Bash; never claims to read analytics itself; delegates + honestly; no saves/dwell mention anywhere → no over-promise. +- **axis-d (wiring + degradation): PASS** — `linkedin-studio:analytics-interpreter` resolves; + interpret-mode is real/default (`agent:6,39,141`); shared seam `${LINKEDIN_STUDIO_DATA:-…}/analytics/` + (`analyze:41` ↔ `agent:49`); `/linkedin:profile` resolves (`commands/profile.md`); "if analytics exists + → delegate, else self-report" IF-branch (`:41`); all 4 referenced files exist. + +**HARDEN (1 surgical edit, `commands/analyze.md`).** +1. [REWORK · axis-b′] Dropped `:149` "Did you use 5+ hashtags in posts?" — unsourced in both the SSOT and + the cited guide. Step 4 checklist 8 → 7 items; **kept** `:150` "tag unrelated people for reach" + (defensible — aligns with the SSOT bait/pod-suppression direction, no numeric claim). + +**Out-of-scope (logged follow-up, NOT touched in S16).** `troubleshooting-guide.md:127` "External link +overuse — LinkedIn penalizes directing traffic away" contradicts the SSOT (`:69–75`: LinkedIn *denies* an +intentional penalty; soften to "body links correlate with lower reach"). `analyze.md:102` only echoes the +milder guide wording verbatim (`guide:15`) — softening the command alone would drift it from its own cited +source, so the real fix belongs to the reference-consistency pass. + +**VERIFY.** +- Re-grepped final file: `grep hashtag commands/analyze.md` → **NONE**; Step 4 checklist now 7 items + (`:143–149`), `:149` = "tag unrelated people for reach" (survived). +- `git diff --stat` = 1 file, **1 deletion**. +- `bash scripts/test-runner.sh` → `Passed: 81 · Failed: 0 · Warnings: 0`, **exit 0**; counts **29/19** + unchanged (.md-only edit). +- Disposition: **FIXED** (1 edit, `commands/analyze.md`) · 0 deferrals · axes a/c/d PASS, b′ PASS post-fix. + +---