@haystackeditor/cli 0.25.1 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +39 -463
  2. package/dist/capture/app-config.js +30 -6
  3. package/dist/commands/capture-brief.js +45 -35
  4. package/dist/commands/capture-contract.js +4 -4
  5. package/dist/commands/crawl-report.js +196 -0
  6. package/dist/commands/db-profile-upload.js +3 -3
  7. package/dist/commands/feedback.js +66 -0
  8. package/dist/commands/init-telemetry.js +55 -9
  9. package/dist/commands/init.js +8 -3
  10. package/dist/commands/lockfile-pin.js +307 -0
  11. package/dist/commands/telemetry-token.js +3 -3
  12. package/dist/commands/tokens.js +4 -4
  13. package/dist/commands/verify-explore.js +3 -3
  14. package/dist/commands/verify-history.js +2 -2
  15. package/dist/commands/verify-onboarding.js +13 -16
  16. package/dist/commands/verify-precompute.js +3 -4
  17. package/dist/commands/verify.js +31 -118
  18. package/dist/index.js +55 -968
  19. package/dist/schema.js +4 -10
  20. package/dist/utils/haystack-api.js +8 -36
  21. package/package.json +1 -5
  22. package/schemas/feedback.v1.json +13 -0
  23. package/schemas/pre-verify.v2.json +240 -0
  24. package/schemas/verify-raw.v1.json +1132 -0
  25. package/schemas/verify.v2.json +655 -0
  26. package/dist/assets/hooks/agent-context/detect.ts +0 -316
  27. package/dist/assets/hooks/agent-context/format.ts +0 -100
  28. package/dist/assets/hooks/agent-context/index.ts +0 -41
  29. package/dist/assets/hooks/agent-context/parsers/claude.ts +0 -262
  30. package/dist/assets/hooks/agent-context/parsers/codex.ts +0 -416
  31. package/dist/assets/hooks/agent-context/parsers/gemini.ts +0 -155
  32. package/dist/assets/hooks/agent-context/parsers/opencode.ts +0 -174
  33. package/dist/assets/hooks/agent-context/tsconfig.json +0 -14
  34. package/dist/assets/hooks/agent-context/types.ts +0 -58
  35. package/dist/assets/hooks/llm-rules-template.md +0 -59
  36. package/dist/assets/hooks/package-lock.json +0 -598
  37. package/dist/assets/hooks/package.json +0 -12
  38. package/dist/assets/hooks/scripts/commit-msg.sh +0 -5
  39. package/dist/assets/hooks/scripts/post-commit.sh +0 -5
  40. package/dist/assets/hooks/scripts/pre-commit.sh +0 -175
  41. package/dist/assets/hooks/scripts/pre-push.sh +0 -25
  42. package/dist/assets/hooks/scripts/prepare-commit-msg.sh +0 -5
  43. package/dist/assets/hooks/truncation-checker/ast-analyzer.ts +0 -528
  44. package/dist/assets/hooks/truncation-checker/index.ts +0 -595
  45. package/dist/assets/hooks/truncation-checker/tsconfig.json +0 -13
  46. package/dist/assets/skills/map-cloud-verifier-universe/SKILL.md +0 -2051
  47. package/dist/assets/skills/map-cloud-verifier-universe/agents/openai.yaml +0 -4
  48. package/dist/assets/skills/map-cloud-verifier-universe/references/output-contract.md +0 -3411
  49. package/dist/assets/skills/map-your-system.md +0 -143
  50. package/dist/assets/skills/submit.md +0 -200
  51. package/dist/commands/ask.js +0 -20
  52. package/dist/commands/cloud-verifier-behaviors.js +0 -218
  53. package/dist/commands/cloud-verifier-data-store-census.js +0 -539
  54. package/dist/commands/cloud-verifier-data-store-drift.js +0 -158
  55. package/dist/commands/cloud-verifier-identity-census.js +0 -4060
  56. package/dist/commands/cloud-verifier-materialization.js +0 -704
  57. package/dist/commands/cloud-verifier-pascal-selector-census.js +0 -1382
  58. package/dist/commands/cloud-verifier-python-manifest-selector-census.js +0 -2015
  59. package/dist/commands/cloud-verifier-specialized-operational-census.js +0 -11432
  60. package/dist/commands/cloud-verifier-universe.js +0 -10178
  61. package/dist/commands/config.js +0 -549
  62. package/dist/commands/design-verify.js +0 -311
  63. package/dist/commands/dismiss.js +0 -159
  64. package/dist/commands/hooks.js +0 -226
  65. package/dist/commands/inbox.js +0 -137
  66. package/dist/commands/mcp.js +0 -201
  67. package/dist/commands/policy.js +0 -371
  68. package/dist/commands/pr-status.js +0 -207
  69. package/dist/commands/pr.js +0 -105
  70. package/dist/commands/prepare-universe-review.js +0 -1092
  71. package/dist/commands/production-source-deny-policy.js +0 -100
  72. package/dist/commands/request-review.js +0 -74
  73. package/dist/commands/review.js +0 -191
  74. package/dist/commands/rules.js +0 -98
  75. package/dist/commands/scaffold-provisional-universe.js +0 -806
  76. package/dist/commands/setup.js +0 -1170
  77. package/dist/commands/skills.js +0 -447
  78. package/dist/commands/status.js +0 -35
  79. package/dist/commands/submit.js +0 -745
  80. package/dist/commands/system-map.js +0 -228
  81. package/dist/commands/triage.js +0 -598
  82. package/dist/commands/webhooks.js +0 -241
  83. package/dist/states.js +0 -46
  84. package/dist/tools/detect.js +0 -832
  85. package/dist/triage/astra.js +0 -202
  86. package/dist/triage/prompts.js +0 -188
  87. package/dist/triage/runner.js +0 -200
  88. package/dist/triage/types.js +0 -7
  89. package/dist/types.js +0 -326
  90. package/dist/utils/action-output.js +0 -26
  91. package/dist/utils/analysis-api.js +0 -416
  92. package/dist/utils/config.js +0 -54
  93. package/dist/utils/design-verifier-api.js +0 -294
  94. package/dist/utils/design-verifier-history.js +0 -79
  95. package/dist/utils/design-verifier-result.js +0 -424
  96. package/dist/utils/github-api.js +0 -324
  97. package/dist/utils/pending-state.js +0 -86
  98. package/dist/utils/pr-ref.js +0 -56
  99. package/dist/utils/prompter.js +0 -328
  100. package/schemas/action.v1.json +0 -22
  101. package/schemas/ask.v1.json +0 -40
  102. package/schemas/inbox.v1.json +0 -27
  103. package/schemas/pr-status.v1.json +0 -61
  104. package/schemas/pr.v1.json +0 -97
  105. package/schemas/pr.v3.json +0 -45
  106. package/schemas/setup.v1.json +0 -75
  107. package/schemas/submit.v1.json +0 -90
  108. package/schemas/triage.v1.json +0 -103
  109. package/schemas/triage.v2.json +0 -64
