v2.4.2
PATCH release. Six fixes driven by an audit of the
/scratch/vsetlur/ontology-mapping v2.1 synthesis run, which surfaced
a recurring failure mode: the AI authoring a slap-together dashboard
(one section per workspace step, figure + caption underneath each),
inventing non-canonical filenames (paper-lay.md, REPRODUCIBILITY.md,
METHODS.md, CITATIONS.md) in synthesis/, and leaving behind
random .md / .mermaid / .json clutter at workspace/ root. All
fixes are protocol guidance, scaffold rewrites, lint additions, and
one tool-mode extension; no breaking changes to existing APIs.
Changed
synthesis/synthesis_dashboard— rewrite (v2.3.0 → v2.4.2).
The protocol now explicitly forbids the per-step recap antipattern
and requires a custom, story-driven structure: Hero / Headline →
Key findings (organised by claim, not by step) → Comparison
(adopted vs ruled out) → Methods → Limitations → References.
Introduces an explicit choice between Plan-mode (collaborative
outline) and Autopilot (AI picks the headline finding and structure)
before scaffolding. Quality bar now listsforbidden_structure
(per-step recap, directory dump, caption-only sections) and
required_structure(hero + ≥3 claim-driven findings sections).synthesis/synthesis_paper— clarification (v2.3.0 → v2.4.2).
States explicitly thatsynthesis/paper.pdfis mandatory before the
paper deliverable is "done" (a strandedpaper.mdwith no rendered
PDF is a blocker). Lists the four most common AI-improvised
filenames that downstream tools do NOT recognise (paper-lay.md,
REPRODUCIBILITY.md,METHODS.md,CITATIONS.md) and points each
at its canonical destination.synthesis/synthesis_lay_summary— clarification (v2.0.0 → v2.4.2).
Canonical filename issynthesis/lay_summary.md(notpaper-lay.md,
lay.md,summary.md,paper_lay.md); downstream tools recognise
only the canonical name.writing/writing_conclusions— figure/table citations (v2.0.0 →
v2.4.2). Per-stepconclusions.mdtemplate gains a mandatory
Figures + tables produced section that lifts directly into
paper / dashboard / slides synthesis. Every Findings bullet must
cite at least one figure / table / output file produced by the
step; an unciteable finding is rejected. The Statistical summary
table gains aSourcecolumn. Closes the gap where downstream
synthesis stages had to guess which figures backed which findings.tool_synthesis_curate_figures— multi-figure curation. New
modeparameter:'focal'(default, unchanged behaviour — one
focal figure per step, namedfigNN_<slug>.pngfor paper.typ) and
'all'(every figure in every step'soutputs/figures/, named
with the step number prefix, plus every figure's caption sidecar
copied or seeded). The'all'mode fixes the failure where the
AI bypasses curation and writes step figures directly to
synthesis/figures/, leaving them without.caption.mdsidecars.
Backwards-compatible: omittingmodekeeps the v2.4.1 behaviour.
Added
synthesis_check— story-structure lints for dashboards.
Three new checks onsynthesis/dashboard.html:- BLOCKER on ≥4
Step NNsection headings (per-step recap
antipattern). Tolerates up to 3 (a comparison block
referencing specific steps is fine). - WARN on 2-3
Step NNheadings (graduated nudge to
claim-driven headings). - WARN on missing hero / TL;DR / headline-finding section in
the first viewport (any of "Headline", "TL;DR", "Hero",
"Key finding(s)", "Summary", "Top-line", "Bottom line",
"At a glance" as heading text or section id satisfies it).
- BLOCKER on ≥4
synthesis_hygiene— synthesis-directory filename lint.
Everytool_synthesis_checkcall now also walkssynthesis/for
non-canonical files and surfaces per-file rename / delete hints.
Recognises the four most common AI-improvised names from the
ontology-mapping audit (paper-lay.md→lay_summary.md;
REPRODUCIBILITY.md,METHODS.md,CITATIONS.md→ delete and
fold into canonical artefacts). Unknown filenames get a softer
"move to archive/ or fold into canonical deliverable" warning.
Subdirectories (figures/,archive/,scripts/,
dashboard_data/,_typst_templates/) are ignored.workspace_hygiene— workspace-root clutter lint. Every
tool_synthesis_checkcall now also walksworkspace/for loose
files / subdirectories outside the canonical set (methods.md,
analysis.md,citations.md,researcher_certifications.yaml+
thelogs/,scratch/,archive/,.preregistration/, and
numberedNN_<slug>/directories). Loose planning docs, hand-rolled
audits,.mermaiddiagrams, and agent briefs at workspace root get
per-file relocate hints (move toscratch/,logs/, or
archive/).- Dashboard scaffold rewrite.
tool_synthesis_scaffold(kind='dashboard')
now writes a story-arc skeleton: hero section with metric-card
grid + interpretive caption slot, key-findings block organised by
claim, comparison block for adopted-vs-rejected, methods block
linking to paper.pdf, limitations + open questions, references +
cite. CSS is inline and CVD-aware. The previous scaffold's
per-section<!-- AI: ... -->markers explicitly warn against
per-step recap and step-numbered headings.
Test gate
tests/unit/test_v242_synthesis_dashboard_lints.py— 9 new
regression tests covering: dashboard step-by-step recap BLOCKER,
hero-section absence WARN, story-driven structure passes,
synthesis_hygieneflagspaper-lay.md/REPRODUCIBILITY.md/
METHODS.md/CITATIONS.mdwith the right rename hints,
workspace_hygieneflagsv2_1_*.md/tools.md/
workflow.mermaid/step_completeness_audit.{md,json}/
loose subdirectories,curate_figures(mode='all')curates every
figure with caption sidecars,curate_figures(mode='focal')
default unchanged, unknownmoderejected.- 1630 tests pass (was 1621 in v2.4.1; +9 new).
Not behaviour change
- The
synthesis_checkBLOCKER list grew by one (≥4Step NN
headings). Projects that want a per-step structure can either
cap to ≤3 such sections (a comparison block referencing 2-3 steps
is fine) or set the dashboard mode to a printable / handout
artefact (those protocols don't run the per-step lint). tool_synthesis_curate_figurescontinues to default to'focal'
mode; no behaviour change for callers that don't passmode.