diff --git a/docs/specs/voice-treatment-entry/progress.md b/docs/specs/voice-treatment-entry/progress.md index c034c8f..4a9f13f 100644 --- a/docs/specs/voice-treatment-entry/progress.md +++ b/docs/specs/voice-treatment-entry/progress.md @@ -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. - 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. + +--- + +## 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.