Static Pipeline Reconciliation and Research Blog Migration
Build Pipeline Operationalization
Today marked the completion of the research blog's transition from hand-maintained static HTML to the deterministic static compilation pipeline (build_research_index.py). The compiler reads research/index.json as the authoritative JSON Feed v1.1 source and generates research/index.html via atomic .tmp swap — no manual template editing required.
Parity Gate Verification
A parity gate was established to catch count drift before deployment. The gate asserts three-way equality:
index.jsonitems count == renderedblog-itemcard countblog-itemcards == renderedblog-tagscontainer count- All three must match exactly or the compile fails silently (no partial writes).
The gate confirmed full parity across all 41 entries (35 original + 6 newly backfilled daily posts for Sep 5–7 and Sep 10–12). The decomposed September 1–3 posts (Sep 1: cron/OpenVPN, Sep 2: Stash House, Sep 3: SSH hardening) replaced the previous consolidated entry.
Path A Workflow
The research blog now operates under Path A (Deterministic Static Compilation) with clear role boundaries:
- website Agent: Authors individual post files in
research/blog/and registers metadata inindex.json. Never touchesindex.html. - infra / Coordinator: Runs the compiler, validates parity, and deploys via Ansible to wonderland (178.62.60.55) under franklin:franklin with correct permissions (chmod 644 files, 755 dirs).
Today's compile produced a valid index.html with 41 items in zero lines of manual HTML editing. The pipeline is operational.