What
#1468 put the frontend spec tree under vue-tsc behind a quarantining project
(frontend/taskdeck-web/tsconfig.vitest.json). 222 of 286 spec files are gated from now on; the 64
that carried pre-existing type errors are listed in that file's exclude array. This issue tracks
burning that list down to empty.
The list may only shrink. Delete an entry once its file compiles; never add one to turn a red
build green. A new spec file is checked by default, because it is not in the list — that property is
the whole point of the quarantine and must not be eroded.
Current baseline (measured 2026-08-23, on main a43df082c)
40 files remain quarantined, holding ~391 errors — down from the 64 / 415 this issue was filed
against. frontend/taskdeck-web/tsconfig.vitest.json carries exactly 40 entries in exclude, all
spec files; gated spec files went 220 → 244.
Shrink-only confirmed. Comparing the 2026-08-07 per-file table below against the live exclude
array: 24 entries cleared, zero added. The 24 that cleared are precisely the 24 one-error files,
exactly as the suggested order predicted:
components/AppShell.paperVariant · components/AppShell · components/BoardCanvas.coverage ·
components/BoardSettingsModal · components/inbox/inboxUtils · components/paper/useInkBleed ·
composables/useEscapeToClose · composables/useShortcutContext · composables/useVirtualList ·
store/auditStore · store/board/boardStoreHelpers · store/captureStore.integration ·
store/savedViewStore · views/ActivityView · views/AutomationQueueView · views/BoardView ·
views/MetricsView.coverage · views/NotificationInboxView · views/ReviewView.coverage ·
views/ReviewView · views/paper/PaperBoardView · views/paper/inbox/PaperTriageTable ·
views/paper/review/PaperReviewView · views/paper/review/ReviewProvenance
Scope correction the body never absorbed (raised in the 2026-08-07 comment): emptying this
exclude array is not the same as "the frontend specs are type-checked". There is a second
unchecked spec tree — 18 frontend-root tests/ specs that no tsconfig includes at all. That tree
needs its own project, and it is out of scope for this issue's acceptance criteria as written.
Next chunks (per the 2026-08-12 note): the 7 heavy hitters, one PR each — starting with
ReviewKeymap.spec.ts (48), useStarterPackCatalog.spec.ts (42), useStarterPackImport.spec.ts (36).
Original measured baseline (2026-08-07, on 28b9fe8f) — superseded, kept for provenance
415 errors across 64 of 286 spec files. Reproduced exactly by the method recorded on #1468
(lifting only src/tests/** from tsconfig.app.json's exclude, repo types unchanged). Zero
errors outside src/tests/.
The distribution is far more favourable than the raw 415 suggests, which is why this is worth doing
incrementally rather than treating it as one grind:
- 7 files hold 227 errors (55%).
- 24 files have exactly one error each.
- 40 files have 4 or fewer.
Error classes
| Code |
Count |
What it is |
| TS2345 |
124 |
argument not assignable — mostly under-specified mock payloads |
| TS2322 |
104 |
type not assignable — fixture literals that are not valid domain objects |
| TS2339 |
39 |
property does not exist |
| TS2352 |
26 |
unsafe as conversion |
| TS2741 |
23 |
missing required property in a fixture |
| TS2353 |
18 |
unknown property in an object literal |
| TS2349 |
17 |
expression not callable |
| TS2304 |
17 |
cannot find name |
| TS2739 |
14 |
missing multiple required properties |
| TS2591 |
13 |
process without node types |
| TS6133 |
4 |
declared but never read |
| TS2593 |
3 |
test-runner globals without vitest/globals |
| TS7006 |
2 |
implicit any parameter |
| TS2578 |
2 |
unused @ts-expect-error |
Per-file counts — the 2026-08-07 quarantine list (historical)
Any file in this table that is not in the live exclude array has since cleared; see the 24
listed under "Current baseline" above. The error-class table and counts above are likewise the
2026-08-07 distribution.
| File |
Errors |
| src/tests/views/paper/review/ReviewKeymap.spec.ts |
48 |
| src/tests/composables/useStarterPackCatalog.spec.ts |
42 |
| src/tests/composables/useStarterPackImport.spec.ts |
36 |
| src/tests/composables/useReviewActions.spec.ts |
33 |
| src/tests/config/PaperBranding.spec.ts |
25 |
| src/tests/utils/scenarioSchema.spec.ts |
24 |
| src/tests/store/boardStore.spec.ts |
19 |
| src/tests/store/boardStore.columnReorder.spec.ts |
12 |
| src/tests/views/AutomationChatView.spec.ts |
9 |
| src/tests/store/board/cardFilterStore.spec.ts |
9 |
| src/tests/public/shareTargetHandler.spec.ts |
9 |
| src/tests/composables/useCaptureQueueSync.spec.ts |
9 |
| src/tests/utils/traceReplay.spec.ts |
8 |
| src/tests/components/BoardCanvas.spec.ts |
8 |
| src/tests/store/workspaceStore.spec.ts |
7 |
| src/tests/api/http.spec.ts |
7 |
| src/tests/store/queueStore.spec.ts |
6 |
| src/tests/store/queueStore.integration.spec.ts |
6 |
| src/tests/store/captureStore.spec.ts |
6 |
| src/tests/components/CaptureModal.spec.ts |
6 |
| src/tests/utils/chat.spec.ts |
5 |
| src/tests/views/ShareTargetView.spec.ts |
4 |
| src/tests/store/queueStore.polling.spec.ts |
4 |
| src/tests/composables/useVoiceCapture.spec.ts |
4 |
| src/tests/composables/useReviewProposals.spec.ts |
4 |
| src/tests/components/review/CohortDashboard.spec.ts |
4 |
| src/tests/components/LabelManagerModal.spec.ts |
4 |
| src/tests/components/CardItem.coverage.spec.ts |
4 |
| src/tests/components/BoardDialogHost.spec.ts |
4 |
| src/tests/theme/paperEmberContrast.spec.ts |
3 |
| src/tests/theme/authFocusRing.spec.ts |
3 |
| src/tests/store/agentStore.spec.ts |
3 |
| src/tests/views/InboxView.spec.ts |
2 |
| src/tests/store/boardStore.integration.spec.ts |
2 |
| src/tests/property/storeResilience.spec.ts |
2 |
| src/tests/composables/useStarterPackResult.spec.ts |
2 |
| src/tests/composables/useBoardRealtime.spec.ts |
2 |
| src/tests/composables/useAnalyticsScript.spec.ts |
2 |
| src/tests/components/FilterPanel.spec.ts |
2 |
| src/tests/components/CardModal.spec.ts |
2 |
| src/tests/views/paper/review/ReviewProvenance.spec.ts |
1 |
| src/tests/views/paper/review/PaperReviewView.spec.ts |
1 |
| src/tests/views/paper/inbox/PaperTriageTable.spec.ts |
1 |
| src/tests/views/paper/PaperBoardView.spec.ts |
1 |
| src/tests/views/ReviewView.spec.ts |
1 |
| src/tests/views/ReviewView.coverage.spec.ts |
1 |
| src/tests/views/NotificationInboxView.spec.ts |
1 |
| src/tests/views/MetricsView.coverage.spec.ts |
1 |
| src/tests/views/BoardView.spec.ts |
1 |
| src/tests/views/AutomationQueueView.spec.ts |
1 |
| src/tests/views/ActivityView.spec.ts |
1 |
| src/tests/store/savedViewStore.spec.ts |
1 |
| src/tests/store/captureStore.integration.spec.ts |
1 |
| src/tests/store/board/boardStoreHelpers.spec.ts |
1 |
| src/tests/store/auditStore.spec.ts |
1 |
| src/tests/composables/useVirtualList.spec.ts |
1 |
| src/tests/composables/useShortcutContext.spec.ts |
1 |
| src/tests/composables/useEscapeToClose.spec.ts |
1 |
| src/tests/components/paper/useInkBleed.spec.ts |
1 |
| src/tests/components/inbox/inboxUtils.spec.ts |
1 |
| src/tests/components/BoardSettingsModal.spec.ts |
1 |
| src/tests/components/BoardCanvas.coverage.spec.ts |
1 |
| src/tests/components/AppShell.spec.ts |
1 |
| src/tests/components/AppShell.paperVariant.spec.ts |
1 |
How to work it
Take a batch of files, not the whole list. Suggested order: the 24 one-error files first (cheap,
proves the workflow), then the 7 heavy hitters one PR at a time. (2026-08-23: the 24 one-error
files are done — the heavy hitters are what is left.)
Per file:
- Remove its line from
tsconfig.vitest.json's exclude.
cd frontend/taskdeck-web; npm run typecheck — read the errors for that file only.
- Fix them in the spec, not by loosening
tsconfig.vitest.json. Widening a compiler option to
clear a batch defeats the gate for all 286 files, not just the one being fixed.
npx vitest --run --maxWorkers=2 path/to/the.spec.ts — the runtime behaviour must not change.
A fixed-up fixture that silently changes what the test asserts is a regression, not a fix.
Constraints that are not negotiable, and why
- Do not add
"node" to tsconfig.vitest.json's types. It clears the 13 TS2591 and part of
the TS2304 count, and it breaks production source pulled in as a dependency — PaperHomeView.vue
starts failing because setTimeout returns NodeJS.Timeout instead of number. Measured, not
theorised. For process in a spec, narrow the fix to that spec.
- Do not add
"vitest/globals". 284 of 285 spec files import their vitest symbols explicitly;
the 3 TS2593 errors are one file that should be brought in line with the other 284 instead.
- Do not relax
noUnusedLocals / noUnusedParameters / erasableSyntaxOnly. They account for
6 errors total across the whole list. The value of tsconfig.vitest.json mirroring
tsconfig.app.json exactly is that there is one strictness bar to reason about.
Acceptance criteria
References
#1468 (the gate that created this list) · ADR-0049 · #1462 (the regression that exposed the gap)
· frontend/taskdeck-web/tsconfig.vitest.json
What
#1468put the frontend spec tree undervue-tscbehind a quarantining project(
frontend/taskdeck-web/tsconfig.vitest.json). 222 of 286 spec files are gated from now on; the 64that carried pre-existing type errors are listed in that file's
excludearray. This issue tracksburning that list down to empty.
The list may only shrink. Delete an entry once its file compiles; never add one to turn a red
build green. A new spec file is checked by default, because it is not in the list — that property is
the whole point of the quarantine and must not be eroded.
Current baseline (measured 2026-08-23, on
maina43df082c)40 files remain quarantined, holding ~391 errors — down from the 64 / 415 this issue was filed
against.
frontend/taskdeck-web/tsconfig.vitest.jsoncarries exactly 40 entries inexclude, allspec files; gated spec files went 220 → 244.
Shrink-only confirmed. Comparing the 2026-08-07 per-file table below against the live
excludearray: 24 entries cleared, zero added. The 24 that cleared are precisely the 24 one-error files,
exactly as the suggested order predicted:
components/AppShell.paperVariant·components/AppShell·components/BoardCanvas.coverage·components/BoardSettingsModal·components/inbox/inboxUtils·components/paper/useInkBleed·composables/useEscapeToClose·composables/useShortcutContext·composables/useVirtualList·store/auditStore·store/board/boardStoreHelpers·store/captureStore.integration·store/savedViewStore·views/ActivityView·views/AutomationQueueView·views/BoardView·views/MetricsView.coverage·views/NotificationInboxView·views/ReviewView.coverage·views/ReviewView·views/paper/PaperBoardView·views/paper/inbox/PaperTriageTable·views/paper/review/PaperReviewView·views/paper/review/ReviewProvenanceScope correction the body never absorbed (raised in the 2026-08-07 comment): emptying this
excludearray is not the same as "the frontend specs are type-checked". There is a secondunchecked spec tree — 18 frontend-root
tests/specs that no tsconfig includes at all. That treeneeds its own project, and it is out of scope for this issue's acceptance criteria as written.
Next chunks (per the 2026-08-12 note): the 7 heavy hitters, one PR each — starting with
ReviewKeymap.spec.ts(48),useStarterPackCatalog.spec.ts(42),useStarterPackImport.spec.ts(36).Original measured baseline (2026-08-07, on
28b9fe8f) — superseded, kept for provenance415 errors across 64 of 286 spec files. Reproduced exactly by the method recorded on
#1468(lifting only
src/tests/**fromtsconfig.app.json'sexclude, repotypesunchanged). Zeroerrors outside
src/tests/.The distribution is far more favourable than the raw 415 suggests, which is why this is worth doing
incrementally rather than treating it as one grind:
Error classes
asconversionprocesswithout node typesvitest/globalsanyparameter@ts-expect-errorPer-file counts — the 2026-08-07 quarantine list (historical)
Any file in this table that is not in the live
excludearray has since cleared; see the 24listed under "Current baseline" above. The error-class table and counts above are likewise the
2026-08-07 distribution.
How to work it
Take a batch of files, not the whole list. Suggested order: the 24 one-error files first (cheap,
proves the workflow), then the 7 heavy hitters one PR at a time. (2026-08-23: the 24 one-error
files are done — the heavy hitters are what is left.)
Per file:
tsconfig.vitest.json'sexclude.cd frontend/taskdeck-web; npm run typecheck— read the errors for that file only.tsconfig.vitest.json. Widening a compiler option toclear a batch defeats the gate for all 286 files, not just the one being fixed.
npx vitest --run --maxWorkers=2 path/to/the.spec.ts— the runtime behaviour must not change.A fixed-up fixture that silently changes what the test asserts is a regression, not a fix.
Constraints that are not negotiable, and why
"node"totsconfig.vitest.json'stypes. It clears the 13 TS2591 and part ofthe TS2304 count, and it breaks production source pulled in as a dependency —
PaperHomeView.vuestarts failing because
setTimeoutreturnsNodeJS.Timeoutinstead ofnumber. Measured, nottheorised. For
processin a spec, narrow the fix to that spec."vitest/globals". 284 of 285 spec files import their vitest symbols explicitly;the 3 TS2593 errors are one file that should be brought in line with the other 284 instead.
noUnusedLocals/noUnusedParameters/erasableSyntaxOnly. They account for6 errors total across the whole list. The value of
tsconfig.vitest.jsonmirroringtsconfig.app.jsonexactly is that there is one strictness bar to reason about.Acceptance criteria
excludearray infrontend/taskdeck-web/tsconfig.vitest.jsoncontains no spec files.npm run typecheckexits 0 with the list empty.npx vitest --run --maxWorkers=2still passes at the same counts — no test's assertions wereweakened to make a type check happy.
tsconfig.vitest.jsonwas loosened relative totsconfig.app.json.docs/TESTING_GUIDE.md's "Frontend spec type-checking" note is updated when the list empties.References
#1468(the gate that created this list) · ADR-0049 ·#1462(the regression that exposed the gap)·
frontend/taskdeck-web/tsconfig.vitest.json