Skip to content

Latest commit

 

History

History
280 lines (156 loc) · 66.8 KB

verification.md

File metadata and controls

280 lines (156 loc) · 66.8 KB

Verification record

Recovery contents preview — issue #15

Recorded 2026-11-11, extending the local issue #23 work on fix/recovery-conflict-clarity. Issue #15 now has an expandable pending-copy summary in the launcher/banner and recovery settings: source-file count, unapplied-draft count, filenames, per-file draft status and applied/draft UTF-8 byte sizes. The copy’s name and actual saved time remain visible. The summary explicitly excludes changes that failed to save; it does not invent a current-tab save time or provide snapshot history. No persistence format or storage behavior changed.

npm run test:e2e -- --project=functional recovery.spec.ts --grep '@critical restores exact' failed against the prior UI because the file summary did not exist (sandbox/recovery-preview-before.log; screenshot and trace in sandbox/recovery-preview-before-artifacts/). The strengthened scenario saves two distinguishable drafts, waits for the latest exact durable project, reloads and checks its saved timestamp and per-file byte counts (independently computed with Node’s UTF-8 byte counter, including Unicode). Reading the summary must not mutate the stored record. Restoring compares exact applied source, latest drafts and both saved view layouts.

npm run test:e2e -- --project=functional recovery.spec.ts passed all ten recovery scenarios after the change (sandbox/recovery-preview-functional.log). npm run check passed formatting, architecture, TypeScript, 160 Vitest tests and ten Node checks (sandbox/recovery-preview-check.log); production builds passed through Playwright. The four expanded pending-copy captures were regenerated with npm run test:e2e -- --project=visual --grep 'recovery conflict and saved-copy' --update-snapshots and inspected in light/dark at 1440px/768px (sandbox/recovery-preview-visual-generate.log). The first generation attempt was stopped because the visual fixture imports nine compressor files, while its new summary assertion incorrectly expected the two-file Workshop used by the functional test. The expectation now derives the known file count from the imported fixture; the application behavior and comparison tolerances were not changed. That stopped run is recorded in sandbox/recovery-preview-visual-fixture-initial.log. Normal comparison with npm run test:e2e -- --project=visual --grep 'local recovery dialog|recovery conflict and saved-copy' passed all eight recovery scenarios without updates (sandbox/recovery-preview-visual-compare.log). A preceding comparison process exited with signal 143 after five passes and no assertion failure; its partial log is retained as sandbox/recovery-preview-visual-interrupted.log. The leftover test server was stopped before the complete rerun.

These bounded successful-save and conflict checks do not reproduce or establish the cause of the report’s original condensed/older copy. Full suites outside recovery, manual screen-reader testing, hosted CI and deployment were not performed. These local checks do not establish a deployed fix.

Recovery conflict clarity — issue #23

Recorded 2026-11-11 on fix/recovery-conflict-clarity, based on develop 76627b0. This addresses WP26 Bug 10 / issue #23 locally; it does not establish a fix for stale exploration messages or silent recovery data loss.

The real two-tab scenario reproduced the ambiguous conflict message. The existing compare-and-swap and Retry behavior already preserved both copies; the explanation was incomplete. Conflict text now states that Retry only checks the saved copy and does not replace the live project. After Retry, banner and settings show the pending copy’s project name and saved timestamp and explain Restore versus Discard. The live project has no invented save time. Storage policy, recovery envelope and project format are unchanged.

npm run test:e2e -- --project=functional recovery.spec.ts --grep 'second tab' failed against the original implementation at the new Retry-explanation assertion (sandbox/recovery-conflict-before.log; trace and screenshots retained in sandbox/recovery-conflict-before-artifacts/). The expanded suite initially passed nine scenarios and failed the restore-choice fixture: its earlier download had marked the project saved, so the dirty-work confirmation under test was not required. The corrected fixture makes a new undownloaded edit and waits for the actual confirmation, then verifies Cancel preserves it before accepting Restore. That initial failure is retained in sandbox/recovery-conflict-functional-initial.log and sandbox/recovery-conflict-initial-artifacts/.

npm run test:e2e -- --project=functional recovery.spec.ts then passed all ten scenarios, including exact source/draft/layout preservation in both tabs, Retry without replacement, cancelled and accepted Restore, explicit Discard with queued local saving, denied storage, malformed records, clean-state clearing and failed real-engine restore (sandbox/recovery-conflict-functional.log). npm run check passed formatting, architecture, TypeScript, 160 Vitest tests and ten Node checks (sandbox/recovery-conflict-check-final.log). Fresh production builds passed through Playwright.

Eight new screenshots were generated with npm run test:e2e -- --project=visual --grep 'recovery conflict and saved-copy' --update-snapshots and inspected at 1440px/768px in light/dark (sandbox/recovery-conflict-visual-generate.log). Their foreign IndexedDB record and timestamp are controlled presentation fixtures; the manager, compare-and-swap, Retry and dialog interactions are real. Normal comparison with npm run test:e2e -- --project=visual --grep 'local recovery dialog|recovery conflict and saved-copy' then passed all eight scenarios without baseline updates (sandbox/recovery-conflict-visual-compare.log). The scenarios assert dialog bounds, keyboard focus containment and Escape return. Full functional/visual coverage outside recovery and manual assistive-technology testing were not run. No commit, hosted CI result, deployment or issue closure is implied.

Editor guide review

Recorded 2026-11-10. The guide now explains how to reveal collapsed Explorer and model representation controls hidden by Code layout. Each step supplies the dialog's accessible description and a polite, atomic live region. Removing the custom close-focus override lets outside clicks keep focus on the chosen control; Escape, Close and Done still return focus to Guide. These changes do not switch layout or modify project data.

npm run check passed formatting, architecture, TypeScript, 160 Vitest tests and ten Node checks (sandbox/guide-review-check.log). npm run test:e2e -- --project=functional editor-tour.spec.ts passed all four real-engine browser scenarios after a fresh production build (sandbox/guide-review-functional.log): draft/project preservation and keyboard return, all five steps at 390px, hidden-control hints with unchanged layout and restart, and outside-click focus. Before the fix, the accessible-description and hidden-control assertions failed against the original implementation (sandbox/guide-review-before.log); the existing phone scenario passed.

npm run test:e2e -- --project=visual completed with 80 passes and one screenshot mismatch (sandbox/guide-review-visual.log). All four editor-guide comparisons passed without updating baselines. The failed requirement hierarchy and declared satisfaction in light at 768 comparison differed by 1,907 pixels, confined to diagram text/edges; its original trace, actual and diff are preserved in sandbox/guide-review-requirements-failure/. An isolated fresh-build rerun of that exact scenario passed without code or baseline changes (sandbox/guide-review-requirements-recheck.log). This is an intermittent visual mismatch with unresolved cause, not an entirely green full-suite run. The complete functional suite was not rerun.

The guide was inspected manually in light/dark themes at desktop and phone widths. Automated accessibility assertions check the exposed description/live-region attributes, not actual screen-reader announcements; manual assistive-technology verification and Firefox/WebKit remain unperformed. These are local results, not hosted CI.

