Shared Explorer interaction implementation

This local change implements the UI review of 5 September 2026 and the user's SeeLinks refinements. The base Explorer commit is c8af0b05cab49a5341e0b787e17d49a674868d3a. The implementation belongs to this repository. The separate early-years rehearsal kit (gds-local-hackathon-20260909-early-years) contains the fictional producer fixture and portable consumer acceptance. SeeLinks was inspected read-only. The kit's original pinned Explorer build and historical execution receipts are preserved. The owner authorised public publication of this synthetic rehearsal on 5 September 2026; production gates remain required.

Interaction and state boundaries

Query and committed scope, preview highlight, presentation folds, inspected record and graph focus are separate state. Plain clicks toggle selected values off; an unselected value replaces the selection in its own facet; Command on macOS or Ctrl on Windows/Linux gives OR within it. Populated facets combine with AND. Keep highlighted/unhighlighted commits a reversible predicate; folding retains a membership snapshot. An active zero-match preview is distinct from having no preview. Double-click and Alt+Enter commit the whole preview; they never toggle an existing reduction off.

The indexed worker applies these predicates to complete candidate identities before ranking display limits and bounded document hydration. It returns a separate current-scope facet distribution and, where complete and bounded, fold-membership IDs. Legacy filter.* links remain supported. The additive explore query parameter retains preview and reduction history; malformed or oversized expressions are rejected visibly. The same predicate also constrains hydrated records used by other large-corpus views.

Reviewable modules

Module Responsibility
viewer/facetSelection.ts Pure selection algebra, URL validation, bounded keep history and identity-set operations
viewer/smallExploration.ts Small-bundle facet values and counts over one shared scope
viewer/localExploration.ts Complete local-index and bounded map counts, fold membership and explicitly simple local text matching
viewer/smallGraph.ts Explicit graph focus independent of inspection; scope and fold boundaries
viewer/bookmarks.ts Bundle-qualified bookmark identity and defensive persistence parsing
viewer/workspaceNavigation.ts Panel order and horizontal swipe thresholds
components/WorkspaceShell.svelte Three-panel layout, independent scrolling, footer, touch and focus handling, keyboard splitters and rails
components/FacetPanel.svelte Shared facet values, pin/open controls, compact selection summaries, bounded distributions and explicit multi-selection
components/ExplorationToolbar.svelte Keep, complement, Undo, reset and live folded summaries
components/ResultList.svelte Shared cards/list, selection, highlighting, honest loading/empty states and stable evidence-capture attributes
components/BookmarkShelf.svelte Pin disclosure, open/remove and explicit copy/download actions
components/InspectorSections.svelte Accessible inspector tabs with independently pinned sections
components/SmallRecordInspector.svelte Existing safe Markdown, provenance, lifecycle, trust and passive attestation content in the common tab structure

The route coordinates loading and existing specialist large-corpus views. New interaction rules are not duplicated across adapters. Obsolete private facet and resize functions were removed. The existing route still contains substantial specialist graph and data-card code; this change establishes bounded extraction seams rather than claiming the entire historical application is now small.

Tests cover state invariants, actual server-rendered component output and the worker boundary. Extracted behaviour is no longer tested by counting copies of source strings in the route. Existing production descriptors, semantic schemas, assertion authority, safe rendering and static-search ceilings remain governed by their existing contracts.

Local execution evidence

The kit contains portable consumer checks and a curated public evidence summary. Raw local receipts remain outside the published source tree. The receipt records exact commands, runtime, source hashes, URLs, outcomes and any unrun gates. The browser journey navigates the actual built Svelte Explorer and fixture URLs, checks 22 concepts and 23 relationships, exercises the small and indexed formats, and opens a corrupted JSON copy. Development failures are retained separately from final acceptance. Injected HTML is not used as URL-navigation evidence.

The portable kit server binds 127.0.0.1:4175 and serves the actual built Explorer plus the fixture directly. The former proxy to the historical server is not required. The project permission profile retains network-proxy enforcement, both authorised roots and explicit loopback additions. Where the host sandbox still restricts browser launch or socket binding, scoped host execution is used under the owner's local-testing authorisation. Browser tools and shell networking are verified independently; no global approval or administrator restriction is relaxed.

Acceptance is recorded against the completed app build and fixture materials in the kit's public summary and repository CI. Earlier development runs remain historical evidence, not final release receipts. Coverage includes the three browser engines, runtime schema validation, the synthetic fixture, corrupted input, accessibility checks and indexed-corpus journeys. These checks do not establish complete accessibility certification or full upstream conformance.

The owner authorised the Explorer update and public synthetic kit repository. Publication still requires protected-main checks and the existing Pages gates. Paid model calls, live referrals, identity merges and real-personal-data processing remain outside this work's authority.

Evaluation compatibility

The released Heritage profiles retain their exact historical bytes. The current impact planner classifies four explicitly named repository journey manifests through the existing browser-control rule; other unknown paths still fail closed. Version 2 receipt comparison validates the complete artefact root and the separate semantic identity using the shared receipt algorithm. A serialisation change does not become a graph-meaning change, and a malformed identity still blocks trust. The obsolete Python facet source-string assertion is covered instead by the shared component rendering tests and actual browser search, paging and selection journeys.

Focus recovery retains the last focused pane when Chrome clears the active element before a responsive resize is delivered. Focusing a control outside the panes clears that fallback, so resizing does not steal explicit visible focus.