@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.
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts +5 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js +4 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateFixture.js.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.d.ts +5 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.js +4 -0
- package/dist/stories/Subsystem/ComponentGraph/aggregateViewFixture.js.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts +5 -0
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.d.ts.map +1 -0
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.js +4 -0
- package/dist/stories/Subsystem/ComponentGraph/composedFixture.js.map +1 -0
- package/dist/subsystem/SubsystemAggregateGraph.d.ts +70 -0
- package/dist/subsystem/SubsystemAggregateGraph.d.ts.map +1 -0
- package/dist/subsystem/SubsystemAggregateGraph.js +385 -0
- package/dist/subsystem/SubsystemAggregateGraph.js.map +1 -0
- package/dist/subsystem/model.d.ts +7 -0
- package/dist/subsystem/model.d.ts.map +1 -1
- package/dist/subsystem/model.js +65 -1
- package/dist/subsystem/model.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +8 -0
- package/src/stories/Subsystem/ComponentDeclarationAudit.stories.tsx +13 -13
- package/src/stories/Subsystem/ComponentGraph/AggregateFrameGraph.stories.tsx +61 -0
- package/src/stories/Subsystem/ComponentGraph/AggregateGraph.stories.tsx +61 -0
- package/src/stories/Subsystem/ComponentGraph/Appearance.stories.tsx +17 -17
- package/src/stories/Subsystem/ComponentGraph/Basics.stories.tsx +2 -2
- package/src/stories/Subsystem/ComponentGraph/Captures.stories.tsx +3 -3
- package/src/stories/Subsystem/ComponentGraph/ComposedGraph.stories.tsx +73 -0
- package/src/stories/Subsystem/ComponentGraph/Constructs.stories.tsx +6 -6
- package/src/stories/Subsystem/ComponentGraph/CustomEntities.stories.tsx +8 -8
- package/src/stories/Subsystem/ComponentGraph/DetailPanel.stories.tsx +11 -11
- package/src/stories/Subsystem/ComponentGraph/Flows.stories.tsx +6 -6
- package/src/stories/Subsystem/ComponentGraph/FrameworkStereotype.stories.tsx +10 -10
- package/src/stories/Subsystem/ComponentGraph/ModuleBadges.stories.tsx +6 -6
- package/src/stories/Subsystem/ComponentGraph/Modules.stories.tsx +17 -17
- package/src/stories/Subsystem/ComponentGraph/NodeAnatomy.stories.tsx +16 -16
- package/src/stories/Subsystem/ComponentGraph/Packages.stories.tsx +12 -12
- package/src/stories/Subsystem/ComponentGraph/Processes.stories.tsx +1 -1
- package/src/stories/Subsystem/ComponentGraph/Proposed.stories.tsx +10 -10
- package/src/stories/Subsystem/ComponentGraph/Scenarios.stories.tsx +69 -69
- package/src/stories/Subsystem/ComponentGraph/Spotlights.stories.tsx +27 -27
- package/src/stories/Subsystem/ComponentGraph/aggregateFixture.ts +8 -0
- package/src/stories/Subsystem/ComponentGraph/aggregateViewFixture.ts +8 -0
- package/src/stories/Subsystem/ComponentGraph/composedFixture.ts +9 -0
- package/src/subsystem/SubsystemAggregateGraph.tsx +607 -0
- package/src/subsystem/model.test.ts +63 -0
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
372
|
+
key={component.alias}
|
|
373
373
|
type="button"
|
|
374
|
-
onClick={() => toggle(component.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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\"}]");
|