Skip to content

Baselines and change control

TL;DR

status identifies frozen document items; check guards changes to them. A baseline is a configured tag reachable from HEAD. Changing or retiring a frozen item needs a fresh accepted change request listing its ID. Git and request evidence limits remain visible.

Selecting a baseline

The configured tag pattern, subject and covers types define a scope. The latest reachable commit governs, by ancestry rather than tag number or date. Overlapping scopes produce one comparison per item. Tags at the same commit are equivalent; their names and annotation metadata are retained. Incomparable governing commits cause exit 2: establish an approved baseline after the merge. A feature branch cannot see a tag outside its ancestry.

Annotated tags supply a tagger and date. Lightweight tags still govern but are labelled weaker evidence. Detached HEAD, linked worktrees and trace roots inside a larger repository work.

schema: the project's, as a verified copy under [schema] — plus this repo's qmstrace.toml
scanned (working tree, not pinned):
  requirement       3 items in  1 file   docs/req/*-srs.md
  design_element    2 items in  1 file   docs/design/*.md
  component         2 items in  2 files  src/**/*.py · 1 file ignored by **/__init__.py
  automated_test    4 items in  2 files  tests/**/test_*.py · test functions: a parametrised function is one automated test
links: 14
external AGR-*: verified against ../ledger/agreement.md (3 declared)
sibling client: 1 requirement — read from ../client's working tree, not pinned; cite its items by ID
baseline requirements (service): baseline/service/requirements/1 @ f5cb96739aa2
  baseline/service/requirements/1: annotated; tagger Fixture; date 2026-01-01T00:00:00+00:00
controlled document items: 3 frozen · 0 changed · 0 new · 0 removed · 0 withdrawn
baselines: judged from reachable local tags — remote-tag completeness NOT VERIFIED; qmstrace never fetches
baseline baseline/service/requirements/1: historical external/sibling citations NOT VERIFIED — snapshot traversal stops at this repo's edge
change requests: ../ledger/change-requests (0 readable; 0 malformed) — current working tree, not pinned

  REQ-SVC-01 [frozen; baseline/service/requirements/1]  security         origin AGR-1         design elements 1  automated tests 1 (unit 1)         — A call carries a key
  REQ-SVC-02 [frozen; baseline/service/requirements/1]  reliability      origin AGR-2, AGR-3  design elements 1  automated tests 2 (integration 2)  — Records survive a restart

verified by inspection — no recorded basis yet, listed apart:
  REQ-SVC-03 [frozen; baseline/service/requirements/1]  maintainability  origin AGR-3         design elements 0  automated tests 0                  — The record format is written down

categories with no requirement here: functional-suitability, performance-efficiency, compatibility, usability, portability, design-constraint, legal-regulatory
  (a prompt, not a gap — not every product needs one under every category)

suspects: 0 — informational; this repo only

0 violations · 1 gap (G01 ×1) — qmstrace check lists them

Counts concern controlled document items. Changed and removed are subsets of frozen; new items are outside that frozen population. Withdrawn counts current items with that status. Path-derived modules and tests are scanned but the document guard does not require item-level change citations on them; code changes follow the project's commit or pull-request convention.

Historical configuration

Each tagged tree supplies its own qmstrace.toml, extraction patterns and schema. A tag from before trace configuration freezes nothing. An existing malformed configuration cannot be treated as pre-trace history. Historical identities survive later pattern and type changes.

The schema must be embedded or stored in the same tagged Git tree. A historical path such as ../ledger/qmstrace.schema.toml cannot be resolved from today's ledger: that would substitute unverified rules for historical evidence. Such a baseline causes exit 2.

For future baselines, give the product repo the project's schema before the tag is cut: run qmstrace ledger copy-schema in the ledger and commit the copy — see share the project's schema. Existing tags are not rewritten automatically. A project adopting this arrangement establishes its next approved baseline under its normal review process; the tool does not retroactively certify older changes.

Offline evidence

