Pipeline
Version history and changelog of the publishing pipeline. Current version: v3.13.0
v3.13.0 — 2026-05-22
- CI content-schema gate — new
.github/workflows/validate-content.ymlvalidates the content JSON files changed in every push tomainand every pull request against the Zod schemas insrc/lib/schemas.ts. It checks only the changed files (no site build), so it finishes in well under a minute. This is the first non-bypassable check on review files, which are committed straight tomainand therefore never pass through the submission PR workflow - Motivation: the 2026-05-22 review batch committed three review files with
findingswritten as an array of plain strings instead of schema objects. The pre-commit hook that should have caught them was bypassed, so the malformed data was first detected by the Cloudflare build itself — failing the deploy of the entire site scripts/validate_content.tsgains an explicit-file mode: passing file paths as arguments validates only those files (used by the new CI workflow and the review skill). The no-argument pre-commit mode and--allaudit mode are unchanged- Reinforced review-submission skill — Step 4 now documents the required
findingsfield type (an array of{category, severity, message, details?}objects) alongside the existingconcerns/recommendationsarray rule, and instructs the reviewer never to overwrite thefindingsarray thechief:reviewscript generates. The post-edit validation step now validates the specific review file by path and blocks commit, push, or merge on any failure
v3.12.2 — 2026-05-19
- YAML frontmatter escaping bugfix in
scripts/generate_article_from_submission.ts. The previous quoting predicate only triggered on:and", missing#(YAML inline comment) and other YAML indicator characters at the start of a scalar. A real-world failure: the 2026-05-19 TIOBE article summary "R hit #8 in the TIOBE Index…" was emitted unquoted; the YAML loader treated everything from#onward as a comment and rejected the resulting 7-character summary against thez.string().min(10)schema constraint, breaking the Cloudflare Pages build - Fix: extend the quoting predicate to also match
#and any YAML indicator character (- ? @ ` | > ! % & * ' [ {) at the start of the scalar value. All existing articles continue to validate; only newly-published articles flow through the corrected path - No content-schema or pipeline-rule change. Patch-level fix only
v3.12.1 — 2026-05-15
- Reinforced write-article guidance against two recurring failure patterns observed in the 2026-05-15 review batch (PRs #1274, #1275, #1277, #1279). Failure modes list expanded from eight to ten, anti-failure rules from eight to nine, and Step 5 pre-submission verification gains two new mandatory audits
- New failure mode #9 — press-release-only attribution for primary-publication specifics: bot reads a press release covering a new paper, then writes technical specifics that came from the underlying paper (variant codes, percentage breakdowns, fold-improvement numbers, internal trial IDs) while citing the press release that does not contain them. Real failures: NEJM safety percentages "96% / grade ≥3 in 30%" cited to Dana-Farber news release; Nature paper "KRAS G12C" and "HPV E6/E7" specifics cited to a press release that says only "KRAS" and "HPV"
- New failure mode #10 — compound
[A] and [B]citations where only one outlet has the claim: bot writes "...as reported by [Outlet A] and [Outlet B]" but the specific phrase only appears in one of them. Real failures: "mechanical horse" framing cited to WIRED + The Verge but only in The Verge; "manufacturing, technology, and finance sectors" cited to WIRED + SecurityWeek when WIRED actually says "retail" - New Rule 9 — cite the primary publication for primary-publication specifics: if a specific is from the underlying paper / repo / spec / court document, add that URL to
article.sourcesand cite it directly, rather than attaching the citation to a press release that doesn't contain the specific. Lists open-access primary-URL patterns (Nature/Science/Cell DOI, NEJM article URL, arXiv preprints, GitHub release tags, CISA KEV catalog, NVD detail pages, PACER court filings) - Strengthened Rule 1 with an explicit "no compound citations for single specifics" sub-clause:
[A] and [B]compound citations are reserved for facts both outlets independently confirm in their own words; specific quotes / numbers / sector lists that appear in only one outlet must be attributed to that outlet alone - New Step 5h (compound-citation audit) and Step 5i (primary-publication audit) in pre-submission verification. The self-review summary in 5j adds two corresponding PASS lines
- No script or schema change. Rule tweaks only. The chief:review verdict heuristic and corrections schema remain identical
v3.12.0 — 2026-05-10
- Atomic claim closes the race window in the topic-collision pre-check. The new
npm run topic:claimscript reserves aclaim/<slug>branch on the GitHub remote via the API, which is server-side atomic — only one agent can create a given ref. Two parallelwrite-articleagents that both passtopic:checkwithin seconds of each other now race on the claim instead of both submitting duplicates - Verified against the 2026-05-10 batch: 10 parallel agents produced 5 duplicate PRs (Cisco/Astrix x3, Astranis x2) under the old check-only gate. Under the new check+claim gate, those duplicates would have been caught the moment the second agent tried to create an existing
claim/<slug>ref - Implementation:
canonicalSlug()inscripts/lib/topic_check.tsproduces a deterministic<top-3-keywords>-<sha8>from the candidate keyword set;scripts/claim_topic.tscallsPOST /repos/.../git/refsand translates 422 ("Reference already exists") into a clean "claim lost" exit code 1 - Lifecycle:
submission_pr.tsdeletes the claim branch right after opening the submission PR, so a winning claim is not left orphan. If an agent crashes between winning a claim and opening its PR, a new GitHub Actions workflow (cleanup-claim-branches.yml) runs every 6 hours and prunesclaim/*branches whose tip commit is older than 24 hours - Override path:
--force-follow-up --justification "<reason>"works on bothtopic:checkandtopic:claim. With the override,topic:claimskips the branch reservation entirely (noclaim/<slug>is created) and the justification still must be pasted into the research log
v3.11.0 — 2026-05-10
- New topic-collision pre-check for parallel
write-articleagents. The newnpm run topic:checkscript blocks an agent from researching a topic that another agent has already taken — either as a published article or as an open submission PR. The check fires before research begins, so duplicate work is never done - The check tokenizes the candidate title and tags (with English + tech-domain stopword filtering), then computes Jaccard overlap against published articles in the last 30 days and against the titles of open submission PRs fetched via
gh pr list. If the maximum overlap reaches 0.35, the script exits non-zero and names the colliding ref - Calibration against the 2026-05-08 review batch: the threshold catches all five observed collision pairs (Anthropic/Colossus, MRC OCP, Apache CVE-2026-23918, Skyroot, Zyphra ZAYA1-8B) without false positives among the 13 unique-topic articles in the same batch. Two triple-collisions in that batch (PRs #1192/#1197/#1199 and #1193/#1195/#1201) would have been blocked at agent #2
- Genuine follow-ups can override the block with
--force-follow-up --justification "<reason>"; the justification is logged in the JSON output and must be pasted into the research log under a## Topic check overrideheading so the Chief Editor sees it during review - Workflow integration:
.claude/commands/write-article.mdgets a new Step 2.5 between topic selection and research that mandates the check. The existing Step 1 archive grep stays — it gives the agent the candidate keywords to feed into the script call