Repository navigation
fix(dashboard): discover workspaces by user task - #4814
Conversation
Use the existing channel registry as one source for route order, labels, and task descriptions. Search user tasks and preserve existing project name lookup, scoped navigation, and all fourteen mounted workspaces. Add behavioral search regressions for temporal replay, sessions, code exploration, delivery reviews, Work, and scheduled automation. Refs #4220
|
Rank exact and partial labels ahead of task-only matches while keeping stable channel order. Give workspace labels priority over truncatable hints on narrow screens. Exercise real keyboard Enter navigation for workspace names that Explorer mentions in its task hint. Refs #4814
Do not move the command palette active index to -1 when ArrowDown is pressed with no results. Clamp the active index to a nonnegative row when a matching project arrives asynchronously without a query change. A DOM regression verifies an initially empty search, ArrowDown, a registered project arriving, announced active IDREF, and Enter navigation with its measured activation. The pre-fix implementation fails it. Refs #4220 Validation: exact source diff reviewed; pnpm/Vitest and browser journeys require hosted CI because dependencies are unavailable locally.
The task-hint addition made Channel require an extra property, but the scope register consumes only path and label. Keep its prop a structural projection of those fields so existing register fixtures compile and full channel values remain accepted without weakening the palette's required task hint. Refs #4220
Reselecting a workspace without changing project scope must not reset Loom/Brain/Cortex renderer and selected-entity query state. Preserve the current location, but let real workspace or scope changes use canonical navigation. Add six keyboard-driven DOM cases covering view links, scope, and cross-workspace selection. Refs #4220
Match the project-selection destination to its canonical scoped URL. The hosted DOM regression already proved the activation succeeded; its old unscoped-path expectation was the only failing assertion. Preserve the behavioral test instead of removing or weakening it. Refs #4220
Preserve row identity across registry refreshes, but never restore a previous selection after the user edits and reverts the search. Exercise actual keyboard navigation and activation through the DOM palette.
Treat project ID as navigation identity and reconcile stale or missing scopeLabel in-place without resetting renderer, replay or selection state. Cover same-project recovery and cross-project isolation in palette DOM tests.
Repair three hosted automation_runner_test failures by supplying the configured executable identity required by the production prefilter. Use the same identity for the prefilter and retained runner, preserving manual-schedule, exact-ledger, live-lock and lock-race assertions. Add a production-prefilter regression for unconfigured refusal, deduplication and same-occurrence recovery after binding, with zero backend calls and no effectful terminal. Do not relax backend admission, change timeouts, or alter the graph publication changes. Refs #4532
A synchronous OnceLock wait inside the asynchronous historical-ingest fixture blocked the worker that must poll live projection concurrently. Use a durable async watch latch to preserve release ordering while exercising the real interleaving and supersession journey. Refs #4481
Loom already resolves bare session IDs against the loaded page and reports ambiguous matches instead of choosing a provider. Restore that explicit cross-view navigation for sessions without recorded provider identity. Add DOM navigation regressions for unknown provider, scoped known provider, and self-link exclusion. Refs #4220.
Refs #4220. Update existing Delivery and Sessions behavioral assertions for the typed bare-session URL without losing ambiguous-provider checks. Keep exact scope, evidence-grade and authenticated-lane expectations.
Fix a single unescaped apostrophe that prevented the dashboard test module from parsing. Preserve the bare-session routing assertions.
Exercise the provider-less, off-page Loom bare-ID path separately from an indexed empty-provider row, which intentionally resolves to the recorded unknown lane. Keep both navigation identity assertions falsifiable. Refs #4220
Migrate remaining parser and DOM callers to the explicit bare-session field, then delete the implicit one-argument signature and raw-lane fallback. Keep qualified identity, ambiguity and off-page behavior. Add a DOM refusal regression for the removed raw lane shape. Refs #4220
Owner-requested caller migration and legacy API deletionPublished The owner's latest direction is “In all PRs migrate callers and delete legacy apis.” This supersedes earlier promises in this PR to preserve the obsolete raw-ID Caller audit: the production LoomPage already passes both explicit fields, the shared SessionPivots Added negative parser cases and a rendered LoomPage regression proving an obsolete raw lane value cannot select an otherwise matching session. Exact commit diff reviewed; all unrelated source and maintenance corrections preserved. Verification boundary: no local in-repository pnpm/Vitest or browser run was available. Exact-head CI 42738320620 is queued, NOT passed. Real dashboard typecheck/nonzero tests and broader #4220 acceptance remain required. This is Refs #4220; no merge or issue closure. Preserve the existing #4845 prerequisite stack, refresh this head before edits, and do not restore the removed compatibility path. |
Session identity collision repair — Refs #4220 (2026-11-09)
Commit
9949eadfixes a real provider-identity misrouting defect in Sessions → Loom (and Delivery → Loom) links. A legitimate provider-unknown session ID such as["claude","victim"]was emitted as an unqualifiedloomSessionparameter; Loom parsed any JSON two-string array as a provider-qualified lane, silently opening another session. The existing ambiguity refusal did not protect this shape.Provider-unknown links now carry a separate
loomBareSessionID. Loom resolves it by exact session ID without inventing a provider, while known-provider links and old validloomSessionURLs retain their existing behavior. On scene selection, the bare parameter is cleared so it cannot override the newly selected qualified lane. No changed backend authorization, session persistence, or renderer authority.Falsifiable tests added: URL parse/resolve distinguishes a JSON-shaped literal from the matching foreign lane; Sessions pivot unit and clicked DOM links preserve the literal; LoomPage DOM with two conflicting sessions must open the actual ID rather than the other provider. All seven scoped files and the exact one-parent non-force head were independently reviewed. Eight isolated executable Node URL/selection mechanism assertions passed, including reproduction of the old misroute. These are not execution of the committed React/Vitest tests. Current-head pnpm dashboard typecheck/Vitest, browser journey, and applicable CI still require verification. This is Refs #4220, not full tracking-issue acceptance or merge approval. Leave the PR ready for review but unmerged until verified.
Latest focused session-pivot correction — Refs #4220
Commit
b85c686restores the actual Sessions → Loom navigation link when a recorded session has no provider. PreviouslysessionHref('loom', {provider:null, ...})already produced a supported bare-ID deep link, and Loom's canonicalresolveLoomSessionreturned an explicit ambiguous/outside-page state without guessing a lane, but the visibleSessionPivotscomponent hid the link. This left provider-unknown transcript/search selections unable to reach the supported Loom view.The new DOM regression exercises clicking the formerly absent link, checks the resulting URL, verifies provider-qualified project-scope identity and forbids self-links or fabricated provider values. The original provider-null navigation assertion fails before this change. Only
SessionPivots.tsxand a newSessionPivots.dom.test.tsxchanged in this commit; no renderer, route, store, source identity or permission changes.Validation boundary: five isolated executable Node selection/URL assertions passed, and the two-file commit, parent and guarded
force=falseref were independently verified. These checks are not in-repository Vitest/React execution;pnpm, repository checkout and native Bazel are unavailable locally. Hosted exact-head dashboard/CI and registered-project browser acceptance still need verification; prior CI results do not validate this head. This isRefs #4220, not full issue closure. Do not merge until current-head review and applicable CI pass.Current stack and verification
At
0c72f7b7ea, the diff against the draft MCP fixture #4845 contains only the five dashboard files. Their Git blobs match the earlier full Linux and dashboard pass at17bf3813b9. On the new head, dashboard typechecking, the production bundle, and all 2,263 dashboard tests passed. An initial parallel run timed out two compiler-diagnostics cases during host load; all 16 codegen cases passed separately, and the complete suite passed with three workers and the existing timeouts. Full hosted CI is running. A real Chrome keyboard journey opened the production palette, checked focus and resolved ARIA option identity, preserved the exact Brain, Loom and Code deep links on reselection, and navigated by task description to Delivery, Work and Automations. This ran against the built dashboard with the API disconnected. Registered-project navigation against an enrolled daemon and broader usability acceptance remain open.Current hosted verification
At
17bf3813b9, the dashboard job executed and passed the dashboard unit suite in 118.5s, typecheck in 3.5s, and bundle determinism in 3.7s. Linux passed all 183 selected Bazel targets, and Clippy passed. Earlier queued statuses below are historical. Cross-view usability acceptance for the tracking issue remains open.Scope
Refs #4220— tracking issue for focused command-palette task discovery; not full dashboard navigation acceptance.Previously the palette matched workspace names only, so users searching for tasks such as “temporal replay,” “source symbols,” “PR reviews,” “task board,” and “scheduled jobs” saw no destination even though the relevant workspaces were mounted. The menu also displayed every row's hint as “workspace,” without describing its purpose.
Latest keyboard-scope correctness follow-up (2026-11-08)
a66ccf6: preserve the actual selected project identity when registry results reorder without typing. Previously, retaining only an index could silently make Enter activate a different project. Added a keyboard/registry DOM regression with two projects and a live reorder; an absent selected row still clamps to an available row.5d71622: preserve/?field=sigma&node=...when Brain is reselected; the index route already mounts Brain, and navigation to bare/braindiscarded the deep-link view. Added an index-route keyboard case to the existing renderer-preservation matrix.Implementation
Verification and limits
Commit
7508bda04817was reviewed againstmaster91c72aba; the exact changes are confined todashboard/src/app/channels.ts,dashboard/src/app/shell/CommandPalette.tsx, anddashboard/src/app/channels.test.ts. The branch was updated by a non-force expected-head fast-forward.A standalone
tsc --strict --target ES2022 --module commonjscompile of the byte-identical productionchannels.tspassed; its local Git blob SHA1dbe0a683458ad71fe85a45cc5a79df0092394cematched the published file, and 15 executable Node assertions passed for real task matching, pre-existing route/label behavior and project-name matching. The new in-repository Vitest cases, full dashboard typecheck and browser interaction tests have not executed here (pnpm/full checkout unavailable). Exact-head hosted CI is queued; do not merge without nonzero relevant passing CI.Remaining issue acceptance
Cross-workspace navigation, selected identities, deep links (
loomRenderer,field,render), restored Loom/Brain/Cortex view choices, accessibility and browser journey validation remain mandatory for full issue closure. Nothing here claims to address all of that. No decision-model, release or protected PR changes.Latest keyboard activation correction (2026-11-08)
Commit
7f5753eeprevents ArrowDown on an empty command-palette search from storing active index-1. A later matching project delivered by the shared registry without any query change previously rendered a visible row but leftaria-activedescendantunresolved and Enter inert. The new DOM regression exercises empty search → ArrowDown → live registry update → announced selected row → Enter, and confirms the measured project activation and route. Before this fix the test fails at the IDREF assertion. The change preserves all existing task-hint rows, route identities, and project scope logic. One scoped two-file commit (37 additions, 2 deletions), independently reviewed and pushed using an exact-headforce=falsefast-forward. The in-repo Vitest regression and browser journey have not yet executed; exact-head hosted dashboard CI is required. The tracking issue remains open for the full acceptance work.CI repair — scope-register channel type (2026-11-08)
Commit d9288b2 fixes the exact hosted Dashboard typecheck failure at
ShellChrome.dom.test.tsx:117,129,178: adding the searchableChannel.taskHintmade unrelatedScopeBarfixtures invalid despite the register using onlypathandlabel. The register now acceptsPick<Channel, 'path' | 'label'>, preserving the required task hint at the channel authority and accepting complete Channel objects as before. Exactly one source file changed (one insertion/one deletion); the three original behavioral assertions remain intact.Verification: isolated TypeScript 5.8.3 strict structural test reproduced 3 missing-
taskHintdiagnostics before the change and zero diagnostics afterwards, including the full-Channel case. The in-repository Bazel/Vitest and browser suites are not yet confirmed for this new head. No issue closure is claimed.Active-view deep-link preservation — 2026-11-08
Commit
dccdaf9ecorrects an additional navigation regression in this scope: selecting the currently open Loom, Brain or Cortex workspace through the command palette used to navigate back to the bare route and silently erase the selectedloomRenderer,field,renderand entity/deep-link parameters. The palette now retains the current route only when both workspace path and project scope agree. Switching workspaces or changing project scope continues to navigate via the canonical route, discarding unrelated view-only parameters.Six keyboard-driven DOM assertions are added: three renderer/entity deep links, same-project scope preservation, cross-workspace isolation and project-scope transition. The previous implementation fails the preservation assertions. Two production/test files changed, and the commit was independently diff-reviewed and published through an expected-head, non-force fast-forward.
Execution status: exact-head hosted CI #42499324917 is queued; the new Vitest tests and browser journey have not yet been observed passing. Existing full multi-view and usability acceptance remains outstanding; the tracking issue remains open.
Hosted DOM assertion repair — 2026-11-08
The actual Dashboard Bazel job ran 2,254 tests (2,253 passed, one failed). The failing new late-registry keyboard test correctly activated and navigated to the chosen project, but its final assertion incorrectly expected the unscoped
/brainpath; the productionscopedWorkspacePathexplicitly emits/brain?scope=proj-new&scopeLabel=RareProject. Commitfeeef181corrects the assertion without removing or weakening the active-IDREF, Enter, activation or scope assertions. Independently reviewed exact one-file test-only diff, non-force expected-old-head push. New exact-head CI #42504065568 is queued and has not passed. The prior failing run leaves the PR unmerged and the tracking issue open.