Workspace
- Pivot from "set of open panes" to a Finder-style miller column stack:
TopBar / LeftSidebar / [section → entity → entity ...] / pinned text editor.
openPanesStore is now an ordered Column[] with pushFrom / closeFrom /
setStack; only one top-level section is rooted at a time.
- New entity column panes: Term, Block, Association, Constraint,
Requirement, Finding. Click-through navigation truncates deeper
columns automatically.
- LeftSidebar surfaces a pending-count chip per section (single-glance
navigation cue) and spins its analyze ↻ via SVG Spinner whenever the
LLM is working — including server-initiated runs caught by the runs
poll, not just user-triggered ones.
Analyze pipeline + persistence
- Unified `concepts` pass (taxonomy + glossary in one LLM call) replaces
the two-pass setup. Server still accepts ?section=taxonomy|glossary
and normalizes them for back-compat.
- model / requirements / detection (assumptions, risks, inconsistencies)
+ cross-layer validation rules (X1–X4: stale term link, unlinked
formalism, undefined linked term, prose-only term).
- Persistence: NarrativeDocument, ModelSnapshot, ChangelogEntry,
TaxonomyTerm, RequirementEntry, Finding, AnalysisRun. Re-runs MERGE
instead of replace: gentle update on existing items, suggested on new,
deprecated on missing — same idiom for every artifact kind. User pins
preserve "kept" decisions across re-analyses.
- Migrations: pivot_text_first, add_requirement_linked_term,
term_review_state, review_state_for_reqs_and_findings,
add_term_definition_pinned.
Concept ↔ ontology integration
- linkedTermId on Block / Association / Constraint / Requirement.
PromoteToolbar lets the user formalize a concept inline: + Block /
+ Association / + Constraint / + Requirement, all routed through
applyOps so undo/redo and SSE work for free.
- decideElement op for in-canvas keep/discard on review-pending model
elements.
User-authored definitions
- TermColumn definition is click-to-edit. Save (Cmd-Enter / blur),
Cancel (Esc), Reset to AI suggestion when pinned.
- definitionPinned flag on TaxonomyTerm: future Analyze runs leave the
user's text alone. setTermDefinition repo function + POST
/api/projects/[id]/terms/[termId]/definition endpoint.
- mergeTaxonomySuggestion + applyGlossaryDefinitions both pin-aware.
UX/UI
- StatusChip: single component for all state idioms (suggested,
deprecated, accepted, dismissed, resolved, severity, validation code,
confidence, warn). Replaces 5+ ad-hoc badge classes.
- PaneControls (PaneViewTabs + PaneFilterChip): separates view-mode
toggles from filter chips so toggling Pending no longer flips you off
the current view.
- PaneEmpty: unified empty-state with title + hint + action.
- PaneDrawer: collapsible groups for Pending / Discarded review; cards
group as Kept (top) → Pending (bottom drawer) → Discarded (Findings
only, hidden when empty). Restore action recovers dismissed/resolved
findings.
- ConceptCard unifies Tree and A–Z views in Concepts; only Tree parents
carry the chevron (no empty placeholder offset).
- Type + spacing tokens (--text-xs..xl, --space-1..6, --lh-tight/ui/
prose, --radius-*) replace every ad-hoc value.
- Buttons standardized to body sans 500 (was a mishmash of mono / display).
- Card shells unified across Concepts / Requirements / Findings.
Cleanup
- Removed: LeftRail, FindingsPanel, IssuesPanel, SocratesDock,
ProposalCard, SlashMenu, SlashExtension, slashSuggestion,
CanvasHeader, TaxonomyPane, GlossaryPane, TermDetail (popover; now
TermColumn).
- Section ids in openPanesStore: dropped taxonomy/glossary, added
concepts. localStorage migration runs on hydrate.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
apps/web/lib/sysml — pure engine (no UI deps)
- model.ts: canonical types ported from phase-0 (Block, Property,
Association, Constraint, Requirement, SysMLModel)
- validate.ts: 12 rules grouped Structural (S1–S5) / Semantic (M1–M5) /
Traceability (T1–T2). Pure function returning element-anchored issues.
Cycle detection via DFS with canonical-key dedup. T3 deferred to Phase 1.5
(depends on narrative chip references).
- depgraph.ts: directed graph over Blocks / Properties / Constraints /
Requirements with `dependentsOf()` and `neighborhood()` for impact analysis
(substrate for M7).
- fromFixture.ts: loose FixtureData → strict SysMLModel converter (interim
until M5 unifies state).
- breaks.ts: 8 named model corruptions (S1/S2/S3/M2/M3/M5/T1/T2) for
?break=... demonstrations.
UI integration in EditorShell + LeftRail + DiagramCanvas + IssuesPanel
- Floating IssuesPanel (bottom-right) with severity-grouped counts and
collapse. Click an issue to focus its anchor across the rail and diagram.
- LeftRail: severity dots on each block in the Model section and on each
requirement entry. Tooltips show full issue text.
- DiagramCanvas: red/blue/dotted ring around offending blocks via
issuesByElement → BlockNode.data.issueSeverity.
- ?break=S1-dangling,M2-cycle,M5-dup-property,... query param injects
corruptions for verification of the "done when" criterion.
- Suspense boundary added at the editor route for useSearchParams.
Two pre-existing TipTap typing fixes (editor.storage cast through unknown).