Optional editor guide

Recorded 2026-11-10. The rover-specific inline view descriptions were removed. An optional five-step Guide in the project header introduces Explorer, layout, applying source, model representations and downloading for any open project. It uses the existing popover primitives; there are no new dependencies or project format changes.

npm run check passed formatting, architecture, TypeScript, 160 Vitest tests and ten Node checks (sandbox/editor-tour-check-final.log). Fresh builds passed through Playwright. The initial five-case functional run covered the guide and real-engine rover workflows (sandbox/editor-tour-functional.log); two final guide cases passed with an unapplied draft, keyboard dismissal/focus return, and all popup bounds at 390px with Explorer collapsed (sandbox/editor-tour-draft.log). The guide regression failed against the retained previous build because its Guide button was absent (sandbox/editor-tour-before.log). An initial phone test failed in fixture setup at a hidden Explorer view; after starting the project before resizing, it exposed an animation-timing measurement, corrected with a retrying bounds assertion (sandbox/editor-tour-final.log, sandbox/editor-tour-final2.log).

The visual suite generated 81 baselines (sandbox/editor-tour-visual-all.log). The changed header, removal of rover notes and guide captures were inspected in both themes and widths via sandbox/editor-tour-review/; initial desktop guide placement was clipped and was corrected before the final review. Normal comparison then passed all 81 without updates (sandbox/editor-tour-visual-final.log, output sandbox/playwright/editor-tour-visual-final). These are local Chromium results, not hosted CI or a complete accessibility audit.

OpenSysML 0.12 and requirements/source assistance

Recorded 2026-11-06. OpenSysML is now pinned to 0.12.0 with the local overlays ported, verified source/toolchain checksums and retained provenance. SysML Toolkit remains at 0.10.10. Requirements table/matrix inspection is read-only; references navigate project source and formatting creates an undoable draft requiring explicit Apply. No production dependencies or saved-format changes.

  • npm run check passed formatting, architecture, TypeScript, 160 tests in 23 Vitest files and ten Node checks (sandbox/opensysml-012/check-complete.log). npm run build -- --outDir sandbox/opensysml-012/final-dist passed, including engine preparation/Go tests, with the existing bundle-size warning (build-final.log in that directory).
  • The complete functional run passed 109/110 (functional-final.log, output sandbox/playwright/opensysml012-functional-final). Its new named-view/matrix regression exposed a late navigation callback resetting the user's matrix selection. Navigation now switches representation at the start, restores it on failure and disables representation controls while busy. Fresh-build requirements-data.spec.ts engine-upgrade.spec.ts language-assistance.spec.ts passed all eleven (fixed-functional.log, output sandbox/playwright/opensysml012-fixed-functional). This includes exact old-engine identities/endpoints and positioned-project reopen, references, formatting undo/redo, declared verification through an alias, failure/retry and unchanged source/drafts/positions. The entire 110-case suite was not rerun after this bounded fix.
  • All 77 visual baselines were generated and visually reviewed at desktop/narrow widths in both themes. Normal comparison passed 75/77 (visual-final.log); two narrow requirement-diagram captures differed only within the zoomed canvas. Follow-up captures were pixel-identical across three runs; both images and their bounds were inspected before correcting the initial regenerated baselines. The centering helper now waits for settled viewport geometry before reading bounds. No tolerances or semantic assertions were weakened. All four requirement-diagram comparisons then passed (requirements-visual-confirmed.log). Against the final fresh build, all fifteen workbench, requirement-diagram and table/matrix comparisons passed without snapshot updates (fixed-visual-confirmed.log, output sandbox/playwright/opensysml012-fixed-visual-confirmed). An intermediate shared-server run lost its preview process and had eight connection-refused failures; the final run owns its server.
  • Deliberately dropping negation failed the new relationship assertion; restoring it passed. Deliberately removing boundary endpoint lifting failed the declared-connector regression; restoring it passed. Retained logs: polarity-mutation.log, polarity-restored.log, boundary-mutation.log, boundary-restored.log under sandbox/opensysml-012/. The real navigation race also demonstrated the new browser preservation assertion failing before the fix.

Screenshot contact sheets and pixel-bound manifest are under sandbox/opensysml-012/visual-review/. Compatibility report records the native behavior changes and fixture provenance. These are local Chromium results, not hosted CI, Firefox/WebKit, complete accessibility auditing or performance evidence. The matrix shows declared links to linked elements, retains negation and unlinked rows, and limits display/export to 10,000 cells; it does not execute verification or infer compliance. Cross-version compatibility is bounded to the retained fixtures.

Consolidated project launcher

Recorded 2026-11-06. The empty launcher now has three ordered choices: New project, Open files or project, and Load example (Inspection rover). It removes the air-workshop choice and its raw source imports from the production app, condenses save guidance and removes the planned-workflow disclosure. Existing project resume, replacement protection, import failure handling and local recovery remain available. Compressor sources remain unchanged as explicit import/regression fixtures; the fixture helper imports their portable bundle rather than relying on a launcher-only entry point.

  • Before changing the UI, the current launcher passed its existing desktop visual comparison (sandbox/launcher-before.log). The new no-air-button regression then failed against the old implementation (sandbox/launcher-consolidation-red.log).
  • npm run check passed formatting, architecture, TypeScript, 154 Vitest tests and ten Node checks (sandbox/launcher-check.log). Fresh production builds passed through the browser runs, with the existing bundle-size warning. Production JavaScript no longer contains the compressor project's name or namespace.
  • Focused functional run (sandbox/launcher-functional.log): six passed, including empty startup without engine loading, three keyboard-accessible choices, exact compressor import, rover startup, new-project cancellation/focus return, source import and failed/cancelled replacement preservation. The mobile scenario failed because the migrated fixture helper inspected a hidden Explorer view button. The helper now verifies the same exact view ID through the visible named-view selector. No identity assertion was removed.
  • Follow-up shell-entry.spec.ts toolbar.spec.ts rover.spec.ts --grep 'launcher and browser navigation|unsupported project bundle|wrapped mobile|opens the inspection rover': four passed in 28.4 seconds (sandbox/launcher-preservation.log), covering exact drafts/source DOM/camera/layout/history through resume, invalid bundle retry, mobile controls and all six rover sources through its guided tour.
  • Reviewed six entry-surface cases at 1440/768/390 in light/dark (sandbox/launcher-visual-review.log, six passed in 12.9 seconds), plus five fixture/header/keyboard cases (sandbox/launcher-fixture-visual-review.log, five passed in 28.1 seconds). Six launcher images intentionally change; two desktop panel images change only the imported fixture caption within (300,35)–(379,45). Narrow fixture captures are unchanged. Captures and exact bounds were inspected: sandbox/launcher-consolidation-review.jpg, sandbox/launcher-fixture-review.jpg, sandbox/launcher-visual-diff.json. Baseline generation is separate from normal comparison.

