You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
svelte-kit-vice/audit/components/date-picker.md

11 KiB

Audit: date-picker

audit-version: 1 audited-at: 2026-06-26 scope: (SCOPE-DRIFT → SYS-1) method: adversarially-verified workflow (analyze → refute); HIGH/CRITICAL personally re-verified by the lead. Batch-3 ground-truth: each picker fires trigger(close) (close NOT inert), but open/commit-reset ARE inert; calendar/range-calendar are MID-REFACTOR (uncommitted view-switch work). provider: src/uix/soma/components/date-picker/date-picker-provider.svelte.ts

Summary

Counts (post-verification): CRITICAL 0 · HIGH 0 · MEDIUM 4 · LOW 0. systemic hits: SYS-1 (scope-drift: morfo scope ['soma', 'sema'] but eidos dir exists). composition (A27): COMPOSES: DatePicker correctly composes via shared writableActive refs. date-picker.svelte creates sharedOpen, sharedValue, sharedPlaceholder, and passes them to PopoverProvider.create() and DateFieldProvider.create() (lines 167-194). Trigger wraps PopoverTriggerProvider. Calendar wraps CalendarProvider with filtered isDateDisabled to enforce readonlySegments coherence. No re-implementation detected; all composed parts (Popover, DateField, Calendar) are referenced via shared refs or forwarded exports.", ["data-kind is stamped on the Provider element (line 197) to drive visual view switching; this is morfo-declared and visually clean. CSS uses cascading :has() selectors (line 138-145) for responsive popover width overrides when hosting calendar/grid, avoiding hardcoded breakpoints.", "Disabled state uses opacity var(--date-field-disabled-opacity) (line 103), consistent with field theming. Role/aria attrs are delegated to composed Calendar part (dialog role, aria-label) and not duplicated in Provider.", "No bare literals for spacing, sizing, z-index, or opacity; all theme tokens properly referenced."]

Findings

MEDIUM: SYS-1 scope-drift: an eidos recipe dir exists but morfo 'scope' omits 'eidos' — date-picker-001

  • dimension: A: Contract (morfo)
  • rule: SYS-1 scope-drift: an eidos recipe dir exists but morfo 'scope' omits 'eidos'
  • location: src/uix/morfo/components/date-picker.ts:13
  • evidence: scope: ['soma', 'sema'], but src/uix/eidos/components/date-picker/ directory exists with date-picker.css, *.svelte files, and types.ts
  • impact: Morfo contract mismatches the actual layer composition. Eidos recipes exist but scope doesn't declare them, risking validator confusion and runtime assumptions about which layers are active.
  • proposed-fix: Change morfo scope to ['soma', 'sema', 'eidos'] to match the actual directory structure and eidos recipe presence.
  • verify: [confirmed] Confirmed as SYS-1 scope-drift. date-picker.ts:13 reads scope: ['soma', 'sema'], yet src/uix/eidos/components/date-picker/ exists with date-picker.css (6115 bytes), date-picker.svelte, types.ts, and several *.svelte wrappers. This is systemic across the whole picker family: color-picker, date-range-picker, time-picker, time-range-picker, calendar all read scope: ['soma', 'sema'] while their eidos dirs exist; only range-calendar declares eidos. MEDIUM is the correct severity per the SYS-1 baseline — it is a contract/metadata mismatch, not a runtime defect (createAttrs/morfo are unaffected since the morfo is as const satisfies Morfo at line 230).
  • fix-status: open

