@mneme-ai/core 0.25.0 → 0.27.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 (82) hide show
  1. package/dist/audit/baseline.d.ts +92 -0
  2. package/dist/audit/baseline.d.ts.map +1 -0
  3. package/dist/audit/baseline.js +276 -0
  4. package/dist/audit/baseline.js.map +1 -0
  5. package/dist/audit/baseline.test.d.ts +2 -0
  6. package/dist/audit/baseline.test.d.ts.map +1 -0
  7. package/dist/audit/baseline.test.js +180 -0
  8. package/dist/audit/baseline.test.js.map +1 -0
  9. package/dist/audit/certify.d.ts +139 -0
  10. package/dist/audit/certify.d.ts.map +1 -0
  11. package/dist/audit/certify.js +295 -0
  12. package/dist/audit/certify.js.map +1 -0
  13. package/dist/audit/certify.test.d.ts +2 -0
  14. package/dist/audit/certify.test.d.ts.map +1 -0
  15. package/dist/audit/certify.test.js +324 -0
  16. package/dist/audit/certify.test.js.map +1 -0
  17. package/dist/audit/index.d.ts +14 -0
  18. package/dist/audit/index.d.ts.map +1 -0
  19. package/dist/audit/index.js +14 -0
  20. package/dist/audit/index.js.map +1 -0
  21. package/dist/audit/trace.d.ts +88 -0
  22. package/dist/audit/trace.d.ts.map +1 -0
  23. package/dist/audit/trace.js +173 -0
  24. package/dist/audit/trace.js.map +1 -0
  25. package/dist/audit/trace.test.d.ts +2 -0
  26. package/dist/audit/trace.test.d.ts.map +1 -0
  27. package/dist/audit/trace.test.js +198 -0
  28. package/dist/audit/trace.test.js.map +1 -0
  29. package/dist/audit/verify.d.ts +61 -0
  30. package/dist/audit/verify.d.ts.map +1 -0
  31. package/dist/audit/verify.js +278 -0
  32. package/dist/audit/verify.js.map +1 -0
  33. package/dist/audit/verify.test.d.ts +2 -0
  34. package/dist/audit/verify.test.d.ts.map +1 -0
  35. package/dist/audit/verify.test.js +129 -0
  36. package/dist/audit/verify.test.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/pipeline/index.d.ts +34 -0
  42. package/dist/pipeline/index.d.ts.map +1 -0
  43. package/dist/pipeline/index.js +51 -0
  44. package/dist/pipeline/index.js.map +1 -0
  45. package/dist/pipeline/mpe.d.ts +83 -0
  46. package/dist/pipeline/mpe.d.ts.map +1 -0
  47. package/dist/pipeline/mpe.js +259 -0
  48. package/dist/pipeline/mpe.js.map +1 -0
  49. package/dist/pipeline/mpe.test.d.ts +2 -0
  50. package/dist/pipeline/mpe.test.d.ts.map +1 -0
  51. package/dist/pipeline/mpe.test.js +196 -0
  52. package/dist/pipeline/mpe.test.js.map +1 -0
  53. package/dist/pipeline/pipeline.integration.test.d.ts +2 -0
  54. package/dist/pipeline/pipeline.integration.test.d.ts.map +1 -0
  55. package/dist/pipeline/pipeline.integration.test.js +99 -0
  56. package/dist/pipeline/pipeline.integration.test.js.map +1 -0
  57. package/dist/pipeline/super-pipeline.d.ts +38 -0
  58. package/dist/pipeline/super-pipeline.d.ts.map +1 -0
  59. package/dist/pipeline/super-pipeline.js +247 -0
  60. package/dist/pipeline/super-pipeline.js.map +1 -0
  61. package/dist/pipeline/super-pipeline.test.d.ts +2 -0
  62. package/dist/pipeline/super-pipeline.test.d.ts.map +1 -0
  63. package/dist/pipeline/super-pipeline.test.js +130 -0
  64. package/dist/pipeline/super-pipeline.test.js.map +1 -0
  65. package/dist/pipeline/superscalar.d.ts +36 -0
  66. package/dist/pipeline/superscalar.d.ts.map +1 -0
  67. package/dist/pipeline/superscalar.js +130 -0
  68. package/dist/pipeline/superscalar.js.map +1 -0
  69. package/dist/pipeline/superscalar.test.d.ts +2 -0
  70. package/dist/pipeline/superscalar.test.d.ts.map +1 -0
  71. package/dist/pipeline/superscalar.test.js +130 -0
  72. package/dist/pipeline/superscalar.test.js.map +1 -0
  73. package/dist/pipeline/types.d.ts +104 -0
  74. package/dist/pipeline/types.d.ts.map +1 -0
  75. package/dist/pipeline/types.js +15 -0
  76. package/dist/pipeline/types.js.map +1 -0
  77. package/dist/retrieve/intent.d.ts.map +1 -1
  78. package/dist/retrieve/intent.js +16 -0
  79. package/dist/retrieve/intent.js.map +1 -1
  80. package/dist/retrieve/intent.test.js +23 -0
  81. package/dist/retrieve/intent.test.js.map +1 -1
  82. package/package.json +1 -1
