astp-docs-server 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. astp_docs_server/__init__.py +12 -0
  2. astp_docs_server/__main__.py +8 -0
  3. astp_docs_server/atlas_manifest.py +108 -0
  4. astp_docs_server/corpus/open/CHANGELOG.md +568 -0
  5. astp_docs_server/corpus/open/CONFORMANCE-BFM.md +430 -0
  6. astp_docs_server/corpus/open/CONFORMANCE-CONTEXT.md +332 -0
  7. astp_docs_server/corpus/open/CONFORMANCE-CROSS-EPISODE-LINKING.md +258 -0
  8. astp_docs_server/corpus/open/CONFORMANCE-LAYER3.md +272 -0
  9. astp_docs_server/corpus/open/CONFORMANCE-REPRODUCIBILITY.md +219 -0
  10. astp_docs_server/corpus/open/CONFORMANCE-TRUST.md +639 -0
  11. astp_docs_server/corpus/open/GLOSSARY.md +661 -0
  12. astp_docs_server/corpus/open/GOVERNANCE.md +43 -0
  13. astp_docs_server/corpus/open/IMPLEMENTATION-CONTEXT.md +121 -0
  14. astp_docs_server/corpus/open/IMPLEMENTATION-PHASE3.md +732 -0
  15. astp_docs_server/corpus/open/LICENSE.txt +202 -0
  16. astp_docs_server/corpus/open/NOTICE +60 -0
  17. astp_docs_server/corpus/open/PATENTS.md +325 -0
  18. astp_docs_server/corpus/open/PROTOCOL-CONFORMANCE.md +470 -0
  19. astp_docs_server/corpus/open/RATIFICATION-5.0.0.md +56 -0
  20. astp_docs_server/corpus/open/RATIFICATION-6.0.0.md +71 -0
  21. astp_docs_server/corpus/open/RATIFICATION-PATENTS-1.0.0.md +116 -0
  22. astp_docs_server/corpus/open/RATIFICATION-PROTOCOL-CONFORMANCE-1.0.0.md +145 -0
  23. astp_docs_server/corpus/open/RATIFICATION-SPEC-6.0.2.md +136 -0
  24. astp_docs_server/corpus/open/README.md +230 -0
  25. astp_docs_server/corpus/open/SPEC.md +3220 -0
  26. astp_docs_server/corpus/open/VERSIONING.md +105 -0
  27. astp_docs_server/corpus/open/vectors/5.0.0/seal-constructions.json +402 -0
  28. astp_docs_server/corpus/open/vectors/6.0.0/context-commitment.json +353 -0
  29. astp_docs_server/corpus/open/vendor_manifest.json +31 -0
  30. astp_docs_server/mcp_server.py +145 -0
  31. astp_docs_server/open_corpus.py +235 -0
  32. astp_docs_server/vendor_manifest.py +124 -0
  33. astp_docs_server/web/__init__.py +7 -0
  34. astp_docs_server/web/__main__.py +5 -0
  35. astp_docs_server/web/answerer.py +307 -0
  36. astp_docs_server/web/app.py +151 -0
  37. astp_docs_server-0.1.0.dist-info/METADATA +107 -0
  38. astp_docs_server-0.1.0.dist-info/RECORD +42 -0
  39. astp_docs_server-0.1.0.dist-info/WHEEL +4 -0
  40. astp_docs_server-0.1.0.dist-info/entry_points.txt +3 -0
  41. astp_docs_server-0.1.0.dist-info/licenses/LICENSE.txt +202 -0
  42. astp_docs_server-0.1.0.dist-info/licenses/NOTICE +72 -0
