Skip to content

Track evidenced component-layer findings #49

Description

@chrhicks

Part of #47

Purpose

Keep one bounded inbox for observed React composition, shared UI, accessibility, styling, source-organization, and direct-test findings discovered during the #47 component-layer work.

This issue is not ready implementation work. An entry becomes work only after it moves into a separate accepted spec.

Admission rule

Add a finding only when all of these are present:

  • affected module or interface;
  • behavior or maintenance problem actually observed;
  • evidence from source, tests, browser behavior, or review;
  • reason the current focused task cannot address it without widening scope; and
  • likely owner or later decision point.

Do not add theoretical reuse, speculative cleanup, unused future variants, broad “could be cleaner” notes, or ideas without a present caller.

Finding format

### <short finding name>

- Status: unassigned | assigned to #N | resolved by #N | rejected | deferred
- Module or interface:
- Observed problem:
- Current user or maintainer effect:
- Evidence:
- Why current scope does not own it:
- Likely later seam:

Direct-test matrix

Track current evidence without creating an automatic test-backfill project.

Module or interaction Workspace evidence Browser evidence Direct evidence Next decision
Tabs Existing Library and Plan workspace tests #48/#50 keyboard and responsive browser review passed No focused direct test Decide evidence with #43 active-panel work
Dialog Existing Plan and workspace composition tests Workspace browser review passed; confirmation Dialog was not directly exercised No focused accessibility test Add focused evidence when Dialog interface is corrected
EvidenceViewport Existing Observe, Library, and Process workspace tests #48/#50 wide, compact, and phone fit review passed CSS-source assertion reaches through the interface Replace with rendered behavior when its interface is corrected

A later task that changes a listed module must decide what focused evidence the changed interface now needs. It does not need comprehensive direct tests when higher application seams prove the consequential behavior.

Findings

Application styles reach into private UI descendants

  • Status: unassigned
  • Module or interface: Local visual-module styling interface across Panel, Tabs, Field, EvidenceViewport, AttentionCard, StatusIndicator, DataList, Button, Stack, and StepRail
  • Observed problem: Application workspace styles target private .ui-* descendants to control internal layout and presentation.
  • Current user or maintainer effect: A private visual-module markup rename requires shotgun edits across workspace styles; product composition and visual-module implementation ownership are mixed.
  • Evidence: Independent issue Localize the shared UI modules in apps/web #48 Standards review identified selectors in workspace, Library, Plan, and Process styles that depend on private localized UI classes.
  • Why current scope does not own it: Localize the shared UI modules in apps/web #48 is a strict behavior-preserving package localization. Correcting the seam requires deliberate props, classes, slots, or CSS custom-property interfaces and separate visual proof.
  • Likely later seam: The post-Retire Nightbook workspace runtime naming #51 composition audit should inventory each selector and assign it to the visual module or application workflow before selecting a bounded correction.

Dialog callers can override owned accessibility mechanics

  • Status: unassigned
  • Module or interface: Dialog props
  • Observed problem: The Dialog interface accepts broad HTML attributes and spreads them after owned role, ARIA, focus, and keyboard props, allowing callers to replace mechanics the module claims to own.
  • Current user or maintainer effect: A future caller can weaken dialog semantics or focus trapping without changing the Dialog implementation.
  • Evidence: Independent issue Localize the shared UI modules in apps/web #48 Standards review of the localized Dialog interface and prop-spread order.
  • Why current scope does not own it: Narrowing the interface changes caller behavior and violates Localize the shared UI modules in apps/web #48 strict interface preservation.
  • Likely later seam: A focused Dialog interface correction with rendered keyboard, focus trap, Escape, close, and focus-restoration evidence.

