@msn-control/liftoff 0.9.8 → 0.10.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 (107) hide show
  1. package/DEVELOPER.md +142 -0
  2. package/README.md +26 -18
  3. package/assets/governance/single-maintainer-gitflow/policy.md +62 -13
  4. package/dist/args.js +21 -0
  5. package/dist/args.js.map +1 -1
  6. package/dist/artifact-lifecycle.d.ts +1 -1
  7. package/dist/artifact-lifecycle.js +5 -0
  8. package/dist/artifact-lifecycle.js.map +1 -1
  9. package/dist/commands.js +355 -13
  10. package/dist/commands.js.map +1 -1
  11. package/dist/file-system.js +100 -13
  12. package/dist/file-system.js.map +1 -1
  13. package/dist/governance-activation/activation-state.d.ts +32 -0
  14. package/dist/governance-activation/activation-state.js +165 -0
  15. package/dist/governance-activation/activation-state.js.map +1 -0
  16. package/dist/governance-activation/approvals.d.ts +188 -0
  17. package/dist/governance-activation/approvals.js +508 -0
  18. package/dist/governance-activation/approvals.js.map +1 -0
  19. package/dist/governance-activation/canonical-json.d.ts +3 -0
  20. package/dist/governance-activation/canonical-json.js +36 -0
  21. package/dist/governance-activation/canonical-json.js.map +1 -0
  22. package/dist/governance-activation/commands.d.ts +10 -0
  23. package/dist/governance-activation/commands.js +1023 -0
  24. package/dist/governance-activation/commands.js.map +1 -0
  25. package/dist/governance-activation/compatibility.d.ts +68 -0
  26. package/dist/governance-activation/compatibility.js +447 -0
  27. package/dist/governance-activation/compatibility.js.map +1 -0
  28. package/dist/governance-activation/credentials.d.ts +160 -0
  29. package/dist/governance-activation/credentials.js +403 -0
  30. package/dist/governance-activation/credentials.js.map +1 -0
  31. package/dist/governance-activation/doctor.d.ts +10 -0
  32. package/dist/governance-activation/doctor.js +379 -0
  33. package/dist/governance-activation/doctor.js.map +1 -0
  34. package/dist/governance-activation/evidence.d.ts +49 -0
  35. package/dist/governance-activation/evidence.js +246 -0
  36. package/dist/governance-activation/evidence.js.map +1 -0
  37. package/dist/governance-activation/graph.d.ts +397 -0
  38. package/dist/governance-activation/graph.js +441 -0
  39. package/dist/governance-activation/graph.js.map +1 -0
  40. package/dist/governance-activation/identity.d.ts +35 -0
  41. package/dist/governance-activation/identity.js +89 -0
  42. package/dist/governance-activation/identity.js.map +1 -0
  43. package/dist/governance-activation/index.d.ts +18 -0
  44. package/dist/governance-activation/index.js +19 -0
  45. package/dist/governance-activation/index.js.map +1 -0
  46. package/dist/governance-activation/migration.d.ts +44 -0
  47. package/dist/governance-activation/migration.js +268 -0
  48. package/dist/governance-activation/migration.js.map +1 -0
  49. package/dist/governance-activation/readiness.d.ts +23 -0
  50. package/dist/governance-activation/readiness.js +158 -0
  51. package/dist/governance-activation/readiness.js.map +1 -0
  52. package/dist/governance-activation/reconciliation.d.ts +11 -0
  53. package/dist/governance-activation/reconciliation.js +58 -0
  54. package/dist/governance-activation/reconciliation.js.map +1 -0
  55. package/dist/governance-activation/release-integrity.d.ts +11 -0
  56. package/dist/governance-activation/release-integrity.js +49 -0
  57. package/dist/governance-activation/release-integrity.js.map +1 -0
  58. package/dist/governance-activation/seed-lifecycle.d.ts +116 -0
  59. package/dist/governance-activation/seed-lifecycle.js +609 -0
  60. package/dist/governance-activation/seed-lifecycle.js.map +1 -0
  61. package/dist/governance-activation/source-of-truth.d.ts +164 -0
  62. package/dist/governance-activation/source-of-truth.js +986 -0
  63. package/dist/governance-activation/source-of-truth.js.map +1 -0
  64. package/dist/governance-activation/task-projection.d.ts +21 -0
  65. package/dist/governance-activation/task-projection.js +75 -0
  66. package/dist/governance-activation/task-projection.js.map +1 -0
  67. package/dist/governance-activation/transitions.d.ts +163 -0
  68. package/dist/governance-activation/transitions.js +2128 -0
  69. package/dist/governance-activation/transitions.js.map +1 -0
  70. package/dist/governance-activation/type-contract.d.ts +1 -0
  71. package/dist/governance-activation/type-contract.js +27 -0
  72. package/dist/governance-activation/type-contract.js.map +1 -0
  73. package/dist/governance-activation/types.d.ts +390 -0
  74. package/dist/governance-activation/types.js +108 -0
  75. package/dist/governance-activation/types.js.map +1 -0
  76. package/dist/governance-activation/validators.d.ts +17 -0
  77. package/dist/governance-activation/validators.js +1305 -0
  78. package/dist/governance-activation/validators.js.map +1 -0
  79. package/dist/init-filesystem.js +5 -1
  80. package/dist/init-filesystem.js.map +1 -1
  81. package/dist/planner.js +3 -3
  82. package/dist/planner.js.map +1 -1
  83. package/dist/power-apps-templates.js +14 -1
  84. package/dist/power-apps-templates.js.map +1 -1
  85. package/dist/process-runner.d.ts +3 -0
  86. package/dist/process-runner.js +68 -10
  87. package/dist/process-runner.js.map +1 -1
  88. package/dist/repository-governance.d.ts +13 -3
  89. package/dist/repository-governance.js +385 -52
  90. package/dist/repository-governance.js.map +1 -1
  91. package/dist/telemetry/contract.d.ts +1 -1
  92. package/dist/telemetry/contract.js +6 -0
  93. package/dist/telemetry/contract.js.map +1 -1
  94. package/dist/templates.js +320 -25
  95. package/dist/templates.js.map +1 -1
  96. package/dist/types.d.ts +14 -6
  97. package/docs/cli-reference.md +60 -12
  98. package/docs/configuration-and-manifests.md +40 -16
  99. package/docs/existing-repositories.md +22 -11
  100. package/docs/getting-started.md +46 -10
  101. package/docs/prerequisites.md +5 -0
  102. package/docs/project-structure.md +34 -5
  103. package/docs/repository-governance.md +200 -203
  104. package/docs/safety-and-consent.md +29 -2
  105. package/docs/troubleshooting.md +74 -4
  106. package/docs/workloads.md +1 -1
  107. package/package.json +2 -1
