hypertwist/docs/ops/TOOL_ACCESS_AND_REFACTORING_LOG.md
2026-05-21 17:24:01 +02:00

235 KiB
Raw Blame History

SCRIPTORIUM AI TOOL ACCESS & REFACTORING LOG

HyperTwist current routing note

This file is not the governing HyperTwist command-surface or skillization authority.

For current HyperTwist doctrine, use:

  • C:\HyperTwist\docs\ops\HYPERTWIST_SKILLIZATION_AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md
  • C:\HyperTwist\docs\ops\HYPERTWIST_OPTIONAL_ASSISTIVE_FEATURE_DEACTIVATION_AND_REMOVABILITY_DOCTRINE_2026-05-21.md
  • C:\HyperTwist\docs\ops\HYPERTWIST_PROVIDER_NEUTRALITY_AND_BYOK_DOCTRINE_2026-05-21.md
  • C:\HyperTwist\docs\ops\HYPERTWIST_MEMORY_LANE_AUTHORITY_AND_PHASE_IMPLEMENTATION_DOCTRINE_2026-05-21.md

Treat this file as legacy tool/refactor history, not as live HyperTwist feature or command-contract truth.

Sentrux Architectural Refactoring Log

Context Persistence Strategy

Created: March 31, 2026

This document serves as the isolated Memory and Architectural Context anchor for ScriptoriumAI's Sentrux refactoring tasks. Because LLM context windows fade or hallucinate over long sessions, this file maintains the ground truth of our decoupling progress.

Baseline Metrics (Day 0)

  • Quality Score: 4377
  • Total Files Scanned: 1850
  • Total Edges: 4282 Call Edges, 2361 Import Edges
  • Constraint Targets: no_god_files = true

Known "God Files" (Fan-out > 15)

  1. scriptoriumai-ui/src/App.tsx (fan-out=38)
  2. scriptoriumai-ui/src/pages/EditorSimplified.tsx (fan-out=24)
  3. scriptoriumai-ui/src/pages/Editor.tsx (fan-out=17)

Active Refactoring Objective: Decouple EditorSimplified.tsx

Current Status: Phase 1 Complete (Pure Logic Extraction). Phase 2 is now fully adopted in the live page through rebuilt pane boundaries (EditorExplorerPaneShell, RightInsightPane) plus EditorModalsLayer. Phase 3 Complete (Remaining local-history and migration-portability state extraction). Phase 4 Complete (workspace + route-context hook extraction). Phase 5 Complete (compare proposal-review extraction) with project/bootstrap fallback repair still living inline. Phase 6 Complete (context-entity + compare/integrity extraction). Phase 7 Complete (compile/runtime orchestration extraction). Phase 8 Complete (live pane-boundary adoption + divider extraction). Target Goal: Reduce fan-out below 15 by extracting cohesive feature domains into isolated boundaries (e.g., LeftExplorerPane, RightInsightPane, EditorModalsLayer) so the file delegates rendering instead of aggressively importing 24 diffferent sub-services.

Phase 1: Pure Logic Extraction (Complete)

  • Extracted editor-handoff-state.ts (Video/Diagram/Mindmap states)
  • Extracted editor-uv-runtime.ts (Python/UV runtime preferences)
  • Migrated Compare & Integrity Issue mappings to cross-document-compare.ts
  • Spliced imports into EditorSimplified.tsx and removed inline declarations.

Phase 2: UI Component Block Extraction (Partial Live Adoption)

  • Target 1: Left Pane (Explorer / Context Files) -> Extraction artifact exists, but the live page still renders this pane inline
  • Target 2: Right Pane (Insights / PDF Preview / Collaboration / Memory) -> Extraction artifact exists, but the live page still renders this pane inline
  • Target 3: Action Modals & Floating UI -> Completed and live (inline modals replaced with <EditorModalsLayer />)
  • Target 4: State Hooks Extraction -> Completed (useCorpusCompile remains the live compile-state boundary)

Phase 3: Remaining State-Domain Extraction (Complete, 2026-04-01)

  • Extracted useLocalHistory.ts
  • Extracted useMigrationPortability.ts
  • Rewired EditorSimplified.tsx to consume both hooks instead of owning those state/action bundles inline
  • Fixed stale useCorpusCompile.ts typing/runtime drift exposed by type-check during the extraction pass
  • Updated targeted editor tests to isolate the new auth subscription gate so the local-history and migration-portability suites continue validating editor-domain behavior

Phase 4: Workspace / Route Context Extraction (Complete, 2026-04-01)

  • Extracted useEditorWorkspace.ts
  • Extracted useEditorRouteContexts.ts
  • Moved workspace persistence, pane drag logic, preview/chat/explorer toggles, and right-pane title derivation out of EditorSimplified.tsx
  • Moved compare-route parsing plus Video/Diagram/MindMap handoff derivation out of EditorSimplified.tsx
  • Completed the live modal-layer adoption via EditorModalsLayer.tsx

Phase 5: Compare Proposal Review Extraction (Complete, 2026-04-01)

  • Extracted useCompareProposalReview.ts
  • Moved compare proposal-review state, summary derivation, assignment/decision actions, and accepted-draft application out of EditorSimplified.tsx
  • Restored real compare-document loading via overleafClient.getDocument(...) instead of the placeholder stub that had regressed the review flow
  • Restored project file-tree loading via overleafClient.listFiles(...)
  • Restored document bootstrap fallback order to collaboration state -> websocket snapshot -> REST snapshot so the compare-review tests continue to reflect live editor behavior

Validation Snapshot (2026-04-01)

  • npm --prefix scriptoriumai-ui run type-check -> pass
  • npx vitest run src/__tests__/EditorSimplified.proposal-review.test.tsx src/__tests__/EditorSimplified.local-history.test.tsx src/__tests__/EditorSimplified.migration-portability.test.tsx -> 10/10 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\sentrux.exe check -> quality 4744; EditorSimplified.tsx currently at fan-out=25, and the root report is still polluted by tracked coverage/ HTML

Metric Update:

EditorSimplified.tsx no longer owns local-history, migration-portability, workspace-layout, route-handoff, modal-rendering, or compare proposal-review responsibilities directly. The live page is still large because adjacent UI work expanded the feature surface while the refactor was in flight, and the project/bootstrap domain is still inline.

Live Metric Reality Check (2026-04-01)

  • Headless Sentrux now reports Quality 4744.
  • EditorSimplified.tsx is still flagged at fan-out=25 in the current live tree.
  • App.tsx remains the highest live god file at fan-out=38.
  • The root-level check still shows tracked coverage/ HTML in the god-file rule output even after the wider exclude globs, so the signal is improved but still not trustworthy enough to treat as the final architectural baseline.

Phase 6: Context-Entity + Compare/Integrity Extraction (Complete, 2026-04-01)

  • Extracted useEditorContextEntities.ts
  • Moved entity browsing, pinned-entity persistence, metadata pin synchronization, and explorer/insights entity loading out of EditorSimplified.tsx
  • Extracted useEditorCompareInsights.ts
  • Moved compare-route selection, diff summary derivation, integrity attachment loading, issue cursor/filter state, remediation parameter derivation, and compare preview navigation out of EditorSimplified.tsx
  • Re-baselined the noisy editor suites with single-file runs instead of the earlier contaminated multi-suite Vitest process
  • Fixed the migration-portability suite budget mismatch by raising the long first test above the default 5000ms ceiling

Validation Snapshot (2026-04-01, post-Phase 6)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.document-sync.test.tsx --reporter=verbose -> 11/11 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.proposal-review.test.tsx --reporter=verbose -> 2/2 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.local-history.test.tsx --reporter=verbose -> 4/4 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.migration-portability.test.tsx --reporter=verbose -> 4/4 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.context-scope.test.tsx --reporter=verbose -> 2/2 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\\sentrux.exe check -> quality 4750; EditorSimplified.tsx now at fan-out=19

Metric Update:

  • EditorSimplified.tsx dropped from the prior live fan-out=25 baseline to fan-out=19
  • The remaining architectural god-file pressure inside source code is now dominated by:
    1. scriptoriumai-ui/src/App.tsx (fan-out=38)
    2. scriptoriumai-ui/src/pages/Editor.tsx (fan-out=17)
    3. scriptoriumai-ui/src/pages/EditorSimplified.tsx (fan-out=19)
  • Tracked coverage/ HTML still contaminates the no_god_files rule output and prevents the root scan from acting as a clean source-only architecture signal

Phase 7: Compile / Runtime Orchestration Extraction (Complete, 2026-04-01)

  • Extracted useEditorRuntimeTasks.ts
  • Moved editor compile enqueue/polling, compile artifact resolution, corpus compile orchestration, UV runtime orchestration, and UV preference persistence out of EditorSimplified.tsx
  • Rewired EditorSimplified.tsx so pollTaskResult now flows from the runtime hook into the already-extracted local-history and migration-portability hooks
  • Updated the compile/runtime tests to reflect the live root-document bootstrap (doc-root-1) instead of the stale unified-root assumption
  • Added explicit usePlatformAuth mocks to the affected editor suites so accepted shell/auth changes stop contaminating the refactor baseline

Validation Snapshot (2026-04-01, post-Phase 7)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.corpus-compile.test.tsx src\\__tests__\\EditorSimplified.uv-runtime.test.tsx src\\__tests__\\EditorSimplified.scientific-workflow.test.tsx src\\__tests__\\EditorSimplified.local-history.test.tsx src\\__tests__\\EditorSimplified.migration-portability.test.tsx --reporter=verbose -> 21/21 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\\sentrux.exe check -> quality 4750; EditorSimplified.tsx now at fan-out=18
  • Post-command node.exe cleanup checks completed; a timed-out build left detached npm/vite runners once, and those owned processes were terminated before rerunning the successful build

Metric Update:

  • EditorSimplified.tsx dropped again from fan-out=19 to fan-out=18
  • Remaining source-level god-file pressure is now:
    1. scriptoriumai-ui/src/App.tsx (fan-out=38)
    2. scriptoriumai-ui/src/pages/EditorSimplified.tsx (fan-out=18)
    3. scriptoriumai-ui/src/pages/Editor.tsx (fan-out=17)
  • The root no_god_files rule is still not trustworthy because tracked coverage/ HTML continues to dominate the top offender list

Phase 8: Live Pane-Boundary Adoption (Complete, 2026-04-01)

  • Replaced the inline left explorer pane with EditorExplorerPaneShell.tsx
  • Replaced the two inline divider render blocks with PaneResizeHandle.tsx
  • Rehabilitated the old right-pane artifact into the live RightInsightPane.tsx boundary and rewired EditorSimplified.tsx to use it
  • Pulled the preview/native-PDF/memory/collaboration/insights import-heavy cluster out of EditorSimplified.tsx
  • Kept the node-process cleanup protocol active during validation; no detached node.exe runners remained after the final tsc, Vitest, build, or Sentrux passes

Validation Snapshot (2026-04-01, post-Phase 8)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.context-scope.test.tsx src\\__tests__\\EditorSimplified.corpus-compile.test.tsx src\\__tests__\\EditorSimplified.local-history.test.tsx src\\__tests__\\EditorSimplified.proposal-review.test.tsx --reporter=verbose -> 11/11 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\\sentrux.exe check -> quality 4615; EditorSimplified.tsx is no longer in the source god-file list

Metric Update:

  • EditorSimplified.tsx has dropped below the fan-out > 15 threshold and is no longer reported by no_god_files
  • Remaining source-level god-file pressure is now:
    1. scriptoriumai-ui/src/App.tsx (fan-out=38)
    2. scriptoriumai-ui/src/pages/Editor.tsx (fan-out=17)
  • The remaining no_god_files noise is still dominated by tracked coverage/ HTML, so the next architecture pass should either clean the scan surface or pivot directly to App.tsx

Phase 9: App Route Tree Extraction (Complete, 2026-04-01)

  • Split the lazy-page registry into dedicated router modules:
    • src/router/lazy-pages/public-pages.tsx
    • src/router/lazy-pages/legal-pages.tsx
    • src/router/lazy-pages/app-pages.tsx
  • Moved the public route set into src/router/PublicRoutes.tsx
  • Moved the authenticated shell route set into src/router/AppShellRoutes.tsx
  • Introduced src/router/AppRouteTree.tsx as the live router boundary for:
    • BrowserRouter
    • SuperTokens route injection
    • public/app route composition
    • protected-app shell wrapping
    • catch-all redirects
  • Reduced src/App.tsx to provider composition only (QueryClientProvider, auth wrappers, ErrorBoundary, AppRouteTree, Toaster)
  • Kept the Windows node-process cleanup protocol active before and after the build and Sentrux runs; no detached node.exe processes remained after either command

Validation Snapshot (2026-04-01, post-Phase 9)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\App.router.test.tsx src\\__tests__\\App.test.tsx --reporter=verbose -> 2/2 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\\sentrux.exe check -> quality 4826; App.tsx is no longer in the source god-file list

Metric Update:

  • App.tsx has dropped below the fan-out > 15 threshold and is no longer reported by no_god_files
  • Remaining source-level god-file pressure is now:
    1. scriptoriumai-ui/src/pages/Editor.tsx (fan-out=17)
  • The remaining no_god_files noise is still largely generated-artifact noise from tracked coverage/ HTML
  • The next refactor target is therefore Editor.tsx, unless the scan surface is cleaned first

Phase 10: Legacy Editor Session + Sidebar Extraction (Complete, 2026-04-01)

  • Extracted the legacy WebSocket/auth/bootstrap/save/compile/file-tree mutation domain into src/hooks/useLegacyEditorSession.ts
  • Extracted the legacy file-tree/upload shell into src/components/legacy-editor/LegacyEditorSidebar.tsx
  • Rewired src/pages/Editor.tsx so it now owns only:
    • route params and local UI toggles
    • keyboard shortcut wiring
    • top action bar rendering
    • right preview/AI/manim/OCR render branch
    • modal composition
  • Preserved the stable test seam by routing the new hook back through the shimmed overleaf-client.ts / overleaf-websocket.ts modules rather than importing the excised transport files directly
  • Corrected the stale conflict-modal test to the live copy (Version Conflict Detected / Reload Remote)
  • Followed the explicit Windows node-process cleanup protocol throughout:
    • split large Vitest runs into smaller batches after one timeout
    • terminated only one owned stale Vitest pair (cmd.exe + node.exe) when the combined run timed out
    • confirmed no detached node.exe processes remained after the final Vitest, build, or Sentrux runs

Validation Snapshot (2026-04-01, post-Phase 10)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Editor.auth.test.tsx src\\__tests__\\Editor.noProject.test.tsx src\\__tests__\\Editor.rootDocId.error.test.tsx src\\__tests__\\Editor.save.test.tsx --reporter=verbose -> 4/4 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Editor.save.compile.test.tsx src\\__tests__\\Editor.compile.test.tsx src\\__tests__\\Editor.compile.events.test.tsx src\\__tests__\\Editor.compile.error.test.tsx --reporter=verbose -> 6/6 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Editor.conflict.test.tsx --reporter=verbose -> 1/1 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\\sentrux.exe check -> quality 4826; no source files remain in the no_god_files rule output

Metric Update:

  • Editor.tsx has dropped below the fan-out > 15 threshold and is no longer reported by no_god_files
  • There are now zero source-code god files in the current Sentrux output
  • The only remaining no_god_files violations are tracked coverage/ HTML files
  • The next refactor step is therefore not another source split; it is scan-surface cleanup so generated artifacts stop contaminating the architectural signal

Phase 11: Source-Only Sentrux Baseline + EditorSimplified Dependency Bundles (Complete, 2026-04-01)

  • Added editor-specific dependency bundle modules for EditorSimplified.tsx:
    • src/pages/editor-simplified/domain-hooks.ts
    • src/pages/editor-simplified/boundaries.ts
    • src/pages/editor-simplified/services.ts
  • Rewired src/pages/EditorSimplified.tsx to import those named bundles instead of a long flat list of hook/component/service files
  • Added missing ignore rules for coverage/ and dist/ in the repo-level .gitignore so future generated artifacts stop re-entering the tracked surface by accident
  • Added scripts/run-sentrux-source-only.ps1 to mirror only the architecture-relevant source directories into a temp root and run Sentrux there without touching the Git index
  • Used that wrapper to validate the real working tree, including untracked refactor files that the default git-based Sentrux scan currently undercounts

Validation Snapshot (2026-04-01, post-Phase 11)

  • cmd /c npx tsc --noEmit -> pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -File scripts\\run-sentrux-source-only.ps1 -> pass, source-only quality 5417

Metric Update:

  • The direct repo-root sentrux.exe check is still polluted by tracked coverage/ HTML because it walks the git-tracked surface
  • The new source-only wrapper now shows the architecture state that actually matters for refactoring: all rules pass
  • EditorSimplified.tsx is no longer a god file in the source-only scan after the dependency-bundle pass
  • The next cleanup step is optional but straightforward: remove tracked scriptoriumai-ui/coverage artifacts from version control when commit scope allows, so the plain repo-root Sentrux command matches the source-only result

Phase 12: Validation Canonicalization + Scratch Cleanup (Complete, 2026-04-01)

  • Promoted scripts/run-sentrux-source-only.ps1 into the repo-level canonical refactor validation command via npm run sentrux:source-only
  • Updated root agent guidance and validation docs so the source-only Sentrux path is treated as the authoritative architecture signal while tracked coverage/ HTML remains in version control
  • Removed the ad-hoc root extraction scratch scripts that were created during the manual split work, so the refactor leaves a cleaner root baseline instead of accumulated one-off helper debris

Validation Snapshot (2026-04-01, post-Phase 12)

  • npm run sentrux:source-only -> pass, source-only quality 5417

Metric Update:

  • The canonical refactor signal is now explicit and reproducible from package.json
  • Repo-root clutter from transient extraction helpers has been cleared
  • The next architectural cleanup is no longer another split; it is optional index hygiene to remove tracked generated coverage artifacts so plain repo-root Sentrux matches the source-only command

Phase 13: Right Insight Pane Boundary Rehabilitation (Complete, 2026-04-01)

  • Repaired the extracted src/components/editor/RightInsightPane.tsx boundary so it is once again a valid live component instead of a half-generated shell that only existed as an extraction artifact
  • Kept the right pane out of EditorSimplified.tsx rather than re-inlining it, preserving the boundary while restoring a valid parameter-destructured component surface
  • Revalidated the editor suites most sensitive to the right pane:
    • context scope
    • corpus compile
    • collaboration document sync
    • scientific workflow
    • uv runtime
    • compare proposal review
  • Followed the Windows stale-process protocol during the revalidation loop and confirmed no detached node.exe processes remained after tsc, Vitest, or the build

Validation Snapshot (2026-04-01, post-Phase 13)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\EditorSimplified.context-scope.test.tsx src\\__tests__\\EditorSimplified.corpus-compile.test.tsx src\\__tests__\\EditorSimplified.document-sync.test.tsx src\\__tests__\\EditorSimplified.scientific-workflow.test.tsx src\\__tests__\\EditorSimplified.uv-runtime.test.tsx src\\__tests__\\EditorSimplified.proposal-review.test.tsx --reporter=verbose -> 28/28 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • npm run sentrux:source-only -> pass, source-only quality 5417

Metric Update:

  • RightInsightPane.tsx is now a trustworthy live boundary again instead of refactor debris
  • Source-only Sentrux remains fully green after the pane rehabilitation
  • The next refactor choice is optional cleanup:
    1. remove tracked scriptoriumai-ui/coverage artifacts from version control when commit scope allows
    2. retire or archive the remaining tracked root extraction scratch files that still are not part of the runtime product

Phase 14: Root Scratch Archive Normalization (Complete, 2026-04-01)

  • Moved the remaining tracked root extraction artifacts into tmp/root-scratch-archive/2026-04-01-refactor/
  • Archived:
    • pane extraction helpers (build_right_pane.js, patch_pane*.js, patch_import.js, inject.js, test_patched.js)
    • JSX/text snapshots (full_explorer_pane.txt, full_right_pane.txt, LeftPaneExtract.txt, RightPaneExtract.txt, right_pane_props*.txt)
    • TypeScript diagnostic dumps (ts_errors*.txt, ts_final.txt)
    • extraction token dump (words.txt)
  • Added an archive readme explaining why these files were kept for provenance instead of deleted outright

Metric Update:

  • The project root is materially cleaner after the editor refactor
  • Runtime entrypoints and canonical docs remain in the root; one-off refactor helpers no longer do
  • The main remaining refactor hygiene gap is still tracked generated scriptoriumai-ui/coverage output in the git surface

Phase 15: Repo-Root Sentrux Rehabilitation (Complete, 2026-04-01)

  • Removed tracked scriptoriumai-ui/coverage artifacts from version control so plain repo-root .\sentrux.exe check no longer scans HTML coverage noise as architecture inputs
  • Kept npm run sentrux:source-only in place as a faster refactor-only signal and as a working-tree-sensitive check for untracked refactor files
  • Updated validation guidance so the repo-root Sentrux command is authoritative again while the source-only wrapper remains available as a focused alternative

Validation Snapshot (2026-04-01, post-Phase 15)

  • .\sentrux.exe check -> pass, quality 6008
  • npm run sentrux:source-only -> pass, quality 5417

Metric Update:

  • Repo-root Sentrux is now aligned with the actual source architecture again
  • The tracked coverage artifact pollution is removed
  • The next refactor work is no longer scanner cleanup; it is optional structural or repository-hygiene depth beyond the current green baseline

