@konitif/workbench 0.284.1 → 0.284.2

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/LICENSE.md CHANGED
File without changes
package/README.md CHANGED
@@ -1,54 +1,59 @@
1
1
  # @konitif/workbench
2
2
 
3
- ## Build and distribution
4
-
5
- Run `npm run build` to produce `dist` with the locked TypeScript compiler. The
6
- published contract exposes compiled ESM and declarations only. Run `npm test`
7
- then `npm run verify:package`; the latter packs the exact payload and consumes
8
- all four public entries from an isolated Node ESM/NodeNext fixture.
9
-
10
- The build does not install dependencies or publish. Release remains a separate,
11
- protected operation after the repository and archive have been qualified.
12
-
13
- Product-neutral Workbench authority for workspace composition, docking,
14
- registries, persistence ports and shell lifecycle contracts.
15
-
16
- The package hosts tools and widgets through generic definitions. It must not
17
- depend on a private product package or specialize product-specific behavior.
18
-
19
- ## Product color policy migration
20
-
21
- The development barrel no longer exports `getRobotJointColor`. Consumers must
22
- obtain their color policy from their product layer; generic viewers accept an
23
- injected color provider. This is a source API change, with no persisted-data migration.
24
- No compatibility reexport is provided because Workbench must not depend on a
25
- product package. This migration does not publish either package.
26
-
27
- Widget definitions and lazy bindings belong to `@konitif/widgets`.
28
- Workbench provides `createWorkbenchWidgetAdapter` to project an admitted
29
- definition into its hosting contract without loading or registering it.
30
- Widget registries, zones, placements and docking helpers remain here.
31
- Consumers of the former Widgets facade should import these host contracts
32
- from `@konitif/workbench`; no persisted placement migration is required.
33
-
34
- ## Selected workspace contracts
35
-
36
- `@konitif/workbench/workspace-contracts` exposes an explicit selection of
37
- workspace, shell, layout and tool-state contracts for state orchestration.
38
- It reexports the existing implementations without including audio, HTTP or
39
- local-storage adapters. The root entry and `hosting` remain compatible.
40
- This source-level boundary is tested; standalone archive qualification and
41
- publication remain separate gates.
42
-
43
- ## Transitional headless physics entry
44
-
45
- `@konitif/workbench/physics-runtime` forwards `PhysicsService`,
46
- `NoopPhysicsBackend` and physical contracts to the published `@konitif/physics`
47
- package. Their implementations do not live in Workbench.
48
- Consumers inject backend factories and explicitly drive stepping and disposal.
49
- No worker, engine binary, visual alignment or product configuration is loaded
50
- by this entry. The former UI paths reexport the same classes for compatibility.
51
-
52
- This is a compatibility boundary, not a permanent Workbench responsibility.
53
- Backend identifiers and source shapes
54
- remain unchanged; the no-op backend does not simulate physical effects.
3
+ Product-neutral workspace composition, docking, registries and hosting
4
+ contracts for KONITIF applications.
5
+
6
+ ## Installation
7
+
8
+ ```sh
9
+ npm install @konitif/workbench
10
+ ```
11
+
12
+ ## What it provides
13
+
14
+ - Workspace, layout, panel and shell contracts.
15
+ - Tool and widget admission, registries and hosting adapters.
16
+ - Runtime lifecycle, checkpoint, recovery and observability contracts.
17
+ - Project preflight and repository-quality contracts.
18
+ - Explicit workspace persistence, synchronization and surface ports.
19
+
20
+ ## Authority boundary
21
+
22
+ Workbench owns product-neutral workspace and runtime coordination contracts. It
23
+ does not own product tools, UI projections, robot models or application policy.
24
+ Widgets and tools retain their own definitions; Workbench admits and hosts them.
25
+ Physical implementations remain in `@konitif/physics` and are only exposed here
26
+ through a compatibility entry.
27
+
28
+ ## Quick start
29
+
30
+ ```ts
31
+ import { createWorkspace, validateWorkspace } from '@konitif/workbench/hosting';
32
+
33
+ const workspace = createWorkspace();
34
+ const issues = validateWorkspace(workspace);
35
+
36
+ if (issues.length > 0) {
37
+ console.error(issues);
38
+ }
39
+ ```
40
+
41
+ ## Public entry points
42
+
43
+ | Entry | Purpose |
44
+ | --- | --- |
45
+ | `@konitif/workbench` | Complete Workbench contract surface. |
46
+ | `@konitif/workbench/hosting` | Focused workspace hosting operations. |
47
+ | `@konitif/workbench/workspace-contracts` | State-orchestration contracts without host adapters. |
48
+ | `@konitif/workbench/physics-runtime` | Transitional forwarding entry for headless Physics contracts. |
49
+
50
+ ## Reference
51
+
52
+ See [`reference/`](reference/) for the machine-readable capability catalog and
53
+ authority diagrams. Layout state and executable composition remain distinct
54
+ authorities even when projected by the same application shell.
55
+
56
+ ## License
57
+
58
+ Source-available under [PolyForm Noncommercial 1.0.0](LICENSE.md), not OSI open
59
+ source. Commercial use requires separate written authorization.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@konitif/workbench",
3
3
  "license": "PolyForm-Noncommercial-1.0.0",
4
- "version": "0.284.1",
4
+ "version": "0.284.2",
5
5
  "description": "Product-neutral workspace composition, docking, registries and hosting contracts for KONITIF.",
6
6
  "repository": {
7
7
  "type": "git",
@@ -37,7 +37,8 @@
37
37
  "dist",
38
38
  "LICENSE.md",
39
39
  "README.md",
40
- "package.json"
40
+ "package.json",
41
+ "reference"
41
42
  ],
42
43
  "scripts": {
43
44
  "build": "node scripts/build.mjs",
@@ -0,0 +1,10 @@
1
+ # Workbench reference
2
+
3
+ This directory contains authored, machine-readable documentation for
4
+ `@konitif/workbench`.
5
+
6
+ - [`catalog.json`](catalog.json) groups workspace, runtime and hosting contracts.
7
+ - [`diagrams.json`](diagrams.json) describes authority, derivation and recovery flows.
8
+
9
+ These files support documentation tooling. They are not workspace snapshots,
10
+ runtime state or an executable application manifest.
@@ -0,0 +1,357 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "package": "@konitif/workbench",
4
+ "intent": "Provide the contracts and authorities of a composable work environment independently of its UI projections.",
5
+ "clusters": [
6
+ {
7
+ "id": "runtime-domain",
8
+ "title": "Runtime authority",
9
+ "summary": "Lifecycle, plans, checkpoints, observations, suspension, and resumption of a Workbench execution.",
10
+ "authority": "Canonical runtime session state, distinct from the executed definition and its projections.",
11
+ "owns": [
12
+ "runtime sessions",
13
+ "lifecycle transitions",
14
+ "correlated observations"
15
+ ],
16
+ "doesNotOwn": [
17
+ "authored composition",
18
+ "workspace layout",
19
+ "external physical effect"
20
+ ],
21
+ "workflow": [
22
+ "Admit",
23
+ "Execute",
24
+ "Observe",
25
+ "Resume"
26
+ ],
27
+ "sourcePrefixes": [
28
+ "domain/runtime/"
29
+ ]
30
+ },
31
+ {
32
+ "id": "composition-domain",
33
+ "title": "Executable composition",
34
+ "summary": "Canonical plans and assemblies that describe what can be executed independently of their editor.",
35
+ "authority": "Versioned, commandable composition artifact.",
36
+ "owns": [
37
+ "executable structure",
38
+ "semantic revision",
39
+ "dependencies"
40
+ ],
41
+ "doesNotOwn": [
42
+ "visual positions",
43
+ "runtime session",
44
+ "derived result"
45
+ ],
46
+ "workflow": [
47
+ "Declare",
48
+ "Validate",
49
+ "Version",
50
+ "Derive"
51
+ ],
52
+ "sourcePrefixes": [
53
+ "domain/composition/"
54
+ ]
55
+ },
56
+ {
57
+ "id": "workspace-layout-domain",
58
+ "title": "Workspace and layout",
59
+ "summary": "Organization of surfaces, panels, zones, and spatial interactions in a work environment.",
60
+ "authority": "Workspace configuration, separate from the meaning of open subjects.",
61
+ "owns": [
62
+ "layout tree",
63
+ "panels",
64
+ "modes and preferences"
65
+ ],
66
+ "doesNotOwn": [
67
+ "executed composition",
68
+ "internal tool state"
69
+ ],
70
+ "workflow": [
71
+ "Compose",
72
+ "Arrange",
73
+ "Persist",
74
+ "Rehydrate"
75
+ ],
76
+ "sourcePrefixes": [
77
+ "domain/workspace/",
78
+ "domain/layout/",
79
+ "domain/panel/",
80
+ "domain/workbench/"
81
+ ]
82
+ },
83
+ {
84
+ "id": "extensions-domain",
85
+ "title": "Tools, widgets, and surfaces",
86
+ "summary": "Extension contracts that let the Workbench host capabilities without owning them.",
87
+ "authority": "Admission and resolution of product-neutral contributions.",
88
+ "owns": [
89
+ "extension contracts",
90
+ "contribution identities",
91
+ "required capabilities"
92
+ ],
93
+ "doesNotOwn": [
94
+ "partner product implementation",
95
+ "concrete UI rendering"
96
+ ],
97
+ "workflow": [
98
+ "Define",
99
+ "Register",
100
+ "Resolve",
101
+ "Host"
102
+ ],
103
+ "sourcePrefixes": [
104
+ "domain/tool/",
105
+ "domain/widget/",
106
+ "domain/surface/"
107
+ ]
108
+ },
109
+ {
110
+ "id": "project-launch-domain",
111
+ "title": "Project, launch, and repository",
112
+ "summary": "Contracts for identifying, preflighting, qualifying, and admitting a project into the Workbench.",
113
+ "authority": "Project admission decision and associated diagnostics.",
114
+ "owns": [
115
+ "project manifests",
116
+ "launch steps",
117
+ "repository diagnostics"
118
+ ],
119
+ "doesNotOwn": [
120
+ "repository content",
121
+ "proof of general validity"
122
+ ],
123
+ "workflow": [
124
+ "Identify",
125
+ "Inspect",
126
+ "Qualify",
127
+ "Admit"
128
+ ],
129
+ "sourcePrefixes": [
130
+ "domain/project/",
131
+ "domain/launch/",
132
+ "domain/repository/",
133
+ "domain/repo-quality/",
134
+ "domain/experiment/"
135
+ ]
136
+ },
137
+ {
138
+ "id": "temporal-physics-domain",
139
+ "title": "Time, physics, and input",
140
+ "summary": "Coordinate, history, physics calculation, and input contracts used by hosted capabilities.",
141
+ "authority": "Shared calculation and coordination models without ownership of external hardware.",
142
+ "owns": [
143
+ "temporal coordinates",
144
+ "physics models",
145
+ "input intents"
146
+ ],
147
+ "doesNotOwn": [
148
+ "system clock",
149
+ "physical robot",
150
+ "device"
151
+ ],
152
+ "workflow": [
153
+ "Describe",
154
+ "Calculate",
155
+ "Sample",
156
+ "Observe"
157
+ ],
158
+ "sourcePrefixes": [
159
+ "domain/temporal/",
160
+ "domain/physics/",
161
+ "domain/input/",
162
+ "domain/robot/"
163
+ ]
164
+ },
165
+ {
166
+ "id": "presentation-foundations",
167
+ "title": "Presentation foundations",
168
+ "summary": "Language, icons, design system, shell, and presentation metadata independent of components.",
169
+ "authority": "Presentation contracts consumable by multiple projections.",
170
+ "owns": [
171
+ "descriptors",
172
+ "translations",
173
+ "visual identities"
174
+ ],
175
+ "doesNotOwn": [
176
+ "DOM",
177
+ "Svelte components",
178
+ "business state"
179
+ ],
180
+ "workflow": [
181
+ "Declare",
182
+ "Resolve",
183
+ "Project"
184
+ ],
185
+ "sourcePrefixes": [
186
+ "domain/i18n/",
187
+ "domain/icon/",
188
+ "domain/design-system/",
189
+ "domain/presentation/",
190
+ "domain/shell/",
191
+ "domain/shared/"
192
+ ]
193
+ },
194
+ {
195
+ "id": "workspace-application",
196
+ "title": "Workspace application",
197
+ "summary": "Use cases for composing and manipulating workspaces.",
198
+ "authority": "Application orchestration of the workspace.",
199
+ "owns": [
200
+ "command routing",
201
+ "sessions",
202
+ "snapshots"
203
+ ],
204
+ "doesNotOwn": [
205
+ "domain model",
206
+ "UI components"
207
+ ],
208
+ "workflow": [
209
+ "Receive",
210
+ "Coordinate",
211
+ "Project"
212
+ ],
213
+ "sourcePrefixes": [
214
+ "application/workspace/",
215
+ "application/layout/",
216
+ "application/shell/"
217
+ ]
218
+ },
219
+ {
220
+ "id": "runtime-application",
221
+ "title": "Runtime application",
222
+ "summary": "Plans, observations, checkpoints, and offload for the Workbench runtime.",
223
+ "authority": "Observable runtime coordination.",
224
+ "owns": [
225
+ "plans",
226
+ "checkpoints",
227
+ "observability"
228
+ ],
229
+ "doesNotOwn": [
230
+ "external business effect"
231
+ ],
232
+ "workflow": [
233
+ "Plan",
234
+ "Execute",
235
+ "Observe"
236
+ ],
237
+ "sourcePrefixes": [
238
+ "application/runtime/"
239
+ ]
240
+ },
241
+ {
242
+ "id": "registries-and-project",
243
+ "title": "Project and registries",
244
+ "summary": "Manifests and registries that resolve available capabilities.",
245
+ "authority": "Application-level admission and resolution.",
246
+ "owns": [
247
+ "manifests",
248
+ "registries",
249
+ "translations"
250
+ ],
251
+ "doesNotOwn": [
252
+ "registered implementations"
253
+ ],
254
+ "workflow": [
255
+ "Declare",
256
+ "Register",
257
+ "Resolve"
258
+ ],
259
+ "sourcePrefixes": [
260
+ "application/project/",
261
+ "application/registry/",
262
+ "application/i18n/"
263
+ ]
264
+ },
265
+ {
266
+ "id": "experiments-and-preflight",
267
+ "title": "Experiments and preflight",
268
+ "summary": "Controlled campaigns, observation recording, and preliminary repository verification.",
269
+ "authority": "Explicit experiment protocol and preflight decision.",
270
+ "owns": [
271
+ "campaigns",
272
+ "experimental observations",
273
+ "repository diagnostics"
274
+ ],
275
+ "doesNotOwn": [
276
+ "general scientific result",
277
+ "repository content"
278
+ ],
279
+ "workflow": [
280
+ "Prepare",
281
+ "Execute",
282
+ "Record"
283
+ ],
284
+ "sourcePrefixes": [
285
+ "application/experiment/",
286
+ "application/repository/"
287
+ ]
288
+ },
289
+ {
290
+ "id": "infrastructure",
291
+ "title": "Infrastructure",
292
+ "summary": "Replaceable persistence and communication adapters.",
293
+ "authority": "Port implementation, not domain authority.",
294
+ "owns": [
295
+ "adapters",
296
+ "transport",
297
+ "storage"
298
+ ],
299
+ "doesNotOwn": [
300
+ "business rules"
301
+ ],
302
+ "workflow": [
303
+ "Adapt",
304
+ "Transmit",
305
+ "Restore"
306
+ ],
307
+ "sourcePrefixes": [
308
+ "infrastructure/"
309
+ ]
310
+ },
311
+ {
312
+ "id": "temporal",
313
+ "title": "Temporal structures",
314
+ "summary": "Workbench-specific temporal contracts.",
315
+ "authority": "Shared temporal model.",
316
+ "owns": [
317
+ "coordinates",
318
+ "dialects",
319
+ "projections"
320
+ ],
321
+ "doesNotOwn": [
322
+ "external clock"
323
+ ],
324
+ "workflow": [
325
+ "Declare",
326
+ "Resolve",
327
+ "Project"
328
+ ],
329
+ "sourcePrefixes": [
330
+ "temporal/"
331
+ ]
332
+ },
333
+ {
334
+ "id": "boot-and-stage",
335
+ "title": "Initialization and staging",
336
+ "summary": "Prepares a session and its changes before admission.",
337
+ "authority": "Reversible preparation.",
338
+ "owns": [
339
+ "boot",
340
+ "preflight",
341
+ "staging"
342
+ ],
343
+ "doesNotOwn": [
344
+ "committed state"
345
+ ],
346
+ "workflow": [
347
+ "Prepare",
348
+ "Verify",
349
+ "Admit"
350
+ ],
351
+ "sourcePrefixes": [
352
+ "boot/",
353
+ "stage/"
354
+ ]
355
+ }
356
+ ]
357
+ }
@@ -0,0 +1,298 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "package": "@konitif/workbench",
4
+ "diagrams": [
5
+ {
6
+ "id": "workbench-authority-flow",
7
+ "title": "From project to Workbench projection",
8
+ "kind": "mechanism",
9
+ "summary": "Workbench contracts separate project admission, workspace state, execution, and observation.",
10
+ "nodes": [
11
+ {
12
+ "id": "manifest",
13
+ "label": "Project manifest",
14
+ "description": "Required and provided capabilities are declared."
15
+ },
16
+ {
17
+ "id": "registry",
18
+ "label": "Registries",
19
+ "description": "Compatible tools, widgets, and dialects are resolved."
20
+ },
21
+ {
22
+ "id": "workspace",
23
+ "label": "Workspace",
24
+ "description": "Panels, sessions, and artifacts are coordinated."
25
+ },
26
+ {
27
+ "id": "plan",
28
+ "label": "Runtime plan",
29
+ "description": "An admitted execution is prepared.",
30
+ "tone": "runtime"
31
+ },
32
+ {
33
+ "id": "observation",
34
+ "label": "Observation",
35
+ "description": "Checkpoints, diagnostics, and reported effects are captured.",
36
+ "tone": "observation"
37
+ },
38
+ {
39
+ "id": "projection",
40
+ "label": "UI projection",
41
+ "description": "Surfaces make state manipulable.",
42
+ "tone": "projection"
43
+ }
44
+ ],
45
+ "edges": [
46
+ {
47
+ "from": "manifest",
48
+ "to": "registry"
49
+ },
50
+ {
51
+ "from": "registry",
52
+ "to": "workspace"
53
+ },
54
+ {
55
+ "from": "workspace",
56
+ "to": "plan"
57
+ },
58
+ {
59
+ "from": "plan",
60
+ "to": "observation"
61
+ },
62
+ {
63
+ "from": "observation",
64
+ "to": "projection"
65
+ }
66
+ ],
67
+ "caption": "Workbench remains usable through its contracts even if its current UI projection disappears."
68
+ },
69
+ {
70
+ "id": "five-authority-planes",
71
+ "title": "Five authority planes that must remain distinct",
72
+ "kind": "boundary",
73
+ "summary": "A higher-order composition remains explicit when every state has one authority and an identifiable lifetime.",
74
+ "nodes": [
75
+ {
76
+ "id": "artifact",
77
+ "label": "Executable artifact",
78
+ "description": "Identity, structure, and revision of the subject to realize."
79
+ },
80
+ {
81
+ "id": "workspace",
82
+ "label": "Workspace",
83
+ "description": "Surfaces, layout, modes, and working preferences."
84
+ },
85
+ {
86
+ "id": "editable",
87
+ "label": "Editable projection",
88
+ "description": "Selection, zoom, positions, and local drafts.",
89
+ "tone": "projection"
90
+ },
91
+ {
92
+ "id": "derived",
93
+ "label": "Derived artifact",
94
+ "description": "Reproducible result identified by its sources and configuration.",
95
+ "tone": "observation"
96
+ },
97
+ {
98
+ "id": "session",
99
+ "label": "Runtime session",
100
+ "description": "Current lifecycle, admitted commands, effects, and observations.",
101
+ "tone": "runtime"
102
+ }
103
+ ],
104
+ "edges": [
105
+ {
106
+ "from": "artifact",
107
+ "to": "workspace"
108
+ },
109
+ {
110
+ "from": "workspace",
111
+ "to": "editable"
112
+ },
113
+ {
114
+ "from": "editable",
115
+ "to": "derived"
116
+ },
117
+ {
118
+ "from": "derived",
119
+ "to": "session"
120
+ }
121
+ ],
122
+ "caption": "These planes cooperate but never silently transfer their identity or authority."
123
+ },
124
+ {
125
+ "id": "workspace-command-roundtrip",
126
+ "title": "Round trip of a semantic change",
127
+ "kind": "lifecycle",
128
+ "summary": "An editable projection requests a change; only the canonical authority can create the revision later observed by surfaces.",
129
+ "nodes": [
130
+ {
131
+ "id": "gesture",
132
+ "label": "Surface gesture",
133
+ "description": "The user manipulates a projection.",
134
+ "tone": "projection"
135
+ },
136
+ {
137
+ "id": "intent",
138
+ "label": "Typed intent",
139
+ "description": "The gesture is translated without mutating the domain."
140
+ },
141
+ {
142
+ "id": "route",
143
+ "label": "Command routing",
144
+ "description": "The capability and its authority are resolved."
145
+ },
146
+ {
147
+ "id": "commit",
148
+ "label": "Canonical commit",
149
+ "description": "The admitted command produces a new revision.",
150
+ "tone": "runtime"
151
+ },
152
+ {
153
+ "id": "snapshot",
154
+ "label": "Observable snapshot",
155
+ "description": "The new state is published to readers.",
156
+ "tone": "observation"
157
+ },
158
+ {
159
+ "id": "reproject",
160
+ "label": "Reprojection",
161
+ "description": "All legitimate surfaces converge on this reading.",
162
+ "tone": "projection"
163
+ }
164
+ ],
165
+ "edges": [
166
+ {
167
+ "from": "gesture",
168
+ "to": "intent"
169
+ },
170
+ {
171
+ "from": "intent",
172
+ "to": "route"
173
+ },
174
+ {
175
+ "from": "route",
176
+ "to": "commit"
177
+ },
178
+ {
179
+ "from": "commit",
180
+ "to": "snapshot"
181
+ },
182
+ {
183
+ "from": "snapshot",
184
+ "to": "reproject"
185
+ }
186
+ ],
187
+ "caption": "A resize, zoom, or purely visual move stops in the projection and does not follow this cycle."
188
+ },
189
+ {
190
+ "id": "derived-artifact-invalidation",
191
+ "title": "Produce and invalidate a derived artifact",
192
+ "kind": "mechanism",
193
+ "summary": "Workbench can reuse a result only while every source that determines it still matches.",
194
+ "nodes": [
195
+ {
196
+ "id": "sources",
197
+ "label": "Versioned sources",
198
+ "description": "Canonical revision, assets, and dependencies are identified."
199
+ },
200
+ {
201
+ "id": "configuration",
202
+ "label": "Configuration",
203
+ "description": "Evaluator, runtime, and relevant conditions complete the key."
204
+ },
205
+ {
206
+ "id": "key",
207
+ "label": "Derivation key",
208
+ "description": "The reproducible identity of the computation is built."
209
+ },
210
+ {
211
+ "id": "result",
212
+ "label": "Derived result",
213
+ "description": "The computation and its useful observations are preserved.",
214
+ "tone": "observation"
215
+ },
216
+ {
217
+ "id": "reuse",
218
+ "label": "Reuse or recompute",
219
+ "description": "An equal key allows reading; a changed dependency invalidates its cone.",
220
+ "tone": "runtime"
221
+ }
222
+ ],
223
+ "edges": [
224
+ {
225
+ "from": "sources",
226
+ "to": "configuration"
227
+ },
228
+ {
229
+ "from": "configuration",
230
+ "to": "key"
231
+ },
232
+ {
233
+ "from": "key",
234
+ "to": "result"
235
+ },
236
+ {
237
+ "from": "result",
238
+ "to": "reuse"
239
+ }
240
+ ],
241
+ "caption": "A layout change does not invalidate an independent semantic result."
242
+ },
243
+ {
244
+ "id": "refresh-and-recovery",
245
+ "title": "Refresh, reconnection, and idempotent recovery",
246
+ "kind": "lifecycle",
247
+ "summary": "Recovery distinguishes persisted configuration, reread authority, and compatible session to avoid duplicate commands and revisions.",
248
+ "nodes": [
249
+ {
250
+ "id": "persisted",
251
+ "label": "Persisted configuration",
252
+ "description": "Layout, preferences, and references are restored."
253
+ },
254
+ {
255
+ "id": "reread",
256
+ "label": "Reread authorities",
257
+ "description": "External and canonical states are checked before display."
258
+ },
259
+ {
260
+ "id": "resolve",
261
+ "label": "Resolve the session",
262
+ "description": "A compatible session is resumed or a new one is explicitly created."
263
+ },
264
+ {
265
+ "id": "reconcile",
266
+ "label": "Reconcile",
267
+ "description": "Cached, stale, unknown, ready, and failed remain distinct.",
268
+ "tone": "runtime"
269
+ },
270
+ {
271
+ "id": "observe",
272
+ "label": "Publish the reading",
273
+ "description": "The projection receives a coherent snapshot without duplication.",
274
+ "tone": "observation"
275
+ }
276
+ ],
277
+ "edges": [
278
+ {
279
+ "from": "persisted",
280
+ "to": "reread"
281
+ },
282
+ {
283
+ "from": "reread",
284
+ "to": "resolve"
285
+ },
286
+ {
287
+ "from": "resolve",
288
+ "to": "reconcile"
289
+ },
290
+ {
291
+ "from": "reconcile",
292
+ "to": "observe"
293
+ }
294
+ ],
295
+ "caption": "A repeated equivalent observation creates no new session, command, or revision."
296
+ }
297
+ ]
298
+ }