fix(linkedin-studio): S8 harden pipeline — Step-3 buzzword gate enumerated inline

Step-3 optimize gate (:79) carried the buzzword line but as a bare
'- [ ] No corporate buzzwords' — not self-contained, leaning on the
quality-scorecard.md reference rather than the inline gate the AI executes.
Enumerated the banned list inline to match every other post-emitting gate
(post :134 / react :131 / carousel :123 / video :129 / scorecard :132),
removing pipeline as the odd-one-out.

Recorded deferral: Step-2 component structure (:58-62) sums 960-1640, floor
below the Step-3 band floor 1,200 — identical to batch's untouched 3a; the
gate (:77) already names the band and catches a minimum-path undershoot, so
no edit (editing Step 2 would exceed S7 precedent).

Gate: test-runner 81/0/0 · counts 29/19 unchanged · only .md touched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016qgzo6rxthw7KuxHjn5vyE
This commit is contained in:
Kjell Tore Guttormsen 2026-06-18 17:15:46 +02:00
commit 52e888a868
2 changed files with 77 additions and 1 deletions

View file

@ -76,7 +76,7 @@ Run the draft through optimization checks:
- [ ] Hook 110-140 chars
- [ ] Total 1,200-1,800 chars
- [ ] No external links in body
- [ ] No corporate buzzwords
- [ ] No corporate buzzwords (leverage, synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)
- [ ] Topic aligns with expertise areas
- [ ] Authentic voice (not AI-sounding)

View file

@ -709,3 +709,79 @@ graceful degradation).
- Disposition: **HARDENED** (1 edit, axis-c) · 3 recorded deferrals · axes a/b/d PASS.
---
## Session 8 — Pipeline (`pipeline`)
> S8 status: re-grounded the proposed predicates against the actual `pipeline.md` lines BEFORE
> talk (jerndisiplin: assert-after-read). Field-notes inbox **absent** at S8 → graceful no-op (SC-I).
> All `file:line` below are tool-grounded against the FINAL (post-edit) file.
> **Class call (operator-delegated → quality + precedent):** hybrid **guided/stateful + post-emitting
> on the final post** — the 8-step idea→publish→analysis pipeline produces ONE feed post (Step 2 draft
> `:5762` → Step 3 gate `:6686` → Step 6 publish `:135`), so the post predicates apply to that post;
> the orchestration around it (Step 0 load · Step 1 agent-deleg · Step 4 schedule/queue · Step 5 5x5x5 ·
> Step 7 first-hour · Step 8 analysis · state-update `:186199`) is the guided/stateful layer.
### /linkedin:pipeline — full idea→publish→analysis pipeline, one 1,2001,800-char feed post, 8 steps
**INTENT.** `pipeline` is the Create journey's **end-to-end path**: from idea (or `$ARGUMENTS` topic)
through ideation → draft → optimize → schedule → 5x5x5 pre-engagement → publish → first-hour → 48h
analysis, with a deterministic state update. Post-emitting on the final post (hook **110140**, length
**1,2001,800**, no body link, no banned buzzword, topic→5 pillars); guided/stateful for the
orchestration (subagent targets + 5 node helpers resolve; graceful degradation).
**SIMULATE.**
- **Persona (ICP):** the author — 1048 followers, "Validation", 5 pillars; direct/technical NO/EN voice.
- **Invocation:** `/linkedin:pipeline about AI-kodeassistenter i offentlig sektor` (topic in `$ARGUMENTS`
→ Step 1 ideation skipped, `:41`).
- **Walk:** Step 0 load state/SKILL/voice → Step 1 skipped → Step 2 angle + draft to the structure
(`:5762`) → **Step 3 optimize gate (`:6686`, the gap)** → Step 4 schedule (+ Option-3 queue) →
Step 5 5x5x5 → Step 6 publish+clipboard → Step 7 first-hour → Step 8 analysis → state.
- **CONCRETE friction (spec-level, anchored — not a generated post):** at **Step 3** the inline quality
scorecard (`:7581`) carried the buzzword line (`:79`) but as a **bare** `- [ ] No corporate buzzwords`
— no inline enumeration; it leaned on the scorecard reference (`:75``quality-scorecard.md:132`). A
draft opening *"How to leverage AI to drive synergy across the public-sector ecosystem…"* relies on the
operator cross-referencing a long shared asset rather than the inline gate the AI actually executes.
**Unlike S2/S3/S5/S6 the line was PRESENT** — the gap was that it was not self-contained, making
pipeline the odd-one-out among post-emitting commands (post `:134` · react `:131` · carousel `:123` ·
video `:129` all enumerate inline).
**EVALUATE (4 axes).**
- **(a) intention fidelity — PASS.** 8-step idea→publish→analysis delivers the description's promise.
- **(b) algorithm bar — PASS.** Step 3 signals (`:7073`) cited to the SSOT (saves rank highest · a
15+-word comment ≈ 2× a like · dwell >30 s +25 %); no body link (`:78`); 5x5x5 (`:120133`); first-hour
(`:158169`). No 30 %-claim → untouched by the open reference-consistency follow-up.
- **(c) MECHANICAL predicate (post-emitting, on the final post) — GAP → fixed.** hook 110140 ✓
(`:58/:76`) · length band ✓ (`:77` names 1,2001,800) · no-body-link ✓ (`:78`) · topic→pillars ✓
(`:80` + `:49` content-planner pillar-situating) · subagent resolves ✓ (`:49`) · **buzzword
present-but-not-self-contained ✗→fixed** (`:79` bare → enumerated inline).
- **(d) agent-wiring + graceful degradation — PASS.** `content-planner` + `trend-spotter` (`:49`) resolve
to real `agents/*.md`, both `subagent_type: linkedin-studio:`-namespaced. All 5 node helpers export with
matching signatures: `queueUpcoming(days=7)` (qm`:52`) · `queueAdd(…8 params)` (qm`:63`; pipeline passes
8 args `:116`) · `queueFormatSummary` (qm`:112`) · `writeState` (su`:346`) · `updatePostTracking`
(su`:55`). Degradation: Step 1 (`:4347`) handles no-planned-topic/no-input via AskUserQuestion; Step 0
voice-samples is a soft read (no "REQUIRED" dead-end).
**HARDEN (surgical — 1 edit, 1 file, grep-confirmed landed).**
- `commands/pipeline.md:79``- [ ] No corporate buzzwords` → `- [ ] No corporate buzzwords (leverage,
synergy, paradigm shift, thought leader, disruptive, value proposition, ecosystem, holistic approach)`
(same banned list as the other post-emitting gates + the scorecard).
- **Deferral (1, recorded):** the Step-2 component structure (`:5862`: hook 110140 + context 200300 +
insight 400800 + implication 200300 + CTA 50100) sums **9601 640**, whose floor sits below the
Step-3 band floor 1,200 (`:77`) — **identical structure to batch's 3a (`:8892`)**. NOT edited:
pipeline's Step-3 gate already NAMES the band (the S7 fix was naming the band on an *unenforceable* gate;
here it is already named), so a minimum-path draft is caught by the gate, not shipped — and S7 did not
edit the analogous 3a structure either. Editing Step 2 here would exceed precedent (over-engineering).
Below the axis-pass bar.
- **CONCRETE after:** the "leverage…synergy…ecosystem" draft now trips the Step-3 buzzword line inline
before optimize completes, without the operator cross-referencing the shared scorecard.
**VERIFY.**
- `bash scripts/test-runner.sh``Passed: 81 · Failed: 0 · Warnings: 0`; counts **29/19** confirmed
(`ls commands/*.md|wc -l` == 29, `ls agents/*.md|wc -l` == 19; `git diff --stat` = `pipeline.md` only,
1 insertion / 1 deletion). Only `.md` touched → hooks/analytics `node --test` not needed.
- Before/after delta: axis (c) buzzword sub-check is now self-contained at the load-bearing Step-3 gate
(was a bare, reference-dependent line). The 1 edit is the cause.
- Disposition: **HARDENED** (1 edit, axis-c) · 1 recorded deferral (Step-2 component-sum, gate-caught) ·
axes a/b/d PASS.
---