Final normal comparison with --project=visual --grep 'OpenMBEE entry surfaces|resized workspace panels|workbench and keyboard' passed all eleven in 35.6 seconds without updates, retries or skips (sandbox/launcher-visual-final.log). The final repository-wide npm run check stopped at formatting of unrelated, newly present docs/research/syside.md (sandbox/launcher-final-check.log); that file was left untouched. Formatting checks over the changed files passed (sandbox/launcher-changed-format.log). Architecture, TypeScript, 154 Vitest tests and ten Node checks passed independently (sandbox/launcher-final-code-check.log), distinguishing that formatting blocker from this change. The user subsequently requested removal of the untracked Syside research document; it was removed before committing. The complete npm run check then passed (sandbox/launcher-commit-check.log), including formatting, architecture, TypeScript, 154 Vitest tests and ten Node checks.

Full functional/visual suites, hosted CI, deployment, Firefox/WebKit and complete accessibility auditing are outside this focused checkpoint. No semantic engine, source model, dependency or saved format changes.

Recovery dialog capture isolation

Recorded 2026-11-06 after publishing rover commit 04f6d41. Hosted run 42165758615 passed code checks, audit and all 15 critical browser workflows in both attempts. Both attempts passed 68/69 visual comparisons; the remaining light recovery-dialog crop differed at pixel (399, 295), its last row. The original baseline retained a dark pixel at the crop edge, consistent with the underlying diagram leaking into an enclosing pixel-rounded screenshot. The focused local reproduction also failed at exactly that pixel (sandbox/recovery-pixel-repro.log); captured trace and diff evidence distinguish it from a dialog-content or semantic failure.

This scoped dialog comparison now applies tests/e2e/recovery-dialog.css only during capture, hiding the unrelated React Flow background while preserving layout. Full-page diagram comparisons remain unchanged. The first isolated run passed three cases and retained the expected failure against the old background-bearing baseline (sandbox/recovery-pixel-isolated.log). Only the affected light baseline is regenerated for the intentionally isolated capture. No screenshot tolerance, semantic assertion, application styling or production code changes. The changed baseline was visually inspected. Normal comparisons then passed all four theme/width cases in 23.3 seconds (sandbox/recovery-pixel-final.log), including keyboard focus return. npm run check passed again with 154 Vitest tests and ten Node checks (sandbox/recovery-pixel-check.log). The final hosted run remains separate from these local results.

Compact rover presentation

Recorded 2026-11-06. Named structural graphs with at least ten nodes now use narrower cards, tighter gaps and 32-unit attribute rows. Simple scalar defaults display without declaration syntax or redundant fractional zeros; complex declarations retain exact spelling, and all rows retain exact declarations in their titles. Source and engine attribute payloads are unchanged.

npm run check passed formatting, architecture, TypeScript, 154 Vitest tests and ten Node checks (sandbox/rover-polish-check.log). The fresh production build and actual-worker rover default/assembly movement-and-reopen checks passed two cases in 30.4 seconds (sandbox/rover-polish.log). These assert resolved native endpoints, all ten routes against unrelated compound interiors, orthogonal SVG geometry, exact source and compatible saved positions. The small formatter unit verifies both concise labels and expression fallback.

The targeted 19-case visual baseline review covers desktop/narrow layouts in both themes, including keyboard-operated appearance, panels, structural selection, nested assemblies, default rover and guided behavior. Captures were visually inspected, including sandbox/rover-polish-review.jpg. The older PR #11 CI failure was limited to diagnostics-light/dark diagram-position screenshots; its actual/diff captures are retained under sandbox/previous-pr-evidence. Baseline review passed 19 cases in 2.3 minutes (sandbox/rover-polish-visual.log). The subsequent normal comparison added the four diagnostics cases and passed all 23 in 2.8 minutes without updates, retries or skips (sandbox/rover-polish-visual-final.log, output sandbox/playwright/rover-polish-visual-final). This is local evidence, not hosted CI. No Firefox/WebKit, full accessibility audit, simulation or arbitrary moved-node obstacle rerouting is established.

Structural connection routing around unrelated containers

Recorded 2026-11-05 on feature/inspection-rover-showcase. The rover screenshot exposed a mismatch: named structural diagrams used ELK node placement but discarded its routes, drawing endpoint-only smooth-step connections across inspection and its children. Named interconnection diagrams now pass actual native port IDs, sides, rendered row positions and label reservations into ELK and render its orthogonal sections/label positions through the shared RoutedEdge adapter. The adapter translates routes with their owning container during assembly movement and retains orthogonal direct links at physical handle tips. No source semantics, persistence format, dependencies or engine pins changed.

The actual-worker regression failed against the previous built app with camera/lidar/radio crossings and overlapping labels (sandbox/structural-routing-red.log, sandbox/playwright/structural-routing-red). The geometry helper now additionally treats a compound's entire body as an obstacle unless it owns one of that connection's native endpoints. Thus a line cannot pass through inspection's empty interior merely because it misses camera/radio. All ten rover labels, card/header/group bounds, label overlap/viewport bounds and orthogonal SVG sections are checked. Existing overview/behavior checks retain their original scope by default.

Checks and retained evidence:

  • Focused layout units: npx vitest run src/lib/workbench/diagrams/structure.test.ts: ten passed (sandbox/structural-routing-unit.log), including compatible absolute positions, added connections and fractional owner boundaries.
  • npm run test:e2e -- --project=functional assembly.spec.ts rover.spec.ts --output=sandbox/playwright/structural-routing-functional: six passed; mission drag failed because its fixed screen-space grab point missed a small fitted card. The drag helper now chooses a point inside the actual card header, retaining the same drag displacement and outcome assertion. The unchanged mission preservation assertion passed in the targeted rerun (sandbox/structural-routing-mission-drag.log, one passed in 14.0 seconds). No application failure was hidden or assertion weakened.
  • Final port alignment: visual inspection found a slight diagonal in an otherwise straight assembly connection. React Flow's logical parent IDs do not create DOM ancestors, so nested leaf port rows also share their spare body height. The fixed coordinates now account for this, borders and attribute rows. Direct links remain orthogonal when actual tips differ from planning points. npm run test:e2e -- --project=functional assembly.spec.ts rover.spec.ts --grep 'renders nested ownership|opens the inspection rover|moved rover assembly' --output=sandbox/playwright/structural-routing-aligned: three passed in 23.8 seconds, establishing actual port endpoints, the complete rover graph and geometry/source preservation after moving the assembly and portable reopen. Earlier group-preservation evidence also passed two cases in 17.4 seconds (sandbox/structural-routing-preservation.log).
  • npm run check passed formatting, architecture, TypeScript, 153 Vitest tests and ten Node checks (sandbox/structural-routing-check-confirmed.log). An earlier check stopped at test formatting; corrected runs passed. Fresh production builds passed through browser runs, with the existing bundle-size warning.
  • Final targeted visual review: npm run test:e2e -- --project=visual --grep 'workbench and appearance dialog|workbench and keyboard|nested assembly|resized workspace panels|selected structural nodes|default rover architecture|rover guided behavior' --update-snapshots --output=sandbox/playwright/structural-routing-aligned-visual-review: 19 passed in 1.7 minutes. Earlier intermediate alignment captures/comparisons remain under sandbox/playwright/structural-routing-visual-review and structural-routing-visual-final; those preceded the final row-alignment correction.
  • Normal comparison with the same selector and --output=sandbox/playwright/structural-routing-aligned-visual-final passed all 19 in 1.7 minutes without baseline updates, retries or skips. This includes actual SVG geometry assertions for the default rover at desktop/narrow widths in both themes. Behavior captures remain covered alongside structural changes.

