@apexops/contracts 0.10.0-next.4 → 0.11.0-next.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 (77) hide show
  1. package/README.md +28 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/archetype-source.d.ts +70 -0
  4. package/dist/archetype-source.d.ts.map +1 -0
  5. package/dist/archetype-source.js +58 -0
  6. package/dist/archetype-source.js.map +1 -0
  7. package/dist/artifacts.d.ts +64 -0
  8. package/dist/artifacts.d.ts.map +1 -1
  9. package/dist/artifacts.js +69 -0
  10. package/dist/artifacts.js.map +1 -1
  11. package/dist/common.d.ts +2 -0
  12. package/dist/common.d.ts.map +1 -1
  13. package/dist/common.js +1 -0
  14. package/dist/common.js.map +1 -1
  15. package/dist/evidence.d.ts.map +1 -1
  16. package/dist/evidence.js +2 -0
  17. package/dist/evidence.js.map +1 -1
  18. package/dist/governance-observation.d.ts +15 -0
  19. package/dist/governance-observation.d.ts.map +1 -0
  20. package/dist/governance-observation.js +15 -0
  21. package/dist/governance-observation.js.map +1 -0
  22. package/dist/index.d.ts +627 -4
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +47 -4
  25. package/dist/index.js.map +1 -1
  26. package/dist/native-validation.d.ts +136 -0
  27. package/dist/native-validation.d.ts.map +1 -0
  28. package/dist/native-validation.js +276 -0
  29. package/dist/native-validation.js.map +1 -0
  30. package/dist/onboarding.d.ts +184 -3
  31. package/dist/onboarding.d.ts.map +1 -1
  32. package/dist/onboarding.js +122 -6
  33. package/dist/onboarding.js.map +1 -1
  34. package/dist/policy-validation.d.ts +45 -0
  35. package/dist/policy-validation.d.ts.map +1 -0
  36. package/dist/policy-validation.js +194 -0
  37. package/dist/policy-validation.js.map +1 -0
  38. package/dist/runtime.d.ts +94 -2
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +53 -4
  41. package/dist/runtime.js.map +1 -1
  42. package/dist/targets.d.ts +158 -1
  43. package/dist/targets.d.ts.map +1 -1
  44. package/dist/targets.js +168 -2
  45. package/dist/targets.js.map +1 -1
  46. package/dist/test/contracts.test.js +769 -4
  47. package/dist/test/contracts.test.js.map +1 -1
  48. package/package.json +2 -2
  49. package/schemas/archetype-batch-config-v1.schema.json +51 -0
  50. package/schemas/archetype-batch-plan-v1.schema.json +227 -0
  51. package/schemas/archetype-source-proposal-v1.schema.json +113 -0
  52. package/schemas/architecture-v1.schema.json +278 -0
  53. package/schemas/bootstrap-plan-v1.schema.json +206 -0
  54. package/schemas/contract-metadata.json +85 -0
  55. package/schemas/cost-estimate-v1.schema.json +54 -1
  56. package/schemas/diagnosis-v1.schema.json +323 -0
  57. package/schemas/governance-constraints-v1.schema.json +13 -0
  58. package/schemas/governance-observation-receipt-v1.schema.json +60 -0
  59. package/schemas/governance-provision-plan-v1.schema.json +307 -0
  60. package/schemas/governance-setup-config-v1.schema.json +80 -0
  61. package/schemas/governance-setup-plan-v1.schema.json +217 -0
  62. package/schemas/iac-binding-v1.schema.json +60 -0
  63. package/schemas/input-request-v1.schema.json +296 -2
  64. package/schemas/logical-resource-manifest-v1.schema.json +4 -0
  65. package/schemas/native-validation-receipt-v1.schema.json +862 -0
  66. package/schemas/onboarding-config-v1.schema.json +15 -12
  67. package/schemas/policy-property-map-v1.schema.json +17 -0
  68. package/schemas/policy-validation-v1.schema.json +278 -0
  69. package/schemas/project-config-v1.schema.json +14 -1
  70. package/schemas/repeat-guard-records-v1.schema.json +76 -0
  71. package/schemas/repository-publish-config-v1.schema.json +52 -0
  72. package/schemas/repository-publish-plan-v1.schema.json +265 -0
  73. package/schemas/requirements-amendment-v1.schema.json +213 -0
  74. package/schemas/requirements-change-proposal-v1.schema.json +196 -0
  75. package/schemas/review-capture-v1.schema.json +67 -0
  76. package/schemas/review-findings-v1.schema.json +103 -0
  77. package/schemas/review-request-v1.schema.json +111 -0
package/dist/targets.d.ts CHANGED
@@ -4,6 +4,8 @@ export declare const SeveritySchema: import("@sinclair/typebox").TUnion<[import(
4
4
  export declare const DispositionSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"open">, import("@sinclair/typebox").TLiteral<"accepted">, import("@sinclair/typebox").TLiteral<"remediated">, import("@sinclair/typebox").TLiteral<"dismissed">]>;
5
5
  export declare const ConfidenceSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"low">, import("@sinclair/typebox").TLiteral<"medium">, import("@sinclair/typebox").TLiteral<"high">]>;
