draft v0.1.0 claude-opus-4-8 pattern · harness

DOWNLINK Publish

Project abacus blog entries onto landing and verify the result, or check for drift between the two repos without touching anything.

  • downlink
  • abacus
  • content
  • projection
  • pattern:sequential

inputs

namerequireddefault
mode no
abacus_path no
landing_path no
commit no
shipped_count no
generated_count no
draft_count no

routing

triggers

  • publish the downlink entry
  • project content onto landing
  • reproject downlink
  • check downlink drift
  • is landing in sync with abacus
  • regenerate the blog projection

not for

  • authoring a new entry (use downlink-entry-author)
  • writing social variants (use downlink-social-repurposer)
  • hand-editing anything under src/content/blog/_generated (it is generated; the CI drift guard fails on hand-edits)
  • changing which entry is featured (FEATURED_SLUG is a hardcoded constant in landing)

prompt

notes

Failure modes:
- Either repo path missing: guard.sh aborts.
- mermaid:prerender needs a headless Chromium. On a fresh clone it fails
  until `npx puppeteer browsers install chrome` has run. Puppeteer v24 skips
  its own download via the committed .puppeteerrc.cjs, NOT .npmrc (which is
  inert on v24), so a missing browser is a setup problem, not a config bug.
- project:content is all-or-nothing: it validates every entry, then wipes
  and rewrites _generated. A single malformed entry anywhere in
  40-shipped/blog fails the whole run.
- Entries with published:false are skipped by design and must not appear in
  _generated. A draft showing up there is a real bug, not drift noise.
- Only projection targets with surface devarno.com and collection blog are
  projected here. The other known target (null0.blue/journal) belongs to a
  different repo and is correctly ignored.

Merge order matters and is easy to get wrong. Landing's CI checks out
abacus at its DEFAULT BRANCH (no ref is pinned in ci.yml) and regenerates.
So the abacus change must be on main before the landing PR runs, or the
drift guard regenerates the old set and fails on a diff that is not really
a diff. Abacus first, landing second. Always.

Known and pre-existing: src/content/_generated/mermaid-svg.ts is NOT
deterministic. Regenerating drifts a few charts on floating-point width
jitter, reproducible on a clean main with no content change. No CI gate
covers that file (the diff -ru guard only watches blog/_generated), so it
is diff noise rather than breakage. Do not chase it, and do not report it
as drift.

description

Runs the two-repo DOWNLINK publish sequence and proves it worked. A
DOWNLINK entry is authored in abacus but rendered from landing, where
src/content/blog/_generated is machine-written and guarded by a CI drift
check. Publishing therefore means: regenerate in landing, pre-render the
mermaid diagrams, verify, and commit both halves. That sequence is a bare
npm script today with nothing wrapping it and nothing scheduling it. In
check mode the prompt regenerates into a scratch copy and reports drift
without modifying the working tree, which is what the downlink-drift-watch
cycle runs. Use when publishing a new or edited DOWNLINK entry, or when
checking whether landing has fallen out of sync with abacus.