archctx-contracts 0.1.5

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 (100) hide show
  1. package/fixtures/boundary/agent-job-expired.json +33 -0
  2. package/fixtures/boundary/architecture-event-extension.json +41 -0
  3. package/fixtures/boundary/architecture-node-extension.json +13 -0
  4. package/fixtures/boundary/attestation-v2-error.json +43 -0
  5. package/fixtures/boundary/check-delivery-dead-letter.json +14 -0
  6. package/fixtures/boundary/evidence-binding-context-only.json +20 -0
  7. package/fixtures/boundary/practice-disabled-overlay.json +59 -0
  8. package/fixtures/boundary/recommendation-deferred.json +19 -0
  9. package/fixtures/boundary/review-challenge-v2-organization.json +15 -0
  10. package/fixtures/boundary/runner-identity-organization-scope.json +16 -0
  11. package/fixtures/invalid/adapter-fidelity-reverse-sync.json +9 -0
  12. package/fixtures/invalid/agent-job-direct-mutation.json +32 -0
  13. package/fixtures/invalid/architecture-event-source-body-field.json +39 -0
  14. package/fixtures/invalid/architecture-snapshot-unknown-mode.json +29 -0
  15. package/fixtures/invalid/attestation-v2-finding-field.json +39 -0
  16. package/fixtures/invalid/check-delivery-legacy-check-name.json +14 -0
  17. package/fixtures/invalid/cloud-egress-envelope-private-field.json +12 -0
  18. package/fixtures/invalid/compatibility-illegal-reason.json +17 -0
  19. package/fixtures/invalid/evidence-binding-summary-substring-authority.json +17 -0
  20. package/fixtures/invalid/evidence-item-source-body-field.json +27 -0
  21. package/fixtures/invalid/explorer-projection-write-field.json +21 -0
  22. package/fixtures/invalid/investigation-report-direct-mutation.json +38 -0
  23. package/fixtures/invalid/investigation-report-missing-proposed-delta.json +19 -0
  24. package/fixtures/invalid/node-unknown-field.json +10 -0
  25. package/fixtures/invalid/notification-event-code-field.json +11 -0
  26. package/fixtures/invalid/practice-policy-empty-test-evidence.json +15 -0
  27. package/fixtures/invalid/practice-policy-negative-recommendation-budget.json +10 -0
  28. package/fixtures/invalid/practice-unknown-field.json +56 -0
  29. package/fixtures/invalid/projection-target-invalid-ownership.json +18 -0
  30. package/fixtures/invalid/recommendation-feedback-implicit-acceptance.json +29 -0
  31. package/fixtures/invalid/recommendation-run-raw-input-field.json +33 -0
  32. package/fixtures/invalid/recommendation-source-body-field.json +17 -0
  33. package/fixtures/invalid/review-challenge-v2-private-field.json +16 -0
  34. package/fixtures/valid/adapter-fidelity.json +9 -0
  35. package/fixtures/valid/agent-job.json +33 -0
  36. package/fixtures/valid/architecture-candidate-delta-policy.json +45 -0
  37. package/fixtures/valid/architecture-candidate-delta.json +188 -0
  38. package/fixtures/valid/architecture-event.json +39 -0
  39. package/fixtures/valid/architecture-intervention.json +36 -0
  40. package/fixtures/valid/architecture-node.json +25 -0
  41. package/fixtures/valid/architecture-relation.json +14 -0
  42. package/fixtures/valid/architecture-snapshot.json +31 -0
  43. package/fixtures/valid/architecture-subject-selector.json +9 -0
  44. package/fixtures/valid/attestation-v2.json +38 -0
  45. package/fixtures/valid/attestation.json +25 -0
  46. package/fixtures/valid/changeset.json +30 -0
  47. package/fixtures/valid/chatgpt-ga-tool.json +9 -0
  48. package/fixtures/valid/check-delivery.json +14 -0
  49. package/fixtures/valid/cloud-egress-envelope.json +11 -0
  50. package/fixtures/valid/compatibility-contract.json +19 -0
  51. package/fixtures/valid/constraint.json +22 -0
  52. package/fixtures/valid/cross-repo-relation.json +23 -0
  53. package/fixtures/valid/device-identity.json +10 -0
  54. package/fixtures/valid/entitlement.json +12 -0
  55. package/fixtures/valid/evidence-binding.json +17 -0
  56. package/fixtures/valid/evidence-item.json +29 -0
  57. package/fixtures/valid/explorer-projection.json +53 -0
  58. package/fixtures/valid/explorer-service.json +11 -0
  59. package/fixtures/valid/external-document-resource.json +29 -0
  60. package/fixtures/valid/governance-key-status.json +11 -0
  61. package/fixtures/valid/investigation-report.json +38 -0
  62. package/fixtures/valid/landscape.json +36 -0
  63. package/fixtures/valid/likec4-mapping.json +14 -0
  64. package/fixtures/valid/notification-event.json +10 -0
  65. package/fixtures/valid/notification-provider.json +12 -0
  66. package/fixtures/valid/org-runner-identity.json +10 -0
  67. package/fixtures/valid/practice-catalog-manifest.json +16 -0
  68. package/fixtures/valid/practice-check-result.json +17 -0
  69. package/fixtures/valid/practice-checkpoint.json +94 -0
  70. package/fixtures/valid/practice-guidance.json +42 -0
  71. package/fixtures/valid/practice-match.json +23 -0
  72. package/fixtures/valid/practice-policy.json +33 -0
  73. package/fixtures/valid/practice-profile.json +22 -0
  74. package/fixtures/valid/practice-source.json +19 -0
  75. package/fixtures/valid/practice-waiver.json +14 -0
  76. package/fixtures/valid/practice.json +93 -0
  77. package/fixtures/valid/product-version-manifest.json +51 -0
  78. package/fixtures/valid/projection-target.json +18 -0
  79. package/fixtures/valid/recommendation-feedback.json +29 -0
  80. package/fixtures/valid/recommendation-run.json +33 -0
  81. package/fixtures/valid/recommendation.json +17 -0
  82. package/fixtures/valid/retrieval-config.json +20 -0
  83. package/fixtures/valid/retrieval-decision.json +26 -0
  84. package/fixtures/valid/retrieval-eval.json +14 -0
  85. package/fixtures/valid/review-challenge-v2.json +15 -0
  86. package/fixtures/valid/review-result.json +32 -0
  87. package/fixtures/valid/runner-identity.json +13 -0
  88. package/fixtures/valid/structurizr-mapping.json +15 -0
  89. package/fixtures/valid/task-context.json +23 -0
  90. package/package.json +17 -0
  91. package/src/control-plane-routes.ts +35 -0
  92. package/src/external-docs.ts +137 -0
  93. package/src/github-governance.ts +850 -0
  94. package/src/index.ts +9 -0
  95. package/src/ledger.ts +649 -0
  96. package/src/ports.ts +385 -0
  97. package/src/practices.ts +433 -0
  98. package/src/product-version.ts +108 -0
  99. package/src/schema.ts +145 -0
  100. package/src/validator.ts +95 -0
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ export * from "./control-plane-routes";
2
+ export * from "./external-docs";
3
+ export * from "./github-governance";
4
+ export * from "./ledger";
5
+ export * from "./ports";
6
+ export * from "./practices";
7
+ export * from "./product-version";
8
+ export * from "./schema";
9
+ export * from "./validator";
package/src/ledger.ts ADDED
@@ -0,0 +1,649 @@
1
+ import { digestJson, type Json } from "./schema";
2
+
3
+ export const ARCHITECTURE_EVENT_SCHEMA_VERSION = "archcontext.architecture-event/v1" as const;
4
+ export const ARCHITECTURE_SNAPSHOT_SCHEMA_VERSION = "archcontext.architecture-snapshot/v1" as const;
5
+ export const EVIDENCE_ITEM_SCHEMA_VERSION = "archcontext.evidence-item/v2" as const;
6
+ export const EVIDENCE_BINDING_SCHEMA_VERSION = "archcontext.evidence-binding/v1" as const;
7
+ export const RECOMMENDATION_RUN_SCHEMA_VERSION = "archcontext.recommendation-run/v1" as const;
8
+ export const RECOMMENDATION_SCHEMA_VERSION = "archcontext.recommendation/v2" as const;
9
+ export const RECOMMENDATION_FEEDBACK_SCHEMA_VERSION = "archcontext.recommendation-feedback/v1" as const;
10
+ export const AGENT_JOB_SCHEMA_VERSION = "archcontext.agent-job/v1" as const;
11
+ export const INVESTIGATION_REPORT_SCHEMA_VERSION = "archcontext.investigation-report/v1" as const;
12
+ export const ARCHITECTURE_SUBJECT_SELECTOR_SCHEMA_VERSION = "archcontext.architecture-subject-selector/v1" as const;
13
+ export const ARCHITECTURE_CANDIDATE_DELTA_SCHEMA_VERSION = "archcontext.architecture-candidate-delta/v1" as const;
14
+ export const ARCHITECTURE_CANDIDATE_DELTA_POLICY_SCHEMA_VERSION = "archcontext.architecture-candidate-delta-policy/v1" as const;
15
+ export const PROJECTION_TARGET_SCHEMA_VERSION = "archcontext.projection-target/v1" as const;
16
+
17
+ export type ArchitectureFactAuthority = "declared" | "observed" | "verified" | "proposed" | "projected";
18
+ export type ArchitectureLedgerMode = "yaml" | "dual" | "dual-compare" | "ledger-shadow" | "ledger" | "ledger-authoritative";
19
+ export type ArchitectureActorKind = "developer" | "daemon" | "hook" | "cli" | "mcp" | "subagent" | "migration" | "system";
20
+ export type ArchitectureEventSource =
21
+ | "prepare_task"
22
+ | "checkpoint"
23
+ | "plan_update"
24
+ | "apply_update"
25
+ | "complete_task"
26
+ | "git_hook"
27
+ | "yaml_import"
28
+ | "projection_reconcile"
29
+ | "migration"
30
+ | "manual"
31
+ | "agent_audit";
32
+
33
+ export type EvidenceStrengthV2 = "heuristic" | "declared" | "observed" | "verified";
34
+ export type EvidencePolarityV2 = "positive" | "absence" | "declaration";
35
+ export type EvidenceOriginV2 = "codegraph" | "model-store-yaml" | "checkpoint" | "runtime-daemon" | "user" | "subagent" | "external-doc";
36
+ export type EvidenceCoverageLevelV2 = "complete" | "partial" | "unknown";
37
+ export type EvidenceAuthorityEffect = "context-only" | "ranking" | "checkpoint-eligible" | "complete-eligible";
38
+ export type ArchitectureSubjectSelectorKind =
39
+ | "repository"
40
+ | "path"
41
+ | "symbol"
42
+ | "node"
43
+ | "relation"
44
+ | "api"
45
+ | "datastore"
46
+ | "external-contract";
47
+ export type ArchitectureCodeChangeKind = "added" | "removed" | "moved" | "renamed" | "materially_changed";
48
+ export type ArchitectureDeltaRawFactKind = "git-path-change" | "codegraph-symbol" | "codegraph-relation";
49
+ export type ArchitectureDeltaInterpretationKind =
50
+ | "code-subject-added"
51
+ | "code-subject-removed"
52
+ | "code-subject-moved"
53
+ | "code-subject-renamed"
54
+ | "code-subject-materially-changed";
55
+ export type ArchitectureDeclaredTargetKind = "entity" | "relation" | "constraint";
56
+ export type ArchitectureCandidateChangeTargetKind = "node" | "relation" | "constraint" | "owner" | "lifecycle" | "migration-state";
57
+ export type ArchitectureCandidateStateDimension = "target-state" | "migration-state";
58
+ export type ArchitectureDeltaMappingMatchReason =
59
+ | "declared-path-exact"
60
+ | "declared-path-prefix"
61
+ | "declared-name-match"
62
+ | "declared-relation-endpoints"
63
+ | "declared-constraint-subject";
64
+ export type ArchitectureDeltaMappingAmbiguityReason =
65
+ | "declared-graph-unavailable"
66
+ | "no-declared-target"
67
+ | "multiple-declared-targets"
68
+ | "relation-endpoint-unmapped";
69
+ export type ArchitectureCandidateChangeKind =
70
+ | "node-added"
71
+ | "node-removed"
72
+ | "node-moved"
73
+ | "node-renamed"
74
+ | "node-materially-changed"
75
+ | "relation-added"
76
+ | "relation-removed"
77
+ | "relation-moved"
78
+ | "relation-renamed"
79
+ | "relation-materially-changed"
80
+ | "constraint-added"
81
+ | "constraint-removed"
82
+ | "constraint-moved"
83
+ | "constraint-renamed"
84
+ | "constraint-materially-changed"
85
+ | "owner-added"
86
+ | "owner-removed"
87
+ | "owner-moved"
88
+ | "owner-renamed"
89
+ | "owner-materially-changed"
90
+ | "lifecycle-added"
91
+ | "lifecycle-removed"
92
+ | "lifecycle-moved"
93
+ | "lifecycle-renamed"
94
+ | "lifecycle-materially-changed"
95
+ | "migration-state-added"
96
+ | "migration-state-removed"
97
+ | "migration-state-moved"
98
+ | "migration-state-renamed"
99
+ | "migration-state-materially-changed";
100
+ export type ArchitectureCandidateDeltaPolicyAction =
101
+ | "auto-accept"
102
+ | "require-checkpoint"
103
+ | "require-proof"
104
+ | "require-human-approval";
105
+ export type ArchitectureCandidateDeltaPolicyReasonCode =
106
+ | "high-confidence-complete-evidence"
107
+ | "medium-confidence"
108
+ | "low-confidence"
109
+ | "partial-evidence"
110
+ | "missing-evidence"
111
+ | "mapping-ambiguity"
112
+ | "migration-state-progress"
113
+ | "target-state-removal"
114
+ | "relation-removal"
115
+ | "constraint-relaxation"
116
+ | "owner-authority-change";
117
+ export type ProjectionTargetType =
118
+ | "architecture-index"
119
+ | "entity-summary"
120
+ | "relation-summary"
121
+ | "decision-index"
122
+ | "architecture-changelog"
123
+ | "diagram-mermaid"
124
+ | "diagram-structurizr"
125
+ | "diagram-likec4";
126
+ export type ProjectionTargetScopeKind = "repository" | "entity" | "relation" | "decision" | "diagram" | "changelog";
127
+ export type ProjectionTargetOwnership = "generated" | "mixed";
128
+ export type ProjectionTargetFormat = "markdown" | "mermaid" | "structurizr-json" | "likec4";
129
+
130
+ export interface ArchitectureRepositoryIdentityV1 {
131
+ repositoryId: string;
132
+ storageRepositoryId: string;
133
+ }
134
+
135
+ export interface ArchitectureWorktreeIdentityV1 {
136
+ workspaceId: string;
137
+ storageWorkspaceId: string;
138
+ branch: string;
139
+ headSha: string;
140
+ worktreeDigest: string;
141
+ }
142
+
143
+ export interface LedgerProvenanceV1 {
144
+ producer: string;
145
+ command: string;
146
+ inputDigest: string;
147
+ traceDigest?: string;
148
+ }
149
+
150
+ export interface ArchitectureEventV1 {
151
+ schemaVersion: typeof ARCHITECTURE_EVENT_SCHEMA_VERSION;
152
+ eventId: string;
153
+ eventType: string;
154
+ payloadVersion: string;
155
+ repository: ArchitectureRepositoryIdentityV1;
156
+ worktree: ArchitectureWorktreeIdentityV1;
157
+ baseDigest: string;
158
+ resultingDigest: string;
159
+ headSha: string;
160
+ actor: {
161
+ kind: ArchitectureActorKind;
162
+ id: string;
163
+ };
164
+ source: ArchitectureEventSource;
165
+ timestamp: string;
166
+ idempotencyKey: string;
167
+ provenance: LedgerProvenanceV1;
168
+ payload: Json;
169
+ previousEventHash?: string | null;
170
+ eventHash?: string;
171
+ extensions?: Record<string, Json>;
172
+ }
173
+
174
+ export interface ArchitectureSnapshotV1 {
175
+ schemaVersion: typeof ARCHITECTURE_SNAPSHOT_SCHEMA_VERSION;
176
+ snapshotId: string;
177
+ repository: ArchitectureRepositoryIdentityV1;
178
+ worktree: ArchitectureWorktreeIdentityV1;
179
+ sourceMode: ArchitectureLedgerMode;
180
+ eventCursor: {
181
+ lastEventId: string;
182
+ lastEventHash: string;
183
+ };
184
+ graphDigest: string;
185
+ projectionDigest: string;
186
+ entityCount: number;
187
+ relationCount: number;
188
+ constraintCount: number;
189
+ inputDigests: {
190
+ modelDigest: string;
191
+ codeFactsDigest?: string;
192
+ policyDigest?: string;
193
+ catalogDigest?: string;
194
+ };
195
+ createdAt: string;
196
+ extensions?: Record<string, Json>;
197
+ }
198
+
199
+ export interface EvidenceItemV2 {
200
+ schemaVersion: typeof EVIDENCE_ITEM_SCHEMA_VERSION;
201
+ evidenceId: string;
202
+ kind: string;
203
+ strength: EvidenceStrengthV2;
204
+ polarity: EvidencePolarityV2;
205
+ origin: EvidenceOriginV2;
206
+ subject: string;
207
+ selector: {
208
+ kind: "repository" | "path" | "symbol" | "relation" | "constraint" | "practice" | "event" | "snapshot";
209
+ id: string;
210
+ path?: string;
211
+ symbolId?: string;
212
+ startLine?: number;
213
+ endLine?: number;
214
+ };
215
+ summary: string;
216
+ coverage: {
217
+ level: EvidenceCoverageLevelV2;
218
+ scope: string;
219
+ };
220
+ supports: ("recommendation" | "checkpoint" | "complete")[];
221
+ provenance: LedgerProvenanceV1;
222
+ createdAt: string;
223
+ digest: string;
224
+ extensions?: Record<string, Json>;
225
+ }
226
+
227
+ export interface EvidenceBindingV1 {
228
+ schemaVersion: typeof EVIDENCE_BINDING_SCHEMA_VERSION;
229
+ bindingId: string;
230
+ evidenceId: string;
231
+ target: {
232
+ kind: "entity" | "relation" | "constraint" | "recommendation" | "practice" | "event" | "snapshot" | "subject" | "candidate-delta";
233
+ id: string;
234
+ };
235
+ bindingReason: "direct-selector" | "predicate-subject" | "change-cursor" | "human-attestation" | "deterministic-check" | "subagent-proposal";
236
+ authorityEffect: EvidenceAuthorityEffect;
237
+ createdAt: string;
238
+ provenance: LedgerProvenanceV1;
239
+ extensions?: Record<string, Json>;
240
+ }
241
+
242
+ export interface ArchitectureSubjectSelectorV1 {
243
+ schemaVersion: typeof ARCHITECTURE_SUBJECT_SELECTOR_SCHEMA_VERSION;
244
+ selectorId: string;
245
+ kind: ArchitectureSubjectSelectorKind;
246
+ repositoryId: string;
247
+ stableKey: string;
248
+ path?: string;
249
+ symbolId?: string;
250
+ name?: string;
251
+ relation?: {
252
+ source: string;
253
+ target: string;
254
+ kind: string;
255
+ };
256
+ externalId?: string;
257
+ digest: string;
258
+ extensions?: Record<string, Json>;
259
+ }
260
+
261
+ export interface ArchitectureDeltaRawFactV1 {
262
+ factId: string;
263
+ kind: ArchitectureDeltaRawFactKind;
264
+ subjectSelectorId: string;
265
+ source: "git" | "codegraph";
266
+ summary: string;
267
+ evidenceIds: string[];
268
+ digest: string;
269
+ extensions?: Record<string, Json>;
270
+ }
271
+
272
+ export interface ArchitectureDeltaChangedSubjectV1 {
273
+ subjectSelectorId: string;
274
+ changeKind: ArchitectureCodeChangeKind;
275
+ previousSelectorId?: string;
276
+ rawFactIds: string[];
277
+ evidenceIds: string[];
278
+ digest: string;
279
+ }
280
+
281
+ export interface ArchitectureDeltaInterpretationV1 {
282
+ interpretationId: string;
283
+ kind: ArchitectureDeltaInterpretationKind;
284
+ subjectSelectorId: string;
285
+ evidenceIds: string[];
286
+ confidence: "low" | "medium" | "high";
287
+ coverage: EvidenceCoverageLevelV2;
288
+ heuristic: true;
289
+ summary: string;
290
+ digest: string;
291
+ extensions?: Record<string, Json>;
292
+ }
293
+
294
+ export interface ArchitectureDeltaDeclaredSubjectMappingV1 {
295
+ mappingId: string;
296
+ subjectSelectorId: string;
297
+ target: {
298
+ kind: ArchitectureDeclaredTargetKind;
299
+ id: string;
300
+ };
301
+ matchReason: ArchitectureDeltaMappingMatchReason;
302
+ confidence: "low" | "medium" | "high";
303
+ evidenceIds: string[];
304
+ digest: string;
305
+ extensions?: Record<string, Json>;
306
+ }
307
+
308
+ export interface ArchitectureDeltaMappingCandidateV1 {
309
+ target: {
310
+ kind: ArchitectureDeclaredTargetKind;
311
+ id: string;
312
+ };
313
+ matchReason: ArchitectureDeltaMappingMatchReason;
314
+ confidence: "low" | "medium" | "high";
315
+ }
316
+
317
+ export interface ArchitectureDeltaMappingAmbiguityV1 {
318
+ ambiguityId: string;
319
+ subjectSelectorId: string;
320
+ reasonCode: ArchitectureDeltaMappingAmbiguityReason;
321
+ candidateTargets: ArchitectureDeltaMappingCandidateV1[];
322
+ evidenceIds: string[];
323
+ summary: string;
324
+ digest: string;
325
+ extensions?: Record<string, Json>;
326
+ }
327
+
328
+ export interface ArchitectureCandidateChangeV1 {
329
+ candidateChangeId: string;
330
+ kind: ArchitectureCandidateChangeKind;
331
+ target: {
332
+ kind: ArchitectureCandidateChangeTargetKind;
333
+ id: string;
334
+ parentId?: string;
335
+ };
336
+ stateDimension: ArchitectureCandidateStateDimension;
337
+ changeKind: ArchitectureCodeChangeKind;
338
+ subjectSelectorIds: string[];
339
+ mappingIds: string[];
340
+ ambiguityIds: string[];
341
+ evidenceIds: string[];
342
+ confidence: "low" | "medium" | "high";
343
+ heuristic: true;
344
+ summary: string;
345
+ digest: string;
346
+ extensions?: Record<string, Json>;
347
+ }
348
+
349
+ export interface ArchitectureCandidateDeltaV1 {
350
+ schemaVersion: typeof ARCHITECTURE_CANDIDATE_DELTA_SCHEMA_VERSION;
351
+ deltaId: string;
352
+ repository: ArchitectureRepositoryIdentityV1;
353
+ worktree: ArchitectureWorktreeIdentityV1;
354
+ changeCursor: {
355
+ source: "git";
356
+ changeSource: "commit" | "staged" | "worktree";
357
+ baseSha?: string;
358
+ headSha: string;
359
+ pathCount: number;
360
+ metadataDigest: string;
361
+ codeFactsDigest: string;
362
+ };
363
+ subjectSelectors: ArchitectureSubjectSelectorV1[];
364
+ changedSubjects: ArchitectureDeltaChangedSubjectV1[];
365
+ rawFacts: ArchitectureDeltaRawFactV1[];
366
+ interpretations: ArchitectureDeltaInterpretationV1[];
367
+ declaredSubjectMappings: ArchitectureDeltaDeclaredSubjectMappingV1[];
368
+ mappingAmbiguities: ArchitectureDeltaMappingAmbiguityV1[];
369
+ candidateChanges: ArchitectureCandidateChangeV1[];
370
+ evidenceItems: EvidenceItemV2[];
371
+ evidenceBindings: EvidenceBindingV1[];
372
+ summary: {
373
+ added: number;
374
+ removed: number;
375
+ moved: number;
376
+ renamed: number;
377
+ materiallyChanged: number;
378
+ unresolved: number;
379
+ mapped: number;
380
+ ambiguous: number;
381
+ candidateChanges: number;
382
+ targetStateChanges: number;
383
+ migrationStateProgress: number;
384
+ mappingCoverage: {
385
+ totalChangedSubjects: number;
386
+ mappedSubjects: number;
387
+ unresolvedSubjects: number;
388
+ ambiguousSubjects: number;
389
+ coveragePercent: number;
390
+ };
391
+ unresolvedSubjects: {
392
+ total: number;
393
+ byReason: Record<ArchitectureDeltaMappingAmbiguityReason, number>;
394
+ subjectSelectorIds: string[];
395
+ };
396
+ evidenceStrengthDistribution: Record<EvidenceStrengthV2, number>;
397
+ };
398
+ deltaDigest: string;
399
+ extensions?: Record<string, Json>;
400
+ }
401
+
402
+ export interface ArchitectureCandidateDeltaPolicyDecisionV1 {
403
+ decisionId: string;
404
+ candidateChangeId: string;
405
+ target: {
406
+ kind: ArchitectureCandidateChangeTargetKind;
407
+ id: string;
408
+ parentId?: string;
409
+ };
410
+ stateDimension: ArchitectureCandidateStateDimension;
411
+ changeKind: ArchitectureCodeChangeKind;
412
+ confidence: "low" | "medium" | "high";
413
+ action: ArchitectureCandidateDeltaPolicyAction;
414
+ reasonCodes: ArchitectureCandidateDeltaPolicyReasonCode[];
415
+ evidenceIds: string[];
416
+ digest: string;
417
+ extensions?: Record<string, Json>;
418
+ }
419
+
420
+ export interface ArchitectureCandidateDeltaPolicyEvaluationV1 {
421
+ schemaVersion: typeof ARCHITECTURE_CANDIDATE_DELTA_POLICY_SCHEMA_VERSION;
422
+ evaluationId: string;
423
+ deltaId: string;
424
+ repository: ArchitectureRepositoryIdentityV1;
425
+ worktree: ArchitectureWorktreeIdentityV1;
426
+ deltaDigest: string;
427
+ policyVersion: string;
428
+ evaluatedAt: string;
429
+ decisions: ArchitectureCandidateDeltaPolicyDecisionV1[];
430
+ summary: {
431
+ candidateChanges: number;
432
+ autoAccept: number;
433
+ requireCheckpoint: number;
434
+ requireProof: number;
435
+ requireHumanApproval: number;
436
+ mappingAmbiguities: number;
437
+ };
438
+ evaluationDigest: string;
439
+ extensions?: Record<string, Json>;
440
+ }
441
+
442
+ export interface ProjectionTargetGeneratedRegionV1 {
443
+ startMarker: string;
444
+ endMarker: string;
445
+ }
446
+
447
+ export interface ProjectionTargetScopeV1 {
448
+ kind: ProjectionTargetScopeKind;
449
+ id?: string;
450
+ entityKind?: string;
451
+ }
452
+
453
+ export interface ProjectionTargetV1 {
454
+ schemaVersion: typeof PROJECTION_TARGET_SCHEMA_VERSION;
455
+ targetId: string;
456
+ type: ProjectionTargetType;
457
+ scope: ProjectionTargetScopeV1;
458
+ path: string;
459
+ ownership: ProjectionTargetOwnership;
460
+ generatedRegion: ProjectionTargetGeneratedRegionV1;
461
+ rendererVersion: string;
462
+ format: ProjectionTargetFormat;
463
+ sourceDigest: string;
464
+ outputDigest: string;
465
+ extensions?: Record<string, Json>;
466
+ }
467
+
468
+ export interface RecommendationRunV1 {
469
+ schemaVersion: typeof RECOMMENDATION_RUN_SCHEMA_VERSION;
470
+ runId: string;
471
+ repository: ArchitectureRepositoryIdentityV1;
472
+ worktree: ArchitectureWorktreeIdentityV1;
473
+ trigger: {
474
+ level: "L0" | "L1" | "L2" | "L3" | "L4";
475
+ source: ArchitectureEventSource;
476
+ };
477
+ engineVersion: string;
478
+ catalogDigest: string;
479
+ inputDigest: string;
480
+ outputDigest: string;
481
+ policyMode: "advisory" | "checkpoint" | "complete";
482
+ status: "queued" | "running" | "succeeded" | "failed" | "superseded";
483
+ startedAt: string;
484
+ completedAt?: string;
485
+ recommendationIds: string[];
486
+ metrics: {
487
+ matchCount: number;
488
+ evidenceBindingCount: number;
489
+ unboundEvidenceCount: number;
490
+ };
491
+ extensions?: Record<string, Json>;
492
+ }
493
+
494
+ export interface RecommendationV2 {
495
+ schemaVersion: typeof RECOMMENDATION_SCHEMA_VERSION;
496
+ recommendationId: string;
497
+ runId: string;
498
+ fingerprint: string;
499
+ subject: string;
500
+ practiceId?: string;
501
+ status: "open" | "acknowledged" | "accepted" | "rejected" | "deferred" | "waived" | "resolved" | "superseded" | "expired";
502
+ confidence: "low" | "medium" | "high";
503
+ enforcement: "advisory" | "checkpoint" | "complete";
504
+ risk: "low" | "medium" | "high";
505
+ uncertainty: "low" | "medium" | "high";
506
+ evidenceBindingIds: string[];
507
+ explanation: string[];
508
+ createdAt: string;
509
+ updatedAt: string;
510
+ extensions?: Record<string, Json>;
511
+ }
512
+
513
+ export interface RecommendationFeedbackV1 {
514
+ schemaVersion: typeof RECOMMENDATION_FEEDBACK_SCHEMA_VERSION;
515
+ feedbackId: string;
516
+ recommendationId: string;
517
+ runId: string;
518
+ action: "acknowledge" | "accept" | "reject" | "defer" | "waive" | "resolve";
519
+ previousStatus: RecommendationV2["status"];
520
+ nextStatus: RecommendationV2["status"];
521
+ actor: {
522
+ kind: ArchitectureActorKind;
523
+ id: string;
524
+ source: "cli" | "mcp" | "manual" | "daemon" | "system" | "subagent";
525
+ };
526
+ reason: string;
527
+ explicit: true;
528
+ implicitAcceptance: false;
529
+ repository: ArchitectureRepositoryIdentityV1;
530
+ worktree: ArchitectureWorktreeIdentityV1;
531
+ createdAt: string;
532
+ extensions?: Record<string, Json>;
533
+ }
534
+
535
+ export interface AgentJobV1 {
536
+ schemaVersion: typeof AGENT_JOB_SCHEMA_VERSION;
537
+ jobId: string;
538
+ status: "queued" | "running" | "succeeded" | "failed" | "cancelled" | "superseded" | "expired";
539
+ runnerPort: "claude-code" | "codex" | "fake-provider";
540
+ repository: ArchitectureRepositoryIdentityV1;
541
+ worktree: ArchitectureWorktreeIdentityV1;
542
+ fingerprint: string;
543
+ trigger: {
544
+ source: ArchitectureEventSource;
545
+ reason: string;
546
+ };
547
+ budget: {
548
+ maxRunsPerTask: number;
549
+ maxRunsPerRepositoryPerDay: number;
550
+ maxRunsPerDay?: number;
551
+ };
552
+ inputDigest: string;
553
+ promptTemplateDigest: string;
554
+ outputDigest?: string;
555
+ stalePolicy: "cancel-on-head-change" | "advisory-only-on-stale";
556
+ directMutationAllowed: false;
557
+ queuedAt: string;
558
+ updatedAt: string;
559
+ extensions?: Record<string, Json>;
560
+ }
561
+
562
+ export interface InvestigationReportV1 {
563
+ schemaVersion: typeof INVESTIGATION_REPORT_SCHEMA_VERSION;
564
+ reportId: string;
565
+ jobId: string;
566
+ status: "succeeded" | "failed" | "partial";
567
+ findings: {
568
+ findingId: string;
569
+ hypothesis: string;
570
+ evidenceBindingIds: string[];
571
+ unknowns: string[];
572
+ falsifier: string;
573
+ proposedDelta: ArchitectureCandidateChangeV1;
574
+ proposedDeltaDigest: string;
575
+ confidence: "low" | "medium" | "high";
576
+ }[];
577
+ outputDigest: string;
578
+ createdAt: string;
579
+ directMutationAllowed: false;
580
+ extensions?: Record<string, Json>;
581
+ }
582
+
583
+ export const LEDGER_AUTHORITY_MATRIX: Record<ArchitectureFactAuthority, {
584
+ writer: string;
585
+ canonicalIdRule: string;
586
+ conflictPolicy: string;
587
+ }> = {
588
+ declared: {
589
+ writer: "ChangeSet-approved Git projection in .archcontext/",
590
+ canonicalIdRule: "stable declared architecture ID from repo model",
591
+ conflictPolicy: "Git conflict or projection drift blocks promotion until reconciled"
592
+ },
593
+ observed: {
594
+ writer: "CodeGraph adapter and deterministic runtime probes",
595
+ canonicalIdRule: "selector digest scoped by repository and worktree identity",
596
+ conflictPolicy: "Observed facts can support evidence but cannot overwrite declared facts"
597
+ },
598
+ verified: {
599
+ writer: "Deterministic checks, test/readback artifacts, and accepted attestations",
600
+ canonicalIdRule: "verification subject plus evidence digest",
601
+ conflictPolicy: "New verification supersedes older verification only at the same HEAD/worktree cursor"
602
+ },
603
+ proposed: {
604
+ writer: "ChangeSet drafts and subagent investigation proposals",
605
+ canonicalIdRule: "proposal ID plus idempotency key",
606
+ conflictPolicy: "Proposal remains non-authoritative until validated and approved"
607
+ },
608
+ projected: {
609
+ writer: "Renderer from accepted architecture state",
610
+ canonicalIdRule: "projection target path plus source snapshot digest",
611
+ conflictPolicy: "Human edits outside generated regions become drift requiring explicit reconcile"
612
+ }
613
+ };
614
+
615
+ export function architectureEventHash(event: ArchitectureEventV1): string {
616
+ const { eventHash: _eventHash, extensions: _extensions, ...hashable } = event;
617
+ return digestJson(hashable as unknown as Json);
618
+ }
619
+
620
+ export function architectureSnapshotDigest(snapshot: ArchitectureSnapshotV1): string {
621
+ const { snapshotId: _snapshotId, createdAt: _createdAt, extensions: _extensions, ...hashable } = snapshot;
622
+ return digestJson(hashable as unknown as Json);
623
+ }
624
+
625
+ export function architectureSubjectSelectorDigest(selector: ArchitectureSubjectSelectorV1): string {
626
+ const { digest: _digest, extensions: _extensions, ...hashable } = selector;
627
+ return digestJson(hashable as unknown as Json);
628
+ }
629
+
630
+ export function architectureCandidateDeltaDigest(delta: ArchitectureCandidateDeltaV1): string {
631
+ const { deltaDigest: _deltaDigest, extensions: _extensions, ...hashable } = delta;
632
+ return digestJson(hashable as unknown as Json);
633
+ }
634
+
635
+ export function architectureCandidateDeltaPolicyDecisionDigest(decision: ArchitectureCandidateDeltaPolicyDecisionV1): string {
636
+ const { digest: _digest, extensions: _extensions, ...hashable } = decision;
637
+ return digestJson(hashable as unknown as Json);
638
+ }
639
+
640
+ export function architectureCandidateDeltaPolicyEvaluationDigest(evaluation: ArchitectureCandidateDeltaPolicyEvaluationV1): string {
641
+ const {
642
+ evaluationId: _evaluationId,
643
+ evaluatedAt: _evaluatedAt,
644
+ evaluationDigest: _evaluationDigest,
645
+ extensions: _extensions,
646
+ ...hashable
647
+ } = evaluation;
648
+ return digestJson(hashable as unknown as Json);
649
+ }