Fifteen structural images intentionally change, with 85 images byte-for-byte unchanged against sandbox/structural-routing-baselines-before/. Exact files are in sandbox/structural-routing-visual-manifest.json. Changed captures were inspected on four sheets under sandbox/structural-routing-inspection/, with final assembly endpoint alignment and rover captures also inspected at full size in both themes and widths. Full visual/functional suites, hosted CI, deployment, Firefox/WebKit and comprehensive accessibility were not repeated. Arbitrary obstacle rerouting after individual-node movement remains outside this generated-layout/container-translation contract. Source selection and compatible saved positions remain independently tested; routes are transient presentation geometry.

Inspection rover showcase and behavior rendering

Recorded 2026-11-05 on feature/inspection-rover-showcase, using Node 26.3.1 and the existing pinned engines. The product default is now a six-file Inspection rover with four nested assemblies, ten resolved port connections, effective source-declared attributes, component specialization, a mission, operating states and four quantified requirement/satisfaction traces. Four source allocations connect mission steps to real rover usages. The built-in guide connects the five authored views. The air workshop remains separately available; its existing sources are unchanged. New rover sources are authored here under Apache-2.0.

The bridge adds exact source slices for effective project attribute members via MembersOf, excluding library declarations; it does not evaluate defaults or infer measured performance. A retained Go test verifies the same inherited declaration on two distinct typed usages. Native action/state graphs now use compound rendering, terminal shapes, directed relationships and existing source/portable-position contracts. Their transport uses the existing graph validator, with two added unresolved-endpoint regressions. No dependency versions, engine pins or portable/recovery format changed. The generated engine overlay/provenance changes through the existing preparation process.

Evidence and checks:

  • npm run check passed formatting, architecture, TypeScript, 153 Vitest tests and ten Node checks (sandbox/rover-check-confirmed.log). A first check stopped at catalog formatting; corrected runs passed. Fresh production builds passed throughout the browser workflow, including retained Go bridge tests; the existing bundle-size warning remains.
  • Hiding the actual attribute compartment deliberately made the real-engine showcase assertion fail with Received: hidden (sandbox/rover-attributes-red.log, sandbox/playwright/rover-attributes-red). Restored rendering passed the critical path. This is UI fault injection, not a substituted semantic engine.
  • Initial local probes rejected reserved identifiers frame and message; final source uses scanData and report. The retained native capture (sandbox/rover-native.json) supplied the reviewed catalog expectations. npm run test:e2e -- --project=functional examples.spec.ts --grep 'example library: (inspection-rover|actions|states|air-compressor)$' --output=sandbox/playwright/rover-catalog: four passed in 1.3 minutes. This exercises all five rover views, both small behavior fixtures, all fourteen air-workshop views and exact source download/reopen. It preceded the final behavior routing refinement below.
  • npm run test:e2e -- --project=functional rover.spec.ts examples.spec.ts shell-entry.spec.ts --grep 'inspection rover|mission source|lifecycle source|example library (inspection-rover|actions|states|air-compressor)|landing and direct example|newer example opening' --output=sandbox/playwright/rover-native-final: five passed in 35.9 seconds. The grep omitted the colon needed to select catalog cases, so this run establishes rover/entry coverage only; catalog coverage is recorded separately.
  • rover.spec.ts verifies exact architecture identities/connections, effective declared values, all six source texts, requirement links and independent view browsing. Both behavior families reveal exact node/edge source ranges by keyboard, retain source on Enter, and preserve independently moved positions and exact portable data after a fresh reopen. sandbox/rover-source-geometry-final.log: three passed in 33.9 seconds before final routing; final routing results follow.

Behavior routing refinement

Inspecting the initial captures showed generic smooth-step return paths crossing state cards and overlapping labels. The actual-SVG regression against that built version failed on card/header crossings and label overlap (sandbox/rover-behavior-routing-red.log). Behavior layout now requests fixed-side ports and labels from ELK, translates its container-relative orthogonal sections into canvas coordinates, retains labels only where native declarations supply them, and constrains initial/final layers. These are generated presentation routes, not modeled source routes. Arbitrary obstacle avoidance after manual movement remains outside scope.

npm run test:e2e -- --project=functional rover.spec.ts --output=sandbox/playwright/rover-routing-confirmed: three passed in 35.0 seconds, with actual SVG/card/header intersections, named label overlap/counts, exact node/relationship source selection and portable geometry preservation. An intermediate attempt flagged anonymous arrows as missing labels: the helper now takes explicit unlabelled native edge IDs, still checks every path and rejects unexpected labels on those edges. Existing overview assertions retain their default requirement that every relationship has a label; no crossing or overlap assertion was weakened.

Final compatibility after routing and the final drag-event guard: npm run test:e2e -- --project=functional rover.spec.ts examples.spec.ts --grep 'mission source|lifecycle source|example library: (actions|states|air-compressor)$' --output=sandbox/playwright/rover-compatibility-final: five passed in 1.6 minutes (sandbox/rover-compatibility-final.log). This includes the smaller action/state fixtures, all fourteen air-workshop views and both rover behavior source/geometry regressions.

The final default-tour smoke against the freshly built local preview also asserts each selected native view's actual rendered root text: npx playwright test --config=sandbox/rover-local.config.ts --project=functional rover.spec.ts --grep 'opens the inspection rover' --output=sandbox/playwright/rover-default-confirmed: one passed in 6.8 seconds (sandbox/rover-default-confirmed.log). This uses the real local production preview without another build.

Visual evidence

The full visual baseline review passed all 69 cases in 6.7 minutes (sandbox/rover-visual-review-final.log). A preliminary run was intentionally cancelled after inspection found unthemed behavior terminals; source colors and requirement descriptions were corrected before the full completed review. Against sandbox/rover-baselines-before/, 25 existing images intentionally change for rover startup, the additional launcher choice, declared attribute compartments and contextual authoring controls; 14 rover images are new and 61 images remain byte-for-byte unchanged. sandbox/rover-visual-manifest.json records exact files/cases. All changed/new captures were inspected in seven sheets under sandbox/rover-visual-inspection/, with rover architecture, mission, lifecycle and requirement captures also inspected at full size in desktop/narrow and light/dark variants.

Normal comparison of all 31 changed/new visual cases passed in 2.5 minutes without updates, retries or skips (sandbox/rover-visual-final.log, executable selector in sandbox/run-rover-normal.py). This preceded only the behavior routing refinement. The four affected guided behavior cases were subsequently regenerated and inspected: four passed in 39.4 seconds (sandbox/rover-routing-visual-review.log); normal comparison with --project=visual --grep 'rover guided behavior' --output=sandbox/playwright/rover-routing-visual-final passed all four in 34.7 seconds, again without updates, retries or skips. Their SVG geometry checks run at both widths and themes. No existing structural/requirement assertion or baseline was changed merely to conceal a failure.

Full functional suites, hosted CI, publication, Firefox/WebKit, comprehensive accessibility, execution and simulation were not established by this local checkpoint. Appearance dialog focus return and keyboard source selection are covered, not complete accessibility conformance. Local captures under ignored sandbox/ may be absent from another checkout. An importable source-only bundle is retained at sandbox/inspection-rover.sysml-project.json.

Workshop overview startup

Recorded 2026-11-05 on feature/workshop-startup. The built-in example's explicit preferred named view is now CompressorViews::overview, showing WorkshopContext with mains, compressor interface, tool and service console. Pneumatics remains a separately selectable detail view. The nine source documents and all fourteen view declarations are unchanged.

The startup regression was first run against the old preference and failed with expected CompressorViews::overview, received CompressorViews::pneumatics (sandbox/workshop-startup-red.log). The final regression verifies the real worker's exact context nodes, six ports and two connection labels, all nine source texts, independent source navigation and explicit transition into Pneumatics. Existing diagram regressions deliberately select their Pneumatics fixture after the actual overview startup; startup and direct-link tests assert the real default independently.

  • npm run check: passed formatting, architecture, TypeScript, 151 Vitest tests and ten Node checks (sandbox/workshop-startup-check.log).
  • npm run test:e2e -- --project=functional default-example.spec.ts toolbar.spec.ts shell-entry.spec.ts --grep 'complete Smart air|wrapped mobile|landing and direct example' --output=sandbox/playwright/workshop-startup-functional: three passed in 19.3 seconds, including landing/direct example links, reload to launcher and mobile header layout. Production builds passed through browser runs with the existing bundle-size warning.
  • Visual baseline generation for workbench and appearance dialog|default workshop overview: four passed in 19.7 seconds (sandbox/workshop-startup-review.log). The two existing workbench images intentionally show overview instead of Pneumatics; two new narrow images cover both themes. All four were inspected. Appearance-dialog images remain byte-for-byte unchanged against copies in sandbox/workshop-startup-before/.

Normal comparison: npm run test:e2e -- --project=visual --grep 'workbench and appearance dialog|default workshop overview' --output=sandbox/playwright/workshop-startup-visual-final: four passed in 16.8 seconds without baseline updates, retries or skips (sandbox/workshop-startup-visual-final.log).

Full browser suites, hosted CI, deployment and comprehensive accessibility were not run for this local change. No engine pins, dependencies or saved formats changed.

Initial exploration failure recovery

Recorded 2026-11-05 for PR #11. The Codex review correctly identified that a no-view project's initial exploration failure left the only selector option already selected, with no change event available to retry. The empty diagram now exposes Explore model, disabled while busy, using the existing read-only command and focusing Scope after success.

The focused regression lets the pinned parse worker succeed and fails only the following exploration WASM request. Before the fix it failed because the retry button did not exist (sandbox/exploration-retry-red.log). After the fix both initial and later asset-failure cases passed: npm run test:e2e -- --project=functional exploration.spec.ts --grep 'retries an initial|asset failure preserves' --output=sandbox/playwright/exploration-retry-green (two passed, 15.1 seconds). It verifies the exact portable bundle, applied source, disabled source undo/apply controls and successful native diagram after keyboard retry. The final initial-failure case also asserts Scope focus.

npm run check passed 151 Vitest tests and ten Node checks, formatting, architecture and TypeScript (sandbox/exploration-retry-check.log). A first attempt stopped at test formatting; the corrected run passed. Fresh production builds passed through the browser runs. The combined targeted functional/visual baseline generation passed five cases in 27.6 seconds (sandbox/exploration-retry-review.log). All four new retry-state captures were inspected at desktop/narrow sizes in light/dark; existing baselines were not updated.

The first normal visual comparison exposed a delayed sidebar tooltip at narrow width. Dismissing it with Escape also restores its trigger's focus, so the capture now dismisses the tooltip, explicitly focuses the retry button afterward and asserts that focus before capture. Intermediate comparisons recorded these test-setup differences under sandbox/playwright/exploration-retry-visual-final, exploration-retry-visual-confirmed and exploration-retry-visual-final-normal; existing visual assertions were not weakened. Final captures intentionally include the retry button's keyboard focus ring.

Final baseline generation passed four cases in 22.7 seconds (sandbox/exploration-retry-focus-final-review.log). The final normal comparison npm run test:e2e -- --project=visual --grep 'initial exploration retry' --output=sandbox/playwright/exploration-retry-confirmed passed all four in 21.6 seconds without updates, retries or skips. Final captures were inspected.

Full browser suites, hosted CI and comprehensive accessibility were not established by these local runs. No dependencies, engine pins or saved formats changed.

Assembly overview routing

Recorded 2026-11-05 on feature/automatic-exploration, using Node 26.3.1 and the existing pinned browser engine. Ownership layouts reserve shared-owner gutters and separate rectilinear tracks/label rows. Fit includes route and label bounds. Structural layouts, semantic endpoints, native correspondence and portable data remain unchanged.

The fixture tests/fixtures/exploration-assembly-artifact.json was captured from the actual pinned worker for examples/assembly/model.sysml; the browser regression compares the returned artifact exactly. The independent route/card geometry assertion failed against the old curves (sandbox/assembly-routing-red.log), then passed with the new routing. A separate unit case covers forward/reverse routes across an intervening root and their camera bounds.

Executed checks:

  • npm run check: passed formatting, architecture, TypeScript, 151 Vitest tests and ten Node checks (sandbox/assembly-routing-check.log). An earlier attempt stopped on helper formatting, corrected before this successful run.
  • npm run test:e2e -- --project=functional overview-routing.spec.ts --output=sandbox/playwright/assembly-routing-functional-final: one passed in 12.1 seconds. Actual SVG paths avoid card bodies/headers, all six labels avoid each other and remain in the viewport. Every edge retains keyboard focus and reveals its exact source declaration without changing source or the portable bundle; the structural handoff still renders. An initial discovery attempt required a JSON import attribute and did not exercise the application.
  • Baseline generation with --project=visual --grep 'assembly exploration routing|read-only model exploration' --update-snapshots --output=sandbox/playwright/assembly-routing-visual-review: eight passed in 57.8 seconds. Eight new assembly captures and four intentionally changed P/Q overview captures were inspected at desktop/narrow widths in both themes. The four existing exploration structure captures are byte-for-byte identical to their retained copies in sandbox/assembly-routing-baselines-before/.

Normal comparison: npm run test:e2e -- --project=visual --grep 'assembly exploration routing|read-only model exploration|nested assembly' --output=sandbox/playwright/assembly-routing-visual-final: ten passed without baseline updates, retries or skips (sandbox/assembly-routing-visual-final.log). This includes existing named assembly views.

