@slicedearth/whoisleuth-cli 2.3.0 → 2.4.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 (264) hide show
  1. package/NOTICE +6 -0
  2. package/README.md +19 -15
  3. package/bin/whoisleuth.mjs +8 -1
  4. package/cli/archive-content-digest.mjs +14 -0
  5. package/cli/archive-inspect.mjs +20 -53
  6. package/cli/arguments.mjs +68 -6
  7. package/cli/artifact-validation/case-response.mjs +47 -41
  8. package/cli/artifact-validation/investigation-capsule.mjs +52 -31
  9. package/cli/artifact-validation/lookup-evidence.mjs +12 -6
  10. package/cli/artifact-validation/signed-review.mjs +83 -61
  11. package/cli/artifact-validation/structure-primitives.mjs +1 -105
  12. package/cli/artifact-verify.mjs +90 -24
  13. package/cli/assurance-command-runner.mjs +39 -4
  14. package/cli/bagit-folder.mjs +57 -0
  15. package/cli/bagit-review.mjs +23 -0
  16. package/cli/bounded-json.mjs +1 -1
  17. package/cli/bulk-command-runner.mjs +2 -0
  18. package/cli/bulk-output.mjs +29 -3
  19. package/cli/case-command.mjs +195 -0
  20. package/cli/case-pack.mjs +39 -31
  21. package/cli/command-argument-grammar.mjs +4 -0
  22. package/cli/command-reference.mjs +145 -75
  23. package/cli/completion.mjs +298 -79
  24. package/cli/config-profile.mjs +7 -5
  25. package/cli/ct-event-intake.mjs +12 -12
  26. package/cli/discover.mjs +4 -3
  27. package/cli/discovery-observation-snapshot.mjs +44 -16
  28. package/cli/discovery-scan-command-runner.mjs +2 -0
  29. package/cli/discovery-scan.mjs +7 -4
  30. package/cli/discovery-workflow.mjs +1 -1
  31. package/cli/domain-control-monitor.mjs +50 -20
  32. package/cli/domain-control-observations.mjs +149 -102
  33. package/cli/errors.mjs +33 -1
  34. package/cli/evidence-command-runner.mjs +16 -5
  35. package/cli/evidence-signing.mjs +2 -2
  36. package/cli/external-observation-mapping.mjs +7 -8
  37. package/cli/formatters/terminal-lookup.mjs +18 -46
  38. package/cli/formatters/terminal-shared.mjs +5 -3
  39. package/cli/formatters/terminal-technology.mjs +114 -0
  40. package/cli/inline-command-families.mjs +1 -0
  41. package/cli/interactive-launcher.mjs +2 -160
  42. package/cli/interchange-report.mjs +4 -8
  43. package/cli/investigation-artifacts.mjs +176 -0
  44. package/cli/investigation-checkpoint.mjs +10 -0
  45. package/cli/investigation-folder.mjs +114 -0
  46. package/cli/investigation-manifest.mjs +1 -112
  47. package/cli/investigation-package-review.mjs +103 -0
  48. package/cli/investigation-plan.mjs +32 -19
  49. package/cli/investigation-run.mjs +188 -33
  50. package/cli/local-document-checkpoint.mjs +170 -0
  51. package/cli/lookup-browser.mjs +5 -12
  52. package/cli/lookup-command-runner.mjs +17 -6
  53. package/cli/lookup-diff.mjs +37 -3
  54. package/cli/lookup-plan.mjs +11 -5
  55. package/cli/lookup-reconcile.mjs +10 -8
  56. package/cli/mail-review.mjs +66 -14
  57. package/cli/manual.mjs +1 -0
  58. package/cli/network-command-runner.mjs +2 -0
  59. package/cli/output-file.mjs +31 -5
  60. package/cli/registry-doctor.mjs +3 -1
  61. package/cli/registry-support.mjs +1 -1
  62. package/cli/retained-artifact-diff.mjs +2 -2
  63. package/cli/review-command-runner.mjs +45 -0
  64. package/cli/runner.mjs +55 -6
  65. package/cli/sharing-review.mjs +21 -34
  66. package/cli/signer-trust.mjs +104 -0
  67. package/cli/source-reliability.mjs +74 -83
  68. package/cli/terminal-input.mjs +168 -0
  69. package/cli/workflow-command-runner.mjs +68 -13
  70. package/docs/cli-reference.md +76 -30
  71. package/docs/cli.md +289 -25
  72. package/lib/abort.mjs +4 -1
  73. package/lib/availability.mjs +161 -112
  74. package/lib/bounded-file.mjs +3 -1
  75. package/lib/bounded-html-document.mjs +125 -0
  76. package/lib/bounded-json.mjs +43 -3
  77. package/lib/browser-library-profile.mjs +42 -51
  78. package/lib/browser-library-worker.mjs +112 -0
  79. package/lib/client-behavior-profile.mjs +3 -3
  80. package/lib/ct-search.mjs +11 -4
  81. package/lib/dns-delegation-health.mjs +24 -14
  82. package/lib/dns-inheritance-review.mjs +217 -0
  83. package/lib/dns-intelligence.mjs +36 -23
  84. package/lib/dns-mx.mjs +1 -1
  85. package/lib/dnssec-evidence-validation.mjs +11 -3
  86. package/lib/domain-change-packet.mjs +7 -2
  87. package/lib/domain-change-review.mjs +14 -8
  88. package/lib/domain-control-flight-recorder.mjs +219 -118
  89. package/lib/domain-control-manifest.mjs +117 -57
  90. package/lib/domain-posture-analysis.mjs +20 -7
  91. package/lib/domain-posture-parsers.mjs +88 -6
  92. package/lib/domain-posture.mjs +113 -26
  93. package/lib/evidence-export-privacy.mjs +561 -0
  94. package/lib/evidence-export.mjs +11 -592
  95. package/lib/evidence-report.mjs +3 -1
  96. package/lib/favicon.mjs +117 -41
  97. package/lib/generated/cisa-kev-catalog.mjs +12 -4
  98. package/lib/generated/registrar-standing-catalogue.mjs +7 -7
  99. package/lib/generated/retire-browser-catalog.mjs +2335 -940
  100. package/lib/hostname.mjs +2 -38
  101. package/lib/html-signals.mjs +82 -85
  102. package/lib/http-evidence-bounds.mjs +2 -1
  103. package/lib/http-intelligence.mjs +39 -26
  104. package/lib/lookup-cache.mjs +34 -11
  105. package/lib/lookup-child-profile-contract.mjs +24 -15
  106. package/lib/lookup-diagnostics.mjs +24 -1
  107. package/lib/lookup-progress.mjs +30 -13
  108. package/lib/lookup-response-contract.mjs +1048 -0
  109. package/lib/lookup-response.mjs +7 -10
  110. package/lib/lookup-source-progress.mjs +17 -14
  111. package/lib/lookup.mjs +48 -27
  112. package/lib/observed-network-context.mjs +43 -27
  113. package/lib/outbound-request-bounds.mjs +4 -1
  114. package/lib/page-fingerprints.mjs +69 -133
  115. package/lib/page-role-profile.mjs +12 -8
  116. package/lib/perceptual-hash.mjs +43 -14
  117. package/lib/rdap-bootstrap.mjs +72 -22
  118. package/lib/rdap-client.mjs +15 -7
  119. package/lib/rdap-normalization.mjs +33 -18
  120. package/lib/rdap-search-workbench.mjs +1 -1
  121. package/lib/rdap-transport.mjs +47 -20
  122. package/lib/rdap-types.mjs +2 -1
  123. package/lib/rdap.mjs +18 -3
  124. package/lib/registrable-domain.mjs +21 -1
  125. package/lib/registrar-standing-contract.mjs +1 -0
  126. package/lib/registry-capabilities.mjs +5 -1
  127. package/lib/registry-capability-catalogue.mjs +2 -1
  128. package/lib/registry-dates.mjs +2 -190
  129. package/lib/registry-insights.mjs +56 -18
  130. package/lib/response-policy.mjs +86 -48
  131. package/lib/risk-calibration-summary.mjs +17 -3
  132. package/lib/rpki-evidence.mjs +8 -5
  133. package/lib/safe-fetch.mjs +54 -47
  134. package/lib/security-txt.mjs +10 -7
  135. package/lib/service-binding-dns.mjs +8 -0
  136. package/lib/smtp-transport-review.mjs +27 -15
  137. package/lib/sslbl-certificates.generated.mjs +136 -135
  138. package/lib/static-html-analysis.mjs +117 -146
  139. package/lib/structured-data-identity.mjs +1 -0
  140. package/lib/technology-markup.mjs +100 -0
  141. package/lib/threat-intelligence-manifests.mjs +11 -139
  142. package/lib/threat-intelligence-runtime.mjs +24 -52
  143. package/lib/threat-intelligence-targets.mjs +6 -34
  144. package/lib/threat-intelligence-types.mjs +39 -0
  145. package/lib/typosquat-generator.mjs +19 -15
  146. package/lib/urlhaus-intelligence.mjs +8 -3
  147. package/lib/urlscan-intelligence.mjs +1 -1
  148. package/lib/website-security-posture.mjs +30 -6
  149. package/lib/website-technology.mjs +111 -71
  150. package/lib/whois-authority.mjs +14 -2
  151. package/lib/whois-chain.mjs +9 -2
  152. package/lib/whois-common-formats.mjs +5 -5
  153. package/lib/whois-contracts.mjs +2 -1
  154. package/lib/whois-dialects.mjs +2 -2
  155. package/lib/whois-parser-support.mjs +8 -1
  156. package/lib/whois-transport.mjs +23 -7
  157. package/package.json +2 -1
  158. package/packages/cases/case-attachment-model.mjs +83 -0
  159. package/packages/cases/case-evidence-model.mjs +156 -62
  160. package/packages/cases/case-export-input.mjs +53 -0
  161. package/packages/cases/case-migration-model.mjs +59 -25
  162. package/packages/cases/case-model.mjs +1 -0
  163. package/packages/cases/case-recheck-model.mjs +91 -0
  164. package/packages/cases/case-record-core.mjs +3 -2
  165. package/packages/cases/case-record-operations.mjs +89 -27
  166. package/packages/cases/case-record-projection.mjs +23 -20
  167. package/packages/cases/case-report.mjs +63 -52
  168. package/packages/cases/case-response-actions.mjs +654 -0
  169. package/packages/cases/case-response-model.mjs +41 -1129
  170. package/packages/cases/case-response-outcomes.mjs +317 -0
  171. package/packages/cases/case-response-packet-render.mjs +153 -0
  172. package/packages/cases/case-response-packet-types.mjs +1 -0
  173. package/packages/cases/case-response-packet-vocabulary.mjs +48 -0
  174. package/packages/cases/case-response-packet.mjs +38 -587
  175. package/packages/cases/case-response-records.mjs +94 -0
  176. package/packages/cases/case-response-review-inputs.mjs +371 -0
  177. package/packages/cases/case-response-values.mjs +85 -0
  178. package/packages/cases/case-review-package.mjs +45 -0
  179. package/packages/cases/case-selection.mjs +46 -0
  180. package/packages/cases/case-storage-model.mjs +25 -0
  181. package/packages/cases/response-route-freshness.mjs +16 -0
  182. package/packages/comparison/capture-context.mjs +61 -0
  183. package/packages/comparison/comparison-ledger-bulk.mjs +4 -1
  184. package/packages/comparison/page-similarity.mjs +2 -1
  185. package/packages/comparison/relationship-evidence.mjs +85 -8
  186. package/packages/comparison/relationship-provenance.mjs +93 -0
  187. package/packages/contracts/analyst-interchange.mjs +216 -0
  188. package/packages/contracts/analyst-review-state-contract.mjs +11 -0
  189. package/packages/contracts/analyst-review-state.mjs +5 -4
  190. package/packages/contracts/case-portability.mjs +279 -116
  191. package/packages/contracts/case-views-contract.mjs +12 -0
  192. package/packages/contracts/case-views.mjs +26 -0
  193. package/packages/contracts/cli-command-semantics.mjs +1 -0
  194. package/packages/contracts/cli-lookup.mjs +0 -1
  195. package/packages/contracts/domain-control-flight-recorder.mjs +80 -42
  196. package/packages/contracts/domain-control-manifest.mjs +127 -73
  197. package/packages/contracts/domain-control-monitor.mjs +48 -45
  198. package/packages/contracts/domain-control-review.mjs +179 -121
  199. package/packages/contracts/domain-name.mjs +21 -0
  200. package/packages/contracts/external-observation-interchange.mjs +2 -1
  201. package/packages/contracts/extracted-domain-lifecycle.mjs +11 -32
  202. package/packages/contracts/http-url.mjs +2 -0
  203. package/packages/contracts/investigation-package-limits.mjs +24 -0
  204. package/packages/contracts/investigation-portability.mjs +56 -27
  205. package/packages/contracts/investigation-run.mjs +16 -0
  206. package/packages/contracts/ip-address.mjs +34 -0
  207. package/packages/contracts/lookup-evidence.mjs +35 -0
  208. package/packages/contracts/offline-comparison.mjs +1 -2
  209. package/packages/contracts/page-fingerprints.mjs +15 -0
  210. package/packages/contracts/risk-calibration.mjs +0 -1
  211. package/packages/contracts/schema-compatibility.mjs +1 -1
  212. package/packages/contracts/schema-lifecycle.mjs +83 -153
  213. package/packages/contracts/selected-file-limits.mjs +6 -0
  214. package/packages/contracts/vulnerability-identifiers.mjs +5 -0
  215. package/packages/contracts/web-capture.mjs +10 -0
  216. package/packages/contracts/workspace-portability.mjs +160 -225
  217. package/packages/evidence/artifact-integrity.mjs +8 -2
  218. package/packages/evidence/artifact-structure.mjs +105 -0
  219. package/packages/evidence/decision-fact.mjs +4 -1
  220. package/packages/evidence/domain-control-runtime.mjs +155 -27
  221. package/packages/evidence/domain-posture-context.mjs +79 -0
  222. package/packages/evidence/image-regions.mjs +56 -0
  223. package/packages/evidence/latest-observations.mjs +28 -0
  224. package/packages/evidence/lookup-target.mjs +104 -0
  225. package/packages/evidence/observation.mjs +16 -1
  226. package/packages/evidence/passphrase-encryption.mjs +44 -0
  227. package/packages/evidence/record-identity.mjs +72 -0
  228. package/packages/evidence/registry-dates.mjs +190 -0
  229. package/packages/evidence/retained-file.mjs +69 -0
  230. package/packages/evidence/review-age.mjs +14 -0
  231. package/packages/interchange/bagit.mjs +342 -0
  232. package/packages/interchange/bounded-zip-extraction.mjs +278 -0
  233. package/packages/interchange/crc32.mjs +17 -0
  234. package/packages/interchange/external-findings-import.mjs +89 -49
  235. package/packages/interchange/web-capture-import.mjs +382 -0
  236. package/packages/investigation/bulk-mail-exposure.mjs +2 -1
  237. package/packages/investigation/investigation-bagit.mjs +14 -0
  238. package/packages/investigation/investigation-capsule.mjs +33 -5
  239. package/packages/investigation/investigation-manifest.mjs +200 -0
  240. package/packages/investigation/investigation-package-crypto.mjs +98 -0
  241. package/packages/investigation/investigation-package.mjs +200 -0
  242. package/packages/investigation/lookup-asset-graph-inputs.mjs +38 -0
  243. package/packages/investigation/lookup-asset-graph.mjs +161 -141
  244. package/packages/investigation/lookup-claim-readiness.mjs +18 -0
  245. package/packages/investigation/lookup-investigation-brief.mjs +3 -3
  246. package/packages/investigation/lookup-task-guidance.mjs +58 -0
  247. package/packages/monitoring/analyst-review-state.mjs +38 -90
  248. package/packages/workspace/brand-profile-model.mjs +158 -20
  249. package/packages/workspace/bulk-columns.mjs +17 -0
  250. package/packages/workspace/bulk-review-model.mjs +11 -5
  251. package/packages/workspace/bulk-session-model.mjs +95 -20
  252. package/packages/workspace/bulk-sort.mjs +1 -0
  253. package/packages/workspace/case-views.mjs +102 -0
  254. package/packages/workspace/hostile-input.mjs +29 -8
  255. package/packages/workspace/investigation-template-model.mjs +19 -4
  256. package/packages/workspace/page-baseline.mjs +18 -15
  257. package/packages/workspace/relationship-observation-model.mjs +41 -26
  258. package/packages/workspace/watchlist-history.mjs +2 -2
  259. package/packages/workspace/watchlist-store.mjs +8 -2
  260. package/packages/workspace/website-snapshot-model.mjs +70 -30
  261. package/packages/workspace/workspace-archive-crypto.mjs +41 -61
  262. package/packages/workspace/workspace-archive.mjs +85 -21
  263. package/third-party-notices.txt +29 -2
  264. package/packages/investigation/bulk-review-export.mjs +0 -63