@@ -0,0 +1,139 @@
1
+ /**
2
+ * AI Session Audit — CERTIFY module.
3
+ *
4
+ * The 5-axis trust certificate. Composes a baseline + a session trace
5
+ * into a verdict per axis:
6
+ *
7
+ * 1. behavioralParity — sample commands' exit + stdout-hash unchanged
8
+ * 2. apiContractDrift — public exports added / removed / renamed
9
+ * 3. testPassRate — before/after passing-test deltas
10
+ * 4. perfRegression — median ms regression (>25% fail, >10% warn)
11
+ * 5. aiNarrative — Leviathan-style commit-vs-diff check
12
+ *
13
+ * Plus four "forensic axes" reused from the existing anomaly detector
14
+ * (size / files / style / time). We translate each anomaly axis score
15
+ * to pass/warn/fail using the same thresholds.
16
+ *
17
+ * Pure data composition — no I/O. The CLI layer wires real `git` /
18
+ * `npm` calls in via the Runner interfaces from baseline.ts and
19
+ * trace.ts; here we only consume the captured snapshots.
20
+ */
21
+ import type { Baseline, Runner } from "./baseline.js";
22
+ import type { SessionTrace } from "./trace.js";
23
+ import { type NarrativeCheck } from "./verify.js";
24
+ export type AxisVerdict = "pass" | "warn" | "fail";
25
+ export interface AuditCertificate {
26
+ sessionId: string;
27
+ capturedAt: string;
28
+ axes: {
29
+ behavioralParity: {
30
+ verdict: AxisVerdict;
31
+ reason: string;
32
+ details: string[];
33
+ };
34
+ apiContractDrift: {
35
+ verdict: AxisVerdict;
36
+ reason: string;
37
+ details: string[];
38
+ };
39
+ testPassRate: {
40
+ verdict: AxisVerdict;
41
+ reason: string;
42
+ before: string;
43
+ after: string;
44
+ };
45
+ perfRegression: {
46
+ verdict: AxisVerdict;
47
+ reason: string;
48
+ deltaPercent: number;
49
+ };
50
+ aiNarrative: {
51
+ verdict: AxisVerdict;
52
+ reason: string;
53
+ checks: NarrativeCheck[];
54
+ };
55
+ };
56
+ forensicAxes: {
57
+ size: AxisVerdict;
58
+ files: AxisVerdict;
59
+ style: AxisVerdict;
60
+ time: AxisVerdict;
61
+ };
62
+ overallVerdict: AxisVerdict;
63
+ exitCode: 0 | 1;
64
+ }
65
+ /** Combine many axis verdicts: any fail → fail; any warn → warn; else pass. */
66
+ export declare function combineVerdicts(verdicts: AxisVerdict[]): AxisVerdict;
67
+ /** Helper for tests + CLI: read both raw outputs, return parity verdict. */
68
+ export declare function compareBehavioralParity(before: Baseline, after: Pick<Baseline, "outputs">): {
69
+ verdict: AxisVerdict;
70
+ reason: string;
71
+ details: string[];
72
+ };
73
+ export declare function compareApiSurface(before: Baseline, after: Pick<Baseline, "apiSurface">): {
74
+ verdict: AxisVerdict;
75
+ reason: string;
76
+ details: string[];
77
+ };
78
+ export declare function compareTestPassRate(before: Baseline, after: Pick<Baseline, "testPassRate">): {
79
+ verdict: AxisVerdict;
80
+ reason: string;
81
+ before: string;
82
+ after: string;
83
+ };
84
+ export declare function comparePerf(before: Baseline, after: Pick<Baseline, "perfMs">): {
85
+ verdict: AxisVerdict;
86
+ reason: string;
87
+ deltaPercent: number;
88
+ };
89
+ export interface NarrativeAxisInput {
90
+ trace: SessionTrace;
91
+ /** Per-commit unified diff text + filesTouched. Caller computes from git. */
92
+ diffs: Record<string, {
93
+ diff: string;
94
+ filesTouched: string[];
95
+ }>;
96
+ }
97
+ export declare function evaluateNarrativeAxis(input: NarrativeAxisInput): {
98
+ verdict: AxisVerdict;
99
+ reason: string;
100
+ checks: NarrativeCheck[];
101
+ };
102
+ /**
103
+ * Forensic axis verdicts — translate the four anomaly-detector axes
104
+ * (size / files / style / time) into pass/warn/fail using thresholds
105
+ * lifted from the anomaly module's severity bands.
106
+ */
107
+ export declare function classifyForensicAxis(score: number): AxisVerdict;
108
+ /**
109
+ * Top-level certify entry point. Caller supplies a fresh post-session
110
+ * baseline (re-captured) plus the trace + diffs + forensic axis scores.
111
+ */
112
+ export interface CertifyInput {
113
+ sessionId: string;
114
+ beforeBaseline: Baseline;
115
+ afterBaseline: Baseline;
116
+ trace: SessionTrace;
117
+ diffs: Record<string, {
118
+ diff: string;
119
+ filesTouched: string[];
120
+ }>;
121
+ /** Per-axis [0,1] forensic anomaly scores; default to all-zeros. */
122
+ forensicScores?: {
123
+ size: number;
124
+ files: number;
125
+ style: number;
126
+ time: number;
127
+ };
128
+ }
129
+ export declare function buildCertificate(input: CertifyInput): AuditCertificate;
130
+ /**
131
+ * Orchestrates the full certify pipeline against a real repo. The CLI
132
+ * uses this; tests exercise `buildCertificate` directly with canned
133
+ * inputs.
134
+ */
135
+ export declare function certifySession(repoRoot: string, baseline: Baseline, trace: SessionTrace, diffs?: Record<string, {
136
+ diff: string;
137
+ filesTouched: string[];
138
+ }>, runner?: Runner): Promise<AuditCertificate>;
139
+ //# sourceMappingURL=certify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certify.d.ts","sourceRoot":"","sources":["../../src/audit/certify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,gBAAgB,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QAC9E,gBAAgB,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QAC9E,YAAY,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACtF,cAAc,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAC/E,WAAW,EAAE;YAAE,OAAO,EAAE,WAAW,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,cAAc,EAAE,CAAA;SAAE,CAAC;KACjF,CAAC;IACF,YAAY,EAAE;QACZ,IAAI,EAAE,WAAW,CAAC;QAClB,KAAK,EAAE,WAAW,CAAC;QACnB,KAAK,EAAE,WAAW,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;IACF,cAAc,EAAE,WAAW,CAAC;IAC5B,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,WAAW,CAIpE;AAED,4EAA4E;AAC5E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,GAC/B;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAgD7D;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAClC;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA0C7D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,GACpC;IACD,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CA2BA;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,QAAQ,EAChB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAC9B;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAoChE;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CACX,MAAM,EACN;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CACzC,CAAC;CACH;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG;IAChE,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CAsCA;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAI/D;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,QAAQ,CAAC;IACzB,aAAa,EAAE,QAAQ,CAAC;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAChE,oEAAoE;IACpE,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAyCtE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,EACnB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAM,EACpE,MAAM,GAAE,MAAmB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAS3B"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * AI Session Audit — CERTIFY module.
3
+ *
4
+ * The 5-axis trust certificate. Composes a baseline + a session trace
5
+ * into a verdict per axis:
6
+ *
7
+ * 1. behavioralParity — sample commands' exit + stdout-hash unchanged
8
+ * 2. apiContractDrift — public exports added / removed / renamed
9
+ * 3. testPassRate — before/after passing-test deltas
10
+ * 4. perfRegression — median ms regression (>25% fail, >10% warn)
11
+ * 5. aiNarrative — Leviathan-style commit-vs-diff check
12
+ *
13
+ * Plus four "forensic axes" reused from the existing anomaly detector
14
+ * (size / files / style / time). We translate each anomaly axis score
15
+ * to pass/warn/fail using the same thresholds.
16
+ *
17
+ * Pure data composition — no I/O. The CLI layer wires real `git` /
18
+ * `npm` calls in via the Runner interfaces from baseline.ts and
19
+ * trace.ts; here we only consume the captured snapshots.
20
+ */
21
+ import { captureBaseline, realRunner } from "./baseline.js";
22
+ import { verifyNarrative, aggregateNarrativeTrust, hasContradiction, } from "./verify.js";
23
+ /** Combine many axis verdicts: any fail → fail; any warn → warn; else pass. */
24
+ export function combineVerdicts(verdicts) {
25
+ if (verdicts.includes("fail"))
26
+ return "fail";
27
+ if (verdicts.includes("warn"))
28
+ return "warn";
29
+ return "pass";
30
+ }
31
+ /** Helper for tests + CLI: read both raw outputs, return parity verdict. */
32
+ export function compareBehavioralParity(before, after) {
33
+ const details = [];
34
+ let mismatches = 0;
35
+ let critical = 0;
36
+ for (const [name, beforeSample] of Object.entries(before.outputs)) {
37
+ const afterSample = after.outputs[name];
38
+ if (!afterSample) {
39
+ details.push(`missing post-baseline sample: ${name}`);
40
+ continue;
41
+ }
42
+ if (beforeSample.exitCode !== afterSample.exitCode) {
43
+ details.push(`${name}: exit ${beforeSample.exitCode} → ${afterSample.exitCode}`);
44
+ mismatches += 1;
45
+ // git_head is critical: changing it means HEAD moved (expected),
46
+ // but exit-code change for any sample is critical.
47
+ critical += 1;
48
+ }
49
+ else if (beforeSample.stdoutHash !== afterSample.stdoutHash) {
50
+ // stdout content shift: warn unless the sample is git_head/git_log
51
+ // (those are EXPECTED to drift after new commits land).
52
+ if (name === "git_head" || name === "git_log_20") {
53
+ details.push(`${name}: stdout shifted (expected — new commits)`);
54
+ }
55
+ else {
56
+ details.push(`${name}: stdout shifted (${beforeSample.stdoutLines}→${afterSample.stdoutLines} lines)`);
57
+ mismatches += 1;
58
+ }
59
+ }
60
+ }
61
+ if (critical > 0) {
62
+ return {
63
+ verdict: "fail",
64
+ reason: `${critical} sample(s) changed exit code`,
65
+ details,
66
+ };
67
+ }
68
+ if (mismatches > 0) {
69
+ return {
70
+ verdict: "warn",
71
+ reason: `${mismatches} sample(s) drifted in unexpected ways`,
72
+ details,
73
+ };
74
+ }
75
+ return {
76
+ verdict: "pass",
77
+ reason: "all sample commands match the baseline",
78
+ details,
79
+ };
80
+ }
81
+ export function compareApiSurface(before, after) {
82
+ const details = [];
83
+ const removed = [];
84
+ const added = [];
85
+ // For every package present in either snapshot...
86
+ const allPkgs = new Set([
87
+ ...Object.keys(before.apiSurface),
88
+ ...Object.keys(after.apiSurface),
89
+ ]);
90
+ for (const pkg of allPkgs) {
91
+ const beforeSet = new Set(before.apiSurface[pkg] ?? []);
92
+ const afterSet = new Set(after.apiSurface[pkg] ?? []);
93
+ for (const name of beforeSet) {
94
+ if (!afterSet.has(name))
95
+ removed.push(`${pkg}.${name}`);
96
+ }
97
+ for (const name of afterSet) {
98
+ if (!beforeSet.has(name))
99
+ added.push(`${pkg}.${name}`);
100
+ }
101
+ }
102
+ if (removed.length > 0) {
103
+ details.push(`removed: ${removed.slice(0, 5).join(", ")}${removed.length > 5 ? "…" : ""}`);
104
+ }
105
+ if (added.length > 0) {
106
+ details.push(`added: ${added.slice(0, 5).join(", ")}${added.length > 5 ? "…" : ""}`);
107
+ }
108
+ if (removed.length > 0) {
109
+ return {
110
+ verdict: "fail",
111
+ reason: `${removed.length} export(s) removed — silent breaking change`,
112
+ details,
113
+ };
114
+ }
115
+ // Heuristic rename detection: same count of additions + removals + similar names → warn.
116
+ // Skipping — additions only is a "pass".
117
+ if (added.length > 0) {
118
+ return {
119
+ verdict: "pass",
120
+ reason: `${added.length} new export(s); no removals`,
121
+ details,
122
+ };
123
+ }
124
+ return { verdict: "pass", reason: "API surface identical", details };
125
+ }
126
+ export function compareTestPassRate(before, after) {
127
+ const b = before.testPassRate;
128
+ const a = after.testPassRate;
129
+ const beforeStr = `${b.passed} passed / ${b.failed} failed (${b.files} files)`;
130
+ const afterStr = `${a.passed} passed / ${a.failed} failed (${a.files} files)`;
131
+ if (a.failed > b.failed) {
132
+ return {
133
+ verdict: "fail",
134
+ reason: `${a.failed - b.failed} new test failure(s)`,
135
+ before: beforeStr,
136
+ after: afterStr,
137
+ };
138
+ }
139
+ if (a.passed < b.passed) {
140
+ return {
141
+ verdict: "warn",
142
+ reason: `passing test count dropped (${b.passed} → ${a.passed})`,
143
+ before: beforeStr,
144
+ after: afterStr,
145
+ };
146
+ }
147
+ return {
148
+ verdict: "pass",
149
+ reason: "no new test failures",
150
+ before: beforeStr,
151
+ after: afterStr,
152
+ };
153
+ }
154
+ export function comparePerf(before, after) {
155
+ let worstDelta = 0;
156
+ let worstName = "";
157
+ for (const [name, beforeMs] of Object.entries(before.perfMs)) {
158
+ const afterMs = after.perfMs[name];
159
+ if (afterMs == null)
160
+ continue;
161
+ if (beforeMs <= 0)
162
+ continue;
163
+ const delta = ((afterMs - beforeMs) / beforeMs) * 100;
164
+ if (delta > worstDelta) {
165
+ worstDelta = delta;
166
+ worstName = name;
167
+ }
168
+ }
169
+ const rounded = Number(worstDelta.toFixed(1));
170
+ if (rounded >= 25) {
171
+ return {
172
+ verdict: "fail",
173
+ reason: `${worstName} ${rounded}% slower than baseline`,
174
+ deltaPercent: rounded,
175
+ };
176
+ }
177
+ if (rounded >= 10) {
178
+ return {
179
+ verdict: "warn",
180
+ reason: `${worstName} ${rounded}% slower than baseline`,
181
+ deltaPercent: rounded,
182
+ };
183
+ }
184
+ return {
185
+ verdict: "pass",
186
+ reason: worstName.length > 0
187
+ ? `worst-case ${worstName} only ${rounded}% slower`
188
+ : "no perf samples to compare",
189
+ deltaPercent: rounded,
190
+ };
191
+ }
192
+ export function evaluateNarrativeAxis(input) {
193
+ const checks = [];
194
+ for (const c of input.trace.commits) {
195
+ const d = input.diffs[c.hash];
196
+ if (!d)
197
+ continue;
198
+ checks.push(verifyNarrative(c.message, d.diff, d.filesTouched, c.hash));
199
+ }
200
+ if (checks.length === 0) {
201
+ return {
202
+ verdict: "pass",
203
+ reason: "no commits with diffs to verify",
204
+ checks,
205
+ };
206
+ }
207
+ if (hasContradiction(checks)) {
208
+ const total = checks.reduce((s, c) => s + c.verifications.filter((v) => v.verdict === "contradicted").length, 0);
209
+ return {
210
+ verdict: "fail",
211
+ reason: `${total} commit-message claim(s) contradicted by diff`,
212
+ checks,
213
+ };
214
+ }
215
+ const trust = aggregateNarrativeTrust(checks);
216
+ if (trust < 0.6) {
217
+ return {
218
+ verdict: "warn",
219
+ reason: `aggregate narrative trust ${trust.toFixed(2)} below 0.6`,
220
+ checks,
221
+ };
222
+ }
223
+ return {
224
+ verdict: "pass",
225
+ reason: `aggregate narrative trust ${trust.toFixed(2)}`,
226
+ checks,
227
+ };
228
+ }
229
+ /**
230
+ * Forensic axis verdicts — translate the four anomaly-detector axes
231
+ * (size / files / style / time) into pass/warn/fail using thresholds
232
+ * lifted from the anomaly module's severity bands.
233
+ */
234
+ export function classifyForensicAxis(score) {
235
+ if (score >= 0.7)
236
+ return "fail";
237
+ if (score >= 0.4)
238
+ return "warn";
239
+ return "pass";
240
+ }
241
+ export function buildCertificate(input) {
242
+ const behavioralParity = compareBehavioralParity(input.beforeBaseline, input.afterBaseline);
243
+ const apiContractDrift = compareApiSurface(input.beforeBaseline, input.afterBaseline);
244
+ const testPassRate = compareTestPassRate(input.beforeBaseline, input.afterBaseline);
245
+ const perfRegression = comparePerf(input.beforeBaseline, input.afterBaseline);
246
+ const aiNarrative = evaluateNarrativeAxis({ trace: input.trace, diffs: input.diffs });
247
+ const fScores = input.forensicScores ?? { size: 0, files: 0, style: 0, time: 0 };
248
+ const forensicAxes = {
249
+ size: classifyForensicAxis(fScores.size),
250
+ files: classifyForensicAxis(fScores.files),
251
+ style: classifyForensicAxis(fScores.style),
252
+ time: classifyForensicAxis(fScores.time),
253
+ };
254
+ const overall = combineVerdicts([
255
+ behavioralParity.verdict,
256
+ apiContractDrift.verdict,
257
+ testPassRate.verdict,
258
+ perfRegression.verdict,
259
+ aiNarrative.verdict,
260
+ forensicAxes.size,
261
+ forensicAxes.files,
262
+ forensicAxes.style,
263
+ forensicAxes.time,
264
+ ]);
265
+ return {
266
+ sessionId: input.sessionId,
267
+ capturedAt: new Date().toISOString(),
268
+ axes: {
269
+ behavioralParity,
270
+ apiContractDrift,
271
+ testPassRate,
272
+ perfRegression,
273
+ aiNarrative,
274
+ },
275
+ forensicAxes,
276
+ overallVerdict: overall,
277
+ exitCode: overall === "fail" ? 1 : 0,
278
+ };
279
+ }
280
+ /**
281
+ * Orchestrates the full certify pipeline against a real repo. The CLI
282
+ * uses this; tests exercise `buildCertificate` directly with canned
283
+ * inputs.
284
+ */
285
+ export async function certifySession(repoRoot, baseline, trace, diffs = {}, runner = realRunner) {
286
+ const after = await captureBaseline(repoRoot, runner);
287
+ return buildCertificate({
288
+ sessionId: trace.toHash.slice(0, 7) || "unknown",
289
+ beforeBaseline: baseline,
290
+ afterBaseline: after,
291
+ trace,
292
+ diffs,
293
+ });
294
+ }
295
+ //# sourceMappingURL=certify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certify.js","sourceRoot":"","sources":["../../src/audit/certify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=certify.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"certify.test.d.ts","sourceRoot":"","sources":["../../src/audit/certify.test.ts"],"names":[],"mappings":""}