Skip to content

Burn down the frontend spec typecheck quarantine (40 files, ~391 errors — was 64/415) #1607

Description

@Chris0Jeky

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:

  1. Remove its line from tsconfig.vitest.json's exclude.
  2. cd frontend/taskdeck-web; npm run typecheck — read the errors for that file only.
  3. 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.
  4. 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

  • The exclude array in frontend/taskdeck-web/tsconfig.vitest.json contains no spec files.
  • npm run typecheck exits 0 with the list empty.
  • npx vitest --run --maxWorkers=2 still passes at the same counts — no test's assertions were
    weakened to make a type check happy.
  • No compiler option in tsconfig.vitest.json was loosened relative to tsconfig.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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority IIIValuable but unscheduled: residuals, tech-debt, performance, depth work.frontendPrimary implementation impact in Vue/TypeScript UI and client runtime.tech-debtDebt cleanup or deferred engineering quality work with limited product-surface change.testingTest coverage, harnesses, regression prevention, and verification pipeline work.

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions