@req2rank/core 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 (154) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adaptive-calibration.d.ts +13 -0
  3. package/dist/adaptive-calibration.d.ts.map +1 -0
  4. package/dist/adaptive-calibration.js +39 -0
  5. package/dist/adaptive-calibration.js.map +1 -0
  6. package/dist/adaptive-calibration.test.d.ts +2 -0
  7. package/dist/adaptive-calibration.test.d.ts.map +1 -0
  8. package/dist/adaptive-calibration.test.js +20 -0
  9. package/dist/adaptive-calibration.test.js.map +1 -0
  10. package/dist/checkpoint-key.d.ts +3 -0
  11. package/dist/checkpoint-key.d.ts.map +1 -0
  12. package/dist/checkpoint-key.js +27 -0
  13. package/dist/checkpoint-key.js.map +1 -0
  14. package/dist/checkpoint-key.test.d.ts +2 -0
  15. package/dist/checkpoint-key.test.d.ts.map +1 -0
  16. package/dist/checkpoint-key.test.js +24 -0
  17. package/dist/checkpoint-key.test.js.map +1 -0
  18. package/dist/config.d.ts +162 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +68 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/domain-taxonomy.d.ts +13 -0
  23. package/dist/domain-taxonomy.d.ts.map +1 -0
  24. package/dist/domain-taxonomy.js +12 -0
  25. package/dist/domain-taxonomy.js.map +1 -0
  26. package/dist/evaluation-panel.d.ts +27 -0
  27. package/dist/evaluation-panel.d.ts.map +1 -0
  28. package/dist/evaluation-panel.js +158 -0
  29. package/dist/evaluation-panel.js.map +1 -0
  30. package/dist/evaluation-panel.test.d.ts +2 -0
  31. package/dist/evaluation-panel.test.d.ts.map +1 -0
  32. package/dist/evaluation-panel.test.js +160 -0
  33. package/dist/evaluation-panel.test.js.map +1 -0
  34. package/dist/evidence-chain.d.ts +11 -0
  35. package/dist/evidence-chain.d.ts.map +1 -0
  36. package/dist/evidence-chain.js +33 -0
  37. package/dist/evidence-chain.js.map +1 -0
  38. package/dist/evidence-chain.test.d.ts +2 -0
  39. package/dist/evidence-chain.test.d.ts.map +1 -0
  40. package/dist/evidence-chain.test.js +16 -0
  41. package/dist/evidence-chain.test.js.map +1 -0
  42. package/dist/execution-engine.d.ts +29 -0
  43. package/dist/execution-engine.d.ts.map +1 -0
  44. package/dist/execution-engine.js +102 -0
  45. package/dist/execution-engine.js.map +1 -0
  46. package/dist/execution-engine.test.d.ts +2 -0
  47. package/dist/execution-engine.test.d.ts.map +1 -0
  48. package/dist/execution-engine.test.js +81 -0
  49. package/dist/execution-engine.test.js.map +1 -0
  50. package/dist/hub-client.d.ts +21 -0
  51. package/dist/hub-client.d.ts.map +1 -0
  52. package/dist/hub-client.js +103 -0
  53. package/dist/hub-client.js.map +1 -0
  54. package/dist/hub-client.test.d.ts +2 -0
  55. package/dist/hub-client.test.d.ts.map +1 -0
  56. package/dist/hub-client.test.js +129 -0
  57. package/dist/hub-client.test.js.map +1 -0
  58. package/dist/index.d.ts +19 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +19 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/leaderboard-query.d.ts +29 -0
  63. package/dist/leaderboard-query.d.ts.map +1 -0
  64. package/dist/leaderboard-query.js +59 -0
  65. package/dist/leaderboard-query.js.map +1 -0
  66. package/dist/leaderboard-query.test.d.ts +2 -0
  67. package/dist/leaderboard-query.test.d.ts.map +1 -0
  68. package/dist/leaderboard-query.test.js +34 -0
  69. package/dist/leaderboard-query.test.js.map +1 -0
  70. package/dist/local-store.d.ts +17 -0
  71. package/dist/local-store.d.ts.map +1 -0
  72. package/dist/local-store.js +144 -0
  73. package/dist/local-store.js.map +1 -0
  74. package/dist/local-store.test.d.ts +2 -0
  75. package/dist/local-store.test.d.ts.map +1 -0
  76. package/dist/local-store.test.js +116 -0
  77. package/dist/local-store.test.js.map +1 -0
  78. package/dist/pipeline-stage-handoff.test.d.ts +2 -0
  79. package/dist/pipeline-stage-handoff.test.d.ts.map +1 -0
  80. package/dist/pipeline-stage-handoff.test.js +290 -0
  81. package/dist/pipeline-stage-handoff.test.js.map +1 -0
  82. package/dist/pipeline.d.ts +67 -0
  83. package/dist/pipeline.d.ts.map +1 -0
  84. package/dist/pipeline.js +482 -0
  85. package/dist/pipeline.js.map +1 -0
  86. package/dist/providers/anthropic.d.ts +8 -0
  87. package/dist/providers/anthropic.d.ts.map +1 -0
  88. package/dist/providers/anthropic.js +45 -0
  89. package/dist/providers/anthropic.js.map +1 -0
  90. package/dist/providers/base.d.ts +36 -0
  91. package/dist/providers/base.d.ts.map +1 -0
  92. package/dist/providers/base.js +47 -0
  93. package/dist/providers/base.js.map +1 -0
  94. package/dist/providers/custom.d.ts +6 -0
  95. package/dist/providers/custom.d.ts.map +1 -0
  96. package/dist/providers/custom.js +6 -0
  97. package/dist/providers/custom.js.map +1 -0
  98. package/dist/providers/google.d.ts +8 -0
  99. package/dist/providers/google.d.ts.map +1 -0
  100. package/dist/providers/google.js +48 -0
  101. package/dist/providers/google.js.map +1 -0
  102. package/dist/providers/index.d.ts +23 -0
  103. package/dist/providers/index.d.ts.map +1 -0
  104. package/dist/providers/index.js +31 -0
  105. package/dist/providers/index.js.map +1 -0
  106. package/dist/providers/openai.d.ts +8 -0
  107. package/dist/providers/openai.d.ts.map +1 -0
  108. package/dist/providers/openai.js +40 -0
  109. package/dist/providers/openai.js.map +1 -0
  110. package/dist/providers/providers.test.d.ts +2 -0
  111. package/dist/providers/providers.test.d.ts.map +1 -0
  112. package/dist/providers/providers.test.js +44 -0
  113. package/dist/providers/providers.test.js.map +1 -0
  114. package/dist/requirement-generator.d.ts +29 -0
  115. package/dist/requirement-generator.d.ts.map +1 -0
  116. package/dist/requirement-generator.js +358 -0
  117. package/dist/requirement-generator.js.map +1 -0
  118. package/dist/requirement-generator.test.d.ts +2 -0
  119. package/dist/requirement-generator.test.d.ts.map +1 -0
  120. package/dist/requirement-generator.test.js +148 -0
  121. package/dist/requirement-generator.test.js.map +1 -0
  122. package/dist/sandbox.d.ts +32 -0
  123. package/dist/sandbox.d.ts.map +1 -0
  124. package/dist/sandbox.js +123 -0
  125. package/dist/sandbox.js.map +1 -0
  126. package/dist/sandbox.test.d.ts +2 -0
  127. package/dist/sandbox.test.d.ts.map +1 -0
  128. package/dist/sandbox.test.js +20 -0
  129. package/dist/sandbox.test.js.map +1 -0
  130. package/dist/scoring-engine.d.ts +15 -0
  131. package/dist/scoring-engine.d.ts.map +1 -0
  132. package/dist/scoring-engine.js +109 -0
  133. package/dist/scoring-engine.js.map +1 -0
  134. package/dist/scoring-engine.test.d.ts +2 -0
  135. package/dist/scoring-engine.test.d.ts.map +1 -0
  136. package/dist/scoring-engine.test.js +137 -0
  137. package/dist/scoring-engine.test.js.map +1 -0
  138. package/dist/submit-payload-builder.d.ts +9 -0
  139. package/dist/submit-payload-builder.d.ts.map +1 -0
  140. package/dist/submit-payload-builder.js +23 -0
  141. package/dist/submit-payload-builder.js.map +1 -0
  142. package/dist/submit-payload-builder.test.d.ts +2 -0
  143. package/dist/submit-payload-builder.test.d.ts.map +1 -0
  144. package/dist/submit-payload-builder.test.js +75 -0
  145. package/dist/submit-payload-builder.test.js.map +1 -0
  146. package/dist/submitter-types.d.ts +54 -0
  147. package/dist/submitter-types.d.ts.map +1 -0
  148. package/dist/submitter-types.js +2 -0
  149. package/dist/submitter-types.js.map +1 -0
  150. package/dist/types.d.ts +40 -0
  151. package/dist/types.d.ts.map +1 -0
  152. package/dist/types.js +2 -0
  153. package/dist/types.js.map +1 -0
  154. package/package.json +36 -0