6
6
  export declare const CurrencySchema: import("@sinclair/typebox").TString;
7
+ export declare const WellArchitectedPillarSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"security">, import("@sinclair/typebox").TLiteral<"reliability">, import("@sinclair/typebox").TLiteral<"performance-efficiency">, import("@sinclair/typebox").TLiteral<"cost-optimization">, import("@sinclair/typebox").TLiteral<"operational-excellence">]>;
8
+ export declare const WellArchitectedStatusSchema: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"aligned">, import("@sinclair/typebox").TLiteral<"concern">, import("@sinclair/typebox").TLiteral<"blocker">, import("@sinclair/typebox").TLiteral<"not-applicable">]>;
7
9
  export declare const WorkloadDecisionManifestV1Schema: import("@sinclair/typebox").TObject<{
8
10
  schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
9
11
  projectId: import("@sinclair/typebox").TString;
@@ -69,12 +71,50 @@ export declare const ArchitectureV1Schema: import("@sinclair/typebox").TObject<{
69
71
  components: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
70
72
  id: import("@sinclair/typebox").TString;
71
73
  service: import("@sinclair/typebox").TString;
74
+ resourceTypes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
72
75
  purpose: import("@sinclair/typebox").TString;
73
76
  requirementIds: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
74
77
  dependsOn: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
75
78
  }>>;
76
79
  decisions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
80
+ decisionRecords: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
81
+ id: import("@sinclair/typebox").TString;
82
+ title: import("@sinclair/typebox").TString;
83
+ context: import("@sinclair/typebox").TString;
84
+ decision: import("@sinclair/typebox").TString;
85
+ requirementIds: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
86
+ alternatives: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
87
+ option: import("@sinclair/typebox").TString;
88
+ benefits: import("@sinclair/typebox").TString;
89
+ drawbacks: import("@sinclair/typebox").TString;
90
+ rejectionReason: import("@sinclair/typebox").TString;
91
+ }>>;
92
+ positiveConsequences: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
93
+ negativeConsequences: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
94
+ wafImpacts: import("@sinclair/typebox").TObject<{
95
+ security: import("@sinclair/typebox").TString;
96
+ reliability: import("@sinclair/typebox").TString;
97
+ "performance-efficiency": import("@sinclair/typebox").TString;
98
+ "cost-optimization": import("@sinclair/typebox").TString;
99
+ "operational-excellence": import("@sinclair/typebox").TString;
100
+ }>;
101
+ complianceConsiderations: import("@sinclair/typebox").TString;
102
+ implementationNotes: import("@sinclair/typebox").TString;
103
+ }>>>;
77
104
  risks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
105
+ wellArchitectedAssessment: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
106
+ framework: import("@sinclair/typebox").TLiteral<"azure-well-architected-framework">;
107
+ assessmentType: import("@sinclair/typebox").TLiteral<"qualitative">;
108
+ pillars: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
109
+ pillar: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"security">, import("@sinclair/typebox").TLiteral<"reliability">, import("@sinclair/typebox").TLiteral<"performance-efficiency">, import("@sinclair/typebox").TLiteral<"cost-optimization">, import("@sinclair/typebox").TLiteral<"operational-excellence">]>;
110
+ status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"aligned">, import("@sinclair/typebox").TLiteral<"concern">, import("@sinclair/typebox").TLiteral<"blocker">, import("@sinclair/typebox").TLiteral<"not-applicable">]>;
111
+ assessment: import("@sinclair/typebox").TString;
112
+ requirementIds: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
113
+ evidenceRefs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
114
+ recommendations: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
115
+ tradeoffs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
116
+ }>>;
117
+ }>>;
78
118
  }>;
79
119
  export declare const CostLineItemV1Schema: import("@sinclair/typebox").TObject<{
80
120
  id: import("@sinclair/typebox").TString;
@@ -103,6 +143,7 @@ export declare const CostEstimateV1Schema: import("@sinclair/typebox").TObject<{
103
143
  runId: import("@sinclair/typebox").TString;
104
144
  currency: import("@sinclair/typebox").TString;
105
145
  pricingDate: import("@sinclair/typebox").TString;
146
+ pricingStatus: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"complete">, import("@sinclair/typebox").TLiteral<"partial">]>>;
106
147
  lineItems: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
107
148
  id: import("@sinclair/typebox").TString;
108
149
  service: import("@sinclair/typebox").TString;
@@ -124,9 +165,52 @@ export declare const CostEstimateV1Schema: import("@sinclair/typebox").TObject<{
124
165
  basis: import("@sinclair/typebox").TString;
125
166
  }>;
126
167
  }>>;
168
+ unpricedItems: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
169
+ id: import("@sinclair/typebox").TString;
170
+ service: import("@sinclair/typebox").TString;
171
+ sku: import("@sinclair/typebox").TString;
172
+ quantity: import("@sinclair/typebox").TNumber;
173
+ attemptedAt: import("@sinclair/typebox").TString;
174
+ reason: import("@sinclair/typebox").TString;
175
+ }>>>;
127
176
  totalMonthlyCost: import("@sinclair/typebox").TNumber;
