feat(linkedin-studio): N8 — stemme-kjeden (chronicle-voice-profile + drift-logg + language-resolve + auto-gull) [skip-docs]

Bind the long-form VOICE before prose — the discipline the line already
applies to SOURCES (validate-binding), its strongest link.

- C-1/A2-F1: voice-trainer distils a chronicle-voice-profile from the
  published gold corpus (per language/format); newsletter Step 0/3a/3b bind
  drafting to it, with an explicit never-silent fallback to the short-form
  corpus (which the engine itself calls degrading for chronicle voice).
- C-2: Step 3a Pass 0 READS the chronicle-voice-drift-log as a negative list
  (it was append-only, never consumed); Step 3b re-reads it in expansion.
- C-3: Step 1 resolves + persists the top-level edition-state.language, making
  the template doc-string's "Resolved at Step 1" claim true; the Norwegian
  review axis (language-reviewer / voice-scrubber) now fires when the edition
  IS Norwegian instead of being silently off by default. Step 6.5 already
  consumed the field — resolving it closes the axis end-to-end.
- A2-F2: Step 8 lock appends the locked edition to ingest/published
  (provenance=published), so the gold corpus the profile distils from grows
  one edition at a time — never the engine's drafts.

Domain-general throughout (languages/formats from the user's own corpus).
test-runner 140 -> 146 (Section 16o: 6 unconditional voice-chain greps +
non-vacuity self-test; anti-erosion floor 123 -> 129). All six suites green
(trends 300, brain 134, hooks 140, tests 35, render 60).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014bE7VbkmR3cqHFEeGfzgwb
This commit is contained in:
Kjell Tore Guttormsen 2026-07-23 22:58:38 +02:00
commit b30b0e208f
4 changed files with 197 additions and 13 deletions

View file

@ -152,6 +152,39 @@ Architecture: [prose/sectioned/framework]
Flag if: fewer than 5 samples (low confidence), single time period (temporal bias), or contradictory patterns (possible ghostwriting).
### Long-form chronicle voice profile (per language / format)
Short-form feed posts and long-form editions (newsletters, essays, chronicles) are
**different registers of the same author** — a device the author bans in a punchy
short post (e.g. the em-dash) can be load-bearing rhythm in a long-form chronicle.
Drafting long-form against the short-form corpus therefore *degrades* the chronicle
voice (this is `voice-scrubber`'s canonical rule). So the long-form pipeline binds
to its own distilled artifact, which this agent generates:
- **Artifact:** `${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/profile/chronicle-voice-profile.md`
— a distilled long-form voice profile built with the same six-dimension
framework as the general profile, but from **only the long-form gold corpus**.
- **Corpus (published gold only):** the approved/published long-form editions under
`${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/ingest/published/`
carrying `provenance=published`. The same model-collapse fence applies —
**never distil chronicle voice from `provenance=ai-draft`**, and never from the
short-form `voice-samples/authentic-voice-samples.md` corpus (wrong register).
- **Per language AND format — domain-general.** Emit one profile section per
`(language, format)` pair actually present in the corpus (e.g. `no` / newsletter),
keyed by those axes; the author's languages and formats come from their OWN
corpus, never hardcoded. If a `(language, format)` pair has no published editions
yet, say so plainly and emit no section for it — do not invent a chronicle voice
from short-form samples or from assumptions.
- **Grows automatically.** Each locked edition is appended to the gold corpus at
`/linkedin:newsletter` Step 8 (`provenance=published`), so re-running this
distillation sharpens the chronicle profile over editions without manual curation.
Trigger this distillation on the same events as the general profile (a new
published edition, quarterly audit, explicit request). The long-form pipeline
(`/linkedin:newsletter` Step 0 / 3a / 3b) reads this artifact; when it is missing,
that pipeline warns and falls back — it never silently drafts against the wrong
corpus.
## Voice Drift Detection
### Drift Scoring