MINOR release. Backwards-compatible: every existing tool keeps its name + schema
(new capability is added via new operations/scopes and a new alias). Driven by a
fresh 11-area discovery audit of the 3.0.0 codebase.
Added
- Compiled routing sidecar (
_route_meta.json). Routing no longer parses the
104K_router_index.yamlat runtime.build_embeddings.pycompiles a compact,
comments-free JSON mirror (protocols/shortcut_intents/hierarchy + pre-baked
tier+workflow_shape) thatrouter.pyandsemantic.pyshare via a single
load. It parses ~300× faster (~0.42 ms vs ~126 ms) and removes the per-route
protocol-body reads. The YAML stays the authoring source;--route-meta-only
rebuilds the sidecar without fastembed. New preflight gate validates the sidecar
is fresh + consistent + embeddings-parity-checked. tool_verify(scope='outputs')— the "did the work actually land?" gate.
Resolves a protocol's declaredexpected_outputsagainst the filesystem
(glob-aware) and reports each present / empty / missing with anext_action.
The injected protocol-completion step now requires it before logging
completed, so the system refuses to call a missing or empty file "done".
docs/VERSIONING.mddocuments the in-project versioning convention.sys_path(operation='rename')— give a generic analysis step a meaningful
label. Keeps theNN_lineage number, renames the folder, and re-points every
downstreamdata/*symlink that targeted it.sys_stepis now an alias for
sys_path(the clearer name for numbered steps).- Routing-targets preflight gate — every
next_protocol/on_failure/
see_alsomust point at a real protocol (dangling links were previously silent).
Improved
- Figures.
tool_figure_palette('accent')now returns the exactRO_PALETTE
coloursapply_research_os_styleapplies (a hand-coloured figure matches an
auto-styled one); addsdiverging_emphasis.audit_figure_qualityruns its
text-overlap + default-font (DejaVu) legibility scan on a PNG's sibling SVG too,
and a corrupt/empty image now warns instead of crashing the audit. - Synthesis deliverables.
tool_typst_compilearchives the prior render to
synthesis/archive/<name>_<timestamp>.pdfbefore overwriting (no silent
clobber), flags single-page-target overflow (poster/cover-letter rendered to1 page = content overflowed — where overlapping text shows up), and counts
pages without the off-by-one/Type /Pagesmiscount. The poster check no longer
false-blocks scaffold-authored posters (#headline/#block-section). - Wizard. Ctrl+C/Ctrl+D mid-wizard exits cleanly instead of a traceback; the
"already exists" check moved to the start (no more filling out the whole wizard
to be rejected at the end); email + ORCID inputs are format-validated. - Doctrine.
power_analysisreplaced its data-shape→test-family menu with
scaffold form (name the dimensions that fix the test, justify the choice).
Fixed
state_freshness_checkreadworkspace/state.json— a file that never exists —
so the staleness signal was permanently dead; now reads the real ledger.get_dag_path/add_dag_nodestopped persisting the constant
execution_dag_pathback into the ledger every call (write churn + schema noise).- Dead-end pause detection read
protocol_namebut the execution log writes
protocol— the signal was silently dead. - Autopilot gate used
str.lstrip('./')(strips characters), so.synthesis/x
was mangled intosynthesis/xand falsely gated; now strips the prefix properly. - Maintainer docs (CLAUDE.md) pointed at the long-gone
src/research_os/server.py
monolith — repointed to theserver/package; dropped stale protocol counts.
Bumped
version→ 3.1.0 (pyproject /__init__/ CITATION); router index counter → 27.
Deferred (tracked for a future release)
- Tool-cluster consolidation (SLURM 4→1) — aliased, low user-visible benefit.
- A first-class renamable BRANCH object + retro-organization of loose work
(higher-risk state-schema change beyond the step rename shipped here). - Deeper audit-gate hardening (claims-gate-on-by-default, ship-gate
rerun-resolution) — behavior-changing, staged separately.