musubix3 0.1.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 (97) hide show
  1. package/.github/plugin/marketplace.json +16 -0
  2. package/.github/skills/sdd-change/SKILL.md +78 -0
  3. package/.github/skills/sdd-design/SKILL.md +26 -0
  4. package/.github/skills/sdd-formal-codegraph/SKILL.md +53 -0
  5. package/.github/skills/sdd-implementation/SKILL.md +54 -0
  6. package/.github/skills/sdd-knowledge/SKILL.md +24 -0
  7. package/.github/skills/sdd-quality/SKILL.md +69 -0
  8. package/.github/skills/sdd-requirements/SKILL.md +42 -0
  9. package/.github/skills/sdd-traceability/SKILL.md +28 -0
  10. package/CHANGELOG.md +152 -0
  11. package/LICENSE +21 -0
  12. package/README-ja.md +573 -0
  13. package/README.md +639 -0
  14. package/assets/ADR-0001.md +15 -0
  15. package/assets/constitution.md +17 -0
  16. package/assets/design.md +13 -0
  17. package/assets/requirements.md +15 -0
  18. package/dist/packages/analysis/src/adapters.d.ts +12 -0
  19. package/dist/packages/analysis/src/adapters.js +167 -0
  20. package/dist/packages/analysis/src/adapters.js.map +1 -0
  21. package/dist/packages/analysis/src/attestation.d.ts +50 -0
  22. package/dist/packages/analysis/src/attestation.js +474 -0
  23. package/dist/packages/analysis/src/attestation.js.map +1 -0
  24. package/dist/packages/analysis/src/change.d.ts +53 -0
  25. package/dist/packages/analysis/src/change.js +337 -0
  26. package/dist/packages/analysis/src/change.js.map +1 -0
  27. package/dist/packages/analysis/src/config.d.ts +104 -0
  28. package/dist/packages/analysis/src/config.js +456 -0
  29. package/dist/packages/analysis/src/config.js.map +1 -0
  30. package/dist/packages/analysis/src/files.d.ts +13 -0
  31. package/dist/packages/analysis/src/files.js +103 -0
  32. package/dist/packages/analysis/src/files.js.map +1 -0
  33. package/dist/packages/analysis/src/formal.d.ts +82 -0
  34. package/dist/packages/analysis/src/formal.js +579 -0
  35. package/dist/packages/analysis/src/formal.js.map +1 -0
  36. package/dist/packages/analysis/src/gate.d.ts +56 -0
  37. package/dist/packages/analysis/src/gate.js +484 -0
  38. package/dist/packages/analysis/src/gate.js.map +1 -0
  39. package/dist/packages/analysis/src/graph.d.ts +52 -0
  40. package/dist/packages/analysis/src/graph.js +737 -0
  41. package/dist/packages/analysis/src/graph.js.map +1 -0
  42. package/dist/packages/analysis/src/index.d.ts +17 -0
  43. package/dist/packages/analysis/src/index.js +18 -0
  44. package/dist/packages/analysis/src/index.js.map +1 -0
  45. package/dist/packages/analysis/src/knowledge.d.ts +29 -0
  46. package/dist/packages/analysis/src/knowledge.js +95 -0
  47. package/dist/packages/analysis/src/knowledge.js.map +1 -0
  48. package/dist/packages/analysis/src/model-correspondence.d.ts +45 -0
  49. package/dist/packages/analysis/src/model-correspondence.js +310 -0
  50. package/dist/packages/analysis/src/model-correspondence.js.map +1 -0
  51. package/dist/packages/analysis/src/mutation.d.ts +54 -0
  52. package/dist/packages/analysis/src/mutation.js +299 -0
  53. package/dist/packages/analysis/src/mutation.js.map +1 -0
  54. package/dist/packages/analysis/src/order.d.ts +23 -0
  55. package/dist/packages/analysis/src/order.js +89 -0
  56. package/dist/packages/analysis/src/order.js.map +1 -0
  57. package/dist/packages/analysis/src/performance.d.ts +65 -0
  58. package/dist/packages/analysis/src/performance.js +319 -0
  59. package/dist/packages/analysis/src/performance.js.map +1 -0
  60. package/dist/packages/analysis/src/process.d.ts +14 -0
  61. package/dist/packages/analysis/src/process.js +79 -0
  62. package/dist/packages/analysis/src/process.js.map +1 -0
  63. package/dist/packages/analysis/src/tdd.d.ts +65 -0
  64. package/dist/packages/analysis/src/tdd.js +353 -0
  65. package/dist/packages/analysis/src/tdd.js.map +1 -0
  66. package/dist/packages/analysis/src/trace.d.ts +45 -0
  67. package/dist/packages/analysis/src/trace.js +242 -0
  68. package/dist/packages/analysis/src/trace.js.map +1 -0
  69. package/dist/packages/analysis/src/workflow.d.ts +59 -0
  70. package/dist/packages/analysis/src/workflow.js +405 -0
  71. package/dist/packages/analysis/src/workflow.js.map +1 -0
  72. package/dist/packages/cli/src/install.d.ts +15 -0
  73. package/dist/packages/cli/src/install.js +71 -0
  74. package/dist/packages/cli/src/install.js.map +1 -0
  75. package/dist/packages/cli/src/main.d.ts +3 -0
  76. package/dist/packages/cli/src/main.js +364 -0
  77. package/dist/packages/cli/src/main.js.map +1 -0
  78. package/dist/packages/domain/src/constitution.d.ts +3 -0
  79. package/dist/packages/domain/src/constitution.js +46 -0
  80. package/dist/packages/domain/src/constitution.js.map +1 -0
  81. package/dist/packages/domain/src/design.d.ts +8 -0
  82. package/dist/packages/domain/src/design.js +59 -0
  83. package/dist/packages/domain/src/design.js.map +1 -0
  84. package/dist/packages/domain/src/index.d.ts +5 -0
  85. package/dist/packages/domain/src/index.js +6 -0
  86. package/dist/packages/domain/src/index.js.map +1 -0
  87. package/dist/packages/domain/src/markdown.d.ts +16 -0
  88. package/dist/packages/domain/src/markdown.js +72 -0
  89. package/dist/packages/domain/src/markdown.js.map +1 -0
  90. package/dist/packages/domain/src/requirements.d.ts +3 -0
  91. package/dist/packages/domain/src/requirements.js +195 -0
  92. package/dist/packages/domain/src/requirements.js.map +1 -0
  93. package/dist/packages/domain/src/types.d.ts +100 -0
  94. package/dist/packages/domain/src/types.js +14 -0
  95. package/dist/packages/domain/src/types.js.map +1 -0
  96. package/package.json +59 -0
  97. package/plugin.json +9 -0