Library test asserts private EvidenceViewport CSS structure

  • Status: unassigned
  • Module or interface: Library workspace evidence-fit verification
  • Observed problem: A Library test reads CSS source and asserts a private EvidenceViewport canvas selector rather than observing rendered fit behavior through the workspace interface.
  • Current user or maintainer effect: Internal class or stylesheet changes can break the test without changing user-visible behavior, while the real browser fit behavior remains weakly proven.
  • Evidence: Independent issue Localize the shared UI modules in apps/web #48 Standards review of the Library workspace test around its evidence-canvas CSS assertions.
  • Why current scope does not own it: Localize the shared UI modules in apps/web #48 keeps testing minimal and preserves existing behavior; replacing this proof needs a browser-capable rendered seam.
  • Likely later seam: Replace when Library detail or EvidenceViewport receives a selected Map the apps/web component layer #47 change; preserve wide, compact, and phone fit evidence.

Flyout automatic initial focus is not observed

  • Status: unassigned
  • Module or interface: Flyout open and focus behavior
  • Observed problem: The Flyout attempts automatic initial focus, but Designer browser evidence found focus remained on the trigger until Tab moved into the labelled dialog.
  • Current user or maintainer effect: Keyboard entry remains possible and Escape restores focus, but the implementation and observed focus policy disagree.
  • Evidence: Issue Localize the shared UI modules in apps/web #48 Designer review at wide and 390 px; Flyout opened, Tab entered Take control, Escape closed it, and focus returned to Control · view.
  • Why current scope does not own it: The behavior is accessible and unchanged by strict localization; changing focus policy requires a deliberate interface decision and focused browser evidence.
  • Likely later seam: Focused Flyout interface correction when shared shell or Overlay behavior is next selected.

Shared workspace stylesheet still owns Observe presentation styles

  • Status: unassigned
  • Module or interface: apps/web/src/components/workspaces/Workspace.css
  • Observed problem: The shared workspace stylesheet owns shell and simulation rules together with most Observe-specific layout and responsive rules.
  • Current user or maintainer effect: A focused Observe style change still requires editing a broad shared presentation file, so caller-job locality remains incomplete.
  • Evidence: Issue Retire Nightbook presentation naming #50 Standards review identified the mixed shell-*, simulation-*, workspace-*, and observe-* responsibilities after the strict source move.
  • Why current scope does not own it: Splitting interleaved base and responsive rules changes stylesheet ordering and requires focused visual proof beyond a strict naming and path move.
  • Likely later seam: The post-Retire Nightbook workspace runtime naming #51 React composition audit or the next accepted Observe presentation change.

Preserved runtime failure wording still names Nightbook

  • Status: unassigned
  • Module or interface: WorkspaceRemoteFailure default message
  • Observed problem: The behavior-preserving default failure text remains “The Nightbook workspace remote is unavailable.” and can reach an unavailable submission.
  • Current user or maintainer effect: A rare runtime failure can still show retired presentation wording even though active interface names are current.
  • Evidence: Issue Retire Nightbook workspace runtime naming #51 Spec review traced the default through apps/web/src/workspace-runtime.ts into submissions.
  • Why current scope does not own it: Issue Retire Nightbook workspace runtime naming #51 explicitly preserves exact behavior and excludes user-visible wording changes; changing the literal would violate that proof boundary.
  • Likely later seam: A focused unavailable-state wording correction after the naming sequence merges.

Library route interface permits correlated optional states

  • Status: unassigned
  • Module or interface: LibraryWorkspaceProps
  • Observed problem: Catalog, asset-detail, comparison, review, and Project-intake facts are delivered through correlated optional props that permit invalid combinations.
  • Current user or maintainer effect: App and tests must know absence and identity rules that the Library workspace interface does not express.
  • Evidence: The Map the apps/web component layer #47 composition audit mapped 16 public props and catalog/detail selection by absence checks in LibraryWorkspace.tsx.
  • Why current scope does not own it: Adapt WorkspaceRuntime into React through a purpose Hook #55 owns only the React adapter for the existing runtime; Library query, intake, comparison, and route lifetimes need a separate composition brief.
  • Likely later seam: A closed Library catalog/detail model and semantic actions after Adapt WorkspaceRuntime into React through a purpose Hook #55.