@@ -0,0 +1,12 @@
1
+ export const CASE_VIEWS_SCHEMA = 'whoisleuth.case-views';
2
+ export const CASE_VIEWS_VERSION = 1;
3
+ export const MAX_CASE_VIEWS = 100;
4
+ export const MAX_CASE_VIEW_NAME_LENGTH = 80;
5
+ export const MAX_CASE_VIEW_SEARCH_LENGTH = 512;
6
+ // Accommodates 100 views with maximum-length Unicode names and search text.
7
+ export const MAX_CASE_VIEWS_BYTES = 512 * 1024;
8
+ export const CASE_VIEW_SORTS = Object.freeze([
9
+ { value: 'updated', label: 'Recently updated' },
10
+ { value: 'domain', label: 'Domain' },
11
+ { value: 'status', label: 'Status' },
12
+ ]);
@@ -0,0 +1,26 @@
1
+ import { defineSchemaCompatibility } from "./schema-compatibility.mjs";
2
+ import { buildExtractedLifecycleFamily } from "./extracted-domain-lifecycle.mjs";
3
+ import { defineSchemaLifecycleFamily } from "./schema-lifecycle.mjs";
4
+ import { CASE_VIEWS_SCHEMA, CASE_VIEWS_VERSION, MAX_CASE_VIEWS_BYTES } from "./case-views-contract.mjs";
5
+ export const CASE_VIEWS_COMPATIBILITY = defineSchemaCompatibility({
6
+ id: 'browser.case-views', kind: 'browser_store', schema: CASE_VIEWS_SCHEMA,
7
+ currentVersion: CASE_VIEWS_VERSION, supportedVersions: [CASE_VIEWS_VERSION],
8
+ acceptsUnversionedLegacy: false, futureVersionBehavior: 'preserve_without_write',
9
+ migration: 'exact_current_only', writeSemantics: 'optimistic_replace',
10
+ byteBudget: MAX_CASE_VIEWS_BYTES, owner: 'packages/contracts/case-views.mts',
11
+ note: 'Workspace-local named Case filters. Saved views retain no result set and grant no collection authority; workspace exports include their names and search text.',
12
+ });
13
+ export const CASE_VIEWS_LIFECYCLE_FAMILY = /* @__PURE__ */ defineSchemaLifecycleFamily(/* @__PURE__ */ buildExtractedLifecycleFamily({
14
+ id: 'case-views', owner: 'packages/contracts/case-views.mts',
15
+ serializerModule: 'packages/workspace/case-views.mts', serializerExportName: 'serialiseCaseViewsJson',
16
+ plane: 'browser', projection: 'browser_import', retention: 'browser_indexeddb', notePolicy: 'allowed_bounded',
17
+ includedCategories: ['saved-filter-name', 'case-status-and-disposition', 'search-text', 'sort-order', 'authored-times'],
18
+ excludedCategories: ['matching-case-records', 'source-evidence', 'collection-authorisation', 'public-response-packets'],
19
+ formats: [{
20
+ descriptor: CASE_VIEWS_COMPATIBILITY, lifecycleSchema: CASE_VIEWS_SCHEMA,
21
+ requiredKeys: ['schema', 'version', 'views'], optionalKeys: [],
22
+ hook: { module: 'packages/workspace/case-views.mts', exportName: 'normalizeCaseViewsStore', role: 'normaliser', runtime: 'shared' },
23
+ fixtures: [{ id: 'case-views-v1', path: 'test/fixtures/extracted-domain-lifecycle/case-views-v1.json', version: 1,
24
+ bytes: 408, sha256: '015592dd0d6f4536b5960be9325b8d3b8c136eaab195d82383ab9a320a03f855' }],
25
+ }],
26
+ }));
@@ -78,6 +78,7 @@ export const CLI_COMMAND_SEMANTICS = Object.freeze({
78
78
  'mail-headers': semantic('investigate', CAPABILITY_IDS.OFFLINE_REVIEW),
79
79
  'review-evidence': semantic('investigate', CAPABILITY_IDS.PORTABLE_EVIDENCE),
80
80
  brief: semantic('investigate', CAPABILITY_IDS.OFFLINE_REVIEW),
81
+ case: semantic('respond', CAPABILITY_IDS.ANALYST_CASES),
81
82
  'case-pack': semantic('respond', CAPABILITY_IDS.PORTABLE_EVIDENCE),
82
83
  'domain-control': semantic('assure', CAPABILITY_IDS.PORTABLE_EVIDENCE),
83
84
  'monitor-once': semantic('assure', CAPABILITY_IDS.LOOKUP),
@@ -156,7 +156,6 @@ export const CLI_LOOKUP_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamily({
156
156
  },
157
157
  ],
158
158
  metadata: {
159
- metadataVersion: 3,
160
159
  enforcement: 'declarative_only',
161
160
  shapes: [
162
161
  {
@@ -1,20 +1,25 @@
1
1
  import { defineSchemaCompatibility } from "./schema-compatibility.mjs";
2
2
  import { defineSchemaLifecycleFamily } from "./schema-lifecycle.mjs";
3
- import { MAX_DOMAIN_CONTROL_MANIFEST_BYTES, } from "./domain-control-manifest.mjs";
3
+ import { MAX_DOMAIN_CONTROL_MANIFEST_BYTES, MAX_CURRENT_DOMAIN_CONTROL_RECORDS, MAX_DOMAIN_CONTROL_DS_PRESENTATION_LENGTH, } from "./domain-control-manifest.mjs";
4
4
  import { MAX_DOMAIN_CONTROL_MONITOR_CONCURRENCY, MAX_DOMAIN_CONTROL_MONITOR_DOMAINS, MIN_DOMAIN_CONTROL_MONITOR_CONCURRENCY, MIN_DOMAIN_CONTROL_MONITOR_DOMAINS, } from "./domain-control-monitor.mjs";
5
5
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA = 'whoisleuth.domain-control-flight-recorder.input';
6
6
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA = 'whoisleuth.domain-control-flight-recorder';
7
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION = 1;
7
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION = 1;
8
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION = 2;
9
+ export const SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS = [PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION, DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION];
8
10
  export const MIN_FLIGHT_RECORDER_OBSERVATIONS = 1;
9
11
  export const MAX_FLIGHT_RECORDER_OBSERVATIONS = 200;
10
12
  export const MAX_FLIGHT_RECORDER_WINDOWS = 40;
11
13
  export const MAX_FLIGHT_RECORDER_FIELDS = 24;
12
- export const MAX_FLIGHT_RECORDER_VALUES = 32;
14
+ export const PUBLIC_MAX_FLIGHT_RECORDER_VALUES = 32;
15
+ export const MAX_FLIGHT_RECORDER_VALUES = MAX_CURRENT_DOMAIN_CONTROL_RECORDS;
13
16
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_VALUE_INPUT_FACTOR = 2;
14
17
  export const MAX_FLIGHT_RECORDER_INPUT_VALUES = MAX_FLIGHT_RECORDER_VALUES
15
18
  * DOMAIN_CONTROL_FLIGHT_RECORDER_VALUE_INPUT_FACTOR;
19
+ export const PUBLIC_MAX_FLIGHT_RECORDER_INPUT_VALUES = PUBLIC_MAX_FLIGHT_RECORDER_VALUES * DOMAIN_CONTROL_FLIGHT_RECORDER_VALUE_INPUT_FACTOR;
16
20
  export const MAX_FLIGHT_RECORDER_SOURCE_LENGTH = 120;
17
- export const MAX_FLIGHT_RECORDER_VALUE_LENGTH = 500;
21
+ export const PUBLIC_MAX_FLIGHT_RECORDER_VALUE_LENGTH = 500;
22
+ export const MAX_FLIGHT_RECORDER_VALUE_LENGTH = MAX_DOMAIN_CONTROL_DS_PRESENTATION_LENGTH;
18
23
  export const MAX_FLIGHT_RECORDER_WINDOW_ID_LENGTH = 64;
19
24
  export const MAX_FLIGHT_RECORDER_WINDOW_REASON_LENGTH = 400;
20
25
  export const MAX_FLIGHT_RECORDER_JSON_DEPTH = 8;
@@ -45,18 +50,20 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_KEYS = Object.freeze([
45
50
  'observations',
46
51
  'approvedWindows',
47
52
  ]);
48
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS = Object.freeze([
53
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS = Object.freeze([
49
54
  'domain',
50
55
  'observedAt',
51
56
  'collectionDepth',
52
57
  'fields',
53
58
  ]);
54
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS = Object.freeze([
59
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS = Object.freeze(['domain', 'capturedAt', 'collectionDepth', 'fields']);
60
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS = Object.freeze([
55
61
  'id',
56
62
  'source',
57
63
  'state',
58
64
  'values',
59
65
  ]);
66
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS = Object.freeze([...PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS, 'observedAt']);
60
67
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_WINDOW_KEYS = Object.freeze([
61
68
  'id',
62
69
  'domain',
@@ -75,7 +82,7 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_ROOT_KEYS = Object.freeze([
75
82
  'summary',
76
83
  'limitations',
77
84
  ]);
78
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS = Object.freeze([
85
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS = Object.freeze([
79
86
  'id',
80
87
  'domain',
81
88
  'field',
@@ -88,11 +95,12 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS = Object.freeze([
88
95
  'approvedWindow',
89
96
  'explanation',
90
97
  ]);
98
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS = Object.freeze([...PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS, 'capturedAt']);
91
99
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_APPROVED_WINDOW_KEYS = Object.freeze([
92
100
  'id',
93
101
  'reason',
94
102
  ]);
95
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS = Object.freeze([
103
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS = Object.freeze([
96
104
  'firstObservations',
97
105
  'observedChanges',
98
106
  'approvedChanges',
@@ -100,21 +108,26 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS = Object.freeze([
100
108
  'collectionChanges',
101
109
  'recoveredSources',
102
110
  ]);
103
- export const DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS = Object.freeze([
111
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS = Object.freeze([...PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS, 'incompleteFields']);
112
+ export const PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS = Object.freeze([
104
113
  'The flight recorder compares only supplied bounded observations and performs no collection or configuration change.',
105
114
  'Source fields remain separate. A collection failure, partial result, unsupported source, or missing field never becomes evidence that a prior value disappeared.',
106
115
  'Approved windows label expected timing but do not delete evidence or establish that a change was authorised, successful, safe, or complete.',
107
116
  'Observed changes can reflect publication lag or different collection conditions and require analyst review.',
108
117
  ]);
118
+ export const DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS = Object.freeze([
119
+ ...PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS,
120
+ 'Capture time and source observation time remain separate. Unknown, conflicting or non-increasing source times cannot establish an observed change.',
121
+ ]);
109
122
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_COMPATIBILITY = defineSchemaCompatibility({
110
123
  id: 'cli.domain-control-flight-recorder-input',
111
124
  kind: 'cli_document',
112
125
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA,
113
126
  currentVersion: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
114
- supportedVersions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION],
127
+ supportedVersions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS,
115
128
  acceptsUnversionedLegacy: false,
116
129
  futureVersionBehavior: 'reject',
117
- migration: 'exact_current_only',
130
+ migration: 'read_only',
118
131
  writeSemantics: 'read_only',
119
132
  byteBudget: MAX_DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_BYTES,
120
133
  owner: 'packages/contracts/domain-control-flight-recorder.mts',
@@ -125,15 +138,18 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_COMPATIBILITY = defineSchemaCompatib
125
138
  kind: 'cli_document',
126
139
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA,
127
140
  currentVersion: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
128
- supportedVersions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION],
141
+ supportedVersions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS,
129
142
  acceptsUnversionedLegacy: false,
130
143
  futureVersionBehavior: 'reject',
131
- migration: 'exact_current_only',
144
+ migration: 'read_only',
132
145
  writeSemantics: 'read_only',
133
146
  byteBudget: MAX_DOMAIN_CONTROL_FLIGHT_RECORDER_OUTPUT_BYTES,
134
147
  owner: 'packages/contracts/domain-control-flight-recorder.mts',
135
148
  note: 'Offline first and last observed control history that preserves expected and unexpected changes.',
136
149
  });
150
+ const FLIGHT_INPUT_SHAPE_IDS = SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS.map((version) => `domain-control-flight-recorder.input.v${version}`);
151
+ const FLIGHT_DOCUMENT_SHAPE_IDS = SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS.map((version) => `domain-control-flight-recorder.document.v${version}`);
152
+ const CURRENT_FLIGHT_DOCUMENT_SHAPE_ID = `domain-control-flight-recorder.document.v${DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION}`;
137
153
  export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifecycleFamily({
138
154
  id: 'domain-control-flight-recorder',
139
155
  owner: 'packages/contracts/domain-control-flight-recorder.mts',
@@ -175,7 +191,11 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
175
191
  byteBudget: MAX_DOMAIN_CONTROL_FLIGHT_RECORDER_OUTPUT_BYTES,
176
192
  fixtureIds: ['domain-control-flight-recorder-v1'],
177
193
  },
178
- ],
194
+ ].flatMap((contract) => SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS.map((version) => ({
195
+ ...contract, version, lifecycle: version === DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? 'current' : 'legacy',
196
+ emitted: contract.emitted && version === DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
197
+ fixtureIds: contract.fixtureIds.map((id) => id.replace(/v\d+$/u, `v${version}`)),
198
+ }))),
179
199
  fixtures: [
180
200
  {
181
201
  id: 'domain-control-flight-recorder-input-v1',
@@ -184,7 +204,7 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
184
204
  sha256: '1fc4127a5885409d2ba76d40c1835a496767c6fe6d87f0545d8367d5f394a628',
185
205
  contentDigestSha256: null,
186
206
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA,
187
- version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
207
+ version: PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
188
208
  role: 'input',
189
209
  expectation: 'normalises_to_current_output',
190
210
  expectedOutputFixtureId: 'domain-control-flight-recorder-v1',
@@ -197,25 +217,34 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
197
217
  sha256: 'c35d43907bba7a7912f3151bc1a2ba37bb8f774c56a3bd5f690be262e842cf4c',
198
218
  contentDigestSha256: null,
199
219
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA,
200
- version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
220
+ version: PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION,
201
221
  role: 'current',
202
222
  expectation: 'accepted_exact',
203
223
  expectedOutputFixtureId: null,
204
224
  scope: 'repository',
205
225
  },
206
- ],
226
+ ].flatMap((fixture) => {
227
+ const version = DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION;
228
+ const id = fixture.id.replace(/v\d+$/u, `v${version}`);
229
+ const content = fixture.role === 'input'
230
+ ? { bytes: 2108, sha256: '6998ea864355dd0802b3b6f2c4905f8c84136ad0d4ac9cad1a0fd63dca523b60' }
231
+ : { bytes: 4649, sha256: '8f3168d101291166f34cede351bc176a934e7997920cd8c22ec00d642ec000df' };
232
+ return [
233
+ { ...fixture, role: fixture.role === 'input' ? 'input' : 'historical', expectation: 'accepted_exact', expectedOutputFixtureId: null },
234
+ { ...fixture, ...content, id, path: `test/fixtures/${id}.json`, version, expectedOutputFixtureId: fixture.expectedOutputFixtureId?.replace(/v\d+$/u, `v${version}`) ?? null },
235
+ ];
236
+ }),
207
237
  metadata: {
208
- metadataVersion: 2,
209
238
  enforcement: 'declarative_only',
210
- shapes: [
239
+ shapes: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS.flatMap((version) => [
211
240
  {
212
- id: 'domain-control-flight-recorder.input.v1',
241
+ id: `domain-control-flight-recorder.input.v${version}`,
213
242
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA,
214
- versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION],
243
+ versions: [version],
215
244
  objects: [
216
245
  { path: '$', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
217
- { path: '$.observations[]', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS, optionalKeys: [], unknownKeys: 'reject' },
218
- { path: '$.observations[].fields[]', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS, optionalKeys: [], unknownKeys: 'reject' },
246
+ { path: '$.observations[]', requiredKeys: version === PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS : DOMAIN_CONTROL_FLIGHT_RECORDER_OBSERVATION_KEYS, optionalKeys: [], unknownKeys: 'reject' },
247
+ { path: '$.observations[].fields[]', requiredKeys: version === PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS : DOMAIN_CONTROL_FLIGHT_RECORDER_FIELD_KEYS, optionalKeys: [], unknownKeys: 'reject' },
219
248
  { path: '$.approvedWindows[]', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_WINDOW_KEYS, optionalKeys: [], unknownKeys: 'reject' },
220
249
  ],
221
250
  fixedArrays: [],
@@ -223,20 +252,20 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
223
252
  target: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
224
253
  },
225
254
  {
226
- id: 'domain-control-flight-recorder.document.v1',
255
+ id: `domain-control-flight-recorder.document.v${version}`,
227
256
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA,
228
- versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION],
257
+ versions: [version],
229
258
  objects: [
230
259
  { path: '$', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_ROOT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
231
- { path: '$.events[]', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
260
+ { path: '$.events[]', requiredKeys: version === PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS : DOMAIN_CONTROL_FLIGHT_RECORDER_EVENT_KEYS, optionalKeys: [], unknownKeys: 'reject' },
232
261
  { path: '$.events[].approvedWindow', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_APPROVED_WINDOW_KEYS, optionalKeys: [], unknownKeys: 'reject' },
233
- { path: '$.summary', requiredKeys: DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
262
+ { path: '$.summary', requiredKeys: version === PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS : DOMAIN_CONTROL_FLIGHT_RECORDER_SUMMARY_KEYS, optionalKeys: [], unknownKeys: 'reject' },
234
263
  ],
235
- fixedArrays: [{ path: '$.limitations', values: DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS }],
264
+ fixedArrays: [{ path: '$.limitations', values: version === PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION ? PUBLIC_DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS : DOMAIN_CONTROL_FLIGHT_RECORDER_LIMITATIONS }],
236
265
  normalisation: 'preserve_document',
237
266
  target: null,
238
267
  },
239
- ],
268
+ ]),
240
269
  boundProfiles: [
241
270
  {
242
271
  id: 'domain-control-flight-recorder.input-wire.v1',
@@ -248,7 +277,7 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
248
277
  { id: 'observation-fields', path: '$.observations[].fields', phase: 'pre_accumulation', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_FIELDS, handling: 'reject' },
249
278
  { id: 'observation-unique-fields', path: '$.observations[].fields', phase: 'normalised', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_UNIQUE_FIELDS, handling: 'reject' },
250
279
  { id: 'field-input-values', path: '$.observations[].fields[].values', phase: 'pre_accumulation', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_INPUT_VALUES, handling: 'reject' },
251
- { id: 'field-values', path: '$.observations[].fields[].values', phase: 'normalised', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_VALUES, handling: 'truncate' },
280
+ { id: 'field-values', path: '$.observations[].fields[].values', phase: 'normalised', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_VALUES, handling: 'reject' },
252
281
  { id: 'field-source', path: '$.observations[].fields[].source', phase: 'pre_accumulation', unit: 'characters', minimum: 1, maximum: MAX_FLIGHT_RECORDER_SOURCE_LENGTH, handling: 'reject' },
253
282
  { id: 'field-value-text', path: '$.observations[].fields[].values[]', phase: 'pre_accumulation', unit: 'characters', minimum: 1, maximum: MAX_FLIGHT_RECORDER_VALUE_LENGTH, handling: 'reject' },
254
283
  { id: 'approved-windows', path: '$.approvedWindows', phase: 'pre_accumulation', unit: 'items', minimum: 0, maximum: MAX_FLIGHT_RECORDER_WINDOWS, handling: 'reject' },
@@ -294,7 +323,7 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
294
323
  {
295
324
  id: 'domain-control-flight-recorder.json.v1',
296
325
  schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA,
297
- versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION],
326
+ versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS,
298
327
  mediaType: 'application/json',
299
328
  encoding: 'utf-8',
300
329
  bom: false,
@@ -353,13 +382,22 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
353
382
  },
354
383
  ],
355
384
  consumerEdges: [
385
+ {
386
+ id: 'domain-control-flight-recorder.node-validate', plane: 'node', operation: 'validate-document',
387
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
388
+ emittedContract: null, shapeIds: FLIGHT_DOCUMENT_SHAPE_IDS,
389
+ boundProfileIds: ['domain-control-flight-recorder.output-wire.v1'],
390
+ hookIds: ['domain-control-flight-recorder.node.validate-document'], serialisationProfileId: null,
391
+ privacyProfileId: 'domain-control-flight-recorder.sensitive.v1', expiryPolicyId: 'domain-control-flight-recorder.expiry-not-applicable.v1',
392
+ requestMode: 'none', retentionEffect: 'transient_report', bindingState: 'declared_unenforced', policyState: 'current',
393
+ },
356
394
  {
357
395
  id: 'domain-control-flight-recorder.node-build',
358
396
  plane: 'node',
359
397
  operation: 'review',
360
- acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION], mode: 'direct' }],
398
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
361
399
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
362
- shapeIds: ['domain-control-flight-recorder.input.v1', 'domain-control-flight-recorder.document.v1'],
400
+ shapeIds: [...FLIGHT_INPUT_SHAPE_IDS, CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
363
401
  boundProfileIds: ['domain-control-flight-recorder.input-wire.v1', 'domain-control-flight-recorder.output-wire.v1'],
364
402
  hookIds: ['domain-control-flight-recorder.node.build'],
365
403
  serialisationProfileId: null,
@@ -374,9 +412,9 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
374
412
  id: 'domain-control-flight-recorder.cli-json-stdout',
375
413
  plane: 'cli',
376
414
  operation: 'review-json-stdout',
377
- acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION], mode: 'direct' }],
415
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
378
416
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
379
- shapeIds: ['domain-control-flight-recorder.input.v1', 'domain-control-flight-recorder.document.v1'],
417
+ shapeIds: [...FLIGHT_INPUT_SHAPE_IDS, CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
380
418
  boundProfileIds: ['domain-control-flight-recorder.input-wire.v1', 'domain-control-flight-recorder.output-wire.v1', 'domain-control-flight-recorder.cli-command.v1'],
381
419
  hookIds: ['domain-control-flight-recorder.node.build', 'domain-control-flight-recorder.node.serialise-json'],
382
420
  serialisationProfileId: 'domain-control-flight-recorder.json.v1',
@@ -391,9 +429,9 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
391
429
  id: 'domain-control-flight-recorder.cli-terminal-stdout',
392
430
  plane: 'cli',
393
431
  operation: 'review-terminal-stdout',
394
- acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION], mode: 'direct' }],
432
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
395
433
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
396
- shapeIds: ['domain-control-flight-recorder.input.v1', 'domain-control-flight-recorder.document.v1'],
434
+ shapeIds: [...FLIGHT_INPUT_SHAPE_IDS, CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
397
435
  boundProfileIds: ['domain-control-flight-recorder.input-wire.v1', 'domain-control-flight-recorder.output-wire.v1', 'domain-control-flight-recorder.cli-command.v1'],
398
436
  hookIds: ['domain-control-flight-recorder.node.build', 'domain-control-flight-recorder.node.format-terminal'],
399
437
  serialisationProfileId: null,
@@ -408,9 +446,9 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
408
446
  id: 'domain-control-flight-recorder.cli-json-file',
409
447
  plane: 'cli',
410
448
  operation: 'review-json-file',
411
- acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION], mode: 'direct' }],
449
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
412
450
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
413
- shapeIds: ['domain-control-flight-recorder.input.v1', 'domain-control-flight-recorder.document.v1'],
451
+ shapeIds: [...FLIGHT_INPUT_SHAPE_IDS, CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
414
452
  boundProfileIds: ['domain-control-flight-recorder.input-wire.v1', 'domain-control-flight-recorder.output-wire.v1', 'domain-control-flight-recorder.cli-command.v1'],
415
453
  hookIds: ['domain-control-flight-recorder.node.build', 'domain-control-flight-recorder.node.serialise-json'],
416
454
  serialisationProfileId: 'domain-control-flight-recorder.json.v1',
@@ -425,9 +463,9 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
425
463
  id: 'domain-control-flight-recorder.cli-terminal-file',
426
464
  plane: 'cli',
427
465
  operation: 'review-terminal-file',
428
- acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: [DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION], mode: 'direct' }],
466
+ acceptedContracts: [{ schema: DOMAIN_CONTROL_FLIGHT_RECORDER_INPUT_SCHEMA, versions: SUPPORTED_DOMAIN_CONTROL_FLIGHT_RECORDER_VERSIONS, mode: 'direct' }],
429
467
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
430
- shapeIds: ['domain-control-flight-recorder.input.v1', 'domain-control-flight-recorder.document.v1'],
468
+ shapeIds: [...FLIGHT_INPUT_SHAPE_IDS, CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
431
469
  boundProfileIds: ['domain-control-flight-recorder.input-wire.v1', 'domain-control-flight-recorder.output-wire.v1', 'domain-control-flight-recorder.cli-command.v1'],
432
470
  hookIds: ['domain-control-flight-recorder.node.build', 'domain-control-flight-recorder.node.format-terminal'],
433
471
  serialisationProfileId: null,
@@ -444,7 +482,7 @@ export const DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA_LIFECYCLE = defineSchemaLifec
444
482
  operation: 'embed-after-current-manifest-bounded-passive-monitor',
445
483
  acceptedContracts: [],
446
484
  emittedContract: { schema: DOMAIN_CONTROL_FLIGHT_RECORDER_SCHEMA, version: DOMAIN_CONTROL_FLIGHT_RECORDER_VERSION },
447
- shapeIds: ['domain-control-flight-recorder.document.v1'],
485
+ shapeIds: [CURRENT_FLIGHT_DOCUMENT_SHAPE_ID],
448
486
  boundProfileIds: ['domain-control-flight-recorder.output-wire.v1', 'domain-control-flight-recorder.monitor-action.v1'],
449
487
  hookIds: ['domain-control-flight-recorder.node.validate-document', 'domain-control-flight-recorder.cli.monitor'],
450
488
  serialisationProfileId: null,