@@ -0,0 +1,144 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import Database from "better-sqlite3";
4
+ export class LocalStore {
5
+ filePath;
6
+ db;
7
+ constructor(filePath) {
8
+ this.filePath = filePath;
9
+ }
10
+ async getDb() {
11
+ if (this.db) {
12
+ return this.db;
13
+ }
14
+ await mkdir(dirname(this.filePath), { recursive: true });
15
+ this.db = new Database(this.filePath);
16
+ this.db.exec(`
17
+ CREATE TABLE IF NOT EXISTS runs (
18
+ id TEXT PRIMARY KEY,
19
+ created_at TEXT NOT NULL,
20
+ target_provider TEXT NOT NULL,
21
+ target_model TEXT NOT NULL,
22
+ complexity TEXT NOT NULL,
23
+ rounds INTEGER NOT NULL,
24
+ requirement_title TEXT NOT NULL,
25
+ overall_score REAL NOT NULL,
26
+ dimension_scores TEXT NOT NULL,
27
+ ci95 TEXT NOT NULL,
28
+ agreement_level TEXT NOT NULL,
29
+ ija_score REAL,
30
+ evidence_chain TEXT
31
+ );
32
+
33
+ CREATE TABLE IF NOT EXISTS calibrations (
34
+ id TEXT PRIMARY KEY,
35
+ created_at TEXT NOT NULL,
36
+ recommended_complexity TEXT NOT NULL,
37
+ reason TEXT NOT NULL,
38
+ average_score REAL NOT NULL,
39
+ sample_size INTEGER NOT NULL
40
+ );
41
+ `);
42
+ this.ensureColumns(this.db);
43
+ return this.db;
44
+ }
45
+ ensureColumns(db) {
46
+ const rows = db.prepare("PRAGMA table_info(runs)").all();
47
+ const columnNames = new Set(rows.map((row) => row.name));
48
+ if (!columnNames.has("ija_score")) {
49
+ db.exec("ALTER TABLE runs ADD COLUMN ija_score REAL");
50
+ }
51
+ if (!columnNames.has("evidence_chain")) {
52
+ db.exec("ALTER TABLE runs ADD COLUMN evidence_chain TEXT");
53
+ }
54
+ }
55
+ mapRun(row) {
56
+ return {
57
+ id: String(row.id),
58
+ createdAt: String(row.created_at),
59
+ targetProvider: String(row.target_provider),
60
+ targetModel: String(row.target_model),
61
+ complexity: String(row.complexity),
62
+ rounds: Number(row.rounds),
63
+ requirementTitle: String(row.requirement_title),
64
+ overallScore: Number(row.overall_score),
65
+ dimensionScores: JSON.parse(String(row.dimension_scores)),
66
+ ci95: JSON.parse(String(row.ci95)),
67
+ agreementLevel: String(row.agreement_level),
68
+ ijaScore: typeof row.ija_score === "number" ? Number(row.ija_score) : undefined,
69
+ evidenceChain: row.evidence_chain ? JSON.parse(String(row.evidence_chain)) : undefined
70
+ };
71
+ }
72
+ close() {
73
+ if (this.db) {
74
+ this.db.close();
75
+ this.db = undefined;
76
+ }
77
+ }
78
+ async read() {
79
+ const runs = await this.listRuns();
80
+ const calibrations = await this.listCalibrations();
81
+ return { runs, calibrations };
82
+ }
83
+ async appendRun(run) {
84
+ const db = await this.getDb();
85
+ const statement = db.prepare(`
86
+ INSERT OR REPLACE INTO runs (
87
+ id,
88
+ created_at,
89
+ target_provider,
90
+ target_model,
91
+ complexity,
92
+ rounds,
93
+ requirement_title,
94
+ overall_score,
95
+ dimension_scores,
96
+ ci95,
97
+ agreement_level,
98
+ ija_score,
99
+ evidence_chain
100
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
101
+ `);
102
+ statement.run(run.id, run.createdAt, run.targetProvider, run.targetModel, run.complexity, run.rounds, run.requirementTitle, run.overallScore, JSON.stringify(run.dimensionScores), JSON.stringify(run.ci95), run.agreementLevel, run.ijaScore ?? null, run.evidenceChain ? JSON.stringify(run.evidenceChain) : null);
103
+ }
104
+ async listRuns() {
105
+ const db = await this.getDb();
106
+ const statement = db.prepare("SELECT id, created_at, target_provider, target_model, complexity, rounds, requirement_title, overall_score, dimension_scores, ci95, agreement_level, ija_score, evidence_chain FROM runs ORDER BY created_at DESC");
107
+ const rows = statement.all();
108
+ return rows.map((row) => this.mapRun(row));
109
+ }
110
+ async findRunById(runId) {
111
+ const db = await this.getDb();
112
+ const statement = db.prepare("SELECT id, created_at, target_provider, target_model, complexity, rounds, requirement_title, overall_score, dimension_scores, ci95, agreement_level, ija_score, evidence_chain FROM runs WHERE id = ?");
113
+ const row = statement.get(runId);
114
+ return row ? this.mapRun(row) : undefined;
115
+ }
116
+ async appendCalibration(snapshot) {
117
+ const db = await this.getDb();
118
+ const statement = db.prepare(`
119
+ INSERT OR REPLACE INTO calibrations (
120
+ id,
121
+ created_at,
122
+ recommended_complexity,
123
+ reason,
124
+ average_score,
125
+ sample_size
126
+ ) VALUES (?, ?, ?, ?, ?, ?)
127
+ `);
128
+ statement.run(snapshot.id, snapshot.createdAt, snapshot.recommendedComplexity, snapshot.reason, snapshot.averageScore, snapshot.sampleSize);
129
+ }
130
+ async listCalibrations() {
131
+ const db = await this.getDb();
132
+ const statement = db.prepare("SELECT id, created_at, recommended_complexity, reason, average_score, sample_size FROM calibrations ORDER BY created_at DESC");
133
+ const rows = statement.all();
134
+ return rows.map((row) => ({
135
+ id: String(row.id),
136
+ createdAt: String(row.created_at),
137
+ recommendedComplexity: String(row.recommended_complexity),
138
+ reason: String(row.reason),
139
+ averageScore: Number(row.average_score),
140
+ sampleSize: Number(row.sample_size)
141
+ }));
142
+ }
143
+ }
144
+ //# sourceMappingURL=local-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.js","sourceRoot":"","sources":["../src/local-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.test.d.ts","sourceRoot":"","sources":["../src/local-store.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { LocalStore } from "./local-store.js";
6
+ const tempDirs = [];
7
+ afterEach(async () => {
8
+ await Promise.all(tempDirs.splice(0, tempDirs.length).map((dir) => rm(dir, { recursive: true, force: true })));
9
+ });
10
+ describe("LocalStore", () => {
11
+ it("uses sqlite file format for persistence", async () => {
12
+ const dir = await mkdtemp(join(tmpdir(), "req2rank-store-"));
13
+ tempDirs.push(dir);
14
+ const dbPath = join(dir, "runs.db");
15
+ const store = new LocalStore(dbPath);
16
+ await store.appendRun({
17
+ id: "run-1",
18
+ createdAt: new Date("2026-01-01T00:00:00.000Z").toISOString(),
19
+ targetProvider: "openai",
20
+ targetModel: "gpt-4o-mini",
21
+ complexity: "C1",
22
+ rounds: 1,
23
+ requirementTitle: "demo",
24
+ overallScore: 80,
25
+ dimensionScores: {
26
+ functionalCompleteness: 80,
27
+ codeQuality: 80,
28
+ logicAccuracy: 80,
29
+ security: 80,
30
+ engineeringPractice: 80
31
+ },
32
+ ci95: [78, 82],
33
+ agreementLevel: "high",
34
+ ijaScore: 0.88,
35
+ evidenceChain: {
36
+ timeline: [
37
+ {
38
+ phase: "generate",
39
+ startedAt: "2026-01-01T00:00:00.000Z",
40
+ completedAt: "2026-01-01T00:00:01.000Z",
41
+ model: "system"
42
+ }
43
+ ],
44
+ samples: [{ roundIndex: 0, requirement: "demo", codeSubmission: "ok" }],
45
+ environment: { os: "win32", nodeVersion: "v22", timezone: "UTC" }
46
+ }
47
+ });
48
+ const content = await readFile(dbPath);
49
+ expect(content.subarray(0, 15).toString("utf-8")).toBe("SQLite format 3");
50
+ store.close();
51
+ });
52
+ it("supports append list and find", async () => {
53
+ const dir = await mkdtemp(join(tmpdir(), "req2rank-store-"));
54
+ tempDirs.push(dir);
55
+ const store = new LocalStore(join(dir, "runs.db"));
56
+ await store.appendRun({
57
+ id: "run-1",
58
+ createdAt: new Date("2026-01-01T00:00:00.000Z").toISOString(),
59
+ targetProvider: "openai",
60
+ targetModel: "gpt-4o-mini",
61
+ complexity: "C1",
62
+ rounds: 1,
63
+ requirementTitle: "demo-1",
64
+ overallScore: 80,
65
+ dimensionScores: {
66
+ functionalCompleteness: 80,
67
+ codeQuality: 80,
68
+ logicAccuracy: 80,
69
+ security: 80,
70
+ engineeringPractice: 80
71
+ },
72
+ ci95: [78, 82],
73
+ agreementLevel: "high",
74
+ ijaScore: 0.75
75
+ });
76
+ await store.appendRun({
77
+ id: "run-2",
78
+ createdAt: new Date("2026-01-02T00:00:00.000Z").toISOString(),
79
+ targetProvider: "anthropic",
80
+ targetModel: "claude-sonnet-4-20250514",
81
+ complexity: "C2",
82
+ rounds: 2,
83
+ requirementTitle: "demo-2",
84
+ overallScore: 88,
85
+ dimensionScores: {
86
+ functionalCompleteness: 88,
87
+ codeQuality: 88,
88
+ logicAccuracy: 88,
89
+ security: 88,
90
+ engineeringPractice: 88
91
+ },
92
+ ci95: [86, 90],
93
+ agreementLevel: "high",
94
+ ijaScore: 0.92
95
+ });
96
+ const runs = await store.listRuns();
97
+ expect(runs).toHaveLength(2);
98
+ expect(runs[0].id).toBe("run-2");
99
+ const found = await store.findRunById("run-1");
100
+ expect(found?.targetProvider).toBe("openai");
101
+ expect(found?.ijaScore).toBe(0.75);
102
+ await store.appendCalibration({
103
+ id: "cal-1",
104
+ createdAt: new Date("2026-01-03T00:00:00.000Z").toISOString(),
105
+ recommendedComplexity: "C2",
106
+ reason: "Average score supports C2",
107
+ averageScore: 84,
108
+ sampleSize: 2
109
+ });
110
+ const calibrations = await store.listCalibrations();
111
+ expect(calibrations).toHaveLength(1);
112
+ expect(calibrations[0]?.recommendedComplexity).toBe("C2");
113
+ store.close();
114
+ });
115
+ });
116
+ //# sourceMappingURL=local-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-store.test.js","sourceRoot":"","sources":["../src/local-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pipeline-stage-handoff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-stage-handoff.test.d.ts","sourceRoot":"","sources":["../src/pipeline-stage-handoff.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,290 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { EvaluationPanel, ExecutionEngine, PipelineOrchestrator, ScoringEngine } from "./index.js";
3
+ class FakeExecutionEngine extends ExecutionEngine {
4
+ called = 0;
5
+ async execute() {
6
+ this.called += 1;
7
+ return {
8
+ code: "export const ok = true;",
9
+ language: "typescript",
10
+ timeoutMs: 30_000,
11
+ maxTokens: 4_096
12
+ };
13
+ }
14
+ }
15
+ class FakeEvaluationPanel extends EvaluationPanel {
16
+ called = 0;
17
+ async evaluate(requirement, execution) {
18
+ this.called += 1;
19
+ expect(requirement.title.length).toBeGreaterThan(0);
20
+ expect(execution.code).toContain("ok");
21
+ return [
22
+ {
23
+ judgeId: "judge-1",
24
+ dimensions: {
25
+ functionalCompleteness: 88,
26
+ codeQuality: 84,
27
+ logicAccuracy: 90,
28
+ security: 80,
29
+ engineeringPractice: 85
30
+ }
31
+ }
32
+ ];
33
+ }
34
+ }
35
+ class FakeScoringEngine extends ScoringEngine {
36
+ called = 0;
37
+ score(results) {
38
+ this.called += 1;
39
+ expect(results.length).toBe(1);
40
+ return {
41
+ overallScore: 87,
42
+ dimensionScores: {
43
+ functionalCompleteness: 88,
44
+ codeQuality: 84,
45
+ logicAccuracy: 90,
46
+ security: 80,
47
+ engineeringPractice: 85
48
+ },
49
+ ci95: [84, 90],
50
+ agreementLevel: "high",
51
+ warnings: []
52
+ };
53
+ }
54
+ }
55
+ class FakeProvider {
56
+ id = "openai";
57
+ name = "Fake";
58
+ async chat() {
59
+ return {
60
+ content: JSON.stringify({
61
+ title: "Req",
62
+ description: "desc",
63
+ functionalRequirements: [
64
+ {
65
+ id: "FR-1",
66
+ description: "Do thing",
67
+ acceptanceCriteria: "Done",
68
+ priority: "must"
69
+ },
70
+ {
71
+ id: "FR-2",
72
+ description: "Handle error",
73
+ acceptanceCriteria: "Errors handled",
74
+ priority: "must"
75
+ }
76
+ ],
77
+ constraints: ["Use TS"],
78
+ expectedDeliverables: ["source"],
79
+ evaluationGuidance: {
80
+ keyDifferentiators: ["quality"],
81
+ commonPitfalls: ["bugs"],
82
+ edgeCases: ["empty"]
83
+ },
84
+ selfReviewPassed: true
85
+ }),
86
+ usage: { promptTokens: 1, completionTokens: 1 },
87
+ latencyMs: 1
88
+ };
89
+ }
90
+ }
91
+ class InMemoryCheckpointStore {
92
+ checkpoints = new Map();
93
+ async load(key) {
94
+ return this.checkpoints.get(key);
95
+ }
96
+ async save(key, checkpoint) {
97
+ this.checkpoints.set(key, checkpoint);
98
+ }
99
+ async clear(key) {
100
+ this.checkpoints.delete(key);
101
+ }
102
+ }
103
+ class FailingExecutionEngine extends ExecutionEngine {
104
+ called = 0;
105
+ async execute() {
106
+ this.called += 1;
107
+ if (this.called === 2) {
108
+ throw new Error("synthetic crash");
109
+ }
110
+ return {
111
+ code: "export const ok = true;",
112
+ language: "typescript",
113
+ timeoutMs: 30_000,
114
+ maxTokens: 4_096
115
+ };
116
+ }
117
+ }
118
+ class TimeoutExecutionEngine extends ExecutionEngine {
119
+ async execute() {
120
+ const timeoutError = new Error("network timeout");
121
+ timeoutError.name = "TimeoutError";
122
+ throw timeoutError;
123
+ }
124
+ }
125
+ describe("PipelineOrchestrator stage handoff", () => {
126
+ it("passes execute -> evaluate -> score and returns dimension scores", async () => {
127
+ const execution = new FakeExecutionEngine();
128
+ const evaluation = new FakeEvaluationPanel();
129
+ const scoring = new FakeScoringEngine();
130
+ const provider = new FakeProvider();
131
+ const providerFactory = () => provider;
132
+ const orchestrator = new PipelineOrchestrator(undefined, execution, evaluation, scoring, providerFactory);
133
+ const run = await orchestrator.run({
134
+ config: {
135
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
136
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
137
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
138
+ test: { complexity: "C1", rounds: 1, concurrency: 1 }
139
+ }
140
+ });
141
+ expect(execution.called).toBe(1);
142
+ expect(evaluation.called).toBe(1);
143
+ expect(scoring.called).toBe(1);
144
+ expect(run.overallScore).toBe(87);
145
+ expect(run.dimensionScores.logicAccuracy).toBe(90);
146
+ expect(run.ci95[0]).toBe(87);
147
+ expect(run.agreementLevel).toBe("high");
148
+ expect(run.evidenceChain?.samples[0]?.codeSubmission).toContain("ok");
149
+ expect(run.evidenceChain?.timeline).toHaveLength(4);
150
+ });
151
+ it("honors rounds configuration and aggregates multiple rounds", async () => {
152
+ const execution = new FakeExecutionEngine();
153
+ const evaluation = new FakeEvaluationPanel();
154
+ const scoring = new FakeScoringEngine();
155
+ const provider = new FakeProvider();
156
+ const providerFactory = () => provider;
157
+ const orchestrator = new PipelineOrchestrator(undefined, execution, evaluation, scoring, providerFactory);
158
+ const run = await orchestrator.run({
159
+ config: {
160
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
161
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
162
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
163
+ test: { complexity: "C1", rounds: 3, concurrency: 2 }
164
+ }
165
+ });
166
+ expect(execution.called).toBe(3);
167
+ expect(evaluation.called).toBe(3);
168
+ expect(scoring.called).toBe(3);
169
+ expect(run.rounds).toBe(3);
170
+ expect(run.overallScore).toBe(87);
171
+ });
172
+ it("supports checkpoint resume after mid-run failure", async () => {
173
+ const checkpointStore = new InMemoryCheckpointStore();
174
+ const checkpointKey = "pipeline-checkpoint-1";
175
+ const crashingExecution = new FailingExecutionEngine();
176
+ const evaluation = new FakeEvaluationPanel();
177
+ const scoring = new FakeScoringEngine();
178
+ const provider = new FakeProvider();
179
+ const providerFactory = () => provider;
180
+ const firstOrchestrator = new PipelineOrchestrator(undefined, crashingExecution, evaluation, scoring, providerFactory);
181
+ await expect(firstOrchestrator.run({
182
+ config: {
183
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
184
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
185
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
186
+ test: { complexity: "C1", rounds: 3, concurrency: 1 }
187
+ },
188
+ checkpoint: {
189
+ key: checkpointKey,
190
+ store: checkpointStore
191
+ }
192
+ })).rejects.toThrow("synthetic crash");
193
+ const savedCheckpoint = await checkpointStore.load(checkpointKey);
194
+ expect(savedCheckpoint).toBeDefined();
195
+ expect(savedCheckpoint?.completedRounds.length).toBe(1);
196
+ const resumedExecution = new FakeExecutionEngine();
197
+ const secondOrchestrator = new PipelineOrchestrator(undefined, resumedExecution, evaluation, scoring, providerFactory);
198
+ const resumedRun = await secondOrchestrator.run({
199
+ config: {
200
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
201
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
202
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
203
+ test: { complexity: "C1", rounds: 3, concurrency: 1 }
204
+ },
205
+ checkpoint: {
206
+ key: checkpointKey,
207
+ store: checkpointStore
208
+ }
209
+ });
210
+ expect(resumedExecution.called).toBe(2);
211
+ expect(resumedRun.rounds).toBe(3);
212
+ expect(resumedRun.overallScore).toBe(87);
213
+ expect(await checkpointStore.load(checkpointKey)).toBeUndefined();
214
+ });
215
+ it("marks timeout rounds as zero score instead of crashing run", async () => {
216
+ const execution = new TimeoutExecutionEngine();
217
+ const evaluation = new FakeEvaluationPanel();
218
+ const scoring = new FakeScoringEngine();
219
+ const provider = new FakeProvider();
220
+ const providerFactory = () => provider;
221
+ const orchestrator = new PipelineOrchestrator(undefined, execution, evaluation, scoring, providerFactory);
222
+ const run = await orchestrator.run({
223
+ config: {
224
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
225
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
226
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
227
+ test: { complexity: "C1", rounds: 1, concurrency: 1 }
228
+ }
229
+ });
230
+ expect(run.overallScore).toBe(0);
231
+ expect(run.dimensionScores.logicAccuracy).toBe(0);
232
+ expect(run.requirementTitle.toLowerCase()).toContain("failed");
233
+ });
234
+ it("marks sandbox validation failures as recoverable round failures", async () => {
235
+ const execution = new FakeExecutionEngine();
236
+ const evaluation = new FakeEvaluationPanel();
237
+ const scoring = new FakeScoringEngine();
238
+ const provider = new FakeProvider();
239
+ const providerFactory = () => provider;
240
+ const orchestrator = new PipelineOrchestrator(undefined, execution, evaluation, scoring, providerFactory);
241
+ const run = await orchestrator.run({
242
+ config: {
243
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
244
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
245
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
246
+ test: { complexity: "C1", rounds: 1, concurrency: 1 }
247
+ },
248
+ sandbox: {
249
+ enabled: true,
250
+ strict: true,
251
+ runner: async () => {
252
+ throw new Error("sandbox rejected generated code");
253
+ }
254
+ }
255
+ });
256
+ expect(run.overallScore).toBe(0);
257
+ expect(run.requirementTitle.toLowerCase()).toContain("failed");
258
+ });
259
+ it("emits stage progress events during run", async () => {
260
+ const execution = new FakeExecutionEngine();
261
+ const evaluation = new FakeEvaluationPanel();
262
+ const scoring = new FakeScoringEngine();
263
+ const provider = new FakeProvider();
264
+ const providerFactory = () => provider;
265
+ const events = [];
266
+ const orchestrator = new PipelineOrchestrator(undefined, execution, evaluation, scoring, providerFactory);
267
+ await orchestrator.run({
268
+ config: {
269
+ target: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
270
+ systemModel: { provider: "openai", model: "gpt-4o-mini", apiKey: "k" },
271
+ judges: [{ provider: "openai", model: "gpt-4o", apiKey: "k", weight: 1 }],
272
+ test: { complexity: "C1", rounds: 1, concurrency: 1 }
273
+ },
274
+ onProgress: (event) => {
275
+ events.push(`${event.phase}:${event.state}`);
276
+ }
277
+ });
278
+ expect(events).toEqual([
279
+ "generate:started",
280
+ "generate:completed",
281
+ "execute:started",
282
+ "execute:completed",
283
+ "evaluate:started",
284
+ "evaluate:completed",
285
+ "score:started",
286
+ "score:completed"
287
+ ]);
288
+ });
289
+ });
290
+ //# sourceMappingURL=pipeline-stage-handoff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline-stage-handoff.test.js","sourceRoot":"","sources":["../src/pipeline-stage-handoff.test.ts"],"names":[],"mappings":"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"}