Full browser suites, Firefox/WebKit, hosted CI and general arbitrary-layout obstacle avoidance were not run. Fresh production builds run through the browser workflow; the existing bundle-size warning remains. No dependency, saved format or engine pin changed. Local evidence is retained under ignored sandbox/.

Exploration hierarchy, relationships and layout polish

Recorded 2026-11-05 on feature/automatic-exploration. The earlier flat overview was insufficient for useful model exploration. The replacement honors native parent identities with nested package/declaration boxes; relationship targets never become owners. The real-worker regression verifies P → System → primary/standby and Q → Motor, actual rendered containment, separate native relationship identities and nonoverlapping labels. Compact exploration leaf cards are 208 × 52 model-space units; the two-part structural container is 468 × 136, with side-by-side siblings and no empty leaf body. Existing named-view dimensions and presentation data retain their original contract.

Visible Scope/Representation fields and the full wrapping qualified scope caption distinguish Part definition from Part usage. The narrow real-engine scenario verifies the complete Engineering::CompressorControlSubsystem::RedundantDriveAssembly scope and its separate installedDrive usage without clipping. The existing inherited-port keyboard/source workflow also passed, establishing that explicit Open source still focuses the editor.

Keyboard edge selection in Split mode exposed a source-preservation bug: selecting a declaration synchronously focused CodeMirror during Enter keydown, allowing an insertLineBreak to replace the highlighted declaration. sandbox/exploration-keyboard-red.log records the focus transfer and Source preserved: false; the source-range update is now passive for diagram selection, while explicit Open source/issue/definition navigation still focuses the editor. The focused real-engine regression verifies that both edges retain focus, leave Apply source disabled, reveal the exact primary/standby declarations on request and preserve the complete portable bundle. The restored probe reports Source preserved: true (sandbox/exploration-keyboard-green.log). No debug instrumentation remains in application/test source.

Executed checks:

  • npm run check passed formatting, architecture, TypeScript, 149 Vitest tests and ten Node checks (sandbox/exploration-polish-check.log). This preceded the final leaf-border and spacing adjustment; the final fresh production builds and focused unit results below include it.
  • Final focused units: npx vitest run src/lib/workbench/diagrams/exploration.test.ts src/lib/workspace/exploration/exploration.test.ts src/lib/workbench/properties/diagram-selection.test.ts: 11 passed (sandbox/exploration-polish-unit-final.log).
  • npm run test:e2e -- --project=functional exploration.spec.ts --output=sandbox/playwright/exploration-polish-functional: three passed, one failed on the subsequently fixed Enter/source mutation. The corrected critical path passed with --grep 'opens a no-view' --output=sandbox/playwright/exploration-polish-focus-final (8.9-second scenario, 14.4-second run). An intermediate run reached an option-disabled assertion despite a native disabled attribute; explicit label/field associations replaced wrapping labels, and the unchanged disabled-option assertion passed in the final run. Logs: sandbox/exploration-polish-functional.log, sandbox/exploration-polish-focus-fixed.log, sandbox/exploration-polish-focus-final.log.
  • npm run test:e2e -- --project=functional exploration.spec.ts assembly.spec.ts --grep 'entire qualified scope|inherited ports by keyboard' --output=sandbox/playwright/exploration-polish-navigation: two passed in 17.9 seconds (sandbox/exploration-polish-navigation.log).
  • Only the eight exploration overview/structure baselines intentionally changed. Final generation: npm run test:e2e -- --project=visual --grep 'read-only model exploration' --update-snapshots --output=sandbox/playwright/exploration-polish-visual-final-review: four passed in 33.2 seconds. All eight captures were inspected at desktop/narrow widths in light/dark, including complete leaf borders and readable separated labels.
  • Normal comparison: npm run test:e2e -- --project=visual --grep 'read-only model exploration|workbench and appearance dialog|nested assembly' --output=sandbox/playwright/exploration-polish-visual-confirmed: eight passed in 47.1 seconds, without baseline updates, retries or skips. This includes four existing named-view scenarios with unchanged baselines. Log: sandbox/exploration-polish-visual-confirmed.log.

Fresh production builds passed through these runs with the existing bundle-size warning. Full functional/visual suites, hosted CI, audit, Firefox/WebKit, comprehensive accessibility and large-model/obstacle-routing coverage were not repeated. Parallel lanes establish distinct paths and label positions for the demonstrated declarations; they do not establish general obstacle avoidance. No project/recovery format, dependency version or engine pin changed. Evidence is local and ignored under sandbox/.

Read-only exploration checkpoint

Recorded 2026-11-05 on feature/automatic-exploration, with Node 26.3.1 and the existing pinned engines. The new Explore operation renders project/package trees and explicit part-definition/usage tree or structural subjects without adding declarations. Its separate envelope and workspace state do not become named-view presentation keys. No dependency versions, upstream pins/checksums or portable/recovery formats changed.

The retained Go bridge tests passed during engine preparation, including multi-file project/package roots, explicit definition versus typed usage, exact source correspondence, unchanged model hash and rejection of invalid/library-only subjects or invalid semantic source. Fresh production builds passed through the focused browser runs; the existing bundle-size warning remains. npm run check passed formatting, architecture, TypeScript, 145 Vitest tests and ten Node checks (sandbox/exploration-check-final.log). Four exploration unit cases exercise malformed/stale transport, applied-source queries with invalid drafts, presentation/history preservation, engine failure and superseded requests. Removing the exploration publication generation check made the replacement-project regression fail; the restored implementation passed the final check. Fault evidence: sandbox/exploration-stale-fault.log.

npm run test:e2e -- --project=functional exploration.spec.ts --output=sandbox/playwright/exploration-functional initially passed the named-view/draft/reopen preservation and injected asset-failure/retry scenarios. Its no-view scenario stopped because the assertion expected a name rather than the existing full-declaration reveal contract: the trace selected exactly part primary : Q::Motor; after Unicode/CRLF source. The corrected no-view scenario passed, then passed again after adding explicit query-control focus return: npm run test:e2e -- --project=functional exploration.spec.ts --grep 'opens a no-view' --output=sandbox/playwright/exploration-focus-final (10.2-second scenario, 15.8-second run). All three scenarios passed across these focused runs; they were not repeated as a complete functional suite. Logs: sandbox/exploration-browser.log, sandbox/exploration-no-view-final.log, sandbox/exploration-focus-final.log.

Four visual scenarios retain eight new overview/structure captures at 1440/768 px in light/dark. Reviewed baseline generation passed under sandbox/playwright/exploration-visual-reviewed (32.2 seconds); all eight images were inspected. An earlier narrow keyboard check exposed an asynchronous panel focus return; the test now observes the reopen-button focus before traversing the exploration controls. A later normal run stopped on an incorrect readiness locator for a nonexistent standalone text leaf; the trace showed the combined part def System card, and readiness now asserts that exact rendered group. No existing baseline or tolerance was changed. The final normal comparison, npm run test:e2e -- --project=visual --grep 'read-only model exploration' --output=sandbox/playwright/exploration-visual-confirmed, passed all four cases in 30.4 seconds without updates, retries or skips. Logs: sandbox/exploration-visual-reviewed.log, sandbox/exploration-visual-final.log, sandbox/exploration-visual-confirmed.log.

