feat(linkedin-studio): N3 — Step 7.5 kodet-figur-rute + figure-design-guidelines [skip-docs]
MR-F4 S2: (1) commands/newsletter.md Step 7.5 — generate er nå tre ruter; kodet rute (render/build-figur.mjs) er PRIMÆR for data-figurer (presisjon/reproduserbarhet), mcp-image beholdes for illustrative, external uendret. Fasetabell + ressursliste + rute-statuslinje oppdatert. (2) NY references/figure-design-guidelines.md — designregler (24pt, fargebudsjett, whitespace), token-konvensjon (profile/brand-tokens.json, --figur-*, nøytrale defaults), tre render-mål. Refs 27->28. (3) CLAUDE.md Architecture-linje for rendereren. scripts/test-runner.sh: EXPECT_REFS 27->28 + fila navngitt i POSTM0_REFS (named-additions-vakta). Suiter grønne på floor: 138/0 - 140/0 - 35/0 - 53/0 - 245/0 - 134/0. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: e70c619c-419b-4229-acaa-b5291f5e75d6
This commit is contained in:
parent
c4434ed789
commit
1a67bd2cb8
4 changed files with 101 additions and 11 deletions
|
|
@ -109,7 +109,7 @@ split; v3.1 / Endring 9 on adversarial independence + framing-bias).
|
|||
| 6 | **Persona sweep — BEFORE lock** | reader jury, primær wins, convergence to clean YES | **`persona-reviewer`** (resonance mode) |
|
||||
| 6.5 | **Headless adversarial review — BEFORE lock** | COLD review package on a frozen draft, no drafting-session context: content-reviewer (argument) + language-reviewer (Norwegian) + fact-reviewer (cold re-verification incl. pivot premises) + persona-reviewer resonance/conversion. Consolidated, operator-gated via `SendUserFile`. The independence layer the in-session gates can't be. | **`content-reviewer` + `language-reviewer` + `fact-reviewer` + `persona-reviewer`** (parallel) + `SendUserFile` |
|
||||
| 7 | **Annotation (optional)** | render annotatable review HTML for a manual pass | `render/build-html.mjs` |
|
||||
| 7.5 | **Visual assets — BEFORE lock** | cover (+ optional inline figures) or carousel deck: behov → per-image brief → generate (mcp-image default / external `cover-raw.png`) → operator-gate (`SendUserFile`) → approve to `cover.png` → credit/caption. Runs before lock so the renderer picks the cover up. | `mcp__mcp-image__generate_image` + `SendUserFile` + (carousel) `render/build-carousel.mjs` |
|
||||
| 7.5 | **Visual assets — BEFORE lock** | cover (+ optional inline figures) or carousel deck: behov → per-image brief → generate (coded `build-figur.mjs` primary for data figures / mcp-image for illustrative / external `cover-raw.png`) → operator-gate (`SendUserFile`) → approve to `cover.png` → credit/caption. Runs before lock so the renderer picks the cover up. | `render/build-figur.mjs` (data figures) + `mcp__mcp-image__generate_image` + `SendUserFile` + (carousel) `render/build-carousel.mjs` |
|
||||
| 8 | **LOCK → delivery** | POST.html "all in one place" | `render/build-linkedin.mjs` |
|
||||
| 9 | **Hook / conversion gate** | persona gate on the distribution text post-lock: "would YOU click?" | **`persona-reviewer`** (conversion mode) |
|
||||
| 10 | **Scheduling** | register the edition in the plugin queue/state for native scheduling | `hooks/scripts/queue-manager.mjs` |
|
||||
|
|
@ -1466,13 +1466,25 @@ operator declares carousel format for it. Branch accordingly:
|
|||
in `edition-state.json` → `articles.NN.visualAssets.cover.brief` and
|
||||
`…figures[].brief`.
|
||||
|
||||
3. **Generate — two routes, no lock-in.** The interface is pluggable (path-in /
|
||||
path-out); `mcp-image` is the default, not a hard dependency:
|
||||
- **Default route — `mcp__mcp-image__generate_image`** (Nano Banana Pro /
|
||||
Gemini 3 Pro Image). Write candidates to
|
||||
`linkedin/NN/cover-v<N>-kandidat.png` (and `fig<N>-kandidat.png` for
|
||||
figures). Candidate naming lets several attempts sit side by side without
|
||||
overwriting an approved file. Record route `"mcp-image"`.
|
||||
3. **Generate — three routes, no lock-in.** The interface is pluggable (path-in /
|
||||
path-out). Route by what the image *is*:
|
||||
- **Coded route — PRIMARY for data figures** (charts, diagrams, before/after
|
||||
comparisons — anything whose content is real numbers or real structure).
|
||||
Author the figure as SVG/HTML per
|
||||
`${CLAUDE_PLUGIN_ROOT}/references/figure-design-guidelines.md` (design
|
||||
rules + brand-token convention), then render to a candidate:
|
||||
```bash
|
||||
node "${CLAUDE_PLUGIN_ROOT}/render/build-figur.mjs" linkedin/NN/fig<N>.svg --target article --out linkedin/NN/fig<N>-kandidat.png
|
||||
```
|
||||
Precision and reproducibility beat generative output for data — numbers,
|
||||
labels, and proportions are exact, and the figure re-renders identically
|
||||
after a correction. Record route `"coded"`.
|
||||
- **Generative route — `mcp__mcp-image__generate_image`** (Nano Banana Pro /
|
||||
Gemini 3 Pro Image) for **illustrative** images (cover art, mood,
|
||||
metaphor). Write candidates to `linkedin/NN/cover-v<N>-kandidat.png` (and
|
||||
`fig<N>-kandidat.png` for figures). Candidate naming lets several attempts
|
||||
sit side by side without overwriting an approved file. Record route
|
||||
`"mcp-image"`.
|
||||
- **External route** — DALL·E, Midjourney, a photographer, a hand-built SVG.
|
||||
The plugin accepts a `linkedin/NN/cover-raw.png` the operator drops in; no
|
||||
tool is mandated. Record route `"external"`. (The raw file may then be
|
||||
|
|
@ -1560,7 +1572,7 @@ Visual assets (BEFORE lock).
|
|||
- Cover: linkedin/NN/cover.png approved (after <N> candidates) (or: N/A — carousel)
|
||||
- Figures: <N> approved → linkedin/NN/figN.png (or: none)
|
||||
- Carousel deck: linkedin/NN/carousel.pdf rendered + approved (or: N/A — standard)
|
||||
- Route: mcp-image | external Credit/caption: recorded in image-credit-caption.md + edition-config.json
|
||||
- Route: coded | mcp-image | external Credit/caption: recorded in image-credit-caption.md + edition-config.json
|
||||
- Operator gate: approved (candidates surfaced via SendUserFile) [OPERATØR]
|
||||
Next: Step 8 — LOCK → delivery.
|
||||
```
|
||||
|
|
@ -1841,3 +1853,5 @@ the honest decision surface; it sells nothing.
|
|||
- `${CLAUDE_PLUGIN_ROOT}/render/build-linkedin.mjs` — POST.html delivery; reads `linkedin/NN/cover.png` + credit/caption (Step 8)
|
||||
- `${CLAUDE_PLUGIN_ROOT}/render/build-html.mjs` — annotatable review renderer (Step 7)
|
||||
- `${CLAUDE_PLUGIN_ROOT}/render/build-carousel.mjs` — carousel deck renderer (`## SLIDE N —` → PDF via weasyprint) — Step 7.5 carousel branch
|
||||
- `${CLAUDE_PLUGIN_ROOT}/render/build-figur.mjs` — coded data-figure renderer (SVG/HTML → PNG via headless Chrome; targets article/carousel/single) — Step 7.5 coded route
|
||||
- `${CLAUDE_PLUGIN_ROOT}/references/figure-design-guidelines.md` — coded-figure design rules + brand-token convention + render targets — Step 7.5
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue