@exaudeus/workrail 3.27.0 → 3.29.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/console/assets/{index-FtTaDku8.js → index-BZ6HkxGf.js} +1 -1
- package/dist/console/index.html +1 -1
- package/dist/manifest.json +3 -3
- package/docs/README.md +57 -0
- package/docs/adrs/001-hybrid-storage-backend.md +38 -0
- package/docs/adrs/002-four-layer-context-classification.md +38 -0
- package/docs/adrs/003-checkpoint-trigger-strategy.md +35 -0
- package/docs/adrs/004-opt-in-encryption-strategy.md +36 -0
- package/docs/adrs/005-agent-first-workflow-execution-tokens.md +105 -0
- package/docs/adrs/006-append-only-session-run-event-log.md +76 -0
- package/docs/adrs/007-resume-and-checkpoint-only-sessions.md +51 -0
- package/docs/adrs/008-blocked-nodes-architectural-upgrade.md +178 -0
- package/docs/adrs/009-bridge-mode-single-instance-mcp.md +195 -0
- package/docs/adrs/010-release-pipeline.md +89 -0
- package/docs/architecture/README.md +7 -0
- package/docs/architecture/refactor-audit.md +364 -0
- package/docs/authoring-v2.md +527 -0
- package/docs/authoring.md +873 -0
- package/docs/changelog-recent.md +201 -0
- package/docs/configuration.md +505 -0
- package/docs/ctc-mcp-proposal.md +518 -0
- package/docs/design/README.md +22 -0
- package/docs/design/agent-cascade-protocol.md +96 -0
- package/docs/design/autonomous-console-design-candidates.md +253 -0
- package/docs/design/autonomous-console-design-review.md +111 -0
- package/docs/design/autonomous-platform-mvp-discovery.md +525 -0
- package/docs/design/claude-code-source-deep-dive.md +713 -0
- package/docs/design/console-cyberpunk-ui-discovery.md +504 -0
- package/docs/design/console-execution-trace-candidates-final.md +160 -0
- package/docs/design/console-execution-trace-candidates.md +211 -0
- package/docs/design/console-execution-trace-design-candidates-v2.md +113 -0
- package/docs/design/console-execution-trace-design-review.md +74 -0
- package/docs/design/console-execution-trace-discovery.md +394 -0
- package/docs/design/console-execution-trace-final-review.md +77 -0
- package/docs/design/console-execution-trace-review.md +92 -0
- package/docs/design/console-performance-discovery.md +415 -0
- package/docs/design/console-ui-backlog.md +280 -0
- package/docs/design/daemon-architecture-discovery.md +853 -0
- package/docs/design/daemon-design-candidates.md +318 -0
- package/docs/design/daemon-design-review-findings.md +119 -0
- package/docs/design/daemon-engine-design-candidates.md +210 -0
- package/docs/design/daemon-engine-design-review.md +131 -0
- package/docs/design/daemon-execution-engine-discovery.md +280 -0
- package/docs/design/daemon-gap-analysis.md +554 -0
- package/docs/design/daemon-owns-console-plan.md +168 -0
- package/docs/design/daemon-owns-console-review.md +91 -0
- package/docs/design/daemon-owns-console.md +195 -0
- package/docs/design/data-model-erd.md +11 -0
- package/docs/design/design-candidates-consolidate-dev-staleness.md +98 -0
- package/docs/design/design-candidates-walk-cache-depth-limit.md +80 -0
- package/docs/design/design-review-consolidate-dev-staleness.md +54 -0
- package/docs/design/design-review-walk-cache-depth-limit.md +48 -0
- package/docs/design/implementation-plan-consolidate-dev-staleness.md +142 -0
- package/docs/design/implementation-plan-walk-cache-depth-limit.md +141 -0
- package/docs/design/layer3b-ghost-nodes-design-candidates.md +229 -0
- package/docs/design/layer3b-ghost-nodes-design-review.md +93 -0
- package/docs/design/layer3b-ghost-nodes-implementation-plan.md +219 -0
- package/docs/design/list-workflows-latency-fix-plan.md +128 -0
- package/docs/design/list-workflows-latency-fix-review.md +55 -0
- package/docs/design/list-workflows-latency-fix.md +109 -0
- package/docs/design/native-context-management-api.md +11 -0
- package/docs/design/performance-sweep-2026-04.md +96 -0
- package/docs/design/routines-guide.md +219 -0
- package/docs/design/sequence-diagrams.md +11 -0
- package/docs/design/subagent-design-principles.md +220 -0
- package/docs/design/temporal-patterns-design-candidates.md +312 -0
- package/docs/design/temporal-patterns-design-review-findings.md +163 -0
- package/docs/design/test-isolation-from-config-file.md +335 -0
- package/docs/design/v2-core-design-locks.md +2746 -0
- package/docs/design/v2-lock-registry.json +734 -0
- package/docs/design/workflow-authoring-v2.md +1044 -0
- package/docs/design/workflow-docs-spec.md +218 -0
- package/docs/design/workflow-extension-points.md +687 -0
- package/docs/design/workrail-auto-trigger-system.md +359 -0
- package/docs/design/workrail-config-file-discovery.md +513 -0
- package/docs/docker.md +110 -0
- package/docs/generated/v2-lock-closure-plan.md +26 -0
- package/docs/generated/v2-lock-coverage.json +797 -0
- package/docs/generated/v2-lock-coverage.md +177 -0
- package/docs/ideas/backlog.md +3927 -0
- package/docs/ideas/design-candidates-mcp-resilience.md +208 -0
- package/docs/ideas/design-review-findings-mcp-resilience.md +119 -0
- package/docs/ideas/implementation_plan.md +249 -0
- package/docs/ideas/third-party-workflow-setup-design-thinking.md +1948 -0
- package/docs/implementation/02-architecture.md +316 -0
- package/docs/implementation/04-testing-strategy.md +124 -0
- package/docs/implementation/09-simple-workflow-guide.md +835 -0
- package/docs/implementation/13-advanced-validation-guide.md +874 -0
- package/docs/implementation/README.md +21 -0
- package/docs/integrations/claude-code.md +300 -0
- package/docs/integrations/firebender.md +315 -0
- package/docs/migration/v0.1.0.md +147 -0
- package/docs/naming-conventions.md +45 -0
- package/docs/planning/README.md +104 -0
- package/docs/planning/github-ticketing-playbook.md +195 -0
- package/docs/plans/README.md +24 -0
- package/docs/plans/agent-managed-ticketing-design.md +605 -0
- package/docs/plans/agentic-orchestration-roadmap.md +112 -0
- package/docs/plans/assessment-gates-engine-handoff.md +536 -0
- package/docs/plans/content-coherence-and-references.md +151 -0
- package/docs/plans/library-extraction-plan.md +340 -0
- package/docs/plans/mr-review-workflow-redesign.md +1451 -0
- package/docs/plans/native-context-management-epic.md +11 -0
- package/docs/plans/perf-fixes-design-candidates.md +225 -0
- package/docs/plans/perf-fixes-design-review-findings.md +61 -0
- package/docs/plans/perf-fixes-new-issues-candidates.md +264 -0
- package/docs/plans/perf-fixes-new-issues-review.md +110 -0
- package/docs/plans/prompt-fragments.md +53 -0
- package/docs/plans/ui-ux-workflow-design-candidates.md +120 -0
- package/docs/plans/ui-ux-workflow-discovery.md +100 -0
- package/docs/plans/ui-ux-workflow-review.md +48 -0
- package/docs/plans/v2-followup-enhancements.md +587 -0
- package/docs/plans/workflow-categories-candidates.md +105 -0
- package/docs/plans/workflow-categories-discovery.md +110 -0
- package/docs/plans/workflow-categories-review.md +51 -0
- package/docs/plans/workflow-discovery-model-candidates.md +94 -0
- package/docs/plans/workflow-discovery-model-discovery.md +74 -0
- package/docs/plans/workflow-discovery-model-review.md +48 -0
- package/docs/plans/workflow-source-setup-phase-1.md +245 -0
- package/docs/plans/workflow-source-setup-phase-2.md +361 -0
- package/docs/plans/workflow-staleness-detection-candidates.md +104 -0
- package/docs/plans/workflow-staleness-detection-review.md +58 -0
- package/docs/plans/workflow-staleness-detection.md +80 -0
- package/docs/plans/workflow-v2-design.md +69 -0
- package/docs/plans/workflow-v2-roadmap.md +74 -0
- package/docs/plans/workflow-validation-design.md +98 -0
- package/docs/plans/workflow-validation-roadmap.md +108 -0
- package/docs/plans/workrail-platform-vision.md +420 -0
- package/docs/reference/agent-context-cleaner-snippet.md +94 -0
- package/docs/reference/agent-context-guidance.md +140 -0
- package/docs/reference/context-optimization.md +284 -0
- package/docs/reference/example-workflow-repository-template/.github/workflows/validate.yml +125 -0
- package/docs/reference/example-workflow-repository-template/README.md +268 -0
- package/docs/reference/example-workflow-repository-template/workflows/example-workflow.json +80 -0
- package/docs/reference/external-workflow-repositories.md +916 -0
- package/docs/reference/feature-flags-architecture.md +472 -0
- package/docs/reference/feature-flags.md +349 -0
- package/docs/reference/god-tier-workflow-validation.md +272 -0
- package/docs/reference/loop-optimization.md +209 -0
- package/docs/reference/loop-validation.md +176 -0
- package/docs/reference/loops.md +465 -0
- package/docs/reference/mcp-platform-constraints.md +59 -0
- package/docs/reference/recovery.md +88 -0
- package/docs/reference/releases.md +177 -0
- package/docs/reference/troubleshooting.md +105 -0
- package/docs/reference/workflow-execution-contract.md +998 -0
- package/docs/roadmap/README.md +22 -0
- package/docs/roadmap/legacy-planning-status.md +103 -0
- package/docs/roadmap/now-next-later.md +70 -0
- package/docs/roadmap/open-work-inventory.md +389 -0
- package/docs/tickets/README.md +39 -0
- package/docs/tickets/next-up.md +76 -0
- package/docs/workflow-management.md +317 -0
- package/docs/workflow-templates.md +423 -0
- package/docs/workflow-validation.md +184 -0
- package/docs/workflows.md +254 -0
- package/package.json +3 -1
- package/spec/authoring-spec.json +61 -16
- package/workflows/workflow-for-workflows.json +252 -93
- package/workflows/workflow-for-workflows.v2.json +188 -77
|
@@ -0,0 +1,734 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./v2-lock-registry.schema.json",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Machine-readable registry of all v2 design locks. Source of truth for enforcement coverage.",
|
|
5
|
+
"generatedWarning": "This file is the source of truth for lock IDs. Tests annotate which locks they enforce via @enforces tags.",
|
|
6
|
+
|
|
7
|
+
"locks": [
|
|
8
|
+
{
|
|
9
|
+
"id": "event-index-zero-based",
|
|
10
|
+
"source": "v2-core-design-locks.md §1",
|
|
11
|
+
"summary": "EventIndex is 0-based; first event has eventIndex=0",
|
|
12
|
+
"category": "storage"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "event-index-monotonic-contiguous",
|
|
16
|
+
"source": "v2-core-design-locks.md §1",
|
|
17
|
+
"summary": "EventIndex is monotonic and contiguous within and across segments",
|
|
18
|
+
"category": "storage"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "crash-safe-append",
|
|
22
|
+
"source": "v2-core-design-locks.md §1",
|
|
23
|
+
"summary": "Append uses temp+fsync+rename+fsync pattern for crash safety",
|
|
24
|
+
"category": "storage"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "single-writer-per-session",
|
|
28
|
+
"source": "v2-core-design-locks.md §1, §15",
|
|
29
|
+
"summary": "Enforce cross-process lock; fail fast with retryable error if busy",
|
|
30
|
+
"category": "storage"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"id": "orphan-segment-ignored",
|
|
34
|
+
"source": "v2-core-design-locks.md §1",
|
|
35
|
+
"summary": "Segment files without segment_closed in manifest are ignored (no salvage scanning)",
|
|
36
|
+
"category": "storage"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "segment-digest-verification",
|
|
40
|
+
"source": "v2-core-design-locks.md §1",
|
|
41
|
+
"summary": "Segment digest mismatch is corruption",
|
|
42
|
+
"category": "storage"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "manifest-index-monotonic-contiguous",
|
|
46
|
+
"source": "v2-core-design-locks.md §1",
|
|
47
|
+
"summary": "ManifestIndex is 0-based, monotonic, and contiguous",
|
|
48
|
+
"category": "storage"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "pin-after-close",
|
|
52
|
+
"source": "v2-core-design-locks.md §1",
|
|
53
|
+
"summary": "Snapshot pins appear after segment_closed in manifest",
|
|
54
|
+
"category": "storage"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"id": "crash-state-detection",
|
|
58
|
+
"source": "v2-core-design-locks.md §1",
|
|
59
|
+
"summary": "Crash between segment_closed and snapshot_pinned is detected as corruption",
|
|
60
|
+
"category": "storage"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"id": "append-plan-atomic",
|
|
64
|
+
"source": "v2-core-design-locks.md §1",
|
|
65
|
+
"summary": "AppendPlan is atomic: all events succeed or none",
|
|
66
|
+
"category": "storage"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"id": "dedupe-key-idempotent",
|
|
70
|
+
"source": "v2-core-design-locks.md §1",
|
|
71
|
+
"summary": "Same dedupeKey = idempotent no-op, return success based on existing event",
|
|
72
|
+
"category": "storage"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "dedupe-key-stable",
|
|
76
|
+
"source": "v2-core-design-locks.md §1",
|
|
77
|
+
"summary": "dedupeKey derived from stable identifiers only, not timestamps or eventId",
|
|
78
|
+
"category": "storage"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "event-kinds-closed-set",
|
|
82
|
+
"source": "v2-core-design-locks.md §1",
|
|
83
|
+
"summary": "Event kinds are a closed set (12 kinds defined)",
|
|
84
|
+
"category": "schema"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "branded-id-types",
|
|
88
|
+
"source": "v2-core-design-locks.md §1",
|
|
89
|
+
"summary": "Use distinct branded types for identifiers (SessionId, RunId, NodeId, etc.)",
|
|
90
|
+
"category": "types"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "snapshot-discriminated-union",
|
|
94
|
+
"source": "v2-core-design-locks.md §1",
|
|
95
|
+
"summary": "Snapshot payload uses discriminated union, no booleans-as-state",
|
|
96
|
+
"category": "schema"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "snapshot-pending-explicit",
|
|
100
|
+
"source": "v2-core-design-locks.md §1",
|
|
101
|
+
"summary": "Pending step presence is explicit: { kind: 'none' } | { kind: 'some', step }",
|
|
102
|
+
"category": "schema"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "snapshot-impossible-state-rejected",
|
|
106
|
+
"source": "v2-core-design-locks.md §1",
|
|
107
|
+
"summary": "Pending step instance key must not be in completed set",
|
|
108
|
+
"category": "schema"
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"id": "snapshot-loop-id-unique",
|
|
112
|
+
"source": "v2-core-design-locks.md §1",
|
|
113
|
+
"summary": "Loop stack cannot contain same loopId twice",
|
|
114
|
+
"category": "schema"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"id": "snapshot-completed-sorted",
|
|
118
|
+
"source": "v2-core-design-locks.md §1",
|
|
119
|
+
"summary": "Completed step instances sorted lexicographically by key",
|
|
120
|
+
"category": "schema"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "step-instance-key-delimiter-safe",
|
|
124
|
+
"source": "v2-core-design-locks.md §1",
|
|
125
|
+
"summary": "stepId and loopId use only [a-z0-9_-]+, disallow @, /, :",
|
|
126
|
+
"category": "schema"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "step-instance-key-format",
|
|
130
|
+
"source": "v2-core-design-locks.md §1",
|
|
131
|
+
"summary": "StepInstanceKey format: stepId or loopPath::stepId",
|
|
132
|
+
"category": "schema"
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
{
|
|
136
|
+
"id": "token-prefix-closed-set",
|
|
137
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
138
|
+
"summary": "Token prefix is closed set: st | ack | chk",
|
|
139
|
+
"category": "tokens"
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "token-kind-closed-set",
|
|
143
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
144
|
+
"summary": "Token kind is closed set: state | ack | checkpoint",
|
|
145
|
+
"category": "tokens"
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"id": "token-prefix-kind-match",
|
|
149
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
150
|
+
"summary": "Token prefix must match payload.tokenKind",
|
|
151
|
+
"category": "tokens"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": "token-signing-hmac-sha256",
|
|
155
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
156
|
+
"summary": "Signing algorithm is HMAC-SHA256",
|
|
157
|
+
"category": "tokens"
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"id": "token-signature-input-canonical-only",
|
|
161
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
162
|
+
"summary": "Signature input is canonical payload bytes only, no separators",
|
|
163
|
+
"category": "tokens"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"id": "token-signature-timing-safe",
|
|
167
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
168
|
+
"summary": "Signature comparison uses timing-safe equality",
|
|
169
|
+
"category": "tokens"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "keyring-two-keys",
|
|
173
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
174
|
+
"summary": "Keyring has exactly two keys: current and optional previous",
|
|
175
|
+
"category": "tokens"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "keyring-32-byte-entropy",
|
|
179
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
180
|
+
"summary": "Each key is 32 bytes, stored as base64url",
|
|
181
|
+
"category": "tokens"
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"id": "keyring-verification-order",
|
|
185
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
186
|
+
"summary": "Verification tries current key, then previous",
|
|
187
|
+
"category": "tokens"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "token-binary-wire-format",
|
|
191
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 1",
|
|
192
|
+
"summary": "Binary token wire format: <hrp>1<bech32m-data> where hrp is st|ack|chk",
|
|
193
|
+
"category": "tokens"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "token-binary-payload-layout",
|
|
197
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 3",
|
|
198
|
+
"summary": "Binary payload is 66 bytes, little-endian, fixed offsets",
|
|
199
|
+
"category": "tokens"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"id": "token-bech32m-encoding",
|
|
203
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 1",
|
|
204
|
+
"summary": "Bech32m encoding (BIP 350) with built-in checksum for corruption detection",
|
|
205
|
+
"category": "tokens"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "token-binary-roundtrip",
|
|
209
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 3",
|
|
210
|
+
"summary": "Binary pack/unpack must be deterministic roundtrip (pack → unpack → pack is idempotent)",
|
|
211
|
+
"category": "tokens"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"id": "binary-payload-deterministic",
|
|
215
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 3",
|
|
216
|
+
"summary": "Binary payload packing is deterministic (same input → same bytes, little-endian)",
|
|
217
|
+
"category": "tokens"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"id": "token-corruption-detection",
|
|
221
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 1",
|
|
222
|
+
"summary": "Bech32m checksum detects single-character corruption before signature verification",
|
|
223
|
+
"category": "tokens"
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "bech32m-checksum-validation",
|
|
227
|
+
"source": "v2-core-design-locks.md §1.2 Amendment 1",
|
|
228
|
+
"summary": "Bech32m checksum validated before payload unpacking",
|
|
229
|
+
"category": "tokens"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"id": "state-token-payload-fields",
|
|
233
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
234
|
+
"summary": "stateToken payload: tokenVersion, tokenKind, sessionId, runId, nodeId, workflowHashRef",
|
|
235
|
+
"category": "tokens"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"id": "ack-token-payload-fields",
|
|
239
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
240
|
+
"summary": "ackToken payload: tokenVersion, tokenKind, sessionId, runId, nodeId, attemptId",
|
|
241
|
+
"category": "tokens"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"id": "checkpoint-token-payload-fields",
|
|
245
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
246
|
+
"summary": "checkpointToken payload: tokenVersion, tokenKind, sessionId, runId, nodeId, attemptId",
|
|
247
|
+
"category": "tokens"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "ack-idempotency-key",
|
|
251
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
252
|
+
"summary": "Ack idempotency key is (sessionId, runId, nodeId, attemptId)",
|
|
253
|
+
"category": "tokens"
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "ack-replay-idempotent",
|
|
257
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
258
|
+
"summary": "Replaying same ackToken is idempotent no-op",
|
|
259
|
+
"category": "tokens"
|
|
260
|
+
},
|
|
261
|
+
|
|
262
|
+
{
|
|
263
|
+
"id": "rehydrate-pure-no-writes",
|
|
264
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
265
|
+
"summary": "continue_workflow without ackToken MUST NOT produce durable writes",
|
|
266
|
+
"category": "protocol"
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"id": "advance-append-capable",
|
|
270
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
271
|
+
"summary": "continue_workflow with ackToken is the only path that can append",
|
|
272
|
+
"category": "protocol"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"id": "replay-fact-returning",
|
|
276
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
277
|
+
"summary": "Replay returns durable recorded facts, does not re-run logic",
|
|
278
|
+
"category": "protocol"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "replay-fail-closed",
|
|
282
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
283
|
+
"summary": "Missing recorded outcome for idempotency key is invariant_violation",
|
|
284
|
+
"category": "protocol"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"id": "witness-required-for-append",
|
|
288
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
289
|
+
"summary": "Append APIs require WithHealthySessionLock capability witness",
|
|
290
|
+
"category": "protocol"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"id": "witness-scope-enforced",
|
|
294
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
295
|
+
"summary": "Witness used after scope exits must fail-fast before I/O",
|
|
296
|
+
"category": "protocol"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"id": "token-validation-errors-closed-set",
|
|
300
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
301
|
+
"summary": "Token validation errors are closed set (7 codes)",
|
|
302
|
+
"category": "errors"
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"id": "bundle-format-single-json",
|
|
306
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
307
|
+
"summary": "Export is single JSON bundle with versioned envelope",
|
|
308
|
+
"category": "bundle"
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"id": "bundle-tokens-not-portable",
|
|
312
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
313
|
+
"summary": "Tokens are not included in bundles; re-minted on import",
|
|
314
|
+
"category": "bundle"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"id": "bundle-integrity-jcs-sha256",
|
|
318
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
319
|
+
"summary": "Bundle integrity uses JCS canonical JSON + SHA-256",
|
|
320
|
+
"category": "bundle"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"id": "bundle-import-as-new",
|
|
324
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
325
|
+
"summary": "Import defaults to import-as-new on session ID collision",
|
|
326
|
+
"category": "bundle"
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
"id": "bundle-import-validates-first",
|
|
330
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
331
|
+
"summary": "Import validates integrity and ordering before storing",
|
|
332
|
+
"category": "bundle"
|
|
333
|
+
},
|
|
334
|
+
{
|
|
335
|
+
"id": "bundle-errors-closed-set",
|
|
336
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
337
|
+
"summary": "Bundle import errors are closed set (7 codes)",
|
|
338
|
+
"category": "bundle"
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
"id": "snapshot-content-addressed",
|
|
342
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
343
|
+
"summary": "SnapshotRef is content-addressed (sha256:<digest>)",
|
|
344
|
+
"category": "storage"
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
"id": "snapshot-rehydration-only",
|
|
348
|
+
"source": "v2-core-design-locks.md §1.3",
|
|
349
|
+
"summary": "Snapshot payloads are rehydration-only, no cached projections",
|
|
350
|
+
"category": "schema"
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"id": "runs-are-dags",
|
|
354
|
+
"source": "v2-core-design-locks.md §1.1",
|
|
355
|
+
"summary": "Run lineage is DAG of nodes; branch is projection concept",
|
|
356
|
+
"category": "model"
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"id": "preferred-tip-per-run",
|
|
360
|
+
"source": "v2-core-design-locks.md §2",
|
|
361
|
+
"summary": "Preferred tip is defined per run, not per session",
|
|
362
|
+
"category": "projection"
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
"id": "preferred-tip-algorithm",
|
|
366
|
+
"source": "v2-core-design-locks.md §2",
|
|
367
|
+
"summary": "Preferred tip: leaf nodes → max last-activity → tie-breakers",
|
|
368
|
+
"category": "projection"
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
"id": "preferred-tip-no-timestamps",
|
|
372
|
+
"source": "v2-core-design-locks.md §2",
|
|
373
|
+
"summary": "Never use wall-clock timestamps for tie-breaking",
|
|
374
|
+
"category": "projection"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"id": "user-only-dependency-closed-set",
|
|
378
|
+
"source": "v2-core-design-locks.md §3",
|
|
379
|
+
"summary": "UserOnlyDependencyReason is closed set (6 reasons)",
|
|
380
|
+
"category": "schema"
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
"id": "non-assumable-choice-closed-set",
|
|
384
|
+
"source": "v2-core-design-locks.md §3",
|
|
385
|
+
"summary": "NonAssumableChoiceKind is closed set (5 kinds)",
|
|
386
|
+
"category": "schema"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"id": "gaps-append-only-resolution",
|
|
390
|
+
"source": "v2-core-design-locks.md §3",
|
|
391
|
+
"summary": "Gaps are append-only; resolution via linkage not mutation",
|
|
392
|
+
"category": "model"
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"id": "reason-code-unified",
|
|
396
|
+
"source": "v2-core-design-locks.md §3",
|
|
397
|
+
"summary": "Single ReasonCode for both blockers and gaps; table-driven mapping",
|
|
398
|
+
"category": "schema"
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"id": "autonomy-closed-set",
|
|
402
|
+
"source": "v2-core-design-locks.md §4",
|
|
403
|
+
"summary": "autonomy: guided | full_auto_stop_on_user_deps | full_auto_never_stop",
|
|
404
|
+
"category": "schema"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"id": "risk-policy-closed-set",
|
|
408
|
+
"source": "v2-core-design-locks.md §4",
|
|
409
|
+
"summary": "riskPolicy: conservative | balanced | aggressive",
|
|
410
|
+
"category": "schema"
|
|
411
|
+
},
|
|
412
|
+
{
|
|
413
|
+
"id": "risk-policy-guardrails",
|
|
414
|
+
"source": "v2-core-design-locks.md §4",
|
|
415
|
+
"summary": "riskPolicy cannot bypass contracts/capabilities or suppress disclosure",
|
|
416
|
+
"category": "schema"
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"id": "preferences-node-attached",
|
|
420
|
+
"source": "v2-core-design-locks.md §4",
|
|
421
|
+
"summary": "Effective preference snapshots are node-attached (rewind-safe)",
|
|
422
|
+
"category": "model"
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
"id": "workflow-hash-jcs-sha256",
|
|
426
|
+
"source": "v2-core-design-locks.md §5, §11",
|
|
427
|
+
"summary": "workflowHash = sha256(JCS(compiledSnapshotV1))",
|
|
428
|
+
"category": "hashing"
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"id": "jcs-rfc-8785",
|
|
432
|
+
"source": "v2-core-design-locks.md §11",
|
|
433
|
+
"summary": "Use RFC 8785 (JCS) for canonical JSON serialization",
|
|
434
|
+
"category": "hashing"
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"id": "hash-format-sha256-hex",
|
|
438
|
+
"source": "v2-core-design-locks.md §11",
|
|
439
|
+
"summary": "Hash format is sha256:<64 lowercase hex>",
|
|
440
|
+
"category": "hashing"
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"id": "error-envelope-shape",
|
|
444
|
+
"source": "v2-core-design-locks.md §12",
|
|
445
|
+
"summary": "Error envelope: code, message, retry, details?",
|
|
446
|
+
"category": "errors"
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
"id": "error-no-throw-across-mcp",
|
|
450
|
+
"source": "v2-core-design-locks.md §12",
|
|
451
|
+
"summary": "Never throw errors across MCP boundaries",
|
|
452
|
+
"category": "errors"
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
"id": "error-retry-via-field",
|
|
456
|
+
"source": "v2-core-design-locks.md §12",
|
|
457
|
+
"summary": "Retry guidance via retry field, not message prose",
|
|
458
|
+
"category": "errors"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"id": "error-self-correcting",
|
|
462
|
+
"source": "v2-core-design-locks.md §12",
|
|
463
|
+
"summary": "Errors include suggestion for what to do next",
|
|
464
|
+
"category": "errors"
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
"id": "error-budget-details",
|
|
468
|
+
"source": "v2-core-design-locks.md §12",
|
|
469
|
+
"summary": "Budget errors include measured size, max size, method",
|
|
470
|
+
"category": "errors"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"id": "data-dir-workrail-owned",
|
|
474
|
+
"source": "v2-core-design-locks.md §13",
|
|
475
|
+
"summary": "Data directory is WorkRail-owned, not inside workflow dirs",
|
|
476
|
+
"category": "storage"
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
"id": "paths-relative-only",
|
|
480
|
+
"source": "v2-core-design-locks.md §13",
|
|
481
|
+
"summary": "All paths in manifests/bundles are relative, no absolute paths",
|
|
482
|
+
"category": "storage"
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"id": "schema-versioned",
|
|
486
|
+
"source": "v2-core-design-locks.md §14",
|
|
487
|
+
"summary": "Every durable artifact type is versioned",
|
|
488
|
+
"category": "schema"
|
|
489
|
+
},
|
|
490
|
+
{
|
|
491
|
+
"id": "schema-additive-within-version",
|
|
492
|
+
"source": "v2-core-design-locks.md §14",
|
|
493
|
+
"summary": "Adding optional fields OK; changing required fields requires version bump",
|
|
494
|
+
"category": "schema"
|
|
495
|
+
},
|
|
496
|
+
{
|
|
497
|
+
"id": "schema-unknown-version-fail-fast",
|
|
498
|
+
"source": "v2-core-design-locks.md §14",
|
|
499
|
+
"summary": "Unknown versions fail fast, do not guess",
|
|
500
|
+
"category": "schema"
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
"id": "schema-unknown-fields-ignored-conditionally",
|
|
504
|
+
"source": "v2-core-design-locks.md §14",
|
|
505
|
+
"summary": "Unknown fields ignored only when version known and fields optional",
|
|
506
|
+
"category": "schema"
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
"id": "context-no-echo",
|
|
510
|
+
"source": "v2-core-design-locks.md §16.3.1",
|
|
511
|
+
"summary": "Responses MUST NOT echo caller's context back",
|
|
512
|
+
"category": "protocol"
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
"id": "context-not-durable",
|
|
516
|
+
"source": "v2-core-design-locks.md §16.3.1 (REVISED in §18.2)",
|
|
517
|
+
"summary": "context IS persisted as durable truth via run-scoped context_set events (lock revised in Slice 4a S8)",
|
|
518
|
+
"category": "protocol"
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"id": "context-json-only",
|
|
522
|
+
"source": "v2-core-design-locks.md §16.3.1",
|
|
523
|
+
"summary": "context must be JSON-serializable",
|
|
524
|
+
"category": "protocol"
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
"id": "context-budget-256kb",
|
|
528
|
+
"source": "v2-core-design-locks.md §16.3.1",
|
|
529
|
+
"summary": "context size max 256KB JCS UTF-8 bytes, fail fast if exceeded",
|
|
530
|
+
"category": "protocol"
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
"id": "session-health-closed-set",
|
|
534
|
+
"source": "v2-core-design-locks.md §10",
|
|
535
|
+
"summary": "SessionHealth: healthy | corrupt_tail | corrupt_head | unknown_version",
|
|
536
|
+
"category": "schema"
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
"id": "execution-gated-by-health",
|
|
540
|
+
"source": "v2-core-design-locks.md §10",
|
|
541
|
+
"summary": "Execution tools require SessionHealth=healthy",
|
|
542
|
+
"category": "protocol"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"id": "salvage-read-only",
|
|
546
|
+
"source": "v2-core-design-locks.md §10",
|
|
547
|
+
"summary": "Salvage mode is read-only, cannot advance",
|
|
548
|
+
"category": "protocol"
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"id": "durable-core-no-node-imports",
|
|
552
|
+
"source": "v2-core-design-locks.md §17",
|
|
553
|
+
"summary": "durable-core has no node:* imports",
|
|
554
|
+
"category": "architecture"
|
|
555
|
+
},
|
|
556
|
+
{
|
|
557
|
+
"id": "durable-core-no-buffer",
|
|
558
|
+
"source": "v2-core-design-locks.md §17",
|
|
559
|
+
"summary": "durable-core has no Buffer usage",
|
|
560
|
+
"category": "architecture"
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
"id": "ports-interfaces-only",
|
|
564
|
+
"source": "v2-core-design-locks.md §17",
|
|
565
|
+
"summary": "ports/** are interfaces only, no implementation",
|
|
566
|
+
"category": "architecture"
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
"id": "infra-only-node-io",
|
|
570
|
+
"source": "v2-core-design-locks.md §17",
|
|
571
|
+
"summary": "infra/** is the only place Node I/O exists",
|
|
572
|
+
"category": "architecture"
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"id": "projection-cache-rebuildable",
|
|
576
|
+
"source": "v2-core-design-locks.md §10",
|
|
577
|
+
"summary": "Projection cache is derived/rebuildable, safe to delete",
|
|
578
|
+
"category": "storage"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"id": "blocker-codes-closed-set",
|
|
582
|
+
"source": "v2-core-design-locks.md §16.3",
|
|
583
|
+
"summary": "Blocker codes are closed set (7 codes)",
|
|
584
|
+
"category": "schema"
|
|
585
|
+
},
|
|
586
|
+
{
|
|
587
|
+
"id": "run-status-closed-set",
|
|
588
|
+
"source": "v2-core-design-locks.md §16.3",
|
|
589
|
+
"summary": "Run status: in_progress | blocked | complete | complete_with_gaps",
|
|
590
|
+
"category": "schema"
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
"id": "edge-kind-closed-set",
|
|
594
|
+
"source": "v2-core-design-locks.md §16.3",
|
|
595
|
+
"summary": "Edge kind: acked_step | checkpoint",
|
|
596
|
+
"category": "schema"
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"id": "edge-cause-closed-set",
|
|
600
|
+
"source": "v2-core-design-locks.md §16.3",
|
|
601
|
+
"summary": "Edge cause.kind: idempotent_replay | intentional_fork | non_tip_advance | checkpoint_created",
|
|
602
|
+
"category": "schema"
|
|
603
|
+
},
|
|
604
|
+
{
|
|
605
|
+
"id": "non-tip-advance-creates-fork",
|
|
606
|
+
"source": "v2-core-design-locks.md §1.2",
|
|
607
|
+
"summary": "Non-tip state token creates edge with cause.kind=non_tip_advance",
|
|
608
|
+
"category": "protocol"
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
"id": "output-channel-closed-set",
|
|
612
|
+
"source": "v2-core-design-locks.md §1",
|
|
613
|
+
"summary": "Output channel: recap | artifact",
|
|
614
|
+
"category": "schema"
|
|
615
|
+
},
|
|
616
|
+
{
|
|
617
|
+
"id": "output-ordering-deterministic",
|
|
618
|
+
"source": "v2-core-design-locks.md §1",
|
|
619
|
+
"summary": "Outputs ordered: recap first, then artifacts by (sha256, contentType)",
|
|
620
|
+
"category": "protocol"
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
"id": "notes-markdown-budget",
|
|
624
|
+
"source": "v2-core-design-locks.md §1",
|
|
625
|
+
"summary": "notesMarkdown max 4096 bytes, truncate with marker",
|
|
626
|
+
"category": "schema"
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"id": "truncation-marker-format",
|
|
630
|
+
"source": "v2-core-design-locks.md §1",
|
|
631
|
+
"summary": "Truncation marker is exactly: \\n\\n[TRUNCATED]",
|
|
632
|
+
"category": "schema"
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
"id": "decision-trace-bounded",
|
|
636
|
+
"source": "v2-core-design-locks.md §1",
|
|
637
|
+
"summary": "Decision trace: max 25 entries, 512 bytes/entry, 8192 bytes total",
|
|
638
|
+
"category": "schema"
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
"id": "blocker-budget",
|
|
642
|
+
"source": "v2-core-design-locks.md §1",
|
|
643
|
+
"summary": "Max 10 blockers, 512 bytes/message, 1024 bytes/suggestedFix",
|
|
644
|
+
"category": "schema"
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
"id": "type-escapes-quarantined",
|
|
648
|
+
"source": "v2-architectural-hardening-final.md §7 Workstream I (Rule N3)",
|
|
649
|
+
"summary": "No `as any` in v2 code except explicitly quarantined paths",
|
|
650
|
+
"category": "types"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"id": "no-throws-across-boundaries",
|
|
654
|
+
"source": "v2-architectural-hardening-final.md §2.0 Result Contract",
|
|
655
|
+
"summary": "Adapters may throw internally, but ports return Result/ResultAsync; no exceptions cross port boundaries",
|
|
656
|
+
"category": "errors"
|
|
657
|
+
},
|
|
658
|
+
{
|
|
659
|
+
"id": "errors-as-data",
|
|
660
|
+
"source": "v2-architectural-hardening-final.md §2 Philosophy",
|
|
661
|
+
"summary": "Represent failure as Result/ResultAsync values, not exceptions as control flow",
|
|
662
|
+
"category": "errors"
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
"id": "illegal-states-unrepresentable",
|
|
666
|
+
"source": "v2-architectural-hardening-final.md §2 Philosophy",
|
|
667
|
+
"summary": "Model bounded/validated states as value objects/ADTs; prevent construction of invalid states",
|
|
668
|
+
"category": "schema"
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
"id": "budget-enforcement",
|
|
672
|
+
"source": "v2-architectural-hardening-final.md §2.1 Schema Contract",
|
|
673
|
+
"summary": "All budget constants are enforced via schema refinements and value object constructors",
|
|
674
|
+
"category": "schema"
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"id": "determinism",
|
|
678
|
+
"source": "v2-architectural-hardening-final.md §2.0 Purity Contract",
|
|
679
|
+
"summary": "Same inputs produce same outputs; no side effects, stable canonicalization, no timing dependencies",
|
|
680
|
+
"category": "hashing"
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"id": "schema-modules-load-safe",
|
|
684
|
+
"source": "v2-architectural-hardening-final.md §7 Workstream D (Rule N5)",
|
|
685
|
+
"summary": "Schema modules must not throw at import/construct time; smoke test verifies load safety",
|
|
686
|
+
"category": "schema"
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
"id": "test-fakes-usage",
|
|
690
|
+
"source": "v2-architectural-hardening-final.md §2.0.1 Pattern P4",
|
|
691
|
+
"summary": "Tests use centralized in-memory fakes for ports, not mocks that mirror implementation",
|
|
692
|
+
"category": "architecture"
|
|
693
|
+
},
|
|
694
|
+
|
|
695
|
+
{
|
|
696
|
+
"id": "parallel-stat-correctness",
|
|
697
|
+
"source": "perf-parallel-io",
|
|
698
|
+
"summary": "readdirWithMtime issues stat calls in parallel and returns correct name+mtimeMs for all entries; entries where stat fails are skipped gracefully",
|
|
699
|
+
"category": "storage"
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"id": "parallel-segment-order",
|
|
703
|
+
"source": "perf-parallel-io",
|
|
704
|
+
"summary": "loadSegmentsParallel reads segment files concurrently but concatenates results in manifest index order to preserve the eventIndex ordering invariant",
|
|
705
|
+
"category": "storage"
|
|
706
|
+
},
|
|
707
|
+
{
|
|
708
|
+
"id": "single-manifest-fsync",
|
|
709
|
+
"source": "perf-parallel-io",
|
|
710
|
+
"summary": "segment_closed and snapshot_pinned records are written in a single appendManifestRecords call, reducing fsyncs from 2 to 1 when snapshot pins are present",
|
|
711
|
+
"category": "storage"
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"id": "mkdirp-once-per-session",
|
|
715
|
+
"source": "perf-parallel-io",
|
|
716
|
+
"summary": "mkdirp for the events directory is called at most once per session per process lifetime; subsequent appends skip the syscall via a module-level cache",
|
|
717
|
+
"category": "storage"
|
|
718
|
+
}
|
|
719
|
+
],
|
|
720
|
+
|
|
721
|
+
"categories": {
|
|
722
|
+
"storage": "Append-only truth substrate invariants",
|
|
723
|
+
"schema": "Data shape and closed set invariants",
|
|
724
|
+
"tokens": "Token format and signing invariants",
|
|
725
|
+
"protocol": "MCP protocol behavior invariants",
|
|
726
|
+
"hashing": "Canonicalization and hashing invariants",
|
|
727
|
+
"errors": "Error handling invariants",
|
|
728
|
+
"bundle": "Export/import bundle invariants",
|
|
729
|
+
"model": "Domain model invariants",
|
|
730
|
+
"projection": "Projection behavior invariants",
|
|
731
|
+
"types": "Type system invariants",
|
|
732
|
+
"architecture": "Layer boundary invariants"
|
|
733
|
+
}
|
|
734
|
+
}
|