@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.
- package/README.md +28 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/archetype-source.d.ts +70 -0
- package/dist/archetype-source.d.ts.map +1 -0
- package/dist/archetype-source.js +58 -0
- package/dist/archetype-source.js.map +1 -0
- package/dist/artifacts.d.ts +64 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +69 -0
- package/dist/artifacts.js.map +1 -1
- package/dist/common.d.ts +2 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +1 -0
- package/dist/common.js.map +1 -1
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +2 -0
- package/dist/evidence.js.map +1 -1
- package/dist/governance-observation.d.ts +15 -0
- package/dist/governance-observation.d.ts.map +1 -0
- package/dist/governance-observation.js +15 -0
- package/dist/governance-observation.js.map +1 -0
- package/dist/index.d.ts +627 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +47 -4
- package/dist/index.js.map +1 -1
- package/dist/native-validation.d.ts +136 -0
- package/dist/native-validation.d.ts.map +1 -0
- package/dist/native-validation.js +276 -0
- package/dist/native-validation.js.map +1 -0
- package/dist/onboarding.d.ts +184 -3
- package/dist/onboarding.d.ts.map +1 -1
- package/dist/onboarding.js +122 -6
- package/dist/onboarding.js.map +1 -1
- package/dist/policy-validation.d.ts +45 -0
- package/dist/policy-validation.d.ts.map +1 -0
- package/dist/policy-validation.js +194 -0
- package/dist/policy-validation.js.map +1 -0
- package/dist/runtime.d.ts +94 -2
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +53 -4
- package/dist/runtime.js.map +1 -1
- package/dist/targets.d.ts +158 -1
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +168 -2
- package/dist/targets.js.map +1 -1
- package/dist/test/contracts.test.js +769 -4
- package/dist/test/contracts.test.js.map +1 -1
- package/package.json +2 -2
- package/schemas/archetype-batch-config-v1.schema.json +51 -0
- package/schemas/archetype-batch-plan-v1.schema.json +227 -0
- package/schemas/archetype-source-proposal-v1.schema.json +113 -0
- package/schemas/architecture-v1.schema.json +278 -0
- package/schemas/bootstrap-plan-v1.schema.json +206 -0
- package/schemas/contract-metadata.json +85 -0
- package/schemas/cost-estimate-v1.schema.json +54 -1
- package/schemas/diagnosis-v1.schema.json +323 -0
- package/schemas/governance-constraints-v1.schema.json +13 -0
- package/schemas/governance-observation-receipt-v1.schema.json +60 -0
- package/schemas/governance-provision-plan-v1.schema.json +307 -0
- package/schemas/governance-setup-config-v1.schema.json +80 -0
- package/schemas/governance-setup-plan-v1.schema.json +217 -0
- package/schemas/iac-binding-v1.schema.json +60 -0
- package/schemas/input-request-v1.schema.json +296 -2
- package/schemas/logical-resource-manifest-v1.schema.json +4 -0
- package/schemas/native-validation-receipt-v1.schema.json +862 -0
- package/schemas/onboarding-config-v1.schema.json +15 -12
- package/schemas/policy-property-map-v1.schema.json +17 -0
- package/schemas/policy-validation-v1.schema.json +278 -0
- package/schemas/project-config-v1.schema.json +14 -1
- package/schemas/repeat-guard-records-v1.schema.json +76 -0
- package/schemas/repository-publish-config-v1.schema.json +52 -0
- package/schemas/repository-publish-plan-v1.schema.json +265 -0
- package/schemas/requirements-amendment-v1.schema.json +213 -0
- package/schemas/requirements-change-proposal-v1.schema.json +196 -0
- package/schemas/review-capture-v1.schema.json +67 -0
- package/schemas/review-findings-v1.schema.json +103 -0
- 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;
|
package/dist/targets.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"targets.d.ts","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAWtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE/E,eAAO,MAAM,cAAc,iRAMzB,CAAC;AACH,eAAO,MAAM,iBAAiB,6OAK5B,CAAC;AACH,eAAO,MAAM,gBAAgB,iLAAkF,CAAC;AAChH,eAAO,MAAM,cAAc,qCAAyC,CAAC;
|
|
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
|
-
|
|
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) =>
|
|
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) ||
|