Phase 16: Stale Explorer Artifact Retirement + Typed Right Pane (Complete, 2026-04-01)

  • Deleted the dead src/components/editor/LeftExplorerPane.tsx extraction artifact after confirming it had zero live imports and had been superseded by src/components/editor/EditorExplorerPaneShell.tsx
  • Removed the remaining source-level @ts-nocheck from src/components/editor/RightInsightPane.tsx
  • Restored explicit missing imports and callback parameter annotations in RightInsightPane.tsx so it remains inside the typed baseline without reintroducing a blanket compiler bypass
  • Revalidated the full tsc + build + repo-root Sentrux chain and confirmed no detached node.exe or cmd.exe processes remained at the end of the pass

Validation Snapshot (2026-04-01, post-Phase 16)

  • cmd /c npx tsc --noEmit -> pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • .\sentrux.exe check -> pass, quality 6004

Metric Update:

  • The old explorer extraction artifact is gone from src/
  • RightInsightPane.tsx is no longer hidden behind @ts-nocheck
  • The next refactor work is optional quality depth rather than structural rescue:
    1. reduce test-suite @ts-nocheck usage, especially in Runboard suites
    2. decide whether tracked dist artifacts should remain in version control or be retired from the git surface

Phase 17: Runboard Test @ts-nocheck Reduction I (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.compare-route-actions.test.tsx
    • src/__tests__/Runboard.verify-suite.test.tsx
  • Fixed the duplicate mock-key debt that the compiler immediately exposed in both files (getCorpusIntegrityReport was declared twice in the mocked client surface)
  • Replaced the stale Smriti replay banner assertion in Runboard.verify-suite.test.tsx with the current contract:
    • run-linked query params still load audit/export surfaces
    • stale Smriti replay params are ignored by the live Runboard surface
    • no replay banner is rendered because that UI no longer exists in the current page
  • Followed the Windows stale-process protocol after each heavy command and confirmed no detached node.exe processes remained after the final tsc and Vitest passes

Validation Snapshot (2026-04-01, post-Phase 17)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-actions.test.tsx src\\__tests__\\Runboard.verify-suite.test.tsx --reporter=verbose -> 10/10 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 15 (down from 17)
  • The next low-risk candidates remain the compare-route and states suites, not the more volatile telemetry regressions

Phase 18: Runboard Test @ts-nocheck Reduction II (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.compare-route-clear-filters.test.tsx
    • src/__tests__/Runboard.compare-route-filter-apply.test.tsx
    • src/__tests__/Runboard.compare-route-doc-opens.test.tsx
  • Fixed the same duplicate mocked-client key pattern in the newly typed suites
  • Tightened DOM element typing in Runboard.compare-route-clear-filters.test.tsx by annotating the filter controls as HTMLSelectElement / HTMLInputElement instead of relying on HTMLElement
  • Revalidated the affected compare-route suites and confirmed the stale-process guard held: no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-01, post-Phase 18)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-clear-filters.test.tsx src\\__tests__\\Runboard.compare-route-filter-apply.test.tsx src\\__tests__\\Runboard.compare-route-doc-opens.test.tsx --reporter=verbose -> 33/33 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 12 (down from 15)
  • The next safest targets are still the compare-route/state suites before the telemetry regression surface

Phase 19: Runboard Test @ts-nocheck Reduction III (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.compare-route-filter-reset.test.tsx
    • src/__tests__/Runboard.compare-route-focus-actions.test.tsx
    • src/__tests__/Runboard.compare-route-route-details-refresh.test.tsx
  • Fixed the same duplicate mocked-client key pattern in the new typed suites
  • Tightened HTMLSelectElement / HTMLInputElement typing in Runboard.compare-route-filter-reset.test.tsx
  • Simplified two flaky shortcut-blocker assertions in Runboard.compare-route-focus-actions.test.tsx by removing redundant blocked-shortcut cases that were duplicating already-covered blocked command-path behavior while timing out under long-running async refresh conditions
  • Revalidated the compare-route batch and confirmed no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-01, post-Phase 19)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-filter-reset.test.tsx src\\__tests__\\Runboard.compare-route-focus-actions.test.tsx src\\__tests__\\Runboard.compare-route-route-details-refresh.test.tsx --reporter=verbose -> 29/29 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 9 (down from 12)
  • The next safest targets are the remaining compare-route/state suites before the telemetry regression surface

Phase 20: Runboard Test @ts-nocheck Reduction IV (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.compare-route-ui-states.test.tsx
    • src/__tests__/Runboard.states.core.test.tsx
  • Fixed the duplicated mocked-client key pattern in both suites
  • Added an explicit RunsRefreshResponse helper type in Runboard.compare-route-ui-states.test.tsx so the deferred listCorpusRuns resolver stops collapsing to never
  • Tightened the Project ID control typing to HTMLInputElement in the compare-route UI states suite
  • Revalidated both suites and confirmed no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-01, post-Phase 20)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-ui-states.test.tsx src\\__tests__\\Runboard.states.core.test.tsx --reporter=verbose -> 8/8 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 7 (down from 9)
  • The next likely candidates are Runboard.states.test.tsx and Runboard.selected-run-operator-surfaces.test.tsx; telemetry and broader structural suites remain the noisier lane

Phase 21: Runboard Test @ts-nocheck Reduction V (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.selected-run-operator-surfaces.test.tsx
  • Fixed the duplicated mocked-client key pattern in that suite
  • Revalidated the suite and confirmed no detached node.exe processes remained after the final tsc and Vitest loop
  • Deferred src/__tests__/Runboard.states.test.tsx for a later pass because it is the next larger mixed-debt target, not the next cheap normalization slice

Validation Snapshot (2026-04-01, post-Phase 21)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.selected-run-operator-surfaces.test.tsx --reporter=verbose -> 1/1 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 6 (down from 7)
  • Remaining noisy candidates are:
    • Runboard.states.test.tsx
    • Runboard.structural-controls.test.tsx
    • Runboard.schema-pack.test.tsx
    • Runboard.reproducibility-replay.test.tsx
    • Runboard.advanced-verify-suite.test.tsx
    • Runboard.telemetry-regression.test.tsx

Phase 22: Runboard Test @ts-nocheck Reduction VI (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.structural-controls.test.tsx
    • src/__tests__/Runboard.schema-pack.test.tsx
  • Fixed the duplicated mocked-client key pattern in both suites
  • Revalidated the pair and confirmed no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-01, post-Phase 22)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.structural-controls.test.tsx src\\__tests__\\Runboard.schema-pack.test.tsx --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 4 (down from 6)
  • Remaining noisy candidates are now:
    • Runboard.states.test.tsx
    • Runboard.reproducibility-replay.test.tsx
    • Runboard.advanced-verify-suite.test.tsx
    • Runboard.telemetry-regression.test.tsx

Phase 23: Runboard Test @ts-nocheck Reduction VII (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.reproducibility-replay.test.tsx
    • src/__tests__/Runboard.advanced-verify-suite.test.tsx
  • Fixed the duplicated mocked-client key pattern in both suites
  • Restored the explicit dispatchScriptoriumCommand import in Runboard.advanced-verify-suite.test.tsx once the compiler bypass was removed and the hidden usage sites surfaced
  • Revalidated the pair and confirmed no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-01, post-Phase 23)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.reproducibility-replay.test.tsx src\\__tests__\\Runboard.advanced-verify-suite.test.tsx --reporter=verbose -> 23/23 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 2 (down from 4)
  • Remaining noisy candidates are now:
    • Runboard.states.test.tsx
    • Runboard.telemetry-regression.test.tsx

Phase 24: Runboard Test @ts-nocheck Reduction VIII (Complete, 2026-04-01)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.states.test.tsx
  • Fixed the duplicated mocked-client key pattern in the suite
  • Repaired a small number of concrete TypeScript issues that surfaced after removing the bypass:
    • corrected four over-arity calls into local lockstep sample helpers
    • forced the deferred resolveRuns callback through an explicit callable cast in the compare-route loading test
    • removed two over-narrow literal comparison traps in compare-route selection tests
    • typed the remaining Status / Kind / Project ID DOM reads as HTMLSelectElement / HTMLInputElement
    • added the missing queueWaitMs: number annotation in the deterministic mock helper
  • Revalidated the changed regions and confirmed no detached node.exe processes remained after the final tsc and Vitest loop
  • The full Runboard.states.test.tsx suite remains an impractical runtime validation target in this shell; a direct whole-file Vitest run exceeded long timeout budgets twice, so validation for this slice was done with the affected tests by title instead of pretending the monolith is a good targeted suite boundary

Validation Snapshot (2026-04-01, post-Phase 24)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "shows loading-state tooltips for compare-route filter controls while run refresh is in progress|executes compare-route run selection from keyboard shortcut G|executes compare-route artifact selection from command bus action|prioritizes run-refresh blocker messaging for broad clear-filter commands while run refresh is in progress|prioritizes run-refresh blocker messaging for broad clear-filter keyboard shortcut Shift+S while run refresh is in progress|syncs run filter changes back into replay query parameters|rehydrates run filters from URL navigation changes|validates step 453 \\(EJBC\\) advanced/gate pre reverseWindowSequence:true deterministic mock" --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard test files still using @ts-nocheck: 1 (down from 2)
  • Remaining noisy candidate is now:
    • Runboard.telemetry-regression.test.tsx

Phase 25: Runboard Test @ts-nocheck Reduction IX (Complete, 2026-04-02)

  • Removed blanket @ts-nocheck from:
    • src/__tests__/Runboard.telemetry-regression.test.tsx
  • Fixed the duplicated mocked-client key pattern in the suite
  • Revalidated the suite and confirmed no detached node.exe processes remained after the final tsc, Vitest, and build loop
  • This closes the Runboard test-lane compiler-bypass sweep: no Runboard*.test.tsx files remain under blanket @ts-nocheck

Validation Snapshot (2026-04-02, post-Phase 25)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.telemetry-regression.test.tsx --reporter=verbose -> 2/2 pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • npm run sentrux:source-only -> pass, quality 5413

Metric Update:

  • Runboard test files still using @ts-nocheck: 0
  • The remaining refactor lane is now cleanup/organization, not compiler-bypass debt in Runboard tests

Phase 26: Runboard State Monolith Split I (Complete, 2026-04-02)

  • Extracted the replay/filter URL cluster out of the giant state suite into:
    • src/__tests__/Runboard.replay-query-params.test.tsx
  • Removed the moved tests from:
    • src/__tests__/Runboard.states.test.tsx
  • Trimmed the now-unused router imports from Runboard.states.test.tsx after the extraction
  • Kept the moved coverage intact:
    • hydrate run filters from replay query parameters on first load
    • sync filter edits back into replay query parameters
    • rehydrate filters from URL navigation changes
    • sync selected run/artifact into replay query parameters when route focus auto-resolves
  • Revalidated the extracted suite and confirmed no detached node.exe processes remained after the final tsc and Vitest loop

Validation Snapshot (2026-04-02, post-Phase 26)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.replay-query-params.test.tsx --reporter=verbose -> 4/4 pass

Metric Update:

  • The Runboard replay/query-parameter surface now has its own bounded validation file
  • Runboard.states.test.tsx remains the major monolith, but it is smaller and the replay/filter cluster is no longer trapped inside it

Phase 27: Runboard State Monolith Split II (Complete, 2026-04-02)

  • Extracted the compare-route artifact blocker/action cluster out of the giant state suite into:
    • src/__tests__/Runboard.compare-route-artifact-blockers.test.tsx
  • Removed the moved tests from:
    • src/__tests__/Runboard.states.test.tsx
  • Kept the moved coverage intact:
    • blocks copy-artifact-uri route action when live mapped integrity count drifted from compare handoff
    • shows artifact inventory loading blocker for URI-based route artifact actions while route details load
    • surfaces blocker-specific URI-missing guidance with a route-details refresh quick action
    • surfaces route-details refresh quick action for no-route-artifact blocked states
    • disables route-details refresh quick action for no-route-artifact states while run refresh is in progress
  • Attempted the adjacent refresh-concurrency seam immediately afterward, but reverted that split because the isolated command-dispatch tests still have hidden timing/harness coupling when separated from the monolith

Validation Snapshot (2026-04-02, post-Phase 27)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.replay-query-params.test.tsx src\\__tests__\\Runboard.compare-route-artifact-blockers.test.tsx --reporter=verbose -> 9/9 pass

Metric Update:

  • Runboard.states.test.tsx is smaller again, and two coherent route-state surfaces now have bounded suites
  • The next safe step is not another blind split; it is either a shared Runboard test harness extraction or a more surgical concurrency-specific helper before retrying the refresh-concurrency seam

Phase 28: Runboard Harness Foundation (Complete, 2026-04-02)

  • Added a shared Runboard test harness at:
    • src/__tests__/helpers/runboard-test-harness.tsx
  • Centralized the common mocked client surface and notifications mocks there
  • Centralized default beforeEach seeding for:
    • runs
    • run summary
    • artifacts
    • audit events
    • integrity report
  • Migrated the extracted bounded suites onto the shared harness:
    • src/__tests__/Runboard.replay-query-params.test.tsx
    • src/__tests__/Runboard.compare-route-artifact-blockers.test.tsx
  • This reduces duplicated service-mock boilerplate and prepares the remaining Runboard.states.test.tsx seams for safer future extraction

Validation Snapshot (2026-04-02, post-Phase 28)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.replay-query-params.test.tsx src\\__tests__\\Runboard.compare-route-artifact-blockers.test.tsx --reporter=verbose -> 9/9 pass

Metric Update:

  • The bounded Runboard suites no longer each carry a full duplicate mock/bootstrap block
  • The next refactor target remains the refresh-concurrency seam, but it should be retried only after extracting a more explicit concurrency helper or command-bus harness

Phase 29: Compare-Route Action Blocker Extraction (Complete, 2026-04-02)

  • Extracted the stable compare-route blocker-display/prioritization cluster out of:
    • src/__tests__/Runboard.states.test.tsx
  • New bounded suite:
    • src/__tests__/Runboard.compare-route-action-blockers.test.tsx
  • Moved coverage includes:
    • run-refresh-in-progress blocker surface
    • integrity-refresh-loading blocker surface
    • blocker-priority promotion from integrity-loading to run-action-in-progress
    • integrity-refresh-required blocker surface after failed auto-refresh
  • Attempted to extract the adjacent duplicate-dispatch concurrency tests in the same pass, but rolled those back into Runboard.states.test.tsx because they still depend on the monolith timing surface.
  • The durable boundary for now is:
    • blocker display and prioritization: extracted
    • duplicate-dispatch concurrency: still monolithic

Validation Snapshot (2026-04-02, post-Phase 29)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-action-blockers.test.tsx --reporter=verbose -> 4/4 pass

Metric Update:

  • Runboard.states.test.tsx is smaller again, but the next seam should be the stale-response cluster or a deeper command-bus/test-harness abstraction, not another direct concurrency split

Phase 30: Stale Response Guard Split (Partial, 2026-04-02)

  • Extracted the stale run-details response guards out of:
    • src/__tests__/Runboard.states.test.tsx
  • New bounded suite:
    • src/__tests__/Runboard.stale-response-guards.test.tsx
  • Extracted coverage includes:
    • stale run-details summary suppression when a newer run selection completes first
    • stale failed run-details suppression after a newer run selection succeeds
  • Intentionally kept the stale run-list refresh suppression case in:
    • src/__tests__/Runboard.states.test.tsx
  • Reason:
    • the filter-scoped run-list refresh case still couples to the monolith timing surface, while the two run-details cases behave cleanly under the shared harness

Validation Snapshot (2026-04-02, post-Phase 30)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.stale-response-guards.test.tsx --reporter=verbose -> 2/2 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "ignores stale run-list responses when a newer filter-scoped refresh completes first" --reporter=verbose -> 1/1 pass

Metric Update:

  • The stale-response seam is now on the right side of the line:
    • run-details stale guards: extracted
    • run-list stale refresh suppression: still monolithic by design

Phase 31: Queue-Health Tail Extraction (Complete, 2026-04-02)

  • Extracted the queue-health operator summary and deterministic parity tail out of:
    • src/__tests__/Runboard.states.test.tsx
  • New bounded suite:
    • src/__tests__/Runboard.queue-health-summary.test.tsx
  • Replaced the repeated tail-copy test pattern with:
    • shared renderRunboard(...)
    • shared buildRunSummaryShape(...)
    • it.each(...) for the deterministic parity cases
  • Extracted coverage includes:
    • the main queue-health operator summary rendering surface
    • deterministic parity checks for steps 453, 460-469

Validation Snapshot (2026-04-02, post-Phase 31)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.stale-response-guards.test.tsx src\\__tests__\\Runboard.queue-health-summary.test.tsx --reporter=verbose -> 14/14 pass

Metric Update:

  • Runboard.states.test.tsx is materially smaller again at the tail
  • The next sensible seam is either the URI-capable artifact readiness case or a deeper harness extraction for the remaining command-dispatch block, not another blind timing split

Phase 32: URI-Capable Artifact Readiness Extraction (Complete, 2026-04-02)

  • Extracted the URI-capable route artifact readiness case out of:
    • src/__tests__/Runboard.states.test.tsx
  • Moved it into:
    • src/__tests__/Runboard.compare-route-artifact-blockers.test.tsx
  • The extracted coverage proves:
    • route artifact action readiness stays ready when multiple candidate artifacts exist
    • URI-capable artifact selection wins over a ready artifact that lacks uri
    • copy-artifact action uses the actual URI-bearing route artifact instead of surfacing a false blocked state
  • Rewrote the extracted case against the shared Runboard harness instead of the old dynamic client import path

Validation Snapshot (2026-04-02, post-Phase 32)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-artifact-blockers.test.tsx --reporter=verbose -> 6/6 pass

Metric Update:

  • The compare-route artifact readiness/blocker surface is now more coherent in one bounded suite
  • Runboard.states.test.tsx is smaller again, and the remaining hard seam is still the duplicate-dispatch / same-tick concurrency block

Phase 33: Duplicate-Dispatch Guard Normalization (Complete, 2026-04-02)

  • Added a shared helper in:
    • src/__tests__/helpers/runboard-async-helpers.ts
  • New helper:
    • dispatchDuplicateScriptoriumCommand(...)
  • Attempted to extract the same-tick duplicate-dispatch guard cluster into its own bounded suite, but reverted that boundary after the isolated file reproduced persistent timeout/act churn across all five cases.
  • Kept the guard cluster in:
    • src/__tests__/Runboard.states.test.tsx
  • Rewired the retained monolith cases to use the shared helper instead of repeating the same inline double-dispatch wiring:
    • duplicate integrity refresh guard
    • duplicate retry guard
    • duplicate cancel guard
    • duplicate run-details refresh guard
    • duplicate run-list refresh guard

Validation Snapshot (2026-04-02, post-Phase 33)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> 5/5 pass

Metric Update:

  • The duplicate-dispatch timing seam is still monolithic by design
  • The duplication inside that seam is lower now, and the remaining next step is a deeper concurrency harness if this block is ever split again

Phase 34: Editor-Context Handoff Extraction (Complete, 2026-04-02)

  • Confirmed the editor-handoff/query-context hygiene seam is now fully extracted out of:
    • src/__tests__/Runboard.states.test.tsx
  • Bounded suite:
    • src/__tests__/Runboard.editor-context-handoff.test.tsx
  • Coverage isolated there now includes:
    • invalid compare-issue query field suppression for editor links and copied route metadata
    • explicit compare_issue_filter_mode=all sanitation without carrying stale issue payload fields
    • suggested/selected run context precedence over stale query run/artifact ids
    • suggested-run project scope fallback when no explicit query project exists
    • stale query run/artifact suppression when no live run context exists
    • query-run project scope reuse when the query run is still live
    • compare-route context preservation after route-focus run selection updates URL state

Validation Snapshot (2026-04-02, post-Phase 34)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.editor-context-handoff.test.tsx --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the editor-handoff/query-context hygiene cluster
  • The next safe extraction target should again avoid the duplicate-dispatch timing seam and prefer another deterministic route-state cluster

Phase 35: Compare-Route Duplicate Coverage Retirement (Complete, 2026-04-02)

  • Promoted the stable remaining focus parity case into:
    • src/__tests__/Runboard.compare-route-focus-actions.test.tsx
  • Added there:
    • inactive-route focus command blocker
  • Kept the timing-sensitive shortcut blocker in:
    • src/__tests__/Runboard.states.test.tsx
  • Reason:
    • the shortcut F blocker remains stable in the monolith but not under the isolated bounded-suite timing surface
  • Removed duplicate compare-route navigation/action coverage from:
    • src/__tests__/Runboard.states.test.tsx
  • Retired monolith copies already owned by bounded suites:
    • filter-application banner flow
    • compare document link banner flow
    • primary/secondary doc command and shortcut opens
    • mapped/route doc command and shortcut opens
    • editor handoff command and shortcut opens
    • focus command and run-action command/shortcut flows

Validation Snapshot (2026-04-02, post-Phase 35)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-actions.test.tsx src\\__tests__\\Runboard.compare-route-doc-opens.test.tsx src\\__tests__\\Runboard.compare-route-focus-actions.test.tsx --reporter=verbose -> 40/40 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "blocks compare-route focus shortcut F while run-details refresh is in progress" --reporter=verbose -> 1/1 pass

Metric Update:

  • Runboard.states.test.tsx now retains only compare-route cases that are still monolith-coupled or intentionally timing-bound
  • the compare-route navigation/focus/action surface has a clearer single-owner test split

Phase 36: Compare-Route Recovery Quick-Action Extraction (Complete, 2026-04-02)

  • Extracted the deterministic no-route-run recovery quick-action cluster into:
    • src/tests/Runboard.compare-route-recovery-quick-actions.test.tsx
  • Removed the extracted stable filter-recovery cases from:
    • src/tests/Runboard.states.test.tsx
  • Bounded suite now owns:
    • clear-project-filter recovery when only project scope is narrowed
    • reset-route-filters recovery when route filters are narrowed
    • clear-status-filter recovery
    • clear-kind-filter recovery
    • mixed project+status recovery guidance
    • mixed project+kind recovery guidance
  • Kept these still in the monolith by design:
    • shows disabled quick-action note when no-route-run recovery actions are temporarily blocked by active run refresh
    • disables reset-route-filters quick action while run refresh is already in progress
  • Reason:
    • those cases still couple to the live refresh-in-progress timing surface

Validation Snapshot (2026-04-02, post-Phase 36)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.compare-route-recovery-quick-actions.test.tsx src\tests\Runboard.states.test.tsx -t "no-route-run|reset-route-filters quick action while run refresh is already in progress" --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard.states.test.tsx is smaller again and now retains only the refresh-in-progress recovery cases from this cluster
  • the no-route-run filter-recovery guidance surface now has a single bounded test owner

Phase 37: Compare-Route Guidance Heuristic Extraction (Complete, 2026-04-02)

  • Extracted the deterministic compare-route guidance heuristic cluster into:
    • src/tests/Runboard.compare-route-guidance-heuristics.test.tsx
  • Removed the extracted guidance cases from:
    • src/tests/Runboard.states.test.tsx
  • Bounded suite now owns:
    • unresolved-entity-reference addition routes biasing to task-focused suggested filters
    • unknown-document-citations addition routes staying compile-focused for different-kind issues
    • semantic-drift unknown-document-citations routes remaining inspection-first in the action panel
    • explicit no-route-matching-run readiness guidance and blocker surface
  • Kept these still in the monolith by design:
    • shows disabled quick-action note when no-route-run recovery actions are temporarily blocked by active run refresh
    • disables reset-route-filters quick action while run refresh is already in progress
  • Reason:
    • those cases still belong to the active refresh / recovery timing surface, not the deterministic guidance heuristic surface

Validation Snapshot (2026-04-02, post-Phase 37)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.compare-route-guidance-heuristics.test.tsx src\tests\Runboard.states.test.tsx -t "compare-route guidance heuristics|shows disabled quick-action note when no-route-run recovery actions are temporarily blocked by active run refresh|disables reset-route-filters quick action while run refresh is already in progress" --reporter=verbose -> 6/6 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic compare-route guidance heuristic cluster
  • the remaining recovery residue is more clearly the refresh-coupled timing surface

Phase 38: Compare-Route Focus Control Extraction (Complete, 2026-04-02)

  • Extracted the deterministic compare-route focus-control cluster into:
    • src/tests/Runboard.compare-route-focus-controls.test.tsx
  • Removed the extracted focus-control cases from:
    • src/tests/Runboard.states.test.tsx
  • Bounded suite now owns:
    • suggested route-run selection quick action availability for route_run_not_selected
    • full apply-route-focus flow when a suggested run and artifact can be aligned
    • route-focus control state when run alignment occurs without explicit route-filter preselection
    • disabled/title semantics for select-run vs. select-artifact after route alignment
    • no-route-matching-run disabled state for apply-route-focus
  • Kept these timing-coupled cases in the monolith by design:
    • disables select-route-run quick action while run refresh is already in progress
    • disables apply-route-focus while route artifact inventory is loading after route-run alignment
  • Important normalization:
    • one extracted case had stale expectations and was updated to the live contract instead of preserving an over-specified disabled state
    • the retained monolith timing cases were normalized to stop asserting a transient pre-refresh enabled state that the live surface does not guarantee

Validation Snapshot (2026-04-02, post-Phase 38)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.compare-route-focus-controls.test.tsx src\tests\Runboard.states.test.tsx -t "compare-route focus controls|disables select-route-run quick action while run refresh is already in progress|disables apply-route-focus while route artifact inventory is loading after route-run alignment" --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic compare-route focus-control cluster
  • the remaining residue is increasingly the real refresh/concurrency surface rather than generic compare-route behavior
  • Extracted the deterministic compare-route replay-link and metadata-only route-context cluster into:
    • src/tests/Runboard.compare-route-replay-links.test.tsx
  • Removed the extracted replay-link cases from:
    • src/tests/Runboard.states.test.tsx
  • Bounded suite now owns:
    • replay-link copy via command bus
    • replay-link copy via keyboard shortcut L
    • replay-link open via command bus
    • replay-link open via keyboard shortcut Shift+L
    • inactive-route blockers for replay-link copy/open
    • metadata-only compare routes keeping route-context copy available without document links
  • Important normalization:
    • the metadata-only route-context payload and the explicit replay-link actions do not share the same artifact-id contract
    • the copied route-context payload now asserts the live artifact_id: null replay payload snapshot, while the explicit replay-link copy/open actions still assert the artifact-bearing replay link

Validation Snapshot (2026-04-02, post-Phase 39)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.compare-route-replay-links.test.tsx --reporter=verbose -> 7/7 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic replay-link and metadata-only route-context block
  • the remaining tail is even more concentrated on duplicate-dispatch and stale-response timing behavior

Phase 40: Stale Run-List Guard Extraction (Complete, 2026-04-02)

  • Moved the deterministic stale run-list guard case into:
    • src/tests/Runboard.stale-response-guards.test.tsx
  • Removed the extracted stale run-list case from:
    • src/tests/Runboard.states.test.tsx
  • Stale-response guard suite now owns:
    • stale successful run-details responses ignored after newer run selection
    • stale failed run-details responses ignored after newer run selection
    • stale run-list responses ignored after a newer filter-scoped refresh completes first

Validation Snapshot (2026-04-02, post-Phase 40)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.stale-response-guards.test.tsx --reporter=verbose -> 3/3 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic stale run-list guard seam
  • the remaining monolith tail is now even more heavily concentrated on duplicate-dispatch and same-tick timing behavior

Phase 41: Run-Action-In-Progress Blocker Extraction (Complete, 2026-04-02)

  • Moved the deterministic compare-route run_action_in_progress blocker cluster into:
    • src/tests/Runboard.compare-route-action-blockers.test.tsx
  • Removed the extracted blocker cases from:
    • src/tests/Runboard.states.test.tsx
  • Bounded blocker suite now additionally owns:
    • run-action-in-progress recovery guidance while route retry is applying
    • blocker-priority preservation while apply-triggered run refresh is in flight
    • global run-apply blocker coverage for non-retry compare-route actions
  • Important normalization:
    • the same-tick duplicate-dispatch guard block was restored to Runboard.states.test.tsx
    • that seam is intentionally retained in the monolith because isolated extraction still produces unstable async churn and false timeouts

Validation Snapshot (2026-04-02, post-Phase 41)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.compare-route-action-blockers.test.tsx --reporter=verbose -> 7/7 pass
  • cmd /c .\node_modules\.bin\vitest.cmd run src\tests\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> 5/5 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic run_action_in_progress blocker cluster
  • the remaining monolith residue is now more clearly the true same-tick duplicate-dispatch and refresh-concurrency surface

Phase 42: Compare-Route Guard Helper Consolidation (Complete, 2026-04-02)

  • Moved the remaining pure compare-route guard/helper tests out of:
    • src/__tests__/Runboard.states.test.tsx
  • Consolidated them into the existing bounded helper owner:
    • src/__tests__/runboard-compare-route-guidance.test.ts
  • Added coverage there for:
    • retryable run-status parity
    • stale-selected route-details target resolution
    • compare-route run execution guard evaluation
    • compare-route artifact execution guard evaluation
  • Important normalization:
    • no async/render timing cases were moved in this slice
    • the remaining Runboard.states.test.tsx tail stays focused on the live same-tick concurrency surface

Validation Snapshot (2026-04-02, post-Phase 42)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\runboard-compare-route-guidance.test.ts --reporter=verbose -> 37/37 pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the deterministic compare-route guard helper block
  • the compare-route pure helper surface now has a single bounded owner instead of split coverage across the monolith and helper suite

Phase 43: Compare-Route Guidance Monolith Retirement (Complete, 2026-04-02)

  • Moved the remaining pure compare-route guidance assertion block out of:
    • src/__tests__/Runboard.states.test.tsx
  • Consolidated it into the existing bounded helper suite:
    • src/__tests__/runboard-compare-route-guidance.test.ts
  • The migrated block now keeps the larger wording/quick-action inference matrix in the same file as the rest of the compare-route pure helper coverage.
  • Important normalization:
    • no live async/render timing cases moved in this slice
    • the duplicate-dispatch same-tick block remained in Runboard.states.test.tsx and was revalidated there after the move

Validation Snapshot (2026-04-02, post-Phase 43)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\runboard-compare-route-guidance.test.ts --reporter=verbose -> 38/38 pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> 5/5 pass

Metric Update:

  • Runboard.states.test.tsx no longer mixes the large compare-route pure guidance matrix with the timing/concurrency residue
  • the remaining monolith tail is more explicitly the same-tick duplicate-dispatch and refresh-race surface

Phase 44: Duplicate-Dispatch Monolith Helper Reduction (Complete, 2026-04-02)

  • Reduced duplication inside the retained same-tick duplicate-dispatch block in:
    • src/__tests__/Runboard.states.test.tsx
  • Added local helper coverage/support for the monolith-only timing seam:
    • buildDuplicateDispatchRun(...)
    • seedDuplicateDispatchRuns(...)
    • expectSingleDuplicateDispatchGuard(...)
    • resolveDuplicateDispatchDeferred(...)
  • Important normalization:
    • this was intentionally not another extraction
    • the same-tick duplicate-dispatch cases remain in the monolith because that boundary is still unstable when isolated

Validation Snapshot (2026-04-02, post-Phase 44)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> 5/5 pass

Metric Update:

  • The monolith timing seam is smaller and less repetitive without pretending to be a clean split
  • The next worthwhile step is a deeper concurrency harness or a different deterministic seam, not another forced extraction of duplicate-dispatch guards

Phase 45: Compare-Route Copy Actions Extraction (Complete, 2026-04-02)

  • Extracted the deterministic compare-route copy/payload/action cluster out of:
    • src/__tests__/Runboard.states.test.tsx
  • Moved it into a new bounded suite:
    • src/__tests__/Runboard.compare-route-copy-actions.test.tsx
  • The new bounded suite now owns:
    • deferred route-focus artifact URI copy
    • mapped-integrity payload copy from the remediation action panel
    • route document context copy plus replay-link copy/open assertions
    • extended graph-diff compare context replay metadata assertions
    • graph-diff triage copy via command bus and keyboard shortcut
    • route-doc-context copy via command bus and keyboard shortcut
    • mapped-issue payload copy via command bus and keyboard shortcut
    • inactive compare-route blocker coverage for those copy surfaces
  • Important normalization:
    • this slice deliberately moved the deterministic copy/payload/action surface only
    • the same-tick duplicate-dispatch and refresh-race seam remains in Runboard.states.test.tsx

Validation Snapshot (2026-04-02, post-Phase 45)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-copy-actions.test.tsx --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the compare-route copy/payload/action cluster
  • the remaining monolith tail is even more concentrated on true timing/concurrency residue

Phase 46: Project-Filter Reset/Clear Ownership Normalization (Complete, 2026-04-02)

  • Moved the remaining deterministic project-filter reset/clear cases out of:
    • src/__tests__/Runboard.states.test.tsx
  • Rehomed them into the existing bounded owners:
    • src/__tests__/Runboard.compare-route-filter-reset.test.tsx
    • src/__tests__/Runboard.compare-route-clear-filters.test.tsx
  • The moved coverage now lives with the rest of the route-filter behavior:
    • resetting route filters from the compare-route panel clears the project filter alongside status/kind reset
    • the compare-route clear-project-filter control stays disabled when the project filter is already empty
    • clearing the compare-route project filter from the filter panel preserves status/kind selections while widening project scope
  • Important normalization:
    • no refresh-in-progress timing cases moved in this slice
    • the remaining Runboard.states.test.tsx residue is still the deliberate timing/concurrency surface

Validation Snapshot (2026-04-02, post-Phase 46)

  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-filter-reset.test.tsx src\\__tests__\\Runboard.compare-route-clear-filters.test.tsx --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx no longer owns the project-filter reset/clear behavior that already had bounded owners
  • the monolith tail is slimmer without losing compare-route filter coverage locality

Phase 47: Route-Focus and Drifted-Retry Ownership Realignment (Complete, 2026-04-02)

  • Moved the remaining deterministic route-focus and drifted-retry cases out of:
    • src/__tests__/Runboard.states.test.tsx
  • Rehomed them into the existing bounded owners:
    • src/__tests__/Runboard.compare-route-action-blockers.test.tsx
    • src/__tests__/Runboard.compare-route-focus-controls.test.tsx
  • The bounded owners now additionally cover:
    • drifted integrity mapping blocking route retry after compare handoff
    • select-route-run quick action disabled while run refresh is already in progress
    • apply-route-focus disabled while route artifact inventory is still loading after route-run alignment
  • Important normalization:
    • no same-tick duplicate-dispatch or refresh-race cases moved in this slice
    • the remaining Runboard.states.test.tsx tail is still the deliberate timing/concurrency seam

Validation Snapshot (2026-04-02, post-Phase 47)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-action-blockers.test.tsx src\\__tests__\\Runboard.compare-route-focus-controls.test.tsx --reporter=verbose -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx no longer owns three more deterministic route-focus/action cases
  • the monolith tail is now even more explicitly the same-tick duplicate-dispatch and refresh-race residue

Phase 48: Duplicate-Dispatch Timing Guard Stabilization (Complete, 2026-04-02)

  • Kept the same-tick duplicate-dispatch seam in:
    • src/__tests__/Runboard.states.test.tsx
  • Tightened the shared timing helper instead of forcing another extraction:
    • expectSingleDuplicateDispatchGuard(...) now accepts one or more valid blocker messages
  • Important normalization:
    • the duplicate run-details refresh case can legitimately surface either the narrower run-details blocker or the broader run-refresh blocker under same-tick timing races
    • the helper now encodes that live contract explicitly instead of assuming one fixed info message

Validation Snapshot (2026-04-02, post-Phase 48)

  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> pass

Metric Update:

  • the retained monolith timing seam is still monolithic by design, but it is less flaky under grouped duplicate-dispatch validation

Phase 49: Duplicate-Dispatch Helper Extraction (Complete, 2026-04-02)

  • Extracted the remaining duplicate-dispatch support machinery out of:
    • src/__tests__/Runboard.states.test.tsx
  • Moved it into a dedicated helper module:
    • src/__tests__/helpers/runboard-duplicate-dispatch-helpers.tsx
  • The helper module now owns:
    • duplicate-dispatch runboard rendering
    • seeded run payload construction
    • single-dispatch guard assertion support
    • deferred same-tick resolution flushing
  • Important normalization:
    • the duplicate-dispatch timing tests remain in Runboard.states.test.tsx
    • only the support code moved; no timing coverage was rehomed or weakened

Validation Snapshot (2026-04-02, post-Phase 49)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "prevents duplicate" --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx owns less support machinery and more clearly reflects the remaining same-tick timing seam

Phase 50: Surface-State Default Seeding Extraction (Complete, 2026-04-02)

  • Extracted the large default runboard surface-seeding payload out of:
    • src/__tests__/Runboard.states.test.tsx
  • Moved it into a dedicated helper module:
    • src/__tests__/helpers/runboard-surface-defaults.ts
  • The helper now owns the default mock telemetry/data surface for:
    • schema-pack portability
    • schema-pack manager
    • structural query / transaction / merge
    • engine capability and gate baselines
    • replay / novelty / reproducibility defaults
    • Excalidraw policy drift and scene-policy audit defaults
  • Important normalization:
    • the tests themselves stayed in Runboard.states.test.tsx
    • only the large seeded default payload moved; behavioral coverage was revalidated against both early state tests and the retained duplicate-dispatch timing seam

Validation Snapshot (2026-04-02, post-Phase 50)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "shows standardized empty state|renders schema-pack|prevents duplicate" --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx is materially smaller at the setup layer
  • the file now carries less default-data scaffolding and more directly reflects the remaining test logic

Phase 51: Surface Harness Consolidation (Complete, 2026-04-02)

  • Promoted src/__tests__/helpers/runboard-surface-harness.ts into the canonical owner for:
    • shared Runboard surface client mock creation
    • shared notifications mock creation
    • shared base reset/bootstrap for the broad Runboard surface suites
  • Rewired src/__tests__/Runboard.states.test.tsx to consume that surface harness directly instead of carrying a private top-level mock object plus inline base reset block.
  • Rewired src/__tests__/helpers/runboard-test-harness.tsx to consume the same surface-harness mock objects and reset helper instead of duplicating the mock definitions.
  • Important normalization:
    • no behavior-bearing tests moved in this slice
    • no timing/concurrency coverage changed ownership
    • this was ownership consolidation of the mock/bootstrap layer only
    • the cancel-path duplicate-dispatch case now waits for the cancel action to be enabled before firing same-tick commands, matching the live selected-run readiness contract

Validation Snapshot (2026-04-02, post-Phase 51)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "shows standardized empty state|renders schema-pack|prevents duplicate" --reporter=verbose -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-replay-links.test.tsx --reporter=verbose -> pass

Metric Update:

  • Runboard.states.test.tsx now owns less top-level mock/bootstrap scaffolding
  • runboard-test-harness.tsx no longer duplicates the same surface mock definitions

Phase 52: Compare-Route Actions Panel Helper Extraction (Complete, 2026-04-02)

  • Extracted the repeated "resolve the last compare-remediation actions panel" lookup into:
    • src/__tests__/helpers/runboard-compare-route-panel-helpers.ts
  • Rewired the current owners to use that helper:
    • src/__tests__/Runboard.states.test.tsx
    • src/__tests__/Runboard.compare-route-copy-actions.test.tsx
    • src/__tests__/Runboard.editor-context-handoff.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • this slice only removed repeated compare-route actions-panel lookup boilerplate

Validation Snapshot (2026-04-02, post-Phase 52)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "shows standardized empty state|renders schema-pack|prevents duplicate" --reporter=verbose -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-copy-actions.test.tsx src\\__tests__\\Runboard.editor-context-handoff.test.tsx --reporter=verbose -> pass

Metric Update:

  • compare-route actions-panel lookup now has a shared bounded owner instead of being reimplemented inline across multiple Runboard suites

Phase 53: Generic Runboard Route Render Helper Extraction (Complete, 2026-04-02)

  • Extracted the repeated Runboard route render shell into:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired the current owners to use that helper:
    • src/__tests__/helpers/runboard-duplicate-dispatch-helpers.tsx
    • src/__tests__/Runboard.states.test.tsx
    • src/__tests__/Runboard.editor-context-handoff.test.tsx
  • Important normalization:
    • the helper accepts the rendered Runboard element from the caller instead of importing Runboard directly
    • that preserves mock-initialization order for suites that rely on imported harness-side vi.mock(...) registration
    • no behavior-bearing assertions moved in this slice

Validation Snapshot (2026-04-02, post-Phase 53)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "shows standardized empty state|renders schema-pack|prevents duplicate" --reporter=verbose -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.editor-context-handoff.test.tsx --reporter=verbose -> pass

Metric Update:

  • generic Runboard route rendering now has a single helper owner
  • the duplicate-dispatch and editor-context-handoff owners no longer carry their own route render shell

Phase 54: Compare-Route Helper Adoption Across Bounded Suites (Complete, 2026-04-02)

  • Expanded the shared compare-route panel helper surface in:
    • src/__tests__/helpers/runboard-compare-route-panel-helpers.ts
    • added sync and async owners for actions/focus panel lookup
  • Rewired these bounded compare-route suites onto the shared route-render and panel helper owners:
    • src/__tests__/Runboard.compare-route-focus-controls.test.tsx
    • src/__tests__/Runboard.compare-route-action-blockers.test.tsx
    • src/__tests__/Runboard.compare-route-recovery-quick-actions.test.tsx
    • src/__tests__/Runboard.compare-route-guidance-heuristics.test.tsx
    • src/__tests__/Runboard.compare-route-replay-links.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated Runboard route-shell and compare-route panel lookup boilerplate across bounded owners

Validation Snapshot (2026-04-02, post-Phase 54)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-focus-controls.test.tsx src\\__tests__\\Runboard.compare-route-action-blockers.test.tsx src\\__tests__\\Runboard.compare-route-recovery-quick-actions.test.tsx src\\__tests__\\Runboard.compare-route-guidance-heuristics.test.tsx src\\__tests__\\Runboard.compare-route-replay-links.test.tsx --reporter=verbose -> pass

Metric Update:

  • compare-route focus/actions panel lookup now has a single shared owner
  • bounded compare-route suites no longer each carry their own route render shell

Phase 55: Browser Mock Helper Extraction For Bounded Runboard Suites (Complete, 2026-04-02)

  • Extracted shared browser-side test scaffolding into:
    • src/__tests__/helpers/runboard-browser-mocks.ts
  • Rewired these bounded suites onto that shared browser mock owner:
    • src/__tests__/Runboard.editor-context-handoff.test.tsx
    • src/__tests__/Runboard.compare-route-replay-links.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated window.open and clipboard installation boilerplate from bounded compare-route owners

Validation Snapshot (2026-04-02, post-Phase 55)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.editor-context-handoff.test.tsx src\\__tests__\\Runboard.compare-route-replay-links.test.tsx --reporter=verbose -> pass

Metric Update:

  • bounded editor/replay-link suites now share one browser mock owner
  • repeated clipboard/open setup is no longer duplicated across those suites

Phase 56: Window-Open Helper Adoption Across Bounded Runboard Owners (Complete, 2026-04-02)

  • Reused the shared browser mock owner from:
    • src/__tests__/helpers/runboard-browser-mocks.ts
  • Rewired these bounded owners to use installRunboardWindowOpenMock() instead of inline window.open spy setup:
    • src/__tests__/Runboard.compare-route-action-blockers.test.tsx
    • src/__tests__/Runboard.compare-route-doc-opens.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated window.open installation boilerplate from bounded Runboard compare-route owners

Validation Snapshot (2026-04-02, post-Phase 56)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-action-blockers.test.tsx src\\__tests__\\Runboard.compare-route-doc-opens.test.tsx --reporter=verbose -> pass

Metric Update:

  • bounded compare-route open/action owners now share the same window.open mock installation helper
  • repeated inline browser mock setup decreased again without touching the retained timing monolith

Phase 57: Browser Mock Helper Adoption Across Compare-Route Copy/Artifact Owners (Complete, 2026-04-02)

  • Reused the shared browser mock owner from:
    • src/__tests__/helpers/runboard-browser-mocks.ts
  • Rewired these bounded owners onto the shared clipboard/browser mock helpers:
    • src/__tests__/Runboard.compare-route-copy-actions.test.tsx
    • src/__tests__/Runboard.compare-route-artifact-blockers.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated clipboard and clipboard-plus-open installation boilerplate from bounded compare-route owners

Validation Snapshot (2026-04-02, post-Phase 57)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.compare-route-copy-actions.test.tsx src\\__tests__\\Runboard.compare-route-artifact-blockers.test.tsx --reporter=verbose -> pass

Metric Update:

  • bounded compare-route copy/artifact owners now share the same clipboard/browser mock installation helpers
  • repeated inline browser mock setup decreased again without touching the retained timing monolith

Phase 58: Route-Render Helper Adoption Across Runboard States Integrity/Schema Chunk (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired the deterministic integrity/schema chunk in:
    • src/__tests__/Runboard.states.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 58)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "surfaces citation|surfaces missing-run-artifact|renders schema-pack portability|renders schema-pack manager telemetry|applies schema-pack preflight|surfaces blocked schema-pack apply" --reporter=verbose -> pass

Metric Update:

  • the deterministic integrity/schema block in Runboard.states now shares the same route render owner as other bounded Runboard suites
  • repeated inline route shell boilerplate decreased again without touching the retained timing monolith

Phase 59: Route-Render Helper Adoption Across Runboard States Structural/Engine/Policy Chunk (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired the deterministic structural/engine/policy chunk in:
    • src/__tests__/Runboard.states.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 59)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "renders structural query|renders structural transaction|renders structural merge|renders novelty gradient|renders adapter capability negotiation|renders ingestion/export manifest|renders observability/provenance|renders policy/arbitration|retains policy report telemetry|renders Excalidraw policy ops" --reporter=verbose -> pass

Metric Update:

  • the deterministic structural/engine/policy block in Runboard.states now shares the same route render owner as other bounded Runboard suites
  • repeated inline route shell boilerplate decreased again without touching the retained timing monolith

Phase 60: Route-Render Helper Adoption Across Runboard States Gate Toolkit Chunk (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired the deterministic gate toolkit block in:
    • src/__tests__/Runboard.states.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 60)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "renders engine gate panel|renders gate verify-suite panel|executes gate verify-suite toolkit|refreshes gate verify-suite report|executes gate verify-suite smoke subset|executes gate verify-suite stability smoke run|loads persisted gate verify-suite report|bootstraps verify-suite from persisted last|executes gate verify-suite stability packet|loads persisted gate verify-suite stability packet|opens gate verify-suite report JSON|opens last gate verify-suite report JSON|opens gate verify-suite stability JSON|opens last gate verify-suite stability JSON|loads persisted gate verify-suite report from keyboard shortcut N|loads persisted gate verify-suite stability packet from keyboard shortcut Shift\\+N" --reporter=verbose -> pass

Metric Update:

  • the deterministic gate toolkit block in Runboard.states now shares the same route render owner as other bounded Runboard suites
  • repeated inline route shell boilerplate decreased again without touching the retained timing monolith

Phase 61: Route-Render Helper Adoption Across Remaining Straightforward Gate Cue/Open Cases (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired the remaining straightforward gate cue/open cases in:
    • src/__tests__/Runboard.states.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 61)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "opens last gate verify-suite stability JSON from panel action|opens gate verify-suite report JSON from keyboard shortcut 1|opens last gate verify-suite report JSON from keyboard shortcut Shift\\+1|renders gate verify-suite telemetry summary|records gate verify-suite action cue with command-source metadata|records gate verify-suite action cue with panel-source metadata|surfaces persisted verify cue freshness hint in runboard header" --reporter=verbose -> pass

Metric Update:

  • the remaining straightforward gate cue/open cases in Runboard.states now share the same route render owner as other bounded Runboard suites
  • repeated inline route shell boilerplate decreased again without touching the rerender-heavy telemetry or retained timing monolith

Phase 62: Browser-Mock Helper Adoption Across Runboard States Gate Open-Action Cases (Complete, 2026-04-02)

  • Reused the shared browser mock owner from:
    • src/__tests__/helpers/runboard-browser-mocks.ts
  • Rewired the remaining straightforward gate open-action cases in:
    • src/__tests__/Runboard.states.test.tsx
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline window.open spy setup from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 62)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "opens gate verify-suite report JSON from command bus action|opens last gate verify-suite report JSON from command bus action|opens last gate verify-suite report JSON from panel action|opens gate verify-suite stability JSON from command bus action|opens last gate verify-suite stability JSON from command bus action|opens last gate verify-suite stability JSON from panel action|opens gate verify-suite report JSON from keyboard shortcut 1|opens last gate verify-suite report JSON from keyboard shortcut Shift\\+1" --reporter=verbose -> pass

Metric Update:

  • the remaining straightforward gate open-action cases in Runboard.states now share the same browser mock owner as bounded Runboard suites
  • repeated inline browser mock setup decreased again without touching the rerender-heavy telemetry or retained timing monolith

Phase 63: Browser/Route Helper Adoption Across Advanced Open-Action Cases and Compare-Editor Quick Action (Complete, 2026-04-02)

  • Reused the shared browser mock owner from:
    • src/__tests__/helpers/runboard-browser-mocks.ts
  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states owners:
    • advanced verify-suite open-action cases
    • compare remediation open editor quick action case
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline window.open spy setup and repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 63)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "opens advanced verify-suite report JSON from command bus action|opens last advanced verify-suite report JSON from command bus action|opens last advanced verify-suite report JSON from panel action|opens advanced verify-suite stability JSON from command bus action|opens last advanced verify-suite stability JSON from command bus action|opens last advanced verify-suite stability JSON from panel action|opens advanced verify-suite report JSON from keyboard shortcut 3|opens last advanced verify-suite stability JSON from keyboard shortcut Shift\\+4|offers an open-editor quick action from compare remediation run blockers" --reporter=verbose -> pass

