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,299 @@
1
+ import { error, validateRequirements } from '../../domain/src/index.js';
2
+ import { loadConfig } from './config.js';
3
+ import { digest, exists, files, readText, within, writeJson } from './files.js';
4
+ import { checkTrace, loadTrace } from './trace.js';
5
+ function canonical(value) {
6
+ if (Array.isArray(value))
7
+ return `[${value.map(canonical).join(',')}]`;
8
+ if (value && typeof value === 'object') {
9
+ return `{${Object.entries(value)
10
+ .sort(([a], [b]) => a.localeCompare(b))
11
+ .map(([key, nested]) => `${JSON.stringify(key)}:${canonical(nested)}`).join(',')}}`;
12
+ }
13
+ return JSON.stringify(value);
14
+ }
15
+ export function mutationCommandSha256(executable, args) {
16
+ return digest(canonical({ executable, arguments: args }));
17
+ }
18
+ export function mutationIdentity(record) {
19
+ return `MUT-${digest(canonical({
20
+ requirementId: record.requirementId,
21
+ testId: record.testId,
22
+ sourcePath: record.sourcePath,
23
+ operator: record.operator,
24
+ location: record.location,
25
+ })).slice(0, 16).toUpperCase()}`;
26
+ }
27
+ function validHash(value) {
28
+ return typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
29
+ }
30
+ function validRelativePath(value) {
31
+ return typeof value === 'string' && !!value && !value.includes('\0')
32
+ && !value.startsWith('/') && !/^[a-zA-Z]:[\\/]/.test(value)
33
+ && !value.split(/[\\/]/).includes('..');
34
+ }
35
+ function validRecord(record) {
36
+ return !!record && typeof record.id === 'string'
37
+ && typeof record.requirementId === 'string' && typeof record.testId === 'string'
38
+ && validRelativePath(record.sourcePath) && validHash(record.sourceSha256)
39
+ && validRelativePath(record.testPath) && validHash(record.testSha256)
40
+ && typeof record.operator === 'string' && /^[\p{L}_][\p{L}\p{N}_.:-]{0,127}$/u.test(record.operator)
41
+ && !!record.location && Number.isInteger(record.location.line) && record.location.line > 0
42
+ && Number.isInteger(record.location.column) && record.location.column > 0
43
+ && ['killed', 'survived', 'skipped', 'error'].includes(record.status);
44
+ }
45
+ export function parseMutationReport(text) {
46
+ const value = JSON.parse(text);
47
+ if (value.schemaVersion !== 1 || !Array.isArray(value.mutants) || !value.mutants.every(validRecord)) {
48
+ throw new Error('Invalid schema-v1 mutation report.');
49
+ }
50
+ return value;
51
+ }
52
+ function executionHash(execution) {
53
+ return digest(canonical(execution));
54
+ }
55
+ export function createMutationExecution(input) {
56
+ return { ...input, recordSha256: executionHash(input) };
57
+ }
58
+ export async function writeMutationEvidence(root, executions, runId) {
59
+ const evidence = {
60
+ schemaVersion: 1,
61
+ runId,
62
+ generatedAt: new Date().toISOString(),
63
+ executions,
64
+ };
65
+ await writeJson(root, '.musubix/evidence/mutation.json', evidence);
66
+ return evidence;
67
+ }
68
+ export function mutationEvidenceHead(evidence) {
69
+ const executions = Array.isArray(evidence.executions) ? evidence.executions : [];
70
+ return digest(canonical({
71
+ schemaVersion: evidence.schemaVersion,
72
+ executions: executions.map((entry) => {
73
+ const execution = entry;
74
+ return {
75
+ commandName: execution.commandName,
76
+ commandSha256: execution.commandSha256,
77
+ reportPath: execution.reportPath,
78
+ processStatus: execution.processStatus,
79
+ exitCode: execution.exitCode,
80
+ mutants: execution.mutants ?? [],
81
+ };
82
+ }).sort((a, b) => canonical(a).localeCompare(canonical(b))),
83
+ }));
84
+ }
85
+ async function functionalMustRequirements(root) {
86
+ const result = [];
87
+ const paths = (await files(root)).filter((path) => /^\.musubix\/features\/[^/]+\/requirements\.md$/.test(path));
88
+ for (const path of paths) {
89
+ result.push(...validateRequirements(await readText(root, path), path).value
90
+ .filter((requirement) => requirement.priority === 'must' && requirement.type === 'functional'));
91
+ }
92
+ return result;
93
+ }
94
+ function configuredMutation(command) {
95
+ if (!command.mutationReport)
96
+ return null;
97
+ return {
98
+ reportPath: command.mutationReport.path,
99
+ args: command.args.map((arg) => arg.replaceAll('{reportPath}', command.mutationReport.path)),
100
+ };
101
+ }
102
+ function sourceImplements(trace, sourceId, requirementId) {
103
+ if (trace.edges.some((edge) => edge.from === sourceId && edge.to === requirementId && edge.relation === 'implements'))
104
+ return true;
105
+ const designs = trace.edges.filter((edge) => edge.to === requirementId && edge.relation === 'satisfies').map((edge) => edge.from);
106
+ return trace.edges.some((edge) => edge.from === sourceId && designs.includes(edge.to) && edge.relation === 'implements');
107
+ }
108
+ export async function validateMutationEvidence(root, configOverride) {
109
+ const requirements = await functionalMustRequirements(root);
110
+ const path = '.musubix/evidence/mutation.json';
111
+ if (!await exists(within(root, path))) {
112
+ const mutationConfig = configOverride ?? (await exists(within(root, '.musubix/config.json'))
113
+ ? (await loadConfig(root)).mutation
114
+ : { mode: 'compatible' });
115
+ const required = mutationConfig.mode === 'strict' && requirements.length > 0;
116
+ return {
117
+ present: false,
118
+ valid: !required,
119
+ requirements: requirements.length,
120
+ coveredRequirements: [],
121
+ mutants: 0,
122
+ diagnostics: required
123
+ ? [error('MUTATION_EVIDENCE_MISSING', 'Strict mutation mode requires fresh schema-v1 mutation evidence.', path)]
124
+ : [],
125
+ };
126
+ }
127
+ const config = await loadConfig(root);
128
+ let value;
129
+ try {
130
+ value = JSON.parse(await readText(root, path));
131
+ }
132
+ catch (cause) {
133
+ return {
134
+ present: true, valid: false, requirements: requirements.length, coveredRequirements: [], mutants: 0,
135
+ diagnostics: [error('MUTATION_EVIDENCE_SCHEMA', `Invalid mutation evidence: ${cause instanceof Error ? cause.message : String(cause)}.`, path)],
136
+ };
137
+ }
138
+ if (value.schemaVersion !== 1 || typeof value.runId !== 'string'
139
+ || !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value.runId)
140
+ || Number.isNaN(Date.parse(value.generatedAt)) || !Array.isArray(value.executions)) {
141
+ return {
142
+ present: true, valid: false, requirements: requirements.length, coveredRequirements: [], mutants: 0,
143
+ diagnostics: [error('MUTATION_EVIDENCE_SCHEMA', 'Invalid mutation evidence.', path)],
144
+ };
145
+ }
146
+ const diagnostics = [];
147
+ let trace;
148
+ try {
149
+ trace = await loadTrace(root);
150
+ const traceCheck = await checkTrace(root, trace, true);
151
+ if (!traceCheck.valid)
152
+ diagnostics.push(error('MUTATION_TRACE_STALE', 'Mutation evidence requires a fresh valid trace graph.', path));
153
+ }
154
+ catch {
155
+ return {
156
+ present: true, valid: false, requirements: requirements.length, coveredRequirements: [], mutants: 0,
157
+ diagnostics: [error('MUTATION_TRACE_STALE', 'Mutation evidence requires generated trace evidence.', path)],
158
+ };
159
+ }
160
+ const nodes = new Map(trace.nodes.map((node) => [node.id, node]));
161
+ const currentFingerprints = {};
162
+ const evidencePaths = new Set();
163
+ for (const execution of value.executions) {
164
+ if (!execution || !Array.isArray(execution.mutants))
165
+ continue;
166
+ for (const mutant of execution.mutants) {
167
+ if (!mutant || typeof mutant !== 'object')
168
+ continue;
169
+ if (typeof mutant.sourcePath === 'string')
170
+ evidencePaths.add(mutant.sourcePath);
171
+ if (typeof mutant.testPath === 'string')
172
+ evidencePaths.add(mutant.testPath);
173
+ }
174
+ }
175
+ for (const candidate of evidencePaths) {
176
+ try {
177
+ const absolute = within(root, candidate);
178
+ if (await exists(absolute))
179
+ currentFingerprints[candidate] = digest(await readText(root, candidate));
180
+ }
181
+ catch {
182
+ diagnostics.push(error('MUTATION_PATH', `Mutation evidence contains an unsafe or unreadable path: ${candidate}.`, path));
183
+ }
184
+ }
185
+ const identities = new Map();
186
+ const locations = new Map();
187
+ const executionIds = new Set();
188
+ const reportOwners = new Map();
189
+ const covered = new Set();
190
+ for (const execution of value.executions) {
191
+ if (!execution || !validHash(execution.executionId) || typeof execution.commandName !== 'string'
192
+ || !validHash(execution.commandSha256) || !validRelativePath(execution.reportPath)
193
+ || !validHash(execution.reportSha256) || execution.processStatus !== 'completed'
194
+ || execution.exitCode !== 0 || !Array.isArray(execution.mutants)
195
+ || !execution.mutants.every(validRecord) || !validHash(execution.recordSha256)) {
196
+ diagnostics.push(error('MUTATION_PROVENANCE_SCHEMA', 'A mutation execution provenance record is malformed.', path));
197
+ continue;
198
+ }
199
+ const { recordSha256, ...unsigned } = execution;
200
+ if (executionHash(unsigned) !== recordSha256) {
201
+ diagnostics.push(error('MUTATION_PROVENANCE_TAMPERED', `Mutation execution ${execution.executionId} has an invalid record hash.`, path));
202
+ }
203
+ if (executionIds.has(execution.executionId)) {
204
+ diagnostics.push(error('MUTATION_EXECUTION_DUPLICATE', `Mutation execution ${execution.executionId} is duplicated.`, path));
205
+ }
206
+ executionIds.add(execution.executionId);
207
+ const reportOwner = reportOwners.get(execution.reportPath);
208
+ if (reportOwner && reportOwner !== execution.executionId) {
209
+ diagnostics.push(error('MUTATION_REPORT_CONFLICT', `${execution.reportPath} is claimed by multiple mutation executions.`, path));
210
+ }
211
+ reportOwners.set(execution.reportPath, execution.executionId);
212
+ const command = config.commands.find((candidate) => candidate.name === execution.commandName);
213
+ const configured = command ? configuredMutation(command) : null;
214
+ if (!command || !configured || configured.reportPath !== execution.reportPath
215
+ || mutationCommandSha256(command.command, configured.args) !== execution.commandSha256) {
216
+ diagnostics.push(error('MUTATION_COMMAND_MISMATCH', `${execution.commandName} is not traceable to the current configured mutation command.`, path));
217
+ }
218
+ if (!await exists(within(root, execution.reportPath))) {
219
+ diagnostics.push(error('MUTATION_REPORT_STALE', `${execution.reportPath} is missing.`, execution.reportPath));
220
+ }
221
+ else {
222
+ try {
223
+ const text = await readText(root, execution.reportPath);
224
+ const report = parseMutationReport(text);
225
+ if (digest(text) !== execution.reportSha256 || canonical(report.mutants) !== canonical(execution.mutants)) {
226
+ diagnostics.push(error('MUTATION_REPORT_STALE', `${execution.reportPath} changed since the mutation command ran.`, execution.reportPath));
227
+ }
228
+ }
229
+ catch {
230
+ diagnostics.push(error('MUTATION_REPORT_STALE', `${execution.reportPath} is malformed or changed.`, execution.reportPath));
231
+ }
232
+ }
233
+ for (const mutant of execution.mutants) {
234
+ const expectedId = mutationIdentity(mutant);
235
+ if (mutant.id !== expectedId) {
236
+ diagnostics.push(error('MUTATION_IDENTITY', `${mutant.id} is not the deterministic identity ${expectedId}.`, path));
237
+ }
238
+ const previous = identities.get(mutant.id);
239
+ if (previous) {
240
+ diagnostics.push(error(canonical(previous) === canonical(mutant) ? 'MUTATION_DUPLICATE' : 'MUTATION_CONFLICT', `${mutant.id} is reported more than once${canonical(previous) === canonical(mutant) ? '' : ' with conflicting evidence'}.`, path));
241
+ }
242
+ else
243
+ identities.set(mutant.id, mutant);
244
+ const locationKey = canonical({
245
+ requirementId: mutant.requirementId,
246
+ sourcePath: mutant.sourcePath,
247
+ operator: mutant.operator,
248
+ location: mutant.location,
249
+ });
250
+ const locationOwner = locations.get(locationKey);
251
+ if (locationOwner && locationOwner.id !== mutant.id) {
252
+ diagnostics.push(error('MUTATION_CONFLICT', `${mutant.sourcePath}:${mutant.location.line}:${mutant.location.column} has conflicting mutant identities.`, path));
253
+ }
254
+ else
255
+ locations.set(locationKey, mutant);
256
+ const requirement = requirements.find((candidate) => candidate.id === mutant.requirementId);
257
+ if (!requirement) {
258
+ diagnostics.push(error('MUTATION_REQUIREMENT', `${mutant.id} is not linked to a must functional requirement.`, path));
259
+ }
260
+ const test = nodes.get(mutant.testId);
261
+ if (!test || test.kind !== 'test' || test.path !== mutant.testPath
262
+ || !trace.edges.some((edge) => edge.from === mutant.testId
263
+ && edge.to === mutant.requirementId && edge.relation === 'verifies')) {
264
+ diagnostics.push(error('MUTATION_TEST_UNLINKED', `${mutant.testId} is not an authoritative test for ${mutant.requirementId}.`, path));
265
+ }
266
+ const source = trace.nodes.find((node) => node.kind === 'code' && node.path === mutant.sourcePath
267
+ && sourceImplements(trace, node.id, mutant.requirementId));
268
+ if (!source)
269
+ diagnostics.push(error('MUTATION_SOURCE_UNLINKED', `${mutant.sourcePath} is not authoritative implementation for ${mutant.requirementId}.`, path));
270
+ if (currentFingerprints[mutant.sourcePath] !== mutant.sourceSha256) {
271
+ diagnostics.push(error('MUTATION_SOURCE_STALE', `${mutant.id} source fingerprint is stale.`, mutant.sourcePath));
272
+ }
273
+ if (currentFingerprints[mutant.testPath] !== mutant.testSha256) {
274
+ diagnostics.push(error('MUTATION_TEST_STALE', `${mutant.id} test fingerprint is stale.`, mutant.testPath));
275
+ }
276
+ if (mutant.status !== 'killed') {
277
+ diagnostics.push(error('MUTATION_NOT_KILLED', `${mutant.id} status is ${mutant.status}; killed is required.`, path));
278
+ }
279
+ if (requirement && test?.kind === 'test' && source && mutant.status === 'killed'
280
+ && currentFingerprints[mutant.sourcePath] === mutant.sourceSha256
281
+ && currentFingerprints[mutant.testPath] === mutant.testSha256)
282
+ covered.add(mutant.requirementId);
283
+ }
284
+ }
285
+ for (const requirement of requirements) {
286
+ if (!covered.has(requirement.id)) {
287
+ diagnostics.push(error('MUTATION_REQUIREMENT_UNCOVERED', `${requirement.id} has no current linked killed mutant.`, path));
288
+ }
289
+ }
290
+ return {
291
+ present: true,
292
+ valid: !diagnostics.length,
293
+ requirements: requirements.length,
294
+ coveredRequirements: [...covered].sort(),
295
+ mutants: value.executions.reduce((sum, execution) => sum + (execution && Array.isArray(execution.mutants) ? execution.mutants.length : 0), 0),
296
+ diagnostics,
297
+ };
298
+ }
299
+ //# sourceMappingURL=mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../../../../packages/analysis/src/mutation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Diagnostic } from '../../domain/src/index.js';
2
+ export type EvidenceOrderKind = 'change' | 'tdd';
3
+ export interface EvidenceOrderRecord {
4
+ sequence: number;
5
+ kind: EvidenceOrderKind;
6
+ entityId: string;
7
+ phase: string;
8
+ previousSha256: string | null;
9
+ recordSha256: string;
10
+ }
11
+ export interface EvidenceOrderLog {
12
+ schemaVersion: 1;
13
+ records: EvidenceOrderRecord[];
14
+ }
15
+ export declare function loadEvidenceOrder(root: string): Promise<EvidenceOrderLog | null>;
16
+ export declare function validateEvidenceOrderLog(log: EvidenceOrderLog | null): {
17
+ valid: boolean;
18
+ records: Map<string, EvidenceOrderRecord>;
19
+ diagnostics: Diagnostic[];
20
+ };
21
+ export declare function inspectEvidenceOrder(root: string): Promise<ReturnType<typeof validateEvidenceOrderLog>>;
22
+ export declare function appendEvidenceOrder(root: string, input: Pick<EvidenceOrderRecord, 'kind' | 'entityId' | 'phase'>): Promise<EvidenceOrderRecord>;
23
+ export declare function evidenceOrderRecord(records: Map<string, EvidenceOrderRecord>, kind: EvidenceOrderKind, entityId: string, phase: string): EvidenceOrderRecord | undefined;
@@ -0,0 +1,89 @@
1
+ import { error } from '../../domain/src/index.js';
2
+ import { digest, exists, readText, within, writeJson } from './files.js';
3
+ const orderPath = '.musubix/evidence/order.json';
4
+ function recordSha256(record) {
5
+ return digest(JSON.stringify(record));
6
+ }
7
+ function recordKey(kind, entityId, phase) {
8
+ return JSON.stringify([kind, entityId, phase]);
9
+ }
10
+ export async function loadEvidenceOrder(root) {
11
+ if (!await exists(within(root, orderPath)))
12
+ return null;
13
+ const value = JSON.parse(await readText(root, orderPath));
14
+ if (value.schemaVersion !== 1 || !Array.isArray(value.records)) {
15
+ throw new Error('Invalid monotonic evidence order log.');
16
+ }
17
+ return value;
18
+ }
19
+ export function validateEvidenceOrderLog(log) {
20
+ const diagnostics = [];
21
+ const records = new Map();
22
+ if (!log)
23
+ return { valid: true, records, diagnostics };
24
+ for (const [index, record] of log.records.entries()) {
25
+ const expectedSequence = index + 1;
26
+ const expectedPrevious = index === 0 ? null : log.records[index - 1].recordSha256;
27
+ if (!record || !['change', 'tdd'].includes(record.kind)
28
+ || typeof record.entityId !== 'string' || !record.entityId
29
+ || typeof record.phase !== 'string' || !record.phase
30
+ || !Number.isInteger(record.sequence) || record.sequence < 1
31
+ || (record.previousSha256 !== null && !/^[a-f0-9]{64}$/i.test(record.previousSha256))
32
+ || !/^[a-f0-9]{64}$/i.test(record.recordSha256)) {
33
+ diagnostics.push(error('EVIDENCE_ORDER_SCHEMA', `Monotonic evidence order record ${index + 1} is malformed.`, orderPath));
34
+ continue;
35
+ }
36
+ const { recordSha256: actual, ...payload } = record;
37
+ if (record.sequence !== expectedSequence) {
38
+ diagnostics.push(error('EVIDENCE_ORDER_SEQUENCE', `Evidence order record ${record.sequence} is out of order; expected ${expectedSequence}.`, orderPath));
39
+ }
40
+ if (record.previousSha256 !== expectedPrevious) {
41
+ diagnostics.push(error('EVIDENCE_ORDER_LINK', `Evidence order record ${record.sequence} does not link to its predecessor.`, orderPath));
42
+ }
43
+ if (actual !== recordSha256(payload)) {
44
+ diagnostics.push(error('EVIDENCE_ORDER_HASH', `Evidence order record ${record.sequence} has an invalid SHA-256.`, orderPath));
45
+ }
46
+ const key = recordKey(record.kind, record.entityId, record.phase);
47
+ if (records.has(key)) {
48
+ diagnostics.push(error('EVIDENCE_ORDER_DUPLICATE', `${record.kind}:${record.entityId}:${record.phase} appears more than once.`, orderPath));
49
+ }
50
+ records.set(key, record);
51
+ }
52
+ return { valid: !diagnostics.length, records, diagnostics };
53
+ }
54
+ export async function inspectEvidenceOrder(root) {
55
+ try {
56
+ return validateEvidenceOrderLog(await loadEvidenceOrder(root));
57
+ }
58
+ catch (cause) {
59
+ return {
60
+ valid: false,
61
+ records: new Map(),
62
+ diagnostics: [error('EVIDENCE_ORDER_SCHEMA', cause instanceof Error ? cause.message : String(cause), orderPath)],
63
+ };
64
+ }
65
+ }
66
+ export async function appendEvidenceOrder(root, input) {
67
+ const log = await loadEvidenceOrder(root) ?? { schemaVersion: 1, records: [] };
68
+ const validated = validateEvidenceOrderLog(log);
69
+ if (!validated.valid) {
70
+ throw new Error('Existing monotonic evidence order is invalid; regenerate evidence before appending.');
71
+ }
72
+ if (validated.records.has(recordKey(input.kind, input.entityId, input.phase))) {
73
+ throw new Error(`${input.kind}:${input.entityId}:${input.phase} is already present in monotonic evidence order.`);
74
+ }
75
+ const previous = log.records.at(-1);
76
+ const payload = {
77
+ sequence: log.records.length + 1,
78
+ ...input,
79
+ previousSha256: previous?.recordSha256 ?? null,
80
+ };
81
+ const record = { ...payload, recordSha256: recordSha256(payload) };
82
+ log.records.push(record);
83
+ await writeJson(root, orderPath, log);
84
+ return record;
85
+ }
86
+ export function evidenceOrderRecord(records, kind, entityId, phase) {
87
+ return records.get(recordKey(kind, entityId, phase));
88
+ }
89
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../../packages/analysis/src/order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type Diagnostic, type Requirement } from '../../domain/src/index.js';
2
+ import type { ProcessResult } from './process.js';
3
+ import { type MusubixTestReport } from './tdd.js';
4
+ type TestResult = MusubixTestReport['tests'][number];
5
+ export type PerformanceReportSourceKind = 'file' | 'directory' | 'stdout';
6
+ export interface PerformanceExecution {
7
+ runId: string;
8
+ executionId: string;
9
+ commandName: string;
10
+ commandSha256: string;
11
+ reportPath: string;
12
+ sourceKind: PerformanceReportSourceKind;
13
+ reportSha256: string;
14
+ processStatus: ProcessResult['status'];
15
+ exitCode: number | null;
16
+ tests: TestResult[];
17
+ recordSha256: string;
18
+ }
19
+ export interface PerformanceProvenance {
20
+ runId: string;
21
+ executionId: string;
22
+ commandName: string;
23
+ commandSha256: string;
24
+ reportPath: string;
25
+ sourceKind: PerformanceReportSourceKind;
26
+ reportSha256: string;
27
+ testId: string;
28
+ testStatus: TestResult['status'];
29
+ counter: string;
30
+ value: number;
31
+ processStatus: ProcessResult['status'];
32
+ exitCode: number | null;
33
+ executionRecordSha256: string;
34
+ recordSha256: string;
35
+ }
36
+ export interface PerformanceObservation {
37
+ requirementId: string;
38
+ testId: string;
39
+ counter: string;
40
+ observed: number | null;
41
+ maximum: number;
42
+ status: 'pass' | 'fail' | 'missing';
43
+ provenance?: PerformanceProvenance;
44
+ }
45
+ export interface PerformanceEvidence {
46
+ schemaVersion: 2;
47
+ runId: string;
48
+ generatedAt: string;
49
+ executions: PerformanceExecution[];
50
+ observations: PerformanceObservation[];
51
+ }
52
+ export declare function performanceEvidenceHead(evidence: Record<string, unknown>): string;
53
+ export declare function performanceCommandSha256(executable: string, args: string[]): string;
54
+ export declare function createPerformanceExecution(input: Omit<PerformanceExecution, 'recordSha256'>): PerformanceExecution;
55
+ export declare function requirementsWithBudgets(root: string): Promise<Requirement[]>;
56
+ export declare function performanceEvidence(requirements: Requirement[], executions: PerformanceExecution[], runId: string): PerformanceEvidence;
57
+ export declare function writePerformanceEvidence(root: string, executions: PerformanceExecution[], runId: string): Promise<PerformanceEvidence>;
58
+ export declare function validatePerformanceEvidence(root: string): Promise<{
59
+ present: boolean;
60
+ valid: boolean;
61
+ budgets: number;
62
+ validRequirements: string[];
63
+ diagnostics: Diagnostic[];
64
+ }>;
65
+ export {};