@@ -0,0 +1,474 @@
1
+ import { createHash, createPublicKey, verify } from 'node:crypto';
2
+ import { error } from '../../domain/src/index.js';
3
+ import { digest, exists, files, readText, snapshot, within } from './files.js';
4
+ import { performanceEvidenceHead, validatePerformanceEvidence } from './performance.js';
5
+ import { mutationEvidenceHead, validateMutationEvidence } from './mutation.js';
6
+ import { modelCorrespondenceEvidenceHead, validateModelCorrespondenceEvidence } from './model-correspondence.js';
7
+ import { loadEvidenceOrder } from './order.js';
8
+ import { runProcess } from './process.js';
9
+ import { workflowEvidenceHead } from './workflow.js';
10
+ function canonical(value) {
11
+ if (Array.isArray(value))
12
+ return `[${value.map(canonical).join(',')}]`;
13
+ if (value && typeof value === 'object') {
14
+ return `{${Object.entries(value)
15
+ .sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)
16
+ .map(([key, nested]) => `${JSON.stringify(key)}:${canonical(nested)}`).join(',')}}`;
17
+ }
18
+ return JSON.stringify(value);
19
+ }
20
+ function repositoryName(remote) {
21
+ return remote.trim().replace(/^git@github\.com:/, '').replace(/^https?:\/\/github\.com\//, '').replace(/\.git$/, '');
22
+ }
23
+ export async function collectEvidenceHeads(root) {
24
+ const heads = {};
25
+ const load = async (path) => await exists(within(root, path)) ? JSON.parse(await readText(root, path)) : null;
26
+ const tdd = await load('.musubix/evidence/tdd.json');
27
+ const chain = Array.isArray(tdd?.chain) ? tdd.chain : [];
28
+ if (typeof chain.at(-1)?.recordSha256 === 'string')
29
+ heads.tdd = chain.at(-1).recordSha256;
30
+ const workflow = await load('.musubix/evidence/workflow.json');
31
+ const workflowHead = workflowEvidenceHead(workflow);
32
+ if (workflowHead)
33
+ heads.workflow = workflowHead;
34
+ const changes = await load('.musubix/evidence/changes.json');
35
+ if (Array.isArray(changes?.changes))
36
+ heads.changes = digest(canonical(changes.changes));
37
+ const order = await loadEvidenceOrder(root);
38
+ if (order?.records.length)
39
+ heads.order = order.records.at(-1).recordSha256;
40
+ const formal = await load('.musubix/evidence/formal.json');
41
+ if (formal) {
42
+ const result = formal.result;
43
+ const solver = result?.solver;
44
+ heads.formal = digest(canonical({
45
+ fingerprints: formal.fingerprints ?? {},
46
+ totalRequirements: formal.totalRequirements,
47
+ modeledRequirements: formal.modeledRequirements,
48
+ modeledFraction: formal.modeledFraction,
49
+ artifact: solver?.artifact ?? null,
50
+ solverStatus: solver?.status,
51
+ consistency: result?.consistency,
52
+ }));
53
+ }
54
+ const performance = await load('.musubix/evidence/performance.json');
55
+ if (performance)
56
+ heads.performance = performanceEvidenceHead(performance);
57
+ const mutation = await load('.musubix/evidence/mutation.json');
58
+ if (mutation)
59
+ heads.mutation = mutationEvidenceHead(mutation);
60
+ const correspondence = await load('.musubix/evidence/model-correspondence.json');
61
+ if (correspondence)
62
+ heads.modelCorrespondence = modelCorrespondenceEvidenceHead(correspondence);
63
+ const quality = await load('.musubix/evidence/quality.json');
64
+ if (quality) {
65
+ const checks = Array.isArray(quality.checks)
66
+ ? quality.checks.filter((check) => check.name !== 'attestation')
67
+ : [];
68
+ const metrics = quality.metrics && typeof quality.metrics === 'object' && !Array.isArray(quality.metrics)
69
+ ? Object.fromEntries(Object.entries(quality.metrics)
70
+ .filter(([name]) => name !== 'attestation.errors'))
71
+ : {};
72
+ heads.quality = digest(canonical({
73
+ schemaVersion: quality.schemaVersion,
74
+ mode: quality.mode,
75
+ status: checks.every((check) => check.required !== true || check.status === 'pass') ? 'pass' : 'fail',
76
+ checks: checks.map((check) => ({
77
+ name: check.name,
78
+ required: check.required,
79
+ status: check.status,
80
+ diagnostics: Array.isArray(check.diagnostics)
81
+ ? check.diagnostics.map((diagnostic) => ({
82
+ code: diagnostic.code,
83
+ severity: diagnostic.severity,
84
+ path: diagnostic.path ?? null,
85
+ line: diagnostic.line ?? null,
86
+ }))
87
+ : [],
88
+ })),
89
+ metrics,
90
+ }));
91
+ }
92
+ const workspace = await snapshot(root, (await files(root)).filter((path) => !/^\.musubix\/features\/[^/]+\/trace\.json$/.test(path)
93
+ && !path.endsWith('.tgz')
94
+ && !/^\.github\/skills\//.test(path)
95
+ && !/(?:^|\/)(?:logs?|session-logs)\//.test(path)
96
+ && !/\.jsonl$/.test(path)));
97
+ heads.workspace = digest(canonical(workspace));
98
+ return Object.fromEntries(Object.entries(heads).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0));
99
+ }
100
+ async function gitIdentity(root, runner) {
101
+ const [remote, revision] = await Promise.all([
102
+ runner('git', ['config', '--get', 'remote.origin.url'], { cwd: root, timeoutMs: 10_000 }),
103
+ runner('git', ['rev-parse', 'HEAD'], { cwd: root, timeoutMs: 10_000 }),
104
+ ]);
105
+ if (remote.status !== 'completed' || remote.exitCode !== 0 || !remote.stdout.trim())
106
+ throw new Error('Repository remote.origin.url is unavailable.');
107
+ if (revision.status !== 'completed' || revision.exitCode !== 0 || !/^[a-f0-9]{40,64}$/i.test(revision.stdout.trim())) {
108
+ throw new Error('A committed Git HEAD is required for CI attestation.');
109
+ }
110
+ return { repository: repositoryName(remote.stdout), commitSha: revision.stdout.trim().toLowerCase() };
111
+ }
112
+ export async function createUnsignedAttestation(root, input, runner = runProcess) {
113
+ if (!input.runId.trim() || !/^[A-Za-z0-9._:-]+$/.test(input.keyId))
114
+ throw new Error('Attestation runId and keyId are required.');
115
+ const identity = await gitIdentity(root, runner);
116
+ return {
117
+ schemaVersion: 1,
118
+ ...identity,
119
+ ci: { provider: input.provider, runId: input.runId },
120
+ evidenceHeads: await collectEvidenceHeads(root),
121
+ issuedAt: input.issuedAt ?? new Date().toISOString(),
122
+ keyId: input.keyId,
123
+ ...(input.githubOidc ? { githubOidc: input.githubOidc } : {}),
124
+ };
125
+ }
126
+ function currentCi(environment) {
127
+ if (environment.GITHUB_ACTIONS === 'true' && environment.GITHUB_RUN_ID) {
128
+ return {
129
+ provider: 'github',
130
+ runId: environment.GITHUB_RUN_ID,
131
+ ...(environment.GITHUB_REPOSITORY ? { repository: environment.GITHUB_REPOSITORY } : {}),
132
+ ...(environment.GITHUB_SHA ? { commitSha: environment.GITHUB_SHA.toLowerCase() } : {}),
133
+ };
134
+ }
135
+ if (environment.TF_BUILD === 'True' && environment.BUILD_BUILDID) {
136
+ return {
137
+ provider: 'azure-pipelines',
138
+ runId: environment.BUILD_BUILDID,
139
+ ...(environment.BUILD_REPOSITORY_NAME ? { repository: environment.BUILD_REPOSITORY_NAME } : {}),
140
+ ...(environment.BUILD_SOURCEVERSION ? { commitSha: environment.BUILD_SOURCEVERSION.toLowerCase() } : {}),
141
+ };
142
+ }
143
+ if (environment.CI_PROVIDER && environment.CI_RUN_ID)
144
+ return { provider: 'generic', runId: environment.CI_RUN_ID };
145
+ return null;
146
+ }
147
+ function ed25519PublicKey(value) {
148
+ if (/BEGIN [A-Z ]*PRIVATE KEY/.test(value))
149
+ throw new Error('Private keys are not accepted.');
150
+ const key = createPublicKey(value);
151
+ if (key.asymmetricKeyType !== 'ed25519')
152
+ throw new Error('Signing key is not Ed25519.');
153
+ return key;
154
+ }
155
+ export function githubOidcAudience(audience, keyBinding, keyId, publicKey) {
156
+ if (!audience || audience.includes('#'))
157
+ throw new Error('OIDC audience base must be nonempty and must not contain #.');
158
+ if (!/^[A-Za-z0-9._:-]+$/.test(keyId))
159
+ throw new Error('OIDC keyId is invalid.');
160
+ if (keyBinding === 'key-id')
161
+ return `${audience}#musubix3-key-id=${encodeURIComponent(keyId)}`;
162
+ if (!publicKey)
163
+ throw new Error('OIDC public-key binding requires an Ed25519 public key.');
164
+ const key = ed25519PublicKey(publicKey);
165
+ const der = key.export({ type: 'spki', format: 'der' });
166
+ return `${audience}#musubix3-key-sha256=${createHash('sha256').update(der).digest('base64url')}`;
167
+ }
168
+ function jwtPart(value) {
169
+ const decoded = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));
170
+ if (!decoded || typeof decoded !== 'object' || Array.isArray(decoded))
171
+ throw new Error('JWT component is not an object.');
172
+ return decoded;
173
+ }
174
+ function claimString(claims, name) {
175
+ const value = claims[name];
176
+ return typeof value === 'string' && value ? value : null;
177
+ }
178
+ function claimNumber(claims, name) {
179
+ const value = claims[name];
180
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
181
+ }
182
+ async function verifyGithubOidc(attestation, config, options, path) {
183
+ const diagnostics = [];
184
+ const oidc = config.githubOidc;
185
+ if (oidc?.mode !== 'strict')
186
+ return diagnostics;
187
+ if (attestation.ci.provider !== 'github') {
188
+ return [error('ATTESTATION_OIDC_PROVIDER', 'Strict GitHub OIDC requires ci.provider github.', path)];
189
+ }
190
+ if (!attestation.githubOidc?.token) {
191
+ return [error('ATTESTATION_OIDC_MISSING', 'Strict GitHub OIDC requires a signed OIDC token in the attestation.', path)];
192
+ }
193
+ const issuer = oidc.issuer ?? 'https://token.actions.githubusercontent.com';
194
+ const token = attestation.githubOidc.token;
195
+ if (token.length > 64_000)
196
+ return [error('ATTESTATION_OIDC_TOKEN', 'GitHub OIDC token is too large.', path)];
197
+ let header;
198
+ let claims;
199
+ let signingInput;
200
+ let signature;
201
+ try {
202
+ const parts = token.split('.');
203
+ if (parts.length !== 3 || parts.some((part) => !part))
204
+ throw new Error('JWT must have three compact parts.');
205
+ header = jwtPart(parts[0]);
206
+ claims = jwtPart(parts[1]);
207
+ signingInput = `${parts[0]}.${parts[1]}`;
208
+ signature = Buffer.from(parts[2], 'base64url');
209
+ }
210
+ catch (cause) {
211
+ return [error('ATTESTATION_OIDC_TOKEN', `GitHub OIDC token is malformed: ${cause instanceof Error ? cause.message : String(cause)}`, path)];
212
+ }
213
+ if (header.alg !== 'RS256' || typeof header.kid !== 'string' || !header.kid) {
214
+ diagnostics.push(error('ATTESTATION_OIDC_ALGORITHM', 'GitHub OIDC token must use RS256 and identify a signing key.', path));
215
+ }
216
+ let jwks = null;
217
+ if (!diagnostics.length) {
218
+ try {
219
+ const fetcher = options.fetch ?? globalThis.fetch;
220
+ if (!fetcher)
221
+ throw new Error('fetch is unavailable');
222
+ const metadataUrl = `${issuer}/.well-known/openid-configuration`;
223
+ const metadataResponse = await fetcher(metadataUrl, {
224
+ headers: { accept: 'application/json' },
225
+ signal: AbortSignal.timeout(10_000),
226
+ });
227
+ if (!metadataResponse.ok)
228
+ throw new Error(`issuer metadata returned HTTP ${metadataResponse.status}`);
229
+ const metadata = await metadataResponse.json();
230
+ if (metadata.issuer !== issuer || typeof metadata.jwks_uri !== 'string') {
231
+ throw new Error('issuer metadata does not match the configured GitHub issuer');
232
+ }
233
+ const jwksUrl = new URL(metadata.jwks_uri);
234
+ if (jwksUrl.protocol !== 'https:' || jwksUrl.origin !== new URL(issuer).origin) {
235
+ throw new Error('issuer metadata returned an untrusted JWKS URI');
236
+ }
237
+ const jwksResponse = await fetcher(jwksUrl.toString(), {
238
+ headers: { accept: 'application/json' },
239
+ signal: AbortSignal.timeout(10_000),
240
+ });
241
+ if (!jwksResponse.ok)
242
+ throw new Error(`JWKS returned HTTP ${jwksResponse.status}`);
243
+ jwks = await jwksResponse.json();
244
+ }
245
+ catch (cause) {
246
+ diagnostics.push(error('ATTESTATION_OIDC_FETCH', `Unable to retrieve GitHub OIDC verification keys: ${cause instanceof Error ? cause.message : String(cause)}.`, path));
247
+ }
248
+ }
249
+ if (jwks) {
250
+ const keys = Array.isArray(jwks.keys) ? jwks.keys : [];
251
+ const jwk = keys.find((candidate) => {
252
+ if (!candidate || typeof candidate !== 'object' || Array.isArray(candidate))
253
+ return false;
254
+ const value = candidate;
255
+ return value.kid === header.kid && value.kty === 'RSA'
256
+ && (value.alg === undefined || value.alg === 'RS256')
257
+ && (value.use === undefined || value.use === 'sig');
258
+ });
259
+ if (!jwk)
260
+ diagnostics.push(error('ATTESTATION_OIDC_KEY', 'GitHub OIDC signing key was not found in the issuer JWKS.', path));
261
+ else {
262
+ try {
263
+ const jwtKey = createPublicKey({ key: jwk, format: 'jwk' });
264
+ if (jwtKey.asymmetricKeyType !== 'rsa'
265
+ || !verify('RSA-SHA256', Buffer.from(signingInput), jwtKey, signature)) {
266
+ diagnostics.push(error('ATTESTATION_OIDC_SIGNATURE', 'GitHub OIDC JWT signature verification failed.', path));
267
+ }
268
+ }
269
+ catch {
270
+ diagnostics.push(error('ATTESTATION_OIDC_SIGNATURE', 'GitHub OIDC JWT signature is malformed or unverifiable.', path));
271
+ }
272
+ }
273
+ }
274
+ if (claimString(claims, 'iss') !== issuer) {
275
+ diagnostics.push(error('ATTESTATION_OIDC_ISSUER', 'GitHub OIDC issuer claim does not match the configured issuer.', path));
276
+ }
277
+ try {
278
+ const expectedAudience = githubOidcAudience(oidc.audience, oidc.keyBinding ?? 'public-key', attestation.keyId, oidc.keyBinding === 'key-id' ? undefined : attestation.githubOidc.publicKey);
279
+ const audience = claims.aud;
280
+ if (!(audience === expectedAudience
281
+ || Array.isArray(audience) && audience.every((entry) => typeof entry === 'string') && audience.includes(expectedAudience))) {
282
+ diagnostics.push(error('ATTESTATION_OIDC_AUDIENCE', 'GitHub OIDC audience does not authorize this attestation signing key.', path));
283
+ }
284
+ }
285
+ catch (cause) {
286
+ diagnostics.push(error('ATTESTATION_OIDC_KEY_BINDING', cause instanceof Error ? cause.message : String(cause), path));
287
+ }
288
+ const now = (options.now ?? (() => new Date()))().getTime() / 1000;
289
+ const skew = config.maxFutureSkewSeconds ?? 60;
290
+ const exp = claimNumber(claims, 'exp');
291
+ const nbf = claimNumber(claims, 'nbf');
292
+ const iat = claimNumber(claims, 'iat');
293
+ if (exp === null || nbf === null || iat === null) {
294
+ diagnostics.push(error('ATTESTATION_OIDC_TIME', 'GitHub OIDC token must contain numeric exp, nbf, and iat claims.', path));
295
+ }
296
+ else {
297
+ if (now > exp + skew)
298
+ diagnostics.push(error('ATTESTATION_OIDC_EXPIRED', 'GitHub OIDC token has expired.', path));
299
+ if (nbf > now + skew)
300
+ diagnostics.push(error('ATTESTATION_OIDC_NOT_BEFORE', 'GitHub OIDC token is not yet valid.', path));
301
+ if (iat > now + skew)
302
+ diagnostics.push(error('ATTESTATION_OIDC_ISSUED_AT', 'GitHub OIDC token iat is in the future.', path));
303
+ if (nbf > exp || iat > exp)
304
+ diagnostics.push(error('ATTESTATION_OIDC_TIME', 'GitHub OIDC token time claims are inconsistent.', path));
305
+ const attestationTime = Date.parse(attestation.issuedAt) / 1000;
306
+ if (attestationTime < iat - skew || attestationTime > exp + skew) {
307
+ diagnostics.push(error('ATTESTATION_OIDC_ATTESTATION_TIME', 'Attestation was not issued during the OIDC token authorization window.', path));
308
+ }
309
+ }
310
+ const expectedRepository = oidc.repository ?? config.repository ?? attestation.repository;
311
+ if (claimString(claims, 'repository') !== expectedRepository) {
312
+ diagnostics.push(error('ATTESTATION_OIDC_REPOSITORY', 'GitHub OIDC repository claim does not match the attested repository.', path));
313
+ }
314
+ if (claimString(claims, 'sha')?.toLowerCase() !== attestation.commitSha.toLowerCase()) {
315
+ diagnostics.push(error('ATTESTATION_OIDC_COMMIT', 'GitHub OIDC sha claim does not match the attested commit.', path));
316
+ }
317
+ const runId = claims.run_id;
318
+ if ((typeof runId !== 'string' && typeof runId !== 'number') || String(runId) !== attestation.ci.runId) {
319
+ diagnostics.push(error('ATTESTATION_OIDC_RUN', 'GitHub OIDC run_id claim does not match the attested CI run.', path));
320
+ }
321
+ if (oidc.workflow && claimString(claims, 'workflow') !== oidc.workflow) {
322
+ diagnostics.push(error('ATTESTATION_OIDC_WORKFLOW', 'GitHub OIDC workflow claim does not match the configured workflow.', path));
323
+ }
324
+ if (oidc.ref && claimString(claims, 'ref') !== oidc.ref) {
325
+ diagnostics.push(error('ATTESTATION_OIDC_REF', 'GitHub OIDC ref claim does not match the configured ref.', path));
326
+ }
327
+ return diagnostics;
328
+ }
329
+ export async function verifyEvidenceAttestation(root, config, runner = runProcess, environment = process.env, options = {}) {
330
+ if (config.mode === 'off')
331
+ return { present: false, valid: true, status: 'off', trust: 'none', diagnostics: [] };
332
+ const path = '.musubix/evidence/attestation.json';
333
+ if (!await exists(within(root, path))) {
334
+ const diagnostics = config.mode === 'ci-required'
335
+ ? [error('ATTESTATION_MISSING', 'CI attestation is required but no signed attestation is present.', path)]
336
+ : [];
337
+ return {
338
+ present: false,
339
+ valid: config.mode !== 'ci-required',
340
+ status: config.mode === 'ci-required' ? 'missing' : 'unsigned-local',
341
+ trust: 'none',
342
+ diagnostics,
343
+ };
344
+ }
345
+ const diagnostics = [];
346
+ let attestation;
347
+ try {
348
+ attestation = JSON.parse(await readText(root, path));
349
+ if (attestation.schemaVersion !== 1
350
+ || Object.keys(attestation).some((key) => !['schemaVersion', 'repository', 'commitSha', 'ci', 'evidenceHeads', 'issuedAt', 'keyId', 'githubOidc', 'signature'].includes(key))
351
+ || !attestation.repository || !/^[a-f0-9]{40,64}$/i.test(attestation.commitSha)
352
+ || !['github', 'azure-pipelines', 'generic'].includes(attestation.ci?.provider)
353
+ || !attestation.ci?.runId || Number.isNaN(Date.parse(attestation.issuedAt)) || !attestation.keyId
354
+ || !attestation.evidenceHeads || !Object.keys(attestation.evidenceHeads).length
355
+ || Object.values(attestation.evidenceHeads).some((head) => !/^[a-f0-9]{64}$/i.test(head))
356
+ || typeof attestation.signature !== 'string')
357
+ throw new Error('schema mismatch');
358
+ if (attestation.githubOidc !== undefined) {
359
+ if (!attestation.githubOidc || typeof attestation.githubOidc !== 'object'
360
+ || Object.keys(attestation.githubOidc).some((key) => !['token', 'publicKey'].includes(key))
361
+ || typeof attestation.githubOidc.token !== 'string' || !attestation.githubOidc.token
362
+ || (attestation.githubOidc.publicKey !== undefined
363
+ && (typeof attestation.githubOidc.publicKey !== 'string'
364
+ || !attestation.githubOidc.publicKey.includes('BEGIN PUBLIC KEY')))) {
365
+ throw new Error('GitHub OIDC proof schema mismatch');
366
+ }
367
+ }
368
+ }
369
+ catch (cause) {
370
+ return {
371
+ present: true,
372
+ valid: false,
373
+ status: 'invalid',
374
+ trust: 'none',
375
+ diagnostics: [error('ATTESTATION_SCHEMA', `Invalid attestation: ${cause instanceof Error ? cause.message : String(cause)}.`, path)],
376
+ };
377
+ }
378
+ const trusted = config.trustedPublicKeys.find((key) => key.id === attestation.keyId);
379
+ const strictOidc = config.githubOidc?.mode === 'strict';
380
+ const keyBinding = config.githubOidc?.keyBinding ?? 'public-key';
381
+ if (strictOidc && keyBinding === 'key-id' && attestation.githubOidc?.publicKey) {
382
+ diagnostics.push(error('ATTESTATION_OIDC_KEY_BINDING', 'key-id binding must not carry an unrelated ephemeral public key.', path));
383
+ }
384
+ let signingKey = null;
385
+ let trust = 'none';
386
+ try {
387
+ if (strictOidc && keyBinding === 'public-key') {
388
+ if (!attestation.githubOidc?.publicKey)
389
+ throw new Error('OIDC-authorized ephemeral mode requires githubOidc.publicKey.');
390
+ signingKey = ed25519PublicKey(attestation.githubOidc.publicKey);
391
+ trust = 'github-oidc-ephemeral-key';
392
+ }
393
+ else if (trusted) {
394
+ signingKey = ed25519PublicKey(trusted.publicKey);
395
+ trust = strictOidc ? 'github-oidc-trusted-key' : 'static-trusted-key';
396
+ }
397
+ else {
398
+ diagnostics.push(error('ATTESTATION_KEY_UNTRUSTED', `Attestation key ${attestation.keyId} is not trusted.`, path));
399
+ }
400
+ }
401
+ catch (cause) {
402
+ diagnostics.push(error('ATTESTATION_SIGNATURE', cause instanceof Error ? cause.message : String(cause), path));
403
+ }
404
+ const issuedAt = Date.parse(attestation.issuedAt);
405
+ const now = (options.now ?? (() => new Date()))().getTime();
406
+ const futureSkewMs = (config.maxFutureSkewSeconds ?? 60) * 1000;
407
+ const maxAgeMs = (config.maxAgeSeconds ?? 3600) * 1000;
408
+ if (issuedAt > now + futureSkewMs) {
409
+ diagnostics.push(error('ATTESTATION_FUTURE', 'Attestation issuedAt is beyond the configured future clock skew.', path));
410
+ }
411
+ if (now - issuedAt > maxAgeMs) {
412
+ diagnostics.push(error('ATTESTATION_EXPIRED', 'Attestation is older than the configured maximum age.', path));
413
+ }
414
+ try {
415
+ const identity = await gitIdentity(root, runner);
416
+ if (config.repository && config.repository !== identity.repository)
417
+ diagnostics.push(error('ATTESTATION_REPOSITORY', 'Configured repository does not match Git remote.origin.url.', path));
418
+ if (attestation.repository !== (config.repository ?? identity.repository))
419
+ diagnostics.push(error('ATTESTATION_REPOSITORY', 'Attestation repository does not match the configured repository.', path));
420
+ if (attestation.commitSha.toLowerCase() !== identity.commitSha)
421
+ diagnostics.push(error('ATTESTATION_COMMIT', 'Attestation commit SHA does not match Git HEAD.', path));
422
+ }
423
+ catch (cause) {
424
+ diagnostics.push(error('ATTESTATION_GIT', cause instanceof Error ? cause.message : String(cause), path));
425
+ }
426
+ const ci = currentCi(environment);
427
+ if (config.mode === 'ci-required' && !ci)
428
+ diagnostics.push(error('ATTESTATION_CI_CONTEXT', 'No supported CI provider/run context is available.', path));
429
+ if (ci && (ci.provider !== attestation.ci.provider || ci.runId !== attestation.ci.runId))
430
+ diagnostics.push(error('ATTESTATION_CI_RUN', 'Attestation CI provider/run ID does not match the current CI run.', path));
431
+ if (ci?.repository && ci.repository !== attestation.repository)
432
+ diagnostics.push(error('ATTESTATION_CI_REPOSITORY', 'Attestation repository does not match the CI repository.', path));
433
+ if (ci?.commitSha && ci.commitSha !== attestation.commitSha.toLowerCase())
434
+ diagnostics.push(error('ATTESTATION_CI_COMMIT', 'Attestation commit does not match the CI source revision.', path));
435
+ const heads = await collectEvidenceHeads(root);
436
+ if (canonical(heads) !== canonical(attestation.evidenceHeads))
437
+ diagnostics.push(error('ATTESTATION_EVIDENCE_HEAD', 'Attested evidence heads do not match current evidence.', path));
438
+ const performance = await validatePerformanceEvidence(root);
439
+ if (performance.budgets > 0 && !performance.valid) {
440
+ diagnostics.push(error('ATTESTATION_PERFORMANCE_PROVENANCE', 'Attested performance evidence is no longer traceable to its configured command and fresh report.', path));
441
+ }
442
+ const mutation = await validateMutationEvidence(root);
443
+ if (mutation.present && !mutation.valid) {
444
+ diagnostics.push(error('ATTESTATION_MUTATION_PROVENANCE', 'Attested mutation evidence is no longer traceable to current source, tests, command, and report evidence.', path));
445
+ }
446
+ const correspondence = await validateModelCorrespondenceEvidence(root);
447
+ if (correspondence.requirements > 0 && !correspondence.valid) {
448
+ diagnostics.push(error('ATTESTATION_MODEL_CORRESPONDENCE', 'Attested model correspondence evidence is missing, stale, or unproved.', path));
449
+ }
450
+ if (strictOidc)
451
+ diagnostics.push(...await verifyGithubOidc(attestation, config, options, path));
452
+ if (signingKey) {
453
+ const { signature, ...unsigned } = attestation;
454
+ try {
455
+ if (!verify(null, Buffer.from(canonical(unsigned)), signingKey, Buffer.from(signature, 'base64'))) {
456
+ diagnostics.push(error('ATTESTATION_SIGNATURE', 'Ed25519 signature verification failed.', path));
457
+ }
458
+ }
459
+ catch {
460
+ diagnostics.push(error('ATTESTATION_SIGNATURE', 'Ed25519 signature is malformed or unverifiable.', path));
461
+ }
462
+ }
463
+ return {
464
+ present: true,
465
+ valid: !diagnostics.length,
466
+ status: diagnostics.length ? 'invalid' : 'verified',
467
+ trust: diagnostics.length ? 'none' : trust,
468
+ diagnostics,
469
+ };
470
+ }
471
+ export function attestationSigningPayload(value) {
472
+ return canonical(value);
473
+ }
474
+ //# sourceMappingURL=attestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../../../packages/analysis/src/attestation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type Diagnostic } from '../../domain/src/index.js';
2
+ export declare const changePhases: readonly ["impact", "requirements", "design", "red", "implementation", "green", "quality"];
3
+ export type ChangePhase = typeof changePhases[number];
4
+ interface ChangeFingerprints {
5
+ impact: string;
6
+ requirements: string;
7
+ design: string;
8
+ implementation: string;
9
+ tests: string;
10
+ tdd: string;
11
+ requirementImplementations?: Record<string, {
12
+ paths: string[];
13
+ fingerprints: Record<string, string>;
14
+ }>;
15
+ }
16
+ export interface ChangePhaseEvidence {
17
+ phase: ChangePhase;
18
+ order?: number;
19
+ recordedAt: string;
20
+ fingerprints: ChangeFingerprints;
21
+ }
22
+ export interface ChangeRecord {
23
+ changeId: string;
24
+ requirementIds: string[];
25
+ phases: Partial<Record<ChangePhase, ChangePhaseEvidence>>;
26
+ }
27
+ export interface ChangeEvidence {
28
+ schemaVersion: 1;
29
+ changes: ChangeRecord[];
30
+ }
31
+ export interface ChangeCompleteness {
32
+ changeId: string;
33
+ functionalRequirements: number;
34
+ nonFunctionalRequirements: number;
35
+ requirements: number;
36
+ completeRequirements: number;
37
+ valid: boolean;
38
+ }
39
+ export declare function loadChangeEvidence(root: string): Promise<ChangeEvidence | null>;
40
+ export declare function recordChangePhase(root: string, changeId: string, phase: ChangePhase, requirementIds: string[]): Promise<ChangeEvidence>;
41
+ export declare function validateChangeEvidence(root: string): Promise<{
42
+ present: boolean;
43
+ valid: boolean;
44
+ changes: number;
45
+ diagnostics: Diagnostic[];
46
+ }>;
47
+ export declare function validateChangeCompleteness(root: string): Promise<{
48
+ present: boolean;
49
+ valid: boolean;
50
+ changes: ChangeCompleteness[];
51
+ diagnostics: Diagnostic[];
52
+ }>;
53
+ export {};