docs(linkedin-studio): S10 harden headless-review — verified clean, no change (4 axes PASS)

headless-review is the standalone surface of newsletter Step 6.5: a cold
adversarial review-orchestrator, NOT post-emitting — it emits a consolidated
review report + optional edition-state persist, never drafts prose, never
publishes a feed post, so the feed-post predicates (hook 110-140, 1,200-1,800
band, no-body-link) do not apply (even further from feed-post than newsletter).
The 4 archetype agents are shared with newsletter Step 6.5 -> S9 baseline reused.
Ran the 7 predicates tool-grounded against the final file (248 lines):

- 4 namespaced subagent types resolve (frontmatter name: match)
- 8/8 Reference Files exist (:241-248)
- always-present fallback longform-quality-rules.md exists
- articles.NN.headlessReview schema complete in edition-state.template.json
  (:56-69, ladder pending->run->folded)
- 5 degradation points (freeze cp :130 / draft ask-once :104 / persona :117 /
  [GATE] re-run :163-164 / output-default :93 + SendUserFile-else-file:// :208-210)
- persona resolution chain = newsletter Step 1 (:179-183)
- "five archetypes" (line-wrapped :5-6/:30-31) = 5 modes from 4 agents

Borderline at talk: freeze (:126) assumes review/ exists (no mkdir -p).
Operator chose Alt A (no change) — byte-identical to newsletter :1050 (S9-clean);
review/ is created by the render pipeline that produces the draft. Logged as a
NICE below the axis-pass bar, not pursued.

4-axis verdict: a/b/c/d all PASS, 0 gaps, 0 deferrals -> NO CHANGE.

Gate: test-runner 81/0/0 · counts 29/19/26 unchanged · headless-review.md
byte-identical to 3cd174c (S9); only docs/hardening/log.md added.

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 18:11:35 +02:00
commit adb8c5bde3

View file

@ -856,3 +856,86 @@ short-form hooks.
- Disposition: **VERIFIED — NO CHANGE** (0 edits) · 0 deferrals · axes a/b/c/d all PASS.
---
## Session 10 — Longform companion (`headless-review`)
> S10 status: re-grounded STATE's predicates against the actual `headless-review.md` (248 lines, 13 KB)
> BEFORE talk (jerndisiplin: assert-after-read). Class agreed S10 steps 12: **cold adversarial
> review-orchestrator, NOT post-emitting** — it emits a consolidated review report + optional
> `edition-state` persistence, never a feed post and never drafts prose; the feed-post predicates
> (hook 110140, 1,2001,800 band, no-body-link) do NOT apply — imposing them would be the S4/video
> category error (even further from feed-post than `newsletter`). The four archetype agents are
> SHARED with `newsletter` Step 6.5 → S9 agent findings reused as baseline. All `file:line` below are
> tool-grounded against the FINAL file (no edits this session → final == 1c31644).
### /linkedin:headless-review — cold adversarial review package on a FROZEN long-form draft, NOT post-emitting
**INTENT.** `headless-review` is the standalone surface of `newsletter` Step 6.5: read a frozen,
publish-ready (or pivoted) long-form draft COLD — with NONE of the drafting session's framing-bias —
through five independent archetypes and return direction-only flags, consolidated into one
operator-gated report. Two isolation layers: fresh session (strongest, `:6468`) + per-archetype
subagent context (`:6974`). The adversarial-independence layer the in-session gates structurally
cannot be (`:3048`).
**SIMULATE (grounded persona-sim, anchored to the Step 3 cold fan-out).**
- **Persona (operator):** KTG in a FRESH session running `--type all` on `<serie>/NN-utkast.md`.
- **Walk:** Step 1 resolve-from-disk (draft → edition-state `currentArticle` fallback → ask-once
`:103104`; contract 3-tier fallback ending at always-present `longform-quality-rules.md` `:111114`;
personas = newsletter Step 1 chain `:116118`) → Step 2 freeze (`cp` snapshot `:126`, live-draft
fallback if `cp` unavailable `:130131`) → **Step 3 fan out 5 archetypes** (single message,
`:135136`; 4 `linkedin-studio:`-namespaced types, persona-reviewer ×2 modes `:141146`) →
**degradation gate** (`:161164` "re-run that one archetype — do not paper over a missing reviewer
`[GATE]`") → Step 4 consolidate (operator gates, never auto-resolve flags `:168169`/`:196197`;
convergence marked `:200202`) → Step 5 surface via `SendUserFile` (else `file://` `:208210`) +
optional persist `articles.NN.headlessReview` (`:211215`).
- **Friction sought (the S2S8 pattern: a missing buzzword gate / a missing fallback):** **NONE found.**
Not post-emitting → the category-correct quality bar is the reviewers grading against the writing
contract + the structured-return degradation gate, both present. Every fan-out call has a degradation
re-run path.
**EVALUATE (4 axes).**
- **(a) intention fidelity — PASS.** The 5-step flow (resolve → freeze → parallel fan-out → consolidate
→ surface/persist) delivers the description's promise; primær artifact is the consolidated report
(`:171198`), surfaced + optionally persisted (`:204215`). `allowed-tools` (`:1826`) complete and
fully used (Read/Glob/Grep · Bash freeze · AskUserQuestion ask-once · Task fan-out · Write report+state).
- **(b) algorithm/format bar (long-form honesty, NOT feed-post predicates) — PASS.** Cold contract
(`:5074`) nøktern: reviewers get a "deliberately starved context", exactly-what-they-get /
exactly-what-they-don't enumerated; two-layer isolation with honest caveats (Layer 1 "recommended …
strongest" not absolute; reload caveat for the v3.1.0 agents `:8082`). Deliberate redundancy
(`fact-reviewer``fact-checker`, `language-reviewer``editorial` prose axis) disclosed as
on-purpose, not collapsed (`:234237`). No feed-post predicate imposed.
- **(c) quality rules (category-appropriate) — PASS.** Review quality enforced by (1) reviewers judging
against the writing contract (`:111114`), (2) the degradation gate requiring structured/populated
returns, not a hedged paragraph (`:161164`), (3) operator-gates-the-fold-in — the command recommends,
never rewrites/gates (`:168169`/`:196197`/`:210`), (4) convergence-as-signal (`:200202`). No hollow
gate found.
- **(d) agent-wiring + graceful degradation — PASS.** 4/4 invoked subagent types resolve to real
`agents/*.md` with matching frontmatter `name:`, all `subagent_type: linkedin-studio:`-namespaced
(content-reviewer · language-reviewer · fact-reviewer · persona-reviewer ×2 modes → "five
archetypes" `:56`/`:3031`). 8/8 Reference Files (`:241248`) exist. `articles.NN.headlessReview`
schema present + complete in `edition-state.template.json` (`:5669`: frozenDraft · reviewers
{content,language,fact,personaResonance,personaConversion} · consolidatedReport · foldedIn · waived ·
status; ladder pending→run→folded `:29`). Degradation ×5: freeze `cp` fallback `:130` · draft-missing
ask-once `:104` · persona fallback `:117` · `[GATE]` re-run `:163164` · output-default `:93` +
SendUserFile-else-`file://` `:208210`.
**HARDEN — NO CHANGE (verified clean).**
- 0 edits. Borderline surfaced at talk: the freeze step (`:126`) assumes `review/` exists (no
`mkdir -p`). **Operator chose Alt A (no change).** Rationale: the freeze block is **byte-identical to
`newsletter` `:1050`** (S9-verified-clean), and `review/` is created by the render pipeline that
produces the draft (`build-html.mjs``./review/` newsletter `:1136`; skeleton/draft render
`:444`/`:580`); adding `mkdir -p` only here would drift from its S9-clean twin, and fixing both would
re-open S9 (out of S10 scope). The `cp`-unavailable fallback (`:130`) covers the degraded path loosely.
- **Deferrals:** none. **Anti-gold-plating:** the `mkdir -p` robustness improvement is a NICE below the
axis-pass bar — left as the operator's logged decision (Alt A), not pursued.
**VERIFY.**
- `bash scripts/test-runner.sh``Passed: 81 · Failed: 0 · Warnings: 0`; counts **29/19/26** (+6
skills) unchanged (count/version-consistency guards inside the lint passed); `git status --porcelain`
empty → working tree byte-identical to `1c31644` (S9).
- Predicates re-grounded against the final file: 4 namespaced subagent types (frontmatter `name:`
match) · 8/8 ref files exist · `headlessReview` schema `:5669` · 5 degradation points · persona
chain = newsletter `:179183` · "five archetypes" (wrapped) = 5 modes from 4 agents.
- Disposition: **VERIFIED — NO CHANGE** (0 edits) · 0 deferrals · axes a/b/c/d all PASS.
---