Reference
Every defect a run catches is one row in defects/<YYYY-MM>.jsonl at the store’s root. A row is written the moment the defect is found and never edited. Tandem: Show Defects renders the month as a table with the fate of every row. Thinkube Tandem says why the rows are kept.
The file
One file per month, shared by every space. Each row names the space it came from. A run adds a row when it catches one of these: a worker writing outside its declared files, a check that never passes, a check that could not run at all, a question the run had to answer for a worker, a deferral found in the delivered code, or a finding carried to the report.
A row
| Field | Holds |
|---|---|
|
When the row was written, and the Tandem version that wrote it. |
|
Where it happened: the thinking space (the page where you write your sentences and follow their work), the signed work ( |
|
The classification; the values are listed under The axes. |
|
The evidence, in the words of whatever caught it, cut at 1,200 characters. |
|
Related identifiers: a commit, a check, a file. |
The axes
| ODC attribute | Field in a row | What it holds in Tandem |
|---|---|---|
Activity |
|
What the run was doing when the defect surfaced: |
Trigger |
|
What surfaced it: |
Defect type |
|
Whose fault it was, as the judge saw it: |
Qualifier |
|
|
Stage |
|
Where in the pipeline it belongs: |
Impact |
|
The cost, as one sentence the catching site chose: |
Fate |
computed when read |
|
The idea is IBM’s Orthogonal Defect Classification: every defect is classified in a few seconds along attributes that do not depend on each other, and the distribution of a few hundred rows says where the method leaks. Tandem adds the fate, and the tool’s own defects.
The fate of a row
A row says what surfaced, not what became of it. When a run ends it writes how it ended, and how each piece of work ended, beside the ledger under the run’s id. Reading a row’s fate then follows from the rows themselves:
-
an impact that says it was repaired, such as the author repaired its own work or closed what no other actor could, reads healed;
-
an impact that says nobody could, such as the closer could not finish it either, reads reached the person;
-
otherwise the ending of the piece of work it was found in answers, and where there is none, the run’s own ending;
-
a run whose ending was never written reads not known.
Tandem: Show Defects prints the fate beside every row and totals the month: N found · N healed by the run · N reached the person · N not known.
The tool’s own defects
A run cannot catch a defect in the machinery that runs it, so a repair to Tandem itself is recorded from the commit that made it. A line in the commit message names what was wrong:
Defect: the platform's verdict was compared in one case, so a pipeline
that passed was read as a failure
Every deploy, and every start of the extension, reads the Defect: lines it has not read yet. It writes one row per repair: activity: tool development, trigger: self-repair, type: machine, with the commit in refs. A commit without that line records nothing.
Tandem’s own failures are typed machine wherever they are caught: a check that could not be graded, a stall, a crash, a lock nobody released.