ForgeKitFORGEKIT

Build Log

Build Log Ingest — Closing the Silent Publish Gap and a Sort-Order Bug

August 8, 2026

Traced a visible build-log gap to an unprovisioned API credential, wired the missing publish path into npm run retro, backfilled 7 unpublished sessions, and fixed a sort-order bug the backfill itself exposed.

OSInfrastructureBug Fix
7
sessions backfill-published (Aug 2–7 gap closed)
3
new/modified scripts (publish-retro.mjs, provision-publisher-key.mjs, retro.mjs)
1
real sort-order bug found and fixed, deployed to production

Timeline

Start
Zeb noticed a gap on /build-log between 8/3 and 8/7
Investigated whether the Build Log Ingest API's publish-without-redeploy mechanism was actually wired for both Alloy and CLI-driven sessions
Mid
Root cause found: credential never provisioned
RETRO_INGEST_API_KEY didn't exist in any .env file on the machine — Alloy's own Bank-action publish path had been silently failing since the API shipped 2026-08-02
Mid
Wired retro.mjs, provisioned the credential, backfilled 7 sessions
publish-retro.mjs built as a plain-JS mirror of Alloy's outbox logic; Zeb ran the provisioning script himself
Late
Backfill exposed a second real bug: sort by publish-time, not work-date
Batch-publishing 7 sessions spanning 6 days clustered them by insertion order on the live feed — found via Zeb's own screenshot, not by inspection
Close
Sort fixed and deployed; trends-page question researched and confirmed as an intentional, unrelated design decision
Session retro written and closed

What shipped

forgekit-os/scripts/publish-retro.mjs — plain-JS reimplementation of Alloy's outbox publish logic (content-hash, fail-closed public projection, ingest API POST), used because the shared forgekit-retro-contract package ships raw .ts with no build step

forgekit-os/scripts/retro.mjs — wired a new best-effort 2.7/3 publish step, and fixed the script to actually load .env.local at all (it never did before)

forgekit-os/scripts/provision-publisher-key.mjs — one-off admin script (run by Zeb, never Claude) that creates a publisher + API key row and prints the raw secret exactly once

package.json — retro npm script now runs with --env-file=.env.local, matching the existing crucible/arc:classify convention

forgekit-website/lib/retro-ingest/read.ts — listPublishedSessionsForIndex now sorts by the session's real work date (parsed from publicRetro.sessionDate) instead of lastPublishedAt, falling back to lastPublishedAt only when the date string is unparseable

Backfill-published 7 sessions that were committed to git but never reached the public build-log: build-log-ingest-api-implementation-2026-08-02, corpus-workshop-3d-scene-perf-and-polish-2026-08-02, medinachf-event-authoring-and-guides-2026-08-03, game-builder-first-horizon-disappearing-platform-2026-08-03, sketchforge-research-architecture-2026-08-03, alloy-commons-recognition-field-and-wander-2026-08-07, medinachf-public-refresh-and-member-redesign-2026-08-07

still confused. so should I be looking at it locally or not?

Zeb — the question that led to confirming, by reading the actual 2026-08-02 design record rather than guessing, that engine-health/trends staying local-only was a deliberate decision, not staleness
Build Log Ingest — Closing the Silent Publish Gap and a Sort-Order Bug — August 8, 2026 · ForgeKit