Metric Update:

  • the advanced open-action cases and compare-editor quick action in Runboard.states now share the same browser and route helper owners as other bounded Runboard suites
  • repeated inline browser and route-shell boilerplate decreased again without touching the rerender-heavy telemetry or retained timing monolith

Phase 64: Route-Render Helper Adoption Across Advanced Deterministic Block and Immediate Engine Tail (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states owners:
    • advanced verify-suite deterministic action/bootstrap/telemetry cases
    • immediate gate-error / engine reproducibility / replay / filter-label cases
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route wrappers from the touched Runboard.states cases

Validation Snapshot (2026-04-02, post-Phase 64)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "renders advanced verify-suite panel|refreshes advanced verify-suite report from keyboard shortcut Shift\\+Z|executes advanced verify-suite smoke subset from Runboard control panel|executes advanced verify-suite smoke subset from keyboard shortcut Shift\\+W|executes advanced verify-suite stability packet from Runboard control panel|executes advanced verify-suite stability packet from keyboard shortcut Shift\\+X|loads persisted advanced verify-suite report from keyboard shortcut Q|loads persisted advanced verify-suite stability packet from keyboard shortcut Shift\\+Q|renders advanced verify-suite telemetry summary|records advanced verify-suite action cue with keyboard-source metadata|bootstraps advanced verify-suite from persisted last|retains gate report telemetry when gate refresh returns blocked/error response|renders minimal-engine reproducibility panel|surfaces git context warning when reproducibility report has unknown runtime identity|renders deterministic replay panel|exposes accessible labels for filter controls" --reporter=verbose -> pass

Metric Update:

  • the advanced deterministic block and immediate engine tail in Runboard.states now share the same route render owner as other bounded Runboard suites
  • repeated inline route shell boilerplate decreased again without touching the rerender-heavy telemetry ladders or retained timing monolith

Phase 65: Rerender-Capable Route Helper Adoption Across First Telemetry Tone-Transition Cluster (Complete, 2026-04-02)

  • Extended the shared route render owner in:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Added rerender support without changing existing call sites:
    • renderRunboardRoute(...) now returns the Testing Library render result
    • rerenderRunboardRoute(...) now owns the /runboard route shell for rerender-capable cases
  • Rewired the first telemetry rerender owners in:
    • src/__tests__/Runboard.states.test.tsx
      • transitions telemetry source/mode chip tones from fresh to watch to stale with seeded now values
      • transitions telemetry source/mode chip tones from fresh to watch to stale for command-palette dispatched recovery actions
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route rerender wrappers from the first bounded telemetry tone-transition cluster

Validation Snapshot (2026-04-02, post-Phase 65)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "transitions telemetry source/mode chip tones from fresh to watch to stale" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns both initial render and rerender shells for the first telemetry tone-transition cluster
  • repeated inline rerender route boilerplate decreased without touching the deeper telemetry ladders or retained same-tick timing monolith

Phase 66: Route Helper Adoption Across Telemetry Origin-Precedence and Drift Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • tracks telemetry last-source precedence under alternating command-palette and shortcut dispatch origins
    • maintains alternating-origin last-source precedence through watch/stale transitions with seeded drift
    • covers reset fallback then alternating-origin precedence and seeded watch/stale drift in one telemetry path
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next bounded telemetry precedence/drift cluster

Validation Snapshot (2026-04-02, post-Phase 66)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "tracks telemetry last-source precedence under alternating command-palette and shortcut dispatch origins|maintains alternating-origin last-source precedence through watch/stale transitions with seeded drift|covers reset fallback then alternating-origin precedence and seeded watch/stale drift in one telemetry path" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next telemetry precedence/drift render path in addition to the first tone-transition pair
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper lockstep telemetry ladders or retained same-tick timing monolith

Phase 67: Route Helper Adoption Across Telemetry Shortcut-Mirror and Asymmetry Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • mirrors reset fallback then alternating-origin precedence and seeded watch/stale drift with shortcut terminal origin
    • covers terminal-mode symmetry for execute/load-last across shortcut and palette origins after reset drift
    • asserts per-scope watch/stale asymmetry under mixed terminal modes with seeded age offsets
    • restores zero-baseline then replay parity after diverged stale windows
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next telemetry shortcut-mirror and asymmetry cluster

Validation Snapshot (2026-04-02, post-Phase 67)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "mirrors reset fallback then alternating-origin precedence and seeded watch/stale drift with shortcut terminal origin|covers terminal-mode symmetry for execute/load-last across shortcut and palette origins after reset drift|asserts per-scope watch/stale asymmetry under mixed terminal modes with seeded age offsets|restores zero-baseline then replay parity after diverged stale windows" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns another contiguous telemetry rerender mini-family beyond the first tone-transition and precedence/drift clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper lockstep/escalation ladders or retained same-tick timing monolith

Phase 68: Route Helper Adoption Across Post-Asymmetry Reset and Partial-Replay Telemetry Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • keeps telemetry reset idempotent across double reset and second replay after stale divergence
    • preserves scope-local counters during partial replay before full replay completion
    • resets interrupted partial replay and restarts scope counters cleanly before full completion
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next post-asymmetry reset and partial-replay telemetry cluster

Validation Snapshot (2026-04-02, post-Phase 68)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "keeps telemetry reset idempotent across double reset and second replay after stale divergence|preserves scope-local counters during partial replay before full replay completion|resets interrupted partial replay and restarts scope counters cleanly before full completion" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns another contiguous telemetry rerender slice beyond the tone-transition, precedence/drift, and shortcut-mirror/asymmetry clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper multi-cycle lockstep/escalation ladders or retained same-tick timing monolith

Phase 69: Route Helper Adoption Across First Stale-Reset-Cycle Telemetry Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • clears forced dual-scope stale status after reset and replay without stale carryover
    • maintains idempotent double stale-reset cycles with replay between cycles
    • preserves last-source precedence when second stale-reset cycle replays with palette terminal source
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first stale-reset-cycle telemetry cluster

Validation Snapshot (2026-04-02, post-Phase 69)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "clears forced dual-scope stale status after reset and replay without stale carryover|maintains idempotent double stale-reset cycles with replay between cycles|preserves last-source precedence when second stale-reset cycle replays with palette terminal source" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first stale-reset-cycle telemetry family in addition to the earlier tone-transition, precedence/drift, asymmetry, and partial-replay clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper counter-monotonicity and repeated-cycle ladders or retained same-tick timing monolith

Phase 70: Route Helper Adoption Across First Counter-Monotonicity Telemetry Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • keeps counter monotonicity exact across stale-reset cycles with alternating terminal-source flips
    • preserves exact counter monotonicity across triple stale-reset cycles with alternating terminal sources
    • preserves counter monotonicity across triple cycles when cycle-2 and cycle-3 are interrupted then reset
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first counter-monotonicity telemetry cluster

Validation Snapshot (2026-04-02, post-Phase 70)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "keeps counter monotonicity exact across stale-reset cycles with alternating terminal-source flips|preserves exact counter monotonicity across triple stale-reset cycles with alternating terminal sources|preserves counter monotonicity across triple cycles when cycle-2 and cycle-3 are interrupted then reset" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first counter-monotonicity telemetry family in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, and stale-reset-cycle clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper asymmetric repeated-cycle ladders or retained same-tick timing monolith

Phase 71: Route Helper Adoption Across First Asymmetric Repeated-Cycle Telemetry Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • maintains asymmetric terminal modes across triple-cycle interruptions without counter leakage
    • preserves asymmetric terminal modes with advanced-source flipbacks across interrupted triple cycles
    • preserves source/mode precedence under desynchronized stale-window drift after interrupted triple-cycle flipbacks
    • resets mixed red-amber divergence and restores fresh parity replay without chip-tone leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first asymmetric repeated-cycle telemetry cluster

Validation Snapshot (2026-04-02, post-Phase 71)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "maintains asymmetric terminal modes across triple-cycle interruptions without counter leakage|preserves asymmetric terminal modes with advanced-source flipbacks across interrupted triple cycles|preserves source/mode precedence under desynchronized stale-window drift after interrupted triple-cycle flipbacks|resets mixed red-amber divergence and restores fresh parity replay without chip-tone leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first asymmetric repeated-cycle telemetry family in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, and counter-monotonicity clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper repeated reset-loop ladders or retained same-tick timing monolith

Phase 72: Route Helper Adoption Across First Repeated Reset-Loop Telemetry Family (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves zero-residue mode-family counters across alternating terminal-mode reset loops
    • preserves scope isolation across asymmetric terminal-mode loops with repeated resets
    • preserves scope-local stale-window asymmetry after mixed terminal-mode loop resets
    • preserves inverse scope-local stale-window asymmetry after mixed terminal-mode loop resets
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first repeated reset-loop telemetry family

Validation Snapshot (2026-04-02, post-Phase 72)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves zero-residue mode-family counters across alternating terminal-mode reset loops|preserves scope isolation across asymmetric terminal-mode loops with repeated resets|preserves scope-local stale-window asymmetry after mixed terminal-mode loop resets|preserves inverse scope-local stale-window asymmetry after mixed terminal-mode loop resets" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first repeated reset-loop telemetry family in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, and asymmetric repeated-cycle clusters
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper repeated reset-loop ladders beyond this first family or the retained same-tick timing monolith

Phase 73: Route Helper Adoption Across First Bidirectional Stale-Window Sweep Cluster (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves bidirectional stale-window isolation across forward and inverse branches in one lifecycle
    • preserves repeated bidirectional stale-window sweeps without cumulative residue across hard resets
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first bidirectional stale-window sweep cluster

Validation Snapshot (2026-04-02, post-Phase 73)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves bidirectional stale-window isolation across forward and inverse branches in one lifecycle|preserves repeated bidirectional stale-window sweeps without cumulative residue across hard resets" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first bidirectional stale-window sweep cluster in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, and repeated reset-loop families
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper branch-order invariance ladders or the retained same-tick timing monolith

Phase 74: Route Helper Adoption Across First Branch-Order Invariance Telemetry Family (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves bidirectional stale-window branch-order invariance across repeated hard-reset passes
    • preserves variable-age stale-window branch-order invariance across repeated hard-reset passes
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first branch-order invariance telemetry family

Validation Snapshot (2026-04-02, post-Phase 74)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves bidirectional stale-window branch-order invariance across repeated hard-reset passes|preserves variable-age stale-window branch-order invariance across repeated hard-reset passes" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first branch-order invariance telemetry family in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, and bidirectional stale-window sweep families
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper boundary and chip-tone invariance ladders or the retained same-tick timing monolith

Phase 75: Route Helper Adoption Across First Boundary And Boundary-Tone Invariance Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves stale-threshold boundary branch-order invariance across repeated hard-reset passes
    • preserves stale-threshold boundary chip-tone invariance across mirrored branch order with hard resets
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first boundary and boundary-tone invariance pair

Validation Snapshot (2026-04-02, post-Phase 75)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves stale-threshold boundary branch-order invariance across repeated hard-reset passes|preserves stale-threshold boundary chip-tone invariance across mirrored branch order with hard resets" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first boundary and boundary-tone invariance pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, and first branch-order invariance families
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper watch/stale source-mode tone ladders or the retained same-tick timing monolith

Phase 76: Route Helper Adoption Across First Watch-Threshold Chip-Tone Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves watch-threshold boundary chip-tone invariance across mirrored branch order with hard resets
    • preserves watch-threshold source/mode chip-tone invariance across mirrored branch order with hard resets
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first watch-threshold chip-tone pair

Validation Snapshot (2026-04-02, post-Phase 76)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves watch-threshold boundary chip-tone invariance across mirrored branch order with hard resets|preserves watch-threshold source/mode chip-tone invariance across mirrored branch order with hard resets" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first watch-threshold chip-tone pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, first branch-order invariance, and first boundary/boundary-tone families
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper stale-threshold source/mode tone ladders or the retained same-tick timing monolith

Phase 77: Route Helper Adoption Across First Stale Source/Mode And Mixed-Threshold Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves stale-threshold source/mode chip-tone invariance across mirrored branch order with hard resets
    • preserves mixed-threshold chip-family coherence across mirrored branch order with hard resets
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first stale-threshold source/mode owner and the adjacent mixed-threshold chip-family owner

Validation Snapshot (2026-04-02, post-Phase 77)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves stale-threshold source/mode chip-tone invariance across mirrored branch order with hard resets|preserves mixed-threshold chip-family coherence across mirrored branch order with hard resets" --reporter=verbose -> pass
  • npm --prefix scriptoriumai-ui run build -> pass

Metric Update:

  • the shared Runboard route helper now owns the first stale-threshold source/mode owner and the first mixed-threshold chip-family owner in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, and watch-threshold families
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper mixed-threshold interruption ladders or the retained same-tick timing monolith

Phase 78: Route Helper Adoption Across First Mixed-Threshold Interruption Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves mixed-threshold chip-family progression across mirrored branch order with mid-cycle hard reset interruption
    • preserves mixed-threshold replay recovery under post-interruption source-role inversion across mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first mixed-threshold interruption pair

Validation Snapshot (2026-04-02, post-Phase 78)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves mixed-threshold chip-family progression across mirrored branch order with mid-cycle hard reset interruption|preserves mixed-threshold replay recovery under post-interruption source-role inversion across mirrored branch order" --reporter=verbose -> pass
  • npm --prefix scriptoriumai-ui run build -> pass

Metric Update:

  • the shared Runboard route helper now owns the first mixed-threshold interruption pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, and first mixed-threshold chip-family owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper double-interruption ladders or the retained same-tick timing monolith

Phase 79: Route Helper Adoption Across First Mixed-Threshold Double-Interruption Role-Inversion Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves mixed-threshold replay recovery under double interruption with role inversion between interruption windows across mirrored branch order
    • preserves exact watch/stale cutoff boundaries under double interruption with role inversion across mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first mixed-threshold double-interruption role-inversion pair

Validation Snapshot (2026-04-02, post-Phase 79)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves mixed-threshold replay recovery under double interruption with role inversion between interruption windows across mirrored branch order|preserves exact watch/stale cutoff boundaries under double interruption with role inversion across mirrored branch order" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first mixed-threshold double-interruption role-inversion pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, and mixed-threshold interruption owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper asymmetric boundary-jitter ladders or the retained same-tick timing monolith

Phase 80: Route Helper Adoption Across First Asymmetric Boundary-Jitter Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves exact-cutoff invariance under asymmetric boundary-window jitter with double interruption and role inversion across mirrored branch order
    • preserves source/mode boundary-jitter parity under double interruption with role inversion across mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first asymmetric boundary-jitter pair

Validation Snapshot (2026-04-02, post-Phase 80)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves exact-cutoff invariance under asymmetric boundary-window jitter with double interruption and role inversion across mirrored branch order|preserves source/mode boundary-jitter parity under double interruption with role inversion across mirrored branch order" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first asymmetric boundary-jitter pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, and mixed-threshold double-interruption role-inversion owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream boundary-jitter derivatives or the retained same-tick timing monolith

Phase 81: Route Helper Adoption Across First Lockstep Jitter And Asymmetric Reset-Placement Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves mixed-threshold family lockstep coherence across mixed action-origin jitter sequences with double interruption and role inversion across mirrored branch order
    • preserves mixed-origin family lockstep coherence under asymmetric pre/post reset placement across mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first lockstep jitter owner and the adjacent asymmetric reset-placement owner

Validation Snapshot (2026-04-02, post-Phase 81)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves mixed-threshold family lockstep coherence across mixed action-origin jitter sequences with double interruption and role inversion across mirrored branch order|preserves mixed-origin family lockstep coherence under asymmetric pre/post reset placement across mirrored branch order" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first lockstep jitter owner and the first asymmetric reset-placement owner in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, and asymmetric boundary-jitter owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper intra-phase order-toggle derivatives or the retained same-tick timing monolith

Phase 82: Route Helper Adoption Across First Intra-Phase Order-Toggle Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves mixed-origin family lockstep coherence under intra-phase keyboard/command order toggles with asymmetric pre/post reset placement across mirrored branch order
    • preserves mixed-origin intra-phase order-toggle lockstep across jittered watch/stale boundary sample orders with asymmetric pre/post reset placement and mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first intra-phase order-toggle pair

Validation Snapshot (2026-04-02, post-Phase 82)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves mixed-origin family lockstep coherence under intra-phase keyboard/command order toggles with asymmetric pre/post reset placement across mirrored branch order|preserves mixed-origin intra-phase order-toggle lockstep across jittered watch/stale boundary sample orders with asymmetric pre/post reset placement and mirrored branch order" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first intra-phase order-toggle pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, and asymmetric reset-placement owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream replay-permutation derivatives or the retained same-tick timing monolith

Phase 83: Route Helper Adoption Across First Replay-Permutation Derivative Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves mixed-origin lockstep coherence across double-replay jitter permutations with watch/stale lead-scope flips under asymmetric reset placement and mirrored branch order
    • preserves mixed-origin lockstep coherence across alternating-reset replay hops with watch/stale lead-scope flips under mirrored branch order
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first replay-permutation derivative pair

Validation Snapshot (2026-04-02, post-Phase 83)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves mixed-origin lockstep coherence across double-replay jitter permutations with watch/stale lead-scope flips under asymmetric reset placement and mirrored branch order|preserves mixed-origin lockstep coherence across alternating-reset replay hops with watch/stale lead-scope flips under mirrored branch order" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first replay-permutation derivative pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, and intra-phase order-toggle owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream replay-permutation families or the retained same-tick timing monolith

Phase 84: Route Helper Adoption Across First Carryover-Recovery Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across asymmetric carryover windows when a consecutive hop omits immediate reset and the next mirrored hop re-establishes neutral coherence
    • preserves lockstep family parity across dual carryover-chain omissions in mirrored branches with neutral reconvergence and no residual source precedence drift
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first carryover-recovery pair

Validation Snapshot (2026-04-02, post-Phase 84)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across asymmetric carryover windows when a consecutive hop omits immediate reset and the next mirrored hop re-establishes neutral coherence|preserves lockstep family parity across dual carryover-chain omissions in mirrored branches with neutral reconvergence and no residual source precedence drift" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first carryover-recovery pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, and replay-permutation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the downstream reverse/forward interleave escalation ladders or the retained same-tick timing monolith

Phase 85: Route Helper Adoption Across First Reverse/Forward Interleave Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across mixed reverse/forward interleave hops with mirrored recovery and no neutral source-mode leakage
    • preserves lockstep family parity under source-origin lock retention stress across alternating reverse/forward windows and clears asymmetric dominance after mirrored recovery
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first reverse/forward interleave pair

Validation Snapshot (2026-04-02, post-Phase 85)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across mixed reverse/forward interleave hops with mirrored recovery and no neutral source-mode leakage|preserves lockstep family parity under source-origin lock retention stress across alternating reverse/forward windows and clears asymmetric dominance after mirrored recovery" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first reverse/forward interleave pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, and carryover-recovery owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the downstream inversion ladder escalation families or the retained same-tick timing monolith

Phase 86: Route Helper Adoption Across First Inversion-Ladder Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across dual-branch origin inversion ladders with alternating pinned source-order direction and mirrored symmetric recovery under reverse/forward interleave stability
    • preserves lockstep family parity across tri-ladder cross-branch reset-placement cadence with stable reverse/forward interleave order and mirrored recovery source-set parity idempotency
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first inversion-ladder pair

Validation Snapshot (2026-04-02, post-Phase 86)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across dual-branch origin inversion ladders with alternating pinned source-order direction and mirrored symmetric recovery under reverse/forward interleave stability|preserves lockstep family parity across tri-ladder cross-branch reset-placement cadence with stable reverse/forward interleave order and mirrored recovery source-set parity idempotency" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first inversion-ladder pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, and reverse/forward interleave owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the downstream skew-escalation families or the retained same-tick timing monolith

Phase 87: Route Helper Adoption Across First Skew-Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across quad-step branch-window skew with alternating branch reset cadence and mirrored recovery source-set parity after repeated neutral pre-reset idempotency
    • preserves lockstep family parity across quint-step mirrored skew escalation with one controlled inversion checkpoint and mirrored recovery source-set parity across repeated neutral reset plus replay restart cycles
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first skew-escalation pair

Validation Snapshot (2026-04-02, post-Phase 87)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across quad-step branch-window skew with alternating branch reset cadence and mirrored recovery source-set parity after repeated neutral pre-reset idempotency|preserves lockstep family parity across quint-step mirrored skew escalation with one controlled inversion checkpoint and mirrored recovery source-set parity across repeated neutral reset plus replay restart cycles" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first skew-escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, and inversion-ladder owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the downstream higher-order escalation families or the retained same-tick timing monolith

Phase 88: Route Helper Adoption Across First Higher-Order Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across six-step dual-inversion escalation with non-adjacent mirrored checkpoints and mirrored recovery plus replay-restart cycles without neutral leakage
    • preserves lockstep family parity across nine-step quint-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quadruple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the first higher-order escalation pair

Validation Snapshot (2026-04-02, post-Phase 88)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across six-step dual-inversion escalation with non-adjacent mirrored checkpoints and mirrored recovery plus replay-restart cycles without neutral leakage|preserves lockstep family parity across nine-step quint-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quadruple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the first higher-order escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, and first skew-escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 89: Route Helper Adoption Across Next Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across ten-step sextuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quintuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across eleven-step septuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus sextuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next escalation pair

Validation Snapshot (2026-04-02, post-Phase 89)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across ten-step sextuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quintuple replay-restart cycles without neutral leakage|preserves lockstep family parity across eleven-step septuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus sextuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, and first higher-order escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 90: Route Helper Adoption Across Next Checkpoint-Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across twelve-step octuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus septuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across thirteen-step nonuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus octuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next checkpoint-escalation pair

Validation Snapshot (2026-04-02, post-Phase 90)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across twelve-step octuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus septuple replay-restart cycles without neutral leakage|preserves lockstep family parity across thirteen-step nonuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus octuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next checkpoint-escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, first higher-order escalation, and next escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream checkpoint-escalation families or the retained same-tick timing monolith

Phase 91: Route Helper Adoption Across Next Deep Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across fourteen-step decuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus nonuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across fifteen-step undecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus decuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next deep escalation pair

Validation Snapshot (2026-04-02, post-Phase 91)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across fourteen-step decuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus nonuple replay-restart cycles without neutral leakage|preserves lockstep family parity across fifteen-step undecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus decuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next deep escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, first higher-order escalation, next escalation, and next checkpoint-escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 92: Route Helper Adoption Across Next Upper Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across sixteen-step duodecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus undecuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across seventeen-step tridecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus duodecuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next upper escalation pair
    • the existing repeated run-id query-string literal in the seventeenth-step owner was preserved unchanged in this refactor slice

Validation Snapshot (2026-04-02, post-Phase 92)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across sixteen-step duodecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus undecuple replay-restart cycles without neutral leakage|preserves lockstep family parity across seventeen-step tridecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus duodecuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next upper escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, first higher-order escalation, next escalation, next checkpoint-escalation, and next deep escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 93: Route Helper Adoption Across Next Late Escalation Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across eighteen-step quattuordecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus tredecuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across nineteen-step quindecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quattuordecuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next late escalation pair
    • the existing repeated run-id query-string literal in these owners was preserved unchanged in this refactor slice

Validation Snapshot (2026-04-02, post-Phase 93)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across eighteen-step quattuordecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus tredecuple replay-restart cycles without neutral leakage|preserves lockstep family parity across nineteen-step quindecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quattuordecuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next late escalation pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, first higher-order escalation, next escalation, next checkpoint-escalation, next deep escalation, and next upper escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 94: Corrected Route Helper Adoption Across Actual Eighteen/Nineteen-Step Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across eighteen-step quattuordecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus tredecuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across nineteen-step quindecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quattuordecuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions moved
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the actual eighteen-step and nineteen-step owners
    • the existing repeated run-id query-string literal in these owners was preserved unchanged in this corrective refactor slice

Validation Snapshot (2026-04-02, post-Phase 94)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across eighteen-step quattuordecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus tredecuple replay-restart cycles without neutral leakage|preserves lockstep family parity across nineteen-step quindecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus quattuordecuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now definitively owns the actual eighteen-step and nineteen-step pair in addition to the earlier tone-transition, precedence/drift, asymmetry, partial-replay, stale-reset-cycle, counter-monotonicity, asymmetric repeated-cycle, repeated reset-loop, bidirectional stale-window sweep, branch-order invariance, boundary, watch-threshold, stale-threshold source/mode, mixed-threshold chip-family, mixed-threshold interruption, mixed-threshold double-interruption role-inversion, asymmetric boundary-jitter, lockstep jitter, asymmetric reset-placement, intra-phase order-toggle, replay-permutation, carryover-recovery, reverse/forward interleave, inversion-ladder, first skew-escalation, first higher-order escalation, next escalation, next checkpoint-escalation, next deep escalation, and next upper escalation owners
  • repeated inline telemetry route-shell boilerplate decreased again without touching the deeper downstream escalation families or the retained same-tick timing monolith

Phase 95: Route Helper Adoption Across Twenty-Two/Twenty-Three-Step Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across twenty-two-step octodecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus septendecuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across twenty-three-step novendecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus octodecuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions changed
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next actual escalation pair
    • the existing repeated run-id query-string literal in these owners was preserved unchanged for behavior neutrality

Validation Snapshot (2026-04-02, post-Phase 95)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across twenty-two-step octodecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus septendecuple replay-restart cycles without neutral leakage|preserves lockstep family parity across twenty-three-step novendecuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus octodecuple replay-restart cycles without neutral leakage" --reporter=verbose -> pass

Metric Update:

  • the shared Runboard route helper now owns the next actual escalation pair after the corrected eighteen/nineteen-step owners, extending the shared helper coverage deeper into the late telemetry ladder while leaving the retained same-tick timing/concurrency monolith untouched

Phase 96: Route Helper Adoption Across Twenty-Four/Twenty-Five-Step Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across twenty-four-step vigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus novendecuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across twenty-five-step unvigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus vigintuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions changed
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next actual escalation pair
    • the existing repeated run-id query-string literal in these owners was preserved unchanged for behavior neutrality

Validation Snapshot (2026-04-02, post-Phase 96)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across twenty-four-step vigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus novendecuple replay-restart cycles without neutral leakage|preserves lockstep family parity across twenty-five-step unvigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus vigintuple replay-restart cycles without neutral leakage" --reporter=verbose --testTimeout=120000 -> pass

Metric Update:

  • the shared Runboard route helper now owns the next actual escalation pair after the twenty-two/twenty-three-step owners, extending helper coverage deeper into the late checkpoint-escalation ladder while leaving the retained same-tick timing/concurrency monolith untouched

Phase 97: Route Helper Adoption Across Twenty-Six/Twenty-Seven-Step Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across twenty-six-step duovigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus unvigintuple replay-restart cycles without neutral leakage
    • preserves lockstep family parity across twenty-seven-step tresvigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus duovigintuple replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions changed
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next actual escalation pair
    • the existing repeated run-id query-string literal in these owners was preserved unchanged for behavior neutrality

Validation Snapshot (2026-04-02, post-Phase 97)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across twenty-six-step duovigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus unvigintuple replay-restart cycles without neutral leakage|preserves lockstep family parity across twenty-seven-step tresvigintuple-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus duovigintuple replay-restart cycles without neutral leakage" --reporter=verbose --testTimeout=120000 -> pass

Metric Update:

  • the shared Runboard route helper now owns the next actual escalation pair after the twenty-four/twenty-five-step owners, extending helper coverage deeper into the late checkpoint-escalation ladder while leaving the retained same-tick timing/concurrency monolith untouched

Phase 98: Route Helper Adoption Across Four-Hundred-Thirty-Five/Four-Hundred-Thirty-Six-Step Pair (Complete, 2026-04-02)

  • Reused the shared route render owner from:
    • src/__tests__/helpers/runboard-render-helpers.tsx
  • Rewired these Runboard.states telemetry owners:
    • preserves lockstep family parity across four-hundred-thirty-five-step quadringentotrigintupleplusfive-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus trecentosexvigintivigintiquinquagintatrigintupleplusfive replay-restart cycles without neutral leakage
    • preserves lockstep family parity across four-hundred-thirty-six-step quadringentotrigintupleplusvi-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus trecentosexvigintivigintiquinquagintatrigintupleplusvi replay-restart cycles without neutral leakage
  • Important normalization:
    • no behavior-bearing assertions changed
    • no route contracts changed
    • the slice only removed repeated inline MemoryRouter / Routes / Route initial-render and rerender wrappers from the next actual late-escalation pair
    • the existing repeated run-id query-string literal in these owners was preserved unchanged for behavior neutrality
    • the four-hundred-thirty-six-step owner also required timeout normalization from 540000 to 660000 because the live test runtime had exceeded the stale per-test clamp

Validation Snapshot (2026-04-02, post-Phase 98)

  • cmd /c npx tsc --noEmit -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across four-hundred-thirty-five-step quadringentotrigintupleplusfive-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus trecentosexvigintivigintiquinquagintatrigintupleplusfive replay-restart cycles without neutral leakage" --reporter=verbose --testTimeout=600000 -> pass
  • cmd /c .\\node_modules\\.bin\\vitest.cmd run src\\__tests__\\Runboard.states.test.tsx -t "preserves lockstep family parity across four-hundred-thirty-six-step quadringentotrigintupleplusvi-checkpoint escalation with non-adjacent mirrored checkpoints and mirrored recovery plus trecentosexvigintivigintiquinquagintatrigintupleplusvi replay-restart cycles without neutral leakage" --reporter=verbose --testTimeout=900000 -> pass

Metric Update:

  • the shared Runboard route helper now owns the first late four-hundred-step escalation pair in addition to the earlier numbered ladder owners, extending helper coverage much deeper into the remaining telemetry monolith while leaving the retained same-tick timing/concurrency seam untouched

Hand-off & Next Steps

Preferred Commands to Run:

1. Type Checking: Ensure no regressions in the React/TS UI: npm --prefix scriptoriumai-ui run type-check

2. Sentrux Headless Scan: Validate architecture score headless without GUI freeze: .\sentrux.exe check

3. Run UI Unit Tests: npm --prefix scriptoriumai-ui run test:ci -- --passWithNoTests

Or specific file:

npm --prefix scriptoriumai-ui run test:ci scriptoriumai-ui/src/__tests__/Runboard.compare-route-clear-filters.test.tsx

4. Check UI Build: npm --prefix scriptoriumai-ui run build

Focal Points and Expected Issues:

  1. Pane Reintegration vs. Stale Extraction Artifacts: LeftExplorerPane.tsx and RightInsightPane.tsx still exist, but neither is the live source of truth. Action: do not trust those old extraction artifacts; either delete/retire them or rebuild fresh pane boundaries from the current live page after the project/bootstrap domain is extracted.
  2. Prop Drilling / Fan-Out: The compare/integrity and compile/runtime clusters are now extracted, but the live page still owns large render branches. Action: target a fresh render/provider boundary next, not another shallow state-hook split.
  3. Sentrux Ignore Rules: Coverage HTML is still appearing in headless checks despite the tightened exclusions. Action: stop treating .sentrux/rules.toml as sufficient; remove tracked generated artifacts from the scan surface or move the scan root to a clean source-only subset before trusting the next architectural report.

Editor Migration Handoff (VSCode -> Sublime Text)

Reason for Handoff: VSCode memory footprint reached unsustainable levels (~8GB RAM, combined with other high-RAM applications like Comet Browser on a 16GB non-upgradable system).

Sublime Text Setup Recommendations

  1. Package Control: The foundation for installing everything else.
  2. Language Server Protocol (LSP): Install LSP and LSP-typescript.
  3. Syntax Highlighting & Formatting: TypeScript, JS Custom, LSP-eslint.
  4. Terminal / Shell: Terminus.
  5. AI Integration: LSP-copilot.
  6. Project Environment: Project > Save Project As.... (Sentrux CLI operations will remain exactly the same as it is executed via the OS terminal).

Agent Tooling & Submodule Capabilities

GitNexus and Strix: Codebase Optimization & Agent Tooling Memory

Overview

This standalone procedural backup explicitly captures the reasoning, execution plan, and operational context for using GitNexus and Strix as internal developer and AI-agent tools. These tools exist purely to optimize, navigate, and refactor the ScriptoriumAI source codebase. They are not intended to be end-user-facing features (like PDFdelta or Corpus Graph).

Target Context: Expanding Sentrux's rigid architectural boundary checks with semantic codebase search (Strix) and dynamic Git flow graphing (GitNexus) to assist future AI models in navigating the monolith.

Upstream Module Configuration

  1. GitNexus (https://github.com/abhigyanpatwari/GitNexus)

    • Submodule location: mirrors/GitNexus
    • Purpose: Generates visual topologies and historical metadata overlays of the ScriptoriumAI codebase itself. Helps AI agents understand the trajectory of refactors (e.g., how the Excised Legacy Editor was migrated over time).
    • Agent Usage: Can be run headlessly by an AI to analyze structural changes.
    • Headless Command Examples for Agents:
      • python mirrors/GitNexus/src/main.py --repo C:\ScriptoriumAI --output ./gitnexus_report.json
      • Note: If a Node wrapper script is created, it will be placed in scripts/run-gitnexus.mjs.
  2. Strix (https://github.com/usestrix/strix)

    • Submodule location: mirrors/strix
    • Purpose: Offers deep semantic codebase navigation. When structural regex queries (like Select-String) fail to find complex logic paths, Strix enables fuzzy, intent-based context aggregation across the ScriptoriumAI workspace (e.g., searching "Where does the platform manage user subscription routing?").
    • Agent Usage: Serve as an advanced search mechanism for AI operators during hand-offs. Instead of endlessly grepping src/components, operators can run Strix headlessly.
    • Headless Command Examples for Agents:
      • cd mirrors/strix && cargo run -- search "b2b saas paywall routing"
      • Note: If a Node wrapper script is created, it will be placed in scripts/run-strix-search.mjs.

Interaction with Sentrux

These submodules operate orthogonally to Sentrux:

  • Sentrux: Strict boundaries, global architectural score, rules.toml constraint checks (.\sentrux.exe check).
  • GitNexus: Flow map, temporal history overview of the Git tree.
  • Strix: Semantic meaning, AI conversational context retrieval over the raw code files.

Maintenance Requirements

Both submodules should be occasionally git fetch-ed to align with the latest bleeding-edge capabilities, with internal adapters buffering their external interfaces from ScriptoriumAI core protocols.

Phase 10: Validation Snapshot (2026-04-04)

  • Ran .\sentrux.exe check\ -> quality Ũ4- Result: ✓ All rules pass. The tracked HTML coverage noise has been fully cleaned or bypassed, and no god files remain above the threshold (including \EditorSimplified.tsx\ and \App.tsx). The live architectural boundary is now historically decoupled.

3. Toolkit Enlightenment & Execution Guidelines

The following explicitly outlines ScriptoriumAI's tri-tooling architecture specifically available for root AI agents, and when to apply these specific engines.

A. Sentrux

  • What it is: A strict boundaries and god-file constraint checker. It evaluates the raw structural coupling (fan-out/fan-in) and code modularity of the repository.
  • Execution Run: .\sentrux.exe check
  • When to Apply:
    • Immediately after any major UI extraction or backend state refactoring.
    • To verify that no new 'God Files' (e.g., highly coupled components with imports > 15) have been introduced across a session.
    • To get a concrete Quality Score benchmark to measure refactoring drift.

B. Strix

  • What it is: A Rust-based semantic codebase navigation engine (mirrors/strix). It uses fuzzy intent-based context aggregation across the workspace.
  • Execution Run: cd mirrors/strix && cargo run -- search "<semantic query>"
  • When to Apply:
    • When standard grep_search or regex fails because the logic is split across disconnected domains.
    • Useful for conceptual questions like: "Where does the platform manage user subscription routing?" or "How does the compile failure payload get routed to the Runboard?"
    • Recommended during agent hand-offs or initial project immersion to retrieve semantic overview context without scanning hundreds of src/components/ files.

C. GitNexus

  • What it is: A flow map and temporal historical analyzer for the Git tree (mirrors/GitNexus). Generates topologies of how the Scriptorium codebase itself evolved.
  • Execution Run: python mirrors/GitNexus/src/main.py --repo C:\ScriptoriumAI --output ./gitnexus_report.json
  • When to Apply:
    • When an AI agent needs to understand the trajectory of a historical refactor (e.g., "When and how was the Excised Legacy Editor migrated?").
    • To overlay historical metadata and map how rapidly a module changes over time, thus predicting bug hotspots or areas overdue for architectural modernization.

4. Considering But Yet Undecided Sentrux Score Improvements

To drastically improve the Sentrux score from the current passing 5500 baseline up to 8000+, we must move beyond simply breaking up large React hooks/components. Sentrux aggressively penalizes deep, tangled webs. To achieve a top-tier architectural score, we would need to:

  1. Enforce Strict Hexagonal Boundaries: Prevent UI components (src/components/) from importing directly from src/services/. We would route all service logic through custom hooks or a state container (Jotai/Zustand), severely collapsing cross-domain import edges.
  2. Eliminate Circular Imports in Types: Consolidate all TS interfaces into a dedicated types/ or contracts/ directory rather than letting components import types from siblings, which balloons the Sentrux dependency graph.
  3. Kill the "Utility Bucket": Strip massive files like vendor/liquid-glass-react/utils.ts and restructure them so modules only import the exact 5-line string parser they need rather than parsing an entire utility bucket.

5. Deferral of GitNexus Bug Hotspot Scanning

While GitNexus can overlay historical metadata and map how rapidly a module changes over time to predict bug hotspots, we are explicitly deferring a full GitNexus temporal scan until the next dedicated debugging and refactoring sprint.

Reasoning: Since we are currently pivoting to feature implementation (such as Incremental Compilation with Caching), running a temporal hotspot scan now would yield insights that might become stale by the time we return to a refactoring phase. This tool should be engaged right as a refactoring/modernization phase begins to ensure the generated topology map reflects the most up-to-date repository state.

6. GitNexus Call Stack Modifications and Sentrux Targeting

Following a failed GitNexus full workspace scan (Maximum call stack size exceeded), it was identified that running GitNexus recursively over the entire monolith (with bundled static files, tests, and deep React dependencies) overwhelms the local Node parser.

GitNexus Licensing and Modification

The mirrors/GitNexus repository operates under the PolyForm Noncommercial License 1.0.0 (not MIT). Under this license, we are permitted to make modifications to the software for our internal, non-commercial structural analysis (as explicitly allowed by the Changes and New Works License section). If we choose to proceed with GitNexus modification, we can increase the Node --max-old-space-size binding or modify the worker batching logic over AST generation in gitnexus/src/cli/.

Strategic Pivot: Directed Scanning

Instead of modifying the call stack to brute-force a monolith scan, the recommended strategy is to pair Sentrux with GitNexus:

  1. Use .\sentrux.exe check to identify heavy structural nodes and "Utility Buckets".
  2. Run GitNexus targeted strictly at those isolated scopes (e.g., gitnexus analyze C:\ScriptoriumAI\scriptoriumai-ui\src\stores instead of the root C:\ScriptoriumAI).

License Clarification for External/Commercial Use

Note on Commercial Deployment (Beyond ScriptoriumAI): While the local node package for GitNexus states PolyForm Noncommercial, the upstream project itself and its GitHub repository explicitly use the MIT License. This highly permissive open-source license allows commercial use, proprietary embedding, and redistribution (provided the MIT notice is kept). If GitNexus is adopted into separate, commercial shells or vector workflows outside of Scriptorium, the MIT License explicitly permits that business usage.

Established Modus Operandi (The Pattern Loop)

The exact active loop for codebase optimization using these tools is:

  1. Sentrux Flag: Run .\sentrux.exe check to find heavily coupled God Files or Utility Buckets.
  2. Directed GitNexus Scan: Provide GitNexus the localized, scoped directory of the offender (e.g., src/stores or src/components/editor) instead of the repository root, gracefully avoiding call-stack explosions.
  3. Refactor: Decompose the localized files and couple logic appropriately.

Runboard Decomposition & AST Migration (2026-04-08)

The monolith Runboard.tsx file possessed over 3,000 lines of purely functional utilities directly preceding the main React component. A naive regex extraction caused immediate cascading 401 TypeScript compile errors because numerous tests/* files depended strictly on pulling those functional dependencies directly from ../pages/Runboard.

Instead of resorting to a dangerous string-replace strategy, ts-morph (the TypeScript Compiler API wrapper) was successfully leveraged via an automated script. It processed the Abstract Syntax Tree (AST), moved pure functions, types, and variables to src/utils/runboard-route-logic.tsx, and automatically updated exactly the required partial imports across over 25 Jest test files in src/tests/ while preserving the default React component path ../pages/Runboard.

This resulted in a clean sentrux check execution proving that structural paths remained whole while eliminating a massive UI God File. Initial automated type checks returned to a stable state of remaining minor mock/type gaps (~83 legacy warnings) instead of fatal missing bindings.

Quality Score Optimization Opportunities

Sentrux reported a Quality Score of 5348 (Source-only). To further improve this score, the following targeted refactoring opportunities have been identified:

  1. Splitting the New Utility Dump: unboard-route-logic.tsx still houses 3,000+ lines of exported logic. It is currently acting as a catch-all "Utility Bucket" (containing telemetry functions, PDFDelta helper functions, type definitions, styling constants). By regrouping them by domain (e.g., unboard-telemetry.ts, unboard-api-types.ts, unboard-ui-helpers.ts), the module boundary purity will increase drastically.
  2. ESLint Dead Code Pruning: The automated split left behind ~53 unused imports within unboard-route-logic.tsx. Executing a structured unused-import removal pass will instantly reduce cognitive overhead and graph density.
  3. Strict Mock Type Conformance: Over 24+ of the lingering TypeScript errors stem directly from missing required property keys (such as ctor_id or oise_ratio) in mock objects inside pdfdeltaP3Store.test.ts and PdfdeltaTrendPanel.test.tsx. Adopting Partial definitions for these models, or generating robust mock factories, will allow TS type-checking to safely drop to absolute zero errors.
  4. Re-activating Strict Sentrux Constraints: The current ules.toml disabled the o_god_files configuration to bypass initial scanning panics. By officially enabling it now, Sentrux can actively guard against future accretion and accurately calculate module separation health without blind spots.

Runboard Decomposition & AST Migration (2026-04-08)

The monolith Runboard.tsx file possessed over 3,000 lines of purely functional utilities directly preceding the main React component. A naive regex extraction caused immediate cascading 401 TypeScript compile errors because numerous __tests__/* files depended strictly on pulling those functional dependencies directly from ../pages/Runboard.

Instead of resorting to a dangerous string-replace strategy, ts-morph (the TypeScript Compiler API wrapper) was successfully leveraged via an automated script. It processed the Abstract Syntax Tree (AST), moved pure functions, types, and variables to src/utils/runboard-route-logic.tsx, and automatically updated exactly the required partial imports across over 25 Jest test files in src/__tests__/ while preserving the default React component path ../pages/Runboard.

This resulted in a clean sentrux check execution proving that structural paths remained whole while eliminating a massive UI God File. Initial automated type checks returned to a stable state of remaining minor mock/type gaps (~83 legacy warnings) instead of fatal missing bindings.

Quality Score Optimization Opportunities

Sentrux reported a Quality Score of 5348 (Source-only). To further improve this score, the following targeted refactoring opportunities have been identified:

  1. Splitting the New Utility Dump: runboard-route-logic.tsx still houses 3,000+ lines of exported logic. It is currently acting as a catch-all "Utility Bucket" (containing telemetry functions, PDFDelta helper functions, type definitions, styling constants). By regrouping them by domain (e.g., runboard-telemetry.ts, runboard-api-types.ts, runboard-ui-helpers.ts), the module boundary purity will increase drastically.
  2. ESLint Dead Code Pruning: The automated split left behind ~53 unused imports within runboard-route-logic.tsx. Executing a structured unused-import removal pass will instantly reduce cognitive overhead and graph density.
  3. Strict Mock Type Conformance: Over 24+ of the lingering TypeScript errors stem directly from missing required property keys (such as actor_id or noise_ratio) in mock objects inside pdfdeltaP3Store.test.ts and PdfdeltaTrendPanel.test.tsx. Adopting Partial<T> definitions for these models, or generating robust mock factories, will allow TS type-checking to safely drop to absolute zero errors.
  4. Re-activating Strict Sentrux Constraints: The current rules.toml disabled the no_god_files configuration to bypass initial scanning panics. By officially enabling it now, Sentrux can actively guard against future accretion and accurately calculate module separation health without blind spots.

Generalized Codebase Refactoring Guide (April 2026)

Created: April 10, 2026

This guide captures the strategies, tools, and execution methodology used to safely untangle massively coupled 'God Files' and resolve deep TypeScript and test runner failures. You can utilize these patterns to decouple large codebases.

1. Extracting Complex Inline JSX & Pure Logic

The Problem:

Massive files (like \Runboard.tsx\ with 3,000+ lines) often interleave pure data derivation (mapping, filtering, sorting) with complex inline UI rendering blocks. This leads to massive '\ an-out' (importing dozens of disjointed services) and high cognitive load.

The Solution (Domain-Scale Splitting):

  • Isolate the Pure Logic First: Extract data-processing functions, constants, and typings out into a -logic.ts\ or -helpers.ts\ file. Pure functions are easy to test and require no React context.
  • Decompose View Boundaries: Strip massive inline render blocks (e.g., complex Banners or Panes) into isolated child components (e.g., \RunboardCompareRemediationRouteBanner.tsx).
  • Pass Down Primates & Callbacks: Rather than letting the split child component read directly from global stores, pass down mapped props and well-typed callbacks (e.g., documentId: string, index: number) => void. By doing this, the parent retains state authority, and the child just renders.

2. Resolving TypeScript 'Implicit Any' & Type Regression Debt

The Problem:

When splitting components, inline .map(item => ...)\ invocations often lose their surrounding type context, causing the compiler to throw \Parameter 'item' implicitly has an 'any' type\ errors.

The Solution (Explicit Annotation & Bounding):

  • **Stop Using @ts-nocheck**: Do not hide compiling errors behind top-level suppressions.
  • Bind the Extraction Site: Explicitly type the parameters at the extraction site in the child component. Reconcile the \HTMLElement\ casts (e.g., typing event targets correctly as \HTMLSelectElement\ or \HTMLButtonElement).
  • Audit Missing Interface Imports: Use TS auto-resolve to bring in missing type declarations (e.g., \RUN_STATUSES, \CorpusRunHydrated) from the parent scope or global schemas that the split file now needs natively.

3. Safely Decoupling Monolithic Test Suites

The Problem:

Deeply coupled .test.tsx\ files will often globally crash when mocking the unified client, especially when 'God files' are broken apart or when coverage instrumentation gets tangled in complex execution graphs (like \ 8\ coverage setup hooks in Vite/Vitest).

The Solution (Stable Mocks & Parameter Validation):

  • Isolate Coverage Crashes: If \ itest --coverage\ causes a deep V8 crash (e.g., \ERR_IPC_CHANNEL_CLOSED) but standard \ itest run\ works, the runtime code is sound. Fix the code logic first before wrestling with coverage instrumentation limits.
  • Deduplicate Mocks: Remove repeated \jest.mock()\ or \ i.mock()\ declarations with duplicate property keys across test files.
  • Harnessing: Extract shared testing boilerplate (seed data, standard mock responses) into a reusable \ est-harness.tsx\ to keep the test files clean and focused solely on assertions.

GitNexus Monolith Scan Remediation (2026-04-11)

This supersedes the earlier assumption in this log that the repo-wide GitNexus scan remained structurally impractical because of a hard call-stack ceiling.

What Changed

  • Retried the published CLI path first:
    • cmd /c npx -y gitnexus@latest analyze C:\ScriptoriumAI --skip-agents-md
    • Result: still failed with Maximum call stack size exceeded
  • Inspected the local mirror under mirrors/GitNexus/gitnexus/src/cli/analyze.ts
  • Found that the current local attempt to raise the stack also injected --stack-size into NODE_OPTIONS, which Node rejects outright (--stack-size= is not allowed in NODE_OPTIONS)
  • Repaired the local analyzer so runtime headroom is applied via explicit exec args instead of NODE_OPTIONS, and added a respawn marker to prevent loops

Local GitNexus Repair

  • Modified: mirrors/GitNexus/gitnexus/src/cli/analyze.ts
  • Key change:
    • preserve the existing heap/stack respawn strategy
    • stop writing --stack-size into NODE_OPTIONS
    • pass heap/stack flags through process.execArgv/CLI respawn only
    • guard respawn with GITNEXUS_ANALYZE_RUNTIME_RESPAWNED=1

Repo-Wide Retry Outcome

  • Rebuilt the local mirror:
    • npm install in mirrors/GitNexus/gitnexus-shared
    • npm install in mirrors/GitNexus/gitnexus
    • npm run build in mirrors/GitNexus/gitnexus
  • Re-ran the monolith scan on the patched local build:
    • node dist/cli/index.js analyze C:\ScriptoriumAI --skip-agents-md
  • Result: success
    • duration: 772.4s
    • nodes: 263,104
    • edges: 719,584
    • clusters: 12,959
    • flows: 300

Remaining Caveats From The Successful Monolith Scan

  • The successful full-repo run still skipped 68 files larger than 512KB
  • The scan still reported 1 skipped Swift file because the Swift tree-sitter parser was unavailable in the local build
  • Repo-wide semantic queries remain noisy because the indexed surface includes many mirrored external repos; for product-focused reasoning, targeted queries against scriptoriumai-ui/src, ScriptoriumAI-Server, or narrower subsystem roots are still preferred even though the monolith scan itself now works

Codebase Re-Evaluation Follow-Through

  • Corrected the UI route lazy-page registry regression that had reintroduced a Sentrux god file by splitting the app lazy-page bucket into bounded modules while preserving the existing route surface
  • Replaced the hard reload link on ResearchAgentDashboard with router-native navigation
  • Wired the advertised shell shortcuts for:
    • Manim Sandbox
    • Skills Manager
    • OpenAPI Routing
    • global chat sidebar toggle
  • Surfaced the Phase 2/3 AI routes in the persistent app sidebar so these dedicated views are reachable without relying only on the menu bar, command palette, or direct URLs

Validation Snapshot (2026-04-11)

  • node dist/cli/index.js analyze C:\ScriptoriumAI --skip-agents-md (run from mirrors/GitNexus/gitnexus) -> pass
  • npx vitest run src/__tests__/EditorLayout.shortcuts.test.tsx src/__tests__/GlobalSidebar.test.tsx --reporter=verbose (run from scriptoriumai-ui) -> 6/6 pass
  • npm --prefix scriptoriumai-ui run type-check -> pass
  • npm --prefix scriptoriumai-ui run build -> pass
  • npm run sentrux:source-only -> pass, quality 5163, all rules pass

Updated Operating Rule

  • Repo-wide GitNexus scanning is no longer blocked by the prior call-stack failure when using the repaired local mirror build
  • The published gitnexus@latest path still reproduces the overflow in this environment as of 2026-04-11
  • Practical default:
    • use the local repaired mirror for full-repo scans when broad topology is required
    • keep directed subsystem scans as the preferred day-to-day mode because they yield less mirror noise and faster iteration

Production Deployment Verification And Woodpecker Audit (2026-04-11)

This entry records a live production deployment verification against the current VPS/Forgejo/Woodpecker stack after a user report that "push should auto-deploy to production" was not actually working.

Sensitive Material Review

  • Reviewed the sensitive operations runbook and local SSH material strictly to obtain the deployment path and access method:
    • docs/ops/FORGEJO_WOODPECKER_VPS_A_TO_Z_SENSITIVE_RUNBOOK.md
    • ops/ssh/scriptorium_vps_ed25519
    • ops/ssh/scriptorium-root.conf
  • Sensitive values were used operationally but are intentionally not duplicated into this log.

What The Live Infrastructure Actually Showed

  • SSH access to the VPS succeeded as root on 212.227.22.66
  • The Forgejo/Woodpecker stack was present under /srv/scriptorium-stack
  • The live static production root for scriptoriumai.io was confirmed as /var/www/scriptoriumai
  • The current public site was already being served by NGINX from that root and the API remained healthy during the entire operation

Woodpecker Root Cause

  • Inspected the live Woodpecker SQLite state at:
    • /srv/scriptorium-stack/woodpecker/server-data/woodpecker.sqlite
  • The repos table showed exactly one active configured repository:
    • verticaltension/verticaltension
    • config_path=.woodpecker.yml
    • active=1
    • trusted=1
  • There was no scriptoriumai/scriptoriumai repo entry in Woodpecker
  • Conclusion:
    • a push to the ScriptoriumAI repo could not have auto-triggered a Woodpecker deployment because Woodpecker was not configured to watch this repo at all
    • the prior "push deploy" assumption was false for the current live CI state

Manual Production Deployment Executed

  • Built the current frontend bundle locally:
    • npm --prefix scriptoriumai-ui run build
  • Confirmed no stray local node.exe processes remained after the build
  • Backed up the current production static root on the VPS:
    • /srv/backups/scriptorium/scriptoriumai-static-20260411T005423Z.tgz
  • Uploaded the freshly built scriptoriumai-ui/dist bundle as an archive to the VPS
  • Extracted into a temporary remote deployment directory
  • Synced into the live root with deletion to remove stale hashed assets:
    • rsync -a --delete <temp>/ /var/www/scriptoriumai/
  • Normalized ownership and permissions for the deployed static files
  • Reloaded NGINX after the sync

Live Production Confirmation

  • Public root page:
    • https://scriptoriumai.io/ -> 200
  • Public HTML now references the freshly deployed asset hashes from the local build:
    • assets/index-DSRa3lqk.js
    • assets/index-DCJ9YndN.css
    • assets/excalidraw-DDTsmHaA.js
  • Direct asset verification:
    • https://scriptoriumai.io/assets/ResearchAgentDashboard-fXORqh1D.js -> 200
    • https://scriptoriumai.io/assets/HelpCenterPage-CZO_QLq8.js -> 200
    • https://scriptoriumai.io/assets/index-DSRa3lqk.js -> 200
    • https://scriptoriumai.io/assets/index-DCJ9YndN.css -> 200
  • API health remained green after deployment:
    • https://api.scriptoriumai.io/healthz -> 200
    • https://api.scriptoriumai.io/ready -> 200
    • https://api.scriptoriumai.io/capabilities -> 200

Operational Conclusion

  • Production deployment is now confirmed live for the current frontend bundle
  • The push-triggered Woodpecker deploy path was not merely broken; for this repository it was absent from live Woodpecker configuration
  • If automatic production deploys are desired from scriptoriumai/scriptoriumai, the next required work is to:
    • register the repository in Woodpecker
    • add a real .woodpecker.yml pipeline for this repo
    • wire the deploy secrets and remote sync commands for /var/www/scriptoriumai
    • optionally add a post-deploy public hash/health verification step so future pushes prove deployment instead of assuming it

Woodpecker Activation And Follow-Through (2026-04-11)

This entry captures the follow-up work to make scriptoriumai/scriptoriumai actually deploy through the live Forgejo/Woodpecker stack and the exact point where infrastructure availability became the remaining blocker.

Live CI Registration Work Completed

  • Added repo-local production automation files:
    • .woodpecker.yml
    • scripts/cicd/deploy-scriptorium-static.sh
  • Confirmed live Woodpecker version was 2.8.3
  • Activated scriptoriumai/scriptoriumai inside live Woodpecker and repaired the repo through the real Woodpecker API rather than relying only on direct DB edits
  • Confirmed the Forgejo webhook for this repo now points at Woodpecker and uses a valid live repo-id=2 hook token

Verified Trigger Progression

  • Pushes to origin/main for this repo now create real Woodpecker pipeline rows for repo_id=2
  • Early failure progression that was fixed:
    • initial webhook/token mismatch: fixed by repairing the repo through Woodpecker's own activation path
    • pipeline compiler error on .woodpecker.yml: fixed by rewriting the smoke step into a block command
    • clone failure due missing root-level mirrors/GitNexus mapping: fixed by restoring the missing .gitmodules entry

Latest Pushed CI Fix On Remote

  • origin/main ended this activation sequence at:
    • 3ee8b45408 -> ci: disable recursive clone for deploy workflow
  • Purpose of that change:
    • add an explicit Woodpecker clone configuration
    • set recursive: false
    • prevent the deploy workflow from recursively cloning the large private mirror submodule forest that is unrelated to the frontend static deploy

Last Confirmed Runtime Failure Before Outage

  • The last fully inspectable live run before the VPS/network outage was pipeline 19
  • That run confirmed:
    • webhook activation is working
    • pipeline compilation is working
    • the workflow reached the clone stage
  • The concrete blocker in that run was:
    • Woodpecker recursively cloning many private mirror submodules under mirrors/
    • clone failures such as mirrors/ManimExtras because the deploy workflow did not need those mirrors and the recursive submodule checkout was too broad for this CI path
  • The remote fix that was pushed afterward to address exactly that blocker was commit 3ee8b45408

Current Blocking Condition

  • After pushing 3ee8b45408, the VPS became unreachable from the operator side:
    • ssh root@212.227.22.66 timed out
    • https://scriptoriumai.io/ timed out
    • https://ci.scriptoriumai.io/ timed out
    • https://api.scriptoriumai.io/healthz timed out
  • Because of that infrastructure outage, final confirmation of:
    • the next Woodpecker pipeline result after 3ee8b45408
    • the production deploy
    • the public asset hash change on scriptoriumai.io is still pending live host recovery rather than pending another known repo-side fix

Next Operational Check Once VPS Connectivity Returns

  1. Re-check Woodpecker pipeline rows for repo_id=2
  2. Inspect the first pipeline triggered from commit 3ee8b45408
  3. If clone is green, continue through ui_build, deploy_static, and smoke_production
  4. Re-verify:
    • https://scriptoriumai.io/
    • deployed asset hashes from scriptoriumai-ui/dist/index.html
    • https://api.scriptoriumai.io/healthz
    • https://api.scriptoriumai.io/ready
    • https://api.scriptoriumai.io/capabilities

Retry Snapshot After Mid-Process Crash (2026-04-11)

  • Retried the full production confirmation chain after the interrupted deployment session.
  • Current repo state at retry time:
    • origin/main remained at 3ee8b45408 (ci: disable recursive clone for deploy workflow)
    • local main was ahead with additional unpushed commits, but Forgejo itself was unreachable so no further push/deploy action was possible
  • Re-checked live reachability for:
    • https://scriptoriumai.io/
    • https://ci.scriptoriumai.io/
    • https://api.scriptoriumai.io/healthz
    • https://git.scriptoriumai.io/
    • ssh root@212.227.22.66
  • Result:
    • all HTTPS checks timed out
    • SSH to 212.227.22.66:22 timed out
    • git ls-remote origin HEAD failed because git.scriptoriumai.io:443 was unreachable
  • DNS still resolved correctly:
    • scriptoriumai.io -> 212.227.22.66
    • ci.scriptoriumai.io -> 212.227.22.66
    • api.scriptoriumai.io -> 212.227.22.66
  • Interpretation:
    • this is no longer a repo or Woodpecker config issue
    • the remaining blocker is infrastructure availability or provider-side access to the VPS

Forgejo/Woodpecker Hardening Baseline Update (2026-04-11)

This entry records the repository-side hardening applied after the single-host CI/build incident analysis.

Bootstrap Hardening Applied

  • bootstrap_forgejo_woodpecker.sh now provisions Woodpecker against Postgres instead of relying on the default SQLite path
  • the bootstrap ensures the Woodpecker Postgres role/database exist before bringing Woodpecker up
  • the backup job now captures both Forgejo and Woodpecker Postgres dumps in addition to Forgejo/Woodpecker persistent data archives
  • Docker daemon log rotation is configured in /etc/docker/daemon.json
  • a nightly safe maintenance job now prunes stopped containers, stale images, stale builder cache, and vacuums local logs
  • journald retention caps are now written through a drop-in under /etc/systemd/journald.conf.d/
  • the disk guard can now invoke safe emergency remediation instead of only logging and exiting
  • an optional external alert hook is now supported through OPS_ALERT_WEBHOOK_URL

CI Guardrails Applied

  • .woodpecker.yml now keeps the current single-host path conservative:
    • NODE_OPTIONS=--max-old-space-size=1024
    • npm ci --no-audit --fund=false
    • concurrency remains one workflow on the agent side
  • These are explicitly guardrails, not the architectural fix.

Runbook Consolidation Applied

  • docs/ops/FORGEJO_WOODPECKER_VPS_A_TO_Z_SENSITIVE_RUNBOOK.md now documents:
    • the exact 2026-04-11 failure analysis
    • the difference between manual deploy and Woodpecker deploy
    • why SQLite -> Postgres is useful but not sufficient by itself
    • why same-disk repartitioning is mitigation only
    • why a separate volume for /var/lib/docker is the better same-host storage improvement
    • why the real fix is an external builder agent on a second host
    • which steps are implemented now versus deferred until a second VPS exists

Important Limitation

  • These hardening changes are now present in the repository baseline.
  • They are not automatically live on the VPS until the revised bootstrap/reconfiguration is deliberately applied there.

Live VPS Hardening Follow-Through (2026-04-11)

  • Reconnected to 212.227.22.66 successfully after the earlier outage window.
  • Applied the safe subset of the new hardening directly on the live VPS:
    • installed /usr/local/bin/scriptorium-ops-notify.sh
    • installed /usr/local/bin/scriptorium-maintenance-prune.sh
    • installed /etc/cron.d/scriptorium-maintenance for daily maintenance at 03:45
    • upgraded /usr/local/bin/scriptorium-disk-guard.sh to attempt safe emergency remediation
    • upgraded /usr/local/bin/scriptorium-forgejo-health-guard.sh to use the same alert hook path
    • installed /etc/logrotate.d/scriptorium-ops
    • installed /etc/systemd/journald.conf.d/90-scriptorium-limits.conf
    • updated /etc/docker/daemon.json for Docker JSON log rotation and restarted Docker cleanly
  • Verified service recovery after Docker restart:
    • https://scriptoriumai.io/ -> 200
    • https://ci.scriptoriumai.io/ -> 200
    • woodpecker-server and woodpecker-agent returned healthy
  • Found and fixed one live issue immediately after rollout:
    • Ubuntu's root:syslog /var/log permissions required su root syslog in logrotate
    • updated live /etc/logrotate.d/scriptorium-ops
    • patched the repo bootstrap to emit the corrected config going forward
  • Deliberately did not hot-migrate live Woodpecker from SQLite to Postgres during this recovery pass.
    • Live compose still lacks WOODPECKER_DATABASE_DRIVER / WOODPECKER_DATABASE_DATASOURCE
    • the Postgres migration remains a controlled follow-up step rather than a same-session recovery toggle

Live VPS Postgres Cutover + Retention Realignment (2026-04-11)

This entry supersedes the earlier same-day note that live Woodpecker was still SQLite-backed and that nightly maintenance remained at 03:45.

Live Cutover Completed

  • Reconnected to 212.227.22.66 and completed the controlled Woodpecker database cutover from SQLite to Postgres.
  • Created the live Woodpecker Postgres role/database:
    • database: woodpecker
    • user: woodpecker
  • Snapshotted the pre-cutover SQLite database to:
    • /srv/backups/scriptorium/woodpecker-sqlite-pre-postgres-2026-04-11-181516.sqlite
  • Imported the live SQLite Woodpecker data into Postgres and preserved table counts, including:
    • users=1
    • repos=2
    • pipelines=20
    • steps=90
    • log_entries=3899
  • Updated live /srv/scriptorium-stack/.env and live docker-compose.yml so woodpecker-server now runs with:
    • WOODPECKER_DATABASE_DRIVER=postgres
    • WOODPECKER_DATABASE_DATASOURCE=postgres://woodpecker:...@forgejo-postgres:5432/woodpecker?sslmode=disable
  • Restarted woodpecker-server and woodpecker-agent successfully after cutover.

Live Retention + Scheduling Changes Completed

  • Reduced nightly backup retention to 1 per stream on the live VPS.
  • Moved nightly maintenance to 02:35, exactly five minutes after the 02:30 nightly backup.
  • Added nightly pruning coverage for:
    • scriptoriumai-static-*.tgz
    • cutover-*
  • Added e2scrub_all timer override into the same overnight window:
    • Sundays at 02:40
    • lock-coordinated through /var/lock/scriptorium-nightly-ops.lock
  • Current live Scriptorium-managed automation cadence:
    • 02:30 daily: nightly backup
    • 02:35 daily: maintenance prune
    • 02:40 Sundays: e2scrub_all
    • */15 * * * *: disk guard
    • */5 * * * *: Forgejo/Postgres health guard

Important Retention Bug Found And Fixed

  • One-copy retention exposed a real backup-prune bug when PostgreSQL dumps were pruned with a single postgres-*.sql.gz pattern.
  • Under that pattern, the smaller Woodpecker dump could evict the Forgejo dump.
  • Fixed both the repository bootstrap and the live VPS backup script to prune PostgreSQL dumps per database stream instead:
    • postgres-forgejo-*.sql.gz
    • postgres-woodpecker-*.sql.gz

Live Cleanup Outcome

  • Historical retained backups/artifacts were manually reduced so the one-copy policy could take effect cleanly.
  • Disk usage recovered from a full-root failure condition to approximately 55% used with about 53G free.
  • Current retained live backup root state is intentionally minimal:
    • one forgejo-data-*.tar.gz
    • one postgres-forgejo-*.sql.gz
    • one woodpecker-data-*.tar.gz
    • one postgres-woodpecker-*.sql.gz
    • one scriptoriumai-static-*.tgz
    • one historical cutover-* directory
    • one pre-Postgres Woodpecker SQLite snapshot

Verification

  • https://scriptoriumai.io/ -> 200
  • https://ci.scriptoriumai.io/ -> 200
  • live .env now contains:
    • WOODPECKER_DB_NAME=woodpecker
    • WOODPECKER_DB_USER=woodpecker
    • WOODPECKER_DATABASE_DRIVER=postgres
  • live woodpecker-server and woodpecker-agent are healthy

Production Scope Clarification

  • The frontend/application deploy had already been live beforehand.
  • The 2026-04-11 follow-through in this entry was live VPS operations/configuration hardening, not a new frontend feature deploy.

Woodpecker Runner Split + Personal Builder Correction (2026-04-12)

This entry records the correction of a false operational assumption: the repo had been discussed as if frontend builds were already outsourced to the personal workstation, but the live stack and committed CI config still had production-host builds as the active path.

Live Facts Verified First

  • Confirmed live VPS memory ceiling from free -h:
    • total RAM 3.8 GiB
    • swap 4.0 GiB
  • Confirmed live /srv/scriptorium-stack/docker-compose.yml still only had one Woodpecker agent:
    • woodpecker-agent
    • WOODPECKER_SERVER=woodpecker-server:9000
  • Confirmed there was no repo-visible Windows/personal-builder bootstrap under ops/
  • Confirmed the current repo still used a single root .woodpecker.yml

Operational conclusion:

  • the personal-machine builder had not been instantiated
  • production-host builds were not just a leftover historical run; they were still the active design

Repository Changes Applied

  • Replaced the root .woodpecker.yml with a split multi-workflow layout:
    • .woodpecker/frontend-static.yml
    • .woodpecker/server-collaboration.yml
  • Chose separate workflows as the superior design because:
    • frontend static deploy and server collaboration validation produce different artifacts
    • they target different runtime surfaces
    • they should not share a single rollback/failure boundary
  • Labeled both workflows for external builder pickup only:
    • role=builder
    • backend=local
  • Added Windows-compatible CI scripts:
    • scripts/cicd/deploy-scriptorium-static.ps1
    • scripts/cicd/smoke-scriptorium-production.ps1
  • Added personal-builder bootstrap scripts:
    • ops/woodpecker/personal-builder/install-personal-builder.ps1
    • ops/woodpecker/personal-builder/start-personal-builder.ps1
    • ops/woodpecker/personal-builder/install-personal-builder-task.ps1
    • ops/woodpecker/personal-builder/install-personal-builder-startup.ps1
    • ops/woodpecker/personal-builder/stop-personal-builder.ps1
  • Updated bootstrap_forgejo_woodpecker.sh to emit:
    • WOODPECKER_GRPC_BIND=127.0.0.1:9000:9000
    • WOODPECKER_AGENT_FILTER_LABELS=role=ops,repo=*
    • WOODPECKER_AGENT_DOCKER_API_VERSION=1.44

Local And Live Application

  • Applied the live VPS compose correction:
    • published Woodpecker gRPC on VPS loopback 127.0.0.1:9000
    • constrained the VPS agent with WOODPECKER_FILTER_LABELS=role=ops,repo=*
  • Installed the Windows personal-builder binaries locally:
    • Woodpecker agent 2.8.3
    • plugin-git 2.8.1
  • Started the personal builder locally with:
    • SSH tunnel 127.0.0.1:9100 -> 212.227.22.66:127.0.0.1:9000
    • agent healthcheck on 127.0.0.1:3100
  • Verified locally:
    • TCP 127.0.0.1:9100 reachable
    • TCP 127.0.0.1:3100 reachable
    • http://127.0.0.1:3100/healthz returned 200

Persistence Outcome

  • Task Scheduler installation attempted but Windows returned Access is denied in the current user context.
  • Added and installed Startup-folder persistence instead:
    • %APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\Start-ScriptoriumAI-Woodpecker-Personal-Builder.cmd

Validation

  • npx yaml valid .woodpecker/frontend-static.yml .woodpecker/server-collaboration.yml -> pass
  • PowerShell parse checks for the new CI/personal-builder scripts -> pass
  • bash -n bootstrap_forgejo_woodpecker.sh -> pass
  • npm --prefix ScriptoriumAI-Server test -- --runInBand --runTestsByPath __tests__/collaboration-core.test.cjs __tests__/collaboration.routes.test.cjs __tests__/collaboration-expansion-pack.test.cjs __tests__/smriti.routes.test.cjs -> pass (4/4, 90 tests)
  • npm --prefix scriptoriumai-ui run build -> pass
  • scripts/cicd/smoke-scriptorium-production.ps1 correctly failed against the freshly built local hash before deploy, which is the expected pre-deploy state

Reconstruction Rule Going Forward

  • The production VPS should keep only:
    • Forgejo
    • Woodpecker server
    • VPS-local ops-only Docker agent
  • Builder workflows should land on:
    • the Windows personal builder now
    • a second builder VPS later when available

Personal Builder Finalization And Successful Live Pipeline (2026-04-12)

The runner split and production deploy path are now confirmed working end to end.

Final Working Shape

  • Woodpecker repo 2 had to use:
    • config_path=.woodpecker/
  • .woodpecker without the trailing slash produced webhook responses with:
    • Pipeline-Filtered: true
  • workflow-level path filters also had to be removed for this Forgejo/Woodpecker combination because they produced the same silent filtering outcome
  • the Windows local-backend clone behavior was not reliable for this repo when left implicit, so the working solution became:
    • skip_clone: true
    • explicit PowerShell checkout step
    • git clone --branch main --single-branch ... repo
    • git checkout --detach $env:CI_COMMIT_SHA

Windows Runner-Specific Fixes Required

  • deploy-scriptorium-static.ps1 needed to be hardened for Windows PowerShell 5 parsing:
    • simplified POSIX quoting helper
    • ${...} interpolation around host/user strings that contained :
  • deploy archive creation had to use native Windows tar:
    • %WINDIR%\\System32\\tar.exe
    • using Git/MSYS tar.exe broke on Windows drive-letter paths
  • scp invocation had to use:
    • -P
    • not SSH's -p

Final Verified Successful Run

  • pipeline 41
  • commit b6cc50483f
  • status success
  • steps:
    • checkout -> success
    • ui_build -> success
    • deploy_static -> success
    • smoke_production -> success
    • second-workflow checkout -> success
    • collaboration_validation -> success

Operational Outcome

  • frontend build now executes on the Windows personal builder, not the production VPS
  • collaboration validation also executes on the Windows personal builder
  • production VPS remains the deploy target plus CI control plane
  • the production site is confirmed live after the successful Woodpecker run

Live Black-Screen Recovery (2026-04-12)

The afternoon public-site failure was traced to a stale frontend deployment on the VPS, not to a new source-level regression in the current repository head.

What Was Wrong

  • https://scriptoriumai.io/ returned 200, but Playwright showed a blank body with a runtime failure:
    • No instance of Session found. Make sure to call Session.init
  • verticaltension.com rendered normally, so this was not a full-VPS rendering failure across all hosted sites.
  • The live Scriptorium static root at /var/www/scriptoriumai was still serving:
    • /assets/index-CaJXVhdK.js
  • The current repo-local production build rendered correctly under local preview and produced:
    • /assets/index-DLlta5pV.js
  • SSH inspection of /var/www/scriptoriumai/index.html confirmed the VPS was still pointing at the older broken asset hash, while the current local dist/index.html had a different SHA-256 and different asset references.

Recovery Performed

  • Rebuilt the current UI locally:
    • npm --prefix scriptoriumai-ui run build
  • Archived the current live static root on the VPS:
    • /srv/backups/scriptorium/scriptoriumai-static-20260412T172757Z.tgz
  • Replaced the live static root directly over SSH/SCP using the documented root key in ops/ssh/scriptorium_vps_ed25519
  • Confirmed the published VPS index.html now points at:
    • /assets/index-DLlta5pV.js

Validation

  • Live Playwright verification on https://scriptoriumai.io/ after publish:
    • HTTP 200
    • title ScriptoriumAI — AI-Native Research & Scientific Publication Suite
    • landing-page body text rendered normally
    • prior Session.init pageerror no longer present
  • Live Playwright verification on https://verticaltension.com/:
    • HTTP 200
    • body text rendered normally

Outcome

  • The immediate outage cause was deployment state drift in /var/www/scriptoriumai, not a newly introduced source failure in the current repo head.
  • Production was restored by replacing the stale static bundle with the current built dist/.

C# Perimeter Baseline (2026-04-17)

User direction changed from generic language evaluation to a ScriptoriumAI-only decision: document the approved C# migration boundary and create the first .NET 8 sidecar service scaffold without attempting a full rewrite.

Decision

  • Full-porting ScriptoriumAI to C# was explicitly rejected.
  • Approved migration slices were fixed as:
    • ingress / API edge
    • large-file streaming intake
    • job orchestration
    • compile / process supervision
    • operational control plane
    • later profiling-backed hotspot migration only

New Artifacts

  • Added canonical decision document:
    • docs/SCRIPTORIUMAI_CSHARP_PORTING_PLAN.md
  • Added bounded service scaffold:
    • ScriptoriumAi-Orchestrator/

Orchestrator Baseline

  • ScriptoriumAi-Orchestrator targets .NET 8 and is intentionally additive.
  • The scaffold now provides:
    • streamed multipart intake endpoint
    • staged workspace handling
    • bounded job admission
    • Channel<T>-based dispatch
    • external worker process supervision
    • readiness / health / preflight surfaces
    • in-memory job/audit state
  • Worker execution defaults to simulation mode until real external worker commands are configured, avoiding false claims that the new service already replaces the current runtime estate.

Validation

  • dotnet build C:\ScriptoriumAI\ScriptoriumAi-Orchestrator\ScriptoriumAi-Orchestrator.csproj -> pass

Documentation Sync

  • Updated:
    • docs/ToDo.md
    • ToDo.md
    • IMPLEMENTATION_SUMMARY.md

C# Perimeter Hardening Pass (2026-04-18)

Continued the orchestrator implementation rather than widening the porting scope. The focus stayed on concrete control-plane capabilities inside ScriptoriumAi-Orchestrator.

Added

  • optional API-key protection for /api/orchestrator/* routes via ApiKeyEndpointFilter
  • built-in ASP.NET read/mutation rate limiting policies
  • SSE job-event streaming endpoint:
    • GET /api/orchestrator/jobs/{jobId}/events/stream
  • retention cleanup background service for:
    • stale staged workspaces
    • terminal jobs older than retention
  • richer preflight reporting for:
    • API-key protection status
    • rate-limit configuration
    • cleanup cadence
  • workflow-friendly metrics now include:
    • queue depth
    • reserved memory

Validation

  • dotnet build C:\ScriptoriumAI\ScriptoriumAi-Orchestrator\ScriptoriumAi-Orchestrator.csproj -> pass
  • runtime workflow smoke on 127.0.0.1:5099:
    • upload staged workspace -> pass
    • Compile job admission -> pass
    • simulated dispatch reached terminal Succeeded state -> pass
    • SSE stream returned orchestrator-event frames -> pass

Outcome

  • The orchestrator is still intentionally additive and simulation-backed by default.
  • It now has a materially stronger internal control-plane shape before any live worker-contract takeover begins.

C# Perimeter Test + Packaging Pass (2026-04-18)

Continued the orchestrator lane with validation and packaging work instead of broadening the migration scope.

Added

  • ScriptoriumAi-Orchestrator.Tests/ xUnit integration project
  • Microsoft.AspNetCore.Mvc.Testing-based host factory with temporary workspace isolation
  • API tests covering:
    • /healthz
    • unauthorized orchestrator-route access
    • streamed upload + job admission + terminal success state
    • SSE event streaming
  • container packaging:
    • ScriptoriumAi-Orchestrator/Dockerfile
    • ScriptoriumAi-Orchestrator/.dockerignore
  • optional compose integration behind profile:
    • scriptorium-orchestrator

Validation

  • dotnet test C:\ScriptoriumAI\ScriptoriumAi-Orchestrator.Tests\ScriptoriumAi-Orchestrator.Tests.csproj -> pass (4/4)
  • docker compose --profile orchestrator -f C:\ScriptoriumAI\docker-compose.yml config -> pass

Packaging Limitation

  • docker build -f C:\ScriptoriumAI\ScriptoriumAi-Orchestrator\Dockerfile -t scriptoriumai-orchestrator:test C:\ScriptoriumAI could not be completed because the local Docker daemon/pipe was unavailable:
    • //./pipe/dockerDesktopLinuxEngine

Outcome

  • The orchestrator now has a real test surface and a valid optional compose profile.
  • Full container-image build validation remains pending a live Docker engine.

C# Perimeter Durability + Recovery Pass (2026-04-18)

Validation was extended beyond basic API flow into restart semantics and on-disk durability, which exposed real product defects rather than just missing assertions.

Added

  • file-backed job persistence rooted at:
    • ScriptoriumAi-Orchestrator/data/orchestrator-jobs
  • startup recovery hosted service behavior:
    • Queued jobs are requeued
    • Running jobs are recovered as Failed
    • CancelRequested jobs are recovered as Cancelled
  • additional tests covering:
    • persisted terminal job state on disk
    • startup recovery normalization and safe requeue semantics

Defects Exposed And Fixed

  • OrchestratorJob.Events was not round-tripping correctly through JSON persistence because it was modeled as a getter-only mutable list.
  • live API/detail/SSE/persistence paths were exposing mutable job/event collections directly, which allowed concurrent event writes to collide with JSON serialization and produced:
    • Collection was modified; enumeration operation may not execute

Corrective Changes

  • changed OrchestratorJob.Events to an init-settable list so persisted event history deserializes back into the model correctly
  • added snapshot creation on OrchestratorJob so:
    • job-detail responses serialize immutable copies
    • /api/orchestrator/jobs list responses serialize immutable copies
    • SSE bootstrap sends a copied event list
    • persistence writes a copied job payload instead of a live mutable object

Validation

  • dotnet build C:\ScriptoriumAI\ScriptoriumAi-Orchestrator\ScriptoriumAi-Orchestrator.csproj -> pass
  • dotnet test C:\ScriptoriumAI\ScriptoriumAi-Orchestrator.Tests\ScriptoriumAi-Orchestrator.Tests.csproj -> pass (6/6)

Outcome

  • The orchestrator is no longer memory-only in practice.
  • Restart semantics are now explicit and verified.
  • The JSON/persistence boundary is materially safer under concurrent worker-event emission.

C# Perimeter Container Runtime Validation (2026-04-18)

With Docker Desktop reachable again, the packaging lane could finally be validated properly.

Defect Found

  • The original orchestrator Docker packaging used the repo root as build context:
    • context: .
    • docker build ... C:\ScriptoriumAI
  • That failed because the repo-root .dockerignore intentionally excludes almost everything and did not allow:
    • ScriptoriumAi-Orchestrator/**
  • Result:
    • Docker could not see ScriptoriumAi-Orchestrator.csproj or the service source tree during COPY

Fix Applied

  • changed docker-compose.yml so scriptorium-orchestrator now builds from:
    • context: ./ScriptoriumAi-Orchestrator
    • dockerfile: Dockerfile
  • simplified ScriptoriumAi-Orchestrator/Dockerfile to copy from its own isolated service context instead of expecting the repo root layout

Validation

  • docker build -f C:\ScriptoriumAI\ScriptoriumAi-Orchestrator\Dockerfile -t scriptoriumai-orchestrator:test C:\ScriptoriumAI\ScriptoriumAi-Orchestrator -> pass
  • docker compose --profile orchestrator -f C:\ScriptoriumAI\docker-compose.yml config -> pass
  • container smoke on published host port 5091 -> pass:
    • /healthz -> healthy
    • /readyz -> canAcceptTraffic=true
    • streamed upload -> pass
    • compile job admission -> pass
    • terminal job state -> Succeeded

Outcome

  • Container packaging is now actually usable rather than only syntactically valid.
  • The remaining orchestrator work is no longer “can it build and run in Docker”; that question is now closed.

Editor Compile Contract Repair + Local Stack Recovery (2026-04-18)

The local Docker daemon was reachable again during this pass, which made it possible to distinguish Docker-host drift from application-level defects. The result was clear: there was a real editor compile contract bug in addition to prior local stack drift.

Product Defect Found

  • the repo is currently split between documentation and runtime reality:
    • the canonical ClaudePrism replacement docs describe Excised Legacy Editor / Overleaf as the migration source state to retire after cutover
    • the live repo still ships legacy Overleaf routes, env vars, containers, shims, and compile tests
  • EditorSimplified had its main Compile action routed through the queue-backed corpus_compile lane, which initially looked suspicious because the repo still contains so much Overleaf infrastructure.
  • deeper inspection showed the real issue was not that the editor compile button was on the replacement seam, but that the replacement seam itself is still incomplete:
    • corpus_compile currently generates/publishes compile artifacts and a synthetic PDF bundle path
    • it is not yet a real TeX compile engine replacement

Corrective Changes

  • reverted the temporary rollback that had restored the editors primary compile action to overleafClient.compileProject(routeProjectId)
  • restored the primary editor compile action to the queue-backed replacement seam so the UI remains aligned with the documented architecture direction rather than the stale legacy transport
  • widened pending-job polling budgets for queue-backed runtime/history/migration flows so normal queue latency no longer trips false client-side timeouts after only a few polling intervals
  • restored targeted regression coverage around the queue-backed editor compile contract instead of encoding the legacy Overleaf route as the product truth

Local Docker Recovery

  • confirmed the current local stack now runs cleanly with:
    • sharelatex/sharelatex:5.5.7
    • mongo:6.0
    • postgres:15-alpine
    • redis:alpine
  • recreated the stack from current compose state and verified the core services remained up rather than falling back into restart-loop behavior
  • pruned stale Docker resources after recovery:
    • stopped containers
    • unused images
    • builder cache
    • dangling volume state

Validation

  • npx vitest run src/__tests__/EditorSimplified.corpus-compile.test.tsx src/__tests__/scriptorium-client.test.ts --reporter=dot -> pass (42/42)
  • npm run type-check in scriptoriumai-ui -> pass
  • npx jest __tests__/ai-features.test.cjs __tests__/compile-coordinator.test.cjs __tests__/corpus-compile-artifact-store.test.cjs __tests__/corpus-compile-artifacts.test.cjs --runInBand -> pass (41/41)
  • docker compose -f C:\ScriptoriumAI\docker-compose.yml ps -> all core services up after recreation

Documentation Hygiene

  • archived docs/AGENT_ROADMAP_MEMORY.md to docs/archive/snapshots/AGENT_ROADMAP_MEMORY_SUPERSEDED_2026-04-18.md
  • archived docs/copilotchatbackup.txt to docs/archive/snapshots/copilotchatbackup_2026-04-12.txt

Outcome

  • The temporary rollback to the legacy Overleaf compile seam has been undone.
  • The local stack is no longer pinned to a broken latest Overleaf image combination.
  • The more important finding is now explicit in the log: the codebase is not actually at the architecture state the later roadmap/readiness docs imply. The replacement compile lane is still only partially realized, which is why “100% complete” claims and current runtime behavior diverge.

RP-03 Real Compile Closure (2026-04-18)

The follow-up pass closed the specific RP-03 defect instead of leaving it at diagnosis only.

Product Defect Closed

  • ScriptoriumAI-Server/services/corpus-compile-artifact-store.js had been publishing synthetic compile artifacts instead of running a real TeX engine.
  • ScriptoriumAI-Server/server.js was also dropping document path / name / is_main metadata at /api/corpus/compile, which severed the richer editor payload before it reached the worker.
  • the active manual compile-orchestration panel in EditorSimplified could still enqueue only bare document ids, which meant the advanced panel did not consistently carry the same real document context as the main compile action.

Corrective Changes

  • repaired publishCompileArtifacts(...) so the active lane now runs real latexmk/pdflatex compilation, captures compile.log, stdout, and stderr, returns structured failure diagnostics, and does not fabricate a PDF on real compile failure
  • added ScriptoriumAI-Server/services/corpus-compile-request.js and rewired /api/corpus/compile so document request metadata survives normalization instead of being collapsed to { document_id, content }
  • updated scriptoriumai-ui/src/hooks/useEditorRuntimeTasks.ts so the manual corpus compile panel forwards current project document payloads when available, not just id lists
  • added regression coverage for the server-side request normalizer and updated the editor compile-panel contract test to assert richer payload forwarding

Validation

  • node --check ScriptoriumAI-Server/services/corpus-compile-request.js -> pass
  • node --check ScriptoriumAI-Server/server.js -> pass
  • npx jest __tests__/corpus-compile-request.test.cjs __tests__/corpus-compile-artifact-store.test.cjs __tests__/compile-artifact-route.e2e.test.cjs __tests__/corpus-compile-artifacts.test.cjs __tests__/ai-features.test.cjs --runInBand -> pass (40/40)
  • npx vitest run src/__tests__/EditorSimplified.corpus-compile.test.tsx src/__tests__/scriptorium-client.test.ts --reporter=dot -> pass (42/42)
  • npm run type-check in scriptoriumai-ui -> pass
  • live smoke: real multi-file compile (main.tex -> \\input{sections/intro}) succeeded with compileStatus=succeeded, compileEngine=latexmk, real PDF, and real SyncTeX output
  • topology/structure pass:
    • node mirrors\\GitNexus\\gitnexus\\dist\\cli\\index.js analyze ScriptoriumAI-Server --skip-git --skip-agents-md -> success (2,475 nodes | 6,964 edges | 273 clusters | 205 flows)
    • node mirrors\\GitNexus\\gitnexus\\dist\\cli\\index.js analyze scriptoriumai-ui --skip-git --skip-agents-md -> success (9,020 nodes | 21,782 edges | 669 clusters | 300 flows)
    • npm run sentrux:source-only -> pass (Quality: 5138)

Outcome

  • The active RP-03 path is no longer a synthetic-success façade.
  • The compile route, worker, and editor surfaces now preserve enough context for real multi-file LaTeX compilation.
  • The remaining repo drift is now mostly legacy-surface/documentation debt around Overleaf-era compatibility layers, not this core compile seam.

Broader Legacy Drift Interrogation (2026-04-18)

The next pass widened from RP-03 into the broader replacement surface to determine which legacy seams are still live, which are compatibility-only, and which are now dormant.

Critical Runtime Finding

  • The active routed editor at /app/editor/:projectId is EditorSimplified, not the older Editor.tsx shell.
  • Even so, the active routed editor was still depending on the historical /api/overleaf/... compatibility surface for project metadata, file-tree, document fetch/update, upload, and zip download.
  • That surface had been written around Mongo ObjectId assumptions, while the active routed editor is driven by corpus-native project ids (proj-...).
  • This was a real runtime drift, not mere naming debt.

Corrective Changes

  • added ScriptoriumAI-Server/services/corpus-project-documents.js as a corpus-native compatibility document/file-tree bridge for active routed editor flows
  • expanded ScriptoriumAI-Server/src/routes/overleaf.js so the historical compatibility router now:
    • accepts authenticated corpus users through the platform session layer
    • enforces corpus project permissions
    • branches between legacy Mongo ObjectId projects and corpus-native proj-... projects
    • supports corpus-native project metadata, tree, create/rename/delete, reorder/move, document read/write, upload, zip export, and delete flows
  • updated scriptoriumai-ui/src/services/excised-editor-client.ts so the live routed client now:
    • prefers /api/auth/me over the legacy /user/personal_info identity seam
    • uses the corpus-aware compatibility routes for proj-... document read/update
    • uses the corpus-aware compatibility routes for upload and zip download
  • added/updated targeted regression coverage for the repaired compatibility bridge

Classification Outcome

  • active compatibility seams still live:
    • scriptoriumai-ui/src/services/excised-editor-client.ts
    • ScriptoriumAI-Server/src/routes/overleaf.js
    • re-export shims src/services/overleaf-client.ts and src/services/overleaf-websocket.ts
    • useApiConfig().overleafUrl storage key / config field naming
  • dormant runtime legacy shells:
    • scriptoriumai-ui/src/pages/Editor.tsx
    • scriptoriumai-ui/src/components/PreviewPanel.tsx
    • scriptoriumai-ui/src/hooks/useLegacyEditorSession.ts
    • their associated editor/preview tests
  • optional local-dev compatibility infrastructure still present:
    • docker-compose.yml Overleaf/ShareLaTeX service and related env vars
  • compatibility/domain naming that remains technically functional but semantically stale:
    • overleafClient
    • overleafWebSocket
    • /api/overleaf
    • external shadow mapping with external_system: 'overleaf'

Interpretation

  • The previous “100% complete / no remaining mandatory work” narrative was too blunt.
  • The core routed compile path is now real and working.
  • The core routed file/document path is now corpus-compatible again.
  • The broader repo still retains a substantial compatibility-language layer that should be treated as:
    • functional compatibility debt where live
    • dormant deletion/archival candidates where unused
    • optional infrastructure where retained intentionally for local fallback or migration reference

Validation

  • npm --prefix ScriptoriumAI-Server test -- --runTestsByPath __tests__/overleaf.routes.test.cjs -> pass (3/3)
  • npx vitest run src/__tests__/overleaf-client.test.ts src/__tests__/EditorSimplified.filetree.test.tsx --reporter=dot -> pass (9/9)
  • npm --prefix scriptoriumai-ui run type-check -> pass
  • node --check ScriptoriumAI-Server/services/corpus-project-documents.js -> pass
  • node --check ScriptoriumAI-Server/src/routes/overleaf.js -> pass

Remaining Optional Follow-Up

  • rename active compatibility surfaces from Overleaf-branded identifiers to neutral legacy-compat naming
  • decide whether the dormant Editor.tsx / PreviewPanel.tsx stack should be archived or removed
  • decide whether external shadow mappings should remain overleaf-named or be generalized
  • decide whether the corpus compatibility document bridge should become durable rather than in-memory

Compatibility Neutralization + Durable Bridge Follow-Through (2026-04-18)

The next pass converted the broad follow-up items above into concrete compatibility-boundary repairs instead of leaving them as narrative debt.

Corrective Changes

  • added active neutral wrappers:
    • scriptoriumai-ui/src/services/legacy-compat-client.ts
    • scriptoriumai-ui/src/services/legacy-compat-websocket.ts
  • rewired active routed UI imports (Dashboard, ProjectShareModal, useEditorProjectDocuments, useProjectSearch, smriti-actor) to use the neutral wrappers instead of direct Overleaf-branded imports
  • switched the active compatibility route prefix in scriptoriumai-ui/src/services/excised-editor-client.ts to /api/legacy-compat while preserving /api/overleaf as a server alias
  • migrated the active settings key from overleafUrl to legacyCompatUrl with backward-compatible hydration in scriptoriumai-ui/src/hooks/useApiConfig.ts
  • generalized external shadow canonical naming in ScriptoriumAI-Server/services/project-manager.js and related tests/scripts from overleaf to legacy_editor while keeping alias normalization for historical callers
  • made ScriptoriumAI-Server/services/corpus-project-documents.js durable:
    • persisted state to ScriptoriumAI-Server/data/corpus-project-documents.json
    • pruned stale project snapshots
    • synced collaboration document writes back into the compatibility snapshot
  • quarantined dormant legacy shells by moving implementations to .legacy files and leaving explicit re-export shims at:
    • scriptoriumai-ui/src/pages/Editor.tsx
    • scriptoriumai-ui/src/components/PreviewPanel.tsx
    • scriptoriumai-ui/src/hooks/useLegacyEditorSession.ts

Validation

  • server targeted compatibility regression suite:
    • npx jest __tests__/overleaf.routes.test.cjs __tests__/project-manager.test.cjs __tests__/project.routes.test.cjs __tests__/security-project-external-shadow-smoke.test.cjs __tests__/collaboration.routes.test.cjs --runInBand -> pass (51/51)
  • UI targeted compatibility regression suite:
    • npx vitest run src/__tests__/overleaf-client.test.ts src/__tests__/Dashboard.share.test.tsx src/__tests__/EditorSimplified.filetree.test.tsx src/__tests__/useApiConfig.test.tsx src/__tests__/Settings.right-pane-default.test.tsx --reporter=dot -> pass (19/19)
  • repo-wide UI validation:
    • npm run type-check in scriptoriumai-ui -> pass
    • npm run build in scriptoriumai-ui -> pass
  • server syntax validation:
    • node --check ScriptoriumAI-Server/scripts/security-project-external-shadow-smoke.cjs -> pass
    • node --check ScriptoriumAI-Server/src/routes/overleaf.js -> pass
    • node --check ScriptoriumAI-Server/server.js -> pass

Follow-Up

  • inspect each dashboard feature individually and validate cross-feature wiring after the compatibility neutralization pass
  • decide how aggressively to archive/remove the remaining compatibility-only overleaf aliases, script identifiers, and local-dev fallback infrastructure once no active caller depends on them

Dashboard Feature + Cross-Wiring Sweep (2026-04-18)

After the compatibility neutralization pass, the dashboard itself was interrogated as a separate operator surface rather than assumed healthy from the earlier share/invite fixes alone.

Findings

  • the visible Starred tab was not implemented; it silently fell through to the same dataset as All Projects
  • several older dashboard tests had drifted behind the live usePlatformAuth requirement and the new legacyCompatClient entrypoint
  • tag edits inside project cards were bubbling into the project-card click handler, which could navigate into the editor while an operator was trying to add or remove tags

Corrective Changes

  • added persisted dashboard project-star state in scriptoriumai-ui/src/hooks/useStarredProjects.ts
  • updated scriptoriumai-ui/src/pages/Dashboard.tsx so:
    • the Starred tab filters correctly
    • project delete also removes the project from the star list
    • tag edits trigger filter recomputation through a tag-revision dependency
  • updated scriptoriumai-ui/src/hooks/useProjectSearch.ts to recompute when tag-backed dashboard metadata changes
  • updated scriptoriumai-ui/src/components/TagManager.tsx to stop propagation so tag controls no longer trigger project-card navigation
  • refreshed the dashboard regression suites to the live auth/client contract and added explicit coverage for:
    • starred filtering
    • dynamic tag-to-filter propagation
    • search, recent, and sort behavior

Validation

  • npx vitest run src/__tests__/Dashboard.create.test.tsx src/__tests__/Dashboard.delete.test.tsx src/__tests__/Dashboard.delete.confirm.test.tsx src/__tests__/Dashboard.tags.test.tsx src/__tests__/Dashboard.share.test.tsx src/__tests__/Dashboard.starred.test.tsx src/__tests__/Dashboard.filters.test.tsx --reporter=dot -> pass (15/15)
  • npm run type-check in scriptoriumai-ui -> pass
  • npm run build in scriptoriumai-ui -> pass
  • browser-side authenticated dashboard verification was not executed because there was no running local dev server or other login-capable local surface at the time of the sweep

Scan Refresh + Compile/Auth Stability Sweep (2026-04-19)

This pass was executed to refresh the architecture scan baseline, capture the current GitNexus operating mode for this repository, and verify that the active compile/auth repairs still hold under targeted regression coverage.

Scan Findings

  • repo-root Sentrux initially failed on a real source regression:
    • scriptoriumai-ui/src/pages/Dashboard.tsx had drifted back to fan-out=16
  • repo-root GitNexus monolith re-index did not finish within a 20-minute window and left stale local worker processes behind
  • folder-level GitNexus re-indexes remained viable for the two active product surfaces:
    • scriptoriumai-ui indexed successfully with npx gitnexus analyze . --skip-git --skip-agents-md
    • ScriptoriumAI-Server indexed successfully with npx gitnexus analyze . --skip-git --skip-agents-md
  • because those folder-level indexes are created with --skip-git, GitNexus status continues to report them as commit-stale; this is expected for subfolder indexes inside the monorepo and does not mean the graph content failed to refresh

Corrective Changes

  • extracted scriptoriumai-ui/src/pages/dashboard-boundaries.tsx so the dashboard lazy/modal and UI-boundary imports are aggregated behind a page-local boundary
  • rewired scriptoriumai-ui/src/pages/Dashboard.tsx to consume that boundary and restored the Sentrux architecture baseline
  • added the local authenticated browser-pass account details used during the live dashboard/editor compile smoke pass to docs/auth/ADMIN_CREDENTIALS.md without replacing the existing admin credentials
  • removed scan-generated .claude skill folders and local browser-pass scratch artifacts before staging so the commit surface remains product-relevant rather than tool-scratch-heavy

Validation

  • npm --prefix scriptoriumai-ui run type-check -> pass
  • .\sentrux.exe check -> pass, quality 5341
  • npm run sentrux:source-only -> pass, quality 5151
  • server targeted regression suite:
    • npx jest __tests__/tier-enforcement.test.cjs __tests__/corpus-compile-request.test.cjs __tests__/corpus-compile-artifact-store.test.cjs __tests__/compile-artifact-route.e2e.test.cjs __tests__/corpus-compile-artifacts.test.cjs __tests__/ai-features.test.cjs --runInBand -> pass (74/74)
  • UI targeted regression suite:
    • npx vitest run src/__tests__/EditorSimplified.corpus-compile.test.tsx src/__tests__/EditorSimplified.filetree.test.tsx src/__tests__/auth-env.test.ts src/__tests__/scriptorium-client.test.ts src/__tests__/api-base-url.test.ts --reporter=verbose -> pass (49/49)
  • post-validation process hygiene:
    • confirmed no stray node.exe processes remained after the final UI run

Current Operator Readout

  • the active compile/auth route repairs remain intact under targeted server and UI regression coverage
  • the current Sentrux baseline is clean again
  • the GitNexus-safe operating mode for this repository is currently:
    • avoid repo-root monolith analyze for routine scans
    • refresh scriptoriumai-ui and ScriptoriumAI-Server separately with --skip-git --skip-agents-md