@@ -0,0 +1,272 @@
1
+ # ASTP — Layer 3 (Workflow & Execution DAG) Conformance Test Vectors
2
+
3
+ **Version:** 1.1.0
4
+ **Status:** Stable
5
+ **Authors:** Scorched Earth Labs
6
+ **Date:** 2026-09-19
7
+ **Applies To:** SPEC.md §21 (Layer 3 — Workflow & Execution DAG), 5.1.0 (SPEC §21; unchanged by 5.0.0 — see the note in §1)
8
+
9
+ ---
10
+
11
+ ## 1. Overview
12
+
13
+ > **SPEC 5.0.0 / 5.1.0 note.** Layer 3 is unchanged by 5.0.0: its byte form is governed by SPEC §21 Part III §8 and is deliberately outside the §5.1 single-encoding statement (§5.1 says so). What did change around it: the audit records Layer 3 events write are the version 2 audit record of SPEC §8; and, under the 5.1.0 adapter failure contract, a Layer 3 writer that cannot complete raises rather than returning a default.
14
+
15
+ This document specifies the conformance test vectors for **Layer 3 — the Workflow & Execution DAG** of ASTP (the AI State Tree Protocol). A conforming implementation MUST pass all vectors marked **REQUIRED**. Vectors marked **RECOMMENDED** test behaviors that conforming implementations SHOULD support.
16
+
17
+ Layer 3 is the forensic provenance layer: `WorkflowDeclaration`, `ExecutionNode`, and `SkillInvocation` record *how* an Episode's cognition was carried out. Its defining property is **cryptographic isolation from the Merkle Spine** — Layer 3 nodes reference Layers 1/2 by `node_id` only and MUST NOT participate in Spine hashing (Invariant L3-I1). This isolation is a first-class conformance concern; see the `L3-` vectors of §6.
18
+
19
+ These vectors are **cross-implementation-consistency** vectors: they assert canonical *field inclusion and ordering* and behavioral invariants, not hardcoded golden-hash values. Per SPEC §21 §8, the hash **byte-form is left open at the protocol layer** — each implementation chooses a serialization (SHA3-256 length-prefixed concatenation, SHA-256 canonical JSON, or other) and MUST be internally consistent. Two conforming implementations that adopt the *same* documented serialization MUST produce identical bytes for identical inputs; two implementations that adopt *different* serializations legitimately produce different hashes. What every conforming implementation MUST agree on is **which fields contribute, in what order** (W-L3-2).
20
+
21
+ Vectors are organized to match the reference deployment's adapter guide, `IMPLEMENTATION-LAYER3.md` (which lives with that adapter):
22
+
23
+ | Scope | Description | Vector Prefix |
24
+ |-------|-------------|---------------|
25
+ | WorkflowDeclaration | Schema, hash preimage, mutation surface, state machine | `WF-` |
26
+ | ExecutionNode | Schema, hash preimage, terminal-on-write, error consistency | `EX-` |
27
+ | SkillInvocation | Schema, hash preimage, `registry_id` deferral | `SK-` |
28
+ | Sole-writer (CIA) | G-36 sole-writer principle + audit attribution | `CIA-` |
29
+ | Layer invariants | Spine isolation, immutability, retry-by-new-node | `L3-` |
30
+
31
+ All hex values lowercase. All string fields UTF-8.
32
+
33
+ ---
34
+
35
+ ## 2. WorkflowDeclaration Vectors (§21 §4)
36
+
37
+ ### 2.1 Hash Canonicalization
38
+
39
+ **WF-001** — `WorkflowDeclaration` content hash — field order
40
+ - **Class:** REQUIRED
41
+ - **Spec Reference:** §21 §4, §21 §8 (W-L3-1, W-L3-2)
42
+ - **Description:** `compute_workflow_declaration_content_hash()` MUST canonicalize, in this exact order: `node_id`, `node_type`, `schema_version`, `episode_id`, `intention_id`, `mandate_id`, `workflow_name`, `workflow_version`, `declared_by`, `declared_at`, `input_context`, `expected_outputs`, `timeout_ms`. It MUST exclude `status`, `status_updated_at`, `error_detail`, and `content_hash` itself.
43
+ - **Verification Protocol:** Cross-implementation consistency check. Two implementations sharing a documented serialization MUST produce identical bytes for the same input tuple; every conforming implementation MUST agree on the field set and order.
44
+ - **Failure Condition:** Any excluded field contributes to the hash; any listed field is missing or reordered; wrong integer/UUID/datetime encoding.
45
+
46
+ **WF-002** — Nullable provenance fields are hash-included
47
+ - **Class:** REQUIRED
48
+ - **Spec Reference:** §21 §4 (hash preimage note)
49
+ - **Description:** `intention_id` and `mandate_id` MUST contribute to the preimage even when null. A `WorkflowDeclaration` with `mandate_id = null` MUST produce a different `content_hash` than one with a non-null `mandate_id`, all other fields equal. Nullability is part of the immutable record.
50
+ - **Failure Condition:** A null `mandate_id` (or `intention_id`) hashes identically to the field's absence, or to a distinct non-null value.
51
+
52
+ **WF-003** — Mutation surface is hash-stable
53
+ - **Class:** REQUIRED
54
+ - **Spec Reference:** §21 §4, §21 §9 (L3-I4)
55
+ - **Description:** Mutating any of `status`, `status_updated_at`, `error_detail` and recomputing MUST yield the **same** `content_hash`. The mutation surface is excluded from the preimage precisely so that lawful terminal-state transitions never alter the declaration's content identity.
56
+ - **Verification Protocol:** Stamp a declaration; mutate the trio; re-stamp; assert equal hashes.
57
+ - **Failure Condition:** A permitted mutation changes the content hash.
58
+
59
+ ### 2.2 State Machine
60
+
61
+ **WF-004** — Status transition legality
62
+ - **Class:** REQUIRED
63
+ - **Spec Reference:** §21 §10
64
+ - **Description:** `enforce_workflow_status_transition()` MUST permit exactly: `DECLARED → {IN_PROGRESS, INTERRUPTED}` and `IN_PROGRESS → {COMPLETED, FAILED, INTERRUPTED}`. `COMPLETED`, `FAILED`, and `INTERRUPTED` are terminal — no outbound transition is permitted. Illegal transitions MUST raise, not silently no-op.
65
+ - **Verification Protocol:** For each (from, to) pair, assert permitted pairs succeed and all others raise `Layer3GovernanceError`.
66
+ - **Failure Condition:** A transition out of a terminal state is admitted, or a non-listed transition succeeds.
67
+
68
+ **WF-005** — Auto-transition on first execution write
69
+ - **Class:** REQUIRED
70
+ - **Spec Reference:** §21 §10
71
+ - **Description:** The first `ExecutionNode` write for a given `workflow_id` MUST atomically transition that workflow's `status` from `DECLARED` to `IN_PROGRESS`. A workspace whose `WorkflowDeclaration.status == DECLARED` while ExecutionNodes for it exist is non-conforming.
72
+ - **Failure Condition:** A workflow remains `DECLARED` after an ExecutionNode is recorded against it.
73
+
74
+ **WF-006** — Two distinct `INTERRUPTED` states are distinguishable
75
+ - **Class:** RECOMMENDED
76
+ - **Spec Reference:** §21 §10
77
+ - **Description:** A conforming verifier SHOULD distinguish `status == INTERRUPTED` with **zero** ExecutionNodes ("declared, never started") from `status == INTERRUPTED` with **one or more** ExecutionNodes ("started, terminated mid-execution"). Neither is a schema violation; both are valid forensic states.
78
+
79
+ ---
80
+
81
+ ## 3. ExecutionNode Vectors (§21 §5)
82
+
83
+ ### 3.1 Hash Canonicalization
84
+
85
+ **EX-001** — `ExecutionNode` content hash — field order
86
+ - **Class:** REQUIRED
87
+ - **Spec Reference:** §21 §5, §21 §8 (W-L3-1, W-L3-2)
88
+ - **Description:** `compute_execution_node_content_hash()` MUST canonicalize, in this exact order: `node_id`, `node_type`, `schema_version`, `workflow_id`, `episode_id`, `sequence_index`, `step_name`, `agent_id`, `executed_at`, `duration_ms`, `input_state`, `output_state`, `status`, `error_detail`, `error_type`. It MUST exclude **only** `content_hash` itself.
89
+ - **Verification Protocol:** Cross-implementation consistency check; field set + order agreement.
90
+ - **Failure Condition:** Any field except `content_hash` is excluded; wrong order.
91
+
92
+ **EX-002** — `status` is hash-included
93
+ - **Class:** REQUIRED
94
+ - **Spec Reference:** §21 §5 (hash preimage note)
95
+ - **Description:** Unlike `WorkflowDeclaration`, `ExecutionNode.status` MUST contribute to the content hash. Because the node is terminal-on-write, its status is a permanent forensic fact — two ExecutionNodes identical but for `status` MUST hash differently.
96
+ - **Failure Condition:** `status` is excluded from the ExecutionNode preimage, or two nodes differing only in `status` hash identically.
97
+
98
+ ### 3.2 Error Consistency
99
+
100
+ **EX-003** — Error field / status coupling
101
+ - **Class:** REQUIRED
102
+ - **Spec Reference:** §21 §5
103
+ - **Description:** `enforce_execution_error_consistency()` MUST reject a `COMPLETED` node with non-null `error_type` or non-null `error_detail`, and MUST reject a `FAILED`/`INTERRUPTED` node with null `error_type`. (`error_detail` on a failed node is RECOMMENDED, not enforced.) `error_type ∈ {AGENT_ERROR, TIMEOUT, DEPENDENCY_FAILURE, SKILL_ERROR, UNKNOWN}`.
104
+ - **Failure Condition:** A `COMPLETED` node carries error fields, or a failed/interrupted node omits `error_type`.
105
+
106
+ ---
107
+
108
+ ## 4. SkillInvocation Vectors (§21 §6)
109
+
110
+ ### 4.1 Hash Canonicalization
111
+
112
+ **SK-001** — `SkillInvocation` content hash — field order
113
+ - **Class:** REQUIRED
114
+ - **Spec Reference:** §21 §6, §21 §8 (W-L3-1, W-L3-2)
115
+ - **Description:** `compute_skill_invocation_content_hash()` MUST canonicalize, in this exact order: `node_id`, `node_type`, `schema_version`, `execution_node_id`, `workflow_id`, `episode_id`, `skill_id`, `skill_source`, `skill_version`, `invoked_by`, `invoked_at`, `duration_ms`, `input_parameters`, `output_result`, `status`, `error_detail`. It MUST exclude `registry_id` and `content_hash` itself.
116
+ - **Verification Protocol:** Cross-implementation consistency check; field set + order agreement.
117
+ - **Failure Condition:** `registry_id` contributes to the hash; any listed field is missing or reordered.
118
+
119
+ **SK-002** — `registry_id` backfill is hash-stable
120
+ - **Class:** REQUIRED
121
+ - **Spec Reference:** §21 §6, §21 §13.2
122
+ - **Description:** Populating `registry_id` on an existing `SkillInvocation` (a future Skill Registry backfill) MUST NOT change its `content_hash`. `registry_id` is the only Layer 3 field excluded from a content hash for a reason other than mutation — a deliberate forward-compatibility provision.
123
+ - **Verification Protocol:** Stamp with `registry_id = null`; populate `registry_id`; re-stamp; assert equal hashes.
124
+ - **Failure Condition:** Setting `registry_id` alters the content hash.
125
+
126
+ **SK-003** — `registry_id` left null pending Skill Registry
127
+ - **Class:** REQUIRED
128
+ - **Spec Reference:** §21 §13.2
129
+ - **Description:** A conforming implementation MUST leave `SkillInvocation.registry_id` null until the future Skill Registry amendment defines its semantics.
130
+ - **Failure Condition:** An implementation populates `registry_id` under its own ad-hoc semantics.
131
+
132
+ ### 4.2 Open Behavioral Surface
133
+
134
+ **SK-004** — Skill taxonomy is recorded, not validated
135
+ - **Class:** REQUIRED
136
+ - **Spec Reference:** §21 §6, §21 §12 (audit-the-decision)
137
+ - **Description:** `skill_id` and `skill_source` are open, implementation-defined strings. The protocol does not constrain their vocabulary; it commits only that whatever value the implementation chose is recorded immutably and contributes to `content_hash`. An implementation MUST document its `skill_source` vocabulary in its `ConformanceDeclaration`.
138
+ - **Failure Condition:** An implementation drops `skill_id`/`skill_source` from the hash, or claims a fixed protocol-level skill vocabulary.
139
+
140
+ ---
141
+
142
+ ## 5. Sole-Writer / CIA Vectors (§21 §3, G-36)
143
+
144
+ **CIA-001** — Sole-writer enforcement (G-36)
145
+ - **Class:** REQUIRED
146
+ - **Spec Reference:** §21 §3 (L3-I2), G-36, §21 §12
147
+ - **Description:** For each Layer 3 node type in a workspace, exactly one entity — the Cognitive Implementation Authority — MUST be authorized to issue creation writes. Writes from any other principal MUST be rejected at the wire tier (or, under the audit-detection enforcement style, admitted but flagged `WIRE_VIOLATION`, which conforming verifiers reject). The `ConformanceDeclaration` MUST name the CIA per node type and identify the enforcement mechanism.
148
+ - **Verification Protocol:** Attempt a Layer 3 creation write from a non-CIA principal; assert rejection (or `WIRE_VIOLATION` flag). Confirm the `ConformanceDeclaration` names a unique CIA per node type.
149
+ - **Failure Condition:** A non-CIA principal's Layer 3 write is admitted and unflagged; or the `ConformanceDeclaration` omits/duplicates the CIA for a node type.
150
+
151
+ **CIA-002** — `cia_identifier` mandatory in every audit event
152
+ - **Class:** REQUIRED
153
+ - **Spec Reference:** §21 §11
154
+ - **Description:** Every `WORKFLOW_DECLARED`, `EXECUTION_RECORDED`, `SKILL_INVOKED`, and `WORKFLOW_CLOSED` audit event MUST carry a non-null `cia_identifier` naming the principal that performed the write. This is what makes sole-writer verifiable: a verifier walking the chain confirms every L3 write came from the declared CIA.
155
+ - **Failure Condition:** Any Layer 3 audit event lacks `cia_identifier`.
156
+
157
+ **CIA-003** — Audit event emission before durability (W-L3-4)
158
+ - **Class:** REQUIRED
159
+ - **Spec Reference:** §21 §11 (W-L3-4)
160
+ - **Description:** Each Layer 3 node creation and each `WorkflowDeclaration.status` mutation MUST emit its corresponding audit event into the append-only, hash-chained log **before** the operation is considered durable. Each record hash-chains via `prev_audit_hash`; the chain-key dimension is a documented implementation choice (the reference implementation in Ignis OS — Scorched Earth Labs' agent runtime, the first consumer of this protocol — uses `episode_id`).
161
+ - **Failure Condition:** A durable Layer 3 write with no preceding audit event, or an audit chain whose recomputed `prev_audit_hash` linkage is broken.
162
+
163
+ **CIA-004** — Audit event required-field completeness
164
+ - **Class:** REQUIRED
165
+ - **Spec Reference:** §21 §11
166
+ - **Description:** Each of the four audit event types MUST carry its §11 required fields: `WORKFLOW_DECLARED` (`workflow_id`, `episode_id`, `intention_id?`, `mandate_id?`, `declared_by`, `declared_at`, `content_hash`, `cia_identifier`); `EXECUTION_RECORDED` (`execution_node_id`, `workflow_id`, `episode_id`, `sequence_index`, `agent_id`, `status`, `executed_at`, `content_hash`, `cia_identifier`); `SKILL_INVOKED` (`skill_invocation_id`, `execution_node_id`, `workflow_id`, `episode_id`, `skill_id`, `skill_source`, `invoked_by`, `invoked_at`, `status`, `content_hash`, `cia_identifier`); `WORKFLOW_CLOSED` (`workflow_id`, `final_status`, `status_updated_at`, `error_detail?`, `cia_identifier`).
167
+ - **Failure Condition:** Any required field is absent from its event.
168
+
169
+ ---
170
+
171
+ ## 6. Layer-Invariant Vectors (§21 §2, §9)
172
+
173
+ **L3-001** — Spine isolation (L3-I1) — first-class conformance
174
+ - **Class:** REQUIRED
175
+ - **Spec Reference:** §21 §2 (L3-I1)
176
+ - **Description:** No field of any Layer 3 node or edge may appear in the preimage of any Layer 1 or Layer 2 hash, and no Layer 1/2 node may embed a Layer 3 `node_id` by value in its hash preimage. **Layer 3 is cryptographically isolated from the Spine — Layer 3 data MUST NEVER enter Spine hash computation.** All Layer 3 → Layer 1/2 references are by `node_id` (UUID) only.
177
+ - **Verification Protocol:** Freeze a Spine fingerprint; perform arbitrary Layer 3 writes; recompute the Spine fingerprint and assert it is byte-identical. Independently, inspect every Layer 1/2 hash preimage and confirm no Layer 3 `node_id` appears.
178
+ - **Failure Condition:** Any Layer 3 write alters any Spine hash; any Spine/Layer-2 preimage contains a Layer 3 field or `node_id`. This is a cryptographic-chain-corrupting defect.
179
+
180
+ **L3-002** — Layer 3 absence/corruption does not invalidate Layers 1/2
181
+ - **Class:** REQUIRED
182
+ - **Spec Reference:** §21 §2 (consequence 2)
183
+ - **Description:** A workspace whose Layer 3 is entirely absent or entirely corrupt MUST remain a valid ASTP workspace at Layers 1 and 2. Layer 3 is a strict augmentation, never a dependency.
184
+ - **Verification Protocol:** Delete/corrupt all Layer 3 records; assert Layer 1 and Layer 2 verification still pass.
185
+ - **Failure Condition:** Layer 1/2 verification depends on Layer 3 state.
186
+
187
+ **L3-003** — Independent Layer 3 verification chain
188
+ - **Class:** REQUIRED
189
+ - **Spec Reference:** §21 §2 (consequence 3), §21 §11
190
+ - **Description:** Layer 3 integrity MUST be verifiable against its own audit chain (§11), independently of walking the Spine. Layer 3 verification confirms execution-record integrity; Layer 1 verification confirms cognitive integrity; the two are independent.
191
+ - **Failure Condition:** Layer 3 verification requires Spine traversal, or vice versa.
192
+
193
+ **L3-004** — Terminal-on-write immutability (L3-I3)
194
+ - **Class:** REQUIRED
195
+ - **Spec Reference:** §21 §9 (L3-I3)
196
+ - **Description:** `ExecutionNode` and `SkillInvocation` are fully immutable after creation. Every mutation attempt on any field of either type MUST be rejected. Neither type has a write-after-create path.
197
+ - **Failure Condition:** Any field of a created `ExecutionNode` or `SkillInvocation` is successfully mutated.
198
+
199
+ **L3-005** — WorkflowDeclaration mutation surface (L3-I4)
200
+ - **Class:** REQUIRED
201
+ - **Spec Reference:** §21 §9 (L3-I4)
202
+ - **Description:** The only mutable fields on `WorkflowDeclaration` are `status`, `status_updated_at`, and `error_detail`. Any attempt to mutate any other field MUST be rejected as a wire-tier violation; the permitted three are further constrained by the §10 state machine.
203
+ - **Failure Condition:** Any field outside the permitted trio is mutated.
204
+
205
+ **L3-006** — Retry-by-new-node (L3-I5)
206
+ - **Class:** REQUIRED
207
+ - **Spec Reference:** §21 §9 (L3-I5)
208
+ - **Description:** A retried execution step MUST produce a **new** `ExecutionNode` with a new `node_id` and a new `sequence_index`; the prior (failed) node MUST be preserved unchanged. Implementations MUST NOT provide a "retry" surface that mutates a prior node.
209
+ - **Verification Protocol:** Record a `FAILED` step; retry; assert two distinct nodes exist, the original unchanged, sharing `step_name` but differing in `node_id` and `sequence_index`.
210
+ - **Failure Condition:** A retry mutates the prior ExecutionNode, or reuses its `node_id`/`sequence_index`.
211
+
212
+ **L3-007** — Seven edge names present and correctly directed
213
+ - **Class:** REQUIRED
214
+ - **Spec Reference:** §21 §7
215
+ - **Description:** The implementation MUST expose query paths equivalent to the seven edges: `DECLARED_WITHIN` (Workflow→Episode, REQUIRED), `SERVES_INTENTION` (Workflow→Intention, OPTIONAL), `SPAWNED_BY_MANDATE` (Workflow→Mandate, OPTIONAL), `EXECUTES_WITHIN` (Execution→Workflow, REQUIRED), `PRECEDES` (Execution→Execution, OPTIONAL; absent on first step), `INVOKED_WITHIN` (Skill→Execution, REQUIRED), `SKILL_PRECEDES` (Skill→Skill, OPTIONAL). Edge *names* are normative; storage form is not.
216
+ - **Failure Condition:** A required edge is unqueryable, misdirected, or renamed.
217
+
218
+ **L3-008** — `PRECEDES` edge-type property
219
+ - **Class:** RECOMMENDED
220
+ - **Spec Reference:** §21 §7
221
+ - **Description:** Where the `PRECEDES` edge is stored, it SHOULD carry the normative property `edge_type ∈ {SEQUENTIAL, CONDITIONAL, PARALLEL}` (the `PrecedesEdgeType` enum), recorded even when the default `SEQUENTIAL` applies, and `sequence_gap: Integer`. Additional implementation-specific edge properties are permitted but MUST NOT alter the semantics of the seven core edges.
222
+
223
+ ---
224
+
225
+ ## 7. Governance Rule Enforcement Matrix
226
+
227
+ Layer 3 governance centers on the single numbered SPEC rule **G-36 (CIA Declaration)** — renumbered from its authoring numeral G-19 during the v3.2.1 integration (the original G-19 collided with the §19 Branch/Fork/Merge taxonomy). The remaining Layer 3 requirements are stated as **invariants** (L3-I1 … L3-I5) and **wire-tier conformance rules** (W-L3-1 … W-L3-4) rather than G-numbers.
228
+
229
+ | Rule / Invariant | Scope | Vector(s) |
230
+ |------------------|-------|-----------|
231
+ | **G-36** | CIA sole-writer declaration + enforcement | CIA-001 |
232
+ | L3-I1 | Spine isolation — no Layer 3 data in Spine hash | L3-001, L3-002, L3-003 |
233
+ | L3-I2 | Sole writer (one CIA per node type) | CIA-001 |
234
+ | L3-I3 | Terminal-on-write immutability | L3-004 |
235
+ | L3-I4 | WorkflowDeclaration mutation surface | L3-005, WF-003 |
236
+ | L3-I5 | Retry-by-new-node | L3-006 |
237
+ | W-L3-1 | Hash determinism | WF-001, EX-001, SK-001 |
238
+ | W-L3-2 | Hash field inclusion/exclusion | WF-001/002, EX-001/002, SK-001/002 |
239
+ | W-L3-3 | Documented serialization | (declared in `ConformanceDeclaration`; see §8) |
240
+ | W-L3-4 | Audit emission before durability | CIA-002, CIA-003, CIA-004 |
241
+ | §10 state machine | Status transitions + auto-transition | WF-004, WF-005, WF-006 |
242
+ | §5 error consistency | ExecutionNode error/status coupling | EX-003 |
243
+ | §7 edges | Seven cross-layer edges | L3-007, L3-008 |
244
+ | §13.2 deferral | `registry_id` null + hash-excluded | SK-002, SK-003 |
245
+
246
+ ---
247
+
248
+ ## 8. Conformance Levels
249
+
250
+ ### Level 1: Protocol Conformance (Wire + State tiers)
251
+
252
+ Implementation passes all **REQUIRED** vectors in sections 2–6 and the governance matrix of section 7. This covers the SPEC §21 §12 **Wire tier** (node schemas §4–§6, edge names §7, hash preimage rules §8, immutability §9, state machine §10, audit events §11, CIA sole-writer §3) and **State tier** (status-transition semantics, retry-by-new-node, the two-`INTERRUPTED` distinction). No claim is made about storage layout, hash byte-form, or performance.
253
+
254
+ ### Level 2: Full Conformance (+ Behavioral tier documentation)
255
+
256
+ Level 1 plus all **RECOMMENDED** vectors, plus the SPEC §21 §12 **Behavioral tier** audit-the-decision documentation obligations: the implementation MUST document, in its `ConformanceDeclaration`, its chosen **hash byte serialization** (W-L3-3, in enough detail that an independent verifier can reproduce any node's hash from its field values), its **`skill_source` vocabulary**, its **CIA enforcement mechanism**, its **audit chain-key dimension**, and its **edge storage representation**. These choices are unconstrained by the protocol but MUST be recorded.
257
+
258
+ The Behavioral tier is **NOT REQUIRED** for protocol conformance; the audit-the-decision pattern requires only that each choice be documented, not that any particular choice be made. The Ignis OS reference chooses: SHA3-256 over field-ordered canonical JSON, the four `ignis_*` MCP tools as the sole CIA write path (`cia_identifier = ignis_mcp_server@<workspace_id>`), `episode_id` as the audit chain key, and native graph relationships for the seven edges.
259
+
260
+ ---
261
+
262
+ ## 9. Cross-Reference
263
+
264
+ - **SPEC.md §21** — normative protocol surface (v3.2.1); §2 Spine isolation, §3 CIA / G-36, §4–§6 schemas, §7 edges, §8 hash preimages, §9 immutability, §10 state machine, §11 audit registry, §12 three-tier conformance, Appendix B conformance checklist.
265
+ - **IMPLEMENTATION-LAYER3.md** — the reference deployment's adapter guide (non-normative; shipped with that adapter, not with the protocol): exact hash-preimage field orders, one storage layout, the reference CIA.
266
+ - **CONFORMANCE-BFM.md** — Branch/Fork/Merge conformance vectors (§19).
267
+ - Ground-truth code: `astp/core/workflow_execution.py` (schemas + `compute_*_content_hash` functions), `astp/core/hash_canonical.py` (reference canonicalizer), `astp/core/branching.py` (`CognitiveDeltaType` Layer 3 audit values).
268
+
269
+ ---
270
+
271
+ *ASTP Layer 3 Conformance Test Vectors are maintained by Scorched Earth Labs.*
272
+ *Vector set version: 1.0.0 | Applies to SPEC.md: v3.2.1 §21*
@@ -0,0 +1,219 @@
1
+ # ASTP — Reproducibility Conformance Test Vectors
2
+
3
+ **Version:** 1.3.0
4
+ **Status:** Working Draft
5
+ **Authors:** Scorched Earth Labs
6
+ **Date:** 2026-09-18
7
+ **Applies To:** SPEC.md 5.0.0 — §5.1 Canonical Field Encoding, §5.2 Leaf Hash, §5.6 Episode Spine Leaf Set, §5.7 Episode Root, §5.8 Algorithm and Ordering Versions, §9.2 Inclusion Proof, §9.3 Reproducibility Obligation, G-1, G-40. RP-001 … RP-008 exercise the retained `spine_algorithm_version` 0 and 1 constructions, which every verifier of a 4.x seal must implement; RP-009 … RP-011 exercise `spine_algorithm_version` 2.
8
+ **Companions:** [CONFORMANCE-CONTEXT.md](CONFORMANCE-CONTEXT.md) (`spine_algorithm_version` 3 — the spine root is byte-identical to version 2, so RP-009 … RP-011 apply to a version 3 seal unchanged; the sixth root field, `context_manifest_hash`, is exercised by CM-001 … CM-010), [CONFORMANCE-TRUST.md](CONFORMANCE-TRUST.md) (§16 trust infrastructure), [CONFORMANCE-BFM.md](CONFORMANCE-BFM.md), [CONFORMANCE-LAYER3.md](CONFORMANCE-LAYER3.md), [CONFORMANCE-CROSS-EPISODE-LINKING.md](CONFORMANCE-CROSS-EPISODE-LINKING.md)
9
+
10
+ ---
11
+
12
+ ## 1. Overview
13
+
14
+ The Five-Test Gate (§9.1) is only as strong as the verifier's ability to rebuild the
15
+ sealed root. These vectors test that ability directly. They exist because the first
16
+ corpus-scale re-verification of a production deployment (2026-09-13, 62 sealed
17
+ Episodes) found that 17 of them could not be rebuilt from stored nodes under the
18
+ construction their seal claimed:
19
+
20
+ | Outcome | Episodes |
21
+ |---|---|
22
+ | Root rebuilt from stored nodes | 45 |
23
+ | Rebuilt only under an earlier tree function, which had been replaced in place | 8 |
24
+ | Rebuilt only by searching the orderings of same-timestamp signals | 4 |
25
+ | Not rebuilt under any construction — one has too many tied signals to search and had also accepted content after closure; the other is within reach of a longer search | 2 |
26
+ | In a sealed status with no seal record at all, so no root to rebuild | 3 |
27
+
28
+ Of the 57 seals that were rebuilt, none showed evidence of content tampering. The
29
+ remaining 5 could not be evaluated: 2 did not rebuild under any construction, and 3
30
+ have no root to rebuild. None of this was visible until a verifier tried to
31
+ reproduce the roots.
32
+
33
+ A conforming implementation MUST pass all vectors marked **REQUIRED**. Format follows
34
+ [CONFORMANCE-TRUST.md §1](CONFORMANCE-TRUST.md).
35
+
36
+ Reference implementation: `astp/core/schema.py` (`compute_spine_root_v2`,
37
+ `compute_signal_manifest_hash`, `compute_exclusion_hash`, `compute_episode_root_hash`,
38
+ `enforce_G1_write_guard`), tested in
39
+ `tests/unit/protocol/test_reproducibility_conformance.py`.
40
+
41
+ ---
42
+
43
+ ## 2. Spine Reproducibility (§5.6, §9.3)
44
+
45
+ **RP-001** — Spine Root From Stored Nodes Only
46
+ - **Class:** REQUIRED
47
+ - **Spec Reference:** §5.6, §9.3
48
+ - **Description:** The spine root is a function of the Episode's non-ephemeral Segment content hashes in `sequence_index` order and, under `spine_algorithm_version` 1, the Episode's identifier (the Episode-identifier leaf, §5.6) — and nothing else. Two verifiers holding the same stored Segments and the same `episode_id` produce the same root; any state not on the nodes (insertion order, a store's default sort, a cache, the signals) plays no part.
49
+ - **Inputs:**
50
+ ```
51
+ segment_content_hashes (sequence_index order): 7 hashes, SHA3-256("leaf-0") … SHA3-256("leaf-6")
52
+ episode_id: "550e8400-e29b-41d4-a716-446655440000"
53
+ spine_algorithm_version: 1
54
+ ordering_version: 2
55
+ ```
56
+ - **Expected Output:**
57
+ ```
58
+ SHA3-256("leaf-0") aa6c290f56f0f7eb3a8da563ae72efc5d10cc89b88a3112c612d8e3825e20aad
59
+ Episode-identifier leaf input
60
+ SHA3-256(episode_id) 0bdfe537564300a840a9b2279b3c4d0c8ca0e0c3b0c3d9c95c105852f991f222
61
+ spine_root (spine_algorithm_version 1) 3cdbc3f20a909338a55a5b9687d72ce4b6f74ad1d3784a377c91b1bba06f2491
62
+ spine_root (spine_algorithm_version 0,
63
+ same seven inputs) 0654211304f104a768b81432567776c7f13f65b97e4937f114f5c65e8dbc5fed
64
+ ```
65
+ Hash values enter the tree as 64-character lowercase hex strings, ASCII-encoded (§5.3); an unpaired node is carried up unchanged (§5.4). The root is **not** equal to the `ordering_version` 1 root computed with any signals included; it differs when the segment order is permuted; an empty leaf set is refused.
66
+ - **Failure Condition:** Either root differs from the value above; the root changes when signals are added; the root is order-insensitive; an empty leaf set yields a root.
67
+
68
+ ---
69
+
70
+ ## 3. Signal Manifest (§5.7)
71
+
72
+ **RP-002** — Signal Manifest Is a Set
73
+ - **Class:** REQUIRED
74
+ - **Spec Reference:** §5.7
75
+ - **Description:** The signal manifest hash depends only on the *set* of SPINE-placed signal content hashes. Arrival order, timestamps, and duplicates do not change it; membership does. The empty manifest is well defined and distinct from the empty exclusion set. The Episode root changes when any component changes.
76
+ - **Inputs:**
77
+ ```
78
+ signal_content_hashes: 5 hashes, SHA3-256("leaf-100") … SHA3-256("leaf-104"), presented in five different orders
79
+ construction: SHA3-256("SIGNAL_MANIFEST:v1:" || sorted hashes joined by "|"); empty → SHA3-256("SIGNAL_MANIFEST:v1:EMPTY")
80
+ exclusion: SHA3-256("EXCLUSION:v1:" || …); empty → SHA3-256("EXCLUSION:v1:EMPTY")
81
+ episode_root_hash = SHA3-256("NODE:" || spine_root || signal_manifest_hash || exclusion_hash)
82
+ ```
83
+ - **Expected Output:**
84
+ ```
85
+ signal_manifest_hash (the five hashes, any order, with or without duplicates)
86
+ 0a4a4582ad36da24dcd21853b07ed97d13a8c223cf14845588861d9d5786b670
87
+ signal_manifest_hash (SHA3-256("leaf-104") removed)
88
+ 5b73a9aa0cf76aaa0399dce72733b48d5e441b7f236dc063d570eecdde5ff22d
89
+ signal_manifest_hash (empty) 5188531fe69daafc79126dfa880419494179ca220d60d5dda2fee8279d4ae847
90
+ exclusion_hash (empty) 45849be4da47e279538916284a2ac74cd6acd60a67b9a8982992f97afa149be6
91
+ episode_root_hash (RP-001 spine_root under spine_algorithm_version 1,
92
+ the five-member manifest, empty exclusion set)
93
+ 49c1b61c22d00c185dceca5eb39f65bd88c2666281444687c59c48b0b199d7fe
94
+ ```
95
+ The Episode root differs when the manifest or the exclusion set differs.
96
+ - **Failure Condition:** Any value differs from the one above; any ordering-dependence; duplicates altering the hash; a root insensitive to a component.
97
+
98
+ ---
99
+
100
+ ## 4. Version Identifiers (§5.8)
101
+
102
+ **RP-003** — Version Tags Select the Function and Stay Out of the Preimage
103
+ - **Class:** REQUIRED
104
+ - **Spec Reference:** §5.8
105
+ - **Description:** A seal record carries `spine_algorithm_version` and `ordering_version`; a `CognitiveNode` carries `hash_version`. They are recorded and retrievable, default to absent (seal) / `1` (node) so pre-4.3.0 records read as legacy, and are **outside** every hash preimage: two seal records differing only in tags have the same content hash, and two nodes differing only in `hash_version` have the same leaf hash.
106
+ - **Inputs:**
107
+ ```
108
+ CrystallizationDelta A: sealed_chain_root R, spine_algorithm_version 1, ordering_version 2
109
+ CrystallizationDelta B: sealed_chain_root R, no version tags
110
+ CognitiveNode N1: hash_version 1 (default); N2: identical fields, hash_version 7
111
+ ```
112
+ - **Expected Output:** A reports (1, 2); B reports (None, None); `content_hash(A) == content_hash(B)`; `leaf_hash(N1) == leaf_hash(N2)`.
113
+ - **Failure Condition:** Tags not persisted; tags entering a preimage (content or leaf hash differs by tag alone); a tagless record read as current rather than legacy.
114
+
115
+ ---
116
+
117
+ ## 5. Fixed Record (G-1)
118
+
119
+ **RP-004** — A Closed Episode Refuses Content
120
+ - **Class:** REQUIRED
121
+ - **Spec Reference:** G-1, §4.4.1
122
+ - **Description:** A Segment or Signal commit against an Episode whose record is fixed MUST be refused with a governance error. Fixed means `CLOSING_PENDING_SEAL`, `CLOSED`, `CRYSTALLIZATION_PENDING`, `SEALING`, `SEALED`, `ARCHIVED`. Open means `CREATED`, `ACTIVE`, `PENDING_HITL`, `CLOSING`, `CRYSTALLIZED`. Codicils are exempt and use their own path.
123
+ - **Inputs:** each `EpisodeStatus` value, presented to the write guard.
124
+ - **Expected Output:** governance error for every fixed state — **`CLOSED` included**; no error for every open state.
125
+ - **Failure Condition:** Any fixed state admits a commit. (The reference guard before 4.3.0 admitted `CLOSED`; the production corpus holds one post-closure append as a result.)
126
+
127
+ ---
128
+
129
+ ## 6. Resolved Signal Order (§5.8.1)
130
+
131
+ These vectors share one fixture. Segments: the seven of RP-001. SPINE-placed Signals: the five of RP-002, `SHA3-256("leaf-100")` … `SHA3-256("leaf-104")`, stored in that (arrival) order, of which the middle three — `leaf-101`, `leaf-102`, `leaf-103` — share a timestamp. At seal time the Signals were folded in the order `leaf-100, leaf-103, leaf-101, leaf-102, leaf-104`. `episode_id` as in RP-001. `ordering_version` 1.
132
+
133
+ ```
134
+ sealed_chain_root, spine_algorithm_version 1 1dda20e990cf757302e67f96173703a2a0f846feb2c6c0f34870a2e173aeed33
135
+ sealed_chain_root, spine_algorithm_version 0 863ded60b9adce9cf3703b8892c5bf5263fa09153a81aa21778517789f9aa2c2
136
+ root under the stored (arrival) order, version 1 2ff4e255c1e7470aa8a30a8b1fbde6cecb690e1d4ffaefb31a0ae26b6fce44ba (≠ sealed: the seal is a tie-order seal)
137
+ ```
138
+
139
+ **RP-005** — An Admissible Annotation Reproduces the Seal Without a Search
140
+ - **Class:** REQUIRED for implementations that read or write `resolved_signal_order`
141
+ - **Spec Reference:** §5.8.1, §9.3
142
+ - **Description:** Given the fixture and `resolved_signal_order = [leaf-100, leaf-103, leaf-101, leaf-102, leaf-104]` (as content hashes), a verifier recomputes the spine once, under the seal's identifiers, and obtains the sealed root — for `spine_algorithm_version` 1 and, with the corresponding sealed root, for version 0.
143
+ - **Expected Output:** the two `sealed_chain_root` values above; the annotation is reported admissible; no ordering other than the recorded one is tried.
144
+ - **Failure Condition:** Either root differs; the verifier searches despite an admissible annotation.
145
+
146
+ **RP-006** — An Annotation Is Checked, Never Trusted
147
+ - **Class:** REQUIRED for implementations that read `resolved_signal_order`
148
+ - **Spec Reference:** §5.8.1
149
+ - **Description:** Three inadmissible annotations against the `spine_algorithm_version` 1 fixture. (a) *Wrong order:* `[leaf-100, leaf-101, leaf-103, leaf-102, leaf-104]` — a reordering of the stored Signals that does not reproduce the root. (b) *Foreign hash:* the correct order with its last entry replaced by `SHA3-256("x")`, which is not a Signal of the Episode. (c) *Tampered record:* the correct order, but the first Segment's content hash replaced by `SHA3-256("t")`.
150
+ - **Expected Output:** each annotation is reported inadmissible and is ignored. In (a) and (b) the verifier proceeds as if no annotation were present and may still reproduce the seal by search. In (c) the seal does not reproduce under any order: the correct annotation does not rescue a tampered record.
151
+ - **Failure Condition:** Any of the three is accepted; (c) verifies.
152
+
153
+ **RP-007** — An `ordering_version` 2 Seal Ignores a Stray Annotation
154
+ - **Class:** REQUIRED for implementations that read `resolved_signal_order`
155
+ - **Spec Reference:** §5.8.1
156
+ - **Description:** A seal tagged `ordering_version` 2 over the RP-001 segments (sealed root as in RP-001, `spine_algorithm_version` 1) whose delta nonetheless carries a `resolved_signal_order`.
157
+ - **Expected Output:** the annotation is ignored; the seal verifies exactly as RP-001, to `3cdbc3f20a909338a55a5b9687d72ce4b6f74ad1d3784a377c91b1bba06f2491`.
158
+ - **Failure Condition:** The annotation alters the recomputation or the outcome.
159
+
160
+ **RP-008** — Absence of an Annotation Carries No Adverse Inference
161
+ - **Class:** REQUIRED
162
+ - **Spec Reference:** §5.8.1, §9.3
163
+ - **Description:** The `spine_algorithm_version` 1 fixture with **no** annotation. Searching the orderings of the tied group (3! = 6) finds the sealed order. Separately, the same fixture with a sealed root that no ordering reproduces.
164
+ - **Expected Output:** the first seal reproduces to the same `sealed_chain_root` as in RP-005 and is reported as reproduced — no weaker for having been found by search. The second is reported as not reproducible. The two outcomes MUST be distinguishable: "reproduced without an annotation" is not "could not be reproduced".
165
+ - **Failure Condition:** A search-resolved seal is reported as weaker than, or different in root from, an annotated one; the two outcomes are conflated.
166
+
167
+ ---
168
+
169
+ ## 6a. Seal Construction Version 2 (SPEC 5.0.0 §5.1–§5.7, §9.2)
170
+
171
+ The machine-readable vector file is [`vectors/5.0.0/seal-constructions.json`](./vectors/5.0.0/seal-constructions.json), regenerated by `vectors/5.0.0/generate.py` and never edited by hand. Every value in it is checked twice by the reference tests (`tests/conformance/test_*_v2_vectors.py`): against the package, and against a from-prose reference written from `SPEC.md` with `hashlib` alone. Fixture: `episode_id` `550e8400-e29b-41d4-a716-446655440000`; seven Segments with fixed `node_id`s `00000000-0000-4000-8000-00000000000i` and `content_hash = SHA3-256("leaf-i")`, `sequence_index` i, `schema_version` `"1.2.0"`, parent = the Episode; five SPINE-placed Signals; seven structural members; empty exclusion set. (Fixed `node_id`s are for reproducibility only; real `node_id`s MUST be random, SPEC §5.2.)
172
+
173
+ **RP-009** — Version 2 Leaf Hash and Spine Root
174
+ - **Requirement:** REQUIRED
175
+ - **Spec Reference:** §5.1.1, §5.2, §5.4, §5.6
176
+ - **Description:** From the fixture's stored fields, a verifier computes each Segment's `hash_version` 2 leaf hash under `LEAF_HASH:v2:` and the spine root under `TREE_LEAF:v2:` / `TREE_NODE:v2:` over raw bytes, with no Episode-identifier leaf.
177
+ - **Expected:**
178
+ ```
179
+ leaf_hash (hash_version 2), segment 0 25b617f0d7ac09871f88ce7e2851cc8f50b48305dee51d081b62a5f21ed84935
180
+ spine_root (spine_algorithm_version 2), n=1 5e06ac5629faf452aa18836dcf3f33565db0cd2d8749b482c65365b9273b576e
181
+ spine_root (spine_algorithm_version 2), n=7 4420e38a22409317822ac14e3d5bc8069e6556c0fc08928290f76d23396daa01
182
+ ```
183
+ - **Failure Condition:** Any other value; computing a leaf hash from a stored version 1 leaf hash rather than from the fields; accepting hex-text tree inputs under version 2; computing a root for an empty leaf list.
184
+
185
+ **RP-010** — Version 2 Sets and Episode Root
186
+ - **Requirement:** REQUIRED
187
+ - **Spec Reference:** §5.1.1 (sets), §5.7, §5.7.1
188
+ - **Description:** The signal manifest, the structural manifest over the fixture's seven members, the empty exclusion set, and the Episode root over the Episode's UUID and the four components.
189
+ - **Expected:**
190
+ ```
191
+ signal_manifest_hash (v2), five members 70dbc8e8f2e87b63e49187979b14ad56ba11219b42be132015c23dcad36acb43
192
+ exclusion_hash (v2), empty ddea405cc1729ebf63d93b16d723873ad02f9f64af3cc159bf86e5f999b02ce1
193
+ structural_manifest_hash, seven members 0a4b777227b87ee0d6c8efd5b2e9a5fc05c02e61d677f2460f868ab06779b537
194
+ episode_root_hash (v2) f0511b4d1be172554b9f87ec64d400d24a1409f1742ad72f628bf5ab7b7d33f0
195
+ ```
196
+ - **Failure Condition:** Any other value; a set that depends on member order; an empty set hashed with a sentinel; removing a structural member leaving the Episode root unchanged; an Episode root computed over a string identifier.
197
+
198
+ **RP-011** — Version 2 Inclusion Proof
199
+ - **Requirement:** REQUIRED
200
+ - **Spec Reference:** §9.2
201
+ - **Description:** For the seven-leaf spine, a proof for leaf 3 carries three siblings and a proof for leaf 6 carries two; each verifies against the n=7 root at its own position and at no other; a proof whose sibling count does not fit the shape derived from `leaf_index` and `leaf_count` is refused. The vector file's `inclusion_proofs_v2` fixes the sibling lists.
202
+ - **Failure Condition:** A proof verifying at a position other than its own; a proof accepted with a sibling count the shape does not admit; a verifier that requires stated path directions for a version 2 proof, or derives them for a 4.x proof.
203
+
204
+ ## 7. Governance Rule Enforcement Matrix
205
+
206
+ | Governance Rule | Description | Test Vectors | Class |
207
+ |----------------|-------------|-------------|-------|
208
+ | **G-1** | Write guard — no appends to a fixed record | RP-004 | REQUIRED |
209
+ | §9.3 | Reproducibility obligation | RP-001, RP-002, RP-003 | REQUIRED |
210
+ | §5.8.1 | `resolved_signal_order` is checked, never trusted; absence carries no inference | RP-005, RP-006, RP-007, RP-008 | REQUIRED (RP-005–007 for implementations that use the annotation) |
211
+
212
+ ## 8. Out of Scope
213
+
214
+ - How an implementation finds the order of same-timestamp Signals for an `ordering_version` 1 seal (search strategy, caps, scheduling). §6 covers what may be recorded once it is found and how a recorded order must be checked; a seal whose tied groups are too large to search, and which has no admissible annotation, is not reproducible, and no vector requires otherwise.
215
+ - Re-sealing of historical records. Prohibited by §5.8 — a re-seal is a post-closure mutation.
216
+
217
+ ---
218
+
219
+ *ASTP Reproducibility Conformance Test Vectors are maintained by Scorched Earth Labs.*