128
177
  assumptions: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
129
178
  }>;
179
+ export declare const ReviewNonceSchema: import("@sinclair/typebox").TString;
180
+ /** The kernel-issued rubber-duck review request for one review task (DECISION-031), kept in the object store. */
181
+ export declare const ReviewRequestV1Schema: import("@sinclair/typebox").TObject<{
182
+ schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
183
+ nonce: import("@sinclair/typebox").TString;
184
+ agentType: import("@sinclair/typebox").TLiteral<"rubber-duck">;
185
+ mode: import("@sinclair/typebox").TLiteral<"sync">;
186
+ gate: import("@sinclair/typebox").TInteger;
187
+ subjectKind: import("@sinclair/typebox").TString;
188
+ subjectHash: import("@sinclair/typebox").TString;
189
+ attempt: import("@sinclair/typebox").TInteger;
190
+ maxAttempts: import("@sinclair/typebox").TInteger;
191
+ prompt: import("@sinclair/typebox").TString;
192
+ promptSha256: import("@sinclair/typebox").TString;
193
+ files: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
194
+ label: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"instructions">, import("@sinclair/typebox").TLiteral<"subject">, import("@sinclair/typebox").TLiteral<"input">]>;
195
+ kind: import("@sinclair/typebox").TString;
196
+ path: import("@sinclair/typebox").TString;
197
+ sha256: import("@sinclair/typebox").TString;
198
+ }>>;
199
+ }>;
200
+ /** The record the managed postToolUse hook writes for one rubber-duck task call (DECISION-031). */
201
+ export declare const ReviewCaptureV1Schema: import("@sinclair/typebox").TObject<{
202
+ schema: import("@sinclair/typebox").TLiteral<"apex-review-capture-v1">;
203
+ nonce: import("@sinclair/typebox").TString;
204
+ sessionId: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
205
+ toolName: import("@sinclair/typebox").TString;
206
+ agentType: import("@sinclair/typebox").TString;
207
+ prompt: import("@sinclair/typebox").TString;
208
+ requestSha256: import("@sinclair/typebox").TString;
209
+ response: import("@sinclair/typebox").TString;
210
+ responseSha256: import("@sinclair/typebox").TString;
211
+ capturedAt: import("@sinclair/typebox").TString;
212
+ signature: import("@sinclair/typebox").TString;
213
+ }>;
130
214
  export declare const ReviewFindingsV1Schema: import("@sinclair/typebox").TObject<{
131
215
  schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
132
216
  projectId: import("@sinclair/typebox").TString;
@@ -134,6 +218,13 @@ export declare const ReviewFindingsV1Schema: import("@sinclair/typebox").TObject
134
218
  subjectKind: import("@sinclair/typebox").TString;
135
219
  subjectHash: import("@sinclair/typebox").TString;
136
220
  reviewedAt: import("@sinclair/typebox").TString;
221
+ capture: import("@sinclair/typebox").TObject<{
222
+ reviewer: import("@sinclair/typebox").TLiteral<"rubber-duck">;
223
+ nonce: import("@sinclair/typebox").TString;
224
+ captureHash: import("@sinclair/typebox").TString;
225
+ promptSha256: import("@sinclair/typebox").TString;
226
+ responseSha256: import("@sinclair/typebox").TString;
227
+ }>;
137
228
  findings: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
138
229
  id: import("@sinclair/typebox").TString;
139
230
  severity: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"critical">, import("@sinclair/typebox").TLiteral<"high">, import("@sinclair/typebox").TLiteral<"medium">, import("@sinclair/typebox").TLiteral<"low">, import("@sinclair/typebox").TLiteral<"info">]>;
@@ -143,12 +234,19 @@ export declare const ReviewFindingsV1Schema: import("@sinclair/typebox").TObject
143
234
  evidenceRefs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
144
235
  resolution: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
145
236
  }>>;
237
+ criteria: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
238
+ criterionId: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"security">, import("@sinclair/typebox").TLiteral<"reliability">, import("@sinclair/typebox").TLiteral<"performance-efficiency">, import("@sinclair/typebox").TLiteral<"cost-optimization">, import("@sinclair/typebox").TLiteral<"operational-excellence">]>;
239
+ outcome: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"pass">, import("@sinclair/typebox").TLiteral<"finding">, import("@sinclair/typebox").TLiteral<"not-applicable">]>;
240
+ rationale: import("@sinclair/typebox").TString;
241
+ findingIds: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
242
+ }>>>;
146
243
  }>;
147
244
  export declare const GovernanceConstraintsV1Schema: import("@sinclair/typebox").TObject<{
148
245
  schemaVersion: import("@sinclair/typebox").TLiteral<"1.0.0">;
149
246
  projectId: import("@sinclair/typebox").TString;
150
247
  runId: import("@sinclair/typebox").TString;
151
248
  targetScope: import("@sinclair/typebox").TString;
249
+ source: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"collected">, import("@sinclair/typebox").TLiteral<"reference">]>;
152
250
  discoveredAt: import("@sinclair/typebox").TString;
153
251
  expiresAt: import("@sinclair/typebox").TString;
154
252
  summary: import("@sinclair/typebox").TObject<{
@@ -172,11 +270,14 @@ export declare const PolicyPropertyMapV1Schema: import("@sinclair/typebox").TObj
172
270
  governanceHash: import("@sinclair/typebox").TString;
173
271
  mappings: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
174
272
  policyAssignmentId: import("@sinclair/typebox").TString;
273
+ policyDefinitionId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
274
+ policyDefinitionReferenceId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
175
275
  effect: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"deny">, import("@sinclair/typebox").TLiteral<"modify">, import("@sinclair/typebox").TLiteral<"append">, import("@sinclair/typebox").TLiteral<"audit">, import("@sinclair/typebox").TLiteral<"deployIfNotExists">, import("@sinclair/typebox").TLiteral<"disabled">]>;
176
276
  logicalResourceId: import("@sinclair/typebox").TString;
177
277
  propertyPath: import("@sinclair/typebox").TString;
178
278
  expectedValue: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnknown>;
179
- disposition: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"satisfied">, import("@sinclair/typebox").TLiteral<"planned">, import("@sinclair/typebox").TLiteral<"exempt">, import("@sinclair/typebox").TLiteral<"blocked">]>;
279
+ disposition: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"satisfied">, import("@sinclair/typebox").TLiteral<"planned">, import("@sinclair/typebox").TLiteral<"exempt">, import("@sinclair/typebox").TLiteral<"blocked">, import("@sinclair/typebox").TLiteral<"not-applicable">]>;
280
+ reason: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
180
281
  }>>;
181
282
  }>;
182
283
  export declare const SecretReferenceV1Schema: import("@sinclair/typebox").TObject<{
@@ -209,6 +310,7 @@ export declare const LogicalResourceManifestV1Schema: import("@sinclair/typebox"
209
310
  logicalId: import("@sinclair/typebox").TString;
210
311
  type: import("@sinclair/typebox").TString;
211
312
  implementationAddress: import("@sinclair/typebox").TString;
313
+ executionAddress: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
212
314
  implementationKind: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"resource">, import("@sinclair/typebox").TLiteral<"module">, import("@sinclair/typebox").TLiteral<"data">, import("@sinclair/typebox").TLiteral<"existing">]>;
213
315
  ownership: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"existing">, import("@sinclair/typebox").TLiteral<"managed">]>;
214
316
  dependsOn: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
@@ -307,6 +409,57 @@ export declare const DiagnosisV1Schema: import("@sinclair/typebox").TObject<{
307
409
  diagnosedAt: import("@sinclair/typebox").TString;
308
410
  status: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"healthy">, import("@sinclair/typebox").TLiteral<"degraded">, import("@sinclair/typebox").TLiteral<"failed">, import("@sinclair/typebox").TLiteral<"unknown">]>;
309
411
  observations: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
412
+ operationalHandoff: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TObject<{
413
+ owner: import("@sinclair/typebox").TString;
414
+ escalation: import("@sinclair/typebox").TString;
415
+ maintenanceWindow: import("@sinclair/typebox").TString;
416
+ accessPrerequisites: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
417
+ configurationReferences: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
418
+ name: import("@sinclair/typebox").TString;
419
+ source: import("@sinclair/typebox").TString;
420
+ }>>;
421
+ healthChecks: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
422
+ resourceId: import("@sinclair/typebox").TString;
423
+ check: import("@sinclair/typebox").TString;
424
+ expectedOutcome: import("@sinclair/typebox").TString;
425
+ evidenceRefs: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
426
+ }>>;
427
+ monitoring: import("@sinclair/typebox").TString;
428
+ incidentResponse: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
429
+ applicability: import("@sinclair/typebox").TLiteral<"applicable">;
430
+ owner: import("@sinclair/typebox").TString;
431
+ prerequisites: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
432
+ steps: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
433
+ verification: import("@sinclair/typebox").TString;
434
+ executionStatus: import("@sinclair/typebox").TLiteral<"untested">;
435
+ }>, import("@sinclair/typebox").TObject<{
436
+ applicability: import("@sinclair/typebox").TLiteral<"not-applicable">;
437
+ rationale: import("@sinclair/typebox").TString;
438
+ }>]>;
439
+ rollback: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
440
+ applicability: import("@sinclair/typebox").TLiteral<"applicable">;
441
+ owner: import("@sinclair/typebox").TString;
442
+ prerequisites: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
443
+ steps: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
444
+ verification: import("@sinclair/typebox").TString;
445
+ executionStatus: import("@sinclair/typebox").TLiteral<"untested">;
446
+ }>, import("@sinclair/typebox").TObject<{
447
+ applicability: import("@sinclair/typebox").TLiteral<"not-applicable">;
448
+ rationale: import("@sinclair/typebox").TString;
449
+ }>]>;
450
+ recovery: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
451
+ applicability: import("@sinclair/typebox").TLiteral<"applicable">;
452
+ owner: import("@sinclair/typebox").TString;
453
+ prerequisites: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
454
+ steps: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
455
+ verification: import("@sinclair/typebox").TString;
456
+ executionStatus: import("@sinclair/typebox").TLiteral<"untested">;
457
+ }>, import("@sinclair/typebox").TObject<{
458
+ applicability: import("@sinclair/typebox").TLiteral<"not-applicable">;
459
+ rationale: import("@sinclair/typebox").TString;
460
+ }>]>;
461
+ limitations: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>;
462
+ }>>;
310
463
  causes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
311
464
  id: import("@sinclair/typebox").TString;
312
465
  summary: import("@sinclair/typebox").TString;
@@ -340,6 +493,8 @@ export type WorkloadDecisionManifestV1 = Static<typeof WorkloadDecisionManifestV
340
493
  export type ArchitectureV1 = Static<typeof ArchitectureV1Schema>;
341
494
  export type CostEstimateV1 = Static<typeof CostEstimateV1Schema>;
342
495
  export type ReviewFindingsV1 = Static<typeof ReviewFindingsV1Schema>;
496
+ export type ReviewCaptureV1 = Static<typeof ReviewCaptureV1Schema>;
497
+ export type ReviewRequestV1 = Static<typeof ReviewRequestV1Schema>;
343
498
  export type GovernanceConstraintsV1 = Static<typeof GovernanceConstraintsV1Schema>;
344
499
  export type PolicyPropertyMapV1 = Static<typeof PolicyPropertyMapV1Schema>;
345
500
  export type EnvironmentInputsV1 = Static<typeof EnvironmentInputsV1Schema>;
@@ -352,6 +507,8 @@ export type TelemetryV1 = Static<typeof TelemetryV1Schema>;
352
507
  export type DiagnosisV1 = Static<typeof DiagnosisV1Schema>;
353
508
  export type CapabilityPackManifestV1 = Static<typeof CapabilityPackManifestV1Schema>;
354
509
  export type CustomizationLockV1 = Static<typeof CustomizationLockV1Schema>;
510
+ export declare const GOVERNANCE_MAX_AGE_MS: number;
511
+ export declare function isGovernanceObservationCurrent(discoveredAt: string, now: string): boolean;
355
512
  export declare function hasValidCostArithmetic(estimate: CostEstimateV1): boolean;
356
513
  export declare function hasOnlyTypedSecretReferences(inputs: EnvironmentInputsV1): boolean;
357
514
  export declare function hasValidLogicalResourceReferences(manifest: LogicalResourceManifestV1): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"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"}
package/dist/targets.js CHANGED
@@ -15,6 +15,19 @@ export const DispositionSchema = Type.Union([
15
15
  ]);
16
16
  export const ConfidenceSchema = Type.Union([Type.Literal("low"), Type.Literal("medium"), Type.Literal("high")]);
17
17
  export const CurrencySchema = Type.String({ pattern: "^[A-Z]{3}$" });
18
+ export const WellArchitectedPillarSchema = Type.Union([
19
+ Type.Literal("security"),
20
+ Type.Literal("reliability"),
21
+ Type.Literal("performance-efficiency"),
22
+ Type.Literal("cost-optimization"),
23
+ Type.Literal("operational-excellence"),
24
+ ]);
25
+ export const WellArchitectedStatusSchema = Type.Union([
26
+ Type.Literal("aligned"),
27
+ Type.Literal("concern"),
28
+ Type.Literal("blocker"),
29
+ Type.Literal("not-applicable"),
30
+ ]);
18
31
  const RevisionV1Schema = Type.Object({
19
32
  number: Type.Integer({ minimum: 1 }),
20
33
  createdAt: IsoDateTimeSchema,
@@ -79,12 +92,50 @@ export const ArchitectureV1Schema = Type.Object({
79
92
  components: Type.Array(Type.Object({
80
93
  id: NonEmptyStringSchema,
81
94
  service: NonEmptyStringSchema,
95
+ resourceTypes: Type.Array(Type.String({ pattern: "^[A-Za-z][A-Za-z0-9]*\\.[A-Za-z][A-Za-z0-9.]*(?:/[A-Za-z][A-Za-z0-9]*)+$" }), { minItems: 1, uniqueItems: true }),
82
96
  purpose: NonEmptyStringSchema,
83
97
  requirementIds: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
84
98
  dependsOn: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
85
99
  }, { additionalProperties: false }), { minItems: 1 }),
86
100
  decisions: Type.Array(NonEmptyStringSchema),
101
+ decisionRecords: Type.Optional(Type.Array(Type.Object({
102
+ id: Type.String({ pattern: "^ADR-[0-9]{4}$" }),
103
+ title: Type.String({ minLength: 1, maxLength: 256 }),
104
+ context: Type.String({ minLength: 1, maxLength: 4096 }),
105
+ decision: Type.String({ minLength: 1, maxLength: 4096 }),
106
+ requirementIds: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 256, uniqueItems: true }),
107
+ alternatives: Type.Array(Type.Object({
108
+ option: Type.String({ minLength: 1, maxLength: 256 }),
109
+ benefits: Type.String({ minLength: 1, maxLength: 2048 }),
110
+ drawbacks: Type.String({ minLength: 1, maxLength: 2048 }),
111
+ rejectionReason: Type.String({ minLength: 1, maxLength: 2048 }),
112
+ }, { additionalProperties: false }), { minItems: 2, maxItems: 10 }),
113
+ positiveConsequences: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 32 }),
114
+ negativeConsequences: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 32 }),
115
+ wafImpacts: Type.Object({
116
+ security: NonEmptyStringSchema,
117
+ reliability: NonEmptyStringSchema,
118
+ "performance-efficiency": NonEmptyStringSchema,
119
+ "cost-optimization": NonEmptyStringSchema,
120
+ "operational-excellence": NonEmptyStringSchema,
121
+ }, { additionalProperties: false }),
122
+ complianceConsiderations: NonEmptyStringSchema,
123
+ implementationNotes: NonEmptyStringSchema,
124
+ }, { additionalProperties: false }), { minItems: 1, maxItems: 64 })),
87
125
  risks: Type.Array(NonEmptyStringSchema),
126
+ wellArchitectedAssessment: Type.Optional(Type.Object({
127
+ framework: Type.Literal("azure-well-architected-framework"),
128
+ assessmentType: Type.Literal("qualitative"),
129
+ pillars: Type.Array(Type.Object({
130
+ pillar: WellArchitectedPillarSchema,
131
+ status: WellArchitectedStatusSchema,
132
+ assessment: NonEmptyStringSchema,
133
+ requirementIds: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
134
+ evidenceRefs: Type.Array(Sha256Schema, { uniqueItems: true }),
135
+ recommendations: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
136
+ tradeoffs: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
137
+ }, { additionalProperties: false }), { minItems: 5, maxItems: 5 }),
138
+ }, { additionalProperties: false })),
88
139
  }, { $id: "https://schemas.apexops.dev/architecture-v1.json", additionalProperties: false });
89
140
  export const CostLineItemV1Schema = Type.Object({
90
141
  id: NonEmptyStringSchema,
@@ -113,10 +164,54 @@ export const CostEstimateV1Schema = Type.Object({
113
164
  runId: RunIdSchema,
114
165
  currency: CurrencySchema,
115
166
  pricingDate: Type.String({ format: "date" }),
116
- lineItems: Type.Array(CostLineItemV1Schema, { minItems: 1 }),
167
+ pricingStatus: Type.Optional(Type.Union([Type.Literal("complete"), Type.Literal("partial")])),
168
+ lineItems: Type.Array(CostLineItemV1Schema),
169
+ unpricedItems: Type.Optional(Type.Array(Type.Object({
170
+ id: NonEmptyStringSchema,
171
+ service: NonEmptyStringSchema,
172
+ sku: NonEmptyStringSchema,
173
+ quantity: Type.Number({ exclusiveMinimum: 0 }),
174
+ attemptedAt: IsoDateTimeSchema,
175
+ reason: NonEmptyStringSchema,
176
+ }, { additionalProperties: false }), { minItems: 1 })),
117
177
  totalMonthlyCost: Type.Number({ minimum: 0 }),
118
178
  assumptions: Type.Array(NonEmptyStringSchema),
119
179
  }, { $id: "https://schemas.apexops.dev/cost-estimate-v1.json", additionalProperties: false });
180
+ export const ReviewNonceSchema = Type.String({ pattern: "^[0-9a-f]{32}$" });
181
+ /** The kernel-issued rubber-duck review request for one review task (DECISION-031), kept in the object store. */
182
+ export const ReviewRequestV1Schema = Type.Object({
183
+ schemaVersion: ContractVersionSchema,
184
+ nonce: ReviewNonceSchema,
185
+ agentType: Type.Literal("rubber-duck"),
186
+ mode: Type.Literal("sync"),
187
+ gate: Type.Integer({ minimum: 1, maximum: 3 }),
188
+ subjectKind: NonEmptyStringSchema,
189
+ subjectHash: Sha256Schema,
190
+ attempt: Type.Integer({ minimum: 1 }),
191
+ maxAttempts: Type.Integer({ minimum: 1 }),
192
+ prompt: NonEmptyStringSchema,
193
+ promptSha256: Sha256Schema,
194
+ files: Type.Array(Type.Object({
195
+ label: Type.Union([Type.Literal("instructions"), Type.Literal("subject"), Type.Literal("input")]),
196
+ kind: NonEmptyStringSchema,
197
+ path: NonEmptyStringSchema,
198
+ sha256: Sha256Schema,
199
+ }, { additionalProperties: false }), { minItems: 2 }),
200
+ }, { $id: "https://schemas.apexops.dev/review-request-v1.json", additionalProperties: false });
201
+ /** The record the managed postToolUse hook writes for one rubber-duck task call (DECISION-031). */
202
+ export const ReviewCaptureV1Schema = Type.Object({
203
+ schema: Type.Literal("apex-review-capture-v1"),
204
+ nonce: ReviewNonceSchema,
205
+ sessionId: Type.Union([Type.String(), Type.Null()]),
206
+ toolName: Type.String(),
207
+ agentType: Type.String(),
208
+ prompt: Type.String(),
209
+ requestSha256: Sha256Schema,
210
+ response: Type.String(),
211
+ responseSha256: Sha256Schema,
212
+ capturedAt: IsoDateTimeSchema,
213
+ signature: Sha256Schema,
214
+ }, { $id: "https://schemas.apexops.dev/review-capture-v1.json", additionalProperties: false });
120
215
  export const ReviewFindingsV1Schema = Type.Object({
121
216
  schemaVersion: ContractVersionSchema,
122
217
  projectId: ProjectIdSchema,
@@ -124,6 +219,13 @@ export const ReviewFindingsV1Schema = Type.Object({
124
219
  subjectKind: NonEmptyStringSchema,
125
220
  subjectHash: Sha256Schema,
126
221
  reviewedAt: IsoDateTimeSchema,
222
+ capture: Type.Object({
223
+ reviewer: Type.Literal("rubber-duck"),
224
+ nonce: ReviewNonceSchema,
225
+ captureHash: Sha256Schema,
226
+ promptSha256: Sha256Schema,
227
+ responseSha256: Sha256Schema,
228
+ }, { additionalProperties: false }),
127
229
  findings: Type.Array(Type.Object({
128
230
  id: NonEmptyStringSchema,
129
231
  severity: SeveritySchema,
@@ -133,12 +235,19 @@ export const ReviewFindingsV1Schema = Type.Object({
133
235
  evidenceRefs: Type.Array(Sha256Schema, { uniqueItems: true }),
134
236
  resolution: Type.Optional(NonEmptyStringSchema),
135
237
  }, { additionalProperties: false })),
238
+ criteria: Type.Optional(Type.Array(Type.Object({
239
+ criterionId: WellArchitectedPillarSchema,
240
+ outcome: Type.Union([Type.Literal("pass"), Type.Literal("finding"), Type.Literal("not-applicable")]),
241
+ rationale: NonEmptyStringSchema,
242
+ findingIds: Type.Array(NonEmptyStringSchema, { uniqueItems: true }),
243
+ }, { additionalProperties: false }), { minItems: 5, maxItems: 5 })),
136
244
  }, { $id: "https://schemas.apexops.dev/review-findings-v1.json", additionalProperties: false });
137
245
  export const GovernanceConstraintsV1Schema = Type.Object({
138
246
  schemaVersion: ContractVersionSchema,
139
247
  projectId: ProjectIdSchema,
140
248
  runId: RunIdSchema,
141
249
  targetScope: NonEmptyStringSchema,
250
+ source: Type.Union([Type.Literal("collected"), Type.Literal("reference")]),
142
251
  discoveredAt: IsoDateTimeSchema,
143
252
  expiresAt: IsoDateTimeSchema,
144
253
  summary: Type.Object({
@@ -162,6 +271,8 @@ export const PolicyPropertyMapV1Schema = Type.Object({
162
271
  governanceHash: Sha256Schema,
163
272
  mappings: Type.Array(Type.Object({
164
273
  policyAssignmentId: NonEmptyStringSchema,
274
+ policyDefinitionId: Type.Optional(NonEmptyStringSchema),
275
+ policyDefinitionReferenceId: Type.Optional(NonEmptyStringSchema),
165
276
  effect: Type.Union([
166
277
  Type.Literal("deny"),
167
278
  Type.Literal("modify"),
@@ -178,7 +289,9 @@ export const PolicyPropertyMapV1Schema = Type.Object({
178
289
  Type.Literal("planned"),
179
290
  Type.Literal("exempt"),
180
291
  Type.Literal("blocked"),
292
+ Type.Literal("not-applicable"),
181
293
  ]),
294
+ reason: Type.Optional(Type.String({ minLength: 1, maxLength: 1024 })),
182
295
  }, { additionalProperties: false })),
183
296
  }, { $id: "https://schemas.apexops.dev/policy-property-map-v1.json", additionalProperties: false });
184
297
  export const SecretReferenceV1Schema = Type.Object({
@@ -213,6 +326,7 @@ export const LogicalResourceManifestV1Schema = Type.Object({
213
326
  logicalId: NonEmptyStringSchema,
214
327
  type: NonEmptyStringSchema,
215
328
  implementationAddress: NonEmptyStringSchema,
329
+ executionAddress: Type.Optional(NonEmptyStringSchema),
216
330
  implementationKind: Type.Union([
217
331
  Type.Literal("resource"),
218
332
  Type.Literal("module"),
@@ -314,6 +428,17 @@ export const TelemetryV1Schema = Type.Object({
314
428
  confidence: ConfidenceSchema,
315
429
  dimensions: Type.Record(NonEmptyStringSchema, Type.String()),
316
430
  }, { $id: "https://schemas.apexops.dev/telemetry-v1.json", additionalProperties: false });
431
+ const OperationalProcedureSchema = Type.Union([
432
+ Type.Object({
433
+ applicability: Type.Literal("applicable"),
434
+ owner: NonEmptyStringSchema,
435
+ prerequisites: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 32 }),
436
+ steps: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 64 }),
437
+ verification: NonEmptyStringSchema,
438
+ executionStatus: Type.Literal("untested"),
439
+ }, { additionalProperties: false }),
440
+ Type.Object({ applicability: Type.Literal("not-applicable"), rationale: NonEmptyStringSchema }, { additionalProperties: false }),
441
+ ]);
317
442
  export const DiagnosisV1Schema = Type.Object({
318
443
  schemaVersion: ContractVersionSchema,
319
444
  projectId: ProjectIdSchema,
@@ -326,6 +451,24 @@ export const DiagnosisV1Schema = Type.Object({
326
451
  Type.Literal("unknown"),
327
452
  ]),
328
453
  observations: Type.Array(NonEmptyStringSchema),
454
+ operationalHandoff: Type.Optional(Type.Object({
455
+ owner: NonEmptyStringSchema,
456
+ escalation: NonEmptyStringSchema,
457
+ maintenanceWindow: NonEmptyStringSchema,
458
+ accessPrerequisites: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 32 }),
459
+ configurationReferences: Type.Array(Type.Object({ name: NonEmptyStringSchema, source: NonEmptyStringSchema }, { additionalProperties: false }), { maxItems: 128 }),
460
+ healthChecks: Type.Array(Type.Object({
461
+ resourceId: NonEmptyStringSchema,
462
+ check: NonEmptyStringSchema,
463
+ expectedOutcome: NonEmptyStringSchema,
464
+ evidenceRefs: Type.Array(Sha256Schema, { maxItems: 32, uniqueItems: true }),
465
+ }, { additionalProperties: false }), { minItems: 1, maxItems: 256 }),
466
+ monitoring: NonEmptyStringSchema,
467
+ incidentResponse: OperationalProcedureSchema,
468
+ rollback: OperationalProcedureSchema,
469
+ recovery: OperationalProcedureSchema,
470
+ limitations: Type.Array(NonEmptyStringSchema, { minItems: 1, maxItems: 64 }),
471
+ }, { additionalProperties: false })),
329
472
  causes: Type.Array(Type.Object({
330
473
  id: NonEmptyStringSchema,
331
474
  summary: NonEmptyStringSchema,
@@ -356,6 +499,23 @@ export const CustomizationLockV1Schema = Type.Object({
356
499
  lockedAt: IsoDateTimeSchema,
357
500
  }, { $id: "https://schemas.apexops.dev/customization-lock-v1.json", additionalProperties: false });
358
501
  const arithmeticEqual = (left, right) => Math.abs(left - right) <= 0.000001;
502
+ export const GOVERNANCE_MAX_AGE_MS = 30 * 86_400_000;
503
+ export function isGovernanceObservationCurrent(discoveredAt, now) {
504
+ for (const value of [discoveredAt, now]) {
505
+ if (!/^\d{4}-\d{2}-\d{2}T(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|[+-](?:[01]\d|2[0-3]):[0-5]\d)$(?![\s\S])/.test(value))
506
+ return false;
507
+ const date = value.slice(0, 10);
508
+ const dateValue = Date.parse(`${date}T00:00:00Z`);
509
+ if (!Number.isFinite(dateValue) || new Date(dateValue).toISOString().slice(0, 10) !== date)
510
+ return false;
511
+ }
512
+ const observed = Date.parse(discoveredAt);
513
+ const current = Date.parse(now);
514
+ return (Number.isFinite(observed) &&
515
+ Number.isFinite(current) &&
516
+ current >= observed &&
517
+ current - observed < GOVERNANCE_MAX_AGE_MS);
518
+ }
359
519
  export function hasValidCostArithmetic(estimate) {
360
520
  const linesAreValid = estimate.lineItems.every((line) => arithmeticEqual(line.monthlyCost, line.quantity * line.unitPrice * line.unitsPerMonth) &&
361
521
  line.uncertainty.lowerMonthlyCost <= line.monthlyCost &&
@@ -370,7 +530,13 @@ export function hasValidLogicalResourceReferences(manifest) {
370
530
  const ids = manifest.resources.map((resource) => resource.logicalId);
371
531
  const knownIds = new Set(ids);
372
532
  return (new Set(ids).size === ids.length &&
373
- manifest.resources.every((resource) => resource.dependsOn.every((id) => knownIds.has(id))));
533
+ manifest.resources.every((resource) => {
534
+ const referenceKind = manifest.track === "bicep" ? "existing" : "data";
535
+ const ownershipMatches = resource.ownership === "existing"
536
+ ? resource.implementationKind === referenceKind
537
+ : resource.implementationKind === "resource" || resource.implementationKind === "module";
538
+ return ownershipMatches && resource.dependsOn.every((id) => knownIds.has(id));
539
+ }));
374
540
  }
375
541
  export function hasValidPreviewApprovalBinding(attestation, preview, approval) {
376
542
  const writerAuthorityMatches = (approval.writerEpoch === preview.ownerEpoch && approval.writerTransferClaimHash === undefined) ||