Skip to content

qmstrace thread

TL;DR

qmstrace thread <ID> walks one item backward to what it derives from, and forward to what hangs off it — for a requirement, its design elements, code and tests; for a clause, every item here that derives from it. Each item appears once, nearest first. It stops at this repo's edge.

Synopsis

Usage: qmstrace thread [OPTIONS] {ID}

  Walk one item backward to what it derives from, and forward to what hangs off
  it.

  Each item is shown once, nearest first, under the link that reaches it first.
  It stops at this repo's edge.

Arguments:
  ID  A requirement, design element, test or clause ID.  [required]

Options:
  -C PATH  Run as if qmstrace had been started in PATH, as with git -C. Before
           or after the command.
  --help   Show this message and exit.

Any ID the run can see works: a requirement or a design element, a module's path, a test's ID (file::function, as pytest names it), a clause the agreement declares, or an item of a sibling repo. -C goes on either side of the command, as with status.

Output

A requirement — backward to its clause, forward to its design, code and tests:

REQ-SVC-01 — A call carries a key
  requirement · docs/req/service-srs.md:12

backward — what it derives from:
  Origin  AGR-1 · origin clause, in the agreement

forward — what hangs off it, nearest first:
  Satisfies   DSN-SVC-01 — Key check · design element · docs/design/service-design.md:8
    Implements  src/service/keys.py · component
    verifies    tests/unit/test_keys.py::TestTheKeyCheck::test_it_runs_before_any_handler · automated test, unit
    Assumes     DSN-SVC-02 — Record store · design element · docs/design/service-design.md:13 · assumes it — counts toward no coverage
      Implements  src/service/store.py · component
      verifies    tests/integration/test_store.py::test_a_record_survives_a_restart · automated test, integration
  verifies    tests/unit/test_keys.py::test_a_call_without_a_valid_key_is_refused · automated test, unit

forward: 2 design elements, 2 components, 3 automated tests · backward: 1 origin clause — this repo only

An automated test, walked back to the clauses it serves:

tests/integration/test_store.py::test_a_record_survives_a_restart
  automated test, integration

backward — what it derives from:
  verifies  DSN-SVC-02 — Record store · design element · docs/design/service-design.md:13
    Assumes   DSN-SVC-01 — Key check · design element · docs/design/service-design.md:8 · assumed — what it derives from is not followed
  verifies  REQ-SVC-02 — Records survive a restart · requirement · docs/req/service-srs.md:21 · also Satisfies from DSN-SVC-02
    Origin    AGR-2 · origin clause, in the agreement
    Origin    AGR-3 · origin clause, in the agreement

forward — what hangs off it, nearest first:
  nothing here hangs off it

forward: nothing · backward: 1 requirement, 2 design elements, 2 origin clauses — this repo only

A clause, and everything here that derives from it:

AGR-3
  origin clause, in the agreement

backward — what it derives from:
  declared in the agreement, outside any product repo

forward — what hangs off it, nearest first:
  Origin      REQ-SVC-02 — Records survive a restart · requirement · docs/req/service-srs.md:21
    Satisfies   DSN-SVC-02 — Record store · design element · docs/design/service-design.md:13
      Implements  src/service/store.py · component
    verifies    tests/integration/test_store.py::test_a_record_survives_a_restart · automated test, integration · also verifies DSN-SVC-02
    verifies    tests/integration/test_store.py::test_a_restart_loses_no_accepted_record · automated test, integration
  Origin      REQ-SVC-03 — The record format is written down · requirement · docs/req/service-srs.md:28

forward: 2 requirements, 1 design element, 1 component, 2 automated tests · backward: nothing — this repo only

A sibling's item — this repo's side of it only:

REQ-SVC-01 — A call carries a key
  requirement, in sibling service — not pinned · ../service/docs/req/service-srs.md:12

backward — what it derives from:
  declared in sibling service — what it derives from there is not shown

forward — what hangs off it, nearest first:
  verifies  tests/unit/test_api.py::test_the_service_refuses_a_call_without_a_key · automated test, unit

forward: 1 automated test · backward: nothing — this repo only

The same item in a pipeline, where the sibling and the ledger are not checked out:

REQ-SVC-01
  not verified here — judged at the ledger's import
  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

backward — what it derives from:
  not verified here — judged at the ledger's import

forward — what hangs off it, nearest first:
  verifies  tests/unit/test_api.py::test_the_service_refuses_a_call_without_a_key · automated test, unit

forward: 1 automated test · backward: nothing — this repo only

When an assumption and an ordinary ancestry path reach the same item backward, the ordinary path is used so its origins remain visible; the assumption is retained as also. To combine several starting items into a change-request candidate, use impact.

Reading a line

Part Example What it says
the marker Satisfies the link that reaches this item first; each step of indentation is one more link from the item you asked about
the item DSN-SVC-01 — Key check · design element · docs/design/…:8 its ID, title, type and where it is written; a sibling's item carries the sibling's path, and not pinned
also … also Satisfies from DSN-SVC-02 another link between this item and one already shown — the item is not repeated
assumes it — counts toward no coverage an Assumes link, followed forward: what the assuming item relies on changing can break it
assumed — what it derives from is not followed walking backward, an assumption ends the walk
the last line forward: 2 design elements, … — this repo only counts by type, in both directions

When the run could not read something — an external source, a sibling — or refused links as violations, the lines under the heading say so. An empty direction says nothing here hangs off it. Why each item appears once, and where the walk stops: The chain.

Exit code

0 — or 2 for an ID nothing here can see, with the closest IDs it can. In a pipeline, where a sibling could not be read, it says so instead of calling the ID missing. See Exit codes.