@principal-ai/subsystems-react 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts +5 -0
  6. package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts.map +1 -0
  7. package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js +4 -0
  8. package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js.map +1 -0
  9. package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.d.ts +5 -0
  10. package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.d.ts.map +1 -0
  11. package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.js +4 -0
  12. package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.js.map +1 -0
  13. package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts +5 -0
  14. package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts.map +1 -0
  15. package/dist/stories/Subsystem/ComponentGraph/composedFixture.js +4 -0
  16. package/dist/stories/Subsystem/ComponentGraph/composedFixture.js.map +1 -0
  17. package/dist/subsystem/SubsystemAggregateGraph.d.ts +70 -0
  18. package/dist/subsystem/SubsystemAggregateGraph.d.ts.map +1 -0
  19. package/dist/subsystem/SubsystemAggregateGraph.js +385 -0
  20. package/dist/subsystem/SubsystemAggregateGraph.js.map +1 -0
  21. package/dist/subsystem/model.d.ts +7 -0
  22. package/dist/subsystem/model.d.ts.map +1 -1
  23. package/dist/subsystem/model.js +65 -1
  24. package/dist/subsystem/model.js.map +1 -1
  25. package/package.json +1 -1
  26. package/src/index.ts +8 -0
  27. package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +13 -13
  28. package/src/stories/Subsystem/ComponentGraph/AggregateFrameGraph.stories.tsx +61 -0
  29. package/src/stories/Subsystem/ComponentGraph/AggregateGraph.stories.tsx +61 -0
  30. package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +17 -17
  31. package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +2 -2
  32. package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +3 -3
  33. package/src/stories/Subsystem/ComponentGraph/ComposedGraph.stories.tsx +73 -0
  34. package/src/stories/Subsystem/ComponentGraph/Constructs.stories.tsx +6 -6
  35. package/src/stories/Subsystem/ComponentGraph/CustomEntities.stories.tsx +8 -8
  36. package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +11 -11
  37. package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +6 -6
  38. package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +10 -10
  39. package/src/stories/Subsystem/ComponentGraph/ModuleBadges.stories.tsx +6 -6
  40. package/src/stories/Subsystem/ComponentGraph/Modules.stories.tsx +17 -17
  41. package/src/stories/Subsystem/ComponentGraph/NodeAnatomy.stories.tsx +16 -16
  42. package/src/stories/Subsystem/ComponentGraph/Packages.stories.tsx +12 -12
  43. package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +1 -1
  44. package/src/stories/Subsystem/ComponentGraph/Proposed.stories.tsx +10 -10
  45. package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +69 -69
  46. package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +27 -27
  47. package/src/stories/Subsystem/ComponentGraph/aggregateFixture.ts +8 -0
  48. package/src/stories/Subsystem/ComponentGraph/aggregateViewFixture.ts +8 -0
  49. package/src/stories/Subsystem/ComponentGraph/composedFixture.ts +9 -0
  50. package/src/subsystem/SubsystemAggregateGraph.tsx +607 -0
  51. package/src/subsystem/model.test.ts +63 -0
  52. package/src/subsystem/model.ts +65 -1
@@ -149,7 +149,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
149
149
  label: 'construct: type_alias — a type alias',
150
150
  note: 'the `type` keyword form: `type X = { … }` or a union — anything `=`-assigned',
151
151
  component: {
152
- id: 'alias-status',
152
+ alias: 'alias-status',
153
153
  name: 'AnalysisStatus',
154
154
  construct: 'type_alias',
155
155
  file: 'packages/subsystems-studio/src/bun/analysis.ts',
@@ -170,7 +170,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
170
170
  label: 'role: entry on construct: type — contract as entry',
171
171
  note: 'same role, different inherited anatomy — entries are topology, not shape',
172
172
  component: {
173
- id: 'ipc-entry',
173
+ alias: 'ipc-entry',
174
174
  name: 'StudioMessages',
175
175
  construct: 'interface',
176
176
  file: 'packages/subsystems-studio/src/shared/contract.ts',
@@ -183,7 +183,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
183
183
  label: 'construct: enum — runtime values + a type',
184
184
  note: 'the one type-family form that exists at runtime; members render in the drill-down',
185
185
  component: {
186
- id: 'enum-phase',
186
+ alias: 'enum-phase',
187
187
  name: 'VerificationPhase',
188
188
  construct: 'enum',
189
189
  file: 'packages/subsystems-studio/src/bun/verify.ts',
@@ -201,7 +201,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
201
201
  label: 'construct: function — plain accessor',
202
202
  note: 'indigo; the default for anchored behavior',
203
203
  component: {
204
- id: 'create',
204
+ alias: 'create',
205
205
  name: 'createSubsystemModel',
206
206
  construct: 'function',
207
207
  file: 'packages/subsystems-studio/src/bun/subsystem-model-store.ts',
@@ -213,7 +213,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
213
213
  label: 'framework: react · stereotype: component — still construct: function',
214
214
  note: 'badge reads "react · component"; name renders bare ; color stays function',
215
215
  component: {
216
- id: 'analysis-view',
216
+ alias: 'analysis-view',
217
217
  name: 'AnalysisView',
218
218
  construct: 'function',
219
219
  file: 'packages/subsystems-studio/src/mainview/views/AnalysisView.tsx',
@@ -228,7 +228,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
228
228
  label: 'framework: react · stereotype: hook',
229
229
  note: 'same construct, different stereotype — badge "react · hook", keeps ()',
230
230
  component: {
231
- id: 'drawings-host',
231
+ alias: 'drawings-host',
232
232
  name: 'useDrawingsHost',
233
233
  construct: 'function',
234
234
  file: 'packages/subsystems-studio/src/mainview/hooks/useDrawingsHost.ts',
@@ -242,7 +242,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
242
242
  label: 'role: entry on construct: function — boundary element',
243
243
  note: 'orange overrides construct:color; anatomy inherited from the function',
244
244
  component: {
245
- id: 'http-entry',
245
+ alias: 'http-entry',
246
246
  name: 'HTTP bridge :3045',
247
247
  construct: 'function',
248
248
  file: 'packages/subsystems-studio/src/bun/http-server.ts',
@@ -255,7 +255,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
255
255
  label: 'construct: class — declaration anatomy',
256
256
  note: 'blue; drill-down renders the real class stub with its methods',
257
257
  component: {
258
- id: 'cache',
258
+ alias: 'cache',
259
259
  name: 'SessionCache',
260
260
  construct: 'class',
261
261
  file: 'src/session/SessionCache.ts',
@@ -276,7 +276,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
276
276
  label: 'construct: method — a function bound to its class',
277
277
  note: 'dotted symbol (SessionCache.put) is the identity; drill-down renders it inside a host-class stub',
278
278
  component: {
279
- id: 'method-put',
279
+ alias: 'method-put',
280
280
  name: 'put',
281
281
  construct: 'method',
282
282
  file: 'src/session/SessionCache.ts',
@@ -293,7 +293,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
293
293
  label: 'construct: store — state-block anatomy',
294
294
  note: 'green = the store construct:color; drill-down renders declare const state, never a class stub',
295
295
  component: {
296
- id: 'store',
296
+ alias: 'store',
297
297
  name: 'Graph Store',
298
298
  construct: 'store',
299
299
  file: 'packages/subsystems-studio/src/bun/subsystem-model-store.ts',
@@ -306,7 +306,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
306
306
  label: 'construct: external — actor outside every boundary',
307
307
  note: 'purple; no process → drawn outside all regions',
308
308
  component: {
309
- id: 'agents',
309
+ alias: 'agents',
310
310
  name: 'agent clients',
311
311
  construct: 'external',
312
312
  file: '',
@@ -317,7 +317,7 @@ const nodeSpotlights: Array<{ label: string; component: SubsystemComponent; note
317
317
  label: 'role: service on construct: external — far-side boundary element',
318
318
  note: 'colored by its construct (external); identity via purl, no source at all',
319
319
  component: {
320
- id: 'github',
320
+ alias: 'github',
321
321
  name: 'api.github.com',
322
322
  construct: 'external',
323
323
  file: '',
@@ -332,7 +332,7 @@ function NodeSpotlightsDemo() {
332
332
  const { mode } = useTheme();
333
333
  const constructColors = constructColorsFromPierreTheme(resolvePierreSyntaxThemeName(mode));
334
334
  const [activeIds, setActiveIds] = useState<Set<string>>(
335
- () => new Set(nodeSpotlights.map((n) => n.component.id)),
335
+ () => new Set(nodeSpotlights.map((n) => n.component.alias)),
336
336
  );
337
337
  const toggle = (id: string) =>
338
338
  setActiveIds((prev) => {
@@ -344,7 +344,7 @@ function NodeSpotlightsDemo() {
344
344
  }
345
345
  return next;
346
346
  });
347
- const visible = nodeSpotlights.filter((n) => activeIds.has(n.component.id));
347
+ const visible = nodeSpotlights.filter((n) => activeIds.has(n.component.alias));
348
348
 
349
349
  return (
350
350
  <div style={{ padding: 20, overflow: 'auto', height: '100vh', boxSizing: 'border-box', background: '#0f1216' }}>
@@ -358,7 +358,7 @@ function NodeSpotlightsDemo() {
358
358
  show:
359
359
  </span>
360
360
  {nodeSpotlights.map(({ component }) => {
361
- const on = activeIds.has(component.id);
361
+ const on = activeIds.has(component.alias);
362
362
  const color = constructColors[component.construct];
363
363
  const chip = component.stereotype
364
364
  ? component.framework
@@ -369,9 +369,9 @@ function NodeSpotlightsDemo() {
369
369
  : component.construct;
370
370
  return (
371
371
  <button
372
- key={component.id}
372
+ key={component.alias}
373
373
  type="button"
374
- onClick={() => toggle(component.id)}
374
+ onClick={() => toggle(component.alias)}
375
375
  style={{
376
376
  fontFamily: 'monospace',
377
377
  fontSize: 11,
@@ -390,7 +390,7 @@ function NodeSpotlightsDemo() {
390
390
  })}
391
391
  <button
392
392
  type="button"
393
- onClick={() => setActiveIds(new Set(nodeSpotlights.map((n) => n.component.id)))}
393
+ onClick={() => setActiveIds(new Set(nodeSpotlights.map((n) => n.component.alias)))}
394
394
  style={{ fontFamily: 'monospace', fontSize: 11, cursor: 'pointer', padding: '4px 10px', borderRadius: 999, border: '1px solid #2c313a', background: 'transparent', color: '#9ca3af' }}
395
395
  >
396
396
  all
@@ -410,7 +410,7 @@ function NodeSpotlightsDemo() {
410
410
  </div>
411
411
  )}
412
412
  {visible.map(({ label, component, note }) => (
413
- <div key={component.id}>
413
+ <div key={component.alias}>
414
414
  <div style={{ fontFamily: 'monospace', fontSize: 11, color: '#6b7280', margin: '10px 2px 6px' }}>
415
415
  {label} — {note}
416
416
  </div>
@@ -490,7 +490,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
490
490
  label: 'store detail → state block',
491
491
  note: 'declare const lines — honest to module-level state; no class stub, no methods',
492
492
  component: {
493
- id: 'store',
493
+ alias: 'store',
494
494
  name: 'Graph Store',
495
495
  construct: 'store',
496
496
  file: 'packages/subsystems-studio/src/bun/subsystem-model-store.ts',
@@ -510,7 +510,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
510
510
  label: 'class detail → class stub',
511
511
  note: 'the verifiable access mechanism — methods with typed params + returns',
512
512
  component: {
513
- id: 'cache',
513
+ alias: 'cache',
514
514
  name: 'SessionCache',
515
515
  construct: 'class',
516
516
  file: 'src/session/SessionCache.ts',
@@ -534,7 +534,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
534
534
  label: 'function detail → signature',
535
535
  note: 'params + return type, callers/callees intentionally not rendered (edges carry them)',
536
536
  component: {
537
- id: 'get',
537
+ alias: 'get',
538
538
  name: 'getSubsystemModel',
539
539
  construct: 'function',
540
540
  file: 'packages/subsystems-studio/src/bun/subsystem-model-store.ts',
@@ -553,7 +553,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
553
553
  label: 'type detail → interface fields',
554
554
  note: 'the IPC contract as an entry: anatomy inherited from the type',
555
555
  component: {
556
- id: 'ipc-entry',
556
+ alias: 'ipc-entry',
557
557
  name: 'StudioMessages',
558
558
  construct: 'interface',
559
559
  file: 'packages/subsystems-studio/src/shared/contract.ts',
@@ -575,7 +575,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
575
575
  label: 'method detail → method in host-class stub',
576
576
  note: 'the class is context, the method is the node — same anatomy a standalone function gets, plus the owning class',
577
577
  component: {
578
- id: 'anatomy-method',
578
+ alias: 'anatomy-method',
579
579
  name: 'put',
580
580
  construct: 'method',
581
581
  file: 'src/session/SessionCache.ts',
@@ -593,7 +593,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
593
593
  label: 'type_alias detail → braced alias',
594
594
  note: 'the alias renders as `type X = { … }` — the honest keyword form',
595
595
  component: {
596
- id: 'anatomy-alias',
596
+ alias: 'anatomy-alias',
597
597
  name: 'AnalysisStatus',
598
598
  construct: 'type_alias',
599
599
  file: 'packages/subsystems-studio/src/bun/analysis.ts',
@@ -611,7 +611,7 @@ const anatomyComponents: Array<{ label: string; component: SubsystemComponent; n
611
611
  label: 'enum detail → enum declaration',
612
612
  note: 'members render inline — the runtime type',
613
613
  component: {
614
- id: 'anatomy-enum',
614
+ alias: 'anatomy-enum',
615
615
  name: 'VerificationPhase',
616
616
  construct: 'enum',
617
617
  file: 'packages/subsystems-studio/src/bun/verify.ts',
@@ -634,7 +634,7 @@ function AnatomySpotlightsDemo() {
634
634
  anatomy spotlights — data (left) → the drill-down panel you get on click (right).
635
635
  </div>
636
636
  {anatomyComponents.map(({ label, component, note }) => (
637
- <div key={component.id}>
637
+ <div key={component.alias}>
638
638
  <div style={{ fontFamily: 'monospace', fontSize: 11, color: '#6b7280', margin: '10px 2px 6px' }}>
639
639
  {label} — {note}
640
640
  </div>
@@ -0,0 +1,8 @@
1
+ // GENERATED from live store data — do not hand-edit.
2
+ import type { SubsystemComponent, SubsystemRelation, SubsystemWalkthrough } from "../../../subsystem/model";
3
+
4
+ export const aggregateComponents: SubsystemComponent[] = JSON.parse("[{\"alias\":\"process:site/web\",\"name\":\"site/web\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 1 model\"},{\"alias\":\"process:subsystems-core/types\",\"name\":\"subsystems-core/types\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 1 model\"},{\"alias\":\"process:external/github\",\"name\":\"external/github\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"name\":\"SubsystemComponentGraph.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 8 models\"},{\"alias\":\"process:principal-studio-cli\",\"name\":\"principal-studio-cli\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"name\":\"subsystem-model-store.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"6 members · 7 models\"},{\"alias\":\"process:subsystems-studio/host\",\"name\":\"subsystems-studio/host\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"44 members · 12 models\"},{\"alias\":\"process:local/disk\",\"name\":\"local/disk\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"name\":\"SubsystemModelsView.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 5 models\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"name\":\"SubsystemModelView.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 6 models\"},{\"alias\":\"process:proposed/studio-gist\",\"name\":\"proposed/studio-gist\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"name\":\"http-server.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 3 models\"},{\"alias\":\"process:subsystems-studio/renderer\",\"name\":\"subsystems-studio/renderer\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"19 members · 8 models\"},{\"alias\":\"process:subsystems-react\",\"name\":\"subsystems-react\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"11 members · 3 models\"},{\"alias\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"name\":\"model.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"9 members · 4 models\"},{\"alias\":\"process:subsystems-core\",\"name\":\"subsystems-core\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"4 members · 4 models\"},{\"alias\":\"process:opencode\",\"name\":\"opencode\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"name\":\"verify-subsystem-component.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 4 models\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/regular-audit.ts\",\"name\":\"regular-audit.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"name\":\"index.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"7 members · 4 models\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"name\":\"rpc.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 2 models\"},{\"alias\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"name\":\"elkLayout.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 3 models\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"name\":\"App.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 2 models\"},{\"alias\":\"process:opencode/v2\",\"name\":\"opencode/v2\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/proposal-store.ts\",\"name\":\"proposal-store.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 2 models\"},{\"alias\":\"process:opencode2/service\",\"name\":\"opencode2/service\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"process:opencode/sqlite\",\"name\":\"opencode/sqlite\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"4 members · 1 model\"},{\"alias\":\"module:packages/subsystems-react/src/subsystem/nodes.tsx\",\"name\":\"nodes.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 2 models\"},{\"alias\":\"process:principal-studio/renderer\",\"name\":\"principal-studio/renderer\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"7 members · 2 models\"},{\"alias\":\"process:principal-studio/host\",\"name\":\"principal-studio/host\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 1 model\"},{\"alias\":\"ungrouped\",\"name\":\"ungrouped\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"name\":\"TabStrip.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/shared/contract.ts\",\"name\":\"contract.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"3 members · 2 models\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"name\":\"alexandria.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/graphify-store.ts\",\"name\":\"graphify-store.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"2 members · 1 model\"},{\"alias\":\"process:alexandria\",\"name\":\"alexandria\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"name\":\"subsystemToExcalidraw.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"name\":\"excalidrawToSubsystem.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"name\":\"merge-submodel-models.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-react/src/subsystem/paths.ts\",\"name\":\"paths.ts\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"},{\"alias\":\"module:packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"name\":\"SubsystemFileTree.tsx\",\"construct\":\"external\",\"file\":\"\",\"purl\":\"external\",\"purpose\":\"1 member · 1 model\"}]");
5
+
6
+ export const aggregateRelations: SubsystemRelation[] = JSON.parse("[{\"id\":\"ref-extends-host\",\"from\":\"process:proposed/studio-gist\",\"to\":\"process:subsystems-core/types\",\"relationType\":\"extends\",\"refs\":[\"external:proposed\"]},{\"id\":\"schema-vs-react-parallel\",\"from\":\"process:subsystems-core\",\"to\":\"process:subsystems-react\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-core/src/types/subsystem-model.ts\"]},{\"id\":\"declaration-mirrors-detail\",\"from\":\"process:subsystems-core\",\"to\":\"process:subsystems-react\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/graphify/consolidated.ts\"]},{\"id\":\"declaration-not-read\",\"from\":\"process:subsystems-react\",\"to\":\"process:subsystems-core\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/formatDeclaration.ts\"]},{\"id\":\"graph-imports-build\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"relationType\":\"imports\"},{\"id\":\"graph-imports-group-node\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/nodes.tsx\",\"relationType\":\"imports\"},{\"id\":\"build-imports-elk\",\"from\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"to\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"relationType\":\"imports\"},{\"id\":\"graph-imports-build__dup1\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"relationType\":\"imports\"},{\"id\":\"graph-imports-group\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/nodes.tsx\",\"relationType\":\"imports\"},{\"id\":\"build-imports-elk__dup1\",\"from\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"to\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"relationType\":\"imports\"},{\"id\":\"r-view-graph\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"relationType\":\"imports\"},{\"id\":\"r-view-issues\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-view-verification\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-view-flow\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-graph-node\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-graph-chip\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-graph-list\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"relationType\":\"imports\"},{\"id\":\"r-audit-save\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-component-anchor\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-audit-topology\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-audit-boundary\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-comp-infer\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-comp-constructs\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"r-comp-signatures\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\"},{\"id\":\"smv-imports-graph\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\"]},{\"id\":\"smv-imports-file-view\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:principal-studio/renderer\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreFileView.tsx\"]},{\"id\":\"smv-imports-snippet-view\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:principal-studio/renderer\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/pierre/PierreSnippetView.tsx\"]},{\"id\":\"graph-imports-drawer\",\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:principal-studio/renderer\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\"]},{\"id\":\"get-model-imports-fs\",\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"process:principal-studio/host\",\"relationType\":\"imports\"},{\"id\":\"app-renders-strip\",\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/App.tsx\"]},{\"id\":\"app-uses-requests\",\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/shared/contract.ts\",\"relationType\":\"references\"},{\"id\":\"bridge-uses-requests\",\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/shared/contract.ts\",\"relationType\":\"references\"},{\"id\":\"bridge-uses-messages\",\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/shared/contract.ts\",\"relationType\":\"references\"},{\"id\":\"broadcast-uses-messages\",\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"to\":\"module:packages/subsystems-studio/src/shared/contract.ts\",\"relationType\":\"references\"},{\"id\":\"route-to-validation\",\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"route-to-store-create\",\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"route-to-alexandria-register\",\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"validation-to-cross-field\",\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-core\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-validation.ts\"]},{\"id\":\"register-roots-to-alexandria\",\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/http-server.ts\"]},{\"id\":\"resolve-root-to-alexandria\",\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/subsystem-model-store.ts\"]},{\"id\":\"resolve-purl-root-to-alexandria\",\"from\":\"module:packages/subsystems-studio/src/bun/graphify-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/graphify-store.ts\"]},{\"id\":\"listing-to-derivation\",\"from\":\"process:principal-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\"]},{\"id\":\"merge-reads-store\",\"from\":\"module:packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"relationType\":\"references\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/merge-submodel-models.ts\"]},{\"id\":\"rebuild-imports-meta\",\"from\":\"module:packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\"]},{\"id\":\"fix-adopt-reads-store\",\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/verify-subsystem-component.ts\"]},{\"id\":\"proposal-create-reads-store\",\"from\":\"module:packages/subsystems-studio/src/bun/proposal-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"relationType\":\"imports\",\"refs\":[\"pkg:github/principal-ai/subsystem-modeling#packages/subsystems-studio/src/bun/proposal-store.ts\"]},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"id\":\"detail-uses-repos\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-react/src/subsystem/paths.ts\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"id\":\"detail-uses-tree\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"id\":\"panel-uses-repos\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-react/src/subsystem/paths.ts\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"id\":\"panel-uses-tree\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\"},{\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"id\":\"rpc-reads-index\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"id\":\"view-renders-summary\",\"relationType\":\"references\",\"to\":\"module:packages/subsystems-studio/src/shared/contract.ts\"}]");
7
+
8
+ export const aggregateWalkthroughs: SubsystemWalkthrough[] = JSON.parse("[{\"id\":\"tl-site-view-gist\",\"title\":\"Someone opens the shared gist on the site\",\"steps\":[{\"from\":\"process:site/web\",\"to\":\"process:external/github\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":94,\"symbol\":\"loadSubsystemModelFromGist\",\"annotation\":\"Read the public gist JSON (no Studio disk involved).\"},{\"from\":\"process:site/web\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"mechanism\":\"uses\",\"file\":\"site/src/pages/Gist.tsx\",\"line\":184,\"symbol\":\"Gist\",\"annotation\":\"Render the shared model in the browser.\"}]},{\"id\":\"tl-persist-local-store\",\"title\":\"Persist a local model to ~/.principal/subsystem-models\",\"steps\":[{\"from\":\"process:principal-studio-cli\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"line\":186,\"symbol\":\"createAction\",\"annotation\":\"CLI/agent create path — always a new local sg- id today.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"process:local/disk\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":929,\"symbol\":\"createSubsystemModel\",\"annotation\":\"Host create writes a record into the shared ~/.principal/subsystem-models directory (CLI can write the same store).\"},{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":951,\"symbol\":\"createSubsystemModel\",\"annotation\":\"Mirror listing fields into _index.json.\"},{\"from\":\"process:principal-studio-cli\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/principal-studio-cli/src/commands/subsystem-model.ts\",\"line\":205,\"symbol\":\"createAction\",\"annotation\":\"Open the local model in Studio.\"}]},{\"id\":\"tl-proposed-share-gist\",\"title\":\"Proposed: share local model as gist (create or update)\",\"steps\":[{\"from\":\"process:proposed/studio-gist\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":919,\"symbol\":\"getSubsystemModel\",\"annotation\":\"Load the hydrated local record from the disk store.\"},{\"from\":\"process:proposed/studio-gist\",\"to\":\"process:site/web\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":161,\"symbol\":\"toPortableDocument\",\"annotation\":\"Strip host fields so the gist file is portable-only.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:proposed/studio-gist\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":849,\"symbol\":\"indexEntryFor\",\"annotation\":\"Index/host gist ref decides PATCH existing gist vs POST a new one.\"},{\"from\":\"process:proposed/studio-gist\",\"to\":\"process:external/github\",\"mechanism\":\"calls\",\"file\":\"site/src/lib/gist.ts\",\"line\":94,\"symbol\":\"loadSubsystemModelFromGist\",\"annotation\":\"POST /gists (first share) or PATCH /gists/{id} (subsequent) — token required.\"},{\"from\":\"process:proposed/studio-gist\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":957,\"symbol\":\"updateSubsystemModel\",\"annotation\":\"Stamp gist.id on the local record + index so the next share updates in place.\"}]},{\"id\":\"tl-first-open-ok\",\"title\":\"First open — cover lifts\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-react\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":258,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Mount SubsystemComponentGraph for a freshly loaded graph.\"},{\"from\":\"process:subsystems-react\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1: buildSubsystemGraph without measured sizes.\"},{\"from\":\"process:subsystems-react\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":454,\"symbol\":\"triggerPass2\",\"annotation\":\"Pass 2 re-runs buildSubsystemGraph with measured widths.\"}]},{\"id\":\"tl-update-stuck\",\"title\":\"Bug (before fix) — update stuck on cover\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":324,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Agent PUT patches the open graph.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2007,\"symbol\":\"broadcastSubsystemModelChanged\",\"annotation\":\"Send subsystemModelChanged into the renderer.\"},{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":95,\"symbol\":\"subsystemModelChangeSubscribers\",\"annotation\":\"Fan the push out to every subscribed tab.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-react\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":258,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Same Inner instance gets new components/edges props.\"},{\"from\":\"process:subsystems-react\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1 rebuilds then setLayoutReady(false) drops the cover.\"}]},{\"id\":\"tl-proposed-fix\",\"title\":\"Fix — reuse dims + kick Pass 2\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":324,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Same live PUT into an open tab.\"},{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":69,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Tab reloads; Inner stays mounted.\"},{\"from\":\"process:subsystems-react\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":407,\"symbol\":\"Inner\",\"annotation\":\"Pass 1 still estimates; cover drops via setLayoutReady(false).\"},{\"from\":\"process:subsystems-react\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":454,\"symbol\":\"triggerPass2\",\"annotation\":\"Measured ELK; .catch reveals on error.\"}]},{\"id\":\"tl-probe-status\",\"title\":\"Probe OpenCode server status\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1406,\"symbol\":\"probeOpencodeServer\",\"annotation\":\"RPC getOpencodeServerStatus delegates to probeOpencodeServer.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":108,\"symbol\":\"probeOpencodeServer\",\"annotation\":\"Basic-auth GET /api/health against the live OpenCode server.\"}]},{\"id\":\"tl-watch-live-sessions\",\"title\":\"Watch live OpenCode sessions\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/components/ServerSessionsModal.tsx\",\"line\":102,\"symbol\":\"ServerSessionsModal\",\"annotation\":\"Enable the host SSE watch when the modal mounts.\"},{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1407,\"symbol\":\"listRecentServerSessions\",\"annotation\":\"RPC getServerSessions delegates to listRecentServerSessions.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":182,\"symbol\":\"listRecentServerSessions\",\"annotation\":\"Build Basic-auth headers before fetching session list and active set.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"watches\",\"file\":\"packages/subsystems-studio/src/bun/server-sessions.ts\",\"line\":302,\"symbol\":\"startWatch\",\"annotation\":\"Open the /api/event SSE stream with the same Basic-auth headers.\"}]},{\"id\":\"tl-load-historical\",\"title\":\"Load historical OpenCode session events\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1286,\"symbol\":\"buildSessionIndex\",\"annotation\":\"listSessions RPC builds the recent-window index from opencode.db.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":801,\"symbol\":\"buildSessionIndex\",\"annotation\":\"Resolve the OpenCode data-dir sqlite path for the index scan.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1270,\"symbol\":\"processSessionEvents\",\"annotation\":\"Cache-key the OpenCode session before reading its sqlite event rows.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-core\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1310,\"symbol\":\"processSessionEvents\",\"annotation\":\"Convert raw OpenCode rows into universal events before normalize/accumulate.\"}]},{\"id\":\"tl-extract-concepts\",\"title\":\"Extract concepts via opencode run\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1961,\"symbol\":\"analyzeSessionInBackground\",\"annotation\":\"analyzeSession RPC starts background extraction for a new analysis id.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/extraction.ts\",\"line\":263,\"symbol\":\"runOpenCodeExtraction\",\"annotation\":\"Spawn OPENCODE_BIN run --agent concept-extractor and parse the JSON stream.\"}]},{\"id\":\"tl-run-audit\",\"title\":\"Run a dry-run audit from the Audit button\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":347,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Collect unique component purls that need a graphify cache, skipping externals.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":364,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Subscribe to graphifyChanged pushes while a background build runs.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":374,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Ensure the graphify cache over RPC and wait when the status is building.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":443,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Invoke the host dry-run audit once caches are ready.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":452,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Deliver the report into the modal done phase without mutating the graph.\"}]},{\"id\":\"tl-host-checks\",\"title\":\"Deterministic checks inside the host audit\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":598,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Check every file exists and every claimed symbol is declared.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":227,\"symbol\":\"verifySubsystemComponent\",\"annotation\":\"Test the claimed symbol declaration against file contents.\"}]},{\"id\":\"wt-regular-audit\",\"title\":\"Background regular audit pass\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/regular-audit.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2683,\"symbol\":\"auditOne\",\"annotation\":\"Hand the next stored model to the quiet re-audit once the timer fires.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2662,\"symbol\":\"reauditSubsystemModelQuietly\",\"annotation\":\"Re-run the deterministic dry-run audit for the model.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":871,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Produce the fresh report the quiet pass persists.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/regular-audit.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2686,\"symbol\":\"broadcastRegularAuditChanged\",\"annotation\":\"Emit scheduler status on every enable, tick and pass finish.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":151,\"symbol\":\"broadcastRegularAuditChanged\",\"annotation\":\"Fan the pushed status out to every registered renderer callback.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":645,\"symbol\":\"regularAuditChangeSubscribers\",\"annotation\":\"Re-render the model list countdown and running badge.\"}]},{\"id\":\"tl-click-load\",\"title\":\"Click subsystem, tab already open (fast path)\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":981,\"symbol\":\"onOpen\",\"annotation\":\"Row click fires openSubsystemModel RPC; host takes the zero-IO focus path.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1018,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host broadcasts focus before any disk IO so the tab switches instantly.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":829,\"symbol\":\"touchSubsystemModelOpened\",\"annotation\":\"Stamp path re-reads the graph file, then writes record plus index.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":79,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Remount fetches the full graph over the bridge.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail mounts the React Flow graph with full components and edges.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":537,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Graph runs pass 1 ELK layout with estimated node sizes.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"to\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1408,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"Builder runs orthogonal ELK on the main thread.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-react\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":2122,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Cover stays opaque 650ms after layout ready plus 200ms fade.\"}]},{\"id\":\"tl-optimistic-open\",\"title\":\"First open with empty state (implemented)\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":981,\"symbol\":\"onOpen\",\"annotation\":\"Row click fires RPC; host resolves title from the small index file.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1051,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host creates tab from index title, no full graph read.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1054,\"symbol\":\"openSubsystemModelTab\",\"annotation\":\"Host broadcasts focus immediately; stamp moves to background.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":303,\"symbol\":\"App\",\"annotation\":\"Renderer switches tab and mounts detail view without waiting.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":361,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail shows Loading placeholder while graph fetches.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":79,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Detail fetches full graph in background and fills in on arrival.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Once loaded, detail mounts graph canvas; tab already visible.\"}]},{\"id\":\"tl-debug-install\",\"title\":\"Debug tab detects and installs OpenCode V2\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"line\":22,\"symbol\":\"OpencodeV2DebugView\",\"annotation\":\"Tab loads status over RPC getOpencodeV2Status.\"},{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/OpencodeV2DebugView.tsx\",\"line\":66,\"symbol\":\"OpencodeV2DebugView\",\"annotation\":\"Install button kicks installOpencodeV2 in the background.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":147,\"symbol\":\"installOpencodeV2\",\"annotation\":\"Runs npm install -g @opencode-ai/cli@beta when the binary is missing.\"}]},{\"id\":\"tl-ensure-opencode-v2\",\"title\":\"Studio ensures OpenCode V2 runtime\",\"steps\":[{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"If missing or behind, Studio installs/updates @opencode-ai/cli@beta (mirrors studio-version detect+update).\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":650,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Service.ensure([opencode2, serve, --service]) starts or reuses the shared V2 background server.\"}]},{\"id\":\"tl-start-maintain-via-v2\",\"title\":\"Start Maintain via OpenCode V2\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/components/MaintainModelPickerModal.tsx\",\"line\":89,\"symbol\":\"MaintainModelPickerModal\",\"annotation\":\"RPC maintainSubsystemModel kicks the host; UI returns as soon as the run is accepted.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2.ts\",\"line\":24,\"symbol\":\"resolveOpencode2Bin\",\"annotation\":\"If missing or behind beta, Studio installs/updates @opencode-ai/cli@beta (same idea as studio-version update).\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":650,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Service.ensure([opencode2, serve, --service]) starts or reuses the shared V2 background server.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":651,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Create session + prompt on the ensured V2 service (replaces Bun.spawn opencode run).\"}]},{\"id\":\"tl-live-progress-sse\",\"title\":\"Live progress over V2 SSE\",\"steps\":[{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/v2\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/maintain-model.ts\",\"line\":651,\"symbol\":\"runMaintainAgent\",\"annotation\":\"Same seam also opens client.event.subscribe() scoped to the Maintain session.\"},{\"from\":\"process:opencode/v2\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2319,\"symbol\":\"maintainSubsystemModelInBackground\",\"annotation\":\"Proposed: forward message/part/tool events into Maintain broadcasts instead of waiting for process exit.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2325,\"symbol\":\"maintainSubsystemModelInBackground\",\"annotation\":\"Host pushes subsystemModelMaintainChanged. StudioMessageSubscriber now types the payload; renderer subscription sites are the fan-out.\"}]},{\"id\":\"tl-agent-proposes\",\"title\":\"Agent proposes via Studio HTTP\",\"steps\":[{\"from\":\"process:opencode/v2\",\"to\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":354,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Agent curls POST /api/subsystem-model/:id/proposals using Access commands from the brief.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/proposal-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":354,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"HTTP handler validates body and creates a pending proposal in the proposal store.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":71,\"symbol\":\"subsystemModelProposalsChangeSubscribers\",\"annotation\":\"HTTP onProposalsChanged dispatch lands on the contract type node — the fan-out bag is plumbing under the refactor.\"}]},{\"id\":\"tl-list-maintain\",\"title\":\"List Maintenance Sessions\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":360,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Renderer RPC listMaintainSessions for the day window.\"}]},{\"id\":\"tl-load-timeline-gap\",\"title\":\"Load timeline (empty for V2 Maintain)\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Seed the panel via getAgentSessionsOverview({ scope: maintain }).\"}]},{\"id\":\"tl-create-maintain\",\"title\":\"Create a Maintain run\",\"steps\":[{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode2/service\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/opencode-v2-live.ts\",\"line\":291,\"symbol\":\"runOpencodeV2AgentSession\",\"annotation\":\"Create+prompt against the running opencode2 HTTP service.\"}]},{\"id\":\"tl-maintain-list\",\"title\":\"List Maintenance Sessions\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":360,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"scope=maintain calls listMaintainSessions for the day window.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/sqlite\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"line\":161,\"symbol\":\"listMaintainSessions\",\"annotation\":\"SELECT from session_v2 where agent is issue-fixer/gap-filler or title is Maintain — …\"}]},{\"id\":\"tl-v1-timeline\",\"title\":\"V1 timeline (event table)\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Overview loads processed timelines via getAgentSessionsOverview → processSessionEvents.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/sqlite\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"V1 identity: row exists in session (e.g. version 1.18.30).\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/sqlite\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1292,\"symbol\":\"processSessionEvents\",\"annotation\":\"SELECT FROM event WHERE aggregate_id = ? — today's OpenCode path.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-core\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1318,\"symbol\":\"opencodeRowsToUniversalEvents\",\"annotation\":\"Map event rows to UniversalAgentSessionEvent.\"},{\"from\":\"process:subsystems-core\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1336,\"symbol\":\"accumulateEvents\",\"annotation\":\"Accumulate into SessionEventRow for the panel.\"}]},{\"id\":\"tl-v2-timeline\",\"title\":\"V2 timeline (session_message)\",\"steps\":[{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/AgentSessions.tsx\",\"line\":411,\"symbol\":\"AgentSessionsOverviewView\",\"annotation\":\"Same overview load path; kind routing chooses the V2 reader.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/sqlite\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/maintain-sessions.ts\",\"line\":161,\"symbol\":\"listMaintainSessions\",\"annotation\":\"V2 identity signal is the session_v2 metadata row (same table listing uses).\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:opencode/sqlite\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/session-pipeline.ts\",\"line\":1200,\"symbol\":\"processSessionEvents\",\"annotation\":\"Planned: read session_message instead of event for v2 ids.\"}]},{\"id\":\"tl-authored-renders-unknown\",\"title\":\"Authored declaration → panel shows = unknown\",\"steps\":[{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-react\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1776,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Selected node opens ComponentDeclaration with the raw component.\"}]},{\"id\":\"tl-verified-detail-works\",\"title\":\"Verified graphify capture → detail → panel\",\"steps\":[{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-react\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1428,\"symbol\":\"buildDetailFromAdoptedSignature\",\"annotation\":\"Audit adopt-signature writes verified detail onto the component.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:subsystems-react\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":486,\"symbol\":\"normalizeDetailProvenance\",\"annotation\":\"Store defaults provenance and backfills required detail arrays.\"}]},{\"id\":\"tl-proposed-single-source\",\"title\":\"Proposed: panel reads schema declaration\",\"steps\":[{\"from\":\"process:subsystems-react\",\"to\":\"process:subsystems-core\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-core/src/types/subsystem-model.ts\",\"line\":224,\"symbol\":\"SubsystemConstructDeclaration\",\"annotation\":\"Repoint generateDeclarationString at this union (and migrate capture into it).\"}]},{\"id\":\"wt-frame-today\",\"title\":\"Frame a document (today)\",\"steps\":[{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":424,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Document change triggers buildSubsystemGraph.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"to\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1009,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"computeElkLayout gets a flat groups[] — one parent level only.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/nodes.tsx\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":178,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"RF registers SubsystemGroupNode for type subsystem-group.\"}]},{\"id\":\"wt-nest\",\"title\":\"Nest process → module → export\",\"steps\":[{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":424,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Document change triggers buildSubsystemGraph.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/model.ts\",\"to\":\"module:packages/subsystems-react/src/utils/elkLayout.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/subsystem/model.ts\",\"line\":1081,\"symbol\":\"buildSubsystemGraph\",\"annotation\":\"computeElkLayout gets nested groups[] with parentId.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/nodes.tsx\",\"mechanism\":\"uses\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":178,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"RF registers SubsystemGroupNode for type subsystem-group.\"}]},{\"id\":\"wt-paint\",\"title\":\"Paint the diagnostics\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":2030,\"symbol\":\"loadSubsystemModelAudit\",\"annotation\":\"The getSubsystemModelAudit RPC is served here by reading the saved report.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":318,\"symbol\":\"auditReportToIssues\",\"annotation\":\"Map the report's findings to presentation issues.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"Pass issues, diagnostic status, and (planned) verification into the graph.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":226,\"symbol\":\"nodeTypes\",\"annotation\":\"Each node's data carries the verification ladder and hover issue.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1547,\"symbol\":\"SubsystemDiagnosticToggle\",\"annotation\":\"The title row renders the status chip.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":1614,\"symbol\":\"SubsystemIssueList\",\"annotation\":\"The sidebar bottom panel renders the grouped issue list.\"}]},{\"id\":\"wt-run\",\"title\":\"Run the audit\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:subsystems-studio/renderer\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":294,\"symbol\":\"runSubsystemModelAuditFlow\",\"annotation\":\"Chip click with no or stale report runs the audit flow.\"},{\"from\":\"process:subsystems-studio/renderer\",\"to\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/auditSubsystemModelFlow.ts\",\"line\":271,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Run the host audit over the RPC bridge.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"writes\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1333,\"symbol\":\"saveSubsystemModelAudit\",\"annotation\":\"Persist the fresh report so the view can fetch it.\"}]},{\"id\":\"wt-audit\",\"title\":\"Audit (dry-run, graphify-backed)\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":429,\"symbol\":\"resolveComponentAnchor\",\"annotation\":\"Anchor file+symbol onto a graphify definition node before construct/signature checks.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1233,\"symbol\":\"auditTopologyRelations\",\"annotation\":\"Layer 2: relations[] endpoints + soft corroboration.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1263,\"symbol\":\"auditBoundaryFields\",\"annotation\":\"Layer 3: module/file membership + process nesting.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":530,\"symbol\":\"inferConstructFromGraphify\",\"annotation\":\"Infer the construct kind from the anchored node (heuristic hint).\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":581,\"symbol\":\"constructsMatch\",\"annotation\":\"Compare the claimed construct against the inferred one.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":649,\"symbol\":\"compareSignatures\",\"annotation\":\"Compare authored named types against graphify signature edges.\"}]},{\"id\":\"wt-open-file\",\"title\":\"Open a file in the graph\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":377,\"symbol\":\"SubsystemModelView\",\"annotation\":\"Host injects the path-keyed file viewer and readFile closure into the graph.\"},{\"from\":\"module:packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"to\":\"process:principal-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemComponentGraph.tsx\",\"line\":2049,\"symbol\":\"SubsystemComponentGraph\",\"annotation\":\"A click sets the drawer target, opens the bottom drawer, and re-tags every node for file spotlight.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:principal-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"line\":149,\"symbol\":\"renderFileViewer\",\"annotation\":\"renderFileViewer mounts the full-file viewer, or PierreSnippetView for a declaration line.\"}]},{\"id\":\"wt-read-file\",\"title\":\"Read the file and paint it\",\"steps\":[{\"from\":\"process:principal-studio/renderer\",\"to\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-react/src/pierre/PierreFileView.tsx\",\"line\":60,\"symbol\":\"PierreFileView\",\"annotation\":\"Viewer calls the host readFile closure for this path.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1460,\"symbol\":\"readFile\",\"annotation\":\"Each open re-reads and JSON-parses the entire graph record because the host caches nothing.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:principal-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1467,\"symbol\":\"readFile\",\"annotation\":\"Handler resolves the repo-relative path under the graph's root and rejects traversal.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelView.tsx\",\"to\":\"process:principal-studio/host\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1468,\"symbol\":\"readFile\",\"annotation\":\"Reads the target file content and returns it over IPC as one string.\"}]},{\"id\":\"wt-close-cmd-w\",\"title\":\"Close the active tab with ⌘W\",\"steps\":[{\"from\":\"ungrouped\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":3299,\"symbol\":\"ApplicationMenu\",\"annotation\":\"The File > Close Tab accelerator fires closeActiveTab; the host closes its *suggested* tab, which setActiveTab keeps in sync with the renderer's active tab.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"Host pushes tabsChanged across the RPC bridge; the renderer handler fans it out to every subscriber.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"App's registered refresh callback runs, dropping the closed tab from local state.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":340,\"symbol\":\"refresh\",\"annotation\":\"The shell asks the host for the current tab list.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1425,\"symbol\":\"listTabs\",\"annotation\":\"listTabs serializes the registry plus the resume suggestion; the shell re-derives its active tab from the result.\"}]},{\"id\":\"wt-close-strip-x\",\"title\":\"Close a tab from the strip's × button\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/mainview/components/TabStrip.tsx\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":415,\"symbol\":\"App\",\"annotation\":\"App wires its onClose callback into the strip — the × affordance invokes it.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"to\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/App.tsx\",\"line\":381,\"symbol\":\"onClose\",\"annotation\":\"onClose asks the host to close that specific tab id (the click path closes the tab you clicked, not the suggestion).\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1450,\"symbol\":\"closeTab\",\"annotation\":\"The host's closeTab handler funnels into the same closeTabById choke point ⌘W uses.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"Same host notification, same renderer fan-out.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/rpc.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/App.tsx\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/rpc.ts\",\"line\":111,\"symbol\":\"tabsChanged\",\"annotation\":\"The shell refreshes and falls back to a remaining tab.\"}]},{\"id\":\"wt-create\",\"title\":\"Create or update a model\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":328,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Reject an invalid document before anything is persisted.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":134,\"symbol\":\"registerSuppliedRoots\",\"annotation\":\"Learn the roots into Alexandria, not the record.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/http-server.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/http-server.ts\",\"line\":334,\"symbol\":\"handleSubsystemModelRequest\",\"annotation\":\"Persist the validated document.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"line\":413,\"symbol\":\"resolveRepoRootForComponent\",\"annotation\":\"Delegate the purl lookup to the registry.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"to\":\"process:alexandria\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/alexandria.ts\",\"line\":200,\"symbol\":\"resolveRepoRootFromAlexandria\",\"annotation\":\"Match the repo's remote against registered projects.\"}]},{\"id\":\"wt-list\",\"title\":\"List models as repo cards\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":645,\"symbol\":\"refresh\",\"annotation\":\"Renderer asks the host for the model list over RPC.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"process:subsystems-studio/host\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"line\":1997,\"symbol\":\"githubReposFromComponents\",\"annotation\":\"Derive each model's repos from its component purls — no stored repo field.\"},{\"from\":\"process:subsystems-studio/host\",\"to\":\"process:principal-studio/renderer\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":329,\"symbol\":\"collectReposFromGraphs\",\"annotation\":\"Group models into repo cards from the derived repos.\"}]},{\"id\":\"wt-audit__dup1\",\"title\":\"Audit a model\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/graphify-store.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1179,\"symbol\":\"auditSubsystemModel\",\"annotation\":\"Ask which component purls have a current graphify cache.\"},{\"from\":\"module:packages/subsystems-studio/src/bun/graphify-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/alexandria.ts\",\"mechanism\":\"calls\",\"file\":\"packages/subsystems-studio/src/bun/graphify-store.ts\",\"line\":279,\"symbol\":\"resolveRepoRootForPurl\",\"annotation\":\"Same registry lookup the write path uses.\"}]},{\"id\":\"wt-propose\",\"title\":\"Propose and accept a correction bound to a component id\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/proposal-store.ts\",\"mechanism\":\"produces\",\"file\":\"packages/subsystems-studio/src/bun/proposal-store.ts\",\"line\":522,\"symbol\":\"createSubsystemModelProposal\",\"annotation\":\"Audit findings drive an agent-proposed correction; the change list targets component ids (and topology endpoints).\"}]},{\"id\":\"wt-adopt\",\"title\":\"Adopt graphify findings onto a component\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/verify-subsystem-component.ts\",\"line\":1366,\"symbol\":\"applySubsystemModelAuditFix\",\"annotation\":\"Re-reads the record and rewrites the component that owns the id.\"}]},{\"id\":\"wt-excalidraw\",\"title\":\"Excalidraw round-trip of a model\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"line\":152,\"symbol\":\"principalMetaForComponent\",\"annotation\":\"Each component carries its id onto its element so the scene holds the model's identity.\"},{\"from\":\"module:packages/subsystems-studio/src/mainview/excalidraw/subsystemToExcalidraw.ts\",\"to\":\"module:packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/mainview/excalidraw/excalidrawToSubsystem.ts\",\"line\":140,\"symbol\":\"excalidrawSceneToSubsystemModel\",\"annotation\":\"The edited scene becomes a document again; ids ride through the metadata verbatim.\"}]},{\"id\":\"wt-merge\",\"title\":\"Compose a repo's models into one graph (proposed)\",\"steps\":[{\"from\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"mechanism\":\"feeds\",\"file\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"line\":1,\"symbol\":\"mergeSubsystemModels\",\"annotation\":\"Reads every model touching a repo-key (proposed — this is the compose flow this model is the brief for).\"},{\"from\":\"module:packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\",\"mechanism\":\"reads\",\"file\":\"packages/subsystems-studio/src/bun/merge-submodel-models.ts\",\"line\":1,\"symbol\":\"mergeSubsystemModels\",\"annotation\":\"Same code identity unifies to one node keyed consistently and uniquely; each model's edges resolve in its own alias-space (proposed; an agent pass aligns the composed nodes later).\"}]},{\"id\":\"wt-list-today\",\"steps\":[{\"annotation\":\"Polls listSubsystemModels every 10s. Summaries carry counts and repos, never files.\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":701,\"mechanism\":\"calls\",\"symbol\":\"refresh\",\"to\":\"module:packages/subsystems-studio/src/bun/index.ts\"},{\"annotation\":\"Reads the lightweight index with counts and timestamps only.\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"line\":1950,\"mechanism\":\"calls\",\"symbol\":\"listSubsystemModels\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\"},{\"annotation\":\"Loads each full model to derive repos, graphify and audit, then drops component files before replying.\",\"file\":\"packages/subsystems-studio/src/bun/index.ts\",\"from\":\"module:packages/subsystems-studio/src/bun/index.ts\",\"line\":1953,\"mechanism\":\"calls\",\"symbol\":\"listSubsystemModels\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\"}],\"title\":\"List subsystems today — files stop at the host\"},{\"id\":\"wt-file-panel\",\"steps\":[{\"annotation\":\"Loads the full model once per selected id and caches it, invalidating on subsystemModelChanged.\",\"file\":\"packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":958,\"mechanism\":\"calls\",\"symbol\":\"onShowAuditReport\",\"to\":\"module:packages/subsystems-studio/src/bun/subsystem-model-store.ts\"},{\"annotation\":\"Groups the selected components file and purl pairs by repo.\",\"file\":\"packages/subsystems-react/src/subsystem/paths.ts\",\"from\":\"module:packages/subsystems-studio/src/mainview/views/SubsystemModelsView.tsx\",\"line\":93,\"mechanism\":\"calls\",\"symbol\":\"buildRepoGroups\",\"to\":\"module:packages/subsystems-react/src/subsystem/paths.ts\"},{\"annotation\":\"Renders one tree per repo group like the detail graph. Clicking a file opens the graph tab with the file drawer.\",\"file\":\"packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\",\"from\":\"module:packages/subsystems-react/src/subsystem/paths.ts\",\"line\":29,\"mechanism\":\"feeds\",\"symbol\":\"SubsystemFileTree\",\"to\":\"module:packages/subsystems-react/src/subsystem/SubsystemFileTree.tsx\"}],\"title\":\"Proposed — file trees for the selected subsystem\"}]");