Releases: Synectic-Research/research-scan
Release list
v0.6.1
Fixed
-
The release workflow's own asset check could not tell a stray file from a missing one.
It globbed the directory the archives were built into — which, because the builder wrote into
the repository's trackedassets/, also held the project logo. A file that was never a release
asset made the check fail, and the v0.6.0 run went red after a wholly successful publish. The
same glob would also have passed silently had the builder produced nothing: iterating an empty
directory succeeds. Verification now runs against a manifest the builder emits, so an extra
file is a non-event and a missing or altered asset is a hard failure, in both directions. The
archives build into their own directory, which is what the builder's own usage line always
said. Worth recording alongside it:workflow_dispatchruns the build job only and never
reaches the release job, so the first time this check ran on a release was the release. It is
now a script with its own tests, rehearsed by the ordinary suite on every push. -
doctorreported PubMed asokwhen the source is not built. The check probes the
E-utilities endpoint, and the endpoint answers — but PubMed is routed forbiomedand has no
retrieval adapter, whichretrievehas always recorded asunavailable.doctorkept its own
source list and had no way to say so; it now derives the answer from the same registry, so the
day PubMed is built the list empties itself. The change is strictly additive:providerskeeps
every key, value and type, including apubmedthat still moves with its probe, andready,
okand the exit code are untouched. A newsources_not_builtcarries the fact, independent
of reachability — an unreachable PubMed is still a PubMed that is not built. The human summary
marks the row rather than ticking it. Whether a routed-but-unbuilt source should affect
readiness is a separate contract question and is not answered here. -
The PyPI project page never showed the logo. The README's image path is relative, and a
published description is served from a URL where that path means nothing. It is now an
absolute raw URL pinned tov0.6.0, which serves that exact blob — a published description is
immutable, so a branch pin would let every past release's page re-render with a future logo. -
The withdrawn
quick6/6 figure is marked inline inAGENTS.md, matching the strike-through
docs/measurements.mdhas always carried.
Note
A patch release. No selection, retrieval, screening, expansion, verification, emit, schema or
rubric behaviour changes, and no dependency changes: the shortlist order and the emitted
artefacts are byte-for-byte what 0.6.0 produced. sources/pubmed.py remains a stub — nothing
here builds PubMed retrieval.
v0.6.0
Fixed
- The shortlist tie-break was acting as a recency filter inside large equal-score bands. The
ordered cut handed to the reranker keyed onscore DESC, origin_count DESC, date DESC, and in a
real pool the first two tiers tie across dozens of papers — so date decided, and the cap dropped
central papers for being older than their band. On the recorded topic-2 acceptance run a paper
screened 3 sat at rank 90 of a 289-strong in-window population and never reached the reranker; on
the golden-topic run the cut fell inside the score-3 band and lost two. Latent since v0.4 and
present on both eras of artefact — the evidence is in
docs/measurements.md,
552f09c462dce07a7c20fa3f30e85c3264f42346:research/experiments/phase12-selection/results/report_tail.md
§4, and the audit record in
#1. Fixed in
1fd1465f413c21104d7af3710ed219ce595ca49a, with the replay that proves it in
1fd1465f413c21104d7af3710ed219ce595ca49a:research/experiments/phase12-selection/results/src-t1-replay.json.
Pooled golden survival into the rerank frontier at the shipped cap goes from 8/11 to 10/11,
which is the finite maximum, with no cap change and no new weights.
Added
- A runtime deployment fingerprint: the server logs it at startup and
/healthreports it, so
a running deployment can be matched to the commit it was built from.RELEASING.mdgained the
post-release step that exercises it — restart, then verify the fingerprint against the release
SHA — and a release receipt. - An experimental reference cognition driver in
drivers/stateless/, repo-only. It screens a
run's batches through stateless provider calls behind a reconciling CID contract, and every run
writes a machine-readable engine provenance record. It is not part of the installed package:
it lives outsidesrc/, is excluded from the sdist, was never in the wheel, carries its own
pinned dependency contract, and the package's own dependency list is unchanged. It informs the
provider-neutral engine protocol that has not shipped
(#4); promotion to a documented
path requires
end-to-end golden non-inferiority against a fresh multi-replicate conversational control, and
cost is not a promotion criterion.
Changed
- Shortlist ordering is now a total order:
score DESC, criteria_supported DESC, origin_count DESC, best_retrieval_rank ASC, date DESC, cid ASC.criteria_supportedcounts the
distinct sub-criteria screening attributed to a paper (restricted to the idsqueries.json
defines, when the run has that file);best_retrieval_rankis the best position any source gave
it. Both are evidence the pipeline already produced. The finalcidtier removes the last
dependence oncandidates.jsonorder — on the six frozen inputs it moves four rows, all inside
fully tied bands, with membership at the shipped caps unchanged. No other selection semantics
change: same caps, same threshold, same two windows, same slot rules at emit. - The fields that order reads now have domains narrow enough to trust.
scoreand
Origin.rankare strict integers: Pydantic's lax coercion turnedtrueinto1and"3"into
3, so a malformedscreen.jsonbought a place in the order instead of exiting 2. A run whose
artefacts carry a score or a rank as a string or a boolean now fails at the stage that reads it,
with the field named.rankkeeps its≥ 0floor — ranks are zero-based, and the top hit is
rank 0.publication_dateis unchanged at the schema, where partial dates are legitimate
metadata, but the date tier resolves through a calendar check, so"2024-13-01"sorts with the
unknowns instead of outranking"2025-01-01"as a raw string. Andshortlist.buildrefuses a
screen file that scores one cid twice, which both shipped call paths already refused upstream.
v0.5.2
Added
- A documentation site at https://researchscan.synectic.org, built from
research-scan-docs. The README and
the package metadata link to it;server.jsoncarries it aswebsiteUrl. [project.urls]inpyproject.toml— homepage, documentation, repository, changelog and
issues — so the PyPI sidebar points somewhere.websiteUrlinserver.json, which the MCP registry shows on the server's record. It reaches
the registry only through the manual publish step;RELEASING.mdnow says so.- CI on every push and pull request: lint, tests, the version guard, and a wheel smoke test that
installs the built artifact into a clean venv and makes it state its own version. Python 3.11
and 3.13, sincerequires-pythonis>=3.11. scripts/check_versions.py, the five-way version guard as a script instead of Python embedded
in a workflow.ci.ymlandrelease.ymlboth call it, and it runs locally the same way.
Changed
- The README opens on what the tool does and for whom, and one description now runs across the
package, the plugin, the marketplace entry and the skill, rather than four variants of it. The
registry record carries that sentence's first clause: the MCP registry capsdescriptionat
100 characters, and the full sentence is 119. SKILL.md's command-not-found hint installs from PyPI (uv tool install research-scan) instead
of from a git URL. The package has been on PyPI since 0.5.0.- The
AGENTS.mdanti-pattern about pool size now cites the corrected per-100-screened figures.
It had rested on a topic-2quick6/6 that was withdrawn at v0.2.2, when the run behind it
turned out to have arXiv failing all eight queries.
Removed
okandtool_versionfromdoctor --json. Readreadyandversion, identical in value.
doctor --jsonis a stable interface from 0.5.2 onward: keys are added, never removed or
repurposed. The two removed keys existed in 0.5.0 and 0.5.1 as undocumented duplicates of
readyandversion; the README has always namedreadyas the boolean.
v0.5.1
v0.5.0 — Open Source Developer Release
First public release. research-scan finds the 5–10 recent papers with the highest impact on a research question, ranked against the brief's own criteria, DOI-verified.
Install: uvx research-scan (PyPI: https://pypi.org/project/research-scan/), then research-scan configure and research-scan doctor.
MCP (stdio) for Claude Code, Claude Desktop, and Cursor — see the README for the .mcp.json snippet.
Full details in CHANGELOG.md. Published to PyPI via GitHub Trusted Publishing with PEP 740 attestations.