Changelog
All notable changes to the rqtk command line. The format follows
Keep a Changelog; the project follows
semantic versioning as described under Stability in the README.
[1.2.0] — 2026-09-24
Field trials on six stacks (Python, Rust, TypeScript on Bun, Go, Java on Maven, C++ with GoogleTest) found cases where rqtk reported a requirement verified when it wasn’t. This release fixes them; some checks are stricter as a result.
Upgrade notes
coverage --strictrequires every requirement to be Verified. It used to pass Planned and In Progress requirements. Add--allow planned(and--allow in-progress) to accept requirements written ahead of their implementation.- RQ030 is an error: a
verifiestag with no test declaration below it can never be verified. Only comments and attributes may sit between a tag and its test now. verifyexits 1 when the results match no linked test, or a linked test matches several distinct tests.- Suspect lasts longer. A requirement stays Suspect after it changes, even when the same
unchanged tests pass again, and after a parent requirement or need changes; see Review debt
below. Run your tests and
rqtk verifyonce after upgrading and commit.rqtk/evidence.toml, so the evidence records test source hashes and upstream hashes. - Evidence written by 1.2 can’t be read by 1.1 (it has new fields). Upgrade everyone who
runs
rqtk verifytogether. From 1.2 on, unknown fields in the evidence file are ignored. - Rust:
#[requirements_docs]moved to therequirements-docsfeature;features = ["macros"]now brings only#[verifies].
Fixed: verdicts
- Test declarations in Java, Kotlin, C#, C and C++ (including GoogleTest
TEST/TEST_F/TEST_Pand Catch2TEST_CASE) are recognised; before, nothing in those languages could be verified. - A tag binds only to the test directly below it. It used to bind to the next test it
recognised within 12 lines, so
it.each(…)gave its activity to an unrelated test. - JS/TS
.only,.skip,.concurrent,.each(…)anddescribegroups; Go methods; Pythonasync def; Kotlin backtick names. - Results are matched by the file and line the runner reports where available, then by what the link’s path says about the classname. A name that still matches several distinct tests is reported as ambiguous instead of all of them deciding the outcome.
- CTest and GoogleTest disabled tests (
status="disabled",status="notrun") count as skipped, not passed. verifyno longer says “Evidence is up to date” when nothing matched.
Added
- Review debt. Evidence records a hash of each activity’s test source and of everything
upstream of the requirement. A requirement re-verified by unchanged tests after it changed,
or whose parent or need changed, is Suspect until its tests change or someone records
rqtk review <ID> [--note …].coverage,contextandreportsay why a requirement is Suspect (suspect_reasonsin JSON). - Table-driven and parameterised tests:
// rqtk: verifies VA-… case "name"on a table row, orverifies("VA-…", case = "…"), links one case: Go subtests, pytest parameters, rows ofit.each([...]), and GoogleTest parameter values. - JUnit
@DisplayName/@ParameterizedTest(name = …)and xUnitDisplayNameare read from the annotations, so tests match under Gradle, which reports display names. - Evidence names tests as
<source file>::<name>, the same whichever runner reported them (Bun and vitest, CTest and GoogleTest). verifycounts linked tests that got no result, and warns when it records evidence with no commit to record it against.init --hookinstalls the pre-commit hook.- The report header shows uncommitted requirement changes and the latest baseline.
rqtk addwrites complete requirements:--parent,--satisfies,--criteria,--activity(IDsVA-<CATEGORY>-<NUMBER>-<NN>),--priority,--method,--level,--phase. It refuses a category that requires a parent when none is given.rqtk add-activity <ID> --name …, andadd-need --rationale.coverage --strict --allow planned|in-progress.rqtk reportopens with what needs attention, shows the tests and commit (or date and files) behind every activity, and adds a stakeholders table and a need → requirement → activity → evidence matrix.impactnames the tests to run for each activity and separates activities whose evidence already covers the change (tests,done).- Lint rule RQ031: an activity’s evidence file doesn’t exist.
activity_statesin verification JSON: activity states as objects.initnames the project afterCargo.toml,pyproject.toml,package.jsonorgo.mod, and warns outside a git repository.
Changed
initcreates the example stakeholder and need only with--example.- New requirements get priority Medium (or the middle configured level), not the first level.
- New requirement and need files carry no
content_hash, so editing them leaves no stale-hash warning.rehashrefreshes stored hashes only;rehash --allstamps every file. validation.require_parent_for_categoriesis the documented name of the parent rule;require_parent_for_levelsstill works.identification.id_patternis optional: without it, IDs are checked against<prefix>-<CATEGORY>-<NUMBER>for the configured categories, so adding a category is one table.initno longer writes it.- Everything except history (
impact,diff,log,baseline) works outside a git repository;lintused to fail there. - New stakeholder and need IDs follow
zero_padding(STK-0001), or the width a project’s existing IDs already use. - Requirements in top-level categories default to verification level System.
tracesays when a requirement is top-level or a leaf instead of printing empty lists, and shows titles.rqtk = { default-features = false, features = ["macros"] }builds 16 crates instead of about 270: the macros look activities up with a TOML parser, and therqtkcrate’s dependencies hang off itslib,cliandmacrosfeatures.scanshows what each link is attached to and counts links not attached to a test.
Fixed: other
- A closed stdout (
rqtk … | head) ends the command quietly instead of panicking. - The workspace builds on macOS with a plain
cargo build(the Python extension links). skills installsays “Added” when it adds its block to an existing AGENTS.md.
[1.1.0] — 2026-09-23
Added
pip install rqtk(oruv tool install rqtk): the Python package on PyPI now contains the fullrqtkcommand line as well as the@rqtk.verifiesdecorator. One abi3 wheel per platform (Linux glibc and musl, macOS, Windows) covers Python 3.9 and later.
Fixed
- Building the whole workspace on Windows no longer fails: the Python extension’s library is
now
_rqtk(imported asrqtk._rqtk) instead ofrqtk, which collided with therqtkbinary’srqtk.exe/rqtk.pdb.
[1.0.0] — 2026-09-23
First stable release: from here on the command line, file format, --json output, exit codes
and lint rule codes follow the Stability promise in the README. The code is the same as
0.1.0; the list below is everything that changed on the way from the first internal drafts,
where breaking changes were still allowed.
Verification from test evidence
rqtk scanfindsverifieslinks in source: Rust#[verifies("…")], Python@verifies("…"), and a// rqtk: verifies …comment tag for any language.rqtk verify --results junit.xmlrecords test outcomes per activity in.rqtk/evidence.toml, against the requirement’s content hash.--checkfails when the committed evidence is out of date.- Coverage adds Suspect (tests passed for an earlier version of the requirement) and
Failed. The hand-written
statusof a test-linked activity is ignored (lint RQ029). #[verifies]rebuilds the annotated test when its requirement file changes.- Rust projects need just one crate:
rqtkwith itsmacrosfeature provides#[rqtk::verifies("…")](also asrqtk::macros), without pulling in the CLI’s dependencies.
For coding agents
- Global
--jsonon every command; fixed exit codes (0 ok, 1 findings, 2 usage, 3 error);--dry-runon every command that writes; no interactive prompts. rqtk context <ID>(briefing for one item),rqtk impact <rev>(what a change touches and what to re-verify),rqtk schema <kind>,rqtk explain <code>.- Agent skills (
rqtk-requirements,rqtk-verification,/to-requirements,/requirements-review), installed withrqtk skills installorrqtk init --agentsinto.agents/skillswith links for Claude Code; also available as a Claude Code plugin.
Distribution
- Prebuilt binaries for macOS, Linux and Windows with shell and PowerShell installers
(
curl -LsSf https://rqtk.dev/install.sh | sh), built by cargo-dist on each release tag. - Documentation at rqtk.dev, with
llms.txtand a Markdown copy of every page for agents.
File format (schema_version 1)
- Flat files:
statement = "…"and status fields at the top level, links in[trace]. - Unknown fields are errors; every broken file is reported in one run with its line (RQ100–RQ102); duplicate IDs and file-name mismatches are caught.
- Native TOML dates are accepted.
rehashandbaselinepreserve comments and layout.- Content hashes are versioned (
v1:) and no longer collide across field boundaries.
Lint
- New rules RQ024–RQ030;
RQ017names every requirement in a cycle and ignores symmetric links;RQ011checks all statements with whole-word matching; STK001 became RQ023.
Removed
- C++ bindings (
rqtk-cpp,codegen-cpp-verifies), GraphML output, the Typst/PDF report (rqtk reportnow writes Markdown), interactive prompts, and the unused[change_control]and[export]configuration sections.
[0.1.0] — 2026-09-23
Pre-release of the same code as 1.0.0, published to exercise the release pipeline: GitHub
Release with installers, crates.io, and rqtk.dev. The library crates (rqtk-core,
rqtk-export, rqtk-report, rqtk-macros) remain at 0.1.0.