You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
### <shortfindingname>- 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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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:
Do not add theoretical reuse, speculative cleanup, unused future variants, broad “could be cleaner” notes, or ideas without a present caller.
Finding format
Direct-test matrix
Track current evidence without creating an automatic test-backfill project.
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
.ui-*descendants to control internal layout and presentation.Dialog callers can override owned accessibility mechanics
Library test asserts private EvidenceViewport CSS structure
Flyout automatic initial focus is not observed
Take control, Escape closed it, and focus returned toControl · view.Shared workspace stylesheet still owns Observe presentation styles
apps/web/src/components/workspaces/Workspace.cssshell-*,simulation-*,workspace-*, andobserve-*responsibilities after the strict source move.Preserved runtime failure wording still names Nightbook
WorkspaceRemoteFailuredefault messageapps/web/src/workspace-runtime.tsinto submissions.Library route interface permits correlated optional states
LibraryWorkspacePropsAppand tests must know absence and identity rules that the Library workspace interface does not express.LibraryWorkspace.tsx.Process route interface permits conflicting route modes
ProcessWorkspacePropsProcessWorkspace.tsx.list | source | projectProcess route model after Adapt WorkspaceRuntime into React through a purpose Hook #55.Lazy route outlets have no failure or retry interface
Applazy workspace outletslazyimports and fourSuspenseloading branches with no active error module.Phone projection adapter is repeated across five modules
matchMedia('(max-width: 600px)')subscription and cleanup behavior.usePhoneProjectionimplementation in all four workspaces and development simulation.App, and Adapt WorkspaceRuntime into React through a purpose Hook #55 must keep presentation behavior unchanged.Route-identity reset rules remain implicit for two local workflows
viewedStagecan persist across Project route identity because both owners outlive the nested route entity.LibraryWorkspaceintake state and outerProcessWorkspacestage state; browser reset behavior was not re-proved.Lifecycle