BREAKING CHANGE: the marketplace slug, the agent namespace (linkedin-studio:<agent>), and the runtime state-file path (~/.claude/linkedin-studio.local.md) all change. Reinstall required; existing state migrated in place (post metrics, streak, history preserved). The /linkedin:* commands are unchanged — the command namespace is set per-command in frontmatter and was always independent of the plugin slug. Functionality is byte-identical to v2.4.0; this release is pure identity. - dir + manifests: plugins/linkedin-studio + plugin.json + root marketplace.json - agent namespace updated in commands/newsletter.md (only functional invoker) - state path updated in 4 hook scripts + topic-rotation prompt + state template - catch-all skill dir renamed skills/linkedin-studio (5 functional skills unchanged) - docs + version bump to 3.0.0 across README badge, CHANGELOG, root README/CLAUDE.md - historical records (CHANGELOG past entries, docs/ build artifacts, config-audit v5.0.0 snapshots) intentionally retain the old slug Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
194 lines
10 KiB
Markdown
194 lines
10 KiB
Markdown
# Long-Form Quality Rules
|
||
|
||
Canonical quality rules for long-form LinkedIn content (newsletter editions,
|
||
essays, series articles). These are enforced by the `/linkedin:newsletter`
|
||
pipeline — primarily in **Step 4 (Consistency + quality)**, reinforced by the
|
||
fact-check sweep (Step 5) and the persona sweeps (Steps 6 + 9).
|
||
|
||
> **Provenance.** Distilled from the Seres series production (the operator's
|
||
> first full long-form run) and codified as the authoritative spec in plan §8.
|
||
> Source of truth: this file. `commands/newsletter.md` Step 4 points here rather
|
||
> than restating the rules — there is exactly one place to change them.
|
||
|
||
> **Scope.** These rules are for **long-form only**. Short-form feed posts are
|
||
> governed by the `PreToolUse` content-gatekeeper / voice-guardian hooks, which
|
||
> are calibrated for feed posts and stay short-form-only (plan decision B). Long-
|
||
> form quality is enforced by pipeline *phases*, not by those hooks.
|
||
|
||
---
|
||
|
||
## The rules
|
||
|
||
### 1. Leder-takeaway (lead takeaway)
|
||
|
||
Every text lands **ONE clear takeaway + ONE concrete action**. The reader should
|
||
be able to state, in a single sentence, what they now think differently and what
|
||
they will do about it.
|
||
|
||
- Cut references hard. Hands-on credibility beats a citation-pile — a text that
|
||
shows you have done the work outweighs one that quotes everyone who has written
|
||
about it.
|
||
- If the reader cannot state the takeaway in one sentence, the text is not done —
|
||
tighten until they can.
|
||
- **Serve what the reader can DO, not what the author knows.** The text exists to
|
||
give the *primær* reader (the non-technical line manager) something they can act
|
||
on from their own chair — not to demonstrate the author's breadth. Completeness
|
||
is not a virtue: if a passage exists to be thorough rather than to move the
|
||
reader's decision forward, cut it. Choose ONE concrete, verifiable (preferably
|
||
Norwegian) case over an exhaustive list.
|
||
|
||
**Pass/flag:** PASS when the one-takeaway + one-action is stated and unmistakable;
|
||
FLAG when the text carries two competing takeaways or ends without a concrete
|
||
action.
|
||
|
||
### 2. Premiss→konklusjon-bue (premise→conclusion arc)
|
||
|
||
Establish **one clear premise early** (in the ingress + first paragraph), then let
|
||
the conclusion **grip that premise concretely and twist it forward** — give a
|
||
direction plus one tangible grip. The conclusion does not merely summarize.
|
||
|
||
- The premise the conclusion grips must be the SAME premise the ingress set. If
|
||
the draft drifted to a different premise mid-text, realign the conclusion or the
|
||
ingress — never leave two premises standing.
|
||
|
||
**Pass/flag:** PASS when ingress-premise == conclusion-premise and the close moves
|
||
it forward; FLAG when the conclusion only restates, or grips a premise the opening
|
||
never set.
|
||
|
||
### 3. AI-slop-fraser (forbidden phrases — strip on sight)
|
||
|
||
These phrases read as machine-written and are **banned**. They are the Seres
|
||
ban-list; strip them on sight (the list is Norwegian because the target text is
|
||
Norwegian):
|
||
|
||
- «her må jeg være ærlig» / «for å være ærlig»
|
||
- «ikke bare X, men Y» (the not-just-X-but-Y construction as a tic)
|
||
- gratuitous three-item listing (rule-of-three used as a reflex, not because the
|
||
content actually enumerates three things)
|
||
- «i en stadig mer kompleks verden» (and equivalent throat-clearing openers)
|
||
- tacked-on summary sentences that restate what was just said
|
||
- **modell-/navne-katalog** — reeling off product names, model names, or
|
||
benchmarks (Qwen3-14B, Ministral 3, SWE-bench, Arena, «parametere», «vekter»)
|
||
for completeness' sake. A list of names is a jargon wall to the primær reader;
|
||
pick ONE concrete, verifiable case instead (see rule 1). This is a **hard fail
|
||
for the primær persona**, not a stylistic nit — it is the failure mode that
|
||
nearly shipped in the Seres process.
|
||
- **selvrefererende overhead-åpning** — meta-commentary about what the text will
|
||
or will not do, warm-ups, and openers like «Det er bra. Det er ikke det denne
|
||
teksten handler om». Start on the reader's problem, not on the text's own
|
||
framing.
|
||
|
||
**Pass/flag:** PASS when none appear; FLAG (with count) and remove each
|
||
occurrence. A modell-/navne-katalog or a sjargong-mur is a hard fail (treat as
|
||
BLOCK-level for the primær reader in the persona sweep), not a soft flag.
|
||
|
||
### 4. Generell, ikke etat-/person-spesifikk (general, not org-/person-specific)
|
||
|
||
Write for a broad reader, not as an internal memo or a grievance.
|
||
|
||
- No personal agency anecdotes.
|
||
- Present **opportunities, not provocations**.
|
||
- At most **one** structural anchoring reference per text — never repeated
|
||
criticism of a named person or organization.
|
||
|
||
**Pass/flag:** PASS when the text reads as generally useful and carries ≤1
|
||
structural anchor; FLAG personal anecdotes, provocations, and any repeated naming.
|
||
|
||
### 5. Formaterings-dose (minimal formatting dose)
|
||
|
||
> *"No article should look like a PowerPoint printout."*
|
||
|
||
- **Bold** = at most one point per section.
|
||
- Short lists (2–4 items) **only** where the text already enumerates — never turn
|
||
load-bearing reasoning into bullets. Prose carries the argument; lists carry
|
||
genuine enumerations.
|
||
- Tables sparingly.
|
||
|
||
**Pass/flag:** PASS when formatting stays within these bounds; FLAG (and trim) when
|
||
bold is scattered, reasoning has been bulletized, or tables proliferate.
|
||
|
||
### 6. Gap lukkes med stramming, ikke utvidelse (close gaps by tightening, not expanding)
|
||
|
||
The gap between a draft and the final is closed by **swapping weaker passages for
|
||
sharper ones and cutting** — not by adding material. **Hold the length flat.**
|
||
|
||
This rule holds across every later phase too: fact-check fixes (Step 5), persona
|
||
rework (Step 6), and hook revisions (Step 9) all close their gaps by tightening,
|
||
never by expansion.
|
||
|
||
**Pass/flag:** target a **flat** length delta vs. the prior draft; FLAG when a
|
||
revision grew the word count to cover a weakness instead of sharpening it.
|
||
|
||
### 7. Kalibrering per sweep (per-sweep calibration — a user choice, not a default)
|
||
|
||
Before each quality / fact-check / persona sweep, **the operator calibrates** —
|
||
this is a per-sweep user choice, never a silent default:
|
||
|
||
- **Fold-in aggressiveness** — conservative vs. aggressive when folding flags back
|
||
into the text.
|
||
- **Jargon handling** — keep, gloss, or cut domain jargon.
|
||
- **Persona weighting on conflict** — how to weigh a secondary persona's flag
|
||
against the primær when they disagree (the primær trumfer rule still governs the
|
||
final gate, but the calibration sets how hard a secondary signal is chased).
|
||
|
||
Ask once if the Step 1 brief did not already settle it. Do not assume an
|
||
aggressiveness; the same draft can be tightened conservatively or aggressively and
|
||
the operator owns that dial.
|
||
|
||
### 8. Skjelett før prosa (skeleton before prose — pre-condition for every other rule)
|
||
|
||
The argument-line — premiss, problem, anbefaling, gevinst, vei videre — must
|
||
be **explicit, visible, and confirmed** before the first sentence of prose is
|
||
written. None of the other rules can bite reliably on a draft whose spine was
|
||
never declared: Rule 1 (leder-takeaway) and Rule 2 (premiss→konklusjon-bue) in
|
||
particular collapse into post-hoc reconstruction if the spine was never gated.
|
||
|
||
- Write the five-line skeleton (premiss / problem / anbefaling / gevinst / vei
|
||
videre) and the section pitches **before any prose**. Both the operator and
|
||
the persona-skjelett-sweep (`persona-reviewer` mode: skjelett) must say JA on
|
||
this skeleton before Step 3a (spine prose) starts.
|
||
- A spine error caught at the skeleton stage costs 5–15 min; the same error
|
||
caught at Step 6 (resonance) costs 4–12 h; caught post-lock it costs a day
|
||
of cascading rework. The cheapest gate is also the earliest.
|
||
- The skeleton format is **identical to the Maskinrommet writing-contract §A**
|
||
(premiss / problem / anbefaling / gevinst / vei videre). Pipeline editions
|
||
produced through `/linkedin:newsletter` therefore satisfy that contract at
|
||
the structural level by construction.
|
||
|
||
**Pass/flag:** PASS when the skeleton + pitches exist as `<serie>/NN-skjelett.md`
|
||
and both the operator-gate AND the persona-skjelett-sweep returned JA before
|
||
prose started; FLAG retroactively if a draft turns out to have skipped this gate
|
||
(treat as a process miss and harvest the lesson — do not retrofit a skeleton
|
||
to a finished draft and call it gated).
|
||
|
||
---
|
||
|
||
## How the pipeline uses these rules
|
||
|
||
| Phase | Where the rules bite |
|
||
|-------|----------------------|
|
||
| Step 2.5 — Skeleton + section pitch | Primary enforcement of rule 8: skeleton + pitches MUST exist and be JA from operator + persona-skjelett-sweep before prose. |
|
||
| Step 3a — Spine prose | Rule 6 applies even within spine prose (tighten, don't expand the spine); rule 8 is the gate that lets 3a start. |
|
||
| Step 4 — Consistency + quality | Primary enforcement: apply rules 1–6, calibrate per rule 7, report a pass/flag per rule. Rule 8 is verified as historical fact (skeleton existed + was gated). |
|
||
| Step 5 — Fact-check sweep | Fixes obey rule 6 (tighten, don't expand). |
|
||
| Step 6 — Persona sweep (pre-lock) | Rework obeys rule 6; the leader-takeaway (rule 1) and arc (rule 2) are what the reader jury judges for resonance. A draft that passed rule 8 typically lands here with far fewer spine-level reworks. |
|
||
| Step 9 — Hook / conversion gate | Hook revisions obey rule 6 (sharpen the krok by tightening, body stays locked). |
|
||
|
||
## Self-certification boundary
|
||
|
||
Whether a text *lands*, matches voice, is original, or reaches prose quality is
|
||
**subjective judgment** and is NEVER self-certified green by Claude (plan §10.0).
|
||
These rules give objective-where-possible checks (forbidden-phrase presence,
|
||
length delta, formatting counts, one-takeaway test), but the resonance verdict is
|
||
routed to the persona sweep (`[GATE]`) or the operator (`[OPERATØR]`), never
|
||
auto-passed.
|
||
|
||
## Related
|
||
|
||
- `commands/newsletter.md` — Step 4 applies these rules; the whole pipeline
|
||
references them.
|
||
- `agents/fact-checker.md` — Step 5 sweep (guilty-until-disproven).
|
||
- `agents/persona-reviewer.md` — Step 6 (resonance) + Step 9 (conversion) reader
|
||
jury.
|
||
- `config/personas.template.md` — the reader personas + "primær trumfer" rule.
|
||
- `references/newsletter-strategy-guide.md` — strategic context for long-form.
|