# Claims review — 0.2.40

- base: v0.2.39
- head: 0c2239c
- surface: sha256:976a388eaaa1069876dcc0aaeb2f626abfe3fd731a69c4dc51cbe06c8a02d57d
- verdict: pass
- reviewer: maintainer, reading the exit-code table against a behaviour change it
  is describing for the first time

The surface change is two rows of one table. The finding below is about what the
old row said rather than what the new one does, and it is the reason the code
moved.

## Findings

### 1. docs/RECEIPT-SPEC.md — exit 14's row described a skip and let a verdict follow it

- Claim: "`anchor:null` receipts are skipped (periodic anchoring)."
- Mechanism: `conarium-verify --anchor-check` skips each receipt whose `anchor`
  is null rather than failing it, and prints `0/N anchored` in its summary.
- Why it falls short: the sentence is true of each receipt and silent about the
  run. Skipping every receipt in a chain leaves nothing compared, and the tool
  then exited 0 — which a caller reads as "the anchors hold". The claim describes
  a per-receipt policy; the exit code asserted a per-chain result that no
  comparison supported. Two tests had written the old answer down
  (`test/anchor_verify.mjs` A6.5 and `src/receipt.test.ts` T5.8), so this was a
  decision rather than an oversight, and it had to be argued rather than
  corrected on sight.
- Disposition: behaviour changed in 0c2239c. A chain under `--anchor-check` where
  no receipt carries an anchor is exit **15** — the value that already means
  "could not be checked". Both rows now say what they cover: 14 keeps the
  per-receipt skip and the `--require-head-anchor` failure, 15 gains the
  nothing-reached case. The expectations were corrected along with the code, and
  the direction of that correction is recorded in both tests rather than left to
  the next reader to reconstruct.

### 2. The summary line was never silent, and the report of this said less than it should

- Claim: the description of this defect, as first written and sent to the SCITT
  list, said the tool "reports success, having compared nothing".
- Mechanism: the run prints `0/N anchored, head anchored: no` on every
  `--anchor-check` invocation, before this change and after it.
- Why it falls short: the statement is accurate about the exit code and
  incomplete about the output. A reader watching the terminal could always see
  that nothing was anchored. What could not see it was anything consuming the
  exit code, which is the interface that matters for a checker.
- Disposition: recorded here rather than corrected in flight. The spec, the
  changelog and both tests now state the distinction explicitly — the count was
  always printed, the exit code was the part that claimed more than had been
  examined.

## Limits recorded rather than left to be found

- **This is a breaking change for one caller shape.** Anyone running
  `--anchor-check` over chains that are never anchored, and treating 0 as
  success, now gets 15. That is the intent, and it is stated in the changelog
  under its own heading rather than buried in a list.
- A chain with at least one anchored receipt is unaffected. A run without
  `--anchor-check` is unaffected. Both have a control test, because a fix that
  quietly widened its blast radius would be the same class of defect it was
  written to close.
- The locale word list grew for the second time by being wrong: four identifiers
  in the shipped verifier (`modelBildirilmemis`, `clientBildirilmemis`, `notlar`,
  `ek`) carried no Turkish-specific letter and were not in the list either. They
  are translated and the words added. The list remains a list of what this
  codebase reached for, not a language detector, and the next miss is expected to
  arrive the same way.
- Turkish design history under `docs/` still ships in the package. Unchanged from
  0.2.39, still counted on every green run of `test/pack_locale.mjs`, still a
  packaging decision that has not been made.