These are local results. The full functional/visual suites, dependency audit, Firefox/WebKit and complete accessibility/performance audits were not repeated for this slice. Automatic system-root inference, generalized typed-instance expansion, exploration persistence and reviewed named-view creation from an exploration remain outside the delivered subset. Applying or undoing/redoing accepted source clears revision-bound exploration and uses the opening fallback when the workbench refreshes. Ignored evidence may be absent from other checkouts.

Requirements integration

On 2026-11-05, PR #10 merged into develop as 7b37ebe40f350f316be8ad951c095a7fec35fd92. GitHub reported a clean merge state and no unresolved review threads. The required checks job passed for head ac7ee9f in Validate run 42040187761. That head adds only a routing-documentation correction to the previously validated requirements implementation. No exploration work was included in this merge.

Native requirements and satisfaction checkpoint

Implementation recorded 2026-11-03; final validation continued 2026-11-04 on feature/requirements-traceability, using Node 26.3.1, npm 11.16.0 and the pinned engines. Native requirement graphs now retain declared short identifiers, full available AST documentation, selected/contextual membership, satisfaction assertion/negation and direct versus type-based ownership. The app adds bounded requirement/model-element cards, labeled relationships, pointer/keyboard selection, exact source reveal and existing version-1 presentation persistence. No production dependencies, upstream engine pins, archive checksums or saved-format version changed.

npm run check passed formatting, architecture, TypeScript, 141 Vitest tests and ten Node checks. npm audit --audit-level=low reported no vulnerabilities. Fresh production builds passed, retaining the existing bundle-size warning.

Engine work retained fresh production semantic-worker/WASM captures for capacity, compressor, nested requirements, explicit traceability and compact owner-to-type examples. Fourteen capture-validation checks passed; native graph topology/order was retained while metadata was enriched. The retained Go bridge tests and derived WASM preparation passed, including anonymous satisfaction declarations, negative assertions, full documentation and direct/via-type relationships. Evidence copied to sandbox/requirements-engine-evidence/; the root fresh build log is sandbox/cleanup-design/requirements-integration-build.log. The default compressor view intentionally remains a generic tree: optional source-copy probes exposed additional verification context and declaration-owned rather than full instance-path satisfier identities, so its source was not changed.

The warning-free traceability fixture uses explicitly exposed requirement members, distinct requirement usage names and repeated tank satisfier names under different owners. Actual engine evidence establishes ten requirement-graph nodes and nine edges, plus a separate thirty-node/fifteen-edge overview. Subject binding alone creates no satisfaction link to the unlinked requirement. Positive and asserted-negated satisfaction have distinct metadata and labels; neither is reported as an executed result.

Focused checks: npm run test:e2e -- --project=functional requirements.spec.ts assembly.spec.ts --output=sandbox/playwright/requirements-native-assembly --reporter=list --max-failures=1 passed four scenarios. The five requirements workflows then passed in 39.8 seconds under sandbox/playwright/requirements-functional-final, including exact endpoints/source, independent layouts, invalid drafts, fresh reopen, injected real engine asset failure/retry and source undo/redo. The later keyboard movement assertion passed its focused preservation run in 17.6 seconds under sandbox/playwright/requirements-keyboard; it compares the exact saved coordinate increment and fresh rendered positions.

The initial preservation run exposed a test-helper assumption: valid anonymous constraint/satisfaction declarations had source origins but no qualified name. The helper now requires zero-length names, matching origin identities, bounded UTF-8 source bytes and complete context for those elements; it still compares every saved point. A separate failed movement run exposed an application Fit limit: the default 0.5 minimum zoom clipped the larger requirement graph. A new visible-bounds assertion failed with a node 72.17 px outside the canvas, then passed after requirement-only minimum zoom was set to 0.1. Other representation families retain their prior zoom limits. Evidence: requirements-functional.log, requirements-functional-corrected-helper.log, requirements-fit-before.log, and sandbox/playwright/requirements-fit-before under the primary ignored sandbox.

Bounded regression demonstrations: removing the representation-change safeguard failed the reconciliation assertion, then the restored unit run passed (sandbox/cleanup-design/requirements-representation-fault.log, requirements-reconciliation-restored.log). Swapping relationship Inspector Source/Target failed the critical browser assertion on the exact source endpoint; restoration passed in 10.7 seconds (requirements-endpoints-fault.log, requirements-endpoints-restored.log, sandbox/playwright/requirements-endpoints-*). The renderer agent also removed negation text in an isolated mutation; the controlled layout regression failed, then passed after restoration. This controlled renderer evidence is separate from the actual-engine browser paths.

Four new visual scenarios cover light/dark at 1440/768 px. Six new baselines retain fitted desktop overviews and focused, readable card/Inspector states. Focused setup uses real zoom/pan controls and compares all model-space node transforms before/after panning. Baseline generation is separate from normal comparison results. The complete functional run, npm run test:e2e -- --project=functional --output=sandbox/playwright/requirements-full-functional --reporter=list --max-failures=1, passed all 92 scenarios in 12.6 minutes without retries or skips. The final four-scenario baseline review ran separately under sandbox/playwright/requirements-visual-final-review; all six new images were inspected at their intended overview/detail scales. The first full visual attempt stopped during engine startup: the trace recorded net::ERR_NETWORK_IO_SUSPENDED on a WASM fetch before any screenshot assertion. A fresh run passed 48 scenarios before a new narrow requirement capture differed in scale. Its trace showed complete 1.2× zoom steps but a different starting fit. The test now normalizes through the visible maximum-zoom endpoint and five verified zoom-out actions, then pans without changing model-space positions. Eight isolated theme/width/repeat diagnostics, including deliberately different starting zooms, produced the same 273.2768 px card width and unchanged portable data. The corrected four-case baseline generation passed in 37.3 seconds under sandbox/playwright/requirements-visual-normalized-review; all six captures were inspected again. No existing baseline or mismatch threshold was changed. The final normal comparison, npm run test:e2e -- --project=visual --output=sandbox/playwright/requirements-full-visual-normalized --reporter=list --max-failures=1, passed all 51 scenarios in 3.7 minutes without baseline updates, retries or skips. Its log is sandbox/cleanup-design/requirements-full-visual-normalized.log.

Firefox/WebKit, complete accessibility certification, generalized typed-instance trace expansion, full constraint/subject compartments and execution/verification results remain outside this checkpoint. Local results do not establish hosted CI; ignored evidence may be absent from another checkout.

Mobile header integration fix

Recorded 2026-11-02. Review found that the base header rules overrode the earlier mobile breakpoint. At 390 px the 62 px banner contained actions extending to 83 px; the new containment assertion failed with a 21 px overflow. Moving the mobile rules after the base and wider breakpoints lets the header grow with its wrapped actions.

