Release Notes
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 andrqtk 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
runsrqtk 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, soit.each(…)gave its activity to an unrelated test. - JS/TS
.only,.skip,.concurrent,.each(…)anddescribegroups; Go methods; Python
async 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.
Install rqtk 1.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/wdoppenberg/rqtk/releases/download/v1.2.0/rqtk-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/wdoppenberg/rqtk/releases/download/v1.2.0/rqtk-installer.ps1 | iex"Download rqtk 1.2.0
| File | Platform | Checksum |
|---|---|---|
| rqtk-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| rqtk-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| rqtk-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| rqtk-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| rqtk-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |