Repository navigation
Releases: raktim-mondol/academic-harness
Release list
v0.44.0 — Reviewer-response coverage ledger
Phase 7: reviewer-response coverage ledger
New rebuttal tool and rebuttal-store.js under .dsh/rebuttal/<slug>/ with nine actions:
import— one source per call: a storeddeep_reviewround,ah_reviewitems from anah.yamlproject, or caller-supplied OpenReview reviews. Each point keeps its reviewer identity andevaluator_kind; the tool never fetches, never executes, and never edits a manuscript.plan— a supplementary task stub per point: dataset, onereproduced/reportedbaseline arm, metric with direction, replicate count from a suppliedpower_analysisresult or a declared basis, and expected evidence type. Growth is capped byREBUTTAL_MAX_TASKS(default 20) — the paper'sN_tis never instantiated.link— task to an existingexperiment_logrun (metrics read live by id) or a hashedanalysis_run, pinned to a SHA-256 digest so later reads reportverified,drifted, orunreadable.respond/decline— the author's own words, citing link ids and recordedmanuscript_diffhunks. A decline is verified against the engine's livedeclinedstatus or labelled as author-recorded; the tool never declines anything itself.coverage— five states (answered,answered_asserted,declined_verified,declined_recorded,unaddressed) plus closing against a freshdeep_reviewround. Coverage, not outcome: a bad verdict, spec drift, drifted digest, or non-zero exit stays recorded and reportable.draft— response-letter skeleton citing only recorded evidence; the full letter is kept underdrafts/, with an optional callerout. Returns themanuscript_diffitems andah_review_respondhandoffs.export/status— Markdown/JSON/CSV and the full ledger read-back.
Fixes found in adversarial review
- Deep-review native ids are round-scoped, so a later round's positional points are stored as separate rows instead of merging into the first round.
- Checklist points pair by their stable engine key, so an unchanged still-NO item no longer reads
closed. - Id-less OpenReview notes get positional ids, so a second reviewer is not silently dropped.
- Same-millisecond answer/decline ordering uses a monotonic
event_seq. draftpersists the full letter;outreceives the full text.- Invalid
REBUTTAL_MAX_TASKSwarnings reachlink/respond; coverage row-cap truncation is disclosed. - Documentation claims reconciled with the code (closing applies only to deep-review points, item statuses,
review_not_person,power_analysisbasis,deep_review_round).
Wiring
openreview.js additively passes signatures, questions, and forum; new rebuttal-experiments skill and rebuttal-plan workflow; REBUTTAL_MAX_TASKS in Settings; preset row, package exports/files/test script, regenerated cordis.patch.yml; skill catalogue 767 → 768.
Verification
- Full suite: 78/78 test files pass, including regressions for id-less OpenReview notes, cross-round ids, checklist pairing, same-millisecond ordering, retained drafts, and cap warnings.
- Live DSH Web UI run in a new Academic Harness session: imported 6 points, planned
t0001, loggedx0001, linkedl0001(digest verified, accuracy 0.74 read live), recorded an answer, coverage 1 answered / 5 unaddressed, retained a 1,885-byte full draft, and exported a 2,228-byte report. Session creation also confirms the preset/package wiring.
Full changelog: docs/CHANGELOG.md
v0.43.1 — Deterministic deep-research run ordering
Fix
deep_research listRuns now breaks identical created_at timestamps by descending run id, so runs and status reliably report the newest run first even when two runs start in the same millisecond. CI exposed the tie on v0.43.0: the previous comparator fell back to directory order.
Verification
scripts/test-deep-research-store.mjs: 97/97 checks pass, including a new identical-timestamp regression case.- Full suite passes in CI (76/76 test files) on the v0.43.1 tag and
main.
Full changelog: docs/CHANGELOG.md
v0.43.0 — Ablation, limitations, and grounded novelty
Phase 6: hypothesis limitations, traces, selection, and grounded novelty
coscientist gains three actions:
limitation(add/verify/status) — append-only numbered records with the methodological flaw, a verbatim source quote checked against a hypothesis or workspace file, at least two remedy families, and binarysufficient/insufficientreadings under a round cap. A spent cap is reportedexhausted; it is never an acceptance.trace— read-only evidence fromexperiment_logledgers, failed and pruned runs first. Anevolutiondispatch now carries those traces as constraints.select— freezes an active champion with its compared survivors, rationale, and a SHA-256 digest over the tournament readings, review scores, citation/novelty checks, and matching experiment traces.
add accepts addresses_limitation; coverage appears in status, graph, and both exports. coscientist_verify gains novelty: it retrieves a reference set (2 by default, max 10), stores it, computes the documented lexical prior-art reading, and pins the score to verbatim quote spans. A failed retrieval is not_checked with no score.
Phase 5: component attribution
New ablation tool and ablation-store.js under .dsh/ablation/<slug>/: a frozen component × arm × dataset × metric plan, records linked to existing experiment_log / analysis_run runs (it never executes), paired removal deltas with ties and missing cells, an advisory attribution reading, human good / refine / unattributed verdicts, append-only pruning, and Markdown/JSON/CSV export.
Phase 4: staged experimentation
experiment_log start accepts a benchmark spec (datasets, splits, baseline arm, task rules) and a protocol; log accepts role, baseline_ref, stage, and a sampling rule. The baseline captures a protocol digest, variants must match their reference, drift is stored as spec_drift, verdict records good / engineer / bad with force-bad on an exhausted engineering budget, and best dominance returns the multi-metric Pareto front.
Phase 3: advisory review score
New score action on deep_review: one bounded model call returns soundness, originality, clarity, and significance readings on a declared scale, each citing stored comment ids. Every review round records evaluator_kind: held_out | in_distribution; a dimension without a valid reading or citation is not_checked. The score is an automated reading, never an acceptance decision.
Fixes found during release validation
- Added the missing
./ablationand./ablation-storepackage exports; without them the preset rowacademic-harness/ablationfailed to start, blocking every new Academic Harness session. - Normalized Crossref reference titles before novelty quote selection, so a tagged or multi-line title can no longer fail its own verbatim span check.
Verification
- Full suite: 76/76 test files pass.
- Live DSH Web UI run in an Academic Harness session: limitation round cap reached
exhaustedat 2/2 with coverage, a champion selection digest, trace output, and a Markdown export; grounded novelty produced7.4/10and8.5/10readings with two verbatim quotes each.
Full changelog: docs/CHANGELOG.md
v0.42.0 — Evaluation validity and calibration
Phase 2: evaluation-validity checks
deep_review gains an advisory validity action with four deterministic readings over a stored review and the manuscript text:
attributionevaluator_driftbenchmark_coverageunmeasured_trade_off
Each returns clear, flagged, or not_checked, with a reason, evidence, and tallies. One bounded critic call annotates the result and can never change a state. The pass writes extra_checks.json, meta.validity, a runs.jsonl row, and a notebook entry; show section=validity and status read it back.
Phase 0: real-paper calibration
scripts/deep-review-validity-calibration.mjs (also deep-review-calibration.mjs --validity --corpus) measures the checks over a labeled corpus with the simple PDF-to-Markdown converter and no OCR.
On the 14-paper corpus:
- 0 false-positive papers
- 0 false alarms on every check
- 43/56 overall state agreement (76.8%)
- 0 determinism mismatches
attribution14/14evaluator_drift8/14 (one missed clear, four abstentions)benchmark_coverage10/14 (no flags, four abstentions)unmeasured_trade_off11/14 (no flags, two abstentions)
The corpus loop fixed references and PDF line numbers being counted as prose/grids, coverage ignoring numeric dataset columns, removal evidence over- and under-firing, and review papers being flagged for a missing ablation. The first pass had 10 false-positive papers and 39.3% agreement.
The Markdown report is at reports/deep-review-validity-20261103T235613.md; the full changelog is docs/CHANGELOG.md.
Verification
- Live DSH Web UI: Markdown and a real PDF passed review + validity with the critic on; states matched the corpus labels.
- 72/72 test files pass.
Known caveat: one 13-page PDF hit a vendored review-engine segmentation error ((s.pages ?? []).map is not a function) before validity ran. A second real PDF passed; this is a pre-existing engine model-output shape bug, not the validity code.
v0.40.0
Cleanup release. No tool or skill is removed; the tool list gains nine tools (previously opt-in) and loses two MCP aliases of tools that already exist natively.
- Optional tools are now always on.
author_lookup,openreview,pdf_references(still needsGROBID_BASE_URL),coscientist_verify,stat_audit,figure_audit,repo_audit,grant_search, andpatent_searchregister withoutAH_ENABLE_OPTIONAL_TOOLS. The flag andoptional-tools.jsare gone; the tools have a new prompt section and a guide, Identity, funding, and audit tools (formerlyOPTIONAL-TOOLS.md). - Parallel MCP connector removed.
mcp__parallel__web_search(locked tobasic) andmcp__parallel__web_fetchduplicated nativeparallel_searchandparallel_extract, which sharePARALLEL_API_KEYand support every mode. Firecrawl and Scite connectors are unchanged. A Parallel key now takes effect on the next call with no restart. - ResearchCraft-era compatibility removed.
scripts/migrate-profile.mjs,scripts/test-rename.mjs, thedsh-researchcraftlauncher alias, theRESEARCHCRAFT_*environment fallbacks, the 0.1.x/pre-0.16 API-key import insettings-keys.js, and the notebook-skill rename inseed.js. Upgrading from a pre-0.16 profile now needs a fresh install. Attribution inNOTICEandLICENSEis unchanged. - Stale material removed: eight finished plan documents under
docs/,academic-harness_docs/(an old mod archive),.e2e-artifacts/screenshots, an unrelated run log inreports/, and the committedmain.pdf/main.bblbuild outputs ofpaper/rsi-local/(now git-ignored;makerebuilds them). Comments that pointed at the deleted plans were reworded. - Tests and CI.
npm test(scripts/run-tests.mjs) runs everyscripts/test-*.mjs; CI calls it, which adds the twelve suites CI never ran (the seventest-coscientist-*,test-library,test-power,test-reference-library,test-rsi,test-zg-excludes).test-optional-tools.mjsbecametest-identity-tools.mjs. CI installs thedshCLI at0.2.1-rc.5, matchingpackage.json.
v0.37.0: deep research
deep_research runs a bounded, self-driving investigation and keeps its state in an append-only run ledger, so a long research question stops being something an agent improvises and forgets.
How it works. The request is frozen verbatim and re-read by every step, so a run cannot drift onto a different question. It sweeps the literature through the existing literature_search router plus a web lane (Parallel, Exa, Tavily, Brave) for guidance documents, registers, and reporting; builds a contradiction graph; picks the loci where reading deeply would change the answer; drafts from three angles; has four critics attack the draft; and repairs it with capped hunks. After synthesis the report cannot be regenerated, only patched.
Two counts a plain agent gets wrong, enforced mechanically.
- Voice, not copies — independence clustering groups DOI, exact and near titles, and identical bodies across hosts, so five reprints of one release argue with the weight of one source. Distinct DOIs are never merged.
- Verified, not plausible — quotes are checked against stored text in PaperMemory, a span nothing read is reported
not_checkedrather than passed, and an unacknowledged retraction blocks the ship. Fetched pages arrive inside an<untrusted-source>fence whose own tags are escaped.
One scale knob. effort=low|medium|high, inferred from the request when not given. A request that points both ways returns needs_input and creates nothing — no run, no model call — until the caller answers. Runs resume at the step that died; budgets block rather than balloon.
Reuses, does not duplicate. The scholarly router, paper-download open-access resolution, pdf-to-markdown, integrity_check retraction signals, ledger-kit/store-lock, PaperMemory, and the host LLM and jobs services. No new search client, no second vault, no new runtime. Fetched full text is deposited into PaperMemory, so a run's reading outlives it.
Verified live. A real session on a clinical question swept 477 scholarly records plus 10 web pages, fetched four open-access full texts, and deposited them into PaperMemory (pap_b4ffbb5dc3e3 for DOI 10.1056/NEJMoa2307563 and three others). Publisher 403s are recorded per record with their reason rather than swallowed.
Also in this release
runSourceexported fromliterature-search.js;runParallelSearch,runTavilySearch,runBraveSearch,runExaSearch,runPerplexitySearchextracted from their tools so the web lane calls one implementation each.quoteCheck()added topapermemory-cli.js.- New
docs/RESEARCH.md#deep-researchsection, README diagram, andskills/deep-research/references/run-ledger.md. - 333 deep-research checks across four suites, all wired into CI. Design adapted from hyperresearch (MIT); attribution in
NOTICE, no upstream code vendored.
v0.36.0: study conduct, ethics, and grants
- Phase 5 — study conduct, ethics, and grants. Seven new preset-only tools. State lives under
.dsh/{preregister,causal,design,ethics,deidentify,dmp,budget}/<slug>/; none submits anywhere, invents an approval/rate/repository, or issues a compliance or causality verdict. preregister(preregister.js,preregister-store.js) freezes a study plan into write-once, hashed versions:start,import(review protocol, coscientist design protocol,analysis_runplan,causal_dag, or workspace JSON; a statelesspower_analysisresult is supplied as an object),freeze(required fields; a data-collection guard requires a reason),status,verify(re-hashes every version and reportsverified/changed/tampered),export(Markdown, JSON with OSF/AsPredicted-shaped fields, or PDF when LaTeX is available), and an explicitly disabledsubmit. No OSF call is made. Tests:scripts/test-preregister.mjs.causal_dag(causal-dag.js,causal-dag-store.js,causal-graph.js) stores a user-specified DAG and derives d-separation, minimal backdoor and front-door sets, collider/M-bias and adjustment warnings, instrument candidates, topological order, local-Markov testable implications, and VanderWeele E-values. DOT/Mermaid/edge-list import and Mermaid/DOT/edge-list/JSON export; edits are versioned with a reason. No model is fitted and no effect is estimated. Tests:scripts/test-causal-dag.mjs(known DAG adjustment/front-door/instrument/latent/collider fixtures and E-value arithmetic).design(design.js,design-store.js) generates reproducible schedules from a required seed: simple, permuted-block, stratified, cluster, crossover, and minimization randomization, allocation/blinding codes, realized-balance diagnostics (numeric SMD and categorical shares), full and fractional factorial, Plackett–Burman (8/12/16 runs), central composite, and Box–Behnken designs with defining relation/resolution, aliasing, and a randomized run sheet. Balance is reported, never guaranteed; DOE is a design, not an analysis. Tests:scripts/test-design.mjs.ethics_protocol(ethics-protocol.js,ethics-protocol-store.js) keeps an append-only protocol, consent drafts, and a concept checklist (consent, risk/benefit, privacy, retention, sharing, compensation, incidental findings, vulnerable populations, GDPR/HIPAA, animal welfare, institutional requirements). It is not legal advice; approvals are recorded, never verified or invented, and manual items stay manual. Tests:scripts/test-ethics-deidentify.mjs.deidentify(deidentify.js,deidentify-store.js) scans text/JSON/CSV/TSV for PHI/PII locally with regex/heuristics, stores only masked reports (custom terms are HMAC-hashed with a workspace-local.dsh/deidentify/.term-key), redacts to a separate file with per-type/per-column actions, and rescans the output for residual matches. Overlapping matches are merged, a file with more than 1000 candidate matches is refused rather than partially redacted, andverifydetects an output changed after the redaction record. No model/network call, no reversible mapping, and no HIPAA/GDPR certification; a human must review. Tests cover synthetic PHI, CSV column actions, JSON, custom-term hash handling, residual verification, truncation refusal, and changed-output detection.dmp(dmp.js,dmp-store.js) drafts NIH DMS, NSF DMP, Horizon Europe, Wellcome, ERC, and generic plans with append-only sections and a checklist; templates are paraphrased concepts, and repository/embargo/cost/official requirements staymanual_check.grant_budget(grant-budget.js,grant-budget-store.js,python-helpers/grant_budget.py) builds a multi-year budget from explicit salaries, effort/person-months, fringe, escalation, line items, subawards, cost share, indirect rate/caps, with arithmetic checks, a justification, staleness detection, and CSV/Markdown/JSON/XLSX export. It never invents a rate or decides allowability. Tests:scripts/test-dmp-budget.mjs.- Added five skills (
causal-dag,experimental-design,research-ethics,data-management-plan,grant-budget; catalogue now 762), updatedpreregistering-analysis, new prompt section## Study conduct, ethics, and grants,docs/RESEARCH.mdsections,docs/TOOLS.mdrows, preset rows, regeneratedcordis.patch.yml,test:phase5, and the five suites in CI. - Live DSH Web UI verification. A real Academic Harness agent session exercised all seven ledgers, exports (including LaTeX PDF and XLSX), and failure paths. The live run exposed two defects that unit tests had missed: block randomization put an in-memory
n: undefinedindesign.strata[], so DSH rejected the successful schedule as non-lossless JSON, anddesign listspread a joined string and printed one character per line. Both are fixed, causal-to-preregistration import no longer carries an undefined adjustment property, andcausal_dag createvalidates before creating its ledger directory. - Deviations from the plan: causal graph algorithms, DOE construction, and de-identification are dependency-free JavaScript rather than
networkx,pyDOE3, and Presidio helpers; OSF submission stays disabled (export JSON/Markdown for manual submission);causal_dagexports Mermaid/DOT/edge-list/JSON (GraphML and SVG were not added); PDF export is implemented forpreregisteronly (via LaTeX), while DMP/ethics/budget export Markdown/JSON, budget also CSV/XLSX, and DOCX/PDF remain deferred;provenance_auditdoes not index the new preregister ledger yet and continues to report it asunknown.
v0.35.0: submission and communication
- Phase 4 — submission and communication. Five new preset-only tools, one extended search tool, and custom CSL support. Nothing submits, emails, or logs into a journal portal; drafts stay drafts and unknown requirements stay
manual_check. submission_pack(submission-pack.js,submission-store.js) plans and builds a journal bundle under.dsh/submission/<slug>/: word/abstract/reference/figure/table limits, figure format/DPI/color/size/naming, citation style andmanuscript_citations,reporting_checkevidence,numbers_auditcandidates, required statements/sections, suggested reviewers, and a manuscript PDF; then copies/compiles the PDF and sources, figures, supplementary files, author statements, cover letter, highlights, checklist, and a SHA-256 manifest into a zip reproducible from that manifest. Cover letter/highlights are author-supplied or explicit drafts; reviewers are only user entries.statusandexportinspect/copy the result. Tests:scripts/test-submission-pack.mjs.journal_searchaction: "match"ranks venues for a manuscript using the existing OpenAlex/DOAJ/Crossref pipeline plus keyword/topic/title overlap and returned metrics. It filters only known constraints (OA, max APC, indexation), reports missing data, labels fit advisory, and returns DOAJ listing, publisher membership, ISSN, APC transparency, and homepage as manual-check due-diligence signals. Custom CSL styles can now be loaded incitationwithstyle_fileorstyle_url; they are validated (CSL namespace/version/citation block, size/DTD limits), URL styles are cached under.dsh/styles/, and local/private hosts are refused. Tests:scripts/test-journal-match.mjs.manuscript_diff(manuscript-diff.js) offersdiff(latexdiff for.tex, unified diff for.md/.txt;not_installedwhen latexdiff is absent),changes(changed blocks with ids and source hashes),docx(tracked insertions/deletions, comments, Zotero/CSL field text; no rewrite), andletter(anah_reviewid delegates to the engine; generic items must map to recorded change ids, and addressed items without a hunk are flagged/unresolved). Source files are never edited. Tests:scripts/test-manuscript-diff.mjs.numbers_audit(numbers-audit.jsplus anumbersmode inpython-helpers/stat_audit.py) reports p-values recomputed from test statistics, out-of-range/zero p-values, reversed/zero-width CIs, estimates outside their CI, non-positive ratio measures, total-N inconsistency, subgroup/flow count problems, fraction/percentage mismatches, and label-matched table/text values. Everything it cannot recompute or match is listed asnot_checked; it never claims statistical validity. Tests:scripts/test-numbers-audit.mjs.presentation_build(presentation-build.js,python-helpers/presentation_helper.py) buildstikzposter/beamerposter/baposterposters and Beamer or python-pptx slide decks from explicit sections or a manuscript, copies only existing figures, compiles PDFs, writes PNG previews whenpdftoppmexists, tracks missing figures/compile failures, and returns a visual-QA checklist forsubagent_vision; it never claims the visual check passed. Tests:scripts/test-presentation-build.mjs.authorship(authorship.js,authorship-store.js) records authors, CRediT roles, and ICMJE criteria in an append-only ledger under.dsh/authorship/<slug>/, generates Markdown/JSON statements, and exports Markdown/CSV/JSON. It never assigns order or qualification, never invents affiliations/ORCIDs/funding/conflicts, and reports duplicate positions/ORCIDs and changed values as unresolved disagreements. Tests:scripts/test-authorship.mjs.- Five new skills (
submission-package,manuscript-revision,numbers-audit,presentation-build,authorship-credit) bring the catalogue to 757; new prompt section## Submission and communication; new guide sections indocs/WRITING.md; preset rows and regeneratedcordis.patch.yml;npm run test:phase4and the six suites added to CI. - Deviations recorded in
docs/SCIENTIFIC-EXPANSION-PLAN.md: PowerPoint uses a smallpython-pptxhelper (the slide skills ship no deck generator), match does not calljournal_policyper result, generic letters use recorded change ids whileah_reviewdelegates to the engine, and table/text matching is deliberately conservative; GRIMMER remains unimplemented.
v0.34.0 — review synthesis, reproducible analysis, and provenance audit
- Phase 0 foundations. Added
ledger-kit.js(stable JSON hashing, JSONL/write-once helpers, overwrite-safe text export),provenance.js(typed link/ID conventions), example schemas underschemas/, and a shared test workspace fixture. Existing ledgers are unchanged and do not import the new helpers yet. - Structured extraction in
review. Newextractandextract_statusactions, a write-once extraction template (generic,pico,peco,diagnostic_accuracy,prognostic,qualitative, or inline), field-levelreconcile scope=extraction, multi-row extraction viarow_id, andextraction-table/extraction-matrix/extraction-jsonexports. Values are reviewer-supplied and recorded, never inferred; missing required fields are counted, and field-level quotes are checked through PaperMemory whenpaperis supplied. The Markdown report and JSON ledger include extraction output when a template is frozen. - PRISMA flow export.
review export format=prisma-flowwritesprisma-flow.svgand a counts JSON sidecar through a dependency-freepython-helpers/prisma_flow.py. Counts come from the ledger; missing counts staynot recorded, and the diagram is labelled PRISMA-style, never a compliance statement. - Pairwise meta-analysis (
meta_analysis). New preset-only ledger under.dsh/meta/<slug>/with effect-size conversion (2×2, continuous, correlation, HR, diagnostic 2×2, generic effect+CI/SE), fixed/random pooling using DerSimonian–Laird, Paule–Mandel, or REML τ², normal or Hartung–Knapp CIs, Q/I²/H²/τ²/prediction intervals, subgroup analysis, numeric-covariate meta-regression, leave-one-out, Egger/Begg/funnel publication-bias diagnostics, univariate diagnostic-accuracy pooling, forest/funnel/SROC SVG plots, Markdown/CSV/JSON exports, andimport_reviewfrom a completed extraction table. The protocol is write-once; every result echoes the model and warns below 5 studies or 10 studies for funnel tests. Trim-and-fill, network meta-analysis, dose-response, and bivariate/HSROC diagnostic models are explicitly not implemented in this release. The pairwise core is validated against the published BCG example (fixed, DL, PM, REML, subgroup Q-between) inscripts/test-meta-analysis.mjs. - GRADE certainty and summary of findings (
review). Newgrade_start,grade_judge,grade_overall, andgrade_statusactions on the existing review ledger. Outcomes are write-once (grade.json); domain ratings and overall certainties are append-only (grade.jsonl). Downgrade domains are risk of bias, inconsistency, indirectness, imprecision, and publication bias; observational upgrade domains are large effect, dose-response, and plausible confounding. Every rating needs a reason; optional quotes can be verified through PaperMemory; dual reviewers produce missing-reviewer and conflict states. The tool derives a suggestion from the domains but stores the human overall certainty; differing overalls export asconflict. Newgrade-profile(Markdown/CSV) andsof-table(Markdown/CSV/LaTeX) exports.scripts/test-grade.mjscovers single/dual reviewers, conflicts, overrides, quote verification, and all export formats. - More appraisal instruments. The
review appraiselibrary grew from four templates to eleven:amstar-2(16 items, critical items flagged),probast(risk-of-bias plus applicability cells),quips,syrcle, and consolidatedcasp-cohort,casp-case-control, andcasp-qualitativechecklists. Each ships as a paraphrased, versioned JSON template underappraisal/linking to the official source; only RoB 2 and ROBINS-I derive an overall, matching the instruments' own guidance. Decisive ratings (checklistyes/no) require verbatim quotes like existing instruments; completeness, reconciliation, agreement, and the rob-table/rob-summary/rob-figure paths work unchanged. - Phase 2 — reproducible analysis and data layer. Five new preset-only tools.
analysis_runfreezes an analysis plan (question, inputs/outputs, methods, alpha, seed; changes neednew_versionplus a reason) and executes argv commands — never a shell — under an environment allowlist with explicit-env redaction, hashed inputs/outputs, a hard timeout, notebook execution via jupyter/papermill, run-vs-run and run-vs-plan diffs, lab-notebook entries, and Markdown/JSON run reports; a nonzero exit or timeout is recorded, not hidden.experiment_logregisters sweeps and model comparisons as append-only runs (params, metrics, hashed artifacts, seeds, parents) with compare, best-by-named-metric-and-direction, links, and CSV/JSON/Markdown/MLflow-compatible export; missing metrics stay blank and reruns are never deduplicated.dataset_getresolves DOIs through DataCite/Zenodo/Figshare and downloads intodata/<slug>/with size caps and checksum verification (mismatches recordedverification_failed, files kept), plusverify/statusagainst a provenance manifest;dataset_searchstays search-only.data_profileprofiles local files through pandas — schema, missingness, duplicates, ID/date heuristics, target balance, split overlap, small cells, and leakage-risk findings with explicitnot_checkeditems and a data dictionary.repro_packagebuilds a reader-facing package (manifest with SHA-256, environment snapshot, generated Dockerfile, README, CITATION.cff, codemeta.json, RO-Crate 1.1, checksums) from the other ledgers, verifies it by re-hashing, and offers a two-step, confirm-gated, draft-only Zenodo deposit that never publishes. New skillsreproducible-analysisandexperiment-tracking(catalogue now 751); new guidedocs/ANALYSIS.mdwith a lifecycle diagram; prompt section## Reproducible analysis; testsscripts/test-analysis-run.mjs,test-experiment-log.mjs,test-dataset-get.mjs,test-data-profile.mjs, andtest-repro-package.mjsin CI; helper environment gains pandas and openpyxl. Live verification also fixeddataset_search filesfor Zenodo's newer API (the record payload now inlines the file list and/filescan 404) and madedataset_get getsurface a failed file listing as unavailable with the reason instead of an empty list. - Phase 3 — cross-ledger provenance audit (
provenance_audit). One new preset-only tool, strictly read-only:provenance-store.jsbuilds an index by joining the ledgers that already exist —reviewrecords, screening, evidence, extraction rows and field quotes, appraisals and GRADE events,reporting_checkverdicts with their manuscript snapshot, storeddeep_reviewclaim–evidence maps and citation verdicts,notebookentries and their artifact links,analysis_runplans/manifests with hashed inputs and outputs,experiment_logruns and links,dataset_getdownloads and checksums,meta_analysisstudies with theirrecord_idprovenance, and Academic Harness cited-clause sidecars (claims/*.yaml) when the workspace hasah.yaml— using the sharedpaper:/quote:/unit:/claim:/record:/run:/result:/review:/export:id conventions fromprovenance.js. Actions:index,coverage,unsupported(split intono_link,not_checked,unverified,stale,not_found),stale(recorded vs current hashes, plus the state a claim held before the ripple),unverified,impact(transitive dependents of a paper, quote, file, or run), andexportto Markdown, CSV, JSON, GraphML, and Mermaid. Support is never inferred: adeep_reviewengine verdict is recorded as unverified, a quote with no PaperMemory paper isno_link, a broken link isnot_foundnaming the missing end, and a ledger that cannot be read isunknownwith its reason —scientific_result(not persisted) andpreregister(Phase 5A) are reported that way. Live quote re-verification throughpapermemory_quote_checkis opt-in (verify_quotes: true); PaperMemory's SQLite store is never opened directly. Every write is funnelled throughassertAuditWrite, which refuses any target outside.dsh/provenance/<audit>/; source ledgers are opened with their own read functions only. Deviations from the plan: the cache is keyed by an audit name rather than a content hash (consistent with every other ledger, with the index hash recorded inside it), and AH unit authorship stays withah_provenancerather than being re-derived. New skillprovenance-audit(catalogue now 752), new guidedocs/PROVENANCE.md, prompt section## Provenance audit,yamladded as a direct dependency for the claim-sidecar reader, andscripts/test-provenance-audit.mjsin CI (test:provenance) — it hashes every file outside the cache before and after indexing and exporting to prove no source ledger was written, and asserts that write attempts to one are refused. Live verification through the DSH Web UI (a throwaway profile linking this tree, a fixture workspace, and a real agent turn) reproduced the packaged index exactly — 22 nodes / 19 edges, claimsno_link3 ·not_checked1 ·stale2, with the stale AH claim showing its recorded and current source hashes — and found one usability gap that is now fixed: tool output includes node ids, so the agent can pass them straight toimpact. - Phase 1 end-to-end verification in the DSH Web UI. A scripted review-plus-meta-analysis run through the browser agent found and fixed three defects:
extract_statusno longer reports every required field as missing when a rostered reviewer has not extracted yet (the row now readsawaiting human:<name>, exports gained amissing_reviewerscolumn, and only genuinely absent fields are listed);meta_analysis startaccepts aprotocolobject in addition to flat arguments (flat wins on conflict); and the Markdown report and studies CSV now show per-study weights from the pooled analysis instead of an empty Weight column. Theeffect_measuredescription no longer mentions DOR, which is not a pooling measure. - Tests:
scripts/test-ledger-kit.mjs,scripts/test-review-extract.mjs, `scripts/test-prism...
v0.33.0 — Academic search parity tools
Academic search parity tools
- Added
journal_search,paper_get,paper_context, anddatabase_catalog. - Extended
literature_searchwith DOAJ and keyless publisher Crossref deposits; added Springer/IEEE keyed sources. - Added OpenCitations fallback and a
bothdirection toopenalex_citations. - Added
identifierBibTeX resolution tocitationand paper-scoped snippets tos2_search. - Added the
academic-searchskill and reference bundle, plus the complete README Search tools table. - Updated the search-routing, capability-map, paper-pipeline, and request-lifecycle diagrams.
Free providers are fixture-tested and live-smoke-tested. The paid/keyed tiers (Elsevier Serial/ScienceDirect, WoS JCR, Wiley TDM, Springer, IEEE) are implemented but intentionally not live-tested; use your own credentials to verify them.