npm run test:e2e -- --project=functional toolbar.spec.ts appearance.spec.ts --output=sandbox/playwright/mobile-header-functional --reporter=list --max-failures=1 passed all eight scenarios after the fix. The regression covers 390, 600 and 601 px, toolbar separation, keyboard Appearance dismissal/focus return, Projects/Resume focus return and an exact project-bundle comparison. Red evidence: sandbox/cleanup-design/mobile-header-before.log and sandbox/playwright/mobile-header-before.

Four new header captures at 390/600 px in light/dark were inspected. The normal comparison run, npm run test:e2e -- --project=visual --output=sandbox/playwright/mobile-header-visual-final --reporter=list --max-failures=1, passed all 47 comparisons without baseline updates, retries or skips. npm run check passed, including 118 Vitest tests and six Node checks; fresh production builds passed through these browser runs with the existing bundle-size warning.

Validate run 41336740488 passed all 128 browser scenarios for the preceding head ddd5196. That hosted result predates this mobile fix; its new full CI run is separate. Firefox/WebKit and a complete accessibility audit were not run for this fix.

Shell cleanup and structural card checkpoint

Recorded 2026-11-01 on feature/openmbee-shell, using Node 26.3.1, npm 11.16.0 and the existing pinned browser engines. The private package is now @openmbee/sysml-view-editor; dependency versions, engine pins and portable project fields are unchanged. TypeScript now checks unused locals/parameters; two unused imports were removed.

npm run check passed formatting, architecture, the stricter TypeScript configuration, 118 Vitest tests and 6 Node checks. Fresh production builds passed through the browser runs, retaining the existing bundle-size warning.

Shell rendering is split into ProjectHeader and SourceToolbar, with local file construction/import/download in projectFiles.ts. The Workbench retains session lifetime, project replacement policy and semantic orchestration. CSS is grouped by surface through ui/theme.css. Before the diagram redesign, npm run test:e2e -- --project=visual --output=sandbox/playwright/cleanup-css-equivalence --reporter=list --max-failures=1 passed all 39 existing visual comparisons without updates, establishing visual equivalence for that refactor.

Structural cards now have palette-tinted headers, kind badges, distinct name/type hierarchy, aligned port rows, 12 px square handles, explicit direction text, selection outline/halo and quieter containers. Renderer node dimensions and saved positions retain their existing contract. Scoped selection styles override React Flow's focus outline reset. The markup retains the original name : Type text format as well as accessible names.

The new actual-engine diagram-style.spec.ts checks name/type emphasis, selection outline while focused, keyboard port selection with its resolved declaration/usage context, pump-to-tank endpoint alignment and an exact bundle comparison across appearance changes. It failed against the original combined header markup, then passed with the redesign. Red evidence: sandbox/cleanup-design/diagram-style-before.log and sandbox/playwright/diagram-style-before. Three assembly scenarios passed; the final focused diagram/entry run passed all 11 scenarios in 53.5 seconds under sandbox/playwright/cleanup-design-focused-final, including source DOM/selection, drafts, history, camera, both layouts, cancellation and superseded requests.

Seventeen affected/new visual scenarios generated baselines in sandbox/playwright/cleanup-design-visual-review. Nine existing images intentionally change only for the structural notation; four selected-node images add desktop/narrow light/dark coverage. All before/after/diff sheets and new captures were inspected, alongside running-app desktop/narrow captures. Evidence: sandbox/cleanup-design/comparison-1.jpg through comparison-3.jpg, selected-review.jpg and visual-diff-evidence.json. Baseline generation is separate from normal comparison results.

npm run test:e2e -- --project=functional --output=sandbox/playwright/cleanup-design-functional --reporter=list --max-failures=1: all 85 scenarios passed in one fresh-build run (11.3 minutes), without retries or skips. This preceded the final foreground-only contrast adjustment, whose focused results are recorded separately.

The extended direction-contrast assertion failed before the final foreground adjustment (3.1858:1 in light/neutral), then passed across all six palettes in light/dark. npm run test:e2e -- --project=functional diagram-style.spec.ts appearance.spec.ts --output=sandbox/playwright/diagram-contrast-final --reporter=list --max-failures=1: five passed in 42.9 seconds after that adjustment. Measured OUT-label contrast is at least 6.77:1 across the twelve combinations. Evidence: sandbox/cleanup-design/contrast-before.log, contrast-final.log, palette-before.log, palette-final.log and the inspected palette-review.jpg. This tests the direction text, not complete accessibility conformance.

npm run test:e2e -- --project=visual --output=sandbox/playwright/cleanup-design-visual-final --reporter=list --max-failures=1: all 43 normal visual comparisons passed in 2.5 minutes after the final contrast adjustment, without baseline updates, retries or skips.

Firefox/WebKit, complete accessibility auditing and large-model performance remain outside this checkpoint. Local results do not establish hosted CI. Ignored sandbox/ evidence may be absent from other checkouts.

Development watcher regression

The reported Linux ENOSPC arose while Vite watched generated engine sources under sandbox/opensysml-build. The development configuration now excludes sandbox/ and prepared static/vendor/ binaries without disabling source watching or changing operating-system limits. node --test scripts/vite-watch.test.mjs exercises the actual Vite watcher: the original configuration failed because sandbox directories were watched; the fixed configuration passed, with source watching retained and both generated trees excluded. Evidence: sandbox/shell-session/vite-watch-before.log and vite-watch-after.log.

npm run dev -- --host 127.0.0.1 --port 4176 --strictPort started successfully after engine preparation. HTTP smoke checks returned 200 for the landing page, /src/main.tsx and the OpenSysML WASM asset. The dev server remained running without the reported watcher error. Excluding vendor binaries from watching does not prevent serving them; regenerated binaries require a page reload.

Retained regression evidence

The latest browser coverage above includes the existing identity, authoring, diagnostics, source assistance and recovery suites. Earlier deliberate-fault records explain why critical preservation checks exist:

Invariant tested Deliberate fault and observed failure Local evidence
Live workbench preservation Unmounted the workbench when opening the launcher; source-editor DOM identity assertion failed, restored implementation passed sandbox/shell-session/launcher-lifetime-fault.log, sandbox/playwright/shell-lifetime-restored
Draft query freshness Removed the stale-completion guard; targeted regression failed, restored code passed sandbox/language-stale-fault.log
Recovery preservation Removed startup-copy protection, clean clearing or restored-unsaved baseline; each targeted assertion failed, restored code passed sandbox/recovery-pending-fault.log, sandbox/recovery-clean-fault.log, sandbox/recovery-unsaved-fault.log
Issue/source binding Removed diagnosed-text equality guard; stale-location regression failed, restored code passed sandbox/diagnostic-stale-fault.log
Raw source navigation Removed UTF-16/CRLF translation; source-selection regression failed, restored editor scenarios passed sandbox/source-editor-fault.log

Historical hosted evidence: Validate run 41314513339 passed for code head f708b84. That result does not establish CI for the later shell branch. Older milestone commands, counts and captures are available in Git history; they do not describe the current test inventory. Local artifacts under ignored sandbox/ may be absent from other checkouts.