@@ -1,3411 +0,0 @@
1
- # Cloud Verifier universe output contract
2
-
3
- Use this contract for the four files under `.haystack/cloud-verifier/`. Keep
4
- records small and evidence-backed. Never store credentials, raw provider
5
- resource IDs, ARNs, connection strings, or secret values.
6
-
7
- The agent reads the repository and nothing else. Haystack builds and operates
8
- the replicas, under access the customer grants it directly, and that access is
9
- never routed through this skill. Production IAM roles, provider credentials,
10
- deletion handles, production mutation APIs, and direct control-plane
11
- connectivity are never requested here and never recorded here.
12
-
13
- Haystack's own drivers use raw provider IDs internally, and the bounded
14
- `CustomerReplicaPlan` and `GoldenReplicaDescriptor` protocol may carry exact
15
- stable source and replica identities for alias and isolation validation. Those
16
- are transient protocol data. Checked-in artifacts use opaque catalog handles and
17
- never contain raw provider IDs or production endpoints. Later verifier execution
18
- receives replica identities and short-lived replica-only lease references.
19
-
20
- This document describes validator contract revision `39`. Each artifact is
21
- limited to 33554432 UTF-8 bytes. YAML aliases are bounded, and documents deeper
22
- than 64 collection levels, containing more than 500000 parsed nodes, or
23
- forming an alias cycle are invalid.
24
-
25
- ## Contents
26
-
27
- - [Stable identity and updates](#stable-identity-and-updates)
28
- - [Authority boundary](#authority-boundary)
29
- - [`universe.yml`](#universeyml)
30
- - [`behaviors.yml`](#behaviorsyml)
31
- - [Scope and production authority](#scope-and-production-authority)
32
- - [Artifacts and exact source](#artifacts-and-exact-source)
33
- - [Prepared state and hot launch](#prepared-state-and-hot-launch)
34
- - [Resources and reproduction](#resources-and-reproduction)
35
- - [`evidence.yml`](#evidenceyml)
36
- - [`review.yml`](#reviewyml)
37
-
38
- ## Stable identity and updates
39
-
40
- - Use lowercase kebab-case IDs unique within the application.
41
- - Preserve an ID when the same logical object evolves.
42
- - Link records only by exact ID. Never join or deduplicate by free text.
43
- - Preserve roles, deployment profiles, logical databases, buckets, topics,
44
- streams, queues, consumer groups, and keyspaces as structured identities.
45
- - Merge records only when authoritative evidence proves the same structured
46
- logical identity. Physical co-location is not a logical join.
47
- - Preserve separately keyed logical databases, schemas, queues, streams,
48
- buckets, namespaces, installed material, generated outputs, and persisted
49
- identities as separate resources. They may share a `physical_binding_id`,
50
- `state_policy.action`, consistency group, and one materialization action
51
- without being collapsed. Do not separately record unaddressed physical
52
- children, state the process recreates at boot, scratch or temporary children,
53
- write buffers, or immutable bytes already carried by an artifact.
54
- - Give evidence, missing sources, blockers, and reviewer findings stable IDs.
55
-
56
- Record the mapping baseline in `map_revision`. On an update, inspect the source
57
- diff from the prior commit plus reverse dependencies and any evidence whose
58
- anchor changed. Preserve stable IDs. Remove or tombstone an object only with
59
- evidence that it is no longer active. Have the reviewer inspect the changed
60
- scope blindly before seeing the semantic delta. Fall back to a full bounded
61
- scan when deployment roots, service catalogs, application scope, or topology
62
- sources changed. This is the required update protocol; it is not a claim that
63
- update determinism has already been validated.
64
-
65
- `map_revision.mode` is exactly one of two values:
66
-
67
- - `full-scan` — the whole bounded scan ran, either for a first map or because one
68
- of the four fallback triggers above fired.
69
- - `incremental` — only the source diff, its reverse dependencies, and evidence
70
- whose anchors changed were inspected. This is the value for a routine update,
71
- including a re-check at an unchanged commit.
72
-
73
- `changed_scope_ids` is the set of **mapped stable IDs whose source scope the diff
74
- touched** — that is, the scope handed to the reviewer for blind re-inspection. It
75
- is not the set of records whose field values ended up changing. A commit that
76
- touches a service's source but leaves the universe semantically identical still
77
- lists that service's ID here; the correct outcome in that case is a populated
78
- `changed_scope_ids` with no added, removed, or modified objects. When the diff is
79
- empty, `changed_scope_ids` is `[]`.
80
-
81
- `previous_source_commit` is the `source_commit` of the map being updated. It is
82
- `null` only on a first map. When a re-check runs at an unchanged commit, it equals
83
- `source_commit`.
84
-
85
- Reading the three prior artifacts under `.haystack/cloud-verifier/` is required to
86
- perform an update and is exempt from the `.haystack` inspection denylist below.
87
- That denylist governs discovery of the application and the reviewer's source view;
88
- it never blocks the primary agent from loading the map it is updating.
89
-
90
- ## Authority boundary
91
-
92
- The minimum customer selection is a stable application ID, stable environment
93
- ID, and a replica destination policy or approval. The customer supplies that
94
- selection locally. The destination's provider
95
- account identity and production-native topology stay on the customer side; the
96
- artifact records only an opaque approval reference and approved bounds.
97
-
98
- Haystack resolves a bounded logical topology and plan summary: resource
99
- kinds, opaque catalog handles, dependency edges, artifact/config catalog refs,
100
- secret-reference names, external-integration kinds, replica strategies, and
101
- capability/consistency/freshness/latency/cost bounds. A `runtime_role_id` in
102
- this contract is a logical application behavior role, never an IAM role.
103
-
104
- The current protocol also carries exact stable `sourceResourceId` values in a
105
- `CustomerReplicaPlan` and exact stable source/replica identity pairs in a
106
- `GoldenReplicaDescriptor`. Haystack may compare those bounded identities to
107
- detect source/replica aliasing, cross-plan mismatches, or broken isolation. They
108
- are not credentials, deletion handles, or production mutation authority, and
109
- they must not be copied into checked-in universe, evidence, or review artifacts
110
- as raw provider IDs. Use customer-issued opaque catalog handles in artifacts.
111
-
112
- Do not query cloud-provider discovery APIs or production endpoints from the
113
- coding CLI, Haystack control plane, reviewer, or sandbox. Provider IDs may be
114
- used inside Haystack's discovery/materialization drivers and may cross the
115
- bounded plan/descriptor protocol only for the validation above. Translate them
116
- to opaque catalog handles before the checked-in artifact boundary.
117
-
118
- ## `universe.yml`
119
-
120
- ```yaml
121
- version: 1
122
- map_revision:
123
- source_commit: 0123456789abcdef0123456789abcdef01234567
124
- previous_source_commit: null
125
- mode: full-scan
126
- changed_scope_ids: []
127
- application:
128
- id: commerce-platform
129
- requested_scope: production-checkout
130
- selected_production_scope: hosted-checkout
131
- scope_status: confirmed
132
- evaluation_mode: real-production
133
-
134
- production_basis:
135
- repository_proven_topology:
136
- environment_scope: hosted-production
137
- fidelity_ceiling: exact-production-deployment
138
- evidence_ids: [ev-prod-checkout-deploy]
139
- authoritative_sources:
140
- - id: source-prod-deployment
141
- kind: kubernetes-service-catalog
142
- availability: present
143
- environment_scope: hosted-production
144
- authority_class: live-production-control-plane
145
- evidence_ids: [ev-prod-checkout-deploy]
146
- missing_authoritative_sources: []
147
- access_request: null
148
- alternate_topologies:
149
- - id: self-host-demo
150
- environment_scope: self-host-reference
151
- selected: false
152
- evidence_ids: [ev-self-host-compose]
153
-
154
- deployment_profiles:
155
- - id: prod-checkout
156
- environment_scope: hosted-production
157
- activation: active
158
- evidence_ids: [ev-prod-checkout-deploy]
159
-
160
- artifacts:
161
- - id: checkout-image
162
- kind: container
163
- verification_subject: source-changeable
164
- used_by_runtime_role_ids: [checkout-http-role]
165
- definition_evidence_id: ev-checkout-dockerfile
166
- verification_commit:
167
- status: proven
168
- source_incorporation:
169
- status: proven
170
- mechanism: built-from-verification-commit
171
- evidence_ids: [ev-checkout-image-ci]
172
- production_recipe_equivalence:
173
- status: proven
174
- evidence_ids: [ev-checkout-image-ci, ev-prod-checkout-deploy]
175
-
176
- services:
177
- - id: checkout-api
178
- source_root: apps/checkout
179
- runtime_roles:
180
- - id: checkout-http-role
181
- kind: http-server
182
- structured_identity:
183
- entrypoint: checkout-server
184
- mode: http
185
- deployment_unit_identity_key: deployment/checkout-api
186
- deployment_control_kind: orchestrator-workload
187
- deployment_control_token: Deployment/checkout-api
188
- deployment_profile_ids: [prod-checkout]
189
- artifact_id: checkout-image
190
- entrypoint_evidence_id: ev-checkout-entrypoint
191
- config_names: [DATABASE_URL, EVENTS_URL, FLAGS_SDK_KEY]
192
- interfaces: [checkout-http, order-events-consumer]
193
- depends_on: [orders-db, order-events, feature-flags, payments-api]
194
- evidence_ids: [ev-prod-checkout-deploy, ev-checkout-clients]
195
-
196
- interfaces:
197
- - id: checkout-http
198
- runtime_role_id: checkout-http-role
199
- kind: http
200
- locator_evidence_id: ev-checkout-routes
201
- - id: order-events-consumer
202
- runtime_role_id: checkout-http-role
203
- kind: event-consumer
204
- structured_identity:
205
- topic: order-events-v2
206
- consumer_group: checkout-materializer
207
- locator_evidence_id: ev-order-topic
208
-
209
- physical_bindings:
210
- - id: binding-orders-postgres
211
- status: resolved
212
- stable_resource_ref: binding-catalog/orders-primary
213
- evidence_ids: [ev-orders-prod-binding]
214
- - id: binding-order-events
215
- status: proven
216
- stable_resource_ref: binding-catalog/order-events-v2
217
- evidence_ids: [ev-events-prod-binding]
218
-
219
- resources:
220
- - id: orders-db
221
- kind: postgres
222
- activation: active
223
- activation_basis:
224
- kind: selected-profile-required
225
- evidence_ids: [ev-prod-checkout-deploy]
226
- state_classification: canonical-durable
227
- state_owner:
228
- basis: application-persistence-boundary
229
- evidence_ids: [ev-orders-state-owner]
230
- state_policy:
231
- action: copy
232
- runtime_role_ids: [checkout-http-role]
233
- consumer_edges:
234
- - runtime_role_id: checkout-http-role
235
- activation: active
236
- activation_basis:
237
- kind: selected-profile-required
238
- evidence_ids: [ev-orders-db-consumer]
239
- binding_names: [DATABASE_URL]
240
- structured_identity:
241
- role: transactional-orders
242
- logical_database: orders
243
- deployment_profile_ids: [prod-checkout]
244
- source_owner_identity_key: createOrdersDatabase
245
- materialization_root_identity_key: DATABASE_URL
246
- state_unit_kind: logical-database
247
- address_token: orders
248
- reproduction_token: forkOrdersDatabase
249
- reproduction_operation_kind: copy
250
- key_components: [DATABASE_URL]
251
- physical_binding_id: binding-orders-postgres
252
- reproduction:
253
- source: production-derived
254
- strategy: provider-native-fork
255
- capability_evidence_ids: [ev-orders-fork-capability]
256
- writable: true
257
- consistency_group_id: order-state
258
- evidence_ids: [ev-orders-db-client, ev-orders-db-iac]
259
- - id: order-events
260
- kind: event-stream
261
- activation: active
262
- activation_basis:
263
- kind: selected-profile-required
264
- evidence_ids: [ev-prod-checkout-deploy]
265
- state_classification: in-flight-work
266
- state_owner:
267
- basis: repository-declared-mutable-state
268
- evidence_ids: [ev-order-events-state-owner]
269
- state_policy:
270
- action: preserve
271
- rationale: Preserve accepted events not yet applied to canonical orders state.
272
- runtime_role_ids: [checkout-http-role]
273
- consumer_edges:
274
- - runtime_role_id: checkout-http-role
275
- activation: active
276
- activation_basis:
277
- kind: selected-profile-required
278
- evidence_ids: [ev-order-events-consumer]
279
- binding_names: [EVENTS_URL]
280
- structured_identity:
281
- role: order-event-log
282
- topic: order-events-v2
283
- deployment_profile_ids: [prod-checkout]
284
- source_owner_identity_key: publishOrderEvent
285
- materialization_root_identity_key: ORDER_EVENTS_TOPIC
286
- state_unit_kind: queue-or-stream
287
- address_token: order-events-v2
288
- reproduction_token: restoreOrderEventsSnapshot
289
- reproduction_operation_kind: restore
290
- key_components: [ORDER_EVENTS_TOPIC, order-id]
291
- physical_binding_id: binding-order-events
292
- reproduction:
293
- source: production-derived
294
- strategy: snapshot-restore
295
- capability_evidence_ids: [ev-events-snapshot-capability]
296
- writable: true
297
- consistency_group_id: order-state
298
- evidence_ids: [ev-order-topic, ev-events-iac]
299
-
300
- external_dependencies:
301
- - id: payments-api
302
- kind: third-party-api
303
- structured_identity:
304
- operation: authorize-payment
305
- operation_identity_key: apps/checkout/payments.ts#authorizePayment
306
- operation_token: authorizePayment
307
- boundary_contract_kind: outbound-operation-family
308
- interaction_direction: outbound
309
- source_owner_identity_key: submitPayment
310
- boundary_trace:
311
- kind: direct
312
- callsite_identity_key: apps/checkout/payments.ts#authorizePayment
313
- callsite_token: authorizePayment
314
- boundary_token: authorizePayment
315
- key_components: [payments-client, authorize-payment]
316
- runtime_role_ids: [checkout-http-role]
317
- consumer_edges:
318
- - runtime_role_id: checkout-http-role
319
- activation: active
320
- activation_basis:
321
- kind: default-request-path
322
- evidence_ids: [ev-payments-consumer]
323
- activation: active
324
- activation_basis:
325
- kind: default-request-path
326
- evidence_ids: [ev-payments-prod-config]
327
- backing_state:
328
- disposition: none
329
- basis: interaction-only
330
- operation: stateless-exchange
331
- evidence_ids: [ev-payments-boundary]
332
- reproduction:
333
- source: production-derived-interactions
334
- strategy: capture-replay
335
- capability_evidence_ids: [ev-payments-replay-capability]
336
- live_egress: forbidden
337
- evidence_ids: [ev-payments-client]
338
-
339
- consistency_groups:
340
- - id: order-state
341
- members: [orders-db, order-events]
342
- requirement: same-production-cut
343
- evidence_ids: [ev-order-dual-write]
344
-
345
- unresolved: []
346
-
347
- materialization_plan:
348
- # This is the full verifier result SLO, including generated case execution.
349
- verifier_total_slo_ms: 60000
350
- # This strictly smaller allocation is only for the warm hot-launch path.
351
- target_slo_ms: 7000
352
- reserved_case_work_ms: 53000
353
- generated_case_fanout:
354
- target_n: 8
355
- hard_max_n: 16
356
- required_identity_fields: [generated_case_id, sandbox_id, universe_incarnation_id]
357
- parallel_phases: [fork, attach, execute]
358
- cleanup_order: [release-all-attachments, revoke-all-leases]
359
- cleanup_covers_all_attempts_on_partial_failure: true
360
- single_absolute_deadline: true
361
- workload_profiles:
362
- - id: cloud-verifier-standard-v1
363
- template_catalog_ref: template-catalog/cloud-verifier-standard-v1@sha256:1111111111111111111111111111111111111111111111111111111111111111
364
- resource_size: e2b-standard
365
- compatibility_groups:
366
- - id: checkout-prod-v3
367
- member_subject_ids: [checkout-image, orders-db, order-events, payments-api]
368
- prepared_states:
369
- - id: prepared-checkout-source
370
- exact_identity:
371
- workload_profile_id: cloud-verifier-standard-v1
372
- template_catalog_ref: template-catalog/cloud-verifier-standard-v1@sha256:1111111111111111111111111111111111111111111111111111111111111111
373
- resource_size: e2b-standard
374
- durable_snapshot_ref: prepared-state-catalog/checkout@sha256:2222222222222222222222222222222222222222222222222222222222222222
375
- compatibility_group_id: checkout-prod-v3
376
- source_cut_ref: production-cut-catalog/checkout-state-2026-08-01
377
- artifact_digest_refs: [artifact-catalog/checkout@sha256:3333333333333333333333333333333333333333333333333333333333333333]
378
- config_digest_refs: [config-catalog/checkout@sha256:4444444444444444444444444444444444444444444444444444444444444444]
379
- evidence_ids: [ev-prepared-checkout-source]
380
- cold_preparation:
381
- steps:
382
- - id: cold-prepare-checkout-state
383
- kind: restore-seed-capture-quiesce-and-snapshot
384
- subject_ids: [orders-db, order-events, payments-api]
385
- capability_evidence_ids: [ev-cold-prepare-checkout]
386
- depends_on_step_ids: []
387
- produces_prepared_state_ids: [prepared-checkout-source]
388
- latency_basis: measured
389
- planned_typical_ms: 900000
390
- planned_high_ms: 2400000
391
- refresh:
392
- strategy: on-source-cut-change
393
- max_age_seconds: 300
394
- freshness_evidence_ids: [ev-checkout-refresh-policy]
395
- planned_typical_critical_path_ms: 900000
396
- planned_high_critical_path_ms: 2400000
397
- hot_launch:
398
- consumes_prepared_state_ids: [prepared-checkout-source]
399
- steps:
400
- - id: hot-fork-checkout-wave
401
- kind: parallel-generated-case-universe-fork-wave
402
- subject_ids: [prepared-checkout-source]
403
- capability_evidence_ids: [ev-hot-fork-checkout-wave]
404
- depends_on_step_ids: []
405
- latency_basis: measured
406
- planned_typical_ms: 987
407
- planned_high_ms: 1200
408
- - id: hot-inject-checkout-commit
409
- kind: inject-arbitrary-verification-commit
410
- subject_ids: [checkout-image]
411
- capability_evidence_ids: [ev-hot-inject-checkout-commit]
412
- depends_on_step_ids: [hot-fork-checkout-wave]
413
- latency_basis: measured
414
- planned_typical_ms: 1000
415
- planned_high_ms: 1500
416
- - id: hot-start-checkout
417
- kind: start-and-probe-readiness
418
- subject_ids: [checkout-http-role]
419
- capability_evidence_ids: [ev-hot-start-checkout]
420
- depends_on_step_ids: [hot-inject-checkout-commit]
421
- latency_basis: measured
422
- planned_typical_ms: 2000
423
- planned_high_ms: 3000
424
- arbitrary_verification_commit_injection:
425
- supported: true
426
- step_id: hot-inject-checkout-commit
427
- production_recipe_equivalence_evidence_ids: [ev-checkout-image-ci]
428
- fresh_universe_per_generated_case:
429
- enforced: true
430
- step_id: hot-fork-checkout-wave
431
- parent_write_protected: true
432
- achieved_generated_case_fanout: 8
433
- latency_basis: measured
434
- planned_typical_critical_path_ms: 3987
435
- planned_high_critical_path_ms: 5700
436
- observed_end_to_end_p95_ms: 5000
437
- probe_evidence_ids: [ev-hot-checkout-path-probe]
438
- readiness:
439
- status: hot-path-proven
440
- scope: real-production
441
- ```
442
-
443
- Every final runtime role, resource, and external dependency has a nonempty
444
- operational `kind` and a proof-complete identity tuple. Final arrays never use `trace_status: census-only`.
445
- Downstream activation, role reachability,
446
- backing-state, or materialization uncertainty remains explicit and keeps
447
- closure partial, but does not withhold an exact identity. The identity retains exact deployment unit, logical
448
- state key, object, operation, or interaction keys rather than a prose family
449
- label. Each runtime role has a unique `deployment_unit_identity_key`, an allowed
450
- `deployment_control_kind`, and an exact `deployment_control_token` naming the
451
- orchestration or host controller that independently restarts it. A thread,
452
- forked child, generic process, or container inside another deployment unit is
453
- not a role merely because it can fail or restart internally. Allowed controls
454
- also include `operator-launched-longrun` for an exact packaged command that
455
- stays alive for an operator/user session, and
456
- `application-supervised-process` for a child with an exact independent
457
- spawn/stop/restart handle. Each
458
- external dependency additionally sets `interaction_direction` to `outbound`,
459
- `inbound-required`, `bidirectional`, or `host-mediated`.
460
-
461
- Every full resource identity also repeats the logical census row's exact
462
- `source_owner_identity_key`, `materialization_root_identity_key`, and nonempty
463
- unique `key_components`; it adds an allowed `state_unit_kind`, exact unique
464
- `address_token`, exact `reproduction_token`, and an allowed
465
- `reproduction_operation_kind`. The reproduction token differs from the address
466
- and materialization-root tokens and names a real independent copy, restore,
467
- rebuild, reset, preserve, provision, mount, install, write, initialize, build,
468
- embed, generate, migrate, or pin operation. An exact application write such as a named `setItem`, `WriteFile`, or
469
- object `Put`, or an exact generate/build/embed/install/migrate operation, proves
470
- the logical state identity it creates. Cross-environment restore readiness is a
471
- separate materialization claim. A mount proves parent capacity only: it cannot
472
- make a parent `canonical-durable` resource unless source proves independently
473
- preserved content belonging to that parent itself.
474
- These tokens are never
475
- placeholders. A final row may use `reproduction.strategy: unresolved` only
476
- while the matching category remains partial and names that exact frontier; it
477
- can never support complete closure. Atomic
478
- state-owner evidence supports all four owner/root/address/reproduction tokens.
479
- Every full external
480
- identity records an exact unique `operation_identity_key`, exact source owner,
481
- exact effectful-call or listener `operation_token`, allowed
482
- `boundary_contract_kind`, direction, and
483
- nonempty unique `key_components`. It also records `boundary_trace` as `direct`
484
- or `wrapper-resolved`, with a concrete application `callsite_identity_key`,
485
- exact callsite and boundary tokens, and every wrapper token for a resolved
486
- chain. Generic helper definitions are discovery surfaces, not final operation
487
- identities. Family labels, client names, providers, and
488
- transport names alone are not stable operation or destination schemas. A
489
- constructor, factory, configuration setter, wrapper, or flow label is not an
490
- effectful operation token.
491
-
492
- Runtime roles are resolved by independently restartable deployment unit, not
493
- merely binary, command, container, or artifact. Independently deployed
494
- long-running server, worker, scheduler, consumer, maintenance, watch, scheduled,
495
- injected, sidecar, and host-managed units remain separate roles even when they
496
- share an executable. Setup, init, migration, configuration, and start commands
497
- that prepare the same unit are not extra roles.
498
- A separately launched database, cache, broker, or search process is also a
499
- runtime role for its exact launch unit and remains a separate stateful resource
500
- for its reproduced state. A shipped browser application is a
501
- `host-managed-unit` when source proves its exact document/build entrypoint and
502
- production serving or packaging path. A missing compiled bundle in retained
503
- source does not erase that browser-host lifecycle boundary.
504
-
505
- Exact HTTP/RPC/socket calls between mapped runtime roles remain operational
506
- dependencies with `boundary_contract_kind: mapped-role-operation`; their
507
- placement affects later routing but not their source operation identity. For
508
- inbound services, retain both the listener and one
509
- `required-inbound-operation` per exact method/message plus route, topic,
510
- command, or protocol operation. Merge only exact aliases of the same structured
511
- operation.
512
-
513
- ### Scope and production authority
514
-
515
- `application.scope_status` is `confirmed` or `provisional`. It is `confirmed`
516
- only when an authoritative source controls or resolves the selected live
517
- production scope. A confirmed map has a nonempty
518
- `selected_production_scope`; a provisional map keeps that field exactly `null`
519
- and must be blocked. Every authoritative source has nonempty `kind`,
520
- `availability: present`, a recognized `environment_scope`, one of the declared
521
- `authority_class` values, and nonempty `evidence_ids`. The
522
- `repository_proven_topology` mapping is always present with recognized
523
- environment and fidelity values plus nonempty evidence.
524
-
525
- For this contract, live authority is a bounded attestation Haystack obtains
526
- under access the customer grants it directly. The
527
- `live-production-control-plane` authority class does not authorize the agent to
528
- hold a production role, call that control plane, or receive its raw resource
529
- identities.
530
-
531
- `application.evaluation_mode` is `real-production` or `synthetic`. A confirmed
532
- real-production map requires an authoritative source with
533
- `authority_class: live-production-control-plane`. A confirmed synthetic map
534
- requires `authority_class: user-authorized-synthetic-evaluation` and uses
535
- `materialization_plan.readiness.scope: synthetic-evaluation`. Synthetic
536
- authority and measurements cannot establish a real-production scope or
537
- readiness claim.
538
-
539
- Use these `environment_scope` values:
540
-
541
- - `hosted-production`
542
- - `production-reference`
543
- - `self-host-reference`
544
- - `local-development`
545
- - `example`
546
- - `unknown`
547
-
548
- Use a `fidelity_ceiling` no higher than the best authority:
549
-
550
- - `exact-production-deployment`
551
- - `production-reference-only`
552
- - `self-host-reference-only`
553
- - `local-development-only`
554
- - `unknown`
555
-
556
- Authority has two independent axes, and a map records them separately.
557
-
558
- *Scope authority* answers "which live deployment is this?". Without it the map is
559
- `provisional` and takes the compact receipt below.
560
-
561
- *Inventory authority* answers "what is in it?". A deployment catalog often resolves
562
- the hosted scope and approves a destination while declining to enumerate
563
- resources, edges, config refs or integrations, because their deployment tooling
564
- has no resource inventory to return. That is an ordinary position, not a failure,
565
- and it does **not** make the map provisional.
566
-
567
- To record it, keep `scope_status: confirmed` and add the withheld groups to
568
- `missing_authoritative_sources` with `required_for: complete-bounded-inventory`.
569
- Entries carrying that exact value are inventory-authority gaps and leave the map
570
- confirmed; any other `required_for` is treated as a scope-authority gap and
571
- forces the provisional profile. Alongside them, a confirmed map may carry an
572
- `access_request` naming only the withheld groups — a non-empty subset of the
573
- seven, rather than all of them.
574
-
575
- Resources whose bindings the catalog withheld retain their exact final identity
576
- with `reproduction.strategy: unresolved`, while state closure remains partial
577
- and blocks on the missing binding. The map then says the true thing: the scope
578
- is known, the inventory is partial, and here is exactly what is missing.
579
-
580
- If *scope* authority is private or external, keep discovering and still record
581
- the repository-evidenced inventory; withhold confirmation, not content. Set
582
- `scope_status: provisional`, leave `selected_production_scope: null`, terminate
583
- at the `inventory-complete` phase, and emit one precise access request. Reserve
584
- `phase: authority-gate` and the compact `scaffold-provisional-universe` receipt
585
- for the case where the repository evidences no topology at all:
586
-
587
- ```yaml
588
- application:
589
- id: commerce-platform
590
- requested_scope: production-checkout
591
- selected_production_scope: null
592
- scope_status: provisional
593
- evaluation_mode: real-production
594
- production_basis:
595
- repository_proven_topology:
596
- environment_scope: self-host-reference
597
- fidelity_ceiling: self-host-reference-only
598
- evidence_ids: [ev-self-host-compose]
599
- authoritative_sources: []
600
- missing_authoritative_sources:
601
- - id: missing-hosted-production-deployment
602
- kind: private-deployment-service-catalog
603
- required_for: resolve-selected-hosted-scope
604
- status: unavailable-in-repository
605
- evidence_ids: [ev-hosted-deployment-private]
606
- access_request:
607
- id: request-hosted-deployment-catalog
608
- access: read-only
609
- source: haystack-replication-service
610
- fields:
611
- - selected-application-id-and-environment-id
612
- - approved-replica-destination-policy-and-approval-ref
613
- - bounded-resource-kinds-opaque-catalog-handles-and-dependency-edges
614
- - artifact-runtime-and-non-secret-config-opaque-catalog-refs
615
- - external-integration-kinds-and-secret-reference-names
616
- - replica-capabilities-strategies-consistency-freshness-latency-and-cost-bounds
617
- - replica-only-golden-descriptor-and-lease-reference-contract
618
- reason: authorize-replica-plan-summary
619
- ```
620
-
621
- The first two groups are selected or approved by the customer in its local CLI.
622
- The remaining groups are bounded outputs Haystack resolves. They never
623
- contain production roles, credentials, raw provider IDs,
624
- direct endpoints, or secret values. The last group requests the schema and
625
- policy for later replica-only references, not a production credential or a
626
- lease before materialization. Exact stable source/replica identities that a
627
- later bounded protocol response uses for alias and isolation validation are
628
- transient and are not fields in this checked-in access request.
629
-
630
- Do not invent a scope such as `hypothetical-hosted-production`. Keep self-host,
631
- dev, hobby, and example topology compact under `alternate_topologies`.
632
-
633
- When authority is missing and the repository evidences no topology at all,
634
- stop after the authority gate. Defer the repository-only closure audit because
635
- closure is partial, and do not launch the full production reviewer. Target at
636
- most 60 seconds to synthesize and validate the three compact artifacts. Write a
637
- strict JSON input in private scratch and run:
638
-
639
- ```bash
640
- haystack skills scaffold-provisional-universe --input <scratch-input.json>
641
- ```
642
-
643
- If the repository does evidence topology, continue repository discovery. A
644
- repository-only closure audit may prepare the isolated snapshot and run without
645
- production authority; the production reviewer remains deferred. Use the compact
646
- scaffold only for the truly empty partial receipt.
647
-
648
- Use this input shape. All IDs are supplied explicitly; never derive or join them
649
- from free text. Evidence sources in this authority-gate profile are repository
650
- paths with structured anchors. Add `budget.overrunBlockerIds` only for the exact
651
- budget paths that exceeded their limits.
652
-
653
- `budget.overrunBlockerIds` is an **object**, not a list. It has exactly two
654
- optional keys, each holding the stable ID of the `kind: budget-exhausted` blocker
655
- for that path:
656
-
657
- ```json
658
- "overrunBlockerIds": {
659
- "primaryDiscovery": "blocker-primary-discovery-budget-exhausted",
660
- "authorityGate": "blocker-authority-gate-budget-exhausted"
661
- }
662
- ```
663
-
664
- Include `primaryDiscovery` if and only if `budget.primaryDiscovery` exceeded its
665
- 48-call or 900-second limit, and `authorityGate` if and only if
666
- `budget.authorityGate` exceeded its 6-call or 60-second limit. Supplying a key for
667
- a path that stayed within limits is rejected, and so is omitting one for a path
668
- that did not. Omit the whole object when neither path overran.
669
-
670
- ```json
671
- {
672
- "sourceCommit": "0123456789abcdef0123456789abcdef01234567",
673
- "application": {
674
- "id": "commerce-platform",
675
- "requestedScope": "production-checkout",
676
- "evaluationMode": "real-production"
677
- },
678
- "repositoryTopology": {
679
- "id": "commerce-repository-census",
680
- "environmentScope": "production-reference",
681
- "fidelityCeiling": "unknown",
682
- "evidenceIds": ["ev-topology-presence-census"],
683
- "topologyPresenceCensus": {
684
- "status": "no-production-capable-topology",
685
- "subjectId": "commerce-repository-census",
686
- "inspectedSurfaceKinds": [
687
- "runtime-entrypoints",
688
- "package-workspace-manifests",
689
- "container-descriptors",
690
- "deployment-descriptors",
691
- "structured-capability-indexes"
692
- ],
693
- "productionCapableSurfaceCount": 0,
694
- "evidenceIds": ["ev-topology-presence-census"]
695
- }
696
- },
697
- "missingAuthority": {
698
- "id": "missing-hosted-production-deployment",
699
- "kind": "haystack-replication-service",
700
- "requiredFor": "authorize-bounded-hosted-replica-plan",
701
- "status": "unavailable-in-repository",
702
- "evidenceIds": ["ev-hosted-deployment-private"]
703
- },
704
- "accessRequest": {
705
- "id": "request-hosted-deployment-catalog",
706
- "source": "haystack-replication-service",
707
- "reason": "authorize-replica-plan-summary"
708
- },
709
- "evidence": [
710
- {
711
- "id": "ev-topology-presence-census",
712
- "subjectIds": ["commerce-repository-census"],
713
- "assertion": "The required census found no repository-controlled production-capable topology.",
714
- "environmentScope": "production-reference",
715
- "authority": "indicative",
716
- "confidence": "strong",
717
- "claimKind": "topology-presence-census",
718
- "sources": [
719
- {
720
- "path": "README.md",
721
- "anchor": "bounded-package-scope",
722
- "kind": "repository-documentation",
723
- "locatorKind": "exact-snippet"
724
- }
725
- ]
726
- },
727
- {
728
- "id": "ev-hosted-deployment-private",
729
- "subjectIds": ["commerce-platform", "missing-hosted-production-deployment"],
730
- "assertion": "The hosted deployment authority is external to this repository.",
731
- "environmentScope": "hosted-production",
732
- "authority": "indicative",
733
- "confidence": "strong",
734
- "sources": [
735
- {
736
- "path": ".github/workflows/deploy.yml",
737
- "anchor": "jobs.deploy.uses",
738
- "kind": "manifest-key",
739
- "locatorKind": "manifest-key"
740
- }
741
- ]
742
- }
743
- ],
744
- "coverage": {
745
- "scannedRoots": [".github/workflows", "docs", "packages"],
746
- "sourceKinds": ["repository-documentation", "package-workspace-manifests"]
747
- },
748
- "budget": {
749
- "primaryDiscovery": {
750
- "repositoryInspectionCallsUsed": 5,
751
- "elapsedSeconds": 43
752
- },
753
- "authorityGate": {
754
- "repositoryInspectionCallsUsed": 5,
755
- "elapsedSeconds": 43
756
- }
757
- },
758
- "authorityBlocker": {
759
- "id": "blocker-hosted-production-authority",
760
- "kind": "missing-authoritative-source",
761
- "evidenceIds": ["ev-hosted-deployment-private"]
762
- }
763
- }
764
- ```
765
-
766
- The command emits exactly the seven fixed read-only access-request field groups
767
- shown above, required empty inventory lists, exact budget accounting, deferred
768
- reviewer, SHA-256 artifact digests, and validator revision. It refuses to
769
- overwrite an existing artifact directory. Use this minimal `review.yml` as the
770
- rendered profile for the compact `authority-gate` receipt. A map with
771
- repository-evidenced inventory terminates at `inventory-complete`; it records a
772
- completed repository-only closure audit if all three categories are complete,
773
- or the same short deferral when any category remains partial. Neither case
774
- instantiates the full production reviewer schema. Omit its protocol fields and
775
- reviewer-phase lists:
776
-
777
- ```yaml
778
- version: 1
779
- inventory_closure_audit:
780
- status: deferred
781
- reason: inventory-closure-partial
782
- reviewer:
783
- status: deferred
784
- reason: production-authority-required
785
- budget:
786
- primary_discovery:
787
- call_limit: 48
788
- elapsed_limit_seconds: 900
789
- repository_inspection_calls_used: 6
790
- elapsed_seconds: 48
791
- authority_gate:
792
- call_limit: 6
793
- elapsed_limit_seconds: 60
794
- repository_inspection_calls_used: 6
795
- elapsed_seconds: 48
796
- termination:
797
- reason: missing-production-authority
798
- phase: authority-gate
799
- validation:
800
- command: haystack skills validate-universe --json
801
- status: passed
802
- validator_contract_revision: 39
803
- status: blocked
804
- blocking_items:
805
- - id: blocker-hosted-production-authority
806
- kind: missing-authoritative-source
807
- evidence_ids: [ev-hosted-deployment-private]
808
- ```
809
-
810
- The compact receipt defers its repository-only audit because every closure
811
- category is partial. A repository-evidenced provisional map may instead record
812
- a completed repository-only audit, and must do so before claiming all three
813
- categories complete. The only provisional blockers are `missing-authoritative-source` or
814
- `production-authority-access-required`. If recorded usage exceeds a limit, add
815
- the required exception as `kind: budget-exhausted` with `budget_path` set to
816
- `budget.primary_discovery` or
817
- `budget.primary_discovery.authority_gate`. Never add reviewer availability,
818
- snapshot, quota, or isolation blockers before production authority is
819
- available.
820
-
821
- ### Artifacts and exact source
822
-
823
- For source-changeable application artifacts,
824
- set `verification_subject: source-changeable`.
825
- `verification_commit.source_incorporation.status` and
826
- `production_recipe_equivalence.status` are each `proven` or `unproven`.
827
- Source incorporation needs a commit-specific build, source mount, or immutable
828
- digest tied to the commit. Recipe equivalence needs evidence that the same
829
- builder, flags, generated inputs, and packaging path used for production are
830
- used for verification.
831
-
832
- The aggregate `verification_commit.status` is `proven` only when both claims
833
- are proven. Otherwise use `unproven` or `bypasses-commit` and add a blocker.
834
- Starting a prebuilt image does not prove either claim.
835
-
836
- A fixed infrastructure artifact can use:
837
-
838
- ```yaml
839
- verification_subject: pinned-infrastructure
840
- verification_commit:
841
- status: proven
842
- source_incorporation:
843
- status: not-applicable
844
- reason: pinned-infrastructure-artifact
845
- production_recipe_equivalence:
846
- status: exempt-pinned-infrastructure
847
- immutable_artifact_ref: artifact-catalog/postgres-16
848
- configuration_source_ref: config-catalog/orders-postgres
849
- evidence_ids: [ev-postgres-prod-identity]
850
- ```
851
-
852
- The refs are opaque catalog references, not raw provider IDs. The exemption is
853
- invalid for application code or mutable generated artifacts. The validator
854
- rejects the exemption unless `verification_subject` is explicitly
855
- `pinned-infrastructure`.
856
-
857
- ### Prepared state and hot launch
858
-
859
- `materialization_plan` separates slow, ahead-of-time preparation from the warm
860
- request path. `verifier_total_slo_ms` covers case generation, hot launch,
861
- execution, and aggregation. `target_slo_ms` is only the hot-launch allocation
862
- and must be strictly smaller; `reserved_case_work_ms` is their difference.
863
- `generated_case_fanout.target_n` is selected for this application.
864
- `hard_max_n` is an explicit bound and cannot exceed the product ceiling of 64.
865
-
866
- Cold preparation is run by Haystack. Its
867
- customer-local provider drivers install production-derived dependencies once,
868
- seed and quiesce state, remove credentials and egress, and produce a durable
869
- exact prepared-state identity. Haystack receives the bounded plan summary,
870
- including the protocol's exact stable source/replica identities for alias and
871
- isolation validation, and opaque replica catalog refs for checked-in bindings.
872
- It receives no provider operations, credentials, deletion handles, or direct
873
- control-plane connectivity.
874
- The identity resolves a declared `workload_profiles` ID and
875
- `compatibility_groups` ID, and binds the exact template catalog reference and
876
- resource size, durable replica snapshot, production cut, artifact digests, and
877
- config digests. Its evidence must name the prepared-state ID explicitly. Its
878
- refresh policy states how stale the prepared state may become. Cold work may
879
- take minutes; it does not consume the on-demand budget when the required fresh
880
- prepared state already exists.
881
-
882
- Hot launch consumes that state through bounded-TTL replica leases and creates
883
- one fresh writable universe for each pertinent generated case. Lease grants
884
- contain credential references resolved by the sandbox broker, never credential
885
- values, and target replica resources only. Every run is keyed by exact
886
- `generated_case_id`, `sandbox_id`, and `universe_incarnation_id`; each value is
887
- unique in the wave. Fork, attach, and execute phases run in parallel. On partial
888
- failure, release all attempted attachments before revoking all attempted leases
889
- under the same absolute deadline. Record the step that injects an arbitrary
890
- verification commit using the production-equivalent recipe; a pinned deployed
891
- image alone is insufficient. Record measured generated-case fanout and
892
- end-to-end hot p95 independently of the per-step estimates.
893
-
894
- Two fields inside `materialization_plan` are required whenever the plan is
895
- present, including when `readiness` is `blocked`, and are easy to miss because
896
- they appear only in the fully-proven example above:
897
-
898
- - every `cold_preparation.steps[]` entry carries `produces_prepared_state_ids`,
899
- naming the prepared states that step yields (`[]` when it yields none); and
900
- - `hot_launch.achieved_generated_case_fanout` records the measured fanout, or
901
- `0` when nothing has been measured yet.
902
-
903
- Omit `materialization_plan` entirely rather than inventing values for it.
904
-
905
- Current repository truth is limited: the bounded customer-replica protocol,
906
- binding store, connector lifecycle, sandbox relay, and generated-case
907
- request/execution contracts exist. The default hosted generated-case path still
908
- fails closed until reviewed runtime composition and principal-level network
909
- isolation are production-qualified. The first S3 copy driver is
910
- SDK-unit-qualified but not live cross-account qualified. The generic
911
- deny-by-default interaction replica and stateful Stripe PaymentIntent behavior
912
- emulator exist, but their production-template and control-plane startup wiring
913
- remains pending. Provider discovery and end-to-end provider materialization
914
- also remain pending. Do not promote readiness beyond `proposal` or `blocked`
915
- from these implementation facts alone.
916
-
917
- Both phases are stable-ID DAGs. Each step has integer `planned_typical_ms` and
918
- `planned_high_ms` inputs. Sum each planning input along serial dependencies and
919
- take the maximum parallel path as `planned_typical_critical_path_ms` and
920
- `planned_high_critical_path_ms`. These are deterministic planning estimates:
921
- the first is not a true expected makespan, and the second is not an observed or
922
- statistical phase p95. Only `hot_launch.observed_end_to_end_p95_ms`, linked to
923
- authoritative `probe_evidence_ids`, is an observed hot p95.
924
-
925
- For `hot-path-proven`, the union of `subject_ids` across every cold and hot step
926
- must include every mapped artifact, runtime role, resource, and external
927
- dependency by exact stable ID. Each mapped artifact must have
928
- `verification_commit.status: proven`. Each resource and external dependency
929
- must have a concrete reproduction strategy rather than `unresolved`, with the
930
- strategy-specific capability evidence and, for physical copies, the exact
931
- resolved opaque binding required by this contract. This is the mechanical form
932
- of the production-replication gate: a measured partial launch cannot silently
933
- omit behavior-affecting inventory.
934
-
935
- Readiness is independent of inventory review:
936
-
937
- - `proposal`: the plan is structurally mapped but capabilities may be declared.
938
- - `cold-preparable`: cold steps and freshness are adapter-verified.
939
- - `hot-path-proven`: the hot path is materialization-probed, supports at least
940
- `generated_case_fanout.target_n` without exceeding `hard_max_n`, injects an
941
- arbitrary verification commit, enforces one fresh writable universe per
942
- generated case, and fits `target_slo_ms`. Its typed probe record must link the
943
- observed p95, achieved generated-case fanout, exact case/sandbox/incarnation
944
- IDs, exercised commit, parallel phases, parent protection, single deadline,
945
- and complete ordered cleanup.
946
- - `blocked`: include a nonempty reason.
947
-
948
- The subject-coverage and concrete-route gate applies only to
949
- `hot-path-proven`. A complete inventory review may still pass while readiness
950
- is `proposal`; that separation must not be represented as a materialization
951
- proof.
952
-
953
- Use `readiness.scope: synthetic-evaluation` for a synthetic qualification.
954
- Its probe evidence uses `environment_scope: production-reference`. A
955
- real-production proof instead requires authoritative `hosted-production` probe
956
- evidence from a typed Haystack or provider materialization-probe result catalog;
957
- repository-local or synthetic measurements never qualify.
958
-
959
- ### Census-only inventory rows
960
-
961
- Inventory presence and semantic closure are separate claims. Under a partial
962
- category, a repository-proven runtime role, stateful resource, or external
963
- dependency may be retained before activation, consumer, ownership, state, and
964
- reproduction decisions finish. Use this exact compact shape:
965
-
966
- Unresolved discovery observations remain in `evidence.yml`, never in final
967
- inventory arrays. Retain each exact source surface under
968
- `coverage.operational_surface_census`, add its stable closure candidate, keep
969
- the category partial, and name it in `uncovered` and a blocker. For example:
970
-
971
- ```yaml
972
- coverage:
973
- operational_surface_census:
974
- status: partial
975
- surfaces:
976
- - id: surface-notification-worker
977
- category: runtime_roles
978
- surface_kind: runtime-entrypoint
979
- frontier: deployment-runtime-units
980
- identity_key: apps/notifications/worker.ts#startNotificationWorker
981
- disposition: candidate
982
- candidate_id: candidate-notification-worker
983
- evidence_ids: [ev-notification-worker-census]
984
- inventory_closure:
985
- runtime_roles:
986
- status: partial
987
- candidates:
988
- - id: candidate-notification-worker
989
- disposition: pending
990
- unresolved: [deployment-control-token]
991
- evidence_ids: [ev-notification-worker-census]
992
- uncovered: [candidate-notification-worker]
993
- ```
994
-
995
- Final `services[].runtime_roles`, `resources`, and `external_dependencies` rows
996
- require a proof-complete category identity tuple and never use
997
- `trace_status: census-only`. Registry or manifest presence must still prove a
998
- real production-capable surface; a package import, test fixture, documentation
999
- mention, or arbitrary URL is not inventory evidence. Admit a runtime identity
1000
- when its unit, controller kind/token, and entrypoint are exact; a state identity
1001
- when its owner, address, reproduction kind/token are exact; and an external
1002
- identity when its callsite, wrapper chain, boundary leaf, operation key, and
1003
- destination/scope are exact. Activation, consumer reachability, backing state,
1004
- hosted authority, and materialization readiness may remain unresolved on the
1005
- final row while closure stays partial.
1006
-
1007
- When consumer or activation tracing remains open, use `activation: optional`
1008
- with `activation_basis.kind: unknown-production-state`,
1009
- `runtime_role_ids: []`, and `consumer_edges: []`, then keep the category
1010
- partial. This is an honest downstream unknown, not a claim that the exact
1011
- identity is inactive. External remote ownership may likewise use the unresolved
1012
- `backing_state` form while state closure remains partial.
1013
-
1014
- ### Resources and reproduction
1015
-
1016
- Use exactly one `state_classification`:
1017
-
1018
- - `canonical-durable`: authoritative mutable business state.
1019
- - `derived-rebuildable`: indexes or projections rebuildable from canonical
1020
- state, with the rebuild path evidenced.
1021
- - `ephemeral-coordination`: locks, sessions, presence, and coordination state.
1022
- - `in-flight-work`: queues, streams, retry backlogs, and scheduled work not yet
1023
- applied to canonical state.
1024
- - `immutable-external-asset`: immutable bytes or models obtained outside the
1025
- application and pinned by identity.
1026
-
1027
- Classification alone is insufficient. Add `state_policy` with these rules:
1028
-
1029
- - `canonical-durable` uses `action: copy`.
1030
- - `derived-rebuildable` uses `action: rebuild` and nonempty
1031
- `source_resource_ids` that resolve to the source of truth.
1032
- - `ephemeral-coordination` uses `action: reset`.
1033
- - `in-flight-work` uses `action: preserve`, `drain`, or `discard`, plus a
1034
- nonempty `rationale` that addresses accepted but unapplied work.
1035
- - `immutable-external-asset` uses `action: pin` plus an opaque
1036
- `immutable_asset_ref` and evidence of its immutable identity.
1037
-
1038
- `canonical-durable` may never use `reproduction_operation_kind: mount`. A
1039
- volume, bind mount, `VOLUME`, or directory declaration proves writable parent
1040
- capacity, not preservation of independently keyed durable children. Record the
1041
- exact child identities created or restored by source operations. Retain the
1042
- parent as a resource only when source proves its own independently preserved
1043
- content identity.
1044
-
1045
- Every resource also has `state_owner.basis` and nonempty `evidence_ids`. The
1046
- referenced decision-grade atomic `state-owner-boundary` claim has the resource
1047
- as its exact subject set, repeats the basis in `state_owner_basis`, and records
1048
- the matching typed operations in `state_owner_operation` and
1049
- `reproduction_operation_kind`. The latter exactly matches the resource
1050
- identity and the source tokens prove the real reproduction operation, not only
1051
- its address or configuration:
1052
-
1053
- - `application-persistence-boundary` / `open-read-write` identifies the code
1054
- that opens, loads, or writes application state;
1055
- - `repository-declared-mutable-state` / `named-mutable-namespace` identifies
1056
- exact mutable tables, objects, topics, schemas, catalogs, identities,
1057
- policies, registrations, or keys;
1058
- - `operator-provisioned-writable-capacity` / `mount-or-path-provision`
1059
- identifies separately provisioned writable capacity; and
1060
- - `immutable-asset-identity` / `immutable-digest-or-version` is reserved for
1061
- `immutable-external-asset`; and
1062
- - `repository-proven-remote-state` / `named-remote-read` or
1063
- `named-remote-write` identifies an exact typed durable operation on a named
1064
- remote namespace in repository implementation code; and
1065
- - `authoritative-catalog-state-owner` /
1066
- `catalog-declared-mutable-resource` uses an opaque authoritative catalog
1067
- source and `authority: authoritative` when repository code cannot establish
1068
- the hosted state owner.
1069
-
1070
- Client construction, endpoints, plugin/factory registration, provider names,
1071
- generic API response sets, and discovery target groups do not prove any of these
1072
- operations. A typed operation on the exact remote namespace can prove the
1073
- repository remote-state basis. An exact read of an addressed configuration
1074
- document, workload/instance metadata object, discovery record, identity or
1075
- policy document, catalog, or remote manifest is a `named-remote-read` when its
1076
- fields select topology, identity, routing, or runtime behavior that reproduction
1077
- must preserve; read-only provider ownership does not erase that state concern.
1078
- A resource still needs its independent `state_policy` and
1079
- `reproduction` action. Each `derived-rebuildable` source additionally appears
1080
- once in `state_policy.source_edges`, with a decision-grade atomic
1081
- `rebuild-source-reachability` claim whose exact subjects are the derived
1082
- resource and that source resource. A resolved ID list without those per-edge
1083
- implementation paths is padding, not rebuild proof. Source resource IDs are
1084
- unique; repeating an ID cannot stand in for another rebuild source.
1085
-
1086
- Apply this taxonomy to resources and state, not to arbitrary external APIs.
1087
-
1088
- Classify by reproduction concern, not network location. A database, directory,
1089
- broker, queue, stream, object store, registry, secret store, model store, or
1090
- search/log index that owns application-relevant state is a `resource`, including
1091
- when a managed provider hosts it. When the application reaches that resource
1092
- over a network protocol or API, also record an `external_dependency`: routing,
1093
- capture/emulation, and production-isolation control are independent of copying
1094
- the state. Local, embedded, in-process, and file-backed resources remain
1095
- resource-only absent separate application egress.
1096
-
1097
- Every external dependency therefore carries `backing_state` with nonempty
1098
- `evidence_ids` and one disposition. At least one referenced decision-grade
1099
- atomic evidence record must jointly name the exact external dependency ID and
1100
- every linked resource ID as its exact `subject_ids`, use a locatable
1101
- implementation-body source, and repeat the final basis in
1102
- `external_backing_basis`. It also repeats the exact `external_operation` and,
1103
- for named state, `remote_state_identity_key`; separate unlinked facts about a
1104
- client and a store do not prove the boundary. The
1105
- `authoritative-catalog-state-owner` basis requires
1106
- `authority: authoritative` and an opaque catalog source:
1107
-
1108
- - `none` means the entry is only an interaction reproduction concern and omits
1109
- `resource_ids`; its `basis` is `interaction-only` or
1110
- `remote-ownership-unproven`.
1111
- - `covered-by-resources` means the interaction fronts application backing state
1112
- and requires nonempty exact `resource_ids` resolving to the corresponding
1113
- stateful resources; its `basis` is `repository-declared-state-owner`,
1114
- `repository-proven-remote-state`, or `authoritative-catalog-state-owner`.
1115
-
1116
- `resource_ids` is an exact set represented without duplicate IDs.
1117
-
1118
- `backing_state.operation` is mandatory and is one of `named-remote-read`,
1119
- `named-remote-write`, `named-remote-read-write`, `stateless-exchange`, or
1120
- `unresolved`. A named operation is valid only with
1121
- `covered-by-resources` and also requires a nonempty exact
1122
- `remote_state_identity_key` naming the addressed object, namespace, or provider
1123
- contract. `none/interaction-only` requires `stateless-exchange` and
1124
- `none/remote-ownership-unproven` requires `unresolved`; those two operations
1125
- omit `remote_state_identity_key`. Classify this operation before the
1126
- disposition so a service client cannot erase the stable response object it
1127
- reads. A remote response becomes mapped backing state only when exact evidence
1128
- also proves an application-owned provision, preserve, reset, restore, replace,
1129
- or recreate operation for that addressed object. Provider metadata, discovery
1130
- records, identity or signing-key documents, downloaded user content, and
1131
- operator-supplied remote inputs remain external interactions when the
1132
- application only consumes them.
1133
-
1134
- The matching claim kind is `state-boundary-link` for
1135
- `covered-by-resources`, `external-interaction-boundary` for
1136
- `none/interaction-only`, and `external-ownership-unresolved` for
1137
- `none/remote-ownership-unproven`. Every resource linked by
1138
- `covered-by-resources` must independently pass its own `state_owner` proof.
1139
-
1140
- A configured endpoint, constructed client, or read operation does not establish
1141
- state ownership or copyability. An exact typed durable operation on a named
1142
- remote namespace may establish `repository-proven-remote-state` only when the
1143
- resource also has a separate application-owned copy/rebuild/reset action.
1144
- Otherwise use `none` with
1145
- `remote-ownership-unproven` and keep stateful-resource closure `partial`; that
1146
- basis records unresolved ownership and cannot support a complete claim.
1147
- `interaction-only` requires evidence that no stable response object relevant to
1148
- application-owned reproduction exists.
1149
- An exact provider interface or factory contract that exposes durable
1150
- create/read/write/delete/list operations over named backups, objects, buckets,
1151
- collections, topics, streams, tables, indexes, identities, policies, or keys is
1152
- a structured state discriminator for every reachable provider entry. Each entry
1153
- creates its own pending state candidate by exact registry identity without
1154
- requiring a repeated host literal or copy of the same interface trace. A
1155
- network/API-backed provider also creates its external-interaction candidate;
1156
- neither becomes final inventory until namespace, consumer, ownership, and
1157
- reproduction semantics close. Join the two pending candidates immediately.
1158
- Once both are closed, the same deterministic pass emits `backing_state:
1159
- covered-by-resources`, links the exact provider-derived resource ID, and adds
1160
- one joint `state-boundary-link` atomic evidence record whose subject set
1161
- contains both IDs.
1162
- Resolve it to `interaction-only` only when evidence establishes that the call
1163
- has no separately reproduced backing state. Repository-selected mutable tables,
1164
- objects, topics, schemas, catalogs, directory identities/groups, authorization
1165
- policies, tenant registrations, and encryption keys do establish a state-owner concern;
1166
- map that state and use `covered-by-resources` for the independently reproduced
1167
- service interaction. Stateless inference, webhook, credential exchange, and
1168
- arbitrary URL calls use `backing_state: none` only when implementation evidence
1169
- shows no retained state relevant to reproduction. Persistent telemetry,
1170
- log/metrics destinations, broker topics, object namespaces, identity/policy/key
1171
- sets, and catalog namespaces remain resources when exact durable operations are
1172
- proven. Ambiguity stays `remote-ownership-unproven`, never silently
1173
- `interaction-only`. Backing-state `none` never means “exclude from egress.”
1174
-
1175
- Top-level external identity follows the exact operation/object contract.
1176
- It has a globally unique exact `operation_identity_key`, exact
1177
- `operation_token`, and `boundary_contract_kind` equal to
1178
- `outbound-operation-family`, `host-operation`, `required-inbound-listener`,
1179
- `required-pull-listener`, or `bidirectional-operation-family`. Its atomic
1180
- boundary evidence supports the exact operation token.
1181
- That same atomic claim supports the concrete callsite token, every wrapper token
1182
- for `wrapper-resolved`, and the leaf boundary token. An import, constructor,
1183
- method declaration, local handle lookup, quoted command argument, or generic HTTP helper definition is
1184
- not callsite proof. Begin from a reachable production consumer and follow its
1185
- exact wrapper chain to the boundary.
1186
- Different provider, scheme, or transport implementations of the same contract
1187
- remain visible in selector registries but do not create duplicate operational
1188
- rows. OS branches, wrappers, and consumers that invoke the same semantic call
1189
- also merge. Different effectful operations remain distinct even when they share
1190
- one client, provider, object family, or user flow. For example list,
1191
- head/metadata, get/download, put/upload, copy, and delete are separate reachable
1192
- object-store contracts; authorization redirect, token exchange, user-info,
1193
- supplemental-data, signing-key, and content-download calls are likewise separate
1194
- when present. A separately opened callback or redirect listener is its own
1195
- required inbound contract. Required inbound clients, pull consumers, host
1196
- services, registries/discovery services, and bidirectional peers are external
1197
- reproduction interactions when exact source or topology evidence makes them
1198
- necessary; interaction direction is not limited to application-opened egress.
1199
- Runtime-invoked one-shot executables are also external dependencies when they
1200
- cross the mapped application-runtime boundary. Managed child RPC wholly inside
1201
- one mapped runtime remains internal.
1202
-
1203
- Every final external row requires an exact boundary-crossing operation. Client
1204
- constructors, authentication/configuration modes, protocol or scheme variants,
1205
- local polling timers, retry loops, and wrappers that only build or call child
1206
- handlers remain selector entries and do not become duplicate top-level
1207
- dependencies. Their category projections are not applicable unless that exact
1208
- branch performs its own independently addressed operation. Candidate identity
1209
- is derived from the exact operation, object, and destination contract—not from
1210
- the selector key or a requirement that every registry entry have a candidate.
1211
- Host-operation rows represent one semantic effect family; do not bundle
1212
- unrelated filesystem, environment, process, and subprocess calls.
1213
-
1214
- Configuration inputs already represented by clone injection, generated logs
1215
- and outputs, child scratch/lock files, and replaceable assets are not state
1216
- resources unless their initial contents need a separate reproduction action.
1217
- However, separately provisioned writable capacity remains a resource when a
1218
- selected spill/cache feature requires its own mount or reset action even if the
1219
- contents start empty. Process-local state also remains a resource when required
1220
- behavior needs an explicit post-launch reload or seed action.
1221
-
1222
- For example, a payment-provider API captured as behavior can use `none`; a
1223
- managed database API recorded separately for protocol behavior must use
1224
- `covered-by-resources` and link the database resource. A mapper may not replace
1225
- the resource with the external entry.
1226
-
1227
- Use only these `reproduction.strategy` values:
1228
-
1229
- - `provider-native-fork`
1230
- - `snapshot-restore`
1231
- - `capture-replay`
1232
- - `side-effect-sink`
1233
- - `isolated-equivalent`
1234
- - `unresolved`
1235
-
1236
- Keep physical bindings as top-level stable records. Each logical resource uses
1237
- `physical_binding_id`. Several logical databases, queues, buckets, or keyspaces
1238
- may reference one physical binding without being collapsed into one logical
1239
- record.
1240
-
1241
- `provider-native-fork` and `snapshot-restore` require:
1242
-
1243
- - nonempty `reproduction.capability_evidence_ids`;
1244
- - a resolvable `physical_binding_id`;
1245
- - binding `status: resolved` or `proven`;
1246
- - nonempty binding `evidence_ids`; and
1247
- - a nonempty binding `stable_resource_ref`.
1248
-
1249
- `stable_resource_ref` is an opaque handle Haystack resolves for this
1250
- checked-in artifact. Haystack may resolve it internally to a provider resource, and the bounded plan or golden
1251
- descriptor may separately carry exact identities for validation, but this field
1252
- must never expose a raw provider resource ID, ARN, production endpoint,
1253
- credential, connection string, hostname containing credentials, or secret
1254
- value.
1255
-
1256
- `capture-replay` and `side-effect-sink` require nonempty capability evidence
1257
- and must forbid live egress. Use `side-effect-sink` for outbound effects such
1258
- as SMTP or push delivery that are captured but never replayed. Do not label a
1259
- non-delivering sink as bidirectional capture/replay. `isolated-equivalent`
1260
- requires both capability evidence and a nonempty `fidelity_gap`, for
1261
- example:
1262
-
1263
- ```yaml
1264
- reproduction:
1265
- source: isolated-fixture
1266
- strategy: isolated-equivalent
1267
- fidelity_gap: Does not reproduce provider throttling or regional failover.
1268
- writable: true
1269
- ```
1270
-
1271
- Every ID in `capability_evidence_ids` must resolve to an evidence record with
1272
- `claim_kind: materialization-capability`, `confidence: proven`, the logical
1273
- resource in `subject_ids`, and at least one repository, replication
1274
- catalog, or Haystack-adapter source. Never ingest a direct provider response.
1275
- Evidence that merely proves an SDK client exists is not
1276
- materialization-capability evidence.
1277
-
1278
- Every materialization-capability record also declares:
1279
-
1280
- - `operational_status: declared` for an authoritative catalog statement;
1281
- - `operational_status: adapter-verified` after deterministic adapter
1282
- qualification; or
1283
- - `operational_status: materialization-probed` after a real isolated probe.
1284
-
1285
- Set `latency_basis: assumed` for catalog estimates and `measured` only for
1286
- measurements. Authority over a synthetic assumption may prove that the catalog
1287
- declared it, but it cannot promote the capability to adapter-verified,
1288
- materialization-probed, or real-production readiness.
1289
-
1290
- Use `unresolved` when capability or binding evidence is missing. A blocked
1291
- review does not permit a false concrete fork or snapshot claim.
1292
-
1293
- An interface owned by one role uses `runtime_role_id`; one shared by multiple
1294
- roles uses `runtime_role_ids`. Declare exactly one. Model caches, queues, object
1295
- stores, search indexes, flags, identity, and event or analytics systems
1296
- explicitly. Group state that needs the same production cut.
1297
-
1298
- `canonical-durable` state may instead use `action: copy-with-transform` when the
1299
- bytes are copied but changed on the way into the golden — masking production
1300
- personal data, or re-keying columns encrypted under a production secret. It
1301
- requires a `transform` mapping with `kind` (`mask`, `re-key`, or
1302
- `mask-and-re-key`), a nonempty `rationale`, and a boolean `deterministic`. A
1303
- non-deterministic transform re-randomizes every identity on each golden refresh,
1304
- so cases that pin an identity break on every refresh:
1305
-
1306
- ```yaml
1307
- state_policy:
1308
- action: copy-with-transform
1309
- transform:
1310
- kind: mask-and-re-key
1311
- deterministic: true
1312
- rationale: >-
1313
- Customer email and name columns are format-preserving masked under the
1314
- golden's mask key; columns encrypted with the production application
1315
- secret are re-keyed to the golden's sealed value.
1316
- ```
1317
-
1318
- ### Clone injection
1319
-
1320
- An inventory says what exists. It does not say what a fresh universe needs
1321
- injected in order to boot and behave like production. That material is the
1322
- difference between a parts list and a running system, so `clone_injection` is
1323
- required on every map that records semantically traced inventory, confirmed
1324
- hosted scope or not. The compact authority-gate receipt and maps with no final
1325
- inventory because all discovered candidates remain pending are exempt because
1326
- neither claims that the inventory can yet boot.
1327
-
1328
- It has exactly these eight categories, and each one is answered explicitly:
1329
-
1330
- - `config_slots` — environment variables and config keys per resource
1331
- - `dns_identity` — hostnames and URLs the application must answer to
1332
- - `tls` — certificate, verification, and scheme requirements
1333
- - `filesystem_mounts` — paths that must exist before a process starts
1334
- - `secret_derived_material` — values that other material is derived from
1335
- - `protocol_metadata` — advertised listeners, replica-set names, connection options
1336
- - `runtime_generated_config` — configuration produced at boot or stored in the database
1337
- - `build_time_config` — values frozen into an artifact at build time
1338
-
1339
- Each category is a mapping with `status: declared` and a nonempty `entries`
1340
- list, or `status: none` and a nonempty `reason`. Omitting a category is invalid.
1341
- A category left silent is indistinguishable from one never investigated, and the
1342
- holdout that motivated this section found agents reading a mount command and
1343
- then not recording the mount because no field asked for it.
1344
-
1345
- Every entry carries a stable `id`, nonempty `evidence_ids`, and a `materiality`.
1346
- It may carry `runtime_role_ids`.
1347
-
1348
- `materiality` states what the entry does to the replica, and is one of:
1349
-
1350
- - `boot-required` — the process will not start, or cannot reach a resource,
1351
- without it.
1352
- - `binds-copied-state` — its value must match the production cut the golden was
1353
- sealed from. A fresh value makes copied bytes unreadable or unaddressable.
1354
- - `isolation-control` — it governs whether the replica can reach production
1355
- systems. Getting it wrong causes real-world side effects.
1356
- - `behavioural` — it changes observable behaviour, but the replica still runs.
1357
- - `informational` — a real setting with no replica-relevant effect.
1358
-
1359
- This field exists because coverage alone cannot tell a thorough map from a padded
1360
- one. In one holdout pass a map went from 67 to 440 entries, every declared name
1361
- real, and roughly two thirds of the additions were settings a materializer gains
1362
- nothing from — while the same pass also carried fifteen entries that closed a gap
1363
- no earlier round had closed. Both were true at once and the artifact had no field
1364
- with which a consumer could separate them.
1365
-
1366
- Declare `informational` honestly rather than omitting the entry or inflating its
1367
- class. When the map declares at least one entry, `validate-universe --json`
1368
- reports the mix under
1369
- `summary.clone_injection_materiality`, so a map that is mostly `informational` is
1370
- visible as such to anyone reading the result.
1371
-
1372
- Three rules tie the injection surface to the inventory the map already asserts,
1373
- so the two cannot drift apart:
1374
-
1375
- 1. Every name in a resource's `binding_names` must appear as a `config_slots`
1376
- entry. Those names are how the application is told where the resource lives;
1377
- listing a datastore and not injecting its connection variables produces a
1378
- replica that starts and connects to nothing.
1379
- 2. Every runtime role must appear in at least one `config_slots` entry's
1380
- `runtime_role_ids`. A role nothing configures cannot reach any resource.
1381
-
1382
- Every resource and external dependency carries `activation` plus an
1383
- `activation_basis` with nonempty `evidence_ids`:
1384
-
1385
- - `active` — the selected deployment profile needs the store, or a fixed
1386
- external path is reachable without first supplying configuration or state.
1387
- - `optional` — a concrete gate must first select it. Analytics sinks, secondary
1388
- audit stores, read replicas, configured providers, and tenant-supplied
1389
- destinations are usually optional.
1390
-
1391
- For `active`, `activation_basis.kind` is exactly one of:
1392
-
1393
- - `boot-required`
1394
- - `selected-profile-required`
1395
- - `startup-path`
1396
- - `background-default`
1397
- - `default-request-path`
1398
-
1399
- For `optional`, it is exactly one of:
1400
-
1401
- - `profile-excluded`
1402
- - `feature-flag`
1403
- - `driver-selection`
1404
- - `operator-configuration`
1405
- - `administrator-action`
1406
- - `credential`
1407
- - `tenant-state`
1408
- - `user-supplied-destination`
1409
- - `artifact-excluded`
1410
- - `failure-tolerated`
1411
- - `unknown-production-state`
1412
-
1413
- A fixed destination reached when an ordinary request invokes an already-enabled
1414
- capability may use `default-request-path`. A webhook, remote, provider record,
1415
- or URL supplied by a user or tenant uses `user-supplied-destination` or
1416
- `tenant-state`: that destination does not exist until the state is created.
1417
- Registration, a default endpoint constant, or client construction alone never
1418
- proves an active path. Before marking a path optional, inspect the selected
1419
- artifact's baked and default configuration: a shipped default is active even
1420
- when an operator may override it. Use the proximate selecting gate.
1421
- Operator-supplied URIs and implementation enums use `operator-configuration`;
1422
- driver choices use `driver-selection`; `user-supplied-destination` is reserved
1423
- for destinations supplied by an end user or tenant. Do not use `credential`
1424
- when credentials merely authenticate a path already selected by configuration.
1425
-
1426
- For a resource, ask whether the selected profile boots and serves without the
1427
- store, not how important its data looks. For an external dependency, trace
1428
- whether a fixed destination is reached before any profile, credential,
1429
- administrator, tenant-state, or user-supplied-destination gate. `activation`
1430
- and `state_classification` answer different questions: an append-only analytics
1431
- sink can be genuinely `canonical-durable` and still `optional`. Classify state
1432
- honestly and let `activation` carry the reachability decision; do not downgrade
1433
- a durable store to `derived-rebuildable` just to mark it optional.
1434
-
1435
- 3. Every `activation: active` deployment profile must have at least one runtime
1436
- role declaring it. A profile that runs nothing is an empty shell; record it
1437
- under `alternate_topologies` instead.
1438
-
1439
- `secret_derived_material` additionally requires a `disposition`:
1440
-
1441
- - `seal-with-golden` — the replica must receive the exact value the golden was
1442
- sealed with, because copied bytes are unreadable without it;
1443
- - `scrub-and-reset` — the protected data is cleared or re-keyed during cold
1444
- preparation, so a fresh value is safe;
1445
- - `rotate-freely` — nothing durable depends on the value.
1446
-
1447
- The first two also require nonempty `bound_to_resource_ids` naming the resources
1448
- whose copied bytes depend on the value. This is the binding that prevents a
1449
- materializer from minting a fresh secret and silently rendering copied data
1450
- unreadable.
1451
-
1452
- Clone injection records delivery, not ownership. If an exact stable key,
1453
- certificate, salt, or identity must survive to preserve authentication,
1454
- decryption, or signature behavior, map the corresponding durable or immutable
1455
- identity as a resource too. Use `rotate-freely` only when no copied behavior
1456
- depends on the exact value.
1457
-
1458
- ```yaml
1459
- clone_injection:
1460
- config_slots:
1461
- status: declared
1462
- entries:
1463
- - id: inj-database-url
1464
- name: DATABASE_URL
1465
- runtime_role_ids: [checkout-http-role]
1466
- evidence_ids: [ev-checkout-clients]
1467
- materiality: boot-required
1468
- - id: inj-events-url
1469
- name: EVENTS_URL
1470
- runtime_role_ids: [checkout-http-role]
1471
- evidence_ids: [ev-checkout-clients]
1472
- materiality: boot-required
1473
- dns_identity:
1474
- status: declared
1475
- entries:
1476
- - id: inj-public-url
1477
- name: URL
1478
- evidence_ids: [ev-checkout-routes]
1479
- materiality: isolation-control
1480
- tls:
1481
- status: none
1482
- reason: All datastore connections terminate on a loopback listener inside the sandbox.
1483
- filesystem_mounts:
1484
- status: declared
1485
- entries:
1486
- - id: inj-config-mount
1487
- path: /app/pythonpath
1488
- evidence_ids: [ev-checkout-entrypoint]
1489
- materiality: boot-required
1490
- secret_derived_material:
1491
- status: declared
1492
- entries:
1493
- - id: inj-secret-key
1494
- name: SECRET_KEY
1495
- disposition: seal-with-golden
1496
- bound_to_resource_ids: [orders-db]
1497
- evidence_ids: [ev-orders-column-encryption]
1498
- materiality: binds-copied-state
1499
- protocol_metadata:
1500
- status: none
1501
- reason: Single-endpoint TCP profile; no broker metadata or replica-set identity.
1502
- runtime_generated_config:
1503
- status: none
1504
- reason: All configuration arrives as environment variables at process start.
1505
- build_time_config:
1506
- status: declared
1507
- entries:
1508
- - id: inj-asset-manifest
1509
- name: manifest.json
1510
- evidence_ids: [ev-checkout-image-ci]
1511
- materiality: behavioural
1512
- ```
1513
-
1514
- ## `behaviors.yml`
1515
-
1516
- This file maps the things a customer can actually do. It does not repeat
1517
- runtime processes from `universe.yml`: one mapped interface can expose many
1518
- separate actions. Every action references an exact universe interface and
1519
- repository evidence. Its handler and observable boundaries use the same
1520
- framed SHA-256 identity protocol as runtime instrumentation and blast-radius
1521
- telemetry targets.
1522
-
1523
- ```yaml
1524
- version: 1
1525
- schema_version: haystack-behavior-map-v1
1526
- repository: acme/commerce
1527
- source_commit: 0123456789abcdef0123456789abcdef01234567
1528
- actions:
1529
- - id: action-a5f53f7b206d38cc97db5d53
1530
- interface_id: checkout-http
1531
- trigger:
1532
- kind: http
1533
- method: POST
1534
- route_template: /orders
1535
- handler:
1536
- symbol_id: symbol-91331f53480d298b9a59162d
1537
- source_path: apps/checkout/orders.ts
1538
- qualified_name: Orders.create
1539
- observable_boundaries:
1540
- - id: boundary-a439957515ba833bac1c01c5
1541
- kind: response
1542
- identity_key: http:POST:/orders:response
1543
- - id: boundary-84bb30f99b29bb529122adc1
1544
- kind: state
1545
- identity_key: database:orders:row
1546
- evidence_ids:
1547
- - ev-checkout-create-order-route
1548
- - ev-orders-write
1549
- ```
1550
-
1551
- Supported triggers are `http`, `event`, `job`, `cli`, and `ui`. HTTP triggers
1552
- use `method` plus `route_template`; event triggers use `channel_identity` plus
1553
- `event_type`; the remaining triggers use `job_identity`, `command_identity`,
1554
- or `action_identity` respectively.
1555
-
1556
- Supported observable boundary kinds are `response`, `state`, `event`,
1557
- `external`, `ui`, `cli`, and `job`. An action must name at least one stable
1558
- customer-relevant boundary. Source line numbers are evidence coordinates, not
1559
- identities, and never belong in an identity key.
1560
-
1561
- Run `haystack skills validate-behaviors --json`. It derives every action,
1562
- symbol, and boundary ID again; verifies the source commit matches
1563
- `universe.yml`; and checks interface and evidence references by exact ID.
1564
- Display names and similar-looking text never repair a broken join. The command
1565
- accepts the same 33554432-byte bound as the universe validator and uses the
1566
- current directory when a sealed source archive intentionally has no Git metadata.
1567
-
1568
- ## `evidence.yml`
1569
-
1570
- Completion requires a verifier-owned deterministic source census. Run
1571
- `haystack skills census-universe --json` twice on the unchanged retained
1572
- repository. The validator recomputes the result when repository context is
1573
- available. The receipt separately copies the pinned 40-hex `source_commit`,
1574
- source-manifest digest, exact counts, and sorted presumptive record IDs for all
1575
- six operational and registry projections. Every listed operational ID
1576
- appears exactly once in that category's candidates under
1577
- `source_census_record_ids`; the candidate's ordinary mapped/excluded/pending
1578
- contract then decides its semantics. Human-discovered candidates may omit this
1579
- field, but census-produced identities may not.
1580
-
1581
- `.haystack/` is excluded from the retained-source manifest even when generated
1582
- artifacts have been staged or tracked. The census must not observe its own
1583
- outputs. In a source-only snapshot without Git metadata, the command may report
1584
- `source_commit: null`; the receipt uses the already pinned
1585
- `map_revision.source_commit` while retaining the command's exact manifest and
1586
- record digests, counts, and projection IDs.
1587
-
1588
- Revision 39 makes each record's `proof_status` authoritative. A
1589
- `proof-complete` record must have an empty `missing_proof_components`, maps
1590
- exactly once in every declared projection, and cannot share its final with
1591
- another record. Every operational final repeats `source_census_record_id`,
1592
- `semantic_identity_id`, optional `execution_identity_id`, and the exact ordered
1593
- `identity_components` tuple. Operational `discovery-lead` records are
1594
- presumptive and also reconcile exactly once. They map only after the ordinary
1595
- final contract supplies exact source-grounded identity proof, repeat
1596
- `source_census_record_id`, preserve any partial identity components already
1597
- known, and cite repository evidence at the census source path with every
1598
- material token from its source anchor; otherwise they receive an exact evidenced
1599
- exclusion. An operational discovery lead may be excluded only with
1600
- `exclusion_basis: parent-runtime-unreachable` and atomic evidence for the exact
1601
- census source path and tokens. Generic nonproduction, internal, duplicate, or
1602
- non-independent relabeling is invalid. They cannot remain
1603
- pending at `inventory-complete`. A `non-inventory` record cannot justify a final.
1604
- Broad observations never close multiple identities;
1605
- aliases remain separate exact selector rows unless the census supplies an
1606
- explicit stable-ID derivation.
1607
-
1608
- Proof-complete runtime tuples include exact production provenance, controller,
1609
- entrypoint, and lifecycle. Workflow jobs are runtime roles only with
1610
- `controller_kind: workflow`, `production_operational_unit: "true"`, and a
1611
- `production_effect_kind` of `deploy`, `schedule`, or `supervise`; publication
1612
- and build work alone are not application runtimes. External HTTP, process, GUI,
1613
- and host tuples preserve exact target, object, and flow stage. Process tuples
1614
- also preserve executable, ordered `argv`, and wait semantics. Missing values
1615
- keep a row a discovery lead instead of authorizing a broad final.
1616
-
1617
- Revision 39 emits typed `registry_families`, `registry_entries`, and
1618
- `registry_edges`. A typed entry preserves `selector_family_record_id`; an edge
1619
- preserves `parent_selector_entry_record_id`, `child_selector_family_record_id`,
1620
- and `relation_kind`. Use those stable record IDs to retain owner boundaries and
1621
- nested selector structure. Never flatten entries across family IDs or declare a
1622
- leaf when the census gives that entry an outgoing edge. Broad conditional and
1623
- ternary records remain discovery leads; explicit Vue component/directive,
1624
- Java annotation, serialization, Spring bean-alternative, and Maven execution
1625
- records are the authoritative selector identities.
1626
-
1627
- Every proof-complete registry family and entry has exactly one
1628
- `source_census_record_id` join. Entries remain in their census family and keep
1629
- their exact selector and implementation keys. Declared child edges must equal
1630
- the proof-complete census edge set; an empty child list cannot override an
1631
- outgoing edge. For large ledgers, `census_rehydration: exact` allows a family or
1632
- entry to omit duplicated typed-identity and source-evidence fields while the
1633
- validator recomputes them from the pinned census. It may also upgrade discovery
1634
- registry observations after source-wide proof, provided the family preserves
1635
- the census owner and each entry preserves its exact selector and implementation
1636
- keys. Each discovery family and entry also cites atomic evidence for its census
1637
- source path and material tokens. Semantic `category_projections` may remain partial at
1638
- `inventory-complete`; `final-receipt` still requires full category links and a
1639
- child-registry or evidenced leaf decision.
1640
-
1641
- `python-executable-entrypoint-role`, `workflow-controlled-runtime-unit`,
1642
- `python-embedded-configuration-state`, and `python-embedded-template-state`
1643
- remain deterministic census candidates rather than proof-complete finals. Map
1644
- them when exact production provenance proves the runtime or state identity;
1645
- otherwise reconcile each one through an exact evidenced exclusion. In
1646
- particular, an admin/build/test entrypoint and an ordinary constant or rendering
1647
- template must not be promoted solely because the scanner found its syntax.
1648
-
1649
- Other generic call-signature census records remain discovery leads. Map one
1650
- only after exact source establishes its owner, operation, receiver boundary,
1651
- address or object, and stage. A final whose only meaning is "census operation"
1652
- or "host service" is invalid; expand browser-model, SDK, module-loader,
1653
- resource-pull, callback-registration, file/stream, and imported-package calls
1654
- to their exact structured identities.
1655
-
1656
- ```yaml
1657
- version: 1
1658
- inspection_policy:
1659
- test_path_isolation:
1660
- enforced: true
1661
- primary_mechanism: path-aware-tool-exclusions
1662
- reviewer_mechanism: tracked-files-filtered-snapshot-and-filesystem-confinement
1663
- denied_components:
1664
- - .haystack
1665
- - __tests__
1666
- - test
1667
- - tests
1668
- - e2e
1669
- - cypress
1670
- - playwright
1671
- - testdata
1672
- - test-data
1673
- - integration-test
1674
- - integration-tests
1675
- - integration_test
1676
- - integration_tests
1677
- - acceptance-test
1678
- - acceptance-tests
1679
- - acceptance_test
1680
- - acceptance_tests
1681
- - system-test
1682
- - system-tests
1683
- - system_test
1684
- - system_tests
1685
- - test-results
1686
- - playwright-report
1687
- - .pytest_cache
1688
- - .nyc_output
1689
- conditional_component_rules:
1690
- - id: detected-framework-roots
1691
- components: [spec, specs, fixtures, __fixtures__, mocks, __mocks__, snapshots, __snapshots__]
1692
- condition: matching-test-framework-and-test-root-detected
1693
- activated_conditional_rule_ids: [detected-framework-roots]
1694
- denied_basename_globs:
1695
- - "*.test.{js,jsx,ts,tsx,mjs,cjs}"
1696
- - "*.spec.{js,jsx,ts,tsx,mjs,cjs,rb}"
1697
- - "*.e2e.{js,jsx,ts,tsx}"
1698
- - "*.e2e-spec.{js,jsx,ts,tsx}"
1699
- - "test-*.{js,jsx,ts,tsx,py,rb,go,rs}"
1700
- - "*-test.{js,jsx,ts,tsx,py,rb,go,rs}"
1701
- - "*_test.{py,go,rs,cc,cpp}"
1702
- - "*_tests.{py,rb}"
1703
- - "test_*.py"
1704
- - "*_unittest.{cc,cpp,py}"
1705
- - "*Test.{java,kt,kts,scala,groovy,cs,php,swift}"
1706
- - "*Tests.{java,kt,kts,scala,groovy,cs,php,swift}"
1707
- - "*.{snap,golden,approved}"
1708
- - "{jest,vitest,playwright,cypress}.config.*"
1709
- - "karma.conf.*"
1710
- - "mocha.config.*"
1711
- - "pytest.ini"
1712
- - "tox.ini"
1713
- - ".coveragerc"
1714
- - "junit*.xml"
1715
- reviewer_snapshot:
1716
- preparation_command:
1717
- executable: haystack
1718
- arguments: [skills, prepare-universe-review, --json]
1719
- exclude_inactive_submodule_paths: []
1720
- preparation_status: ready-for-confinement
1721
- manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
1722
- git_metadata_included: false
1723
- network_disabled: true
1724
- symlink_audit: passed
1725
- safe_symlinks_materialized_as_regular_files: true
1726
- inline_test_detector: language-aware
1727
- inline_test_audit: passed
1728
- coverage:
1729
- scanned_roots: [apps, packages, infra, deploy]
1730
- deterministic_identity_census:
1731
- schema_version: cloud-verifier-identity-census-v1
1732
- contract_revision: 39
1733
- command: haystack skills census-universe --json
1734
- source_commit: 0123456789abcdef0123456789abcdef01234567
1735
- source_manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
1736
- first_record_digest: sha256:123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0
1737
- second_record_digest: sha256:123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0
1738
- tracked_files_total: 412
1739
- production_files_scanned: 287
1740
- records_total: 3
1741
- presumptive_inventory_total: 3
1742
- projection_record_ids:
1743
- runtime_roles: []
1744
- stateful_resources:
1745
- - census-state-address-declaration-0123456789abcdef0123
1746
- - census-state-address-declaration-123456789abcdef01234
1747
- external_dependencies:
1748
- - census-client-boundary-operation-23456789abcdef012345
1749
- registry_families: []
1750
- registry_entries: []
1751
- registry_edges: []
1752
- excluded_paths:
1753
- - path: .haystack/**
1754
- reason: prior-haystack-artifacts-hidden
1755
- - path: "**/tests/**"
1756
- reason: existing-tests-hidden
1757
- source_kinds: [application-source, terraform, kubernetes, ci-build]
1758
- external_integration_scope:
1759
- method: all-repository-supported-capabilities
1760
- status: complete
1761
- excluded_optional_profile_ids: []
1762
- evidence_ids: [ev-external-capability-scope]
1763
- inventory_closure:
1764
- runtime_roles:
1765
- status: complete
1766
- candidates:
1767
- - id: candidate-checkout-entrypoint
1768
- disposition: mapped
1769
- subject_ids: [checkout-http-role]
1770
- evidence_ids: [ev-checkout-entrypoint]
1771
- structured_registry_discovery:
1772
- status: complete
1773
- evidence_ids: [ev-checkout-entrypoint]
1774
- registries: []
1775
- absence_reason: No structured runtime-role registry is present.
1776
- uncovered: []
1777
- uncovered: []
1778
- stateful_resources:
1779
- status: complete
1780
- candidates:
1781
- - id: candidate-orders-database
1782
- disposition: mapped
1783
- subject_ids: [orders-db]
1784
- evidence_ids: [ev-orders-db-client]
1785
- - id: candidate-order-event-log
1786
- disposition: mapped
1787
- subject_ids: [order-events]
1788
- evidence_ids: [ev-order-topic]
1789
- state_surface_discovery:
1790
- status: complete
1791
- evidence_ids: [ev-orders-db-client, ev-order-topic]
1792
- entries:
1793
- - id: state-surface-orders-database-url
1794
- surface_kind: config-key
1795
- identity_key: DATABASE_URL
1796
- disposition: candidate
1797
- candidate_id: candidate-orders-database
1798
- evidence_ids: [ev-orders-db-client]
1799
- - id: state-surface-order-events-topic
1800
- surface_kind: config-key
1801
- identity_key: ORDER_EVENTS_TOPIC
1802
- disposition: candidate
1803
- candidate_id: candidate-order-event-log
1804
- evidence_ids: [ev-order-topic]
1805
- uncovered: []
1806
- logical_state_census:
1807
- status: complete
1808
- evidence_ids: [ev-logical-state-orders, ev-logical-state-events]
1809
- entries:
1810
- - id: logical-state-orders-database
1811
- logical_kind: configured-state-leaf
1812
- identity_key: orders-database
1813
- materialization_root_identity_key: DATABASE_URL
1814
- source_owner_identity_key: createOrdersDatabase
1815
- key_components: [DATABASE_URL]
1816
- mutation_operations: [create, update, delete]
1817
- state_surface_ids: [state-surface-orders-database-url]
1818
- contained_identity_disposition: none-proven
1819
- contained_logical_state_ids: []
1820
- contained_identity_reason: The database handle exposes no independently keyed child identity at this boundary.
1821
- contained_identity_evidence_ids: [ev-logical-state-orders-contained]
1822
- disposition: candidate
1823
- candidate_id: candidate-orders-database
1824
- evidence_ids: [ev-logical-state-orders]
1825
- - id: logical-state-order-events
1826
- logical_kind: namespace-record
1827
- identity_key: order-events-v2
1828
- materialization_root_identity_key: ORDER_EVENTS_TOPIC
1829
- source_owner_identity_key: publishOrderEvent
1830
- key_components: [ORDER_EVENTS_TOPIC, order-id]
1831
- mutation_operations: [append]
1832
- state_surface_ids: [state-surface-order-events-topic]
1833
- contained_identity_disposition: none-proven
1834
- contained_logical_state_ids: []
1835
- contained_identity_reason: Event payload identity is already the exact row key and contains no nested durable collection.
1836
- contained_identity_evidence_ids: [ev-logical-state-events-contained]
1837
- disposition: candidate
1838
- candidate_id: candidate-order-event-log
1839
- evidence_ids: [ev-logical-state-events]
1840
- uncovered: []
1841
- structured_registry_discovery:
1842
- status: complete
1843
- evidence_ids: [ev-orders-db-client, ev-order-topic]
1844
- registries: []
1845
- absence_reason: No structured state-resource registry is present.
1846
- uncovered: []
1847
- uncovered: []
1848
- external_dependencies:
1849
- status: complete
1850
- candidates:
1851
- - id: candidate-payments-client
1852
- disposition: mapped
1853
- subject_ids: [payments-api]
1854
- evidence_ids: [ev-payments-client]
1855
- structured_registry_discovery:
1856
- status: complete
1857
- evidence_ids: [ev-payments-client]
1858
- registries:
1859
- - id: registry-integration-clients
1860
- root: true
1861
- owner_identity_key: integration-client-factory
1862
- selector_domain: integration-client-kind
1863
- selection_gate:
1864
- kind: map-lookup
1865
- owner_token: integrationClientFactory
1866
- selector_token: integrationKind
1867
- dispatch_token: supportedIntegrations[integrationKind]
1868
- dispatch_semantics: selective-dispatch
1869
- runtime_consumer_token: createIntegrationClient
1870
- source_origin: application-owned
1871
- enumeration_method: static-structure
1872
- fallback_default: payments
1873
- status: complete
1874
- evidence_ids: [ev-integration-client-selection-gate]
1875
- entries:
1876
- - id: registry-entry-payments-client
1877
- selector_key: payments
1878
- selector_token: '"payments"'
1879
- selection_predicate: integration-kind == payments
1880
- implementation_key: payments-client
1881
- implementation_token: createPaymentsClient
1882
- category_links:
1883
- runtime_roles:
1884
- disposition: not-applicable
1885
- not_applicable_basis: no-independent-long-running-runtime
1886
- reason: The client does not launch another runtime role.
1887
- evidence_ids: [ev-payments-runtime-category]
1888
- stateful_resources:
1889
- disposition: not-applicable
1890
- not_applicable_basis: no-independent-persistent-state-identity
1891
- reason: The repository declares no independently keyed persistent payment state.
1892
- evidence_ids: [ev-payments-state-category]
1893
- external_dependencies:
1894
- disposition: candidate
1895
- candidate_id: candidate-payments-client
1896
- evidence_ids: [ev-payments-external-category]
1897
- child_registry_ids: []
1898
- child_registry_absence:
1899
- reason: No nested selectable client implementation is declared.
1900
- evidence_ids: [ev-payments-leaf]
1901
- evidence_ids: [ev-payments-registry-entry]
1902
- uncovered: []
1903
- uncovered: []
1904
- uncovered: []
1905
-
1906
- operational_surface_census:
1907
- status: complete
1908
- evidence_ids: [ev-operational-surface-checkout, ev-operational-surface-orders, ev-operational-surface-events, ev-operational-surface-payments]
1909
- frontier_receipts:
1910
- - frontier: deployment-runtime-units
1911
- status: complete
1912
- surface_ids: [surface-checkout-http]
1913
- evidence_ids: [ev-operational-surface-checkout]
1914
- uncovered: []
1915
- - frontier: state-materialization-identities
1916
- status: complete
1917
- surface_ids: [surface-orders-logical-database, surface-order-events-stream]
1918
- evidence_ids: [ev-operational-surface-orders, ev-operational-surface-events]
1919
- uncovered: []
1920
- - frontier: outbound-host-operation-contracts
1921
- status: complete
1922
- surface_ids: [surface-payments-authorize]
1923
- evidence_ids: [ev-operational-surface-payments]
1924
- uncovered: []
1925
- - frontier: required-inbound-pull-contracts
1926
- status: complete
1927
- surface_ids: []
1928
- evidence_ids: [ev-checkout-routes]
1929
- absence_reason: No fixed outside actor is required by this example scope.
1930
- uncovered: []
1931
- surfaces:
1932
- - id: surface-checkout-http
1933
- category: runtime_roles
1934
- surface_kind: runtime-mode
1935
- frontier: deployment-runtime-units
1936
- identity_key: checkout-server/http
1937
- disposition: candidate
1938
- candidate_id: candidate-checkout-entrypoint
1939
- evidence_ids: [ev-operational-surface-checkout]
1940
- - id: surface-orders-logical-database
1941
- category: stateful_resources
1942
- surface_kind: persistent-logical-entity
1943
- frontier: state-materialization-identities
1944
- identity_key: orders-database
1945
- disposition: candidate
1946
- candidate_id: candidate-orders-database
1947
- evidence_ids: [ev-operational-surface-orders]
1948
- - id: surface-order-events-stream
1949
- category: stateful_resources
1950
- surface_kind: persistent-logical-entity
1951
- frontier: state-materialization-identities
1952
- identity_key: order-events-v2
1953
- disposition: candidate
1954
- candidate_id: candidate-order-event-log
1955
- evidence_ids: [ev-operational-surface-events]
1956
- - id: surface-payments-authorize
1957
- category: external_dependencies
1958
- surface_kind: network-or-sdk-interaction
1959
- frontier: outbound-host-operation-contracts
1960
- identity_key: payments-client/authorize
1961
- disposition: candidate
1962
- candidate_id: candidate-payments-client
1963
- evidence_ids: [ev-operational-surface-payments]
1964
- uncovered: []
1965
-
1966
- selector_surface_census:
1967
- status: complete
1968
- evidence_ids: [ev-selector-surface-integration-clients]
1969
- discovery_roots:
1970
- - id: selector-root-integration-clients
1971
- owner_identity_key: integration-client-factory
1972
- selector_domain: integration-client-kind
1973
- source_identity_key: apps/checkout/src/integrations.ts#integrationClientFactory
1974
- surface_id: selector-surface-integration-clients
1975
- evidence_ids: [ev-selector-surface-integration-clients]
1976
- surfaces:
1977
- - id: selector-surface-integration-clients
1978
- construct_kind: plugin-provider-factory
1979
- owner_identity_key: integration-client-factory
1980
- enumeration_method: static-structure
1981
- availability_predicates: []
1982
- observed_selector_keys: [payments]
1983
- observed_implementation_keys: [payments-client]
1984
- disposition: registry
1985
- registry_id: registry-integration-clients
1986
- evidence_ids: [ev-selector-surface-integration-clients]
1987
- uncovered: []
1988
-
1989
- evidence_profiles:
1990
- - id: hosted-indicative-strong
1991
- environment_scope: hosted-production
1992
- authority: indicative
1993
- confidence: strong
1994
-
1995
- evidence_sources:
1996
- - id: source-checkout-role-identity
1997
- path: apps/checkout/src/server.ts
1998
- anchor: startCheckoutServer
1999
- kind: implementation
2000
- inspection_scope: implementation-body
2001
- locator_kind: exact-snippet
2002
- supporting_tokens: [startCheckoutServer]
2003
- - id: source-checkout-role-entrypoint
2004
- path: apps/checkout/src/server.ts
2005
- anchor: startCheckoutServer
2006
- kind: call-path
2007
- inspection_scope: role-call-path
2008
- locator_kind: symbol
2009
- - id: source-orders-role-use
2010
- path: apps/checkout/src/db.ts
2011
- anchor: createOrdersDatabase
2012
- kind: call-path
2013
- inspection_scope: role-call-path
2014
- locator_kind: symbol
2015
- - id: source-events-role-use
2016
- path: apps/checkout/src/events.ts
2017
- anchor: createOrderEventClient
2018
- kind: call-path
2019
- inspection_scope: role-call-path
2020
- locator_kind: symbol
2021
- - id: source-payments-role-use
2022
- path: apps/checkout/src/payments.ts
2023
- anchor: submitPayment
2024
- kind: call-path
2025
- inspection_scope: role-call-path
2026
- locator_kind: symbol
2027
- - id: source-orders-state-owner
2028
- path: apps/checkout/src/db.ts
2029
- anchor: "createOrdersDatabase\nDATABASE_URL"
2030
- kind: implementation
2031
- inspection_scope: implementation-body
2032
- locator_kind: exact-snippet
2033
- supporting_tokens: [createOrdersDatabase, DATABASE_URL]
2034
- - id: source-events-state-owner
2035
- path: apps/checkout/src/events.ts
2036
- anchor: "publishOrderEvent\nORDER_EVENTS_TOPIC"
2037
- kind: implementation
2038
- inspection_scope: implementation-body
2039
- locator_kind: exact-snippet
2040
- supporting_tokens: [publishOrderEvent, ORDER_EVENTS_TOPIC]
2041
- - id: source-payments-boundary
2042
- path: apps/checkout/src/payments.ts
2043
- anchor: "submitPayment\nauthorize-payment"
2044
- kind: implementation
2045
- inspection_scope: implementation-body
2046
- locator_kind: exact-snippet
2047
- supporting_tokens: [submitPayment, authorize-payment]
2048
- - id: source-integration-client-selection-gate
2049
- path: apps/checkout/src/integrations.ts
2050
- anchor: "integrationClientFactory\nintegrationKind\nsupportedIntegrations[integrationKind]"
2051
- kind: structured-registry
2052
- inspection_scope: structured-registry
2053
- locator_kind: exact-snippet
2054
- supporting_tokens: [integrationClientFactory, integrationKind, "supportedIntegrations[integrationKind]"]
2055
- - id: source-payments-registry-entry
2056
- path: apps/checkout/src/integrations.ts
2057
- anchor: "payments\npayments-client"
2058
- kind: structured-registry
2059
- inspection_scope: structured-registry
2060
- locator_kind: exact-snippet
2061
- supporting_tokens: [payments, payments-client]
2062
-
2063
- evidence:
2064
- - id: ev-checkout-entrypoint
2065
- subject_ids: [checkout-http-role]
2066
- claim_kind: runtime-role-identity
2067
- assertion: The checkout role launches through the exact server entrypoint.
2068
- profile_id: hosted-indicative-strong
2069
- source_ids: [source-checkout-role-identity]
2070
- - id: ev-integration-client-selection-gate
2071
- subject_ids: [registry-integration-clients]
2072
- claim_kind: registry-selection-gate
2073
- assertion: The exact integration lookup dispatches to selectable client implementations.
2074
- profile_id: hosted-indicative-strong
2075
- source_ids: [source-integration-client-selection-gate]
2076
- - id: ev-payments-registry-entry
2077
- subject_ids: [registry-entry-payments-client]
2078
- claim_kind: registry-entry-identity
2079
- assertion: The payments selector resolves to the exact payments client implementation.
2080
- profile_id: hosted-indicative-strong
2081
- source_ids: [source-payments-registry-entry]
2082
- - id: ev-external-capability-scope
2083
- subject_ids: [commerce-platform]
2084
- claim_kind: external-capability-scope
2085
- assertion: All repository-supported external capability surfaces were enumerated.
2086
- environment_scope: hosted-production
2087
- authority: indicative
2088
- sources:
2089
- - path: apps/checkout/src/integrations.ts
2090
- anchor: supportedIntegrations
2091
- kind: implementation
2092
- inspection_scope: implementation-body
2093
- locator_kind: symbol
2094
- confidence: strong
2095
- - id: ev-operational-surface-checkout
2096
- subject_ids: [surface-checkout-http]
2097
- claim_kind: operational-surface-census
2098
- assertion: The exact packaged HTTP execution mode was retained before role synthesis.
2099
- profile_id: hosted-indicative-strong
2100
- source_ids: [source-checkout-role-entrypoint]
2101
- - id: ev-operational-surface-orders
2102
- subject_ids: [surface-orders-logical-database]
2103
- claim_kind: operational-surface-census
2104
- assertion: The exact logical database identity was retained before resource synthesis.
2105
- profile_id: hosted-indicative-strong
2106
- source_ids: [source-orders-state-owner]
2107
- - id: ev-operational-surface-events
2108
- subject_ids: [surface-order-events-stream]
2109
- claim_kind: operational-surface-census
2110
- assertion: The exact persistent event stream identity was retained before resource synthesis.
2111
- profile_id: hosted-indicative-strong
2112
- source_ids: [source-events-state-owner]
2113
- - id: ev-logical-state-orders
2114
- subject_ids: [logical-state-orders-database]
2115
- claim_kind: logical-state-census
2116
- assertion: The orders database logical identity and mutator owner were enumerated separately from its connection root.
2117
- profile_id: hosted-indicative-strong
2118
- source_ids: [source-orders-state-owner]
2119
- - id: ev-logical-state-events
2120
- subject_ids: [logical-state-order-events]
2121
- claim_kind: logical-state-census
2122
- assertion: The keyed order-event namespace and append operation were enumerated separately from its topic root.
2123
- profile_id: hosted-indicative-strong
2124
- source_ids: [source-events-state-owner]
2125
- - id: ev-logical-state-orders-contained
2126
- subject_ids: [logical-state-orders-database]
2127
- claim_kind: logical-state-container-closure
2128
- assertion: The orders database boundary exposes no independently keyed nested state.
2129
- profile_id: hosted-indicative-strong
2130
- source_ids: [source-orders-state-owner]
2131
- - id: ev-logical-state-events-contained
2132
- subject_ids: [logical-state-order-events]
2133
- claim_kind: logical-state-container-closure
2134
- assertion: The event record boundary exposes no independently keyed nested state.
2135
- profile_id: hosted-indicative-strong
2136
- source_ids: [source-events-state-owner]
2137
- - id: ev-operational-surface-payments
2138
- subject_ids: [surface-payments-authorize]
2139
- claim_kind: operational-surface-census
2140
- assertion: The exact SDK operation was retained before dependency synthesis.
2141
- profile_id: hosted-indicative-strong
2142
- source_ids: [source-payments-boundary]
2143
- - id: ev-selector-surface-integration-clients
2144
- subject_ids: [selector-surface-integration-clients]
2145
- claim_kind: selector-surface-census
2146
- assertion: The exact integration-client factory owner was enumerated.
2147
- environment_scope: hosted-production
2148
- authority: indicative
2149
- sources:
2150
- - path: apps/checkout/src/integrations.ts
2151
- anchor: supportedIntegrations
2152
- kind: implementation
2153
- inspection_scope: structured-registry
2154
- locator_kind: symbol
2155
- confidence: strong
2156
- - id: ev-orders-db-client
2157
- subject_ids: [orders-db, checkout-api, checkout-http-role]
2158
- assertion: checkout-http-role constructs the production orders client
2159
- environment_scope: hosted-production
2160
- authority: authoritative
2161
- sources:
2162
- - path: apps/checkout/src/db.ts
2163
- lines: {start: 12, end: 24}
2164
- anchor: createOrdersDatabase
2165
- kind: exported-symbol
2166
- locator_kind: line-span
2167
- - path: deploy/checkout.yaml
2168
- anchor: spec.template.spec.containers[name=checkout].env[name=DATABASE_URL]
2169
- kind: manifest-key
2170
- locator_kind: manifest-key
2171
- - source_ref: deployment-catalog/hosted-checkout
2172
- selector: resource-bindings.orders-primary
2173
- record_key: orders-primary
2174
- kind: private-service-catalog-record
2175
- confidence: proven
2176
- - id: ev-orders-state-owner
2177
- subject_ids: [orders-db]
2178
- claim_kind: state-owner-boundary
2179
- state_owner_basis: application-persistence-boundary
2180
- state_owner_operation: open-read-write
2181
- reproduction_operation_kind: copy
2182
- assertion: The application opens and mutates the orders database.
2183
- profile_id: hosted-indicative-strong
2184
- source_ids: [source-orders-state-owner]
2185
- - id: ev-order-events-state-owner
2186
- subject_ids: [order-events]
2187
- claim_kind: state-owner-boundary
2188
- state_owner_basis: repository-declared-mutable-state
2189
- state_owner_operation: named-mutable-namespace
2190
- reproduction_operation_kind: restore
2191
- assertion: The repository declares the mutable order-events-v2 event log.
2192
- profile_id: hosted-indicative-strong
2193
- source_ids: [source-events-state-owner]
2194
- - id: ev-payments-boundary
2195
- subject_ids: [payments-api]
2196
- claim_kind: external-interaction-boundary
2197
- external_backing_basis: interaction-only
2198
- external_operation: stateless-exchange
2199
- assertion: The payments client reproduces interaction behavior without owned backing state.
2200
- profile_id: hosted-indicative-strong
2201
- source_ids: [source-payments-boundary]
2202
- - id: ev-orders-db-consumer
2203
- subject_ids: [orders-db, checkout-http-role]
2204
- claim_kind: role-reachability
2205
- assertion: checkout-http-role reaches the orders database on its selected profile.
2206
- profile_id: hosted-indicative-strong
2207
- source_ids: [source-checkout-role-entrypoint, source-orders-role-use]
2208
- role_call_path:
2209
- kind: direct
2210
- runtime_role_id: checkout-http-role
2211
- entrypoint_source_index: 0
2212
- consumer_source_index: 1
2213
- - id: ev-order-events-consumer
2214
- subject_ids: [order-events, checkout-http-role]
2215
- claim_kind: role-reachability
2216
- assertion: checkout-http-role reaches the order event log on its selected profile.
2217
- profile_id: hosted-indicative-strong
2218
- source_ids: [source-checkout-role-entrypoint, source-events-role-use]
2219
- role_call_path:
2220
- kind: direct
2221
- runtime_role_id: checkout-http-role
2222
- entrypoint_source_index: 0
2223
- consumer_source_index: 1
2224
- - id: ev-payments-consumer
2225
- subject_ids: [payments-api, checkout-http-role]
2226
- claim_kind: role-reachability
2227
- assertion: checkout-http-role reaches the fixed payments request path.
2228
- profile_id: hosted-indicative-strong
2229
- source_ids: [source-checkout-role-entrypoint, source-payments-role-use]
2230
- role_call_path:
2231
- kind: direct
2232
- runtime_role_id: checkout-http-role
2233
- entrypoint_source_index: 0
2234
- consumer_source_index: 1
2235
- - id: ev-payments-runtime-category
2236
- subject_ids: [registry-entry-payments-client-link-runtime-roles]
2237
- claim_kind: registry-category-decision
2238
- assertion: The client factory launches no independent long-running runtime.
2239
- environment_scope: hosted-production
2240
- authority: indicative
2241
- sources:
2242
- - path: apps/checkout/src/payments.ts
2243
- anchor: createPaymentsClient
2244
- kind: implementation
2245
- inspection_scope: implementation-body
2246
- locator_kind: symbol
2247
- confidence: strong
2248
- - id: ev-payments-state-category
2249
- subject_ids: [registry-entry-payments-client-link-stateful-resources]
2250
- claim_kind: registry-category-decision
2251
- assertion: The client factory declares no independently keyed persistent state identity.
2252
- environment_scope: hosted-production
2253
- authority: indicative
2254
- sources:
2255
- - path: apps/checkout/src/payments.ts
2256
- anchor: createPaymentsClient
2257
- kind: implementation
2258
- inspection_scope: implementation-body
2259
- locator_kind: symbol
2260
- confidence: strong
2261
- - id: ev-payments-external-category
2262
- subject_ids: [registry-entry-payments-client-link-external-dependencies]
2263
- claim_kind: registry-category-decision
2264
- assertion: The client factory creates the mapped outbound payments interaction.
2265
- environment_scope: hosted-production
2266
- authority: indicative
2267
- sources:
2268
- - path: apps/checkout/src/payments.ts
2269
- anchor: createPaymentsClient
2270
- kind: implementation
2271
- inspection_scope: implementation-body
2272
- locator_kind: symbol
2273
- confidence: strong
2274
- - id: ev-payments-leaf
2275
- subject_ids: [registry-entry-payments-client]
2276
- claim_kind: registry-leaf-inspection
2277
- assertion: The payments client implementation has no nested structured selector.
2278
- environment_scope: hosted-production
2279
- authority: indicative
2280
- sources:
2281
- - path: apps/checkout/src/payments.ts
2282
- anchor: createPaymentsClient
2283
- kind: implementation
2284
- inspection_scope: implementation-body
2285
- locator_kind: symbol
2286
- confidence: strong
2287
- - id: ev-hot-fork-checkout-wave
2288
- subject_ids: [hot-fork-checkout-wave]
2289
- assertion: The warm adapter produced eight fresh generated-case universes.
2290
- environment_scope: hosted-production
2291
- authority: authoritative
2292
- claim_kind: materialization-capability
2293
- operational_status: materialization-probed
2294
- latency_basis: measured
2295
- sources:
2296
- - source_ref: haystack-adapter-catalog/warm-checkout-wave
2297
- selector: qualification.latest
2298
- record_key: warm-checkout-wave
2299
- kind: haystack-adapter-capability-record
2300
- confidence: proven
2301
- - id: ev-prepared-checkout-source
2302
- subject_ids: [prepared-checkout-source]
2303
- assertion: The sealed replica identity matches the declared profile and cut.
2304
- environment_scope: hosted-production
2305
- authority: authoritative
2306
- sources:
2307
- - source_ref: prepared-state-catalog/checkout-source
2308
- selector: identity.latest
2309
- kind: replication-prepared-state-record
2310
- confidence: proven
2311
- - id: ev-hot-checkout-path-probe
2312
- subject_ids: [prepared-checkout-source, hot-fork-checkout-wave, hot-inject-checkout-commit]
2313
- assertion: The production-scoped warm probe exercised the declared hot path.
2314
- environment_scope: hosted-production
2315
- authority: authoritative
2316
- claim_kind: materialization-hot-path-probe
2317
- operational_status: materialization-probed
2318
- latency_basis: measured
2319
- sources:
2320
- - source_ref: haystack-probe-catalog/checkout-production-wave
2321
- selector: qualification.latest
2322
- kind: haystack-materialization-probe-result
2323
- environment_scope: hosted-production
2324
- probe_results:
2325
- observed_end_to_end_p95_ms: 5000
2326
- achieved_generated_case_fanout: 8
2327
- verification_commit_ref: commit-catalog/checkout-probe-001
2328
- arbitrary_verification_commit_injection: true
2329
- fresh_universe_per_generated_case: true
2330
- parent_write_protected: true
2331
- parallel_phases: [fork, attach, execute]
2332
- cleanup_order: [release-all-attachments, revoke-all-leases]
2333
- cleanup_covers_all_attempts_on_partial_failure: true
2334
- single_absolute_deadline: true
2335
- generated_case_runs:
2336
- - generated_case_id: generated-case-1
2337
- sandbox_id: sandbox-1
2338
- universe_incarnation_id: universe-incarnation-1
2339
- - generated_case_id: generated-case-2
2340
- sandbox_id: sandbox-2
2341
- universe_incarnation_id: universe-incarnation-2
2342
- - generated_case_id: generated-case-3
2343
- sandbox_id: sandbox-3
2344
- universe_incarnation_id: universe-incarnation-3
2345
- - generated_case_id: generated-case-4
2346
- sandbox_id: sandbox-4
2347
- universe_incarnation_id: universe-incarnation-4
2348
- - generated_case_id: generated-case-5
2349
- sandbox_id: sandbox-5
2350
- universe_incarnation_id: universe-incarnation-5
2351
- - generated_case_id: generated-case-6
2352
- sandbox_id: sandbox-6
2353
- universe_incarnation_id: universe-incarnation-6
2354
- - generated_case_id: generated-case-7
2355
- sandbox_id: sandbox-7
2356
- universe_incarnation_id: universe-incarnation-7
2357
- - generated_case_id: generated-case-8
2358
- sandbox_id: sandbox-8
2359
- universe_incarnation_id: universe-incarnation-8
2360
- confidence: proven
2361
- ```
2362
-
2363
- `selector_surface_census.discovery_roots` is the append-only first-discovery
2364
- ledger. Add a row as soon as a typed selector field, registration owner,
2365
- command tree, static map, switch, or equivalent exact dispatch root is
2366
- observed—before enumerating entries or tracing semantics. Every row resolves
2367
- to exactly one selector surface, and every surface resolves from exactly one
2368
- row. A known root cannot be left only in `uncovered`; emit its surface and
2369
- registry, retain all observed keys on the selector surface, and keep final
2370
- `entries: []` while selector-to-implementation or nested traces remain partial.
2371
- `uncovered` is only for source ranges or dynamic keys not yet discovered
2372
- exactly. When a known root has zero semantically resolved selector keys, its
2373
- partial registry uses `entries: []`, `fallback_default: none-proven`, and
2374
- `entry_enumeration_blocker: {reason, evidence_ids}` naming the exact dynamic-key
2375
- or uninspected-source boundary. Once a key is observed, replace that with
2376
- `semantic_trace_blocker: {reason, evidence_ids}` while its implementation,
2377
- category-link, or nested-registry trace remains open. Omit both blockers when the
2378
- registry is complete.
2379
-
2380
- Each evidence record declares exactly one complete inline quality tuple
2381
- (`environment_scope`, `authority`, `confidence`) or one `profile_id`, and
2382
- exactly one nonempty inline `sources` list or `source_ids`. Put repeated tuples
2383
- in `evidence_profiles` and repeated typed source locators in
2384
- `evidence_sources`; references resolve by exact stable ID and do not weaken the
2385
- claim's exact subject set. Every repository source has `locator_kind` equal to
2386
- `symbol`, `exact-snippet`, `line-span`, `manifest-key`, or `config-key`.
2387
- Its optional `inspection_scope` is `implementation-body`, `role-call-path`, or
2388
- `structured-registry`; the last is valid for exact structured census and
2389
- projection evidence but does not satisfy a full implementation-trace claim.
2390
- Repository `anchor` values are non-empty strings. An `exact-snippet` anchor is
2391
- a case-sensitive UTF-8 substring that occurs exactly once in the referenced
2392
- repository file; use `line-span` to disambiguate repeated text. Normalized
2393
- selector keys, generated labels, and summaries are not source snippets.
2394
- `line-span` additionally uses an exact two-field `lines` object containing
2395
- positive integer `start` and `end`; the span stays within the referenced file
2396
- and contains the case-sensitive anchor. Padding fields are invalid. When the
2397
- validator has repository context it reads these files and rejects absent
2398
- snippets, out-of-range spans, and anchors outside their declared spans.
2399
- Generated candidate IDs and family labels are not locators.
2400
-
2401
- Material identity sources additionally carry a nonempty unique
2402
- `supporting_tokens` list and use only `exact-snippet` or `line-span`. Each token
2403
- is an exact case-sensitive string inside the declared locator; a material line
2404
- span is at most 80 lines. Runtime-role identity evidence supports the exact
2405
- entrypoint; resource owner evidence supports both the source owner and
2406
- materialization root; external boundary evidence supports the exact source
2407
- owner and operation; registry gate and entry evidence supports their declared
2408
- tokens. Opaque catalog sources never use `supporting_tokens`.
2409
-
2410
- Every full role's `entrypoint_evidence_id` resolves to decision-grade atomic
2411
- `runtime-role-identity` evidence whose only subject is that role and whose
2412
- `implementation-body` source supports the exact entrypoint token. A shebang,
2413
- import, adjacent declaration, comment, or closing brace does not prove a launch
2414
- identity.
2415
-
2416
- Atomic `role-reachability` evidence also carries `role_call_path`. Its
2417
- `runtime_role_id` matches the claim subject; `entrypoint_source_index` and
2418
- `consumer_source_index` are distinct zero-based indexes into the resolved
2419
- source list; and `kind` is `direct`, `registration-dispatch`, or
2420
- `configuration-dispatch`. A non-direct kind also requires a distinct zero-based
2421
- `dispatch_source_index` locating the actual registration or selection gate;
2422
- `direct` omits it. All indexed sources use `inspection_scope: role-call-path`
2423
- and distinct exact repository locators; repeating one source at two indexes,
2424
- padding its locator, or relabelling its locator kind is invalid.
2425
- One source locates a role module or entrypoint and the
2426
- other locates the concrete consumer use site. Plugin packaging or registration
2427
- alone cannot occupy either end.
2428
-
2429
- When external-dependency closure is complete,
2430
- `coverage.external_integration_scope` is mandatory with method
2431
- `all-repository-supported-capabilities`, status `complete`, and an empty
2432
- `excluded_optional_profile_ids`. Its evidence includes an atomic
2433
- `external-capability-scope` claim whose only subject is the application ID and
2434
- whose source uses `inspection_scope: implementation-body`. A profile gate may
2435
- make a supported integration optional but cannot place it in the excluded list.
2436
-
2437
- `coverage.inventory_closure` is mandatory, including on a provisional map and
2438
- on the compact empty receipt. It has exactly the three categories shown above.
2439
- Each category has `status: complete` with `uncovered: []`, or `status: partial`
2440
- with at least one uncovered source-scope description. It also has mandatory
2441
- `structured_registry_discovery`. A complete discovery claim has nonempty
2442
- evidence and `uncovered: []`; a partial claim names its uncovered scope. Each
2443
- stateful-resource category also has mandatory `state_surface_discovery`. It is
2444
- a `complete` or `partial` exact census with nonempty evidence and the same
2445
- `uncovered` rules. Each surface entry has a unique stable `id`, an exact
2446
- `identity_key`, and `surface_kind`: `config-key`, `writable-path`,
2447
- `remote-loader`, `generated-output`, `identity-material`,
2448
- `structured-manifest`, `persistent-entity`, `installed-artifact`,
2449
- `host-persistent-state`, `scheduled-state`, `portable-snapshot`, or
2450
- `packaged-installation-layout`. A `candidate` entry names one
2451
- exact stateful-resource `candidate_id`; a `non-resource` entry omits it and
2452
- records `non_resource_reason`. This retains discovery roots without promoting
2453
- generic loaders, selectors, mounts, or plumbing into resources. If several
2454
- entries reuse one candidate, every reused entry has nonempty
2455
- `shared_binding_evidence_ids` proving the exact common logical binding. A
2456
- complete empty census has an evidenced `absence_reason`; a nonempty stateful
2457
- inventory may never use an empty census.
2458
-
2459
- The stateful-resource category also has mandatory `logical_state_census`.
2460
- Every state closure candidate appears in exactly one row. Each row records a
2461
- unique stable `id`, `logical_kind`, exact `identity_key`, separate
2462
- `materialization_root_identity_key`, exact `source_owner_identity_key`,
2463
- nonempty `key_components`, nonempty `mutation_operations`, the originating
2464
- `state_surface_ids`, and atomic `logical-state-census` evidence whose only
2465
- subject is that row ID. Allowed kinds are `keyed-record`, `leased-record`,
2466
- `namespace-record`, `materialization-container`, `configured-state-leaf`,
2467
- `portable-snapshot`, `installed-layout`, `generated-identity`,
2468
- `scheduled-definition`, and `host-persistent-object`. Keyed, leased, and
2469
- namespace rows include at least a materialization/root discriminator plus a
2470
- record key or prefix, and their logical identity may not equal their container
2471
- identity. Mutation operations are exact lifecycle verbs selected from
2472
- `create`, `update`, `delete`, `append`, `replace`, `install`, `restore`,
2473
- `register`, `lease`, `snapshot`, `export`, `copy`, `import`, `save`, `renew`,
2474
- `revoke`, `compact`, `migrate`, `truncate`, and `rotate`.
2475
-
2476
- `source_owner_identity_key` resolves to an actual declaration or mutator in the
2477
- referenced source. A synthesized convenience name, registry/schema field,
2478
- comment, or non-owning caller is invalid. Unless the materialization root is
2479
- itself the complete independently reproducible identity, `key_components`
2480
- include at least one semantic discriminator beyond the root, such as an object
2481
- or document key, filename, namespace, certificate role, plugin/module version,
2482
- log stream, account, or equivalent exact identity. A root-only component list
2483
- must not erase a more precise identity already proven by the mutator body.
2484
-
2485
- Every logical-state row records `contained_identity_disposition`; nested keyed
2486
- state can live inside a serialized record, session, snapshot, installed layout,
2487
- or host object as well as a physical container. `enumerated` names every
2488
- independently keyed child in `contained_logical_state_ids`; those references
2489
- must resolve to non-container rows. `none-proven` uses an empty child list, a
2490
- specific `contained_identity_reason`, and atomic
2491
- `logical-state-container-closure` evidence. `unresolved` names the frontier and
2492
- is valid only while the logical-state census and state closure are partial.
2493
- Physical co-location, one snapshot action, a bucket/table/root name, or a shared
2494
- key prefix never proves that independently keyed children are absent. Portable
2495
- snapshots and installed layouts are distinct logical rows rather than aliases
2496
- of their live database or build descriptor. A complete empty census requires
2497
- `absence_reason`; a partial census names its uncovered frontier.
2498
-
2499
- Every final resource repeats that logical identity and declares
2500
- `state_unit_kind` as one of `logical-database`, `database-schema`,
2501
- `search-index`, `cache-namespace`, `queue-or-stream`, `credential-file`,
2502
- `trust-material-file`, `tls-keypair`, `object-bucket-or-prefix`,
2503
- `persistent-volume-or-directory`, `portable-snapshot`, `installed-artifact`,
2504
- `packaged-installation-layout`, `generated-host-state`,
2505
- `immutable-packaged-asset`, or `repository-proven-independent-object`. It also
2506
- has an exact unique, non-placeholder `address_token` and `reproduction_token`;
2507
- atomic state-owner evidence supports the owner, root, address, and reproduction
2508
- tokens. An unresolved reproduction strategy requires partial state closure; a
2509
- complete category requires every final resource to have a concrete strategy. A
2510
- portable container and a contained database, generated file, installed
2511
- executable, or packaged asset are both final resources when each has an
2512
- independent address and reproduction operation.
2513
- Tables, projections, fields, indexes, and records inside an already reproduced
2514
- database are not final resources unless exact evidence proves their independent
2515
- address and independent reproduction action. Remote import inputs, provider
2516
- variants, configuration inputs, and discovery responses stay out of final state
2517
- inventory.
2518
-
2519
- `coverage.operational_surface_census` is mandatory. It enumerates exact
2520
- execution facets, persistent logical entities and configured leaves, remote
2521
- state operations, network/SDK interactions, runtime-invoked commands,
2522
- host-service interactions, and required inbound or pull interactions before
2523
- candidate synthesis. Each surface records a unique stable ID, category,
2524
- exact `identity_key`, and `surface_kind`: `runtime-entrypoint`, `runtime-mode`,
2525
- `scheduled-or-injected-workload`, `managed-child-process`,
2526
- `persistent-logical-entity`, `configured-state-leaf`, `installed-artifact`,
2527
- `portable-snapshot-artifact`, `packaged-installation-layout`,
2528
- `generated-or-host-state`, `remote-state-operation`,
2529
- `network-or-sdk-interaction`, `runtime-invoked-command`,
2530
- `host-service-interaction`, or `required-inbound-or-pull-interaction`. It also
2531
- has decision-grade atomic
2532
- `operational-surface-census` evidence whose only subject is that surface ID. A
2533
- `candidate` row names one exact category candidate; a `non-inventory` row omits
2534
- the candidate and explains the source-derived decision. Every closure candidate
2535
- must have at least one exact source surface.
2536
-
2537
- The census also contains exactly four `frontier_receipts`:
2538
- `deployment-runtime-units`, `state-materialization-identities`,
2539
- `outbound-host-operation-contracts`, and
2540
- `required-inbound-pull-contracts`. Every surface repeats its mechanically
2541
- determined `frontier`. Each receipt has `complete` or `partial` status,
2542
- nonempty evidence, an exact duplicate-free `surface_ids` set, and `uncovered`.
2543
- A complete empty frontier gives an `absence_reason`; complete closure requires
2544
- all four receipts complete. Deployment units include separately launched
2545
- database, cache, broker, and search processes as runtime roles in addition to
2546
- their state resources. State identities include independently reproduced
2547
- service certificates, CA bundles, secrets/credentials, configured destination
2548
- objects, logical cache databases or namespaces, and writable, installed,
2549
- cache, database, and report layouts. Outbound contracts enumerate every exact
2550
- effectful leaf in reached wrappers, including filesystem methods, transaction
2551
- stages, object-store methods, mail protocol stages, browser/host APIs, and
2552
- downloads, package fetches, generators, or install commands needed to reproduce
2553
- shipped artifacts. Build-time and install-time boundaries remain external
2554
- dependencies even when they are not steady-state runtime egress. Required inbound/pull contracts
2555
- retain independently reproduced listener boundaries without expanding every
2556
- route.
2557
-
2558
- `coverage.selector_surface_census` is also mandatory. Each exact source owner
2559
- records `construct_kind` as `executable-command-dispatch`,
2560
- `plugin-provider-factory`, `persistence-schema-dispatch`,
2561
- `lifecycle-hook-pipeline`, `behavior-or-config-selector`,
2562
- `finite-behavior-dispatch`, or
2563
- `dynamic-module-or-entrypoint`; `enumeration_method` is `static-structure`,
2564
- `generated-input`, `language-aware-extraction`, or `implementation-trace`.
2565
- It also records `owner_identity_key`, exact `availability_predicates`, exact
2566
- nonempty unique `observed_selector_keys`, exact nonempty unique
2567
- `observed_implementation_keys`, and either one `registry_id` or an evidenced
2568
- `non-registry` decision. The decision-grade `selector-surface-census` evidence
2569
- has the surface ID as its exact subject and a `structured-registry` source.
2570
- Every emitted registry ID resolves from exactly one source-owner row. Its
2571
- owner, enumeration method, selector-key set, and distinct implementation-key
2572
- set exactly match the registry rows. A non-registry selector may record only
2573
- one implementation identity; two or more exact production implementations
2574
- require a registry. Wildcard, family, and sampled-member placeholders do not
2575
- constitute enumeration. `non_registry_reason` is not prose: it is exactly one
2576
- of `single-implementation-no-choice`, `exhaustive-all-members`,
2577
- `declarative-data-only`, `operation-contract-without-dispatch`,
2578
- `generated-without-application-gate`, or `non-production-selector`.
2579
-
2580
- A registry is admitted whenever a runtime selector chooses distinct concrete
2581
- production behaviors or implementations, even when every inventory-category
2582
- link is `not-applicable`. This includes concrete command, UI render/component,
2583
- parser, formatter, field/entity factory, protocol-operation, migration/template,
2584
- and feature-behavior dispatch only when a selector chooses one implementation
2585
- or subset. Ordered migrations, hook pipelines, and generated codec/parser tables
2586
- that execute or expose every member are not selector registries. Plain enums,
2587
- lists, routes, metrics, constants, and flags with no concrete dispatch remain
2588
- non-registries. Large registries are
2589
- fully enumerated by a deterministic extractor; sampling is never completion.
2590
-
2591
- Each
2592
- identified registry has a globally unique stable ID, `root: true` or `false`,
2593
- an exact `owner_identity_key`, `selector_domain`, recognized
2594
- `enumeration_method`, a concrete `selection_gate`, exact `fallback_default` (or `none-proven`), nonempty
2595
- evidence, an enumeration status, exact `entries`, and its own uncovered list.
2596
- `selection_gate.kind` is `map-lookup`, `switch-dispatch`,
2597
- `factory-registration`, `manifest-entrypoint`, `command-dispatch`,
2598
- `generated-dispatch`, or `configuration-dispatch`; it also records exact
2599
- `owner_token`, `selector_token`, `dispatch_token`,
2600
- `dispatch_semantics: selective-dispatch`, the production
2601
- `runtime_consumer_token`, and `source_origin` as `application-owned` or
2602
- `generated`. Generated input additionally records a distinct exact
2603
- `application_gate_token`; generated machinery without that app-owned gate is
2604
- not a registry. Registry evidence includes atomic `registry-selection-gate`
2605
- evidence for all of those tokens. An
2606
- interface or abstract method set is an operation contract, not a registry.
2607
- Every entry has a globally unique stable ID, unique exact `selector_key`,
2608
- exact `selector_token`, nonempty exact `selection_predicate`, nonempty
2609
- `implementation_key`, distinct exact `implementation_token`, exact evidence,
2610
- and exact `category_links` for
2611
- `runtime_roles`, `stateful_resources`, and `external_dependencies`. Each link is
2612
- either `candidate` with one candidate ID from that category, or
2613
- `not-applicable` with evidence, a reason, and the fixed category basis:
2614
- `no-independent-long-running-runtime`,
2615
- `no-independent-persistent-state-identity`, or
2616
- `no-external-reproduction-interaction`. Every category-link evidence record uses
2617
- `claim_kind: registry-category-decision`, has the exact derived link ID as its
2618
- only `subject_ids` value, and cites a repository source with
2619
- `inspection_scope: implementation-body`. Selector keys are unique within a
2620
- registry; implementation keys may repeat when distinct exact selectors are
2621
- aliases for one implementation. Within one registry and category, entries may not reuse a
2622
- candidate or resolve through separate candidates to the same broad inventory
2623
- subject. That anti-collapse rule keeps each independently selectable
2624
- implementation visible across state and service concerns; an evidenced
2625
- redundant alias receives its own excluded candidate.
2626
-
2627
- Every registry entry's own evidence includes atomic
2628
- `registry-entry-identity` evidence whose only subject is that entry and whose
2629
- `structured-registry` source supports its exact selector and implementation
2630
- tokens.
2631
- The gate selector token differs from its dispatch token, and an entry's selector
2632
- key/token differs from its implementation key/token. Constructor expressions,
2633
- handler names, provider names, and classes are implementations, not selectors;
2634
- use the exact literal, enum value, manifest key, command `Use` string, or other
2635
- source token that a caller actually selects.
2636
-
2637
- Discovery may scan literal arrays, mappings, enums, and generated tables as
2638
- candidate surfaces, but an emitted registry requires exact evidence that its
2639
- keys select or dispatch distinct production implementation identities relevant
2640
- to a runtime role, state owner, or external interaction. Platform/facet lists,
2641
- field and entity types, routes, metrics, protocol verbs, constants, discovery
2642
- matchers, and feature flags are not inventory registries merely because they
2643
- are structured. Executable and command dispatch is the exception: packaged
2644
- wrapper maps, command tables, command annotations, and nested subcommand
2645
- indexes are registries when exact keys dispatch distinct production-capable
2646
- implementations. Finite production batches also link to exact runtime-role
2647
- candidates; the registry identity remains separate. Scale-generated registries retain semantic stable
2648
- IDs and selection/dispatch evidence; opaque hashes and one-registry-per-literal
2649
- collection do not satisfy this boundary.
2650
-
2651
- One dominant manifest, plugin, or provider index never substitutes for the full
2652
- surface census. Before artifact generation, separately resolve every discovered
2653
- package executable or entrypoint map, dynamic module-import selector, registered
2654
- factory or provider interface, and configuration-driven implementation dispatch
2655
- table. Each becomes either a genuine inventory registry or an exact evidenced
2656
- non-registry decision. Exhausting the largest registry does not close the
2657
- smaller root-selector frontier.
2658
-
2659
- Language-aware enumeration retains every exact selector identity, not just
2660
- concrete implementation classes. This includes configuration aliases,
2661
- sentinel/default choices, behavior-selecting enum constants, annotated abstract
2662
- command bases and group nodes, and packaged executable keys. A selector alias
2663
- remains an entry when it resolves to a class already present under a different
2664
- key. Annotation addressability is independent of class concreteness, and a
2665
- long-running executable remains in the executable registry even when its launch
2666
- surface also maps to a runtime role. Java/Kotlin subtype scans take the
2667
- transitive concrete closure through subclasses of subclasses and separately
2668
- retain these non-subtype selector forms.
2669
-
2670
- A registry retains every enumerated key on its exact selector surface and every
2671
- exact selector-to-implementation pair in `entries[]`. During a partial phase,
2672
- an identity-complete row uses `trace_status: identity-complete`, structured
2673
- category projections, and an exact `unresolved` list for open category-link or
2674
- nested-registry work. It is valid at `inventory-complete` after the exact
2675
- family, entry, and edge census closes, but invalid at `final-receipt`. The
2676
- registry identity status is partial only while enumeration or an implementation
2677
- identity is open. A full semantic entry requires distinct exact
2678
- `selector_key`/`selector_token` and
2679
- `implementation_key`/`implementation_token`, atomic
2680
- `registry-entry-identity` evidence, all three `category_links`, and either
2681
- `child_registry_ids` or evidenced `child_registry_absence`.
2682
-
2683
- When the registry schema establishes an inventory category for all members,
2684
- every exact positive creates its own closure candidate. Entries in a worker
2685
- launch index, for example, create runtime-role candidates. Mixed integration,
2686
- plugin, or manifest indexes use exact structured per-entry discriminators such
2687
- as I/O class, transport, client, or endpoint declarations. Free-text names and
2688
- summaries are never category discriminators. Keep unresolved candidates
2689
- `pending`; do not project them into final inventory. A positive structured I/O
2690
- declaration remains positive when it describes local/device polling or push:
2691
- locality is destination placement, not proof of an in-process internal link.
2692
- Exact implementation evidence may still exclude a calculated/in-process,
2693
- dead/removal-only, or exact duplicate concern. Exhaust generic syntax- and
2694
- structured-key-derived passes over executable/worker registrations, connection
2695
- schemas, client and transport construction, endpoint and namespace constants,
2696
- migration/schema roots, storage adapters, durable operations, backup providers,
2697
- and generated inputs before stopping. A registry ledger alone does not close
2698
- or preserve scored inventory breadth.
2699
-
2700
- Each entry also has `child_registry_ids`. An empty list requires a
2701
- `child_registry_absence` mapping with a nonempty implementation-specific
2702
- `reason` and nonempty exact `evidence_ids`. Those evidence IDs include an atomic
2703
- `claim_kind: registry-leaf-inspection` record whose only subject is the exact
2704
- entry ID and whose repository source uses
2705
- `inspection_scope: implementation-body`; a bulk installer or registration
2706
- record cannot prove leafhood. Otherwise every referenced child
2707
- resolves to a declared `root: false` registry. Every non-root registry is linked by a parent
2708
- entry, roots are not children, all registries are reachable from a root, and
2709
- the graph is acyclic. This recursive closure prevents a parent connector,
2710
- transport, or provider from hiding nested authentication, catalog, schema,
2711
- storage, or key-management selections. A complete registry with no entries
2712
- explains `empty_reason`; a complete scan
2713
- with no registry surfaces explains `absence_reason`. Every discovered
2714
- candidate has a globally unique stable ID, nonempty `evidence_ids`, and one
2715
- disposition:
2716
-
2717
- - `mapped` requires nonempty `subject_ids` that resolve only to inventory IDs
2718
- in that category.
2719
- - `pending` is allowed only while the category is `partial`, omits
2720
- `subject_ids` and all exclusion fields, has a nonempty unique `unresolved`
2721
- exact-identity-gap list, and is named exactly in the category's `uncovered`
2722
- list. Runtime gaps are only `runtime-unit-identity`,
2723
- `deployment-control-kind`, `deployment-control-token`, and
2724
- `entrypoint-token`. State gaps are only `state-unit-identity`,
2725
- `state-owner-identity`, `address-token`, `reproduction-operation-kind`, and
2726
- `reproduction-token`. External gaps are only `operation-identity-key`,
2727
- `callsite-identity`, `callsite-token`, `boundary-operation-token`,
2728
- `destination-or-scope-key`, and `wrapper-trace`. Activation, role
2729
- reachability, backing-state, materialization, production authority, and other
2730
- downstream closure questions never belong in `unresolved`; carry them on the
2731
- final identity and keep closure partial.
2732
- - `excluded` omits `subject_ids` and requires a nonempty `exclusion_reason` plus
2733
- a structured `exclusion_basis`. A `duplicate-inventory` exclusion also names
2734
- exact `equivalent_subject_ids` and cites an atomic
2735
- `claim_kind: duplicate-inventory-equivalence` evidence record. That record's
2736
- exact subjects are the candidate ID plus the equivalent inventory IDs, and
2737
- its repository source uses `inspection_scope: implementation-body`. The
2738
- corresponding candidate audit row cites the same exact claim.
2739
-
2740
- A candidate referenced by a structured-registry link may be excluded only as
2741
- `duplicate-inventory`. Repository-supported providers, connectors, clients,
2742
- and backends remain mapped inventory when they are gated by profile, default,
2743
- configuration, flag, credential, or artifact selection; the gate makes their
2744
- inventory entry `activation: optional`, not absent. Build-only, test-only,
2745
- outside-boundary, internal-link, and non-independent-unit bases apply
2746
- only to candidates that are genuinely not supported inventory, never as a
2747
- synonym for “not selected by the default profile.”
2748
-
2749
- Finite production-reachable commands and batches are runtime roles. Duration,
2750
- normal exit, administration, and migration are not exclusion bases. Each exact
2751
- wrapper or entrypoint maps separately; its runtime mapping does not replace its
2752
- executable, command, annotation, or nested-subcommand registry identity.
2753
-
2754
- Every mapped runtime role, resource, and external dependency must be named by
2755
- at least one candidate in its category. This ledger records inspected
2756
- candidates; it is not permission to synthesize candidates from the final map.
2757
- Write it during discovery, before inventory synthesis, so an omitted launch
2758
- surface or backend cannot disappear merely because no output field mentions it.
2759
- A closure category may be `complete` only when its registry discovery is also
2760
- complete. All three categories may be complete only after
2761
- `review.yml.inventory_closure_audit` independently covers every category,
2762
- candidate ID, registry ID, registry-entry ID, derived entry-category link ID,
2763
- and parent-child edge ID. Review status may be `pass` only with complete
2764
- closure; blocked and provisional receipts retain honest `partial` status and
2765
- uncovered scope whenever that exact audit cannot be completed.
2766
-
2767
- Every resource and external dependency also has `consumer_edges`, exactly one
2768
- per `runtime_role_ids` entry. Each edge repeats that role's `activation` and
2769
- `activation_basis`; its evidence has `claim_kind: role-reachability`, exact
2770
- `subject_ids: [<inventory-id>, <runtime-role-id>]`, and a repository source with
2771
- `inspection_scope: role-call-path`. Its typed `role_call_path` identifies that
2772
- role and indexes two distinct locatable sources: a role module/entrypoint and
2773
- the concrete consumer use site. Non-direct paths add a third index for the
2774
- actual dispatch or configuration gate. The indexes must resolve to pairwise
2775
- distinct exact repository locator keys; duplicating a locator does not create a call path.
2776
- Changing only `locator_kind` does not make a location distinct.
2777
- Registration, a plugin factory, or packaging evidence is not a positive
2778
- consumer edge. Top-level activation is `active` when any consumer edge
2779
- is active and `optional` only when every consumer edge is optional. Empty
2780
- consumer sets remain possible only while the affected closure category is
2781
- partial; a complete category must name a positive consumer for every resource
2782
- and dependency.
2783
-
2784
- All atomic closure records—`external-capability-scope`,
2785
- `duplicate-inventory-equivalence`, `registry-category-decision`,
2786
- `registry-leaf-inspection`, `operational-surface-census`,
2787
- `selector-surface-census`, `role-reachability`, `state-owner-boundary`,
2788
- `rebuild-source-reachability`, `state-boundary-link`,
2789
- `external-interaction-boundary`, and `external-ownership-unresolved`—must be
2790
- decision-grade.
2791
- Their authority is `authoritative` or `indicative`, confidence is `proven` or
2792
- `strong`, and environment scope is `hosted-production`,
2793
- `production-reference`, or `self-host-reference`. Tentative, non-production,
2794
- local-development, example, and unknown evidence cannot support these claims.
2795
-
2796
- Use `authority: authoritative` only for a live deployment source or artifact
2797
- pipeline known to control it. Use `indicative` for executable code and
2798
- production-intended config, and `non-production` for self-host, dev, or example
2799
- sources. Prefer code, deployment config, and IaC over prose.
2800
-
2801
- `confidence: proven` means two independent primary sources or one authoritative
2802
- declaration; `strong` means direct executable source; `tentative` creates an
2803
- unresolved item. Every selected object, edge, profile, and consistency group
2804
- must cite evidence. Evidence can support multiple exact subject IDs.
2805
-
2806
- Every evidence record has a nonempty `assertion` and resolves a recognized
2807
- `environment_scope`, `authority` (`authoritative`, `indicative`, or
2808
- `non-production`), `confidence` (`proven`, `strong`, or `tentative`), and at
2809
- least one source through exactly one inline form or stable-ID catalog form.
2810
- Each source has either a normalized repository-relative POSIX `path`, typed
2811
- `locator_kind`, and structured `anchor`, or opaque `source_ref` plus a structured
2812
- `selector` or `record_key`. Use the second form for a deployment catalog
2813
- record or a Haystack adapter qualification
2814
- record. Never use a direct provider response. Its `kind` must identify that
2815
- source type. Opaque catalog sources omit repository-only `anchor`,
2816
- `locator_kind`, and `lines` fields. `source_ref` is an opaque catalog handle,
2817
- never a raw URL, ARN,
2818
- provider resource ID, production endpoint, credential, connection string, or
2819
- secret.
2820
-
2821
- Record every path actually excluded. External discovery enumerates every
2822
- repository-supported provider, connector, client, and backend capability once,
2823
- including capabilities gated off by active profiles. Role reachability decides
2824
- consumer edges and activation, not whether a supported capability exists. Do
2825
- not expand topology permutations, but do not collapse distinct provider
2826
- implementations. Use `status: partial` with uncovered scope when the budget
2827
- prevents a justified enumeration or reachability decision.
2828
-
2829
- Apply component rules and typed basename globs to normalized
2830
- repository-relative POSIX paths. Activate `spec`, `fixtures`, `mocks`, and
2831
- snapshot components only where repository evidence identifies a matching test
2832
- framework and test root; they can otherwise contain product specifications or
2833
- bootstrap adapters. Never use a substring pattern such as `*test*`, which also
2834
- matches `latest`, `contest`, and `attestation`. The reviewer
2835
- snapshot contains only tracked, retained source files and no `.git` directory.
2836
- Filesystem confinement must prevent reads outside it, and network must be off.
2837
- Reject symlinks that escape the retained tree or target an excluded path;
2838
- materialize allowed internal targets as regular files. Run a language-aware
2839
- preflight for co-located test declarations. If retained production files still
2840
- contain tests and no syntax-aware filter can remove them safely, block with
2841
- `reviewer-test-path-isolation-unavailable`. A prompt or isolated working
2842
- directory alone is insufficient.
2843
-
2844
- Record snapshot preparation as a structured executable plus argument list.
2845
- Keep `arguments` exactly `[skills, prepare-universe-review, --json]`; list each
2846
- approved tracked inactive gitlink as an exact normalized path in
2847
- `exclude_inactive_submodule_paths`. That field represents the repeated
2848
- `--exclude-inactive-submodule` option and is an empty list when no omission was
2849
- approved. Never store a shell command string.
2850
-
2851
- Before final validation, lint every `evidence.sources[].path` against the same
2852
- activated policy. A denied path is a blocker, and the validator resolves every
2853
- repository path against the current git root and rejects missing or non-file
2854
- sources.
2855
-
2856
- ## `review.yml`
2857
-
2858
- ```yaml
2859
- version: 1
2860
- inventory_closure_audit:
2861
- status: completed
2862
- mode: customer-cli-subagent
2863
- read_only: true
2864
- repository_only: true
2865
- independent_from_primary: true
2866
- resumable: true
2867
- ephemeral: false
2868
- spawned_subagents: 0
2869
- primary_plan_hidden_during_inventory: true
2870
- final_artifacts_unchanged_since_blind_inventory: true
2871
- session_id_recorded_in_private_scratch: true
2872
- output_capture: incremental-private-scratch
2873
- budget:
2874
- call_limit: 48
2875
- elapsed_limit_seconds: 600
2876
- repository_inspection_calls_used: 14
2877
- elapsed_seconds: 142
2878
- source_isolation:
2879
- enforced: true
2880
- preparation_command:
2881
- executable: haystack
2882
- arguments: [skills, prepare-universe-review, --json]
2883
- exclude_inactive_submodule_paths: []
2884
- preparation_status: ready-for-confinement
2885
- manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
2886
- haystack_hidden: true
2887
- git_metadata_included: false
2888
- network_disabled: true
2889
- filesystem_confined_to_snapshot: true
2890
- symlink_audit: passed
2891
- inline_test_audit: passed
2892
- reviewed_categories: [runtime-roles, stateful-resources, external-dependencies]
2893
- reviewed_candidate_ids:
2894
- - candidate-checkout-entrypoint
2895
- - candidate-orders-database
2896
- - candidate-order-event-log
2897
- - candidate-payments-client
2898
- reviewed_registry_ids: [registry-integration-clients]
2899
- reviewed_registry_entry_ids: [registry-entry-payments-client]
2900
- reviewed_registry_entry_category_link_ids:
2901
- - registry-entry-payments-client-link-runtime-roles
2902
- - registry-entry-payments-client-link-stateful-resources
2903
- - registry-entry-payments-client-link-external-dependencies
2904
- reviewed_registry_edge_ids: []
2905
- candidate_reviews:
2906
- - candidate_id: candidate-checkout-entrypoint
2907
- declared_disposition: mapped
2908
- verdict: confirmed
2909
- reason: The isolated auditor confirmed the packaged checkout entrypoint.
2910
- evidence_ids: [ev-checkout-entrypoint]
2911
- - candidate_id: candidate-orders-database
2912
- declared_disposition: mapped
2913
- verdict: confirmed
2914
- reason: The isolated auditor confirmed the orders database state concern.
2915
- evidence_ids: [ev-orders-db-client]
2916
- - candidate_id: candidate-order-event-log
2917
- declared_disposition: mapped
2918
- verdict: confirmed
2919
- reason: The isolated auditor confirmed the event-log state concern.
2920
- evidence_ids: [ev-order-topic]
2921
- - candidate_id: candidate-payments-client
2922
- declared_disposition: mapped
2923
- verdict: confirmed
2924
- reason: The isolated auditor confirmed the outbound payments interaction.
2925
- evidence_ids: [ev-payments-client]
2926
- state_owner_reviews:
2927
- - resource_id: orders-db
2928
- declared_basis: application-persistence-boundary
2929
- verdict: confirmed
2930
- reason: The isolated auditor confirmed the orders persistence boundary.
2931
- evidence_ids: [ev-orders-state-owner]
2932
- - resource_id: order-events
2933
- declared_basis: repository-declared-mutable-state
2934
- verdict: confirmed
2935
- reason: The isolated auditor confirmed the mutable event-log namespace.
2936
- evidence_ids: [ev-order-events-state-owner]
2937
- external_backing_state_reviews:
2938
- - external_dependency_id: payments-api
2939
- declared_disposition: none
2940
- declared_basis: interaction-only
2941
- declared_operation: stateless-exchange
2942
- verdict: confirmed
2943
- reason: >-
2944
- The call reproduces interaction behavior but owns no application
2945
- backing state.
2946
- evidence_ids: [ev-payments-boundary]
2947
- registry_entry_category_link_reviews:
2948
- - registry_entry_id: registry-entry-payments-client
2949
- category: runtime_roles
2950
- declared_disposition: not-applicable
2951
- declared_not_applicable_basis: no-independent-long-running-runtime
2952
- verdict: confirmed
2953
- reason: The isolated auditor found no independent runtime in the client body.
2954
- evidence_ids: [ev-payments-runtime-category]
2955
- - registry_entry_id: registry-entry-payments-client
2956
- category: stateful_resources
2957
- declared_disposition: not-applicable
2958
- declared_not_applicable_basis: no-independent-persistent-state-identity
2959
- verdict: confirmed
2960
- reason: The isolated auditor found no independently keyed persistent state identity.
2961
- evidence_ids: [ev-payments-state-category]
2962
- - registry_entry_id: registry-entry-payments-client
2963
- category: external_dependencies
2964
- declared_disposition: candidate
2965
- declared_candidate_id: candidate-payments-client
2966
- verdict: confirmed
2967
- reason: The isolated auditor confirmed the outbound client candidate.
2968
- evidence_ids: [ev-payments-external-category]
2969
- registry_leaf_reviews:
2970
- - registry_entry_id: registry-entry-payments-client
2971
- verdict: confirmed
2972
- reason: The isolated auditor inspected the implementation body for nested selectors.
2973
- evidence_ids: [ev-payments-leaf]
2974
- consumer_edge_reviews:
2975
- - subject_id: orders-db
2976
- runtime_role_id: checkout-http-role
2977
- declared_activation: active
2978
- verdict: confirmed
2979
- reason: The isolated auditor confirmed the orders call path for this role.
2980
- evidence_ids: [ev-orders-db-consumer]
2981
- - subject_id: order-events
2982
- runtime_role_id: checkout-http-role
2983
- declared_activation: active
2984
- verdict: confirmed
2985
- reason: The isolated auditor confirmed the event-log call path for this role.
2986
- evidence_ids: [ev-order-events-consumer]
2987
- - subject_id: payments-api
2988
- runtime_role_id: checkout-http-role
2989
- declared_activation: active
2990
- verdict: confirmed
2991
- reason: The isolated auditor confirmed the payments call path for this role.
2992
- evidence_ids: [ev-payments-consumer]
2993
- findings: []
2994
- reviewer:
2995
- mode: customer-cli-subagent
2996
- read_only: true
2997
- resumable: true
2998
- ephemeral: false
2999
- spawned_subagents: 0
3000
- primary_plan_hidden_during_inventory: true
3001
- session_id_recorded_in_private_scratch: true
3002
- output_capture: incremental-private-scratch
3003
- source_isolation:
3004
- enforced: true
3005
- mechanism: tracked-files-filtered-snapshot-and-filesystem-confinement
3006
- preparation_command:
3007
- executable: haystack
3008
- arguments: [skills, prepare-universe-review, --json]
3009
- exclude_inactive_submodule_paths: []
3010
- preparation_status: ready-for-confinement
3011
- manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
3012
- denied_components:
3013
- - .haystack
3014
- - __tests__
3015
- - test
3016
- - tests
3017
- - e2e
3018
- - cypress
3019
- - playwright
3020
- - testdata
3021
- - test-data
3022
- - integration-test
3023
- - integration-tests
3024
- - integration_test
3025
- - integration_tests
3026
- - acceptance-test
3027
- - acceptance-tests
3028
- - acceptance_test
3029
- - acceptance_tests
3030
- - system-test
3031
- - system-tests
3032
- - system_test
3033
- - system_tests
3034
- - test-results
3035
- - playwright-report
3036
- - .pytest_cache
3037
- - .nyc_output
3038
- conditional_component_rules:
3039
- - id: detected-framework-roots
3040
- components: [spec, specs, fixtures, __fixtures__, mocks, __mocks__, snapshots, __snapshots__]
3041
- condition: matching-test-framework-and-test-root-detected
3042
- activated_conditional_rule_ids: [detected-framework-roots]
3043
- denied_basename_globs:
3044
- - "*.test.{js,jsx,ts,tsx,mjs,cjs}"
3045
- - "*.spec.{js,jsx,ts,tsx,mjs,cjs,rb}"
3046
- - "*.e2e.{js,jsx,ts,tsx}"
3047
- - "*.e2e-spec.{js,jsx,ts,tsx}"
3048
- - "test-*.{js,jsx,ts,tsx,py,rb,go,rs}"
3049
- - "*-test.{js,jsx,ts,tsx,py,rb,go,rs}"
3050
- - "*_test.{py,go,rs,cc,cpp}"
3051
- - "*_tests.{py,rb}"
3052
- - "test_*.py"
3053
- - "*_unittest.{cc,cpp,py}"
3054
- - "*Test.{java,kt,kts,scala,groovy,cs,php,swift}"
3055
- - "*Tests.{java,kt,kts,scala,groovy,cs,php,swift}"
3056
- - "*.{snap,golden,approved}"
3057
- - "{jest,vitest,playwright,cypress}.config.*"
3058
- - "karma.conf.*"
3059
- - "mocha.config.*"
3060
- - "pytest.ini"
3061
- - "tox.ini"
3062
- - ".coveragerc"
3063
- - "junit*.xml"
3064
- haystack_hidden: true
3065
- git_metadata_included: false
3066
- network_disabled: true
3067
- filesystem_confined_to_snapshot: true
3068
- symlink_audit: passed
3069
- inline_test_detector: language-aware
3070
- inline_test_audit: passed
3071
-
3072
- budget:
3073
- primary_discovery:
3074
- call_limit: 48
3075
- elapsed_limit_seconds: 1800
3076
- repository_inspection_calls_used: 24
3077
- elapsed_seconds: 280
3078
- authority_gate:
3079
- call_limit: 6
3080
- elapsed_limit_seconds: 60
3081
- repository_inspection_calls_used: 5
3082
- elapsed_seconds: 43
3083
- blind_inventory:
3084
- call_limit: 24
3085
- elapsed_limit_seconds: 240
3086
- repository_inspection_calls_used: 18
3087
- elapsed_seconds: 211
3088
- comparison:
3089
- call_limit: 10
3090
- elapsed_limit_seconds: 120
3091
- repository_inspection_calls_used: 7
3092
- elapsed_seconds: 104
3093
- revision:
3094
- call_limit: 4
3095
- elapsed_limit_seconds: 60
3096
- repository_inspection_calls_used: 3
3097
- elapsed_seconds: 52
3098
- final_receipt:
3099
- tool_call_limit: 0
3100
- elapsed_limit_seconds: 60
3101
- tool_calls_used: 0
3102
- elapsed_seconds: 19
3103
-
3104
- reviewer_checkpoints:
3105
- - id: checkpoint-deployment-artifacts
3106
- bucket: deployment-artifacts
3107
- captured_in_private_scratch: true
3108
- payload_bytes: 8192
3109
- payload_limit_bytes: 24576
3110
- observation_ids: [blind-checkout-artifact]
3111
- coverage_ledger_id: coverage-deployment-artifacts
3112
- inspection_calls_used: 5
3113
- elapsed_seconds: 43
3114
- - id: checkpoint-runtime-state-dependencies
3115
- bucket: runtime-state-dependencies
3116
- captured_in_private_scratch: true
3117
- payload_bytes: 8192
3118
- payload_limit_bytes: 24576
3119
- observation_ids: [blind-checkout-runtime]
3120
- coverage_ledger_id: coverage-runtime-state-dependencies
3121
- inspection_calls_used: 8
3122
- elapsed_seconds: 82
3123
- - id: checkpoint-interfaces-egress
3124
- bucket: interfaces-egress
3125
- captured_in_private_scratch: true
3126
- payload_bytes: 4096
3127
- payload_limit_bytes: 24576
3128
- observation_ids: [blind-checkout-interface]
3129
- coverage_ledger_id: coverage-interfaces-egress
3130
- inspection_calls_used: 3
3131
- elapsed_seconds: 31
3132
- - id: checkpoint-gap-checks
3133
- bucket: gap-checks
3134
- captured_in_private_scratch: true
3135
- payload_bytes: 4096
3136
- payload_limit_bytes: 24576
3137
- observation_ids: [blind-checkout-gaps]
3138
- coverage_ledger_id: coverage-gap-checks
3139
- inspection_calls_used: 2
3140
- elapsed_seconds: 25
3141
-
3142
- coverage_ledger:
3143
- - id: coverage-deployment-artifacts
3144
- bucket: deployment-artifacts
3145
- phase: blind-inventory
3146
- scope: deployment-and-artifact-pipelines
3147
- status: covered
3148
- checkpoint_id: checkpoint-deployment-artifacts
3149
- scanned_roots: [infra, deploy, .github/workflows]
3150
- evidence_ids: [ev-prod-checkout-deploy, ev-checkout-image-ci]
3151
- inspection_calls_used: 5
3152
- uncovered: []
3153
- - id: coverage-runtime-state-dependencies
3154
- bucket: runtime-state-dependencies
3155
- phase: blind-inventory
3156
- status: covered
3157
- checkpoint_id: checkpoint-runtime-state-dependencies
3158
- scanned_roots: [apps/checkout]
3159
- evidence_ids: [ev-orders-db-client]
3160
- uncovered: []
3161
- - id: coverage-interfaces-egress
3162
- bucket: interfaces-egress
3163
- phase: blind-inventory
3164
- status: covered
3165
- checkpoint_id: checkpoint-interfaces-egress
3166
- scanned_roots: [apps/checkout]
3167
- evidence_ids: [ev-order-topic]
3168
- uncovered: []
3169
- - id: coverage-gap-checks
3170
- bucket: gap-checks
3171
- phase: blind-inventory
3172
- status: covered
3173
- checkpoint_id: checkpoint-gap-checks
3174
- scanned_roots: [apps, infra, deploy]
3175
- evidence_ids: [ev-prod-checkout-deploy]
3176
- uncovered: []
3177
-
3178
- blind_observations:
3179
- - id: blind-checkout-artifact
3180
- subject_ids: [checkout-image]
3181
- assertion: The application image is built through the production pipeline.
3182
- sources:
3183
- - path: .github/workflows/build.yml
3184
- anchor: jobs.build-checkout
3185
- kind: workflow-key
3186
- locator_kind: manifest-key
3187
- - id: blind-checkout-runtime
3188
- subject_ids: [checkout-http-role]
3189
- assertion: The checkout runtime role reaches the selected state dependencies.
3190
- - id: blind-checkout-interface
3191
- subject_ids: [checkout-http]
3192
- assertion: The selected checkout interface is externally reachable.
3193
- - id: blind-checkout-gaps
3194
- subject_ids: [commerce-platform]
3195
- assertion: The bounded gap scan found no uncovered selected production scope.
3196
-
3197
- comparison_findings:
3198
- - id: review-prebuilt-image-bypasses-head
3199
- kind: artifact-bypasses-verification-commit
3200
- subject_ids: [checkout-image]
3201
- evidence_ids: [ev-self-host-compose]
3202
- resolution: accepted
3203
- resolution_evidence_ids: [ev-checkout-image-ci]
3204
- note: Replaced the fixed image with the commit-built artifact.
3205
-
3206
- phase_receipts:
3207
- - id: phase-comparison
3208
- phase: comparison
3209
- status: completed
3210
- budget_path: budget.comparison
3211
- payload_bytes: 4096
3212
- payload_limit_bytes: 24576
3213
- - id: phase-revision
3214
- phase: revision
3215
- status: completed
3216
- budget_path: budget.revision
3217
- payload_bytes: 2048
3218
- payload_limit_bytes: 24576
3219
- - id: phase-final-receipt
3220
- phase: final-receipt
3221
- status: completed
3222
- budget_path: budget.final_receipt
3223
- payload_bytes: 2048
3224
- payload_limit_bytes: 24576
3225
-
3226
- termination:
3227
- reason: completed
3228
- phase: final-receipt
3229
- identity_stabilization:
3230
- source_manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
3231
- census_record_digest: sha256:123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0
3232
- source_files_total: 412
3233
- source_files_scanned: 412
3234
- sweeps:
3235
- - id: identity-sweep-1
3236
- source_manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
3237
- source_files_scanned: 412
3238
- new_runtime_identity_count: 0
3239
- new_state_identity_count: 0
3240
- new_external_identity_count: 0
3241
- new_selector_family_count: 0
3242
- new_selector_entry_count: 0
3243
- - id: identity-sweep-2
3244
- source_manifest_digest: sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
3245
- source_files_scanned: 412
3246
- new_runtime_identity_count: 0
3247
- new_state_identity_count: 0
3248
- new_external_identity_count: 0
3249
- new_selector_family_count: 0
3250
- new_selector_entry_count: 0
3251
-
3252
- validation:
3253
- command: haystack skills validate-universe --json
3254
- status: passed
3255
- validator_contract_revision: 39
3256
-
3257
- status: pass
3258
- blocking_items: []
3259
- ```
3260
-
3261
- `inventory_closure_audit` is independent of production authority and is
3262
- mandatory on every receipt. Use `status: deferred` with a nonempty `reason`
3263
- only while at least one inventory-closure category remains partial; omit all
3264
- completed-audit fields on that path. A completed audit uses one durable,
3265
- read-only, repository-only customer-CLI subagent with no descendants, the same
3266
- mechanically isolated snapshot contract, and at most 48 repository-inspection
3267
- calls or 600 elapsed seconds. `reviewed_categories` is exactly
3268
- `runtime-roles`, `stateful-resources`, and `external-dependencies`.
3269
- `reviewed_candidate_ids`, `reviewed_registry_ids`,
3270
- `reviewed_registry_entry_ids`,
3271
- `reviewed_registry_entry_category_link_ids`, and
3272
- `reviewed_registry_edge_ids` must be exact set matches, not samples. Entry-link
3273
- IDs are derived as `<entry-id>-link-<kebab-category>`; edge IDs are
3274
- `<entry-id>-to-<child-registry-id>`.
3275
-
3276
- The completed receipt also has exactly one `candidate_reviews` row for every
3277
- candidate, one `state_owner_reviews` row for every final resource, one
3278
- `external_backing_state_reviews` row for every final external dependency, one
3279
- `registry_entry_category_link_reviews` row per derived link,
3280
- one `registry_leaf_reviews` row per declared leaf, and one
3281
- `consumer_edge_reviews` row per exact inventory-subject/runtime-role pair.
3282
- Candidate rows repeat the final `mapped` or `excluded` disposition and, when
3283
- excluded, the final `declared_exclusion_basis`. State-owner rows repeat the
3284
- final owner basis and cite the same atomic owner claim. External rows repeat
3285
- the final backing-state disposition, basis, operation, and named remote-state
3286
- identity key when present, and cite the same typed boundary claim. Category-link rows repeat the final
3287
- disposition, candidate ID or not-applicable basis, and leaf and consumer rows
3288
- repeat their exact structured identities and activation. Every row records a
3289
- verdict, a nonempty reason, and atomic evidence with the claim kind and
3290
- inspection scope required by the declaration it reviews. A corrected verdict
3291
- invalidates that pass: reconcile the artifacts, keep closure partial, and run
3292
- a new blind audit in a fresh independent session. The completed final receipt
3293
- sets `final_artifacts_unchanged_since_blind_inventory: true`, contains only
3294
- `confirmed` rows, and has `findings: []`. The independent auditor reopens the
3295
- final generated inventory, registry, reproduction, and closure artifacts,
3296
- rather than certifying only the earlier source census. Artifact immutability
3297
- never converts an unreviewed or discrepant row into a confirmed one. Any
3298
- pending candidate, partial selector family, unresolved reproduction,
3299
- uncovered range, corrected verdict, or remaining finding keeps the matching
3300
- category partial. These rows make the audit
3301
- decision-bearing rather than an exact-ID checklist. Any remaining
3302
- `remote-ownership-unproven` result requires partial state closure.
3303
-
3304
- Every finding on a superseded or partial audit has a stable ID, nonempty kind,
3305
- exact candidate, registry, and registry entry ID lists, nonempty evidence, and a
3306
- `resolved` or `unresolved` disposition. When no existing ID can represent a newly
3307
- found gap, the finding instead records nonempty `scope`; reconciliation must add
3308
- the resulting stable IDs before a fresh audit can certify closure. A resolved
3309
- finding includes a concise exact-ID `resolution`. A completed final audit has no
3310
- findings, including historical resolved ones.
3311
-
3312
- `budget.primary_discovery` is required for every receipt. Calls used are
3313
- non-negative integers; elapsed values are non-negative finite numbers. The
3314
- nested authority-gate limits and usage cannot exceed their primary-discovery
3315
- totals. The baseline `call_limit` is 48. Larger limits are selected in 48-call
3316
- waves with a nonempty, unique `extension_triggers` list drawn from
3317
- `unresolved-structured-registry`, `unresolved-launch-surface`,
3318
- `unresolved-state-provider`, `unresolved-egress-client`,
3319
- `retained-source-scale`, `omitted-production-source`, and
3320
- `closure-contradiction`. Omit the list at 48. Passing receipts must remain within
3321
- the selected call limit, the 1800-second total, and the 6-call/60-second authority
3322
- ceilings. Blocked receipts may record an overrun only when each exceeded budget
3323
- path is linked by a `kind: budget-exhausted` blocker as shown above.
3324
- Calls 48, 96, and 192 are checkpoints, not terminal cutoffs for an unresolved
3325
- identity frontier. `inventory-complete` requires a matching deterministic
3326
- identity-census receipt, exact one-time reconciliation of every presumptive
3327
- operational and registry record, no pending inventory candidate, complete
3328
- operational and selector censuses, and complete receipts for all four
3329
- operational frontiers. Materialization and production
3330
- authority and registry semantics may remain partial. `final-receipt`, not
3331
- `inventory-complete`, forbids `trace_status: identity-complete`,
3332
- `category_projections`, and unresolved category-link/child-registry decisions. Its
3333
- `termination.identity_stabilization` binds `source_manifest_digest`,
3334
- `census_record_digest` equal to the deterministic census receipt's
3335
- `second_record_digest`, equal
3336
- `source_files_total` and `source_files_scanned`, and exactly two `sweeps` to the
3337
- same manifest. Each sweep repeats the digest and scanned count and reports zero
3338
- new runtime, state, external, selector-family, and selector-entry identities.
3339
- These are consecutive source-wide sweeps, not repeated reads of one frontier.
3340
- Missing hosted-production authority defers
3341
- production review; it does not authorize early termination of repository
3342
- discovery.
3343
-
3344
- `budget.blind_inventory.call_limit` uses a 24-call baseline and may extend in
3345
- 24-call waves. Each selected wave adds up to 240 seconds to its elapsed limit.
3346
- Continue while an exact blind identity frontier is open and finish only after
3347
- two consecutive source-wide blind sweeps add no new exact identity. Persist and
3348
- split stable-ID-sorted checkpoints rather than dropping observations at the
3349
- 24 KiB payload boundary.
3350
-
3351
- Coverage status is `covered`, `partial`, or `uncovered`. Keep
3352
- `blind_observations` repository-derived and separate from findings about the
3353
- revealed candidate. Send and persist one blind checkpoint and one compact
3354
- comparison delta per bucket; do not ingest the full candidate YAML in one
3355
- reviewer message. Keep each checkpoint, projection chunk, and delta below
3356
- 24 KiB. Split oversized projections by sorted stable ID within the same total
3357
- budget; never fall back to full YAML.
3358
-
3359
- A passing receipt contains one checkpoint and one covered ledger entry for
3360
- each of `deployment-artifacts`, `runtime-state-dependencies`,
3361
- `interfaces-egress`, and `gap-checks`. Each checkpoint is captured in private
3362
- scratch, has positive `payload_bytes` no greater than its declared limit or
3363
- 24576, and links to its ledger by stable ID. The ledger links back, has nonempty
3364
- normalized `scanned_roots` and evidence, and has `uncovered: []`. It also
3365
- contains completed, bounded `phase_receipts` for comparison, revision, and the
3366
- final receipt. These records prove that the phases were recorded; they do not
3367
- establish materialization readiness.
3368
-
3369
- Allowed finding kinds include:
3370
-
3371
- - `omitted-service`, `omitted-resource`, `omitted-interface`, `missing-edge`,
3372
- and `missing-consistency-group`;
3373
- - `phantom-component`, `unstable-id`, `weak-evidence`, and `conflict`;
3374
- - `non-production-topology-promoted`, `missing-authoritative-source`, and
3375
- `fidelity-ceiling-overstated`;
3376
- - `artifact-bypasses-verification-commit` and
3377
- `production-recipe-equivalence-unproven`;
3378
- - `optional-profile-promoted`, `collapsed-structured-identity`, and
3379
- `unbounded-external-enumeration`.
3380
-
3381
- Finding resolution is `accepted`, `rejected`, or `unresolved`. A blocking item
3382
- that comes from review includes exact `finding_ids`; they must resolve to
3383
- `comparison_findings` IDs.
3384
-
3385
- Use `termination.reason: completed` only when the bounded protocol finishes.
3386
- Use `review-budget-exhausted` for an elapsed or call cutoff with material gaps.
3387
- Use `reviewer-quota-exhausted` for a CLI quota, usage, or context limit. Preserve
3388
- partial checkpoints and never replace the reviewer.
3389
-
3390
- Also block on `reviewer-subagent-unavailable`,
3391
- `reviewer-session-not-resumable`, `test-path-isolation-unavailable`,
3392
- `reviewer-test-path-isolation-unavailable`, provisional scope, missing required
3393
- production authority, unresolved findings, unproven artifact claims, or any
3394
- universe unresolved item.
3395
-
3396
- Set `status: pass` only when a real read-only subagent inspected the repository
3397
- in one durable resumable session within all budgets; source isolation was
3398
- mechanically enforced; all ledger scopes are covered; all findings are resolved
3399
- with evidence; application scope is confirmed; artifact and reproduction claims
3400
- meet this contract; and no blocker remains. A passing validator establishes
3401
- contract consistency, not inventory completeness or hermeticity.
3402
-
3403
- Every passing or provisional receipt records the exact command
3404
- `haystack skills validate-universe --json`, `validation.status: passed`, and
3405
- the JSON result's `validator_contract_revision`. A missing field, different
3406
- command, non-passing status, or revision mismatch means the receipt or installed
3407
- validator is stale and validation must not be accepted.
3408
-
3409
- When an independent evaluation reports precision or recall, a zero denominator
3410
- is `undefined`/`null`, never 100%. Keep the numerator and denominator beside the
3411
- rate so an empty mapper output cannot be presented as perfect precision.