MEDIUM: INERT EVENTS: morfo declares 'open' event but provider never fires it via runtime.trigger( — date-picker-002

  • dimension: A: Contract (morfo), B: Behavior (soma)
  • rule: INERT EVENTS: morfo declares 'open' event but provider never fires it via runtime.trigger()
  • location: src/uix/morfo/components/date-picker.ts:22-40 (event declaration) vs src/uix/soma/components/date-picker/date-picker-provider.svelte.ts (no 'open' trigger)
  • evidence: Morfo declares: {name: 'open', semantic: {family: 'emerge', verb: 'open', target: v.partRef('calendar'), sequence: 'pre', ...}}. Provider only fires 'close' via triggerClose() at lines 222, 232, 268; no runtime.trigger('open', ...) call exists.
  • impact: The 'open' event exists only to satisfy schema validation. Consumers cannot listen to it because the provider never emits it. This is inconsistent with the morfo contract which signals the event should fire.
  • proposed-fix: Either (a) fire runtime.trigger('open', ...) when the popover opens (handleDateSelect path or in a watch on opts.open), or (b) remove the 'open' event declaration from morfo if it is not needed per the design.
  • verify: [confirmed] Confirmed but DOWNGRADE-CAPPED to MEDIUM (it was already MEDIUM). The open event (morfo lines 23-41) is genuinely inert: grep for runtime.trigger in the provider returns ONLY line 268 runtime.trigger('close', ...) (fired from triggerClose at 210/222/232). There is no runtime.trigger('open', ...) anywhere. NOTE the candidate's evidence is partly stale — it claimed line numbers 222/232/268 fire 'close', which is correct, and it correctly identified open as never fired. The morfo's own comment (lines 42-49) explicitly anticipates this: 'Today's date-picker provider just toggles opts.open; if it ever explicitly calls runtime.trigger(close...)'. Matches the documented picker-family inert-events pattern. MEDIUM is the ceiling per baseline.
  • fix-status: open

MEDIUM: Test coverage is jsdom-only and does not exercise high-risk paths: keyboard navigation, fo — date-picker-003

  • dimension: F: Tests
  • rule: Test coverage is jsdom-only and does not exercise high-risk paths: keyboard navigation, focus management, modal vs inline mode dismissal, date validation, cancel/commit/clear actions.
  • location: src/uix/soma/components/date-picker/date-picker-provider.svelte.test.ts:1 (@vitest-environment jsdom) and lines 111-174
  • evidence: Tests are marked jsdom-only (@vitest-environment jsdom). The test suite only covers: (1) part registration, (2) state flags, (3) closeOnDateSelect flag. Missing: keyboard Escape/Tab/Enter/Space, grid navigation (arrow keys), focus trap, modal mode behavior, cancel() reverting value, commit() triggering close event, clear() resetting to undefined, two-moments sequence (data-last-action before data-state).
  • impact: Risk of undiscovered bugs in interactions-heavy paths (dismissal, modal locking, date-specific validation edge cases) that jsdom doesn't simulate. Keyboard routes in calendar grids, focus roving, and dismissal semantics are untested.
  • proposed-fix: Add browser-level (Playwright/client) tests covering: (a) Escape closes popover + triggers 'close' event, (b) Tab focus-traps in modal mode, (c) modal mode prevents outside-click dismissal, (d) cancel() reverts value to snapshot, (e) commit() and clear() fire correct close cause, (f) data-last-action writes before data-state flips.
  • verify: [confirmed] Confirmed as SYS-3 jsdom-only / kbd-untested. Test file line 1 is // @vitest-environment jsdom. The suite (lines 111-174) has exactly 3 it() blocks: provider part registration, root state flags, and the closeOnDateSelect toggle via handleDateSelect. No coverage of: Escape/Tab/Enter/Space keyboard, calendar grid arrow navigation, focus trap (morfo declares focus.trap:true, focus.return:'trigger'), cancel() value revert, commit()/clear() close-cause, or the two-moments data-last-action-before-data-state ordering in triggerClose (266-268). These are the high-risk interaction paths. MEDIUM is correct (not HIGH) — it is a missing-coverage observation on interaction-heavy paths, consistent with the SYS-3 baseline severity.
  • fix-status: open

MEDIUM: INERT EVENTS: morfo declares 'commit-reset' event but provider never fires it via runtime. — date-picker-N01

  • dimension: A: Contract (morfo), B: Behavior (soma)
  • rule: INERT EVENTS: morfo declares 'commit-reset' event but provider never fires it via runtime.trigger()
  • location: src/uix/morfo/components/date-picker.ts:66-76 (commit-reset declaration) vs src/uix/soma/components/date-picker/date-picker-provider.svelte.ts:240-242 (clear())
  • evidence: Morfo declares a third event { name: 'commit-reset', semantic: { family: 'commit', verb: 'reset', target: v.partRef('calendar'), sequence: 'post', intent: 'neutral' } } whose intent (per its comment line 67) is 'User cleared the date (explicit clear button or backspace).' The provider's clear() method does exactly that — this.opts.value.current = undefined; — but does NOT call runtime.trigger('commit-reset', ...). Grep of the provider for runtime.trigger returns only the 'close' call at line 268. So commit-reset is a second inert event the candidate auditor missed (it only flagged 'open').
  • impact: A 'commit' family event with a real perceptual intent (clearing the value) never reaches the sema engine — clearing the date is perceptually silent even though the morfo says it should emit. Consumers wiring telemetry/sound to commit-reset receive nothing. Same INERT-EVENT category as the 'open' finding; MEDIUM ceiling per the picker-family baseline.
  • repro: Open date-picker, select a date, press the Clear footer action: opts.value resets to undefined but no commit-reset signal is emitted to sema.
  • proposed-fix: In clear() fire runtime.trigger('commit-reset', { fallbackTarget: this.runtime.partRef('calendar') ?? undefined }) after setting value undefined (sequence:'post' is already declared, so the state write precedes the emit), OR remove the commit-reset event from the morfo if a silent clear is intended.
  • verify: [verifier-added] added by adversarial verify pass
  • fix-status: open

No-findings dimensions

B: Behavior (soma) - keyboard/grid routes, C: DOM-selector (CSS.escape), D: Frontier (eidos<->soma cross-layer imports), E: TSC (eidos css), E-bis: Theming (roles/tokens), G: Redundancy (composition correctly avoids re-implementation)

Theming facts (E-bis)

  • magic z-index: none
  • magic literals: 'data-kind' | 'date-picker' | 'field-trigger'
  • undeclared parts: none
  • roles clean: true · variants clean: true
  • conformance: CLEAN: data-* attrs follow [data-{component}] and [data-{component}-{part}] naming; eidos recipe imports only composed component CSS (date-field, calendar, month-grid, year-grid), not isolated primitives; role attributes and aria-* attrs match morfo declarations in Provider/Trigger/Calendar parts; no double-write issues detected (syncAttrs not used); token references are canonical (--color-{role}-, --space-, --date-field-*)

Tests (F)

  • exists: true · env: jsdom
  • covers: provider part registration; state flags (data-state, data-disabled/readonly/required/invalid); closeOnDateSelect flag toggle
  • untested: keyboard routes (Escape, Tab, Enter, Space, arrow keys for grid nav); focus trap and focus restoration; modal mode (prevents outside-click, requires explicit commit/cancel); dismissal cause tracking (data-last-action write order); cancel() value revert snapshot; commit() and clear() event emission; date validation edge cases (minValue, maxValue, custom validate); two-moments: data-last-action write before data-state flip; locale/dir resolution; readonly segment filtering in calendar; readonly segment coherence with navigation

Powered by TurnKey Linux.