Process route interface permits conflicting route modes

  • Status: unassigned
  • Module or interface: ProcessWorkspaceProps
  • Observed problem: Project, source-intake, and Project-list modes are optional prop combinations; callers can supply conflicting identities or mismatched Project/evidence facts.
  • Current user or maintainer effect: The implementation must fail closed through internal identity checks, while callers and tests still learn private route-mode invariants.
  • Evidence: The Map the apps/web component layer #47 composition audit traced the nine-prop Process interface and current routed-identity guards in ProcessWorkspace.tsx.
  • Why current scope does not own it: Adapt WorkspaceRuntime into React through a purpose Hook #55 changes only runtime delivery into React and must not redesign workspace interfaces.
  • Likely later seam: An explicit list | source | project Process route model after Adapt WorkspaceRuntime into React through a purpose Hook #55.

Lazy route outlets have no failure or retry interface

  • Status: unassigned
  • Module or interface: App lazy workspace outlets
  • Observed problem: Each lazy workspace has an accessible loading fallback, but rejected chunk imports have no bounded route failure, retry, or route-change recovery interface.
  • Current user or maintainer effect: A chunk-load failure escapes the route outlet instead of presenting a workspace-level recovery path.
  • Evidence: The Map the apps/web component layer #47 composition audit found four lazy imports and four Suspense loading branches with no active error module.
  • Why current scope does not own it: Adapt WorkspaceRuntime into React through a purpose Hook #55 preserves loading and rendered behavior while moving only runtime lifecycle mechanics.
  • Likely later seam: The first accepted route-outlet or route-adapter child after Adapt WorkspaceRuntime into React through a purpose Hook #55.

Phone projection adapter is repeated across five modules

  • Status: unassigned
  • Module or interface: Plan, Observe, Library, Process, and development-simulation responsive adapters
  • Observed problem: Five modules independently implement the same matchMedia('(max-width: 600px)') subscription and cleanup behavior.
  • Current user or maintainer effect: Browser publisher knowledge and responsive subscription policy are repeated, and each mounted module owns a separate listener.
  • Evidence: The Map the apps/web component layer #47 composition audit found the same usePhoneProjection implementation in all four workspaces and development simulation.
  • Why current scope does not own it: It has lower leverage than removing the complete Effect runtime lifecycle from App, and Adapt WorkspaceRuntime into React through a purpose Hook #55 must keep presentation behavior unchanged.
  • Likely later seam: One private purpose Hook with deterministic wide → phone → wide and cleanup proof.

Route-identity reset rules remain implicit for two local workflows

  • Status: unassigned
  • Module or interface: Library intake and Process viewed-stage local state
  • Observed problem: Library intake selections can persist across query/detail navigation, and Process viewedStage can persist across Project route identity because both owners outlive the nested route entity.
  • Current user or maintainer effect: A later route change can retain hidden selection or stage state without a documented persistence or reset rule.
  • Evidence: Static Map the apps/web component layer #47 ownership audit of LibraryWorkspace intake state and outer ProcessWorkspace stage state; browser reset behavior was not re-proved.
  • Why current scope does not own it: The desired persistence behavior is a product/state-lifetime decision and Adapt WorkspaceRuntime into React through a purpose Hook #55 must not move route or workspace ownership.
  • Likely later seam: Separate Library and Process composition briefs after Adapt WorkspaceRuntime into React through a purpose Hook #55; use React identity to reset only if the owner accepts that lifetime.

Lifecycle

  1. Localize the shared UI modules in apps/web #48 and later Map the apps/web component layer #47 tasks append only evidenced findings.
  2. When a finding is selected, link it to the ready child spec and mark it assigned.
  3. When that child supplies evidence, mark the entry resolved.
  4. Keep rejected or explicitly deferred entries with one short reason.
  5. Close this ledger when Map the apps/web component layer #47 closes and every entry is resolved, rejected, or moved to a named future issue.

Metadata

Metadata

Assignees

No one assigned

    Labels

    wayfinder:taskOne accepted task linked to a wayfinder map

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions