docs: record the second refute round and the one open consequence

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-07 12:43:26 +08:00
parent f1a4594a0a
commit ebfc8af87c

View File

@@ -441,3 +441,50 @@ prettier-fixable) is untouched by this diff.
- Fix the two findings, then resume from Refute so both lenses grade the same diff. - Fix the two findings, then resume from Refute so both lenses grade the same diff.
- The Ship phase cannot pass in this repo until there is an MR template, or until the MR is - The Ship phase cannot pass in this repo until there is an MR template, or until the MR is
opened by hand. Opening one is gated regardless. opened by hand. Opening one is gated regardless.
---
## 2026-09-07 — Second refute round, both lenses, on the repaired diff
Ran both critics directly rather than resuming the workflow: a resume would have replayed the
`correctness` verdict from cache against a diff that had changed, and re-run the Ship phase that
cannot pass in this repo anyway.
**`correctness` refuted with 4 findings — all confirmed by hand, all fixed in `f1a4594`.**
Three were the same root cause: the region check never actually ran. Each wrote a job the manual
chart cannot produce, and each passed all 209 tests.
| Finding | Effect |
|---|---|
| The deferred region check had nothing to complete it | "پروتز متحرک برای دندون ۱۲" wrote a complete denture onto tooth 12 |
| `some` over a stack's regions | `['pfm_crown','night_guard_soft']` on tooth 12 wrote a night guard onto that tooth |
| `regions.size === 1` also deferred `implant` (root + crown, both tooth regions) | an implant aimed at a jaw resolved as a `UA` target |
| The `e271858` lock ticked the row and the payload but not the count | the sheet read "Apply 1 field" while two landed |
Fix: targets resolve **before** types, so the target kind narrows a category's candidates and an
impossible leaf is never offered. The deferral concept is gone. Region validation is now
`every`, and a category with no usable leaf drops the assignment's targets rather than leaving
them jobless. Four tests added.
**`regression-risk` refuted with 2 findings.**
1. Already fixed in `f1a4594` — the spec file's `filter(Boolean)` left two `tsc` errors. It added
a fact worth keeping: **`.gitea/workflows/*` run no test, lint or typecheck step at all.**
`nest build` excludes `**/*spec.ts` and ts-jest runs transpile-only under
`isolatedModules`, so nothing in this repo would ever have caught it. Repo-wide gap, not this
branch's.
2. **Open — needs a decision, not a fix.** See below.
### Open question: teeth are unreachable when the merged row is unticked
On a forced-prosthesis result `voiceRowAvailability` sets `teeth: false`, so no teeth row renders
and `selection.teeth` can never become true. Untick the merged prosthesis row (which releases the
decision-41 lock) and then untick the type row, and both write paths in `applyVoiceResult` are
skipped — the detail is appended with `teeth: []`. `master` kept the teeth here, because the rows
were separate.
This is decision 39 behaving exactly as approved: teeth and prosthesis apply together. But it
means a clinician who wants only the teeth from a prosthesis dictation, intending to pick
materials by hand, has no way to get them. Not a spec violation — an unstated consequence.
Deliberately not changed unilaterally.