fix(linkedin-studio): S2 harden post — Step-5 buzzword gate + scorecard hook-band consistency

P4 close-out (4 edits / 2 files · lint 81/0 · counts 29/19/26/6):
- post.md Step 5: add no-buzzword checklist line (was missing; banned list = content rule #4)
- quality-scorecard.md l.32/114: one-sided "140" hook bound -> "110-140" (matches l.128, resolves self-contradiction)
- quality-scorecard.md: add no-buzzword line to Pre-Publish Basic Checklist

Shared scorecard fix benefits 8 consumers; only post hardened this session (react/batch/video/pipeline get own EVALUATE in S3/S5/S6/S8). Local-only per push policy.
This commit is contained in:
Kjell Tore Guttormsen 2026-06-18 13:32:56 +02:00
commit 69840e7a94
3 changed files with 71 additions and 2 deletions

View file

@ -29,7 +29,7 @@ Rate each criterion 0-3:
| Criterion | Score | Notes |
|-----------|-------|-------|
| Works in 140 characters | /3 | Mobile threshold |
| Works in 110-140 characters | /3 | Mobile band (floor + ceiling) |
| Creates curiosity gap | /3 | Click-through driver |
| Promises clear value | /3 | Worth reading? |
| **Subtotal** | /9 x 2 = **/18** | |
@ -111,7 +111,7 @@ Before posting, verify your profile supports the post's topic (topic/interest re
For quick posts, use this simplified check:
1. On-topic for my expertise? (Y/N)
2. Hook works in 140 chars? (Y/N)
2. Hook works in 110-140 chars? (Y/N)
3. Clear value delivered? (Y/N)
4. Ends with engagement prompt? (Y/N)
5. No external links in body? (Y/N)
@ -129,6 +129,7 @@ Before finalizing any post, verify:
- [ ] Character count within optimal range
- [ ] Short paragraphs with white space
- [ ] Tone is authentic, not corporate
- [ ] No corporate buzzwords (leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)
- [ ] Provides genuine value to readers
- [ ] CTA is specific and natural
- [ ] Passes the "mobile test" (readable on phone)

View file

@ -131,6 +131,7 @@ Before presenting, verify against `assets/checklists/quality-scorecard.md`:
- [ ] Provides genuine value to readers
- [ ] CTA is specific and natural
- [ ] No external links in post body
- [ ] No corporate buzzwords (leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)
- [ ] Topic aligns with user's 5 core expertise areas
- [ ] Passes thought leadership test (helps someone decide or think differently)

View file

@ -245,3 +245,70 @@ plan, "command file modified" is not a coverage predicate — the `log.md` entry
Disposition: **PASS, no edit** · 0 deferrals.
---
## Session 2 — Create I (`post`)
> S2 status: the v1 autonomous attempt fabricated and was reverted (→ v2 method; see `plan.md`
> header). This is the v2 re-run: parked at step 5 across a `/clear`, re-grounded from STATE.md's
> two P4 findings against the actual file lines before talking (jerndisiplin: assert-after-read).
> Field-notes inbox **absent** at S2 → graceful no-op (SC-I).
### /linkedin:post — interactive full-workflow post (angle→write→quality→refine→publish), 12001800 chars
**INTENT.** `post` is the Create journey's full path: from raw material (data / article / experience /
observation / opinion / question) to a publishable 1,2001,800-char thought-leadership post via an
8-step workflow — angle → format → structure+write → quality check → present → refine → pre-publish
→ deterministic state update. Post-emitting, so it must honor the content bar mechanically (hook
**110140**, length **1,2001,800**, no body links, no banned buzzword, topic→5 pillars) and the
algorithm bar (hook decisive before the mobile fold, links→first comment, native, comment-inviting
CTA without bait, de-AI substance signals).
**SIMULATE.**
- **Persona (ICP):** the author — 1048 followers, "Validation", 5 pillars; direct/technical NO/EN voice.
- **Invocation:** `/linkedin:post about AI-kodeassistenter i offentlig sektor`.
- **Walk:** Step 0 load state/SKILL → Step 1 type=Opinion → Step 2 angle (contrarian) → Step 3 medium
text → Step 4 structure (hook 110140 ✓ internally) → **Step 5 quality check (the gap)** → Step 6
present+clipboard → Step 7 refine → Step 8 pre-publish + state.
- **CONCRETE friction (spec-level, the live proof — anchored, not a generated post):** at **Step 5**
the quality checklist (`post.md:127135`, 9 items) had **no buzzword line**, so a draft opening
*"How to leverage AI to drive synergy in the public sector…"* would pass Step 5 unflagged — the
banned-list (content rule #4, `CLAUDE.md:124`) was never enforced at the gate. Step 5 also routes to
`quality-scorecard.md` (`post.md:125`), which **self-contradicted on the hook bound**: l.32 "Works in
**140** characters" + l.114 "Hook works in **140** chars?" (upper-only) vs l.128 "**110-140**" — the
same one-sided bound S1 fixed in the command files, surviving in the shared asset.
- **Friction log:** `post.md` itself is internally consistent on the hook (110140 at l.100/113/127);
the only command-side gap is the missing Step-5 buzzword line. The shared scorecard carried both
gaps (buzzword absent + two one-sided hook bounds). Scorecard is shared by 8 surfaces
(`pipeline · video · post · react · batch` + 3 skills) — fixing it is high-leverage, operator-approved.
**EVALUATE (4 axes).**
- **(a) intention fidelity — PASS.** Full 8-step workflow delivers the description's promise.
- **(b) algorithm bar — PASS.** No body link (`post.md:133/176`); comment-inviting CTA; de-AI gate
cites the confirmed reach-suppression (`post.md:137141`). Consistent with `algorithm-signals-reference.md`.
- **(c) MECHANICAL predicate (post-emitting) — GAP → fixed.** hook band ✓ · length band ✓ · no-body-link
✓ · topic→pillars ✓ · subagent resolves ✓ · **buzzword ✗** (Step-5 checklist had no line; grep NONE).
Shared scorecard added two sub-gaps: hook one-sided at l.32 + l.114.
- **(d) agent-wiring + graceful degradation — PASS.** `differentiation-checker` (`post.md:141`,
conditional) + `content-optimizer` (`post.md:166`, conditional) both resolve, both correctly
`subagent_type: linkedin-studio:`-namespaced. Voice→defaults; fresh-adopter path graceful.
**HARDEN (surgical — 4 edits across 2 files, all grep-confirmed landed).**
- `commands/post.md:134`**added** Step-5 checklist line: `- [ ] No corporate buzzwords (leverage,
synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)`.
- `assets/checklists/quality-scorecard.md:32``Works in 140 characters` → `Works in 110-140
characters` (Notes `Mobile threshold` → `Mobile band (floor + ceiling)`).
- `assets/checklists/quality-scorecard.md:114``Hook works in 140 chars?``Hook works in 110-140 chars?`.
- `assets/checklists/quality-scorecard.md:132`**added** Pre-Publish Basic Checklist line:
`- [ ] No corporate buzzwords (…)` (same banned list).
- **Deferrals:** none. **Scope note:** the 3 scorecard edits improve all 8 consumers; only `post` is
hardened this session — `react/batch/video/pipeline` get their own EVALUATE in S3/S5/S6/S8.
**VERIFY.**
- `bash scripts/test-runner.sh``Passed: 81 · Failed: 0 · Warnings: 0`; counts **29/19/26/6** unchanged.
- Anti-check grep: no one-sided bare `140 char` hook bound remains in the scorecard (`110-140` at
l.32/114/128). Buzzword line present in both files (`post.md:134`, `quality-scorecard.md:132`).
- Before/after delta: axis (c) buzzword sub-check now enforced at the load-bearing Step-5 gate; the
scorecard hook self-contradiction is resolved (all three mentions banded). The 4 edits are the cause.
- Disposition: **HARDENED** (4 edits, axis-c + shared-asset consistency) · 0 deferrals · axes a/b/d PASS.
---