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>