Around the repo¶
TL;DR
A product repo is rarely alone. Its items trace back to an agreement kept in the project's
ledger repo, and it may cite items of the project's other repos — its siblings — or
of the ledger itself, when the ledger holds the requirements and the design. qmstrace reads
them from beside the repo when they are there, and says not pinned. When it cannot — as in
a pipeline, which checks out one repo — it says not verified here, and fails nothing for
it. In the ledger, qmstrace ledger check judges every repo together.
Three kinds of repository¶
flowchart LR
subgraph ledger["ledger repo — the project"]
docs["agreement · change requests · trace schema<br/>requirements · design"]
end
subgraph product["product repos — daily work"]
svc["service<br/>code · tests"]
clt["client<br/>code · tests"]
end
svc -- "cites by ID" --> docs
clt -- "cites by ID" --> docs
- A product repo holds a product's code and tests, with markers in them. It outlives any one project.
- The ledger repo holds one project: its agreement, its change requests, its trace schema — the rules every repo of the project follows — and, in this layout, the project's requirements and design, which are reviewed and released together.
- qmstrace is installed into them. It holds no project data of its own.
The requirements and the design can also stay in the product repos, beside the code — the
older layout, where the ledger holds only the agreement, the change requests and the schema.
qmstrace judges either way. The ledger lists every repo to read under [repos], and itself as
"." when it holds documents.
An item has one home: the repo that declares it. Another repo of the project cites it by ID, exactly like one of its own items, and never declares it again.
Not pinned¶
In a product repo, qmstrace reads the ledger and the siblings from the folders beside it — from their working trees, as they are right now, with whatever is uncommitted there. That is enough while you work, and it is said on every run: read from ../client's working tree, not pinned.
The project as a whole is judged in the ledger repo. qmstrace ledger check reads every repo's
working tree together — coverage met in any repo, suspects across repos — and says not
pinned, like everything else here (check the whole project).
Later, the ledger's import will read each repo at a pin — one commit, named on purpose — and
decide every citation across repos for good.
Not verified here¶
A pipeline checks out one repo. The ledger and the siblings are not there, so what the repo cites from them cannot be looked up:
schema: the project's, as a verified copy under [schema] — plus this repo's qmstrace.toml
scanned (working tree, not pinned):
requirement 1 item in 1 file docs/req/*-srs.md
design_element known to the project, not scanned here
component 1 item in 1 file src/**/*.py
automated_test 2 items in 1 file tests/**/test_*.py · test functions: a parametrised function is one automated test
links: 3
external AGR-*: NOT VERIFIED — ../ledger/agreement.md is not reachable; each cited AGR-N is judged at the ledger's import
sibling service: NOT REACHABLE at ../service
not verified here: 1 citation of another repo's items (REQ-SVC-01) — judged at the ledger's import
controlled document items: 0 frozen · 0 changed · 0 new · 0 removed · 0 withdrawn
baselines: judged from reachable local tags — remote-tag completeness NOT VERIFIED; qmstrace never fetches
baselines: no matching reachable local tag — nothing frozen locally
change requests: NOT VERIFIED — ../ledger/change-requests is unavailable; fresh citations are verified at the ledger's import
REQ-CLT-01 security origin AGR-1 design elements 0 automated tests 1 (unit 1) — The client sends its key on every call
categories with no requirement here: functional-suitability, performance-efficiency, compatibility, usability, reliability, maintainability, 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 · 2 gaps (G01 ×1, G06 ×1) — qmstrace check lists them
| What could not be read | What status says |
What fails |
|---|---|---|
| the agreement | external AGR-*: NOT VERIFIED |
nothing — each cited clause is judged at the ledger's import |
| a sibling | sibling …: NOT REACHABLE and not verified here: … |
nothing — unless the ID matches this repo's own pattern |
the ledger's location (no ledger key) |
NOT VERIFIED, siblings: NOT LOCATED |
nothing |
| the trace schema, read by path | the run cannot judge — exit 2 |
the run — which is why a repo judged alone carries a copy |
Why not fail? Failing would force every product repo's pipeline to check out the ledger and
every sibling, only to judge them against a colleague's uncommitted work. The ledger judges them
all together: qmstrace ledger check over working trees now, the import at pins later.
Why an own ID still fails. A cited ID that matches this repo's own pattern — REQ-CLT-07,
say, in the client — gets no such benefit: this repo was read, so the ID is known not to
exist, and the run reports V03.
A pipeline has no ledger to read the schema from, so a product repo carries a generated,
verified copy of it — written in the ledger by qmstrace ledger copy-schema and committed in
the repo. Its digest is checked on every run; only the rules travel, and everything else the
ledger holds stays not verified until the ledger's import. See
share the project's schema.