ktg-plugin-marketplace/plugins/linkedin-studio/config/image-credit-caption.template.md
Kjell Tore Guttormsen 305b99c0e4 feat(linkedin-studio): parameterize series path + de-brand render output [skip-docs]
Wave 3 / Step 8 of the remediation plan (Phase 1 — usable by a non-author).

The flagship long-form engine shipped bespoke-as-general: a maintainer-private
absolute series path and a hardcoded 'Maskinrommet' brand in the renderers. Both
are now generalized so a non-author can run the pipeline without inheriting the
author's filesystem or publication identity.

- commands/newsletter.md + config/edition-state.template.json: series-root default
  /Users/ktg/repos/maskinrommet/serier -> $HOME/linkedin-series; reconciled the
  prose that called the maskinrommet folder 'the default' so it no longer
  contradicts the new neutral default. LTL_SERIES_ROOT override contract preserved.
- render/build-linkedin.mjs + render/build-carousel.mjs: brand is now an LTL_BRAND
  env-var (empty default -> generic). Samle-post title, carousel footer brand-span,
  and cover-eyebrow fallback are de-branded; empty brand renders clean chrome. The
  operator sets LTL_BRAND=Maskinrommet in their own env to re-brand (same pattern
  as LTL_SERIES_ROOT).
- config/image-credit-caption.template.md: 'Maskinrommet-/serie-badge' -> generic
  'serie-badge'.

Out of scope (Step 9): the residual 'Maskinrommet skrivekontrakt §C2/§A'
references in newsletter.md are the writing-contract generalization, handled next.

[skip-docs]: three-doc + version reconciliation is Step 21 (pre-review-gate, per
plan: 'LAST so it captures everything'). These intermediate Wave commits are NOT
pushed before the /trekreview gate, so the three-doc obligation (which governs
pushed changes) is satisfied at Step 21, not per local checkpoint commit.

Verify: grep -rIn '/Users/ktg' config/ commands/ render/ (excl .local) -> no
matches; grep -rn 'Maskinrommet' render/ -> no matches (de-branded); node --check
on both render scripts -> OK; LTL_SERIES_ROOT still present in newsletter.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 00:46:05 +02:00

63 lines
3 KiB
Markdown

# Bilde-credit + caption — cover per edition
> **TEMPLATE.** Copy this to `<serie>/linkedin/image-credit-caption.md` and fill it
> in per series. `/linkedin:newsletter` Step 7.5 (visual-assets phase) reads it and
> updates the row for the edition in production; the values flow into
> `<serie>/linkedin/edition-config.json` → `coverCredit` + `captions[NN]`, which
> `render/build-linkedin.mjs` reads when it builds `POST.html` (Step 8). This file
> is the human-readable source of truth for *motif + credit + caption*; the JSON is
> the machine copy the renderer consumes.
LinkedIn-editoren har et **«Add credit and caption»**-felt under hvert bilde. Fyll
inn per cover. Caption = én kort linje som koder artikkelens signal (det leseren
skal sitte igjen med), ikke en bildebeskrivelse.
> Format i editoren: ofte ett felt. Lim «Caption — Credit» eller bruk feltene hver
> for seg om de finnes.
## Verifiseringsplikt — credit skal være ærlig
Er coveret **KI-generert** (Nano Banana Pro / Gemini / DALL·E / Midjourney) →
credit MÅ si det. Aldri la et AI-bilde framstå som foto eller egenprodusert
illustrasjon. Eksempel-credit for AI-cover:
**Felles credit (alle editions):** `Illustrasjon generert med <verktøy>` — f.eks.
`Illustrasjon generert med Google Gemini (Nano Banana Pro)`.
Er coveret et ekte foto eller en håndlaget figur → bytt til den ærlige creditten
(`Foto: <fotograf>`, `Egenprodusert figur`). Avvik fra felles-creditten føres under.
**Per-edition credit-avvik:** _(list any edition whose credit differs from the
felles-credit, with the reason — e.g. «Del 3: Egenprodusert figur (kodet SVG)».
None by default.)_
## Motiv + caption per edition
| Del | Cover (motiv) | Caption |
|-----|---------------|---------|
| 01 | _<one-line motif — what the cover depicts>_ | _<one-line caption — the article's signal>_ |
| 02 | __ | __ |
| samle | _<optional samle-post badge/motif>_ | _<optional>_ |
## Naming-konvensjon (cover-filer)
- `cover.png`**godkjent, fast navn**. Det eneste filnavnet `build-linkedin.mjs`
leser. Operator-gaten i Step 7.5 kopierer den godkjente kandidaten hit.
- `cover-v<N>-kandidat.png` — genererings-forsøk (mcp-image eller etterbehandlet).
Flere kan ligge side om side uten å overskrive den godkjente.
- `cover-raw.png` — valgfri ekstern pre-edit-kilde (DALL·E / Midjourney / fotograf).
- `fig<N>.png` — inline-figur (`fig1.png`, `fig2.png`, …), referert fra utkast-markdown
med `![alt](linkedin/NN/figN.png)` og **lastet opp manuelt** i editoren
(`build-linkedin.mjs` embedder ikke figurer).
## Carousel-utgaver
Carousel-editions (typografisk deck via `render/build-carousel.mjs`) har som regel
**ingen foto-cover** → ingen bilde-credit nødvendig. Slide-kilden er
`linkedin/NN/carousel.md`, rendret til `linkedin/NN/carousel.pdf`. En carousel-edition
som *også* legger en feed-cover trenger likevel en rad over.
## Samle-post
Ev. serie-badge (egen asset) → ingen credit. Lenken til serien ligger i
første kommentar, ikke i bildet.