No command fetches tags or missing objects. Shallow history, unavailable required objects and explicit tag-exclusion settings prevent judgment when baselines are configured. An ordinary full local repository is judged against its reachable local tags. Remote-tag completeness is not verified, even when some local baselines are present. The project's checkout process must obtain the intended history and tags before running the gate.

qmstrace: Baselines cannot be judged in a shallow repository. Fix: obtain full history and tags, then run again; qmstrace never fetches.

Citations and request metadata

Change: CR-001, CR-002 is a comma-separated list. A citation is fresh only when absent from the governing snapshot. Adding a citation alone does not change the item's digest. Rewording, changing a link or changing status does; whitespace-only rewrapping does not.

Request files live in the configured directory, with the ID as filename (CR-001.md). Their metadata preamble carries State and Impacts; the accepted value is matched exactly. Impacts is a comma-separated list of authored or path-derived IDs. Fenced examples and fields inside prose sections grant no approval. Duplicate or malformed metadata is a violation.

Situation Finding
Controlled item changed or added without a fresh citation V10
Fresh citation names a missing, malformed or unaccepted request V11
Accepted request does not list the item in Impacts V12
Frozen heading disappears V13

Every fresh citation offered for a change is checked. A missing request in a readable register fails; an unavailable register permits fresh citations with a NOT VERIFIED notice, retained in quiet output and the result line. Malformed files never receive that permissive fallback. Request files are read from the current working tree, not a verified ledger pin.

baseline requirements (service): baseline/service/requirements/1 @ f5cb96739aa2
  baseline/service/requirements/1: annotated; tagger Fixture; date 2026-01-01T00:00:00+00:00
controlled document items: 3 frozen · 1 changed · 0 new · 0 removed · 0 withdrawn
baselines: judged from reachable local tags — remote-tag completeness NOT VERIFIED; qmstrace never fetches
baseline baseline/service/requirements/1: historical external/sibling citations NOT VERIFIED — snapshot traversal stops at this repo's edge
change requests: NOT VERIFIED — ../ledger/change-requests is unavailable; fresh citations are verified at the ledger's import
G01  docs/req/service-srs.md:29  REQ-SVC-03: no design element satisfies it yet. Fix: on the design element, write `Satisfies: REQ-SVC-03` under its heading — only if it is true: the link states that the design element satisfies REQ-SVC-03.
S01  docs/design/service-design.md:8  DSN-SVC-01 — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 1, current distance 1; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  tests/unit/test_keys.py:6  tests/unit/test_keys.py::test_a_call_without_a_valid_key_is_refused — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 1, current distance 1; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  docs/design/service-design.md:13  DSN-SVC-02 — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 2, current distance 2; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  src/service/keys.py:1  src/service/keys.py — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 2, current distance 2; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  tests/unit/test_keys.py:12  tests/unit/test_keys.py::TestTheKeyCheck::test_it_runs_before_any_handler — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 2, current distance 2; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  src/service/store.py:1  src/service/store.py — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 3, current distance 3; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
S01  tests/integration/test_store.py:5  tests/integration/test_store.py::test_a_record_survives_a_restart — REQ-SVC-01 (changed) since baseline/service/requirements/1: both versions: baseline distance 3, current distance 3; unchanged — needs review. Review: check this item against the upstream change and test evidence; editing or passing tests does not record review.
result: 0 violations, 1 gap in 11 items · 7 suspects (informational) · exit 0 · authoring: gaps do not fail — the gate is qmstrace check --strict · controlled document items: 3 frozen · 1 changed · 0 new · 0 removed · 0 withdrawn · remote-tag completeness NOT VERIFIED · change requests NOT VERIFIED

Withdrawal

Retain the heading and write Status: withdrawn, with a fresh accepted citation when frozen. Withdrawal and reactivation are text changes. A withdrawn item raises no coverage gaps of its own, and links with a withdrawn endpoint cannot satisfy active items' coverage rules. Its identity, links, validation findings, traversal and test-result evidence remain visible. Withdrawal does not turn a test result into approval. No special coverage exemption is inferred from another status value.

See Downstream suspects for the review list. A passing change guard establishes neither that downstream work was reviewed nor that an unverified request was accepted.