@@ -0,0 +1,508 @@
1
+ import { canonicalJson, canonicalSha256 } from './canonical-json.js';
2
+ import { currentActivationIdentity } from './graph.js';
3
+ const destinationTypes = new Set([
4
+ 'repository',
5
+ 'subscription',
6
+ 'environment',
7
+ 'tenant',
8
+ 'local',
9
+ 'external'
10
+ ]);
11
+ const currencyPattern = /^[A-Z]{3}$/u;
12
+ const hex64Pattern = /^[a-f0-9]{64}$/u;
13
+ const isoLikePattern = /^\d{4}-\d{2}-\d{2}T/u;
14
+ const activationIdentityProperties = {
15
+ liftoffVersion: { const: currentActivationIdentity.liftoffVersion },
16
+ manifestArtifactVersion: { const: currentActivationIdentity.manifestArtifactVersion },
17
+ policyVersion: { const: currentActivationIdentity.policyVersion },
18
+ activationContractVersion: { const: currentActivationIdentity.activationContractVersion },
19
+ phaseGraphSchemaVersion: { const: currentActivationIdentity.phaseGraphSchemaVersion },
20
+ phaseGraphHash: { const: currentActivationIdentity.phaseGraphHash },
21
+ activationStateSchemaVersion: { const: currentActivationIdentity.activationStateSchemaVersion },
22
+ evidenceHeaderSchemaVersion: { const: currentActivationIdentity.evidenceHeaderSchemaVersion },
23
+ approvalEnvelopeSchemaVersion: { const: currentActivationIdentity.approvalEnvelopeSchemaVersion },
24
+ supersessionSchemaVersion: { const: currentActivationIdentity.supersessionSchemaVersion },
25
+ credentialPolicySchemaVersion: { const: currentActivationIdentity.credentialPolicySchemaVersion }
26
+ };
27
+ export const approvalEnvelopeV1Schema = {
28
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
29
+ $id: 'https://mission-control.local/liftoff/governance/approval-envelope.schema.v1.json',
30
+ title: 'Liftoff governance approval envelope v1',
31
+ type: 'object',
32
+ additionalProperties: false,
33
+ required: [
34
+ 'schemaVersion',
35
+ 'id',
36
+ 'phaseId',
37
+ 'gateKind',
38
+ 'identity',
39
+ 'baselineSha',
40
+ 'planDigest',
41
+ 'resources',
42
+ 'destinations',
43
+ 'permissions',
44
+ 'costCeiling',
45
+ 'policyExceptions',
46
+ 'destructiveScope',
47
+ 'expiresAt',
48
+ 'approvedAt',
49
+ 'approver'
50
+ ],
51
+ properties: {
52
+ schemaVersion: { const: currentActivationIdentity.approvalEnvelopeSchemaVersion },
53
+ id: { type: 'string', minLength: 1 },
54
+ phaseId: { type: 'string' },
55
+ gateKind: { type: 'string' },
56
+ identity: {
57
+ type: 'object',
58
+ additionalProperties: false,
59
+ required: Object.keys(activationIdentityProperties),
60
+ properties: activationIdentityProperties
61
+ },
62
+ baselineSha: { type: 'string', pattern: '^[a-f0-9]{64}$' },
63
+ planDigest: { type: 'string', pattern: '^[a-f0-9]{64}$' },
64
+ resources: {
65
+ type: 'array',
66
+ items: {
67
+ type: 'object',
68
+ additionalProperties: false,
69
+ required: ['type', 'identity'],
70
+ properties: {
71
+ type: { type: 'string', minLength: 1 },
72
+ identity: { type: 'string', minLength: 1 }
73
+ }
74
+ }
75
+ },
76
+ destinations: {
77
+ type: 'array',
78
+ items: {
79
+ type: 'object',
80
+ additionalProperties: false,
81
+ required: ['type', 'identity', 'repository', 'subscriptionId'],
82
+ properties: {
83
+ type: { enum: ['repository', 'subscription', 'environment', 'tenant', 'local', 'external'] },
84
+ identity: { type: 'string', minLength: 1 },
85
+ repository: { type: ['string', 'null'] },
86
+ subscriptionId: { type: ['string', 'null'] }
87
+ }
88
+ }
89
+ },
90
+ permissions: { type: 'array', items: { type: 'string', minLength: 1 } },
91
+ costCeiling: {
92
+ type: 'object',
93
+ additionalProperties: false,
94
+ required: ['currency', 'fixedMonthlyCents', 'usageMonthlyCents'],
95
+ properties: {
96
+ currency: { type: 'string', pattern: '^[A-Z]{3}$' },
97
+ fixedMonthlyCents: { type: 'integer', minimum: 0 },
98
+ usageMonthlyCents: { type: 'integer', minimum: 0 }
99
+ }
100
+ },
101
+ policyExceptions: { type: 'array', items: { type: 'string', minLength: 1 } },
102
+ destructiveScope: { type: 'array', items: { type: 'string', minLength: 1 } },
103
+ expiresAt: { type: 'string', format: 'date-time' },
104
+ approvedAt: { type: 'string', format: 'date-time' },
105
+ approver: { type: 'string', minLength: 1 }
106
+ }
107
+ };
108
+ function cleanString(value, path) {
109
+ if (typeof value !== 'string') {
110
+ throw new Error(`${path} must be a string.`);
111
+ }
112
+ const cleaned = value.trim();
113
+ if (cleaned.length === 0) {
114
+ throw new Error(`${path} must be a non-empty string.`);
115
+ }
116
+ return cleaned;
117
+ }
118
+ function sortedUnique(values, path, normalize, keyFor) {
119
+ const normalized = values.map((value, index) => normalize(value, index));
120
+ const seen = new Set();
121
+ for (const value of normalized) {
122
+ const key = keyFor(value);
123
+ if (seen.has(key)) {
124
+ throw new Error(`${path} must not contain duplicate ${key}.`);
125
+ }
126
+ seen.add(key);
127
+ }
128
+ return [...normalized].sort((left, right) => keyFor(left).localeCompare(keyFor(right), 'en'));
129
+ }
130
+ function normalizeResource(resource, index) {
131
+ return {
132
+ type: cleanString(resource.type, `approvalEnvelope.resources[${index}].type`).toLowerCase(),
133
+ identity: cleanString(resource.identity, `approvalEnvelope.resources[${index}].identity`)
134
+ };
135
+ }
136
+ function resourceKey(resource) {
137
+ return canonicalJson(resource);
138
+ }
139
+ function normalizeDestination(destination, index) {
140
+ if (!destinationTypes.has(destination.type)) {
141
+ throw new Error(`approvalEnvelope.destinations[${index}].type contains unsupported value ${JSON.stringify(destination.type)}.`);
142
+ }
143
+ return {
144
+ type: destination.type,
145
+ identity: cleanString(destination.identity, `approvalEnvelope.destinations[${index}].identity`),
146
+ repository: destination.repository === null
147
+ ? null
148
+ : cleanString(destination.repository, `approvalEnvelope.destinations[${index}].repository`),
149
+ subscriptionId: destination.subscriptionId === null
150
+ ? null
151
+ : cleanString(destination.subscriptionId, `approvalEnvelope.destinations[${index}].subscriptionId`)
152
+ };
153
+ }
154
+ function destinationKey(destination) {
155
+ return canonicalJson(destination);
156
+ }
157
+ function normalizePermission(permission, index) {
158
+ return cleanString(permission, `approvalEnvelope.permissions[${index}]`).toLowerCase();
159
+ }
160
+ function normalizePlainScope(scope, index, field) {
161
+ return cleanString(scope, `approvalEnvelope.${field}[${index}]`);
162
+ }
163
+ function identityDigest(identity) {
164
+ return canonicalSha256(identity);
165
+ }
166
+ function sameIdentity(left, right) {
167
+ return identityDigest(left) === identityDigest(right);
168
+ }
169
+ function digest(value, path) {
170
+ if (!hex64Pattern.test(value)) {
171
+ throw new Error(`${path} must be a SHA-256 hex digest.`);
172
+ }
173
+ return value;
174
+ }
175
+ function timestamp(value, path) {
176
+ if (!isoLikePattern.test(value) || Number.isNaN(Date.parse(value))) {
177
+ throw new Error(`${path} must be a valid ISO timestamp.`);
178
+ }
179
+ return value;
180
+ }
181
+ export function normalizeApprovalCostCeiling(cost) {
182
+ const currency = cleanString(cost.currency, 'approvalEnvelope.costCeiling.currency');
183
+ if (!currencyPattern.test(currency)) {
184
+ throw new Error('approvalEnvelope.costCeiling.currency must be a three-letter uppercase ISO currency code.');
185
+ }
186
+ for (const key of ['fixedMonthlyCents', 'usageMonthlyCents']) {
187
+ if (!Number.isSafeInteger(cost[key]) || cost[key] < 0) {
188
+ throw new Error(`approvalEnvelope.costCeiling.${key} must be a non-negative safe integer number of cents.`);
189
+ }
190
+ }
191
+ return {
192
+ currency,
193
+ fixedMonthlyCents: cost.fixedMonthlyCents,
194
+ usageMonthlyCents: cost.usageMonthlyCents
195
+ };
196
+ }
197
+ export function normalizeApprovalResources(resources) {
198
+ return sortedUnique(resources, 'approvalEnvelope.resources', normalizeResource, resourceKey);
199
+ }
200
+ export function normalizeApprovalDestinations(destinations) {
201
+ return sortedUnique(destinations, 'approvalEnvelope.destinations', normalizeDestination, destinationKey);
202
+ }
203
+ export function normalizeApprovalPermissions(permissions) {
204
+ return sortedUnique(permissions, 'approvalEnvelope.permissions', normalizePermission, (value) => value);
205
+ }
206
+ export function normalizeApprovalPolicyExceptions(exceptions) {
207
+ return sortedUnique(exceptions, 'approvalEnvelope.policyExceptions', (value, index) => normalizePlainScope(value, index, 'policyExceptions'), (value) => value);
208
+ }
209
+ export function normalizeApprovalDestructiveScope(scope) {
210
+ return sortedUnique(scope, 'approvalEnvelope.destructiveScope', (value, index) => normalizePlainScope(value, index, 'destructiveScope'), (value) => value);
211
+ }
212
+ export function normalizeApprovalScope(scope) {
213
+ return {
214
+ phaseId: scope.phaseId,
215
+ gateKind: scope.gateKind,
216
+ identity: scope.identity,
217
+ baselineSha: digest(scope.baselineSha, 'approvalEnvelope.baselineSha'),
218
+ planDigest: digest(scope.planDigest, 'approvalEnvelope.planDigest'),
219
+ resources: normalizeApprovalResources(scope.resources),
220
+ destinations: normalizeApprovalDestinations(scope.destinations),
221
+ permissions: normalizeApprovalPermissions(scope.permissions),
222
+ costCeiling: normalizeApprovalCostCeiling(scope.costCeiling),
223
+ policyExceptions: normalizeApprovalPolicyExceptions(scope.policyExceptions),
224
+ destructiveScope: normalizeApprovalDestructiveScope(scope.destructiveScope)
225
+ };
226
+ }
227
+ /**
228
+ * Returns the hashable approval scope. Explicit approver, approval time, and
229
+ * envelope id are audit metadata and are intentionally excluded; changing them
230
+ * cannot force an implementation/API-shape retry to ask again.
231
+ */
232
+ export function canonicalApprovalEnvelopeScope(envelope) {
233
+ const normalized = normalizeApprovalScope(envelope);
234
+ return {
235
+ schemaVersion: envelope.schemaVersion,
236
+ phaseId: normalized.phaseId,
237
+ gateKind: normalized.gateKind,
238
+ identity: normalized.identity,
239
+ baselineSha: normalized.baselineSha,
240
+ planDigest: normalized.planDigest,
241
+ resources: normalized.resources,
242
+ destinations: normalized.destinations,
243
+ permissions: normalized.permissions,
244
+ costCeiling: normalized.costCeiling,
245
+ policyExceptions: normalized.policyExceptions,
246
+ destructiveScope: normalized.destructiveScope,
247
+ expiresAt: timestamp(envelope.expiresAt, 'approvalEnvelope.expiresAt')
248
+ };
249
+ }
250
+ export function canonicalApprovalEnvelopeHash(envelope) {
251
+ return canonicalSha256(canonicalApprovalEnvelopeScope(envelope));
252
+ }
253
+ export const approvalEnvelopeHash = canonicalApprovalEnvelopeHash;
254
+ export function questionKindForApprovalGate(gateKind) {
255
+ switch (gateKind) {
256
+ case 'none':
257
+ return null;
258
+ case 'repository-publish':
259
+ return 'repository-creation-initial-commit-push';
260
+ case 'activation-plan':
261
+ case 'infrastructure-cost':
262
+ return 'billed-infrastructure-policy-exception-cost-ceiling';
263
+ case 'credential-enrollment':
264
+ return 'credential-enrollment';
265
+ case 'enforcement':
266
+ return 'final-enforcement';
267
+ case 'destructive-disposal':
268
+ return 'destructive-operation';
269
+ case 'external-blocker':
270
+ return 'external-blocker';
271
+ }
272
+ }
273
+ export function determineHumanAuthorityQuestion(plan) {
274
+ const normalized = normalizeApprovalScope(plan);
275
+ const questionKind = questionKindForApprovalGate(normalized.gateKind);
276
+ if (normalized.gateKind === 'none') {
277
+ const authorityReasons = [
278
+ ...(normalized.costCeiling.fixedMonthlyCents > 0 ? ['fixed monthly cost'] : []),
279
+ ...(normalized.costCeiling.usageMonthlyCents > 0 ? ['usage monthly cost'] : []),
280
+ ...(normalized.policyExceptions.length > 0 ? ['policy exception'] : []),
281
+ ...(normalized.destructiveScope.length > 0 ? ['destructive scope'] : [])
282
+ ];
283
+ if (authorityReasons.length > 0) {
284
+ throw new Error(`Approval gate none cannot request ${authorityReasons.join(', ')} authority.`);
285
+ }
286
+ }
287
+ if (normalized.destructiveScope.length > 0 && normalized.gateKind !== 'destructive-disposal') {
288
+ throw new Error('Destructive scope requires the destructive-disposal approval gate.');
289
+ }
290
+ if ((normalized.costCeiling.fixedMonthlyCents > 0 ||
291
+ normalized.costCeiling.usageMonthlyCents > 0 ||
292
+ normalized.policyExceptions.length > 0) &&
293
+ normalized.gateKind !== 'activation-plan' &&
294
+ normalized.gateKind !== 'infrastructure-cost') {
295
+ throw new Error('Cost ceilings and policy exceptions require an activation-plan or infrastructure-cost approval gate.');
296
+ }
297
+ return questionKind;
298
+ }
299
+ function containsAll(approved, requested, keyFor) {
300
+ const approvedKeys = new Set(approved.map((value) => keyFor(value)));
301
+ return requested.map((value) => keyFor(value)).filter((key) => !approvedKeys.has(key));
302
+ }
303
+ function expansionReasons(approved, requested) {
304
+ const reasons = [];
305
+ const resourceMisses = containsAll(approved.resources, requested.resources, resourceKey);
306
+ reasons.push(...resourceMisses.map((key) => `resource scope expanded: ${key.trim()}`));
307
+ const destinationMisses = containsAll(approved.destinations, requested.destinations, destinationKey);
308
+ reasons.push(...destinationMisses.map((key) => `destination scope expanded: ${key.trim()}`));
309
+ const permissionMisses = containsAll(approved.permissions, requested.permissions, (value) => value);
310
+ reasons.push(...permissionMisses.map((permission) => `permission scope expanded: ${permission}`));
311
+ if (approved.costCeiling.currency !== requested.costCeiling.currency) {
312
+ reasons.push(`cost currency changed from ${approved.costCeiling.currency} to ${requested.costCeiling.currency}`);
313
+ }
314
+ else {
315
+ if (requested.costCeiling.fixedMonthlyCents > approved.costCeiling.fixedMonthlyCents) {
316
+ reasons.push(`fixed monthly cost ceiling increased from ${approved.costCeiling.fixedMonthlyCents} to ${requested.costCeiling.fixedMonthlyCents} ${approved.costCeiling.currency} cents`);
317
+ }
318
+ if (requested.costCeiling.usageMonthlyCents > approved.costCeiling.usageMonthlyCents) {
319
+ reasons.push(`usage monthly cost ceiling increased from ${approved.costCeiling.usageMonthlyCents} to ${requested.costCeiling.usageMonthlyCents} ${approved.costCeiling.currency} cents`);
320
+ }
321
+ }
322
+ const exceptionMisses = containsAll(approved.policyExceptions, requested.policyExceptions, (value) => value);
323
+ reasons.push(...exceptionMisses.map((exception) => `policy exception added: ${exception}`));
324
+ const destructiveMisses = containsAll(approved.destructiveScope, requested.destructiveScope, (value) => value);
325
+ reasons.push(...destructiveMisses.map((scope) => `destructive scope expanded: ${scope}`));
326
+ return reasons;
327
+ }
328
+ function invalidationReasons(approved, requested) {
329
+ const reasons = [];
330
+ if (!sameIdentity(approved.identity, requested.identity)) {
331
+ reasons.push('activation identity changed');
332
+ }
333
+ if (approved.phaseId !== requested.phaseId) {
334
+ reasons.push(`phase changed from ${approved.phaseId} to ${requested.phaseId}`);
335
+ }
336
+ if (approved.gateKind !== requested.gateKind) {
337
+ reasons.push(`approval gate changed from ${approved.gateKind} to ${requested.gateKind}`);
338
+ }
339
+ if (approved.baselineSha !== requested.baselineSha) {
340
+ reasons.push('baseline SHA changed');
341
+ }
342
+ if (approved.planDigest !== requested.planDigest) {
343
+ reasons.push('plan authority digest changed');
344
+ }
345
+ return reasons;
346
+ }
347
+ function noApprovalRequired(plan) {
348
+ return {
349
+ phaseId: plan.phaseId,
350
+ gateKind: plan.gateKind,
351
+ questionKind: null,
352
+ approvalRequired: false,
353
+ status: 'not-required',
354
+ envelopeId: null,
355
+ envelopeHash: null,
356
+ reasons: ['approval gate is none'],
357
+ expansionReasons: []
358
+ };
359
+ }
360
+ export function evaluateApprovalForTransitionPlan(plan, envelopes, options = {}) {
361
+ const requested = normalizeApprovalScope(plan);
362
+ const questionKind = determineHumanAuthorityQuestion(requested);
363
+ if (questionKind === null) {
364
+ return noApprovalRequired(requested);
365
+ }
366
+ const now = options.now ?? new Date();
367
+ const candidates = envelopes.filter((envelope) => envelope.phaseId === requested.phaseId || envelope.gateKind === requested.gateKind);
368
+ if (candidates.length === 0) {
369
+ return {
370
+ phaseId: requested.phaseId,
371
+ gateKind: requested.gateKind,
372
+ questionKind,
373
+ approvalRequired: true,
374
+ status: 'approval-required',
375
+ envelopeId: null,
376
+ envelopeHash: null,
377
+ reasons: [`no approval envelope exists for ${requested.phaseId} (${requested.gateKind})`],
378
+ expansionReasons: []
379
+ };
380
+ }
381
+ let best = null;
382
+ for (const envelope of candidates) {
383
+ const approved = normalizeApprovalScope(envelope);
384
+ const hash = canonicalApprovalEnvelopeHash(envelope);
385
+ const reasons = invalidationReasons(approved, requested);
386
+ const expansions = expansionReasons(approved, requested);
387
+ if (Date.parse(envelope.expiresAt) <= now.getTime()) {
388
+ const expired = {
389
+ phaseId: requested.phaseId,
390
+ gateKind: requested.gateKind,
391
+ questionKind,
392
+ approvalRequired: true,
393
+ status: 'expired',
394
+ envelopeId: envelope.id,
395
+ envelopeHash: hash,
396
+ reasons: [`approval envelope ${envelope.id} expired at ${envelope.expiresAt}`],
397
+ expansionReasons: []
398
+ };
399
+ best ??= expired;
400
+ continue;
401
+ }
402
+ if (reasons.length === 0 && expansions.length === 0) {
403
+ return {
404
+ phaseId: requested.phaseId,
405
+ gateKind: requested.gateKind,
406
+ questionKind,
407
+ approvalRequired: false,
408
+ status: 'reused',
409
+ envelopeId: envelope.id,
410
+ envelopeHash: hash,
411
+ reasons: [`approval envelope ${envelope.id} covers the requested transition scope`],
412
+ expansionReasons: []
413
+ };
414
+ }
415
+ const invalidated = {
416
+ phaseId: requested.phaseId,
417
+ gateKind: requested.gateKind,
418
+ questionKind,
419
+ approvalRequired: true,
420
+ status: expansions.length > 0 ? 'approval-required' : 'invalidated',
421
+ envelopeId: envelope.id,
422
+ envelopeHash: hash,
423
+ reasons: [...reasons, ...expansions],
424
+ expansionReasons: expansions
425
+ };
426
+ if (best === null ||
427
+ (best.status === 'expired' && invalidated.status !== 'expired') ||
428
+ invalidated.reasons.length < best.reasons.length) {
429
+ best = invalidated;
430
+ }
431
+ }
432
+ return best ?? {
433
+ phaseId: requested.phaseId,
434
+ gateKind: requested.gateKind,
435
+ questionKind,
436
+ approvalRequired: true,
437
+ status: 'approval-required',
438
+ envelopeId: null,
439
+ envelopeHash: null,
440
+ reasons: ['approval is required'],
441
+ expansionReasons: []
442
+ };
443
+ }
444
+ function destinationsForPhase(phase, state) {
445
+ const destinations = new Map();
446
+ for (const mutation of [...phase.allowedMutations.local, ...phase.allowedMutations.remote]) {
447
+ if (mutation === 'none' || mutation === 'read-worktree') {
448
+ continue;
449
+ }
450
+ if (mutation.startsWith('git-') || mutation.startsWith('github-')) {
451
+ destinations.set('repository', {
452
+ type: 'repository',
453
+ identity: state.repository.name,
454
+ repository: state.repository.name,
455
+ subscriptionId: null
456
+ });
457
+ }
458
+ else if (mutation.startsWith('azure-')) {
459
+ destinations.set('subscription', {
460
+ type: 'subscription',
461
+ identity: 'phase-0-discovered-subscription',
462
+ repository: null,
463
+ subscriptionId: 'phase-0-discovered-subscription'
464
+ });
465
+ }
466
+ else {
467
+ destinations.set('local', {
468
+ type: 'local',
469
+ identity: state.repository.id,
470
+ repository: null,
471
+ subscriptionId: null
472
+ });
473
+ }
474
+ }
475
+ return [...destinations.values()];
476
+ }
477
+ export function transitionPlanForPhase(phase, state, transition, _projectRoot) {
478
+ const mutations = [...phase.allowedMutations.local, ...phase.allowedMutations.remote]
479
+ .filter((mutation) => mutation !== 'none');
480
+ return normalizeApprovalScope({
481
+ phaseId: phase.id,
482
+ gateKind: phase.approvalGate.kind,
483
+ identity: state.identity,
484
+ baselineSha: transition.baselineSha,
485
+ planDigest: canonicalSha256({
486
+ phaseId: phase.id,
487
+ gateKind: phase.approvalGate.kind,
488
+ transitionDigest: transition.transitionDigest,
489
+ allowedMutations: phase.allowedMutations
490
+ }),
491
+ resources: mutations.map((mutation) => ({
492
+ type: mutation,
493
+ identity: `${phase.id}:${mutation}`
494
+ })),
495
+ destinations: destinationsForPhase(phase, state),
496
+ permissions: mutations,
497
+ costCeiling: {
498
+ currency: 'USD',
499
+ fixedMonthlyCents: 0,
500
+ usageMonthlyCents: 0
501
+ },
502
+ policyExceptions: [],
503
+ destructiveScope: phase.approvalGate.kind === 'destructive-disposal'
504
+ ? [`${phase.id}:declared-disposal-scope`]
505
+ : []
506
+ });
507
+ }
508
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../../src/governance-activation/approvals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function canonicalJson(value: unknown): string;
2
+ export declare function sha256Hex(value: string): string;
3
+ export declare function canonicalSha256(value: unknown): string;
@@ -0,0 +1,36 @@
1
+ import { createHash } from 'node:crypto';
2
+ function canonicalValue(value) {
3
+ if (value === null || typeof value === 'string' || typeof value === 'boolean') {
4
+ return value;
5
+ }
6
+ if (typeof value === 'number') {
7
+ if (!Number.isFinite(value)) {
8
+ throw new Error('Canonical JSON cannot encode non-finite numbers.');
9
+ }
10
+ return value;
11
+ }
12
+ if (Array.isArray(value)) {
13
+ return value.map((entry) => canonicalValue(entry));
14
+ }
15
+ if (typeof value === 'object') {
16
+ const record = value;
17
+ return Object.fromEntries(Object.keys(record).sort().map((key) => {
18
+ const entry = record[key];
19
+ if (entry === undefined) {
20
+ throw new Error(`Canonical JSON cannot encode undefined field ${key}.`);
21
+ }
22
+ return [key, canonicalValue(entry)];
23
+ }));
24
+ }
25
+ throw new Error(`Canonical JSON cannot encode ${typeof value}.`);
26
+ }
27
+ export function canonicalJson(value) {
28
+ return `${JSON.stringify(canonicalValue(value))}\n`;
29
+ }
30
+ export function sha256Hex(value) {
31
+ return createHash('sha256').update(value).digest('hex');
32
+ }
33
+ export function canonicalSha256(value) {
34
+ return sha256Hex(canonicalJson(value));
35
+ }
36
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../src/governance-activation/canonical-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,GAAG,GAAG,CAAC,CAAC;YAC1E,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,OAAO,KAAK,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { PresentationSession } from '../terminal.js';
2
+ import type { ParsedArgs } from '../types.js';
3
+ import type { CommandRunner } from '../process-runner.js';
4
+ interface GovernanceCommandContext {
5
+ cwd: string;
6
+ presentation: PresentationSession;
7
+ runner?: CommandRunner;
8
+ }
9
+ export declare function governanceCommand(parsed: ParsedArgs, context: GovernanceCommandContext): Promise<number>;
10
+ export {};