@stackmemoryai/stackmemory 1.5.3 → 1.5.4
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.
- package/dist/src/cli/commands/orchestrate.js +7 -2
- package/dist/src/cli/commands/orchestrator.js +189 -4
- package/package.json +1 -1
- package/scripts/gepa/.before-optimize.md +89 -53
- package/scripts/gepa/generations/gen-000/baseline.md +8 -0
- package/scripts/gepa/generations/gen-001/baseline.md +8 -0
- package/scripts/gepa/generations/gen-001/variant-a.md +81 -81
- package/scripts/gepa/generations/gen-001/variant-b.md +78 -64
- package/scripts/gepa/generations/gen-001/variant-c.md +54 -74
- package/scripts/gepa/generations/gen-001/variant-d.md +79 -113
- package/scripts/gepa/results/eval-1-baseline.json +74 -74
- package/scripts/gepa/results/eval-1-variant-a.json +64 -64
- package/scripts/gepa/results/eval-1-variant-b.json +65 -65
- package/scripts/gepa/results/eval-1-variant-c.json +78 -58
- package/scripts/gepa/results/eval-1-variant-d.json +77 -57
- package/scripts/gepa/state.json +14 -14
|
@@ -6,25 +6,25 @@
|
|
|
6
6
|
"taskId": "eval-001",
|
|
7
7
|
"taskName": "simple_function",
|
|
8
8
|
"weight": 1,
|
|
9
|
-
"passed":
|
|
10
|
-
"passRate": 0,
|
|
9
|
+
"passed": true,
|
|
10
|
+
"passRate": 0.6666666666666666,
|
|
11
11
|
"criteria": {
|
|
12
12
|
"has_function": {
|
|
13
|
-
"passed":
|
|
14
|
-
"reason": "
|
|
13
|
+
"passed": true,
|
|
14
|
+
"reason": "A complete, working TypeScript function named isPalindrome is defined with proper syntax and logic"
|
|
15
15
|
},
|
|
16
16
|
"handles_edge_cases": {
|
|
17
|
-
"passed":
|
|
18
|
-
"reason": "
|
|
17
|
+
"passed": true,
|
|
18
|
+
"reason": "The function handles edge cases by converting to lowercase, removing non-alphanumeric characters with regex, and properly comparing the cleaned string with its reverse"
|
|
19
19
|
},
|
|
20
20
|
"is_tested": {
|
|
21
21
|
"passed": false,
|
|
22
|
-
"reason": "
|
|
22
|
+
"reason": "No test cases, test assertions, or test suite is provided in the output"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"judgeMode": "llm",
|
|
26
|
-
"duration":
|
|
27
|
-
"output": "
|
|
26
|
+
"duration": 7677,
|
|
27
|
+
"output": "```typescript\nfunction isPalindrome(s: string): boolean {\n const clean = s.toLowerCase().replace(/[^a-z0-9]/g, '');\n return clean === clean.split('').reverse().join('');\n}\n```\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"taskId": "eval-002",
|
|
@@ -35,20 +35,20 @@
|
|
|
35
35
|
"criteria": {
|
|
36
36
|
"uses_async": {
|
|
37
37
|
"passed": false,
|
|
38
|
-
"reason": "No async/await code
|
|
38
|
+
"reason": "No async/await code was provided. The output is a request for input rather than a refactored code example."
|
|
39
39
|
},
|
|
40
40
|
"preserves_behavior": {
|
|
41
41
|
"passed": false,
|
|
42
|
-
"reason": "No refactored code
|
|
42
|
+
"reason": "No refactored code was provided to verify that behavior is preserved."
|
|
43
43
|
},
|
|
44
44
|
"no_nested_callbacks": {
|
|
45
45
|
"passed": false,
|
|
46
|
-
"reason": "No code
|
|
46
|
+
"reason": "No refactored code was provided to demonstrate elimination of nested callbacks."
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"judgeMode": "llm",
|
|
50
|
-
"duration":
|
|
51
|
-
"output": "
|
|
50
|
+
"duration": 8113,
|
|
51
|
+
"output": "Which file or code snippet would you like me to refactor? Please share the file path or paste the code.\n"
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"taskId": "eval-003",
|
|
@@ -59,160 +59,160 @@
|
|
|
59
59
|
"criteria": {
|
|
60
60
|
"bug_fixed": {
|
|
61
61
|
"passed": false,
|
|
62
|
-
"reason": "No
|
|
62
|
+
"reason": "No code was provided to the AI, so no bug could be fixed. The AI correctly identified the missing input but did not fix any actual bug."
|
|
63
63
|
},
|
|
64
64
|
"no_new_bugs": {
|
|
65
65
|
"passed": true,
|
|
66
|
-
"reason": "
|
|
66
|
+
"reason": "The AI did not write any code, so no new bugs were introduced."
|
|
67
67
|
},
|
|
68
68
|
"explains_fix": {
|
|
69
69
|
"passed": false,
|
|
70
|
-
"reason": "No
|
|
70
|
+
"reason": "No fix was explained because no code was provided. The AI only asked for the code to be shared."
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"judgeMode": "llm",
|
|
74
|
-
"duration":
|
|
75
|
-
"output": "I'
|
|
74
|
+
"duration": 8142,
|
|
75
|
+
"output": "I don't see any code or file provided. Could you share the code with the loop you'd like me to fix?\n"
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"taskId": "eval-004",
|
|
79
79
|
"taskName": "add_feature",
|
|
80
80
|
"weight": 1.5,
|
|
81
81
|
"passed": false,
|
|
82
|
-
"passRate": 0
|
|
82
|
+
"passRate": 0,
|
|
83
83
|
"criteria": {
|
|
84
84
|
"has_pagination": {
|
|
85
|
-
"passed":
|
|
86
|
-
"reason": "
|
|
85
|
+
"passed": false,
|
|
86
|
+
"reason": "No pagination code is implemented. The AI only asks for clarification instead of providing a solution."
|
|
87
87
|
},
|
|
88
88
|
"has_limit": {
|
|
89
|
-
"passed":
|
|
90
|
-
"reason": "
|
|
89
|
+
"passed": false,
|
|
90
|
+
"reason": "No limit parameter is defined or implemented in the output."
|
|
91
91
|
},
|
|
92
92
|
"has_offset": {
|
|
93
93
|
"passed": false,
|
|
94
|
-
"reason": "
|
|
94
|
+
"reason": "No offset parameter is defined or implemented in the output."
|
|
95
95
|
},
|
|
96
96
|
"backwards_compatible": {
|
|
97
97
|
"passed": false,
|
|
98
|
-
"reason": "No
|
|
98
|
+
"reason": "No code is provided to evaluate backward compatibility. The output is a question, not an implementation."
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
101
|
"judgeMode": "llm",
|
|
102
|
-
"duration":
|
|
103
|
-
"output": "
|
|
102
|
+
"duration": 11208,
|
|
103
|
+
"output": "Which API endpoint should I add pagination to? Please share the file path or describe the endpoint.\n"
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
"taskId": "eval-005",
|
|
107
107
|
"taskName": "code_review",
|
|
108
108
|
"weight": 1.3,
|
|
109
|
-
"passed":
|
|
110
|
-
"passRate": 0
|
|
109
|
+
"passed": false,
|
|
110
|
+
"passRate": 0,
|
|
111
111
|
"criteria": {
|
|
112
112
|
"identifies_security_issue": {
|
|
113
|
-
"passed":
|
|
114
|
-
"reason": "The output
|
|
113
|
+
"passed": false,
|
|
114
|
+
"reason": "The AI output does not review any PR or identify any security issues. It only requests the PR details."
|
|
115
115
|
},
|
|
116
116
|
"identifies_performance_issue": {
|
|
117
117
|
"passed": false,
|
|
118
|
-
"reason": "The output does not
|
|
118
|
+
"reason": "The AI output does not review any PR or identify any performance issues. It only requests the PR details."
|
|
119
119
|
},
|
|
120
120
|
"actionable_feedback": {
|
|
121
|
-
"passed":
|
|
122
|
-
"reason": "The output provides
|
|
121
|
+
"passed": false,
|
|
122
|
+
"reason": "The AI output provides no feedback on code, only asks for a PR to review. No actionable suggestions are provided."
|
|
123
123
|
}
|
|
124
124
|
},
|
|
125
125
|
"judgeMode": "llm",
|
|
126
|
-
"duration":
|
|
127
|
-
"output": "
|
|
126
|
+
"duration": 12081,
|
|
127
|
+
"output": "Which PR would you like me to review? Please provide the PR number, URL, or branch name.\n"
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
"taskId": "sm-001",
|
|
131
131
|
"taskName": "add_mcp_tool_handler",
|
|
132
132
|
"weight": 1.5,
|
|
133
|
-
"passed":
|
|
134
|
-
"passRate":
|
|
133
|
+
"passed": true,
|
|
134
|
+
"passRate": 1,
|
|
135
135
|
"criteria": {
|
|
136
136
|
"has_switch_case": {
|
|
137
|
-
"passed":
|
|
138
|
-
"reason": "
|
|
137
|
+
"passed": true,
|
|
138
|
+
"reason": "Code includes a case statement 'get_frame_summary' within what appears to be a switch/case dispatch pattern"
|
|
139
139
|
},
|
|
140
140
|
"has_zod_schema": {
|
|
141
|
-
"passed":
|
|
142
|
-
"reason": "
|
|
141
|
+
"passed": true,
|
|
142
|
+
"reason": "Zod schema is defined inline: z.object({ frameId: z.string().min(1) })"
|
|
143
143
|
},
|
|
144
144
|
"validates_input": {
|
|
145
|
-
"passed":
|
|
146
|
-
"reason": "
|
|
145
|
+
"passed": true,
|
|
146
|
+
"reason": "Input validation occurs via z.object().parse(args), which will throw if validation fails"
|
|
147
147
|
},
|
|
148
148
|
"returns_typed_response": {
|
|
149
|
-
"passed":
|
|
150
|
-
"reason": "
|
|
149
|
+
"passed": true,
|
|
150
|
+
"reason": "Returns an object with all required fields: frameId, name, status, eventCount matching the specified return type"
|
|
151
151
|
},
|
|
152
152
|
"handles_not_found": {
|
|
153
|
-
"passed":
|
|
154
|
-
"reason": "
|
|
153
|
+
"passed": true,
|
|
154
|
+
"reason": "Code checks if frame exists and throws an error with descriptive message if not found"
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
"judgeMode": "llm",
|
|
158
|
-
"duration":
|
|
159
|
-
"output": "
|
|
158
|
+
"duration": 27658,
|
|
159
|
+
"output": "Please approve the file write to add the handler. The change replaces the `// TODO` comment with:\n\n```typescript\ncase 'get_frame_summary': {\n const input = z.object({ frameId: z.string().min(1) }).parse(args);\n const frame = frames.get(input.frameId);\n if (!frame) throw new Error(`Frame not found: ${input.frameId}`);\n return { frameId: frame.id, name: frame.name, status: frame.status, eventCount: frame.events.length };\n}\n```\n"
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
162
|
"taskId": "sm-002",
|
|
163
163
|
"taskName": "fix_fts5_trigger_bug",
|
|
164
164
|
"weight": 1.8,
|
|
165
|
-
"passed":
|
|
166
|
-
"passRate":
|
|
165
|
+
"passed": true,
|
|
166
|
+
"passRate": 1,
|
|
167
167
|
"criteria": {
|
|
168
168
|
"has_delete_trigger": {
|
|
169
|
-
"passed":
|
|
170
|
-
"reason": "
|
|
169
|
+
"passed": true,
|
|
170
|
+
"reason": "A DELETE trigger named 'frames_ad' is defined with AFTER DELETE ON frames syntax, creating an actual trigger that will execute on row deletion."
|
|
171
171
|
},
|
|
172
172
|
"uses_fts_delete_syntax": {
|
|
173
|
-
"passed":
|
|
174
|
-
"reason": "
|
|
173
|
+
"passed": true,
|
|
174
|
+
"reason": "The trigger uses the FTS5 external content delete syntax: INSERT INTO frames_fts with the special 'delete' command as the first value, which is the correct way to remove entries from an FTS5 index."
|
|
175
175
|
},
|
|
176
176
|
"references_old_row": {
|
|
177
|
-
"passed":
|
|
178
|
-
"reason": "
|
|
177
|
+
"passed": true,
|
|
178
|
+
"reason": "The trigger correctly references old.rowid, old.name, old.digest_text, and old.inputs, old.outputs to capture the deleted row's values before deletion."
|
|
179
179
|
},
|
|
180
180
|
"matches_column_list": {
|
|
181
|
-
"passed":
|
|
182
|
-
"reason": "The
|
|
181
|
+
"passed": true,
|
|
182
|
+
"reason": "The column list (name, digest_text, inputs, outputs) matches the FTS5 indexed columns and follows the same pattern as the existing INSERT and UPDATE triggers shown in the task description."
|
|
183
183
|
}
|
|
184
184
|
},
|
|
185
185
|
"judgeMode": "llm",
|
|
186
|
-
"duration":
|
|
187
|
-
"output": "
|
|
186
|
+
"duration": 28714,
|
|
187
|
+
"output": "Waiting for your approval to write to `fts5-triggers.sql`. The change replaces the bug comment with:\n\n```sql\n-- Sync trigger: DELETE\nCREATE TRIGGER IF NOT EXISTS frames_ad AFTER DELETE ON frames BEGIN\n INSERT INTO frames_fts(frames_fts, rowid, name, digest_text, inputs, outputs)\n VALUES ('delete', old.rowid, old.name, old.digest_text, old.inputs, old.outputs);\nEND;\n```\n\nThis follows the FTS5 external content pattern — the `'delete'` command removes the row from the index using the `old.*` values, matching the first half of the UPDATE trigger.\n"
|
|
188
188
|
},
|
|
189
189
|
{
|
|
190
190
|
"taskId": "sm-003",
|
|
191
191
|
"taskName": "daemon_service_lifecycle",
|
|
192
192
|
"weight": 1.5,
|
|
193
|
-
"passed":
|
|
194
|
-
"passRate":
|
|
193
|
+
"passed": true,
|
|
194
|
+
"passRate": 1,
|
|
195
195
|
"criteria": {
|
|
196
196
|
"clears_old_interval": {
|
|
197
|
-
"passed":
|
|
198
|
-
"reason": "The
|
|
197
|
+
"passed": true,
|
|
198
|
+
"reason": "The start() method includes `if (this.intervalId) { clearInterval(this.intervalId); this.intervalId = undefined; }` which explicitly clears any existing interval before creating a new one."
|
|
199
199
|
},
|
|
200
200
|
"prevents_double_start": {
|
|
201
201
|
"passed": true,
|
|
202
|
-
"reason": "The
|
|
202
|
+
"reason": "The guard in start() that clears the existing intervalId before creating a new one prevents the timer leak when start() is called while already running."
|
|
203
203
|
},
|
|
204
204
|
"has_getstate_method": {
|
|
205
|
-
"passed":
|
|
206
|
-
"reason": "
|
|
205
|
+
"passed": true,
|
|
206
|
+
"reason": "A getState() method is defined that returns a ServiceState object with the required properties."
|
|
207
207
|
},
|
|
208
208
|
"returns_correct_state_shape": {
|
|
209
|
-
"passed":
|
|
210
|
-
"reason": "
|
|
209
|
+
"passed": true,
|
|
210
|
+
"reason": "The getState() method returns an object with all four required properties: isRunning, intervalMs (calculated correctly), lastRunTime, and errorCount."
|
|
211
211
|
}
|
|
212
212
|
},
|
|
213
213
|
"judgeMode": "llm",
|
|
214
|
-
"duration":
|
|
215
|
-
"output": "
|
|
214
|
+
"duration": 38931,
|
|
215
|
+
"output": "It seems write permission hasn't been granted. Please approve the file write when prompted, then I can apply both changes. Here's exactly what I'll do:\n\n**Fix 1 — `start()` guard** (lines 25-37): Clear any existing interval before creating a new one, removing the stale comment:\n\n```ts\nstart(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = undefined;\n }\n this.isRunning = true;\n const intervalMs = this.config.interval * 60 * 1000;\n\n this.doWork(); // initial run\n\n this.intervalId = setInterval(() => {\n this.doWork();\n }, intervalMs);\n}\n```\n\nThis fixes both the double-`start()` leak and `updateConfig()`'s stop→start path — `stop()` already clears `intervalId`, but now `start()` is also safe if called directly while running.\n\n**Fix 2 — remove stale `updateConfig` comment + add `getState()`** (lines 47-57):\n\n```ts\nupdateConfig(config: Partial<ServiceConfig>): void {\n const wasRunning = this.isRunning;\n if (wasRunning) this.stop();\n this.config = { ...this.config, ...config };\n if (wasRunning && this.config.enabled) this.start();\n}\n\ngetState(): ServiceState {\n return {\n isRunning: this.isRunning,\n intervalMs: this.config.interval * 60 * 1000,\n lastRunTime: this.lastRunTime,\n errorCount: this.errorCount,\n };\n}\n```\n\nOnce you grant write access I'll apply both edits. The root fix is in `start()` — making it idempotent means `updateConfig()` is also correct regardless of `stop()`'s state.\n"
|
|
216
216
|
}
|
|
217
217
|
]
|
|
218
218
|
}
|
|
@@ -6,25 +6,25 @@
|
|
|
6
6
|
"taskId": "eval-001",
|
|
7
7
|
"taskName": "simple_function",
|
|
8
8
|
"weight": 1,
|
|
9
|
-
"passed":
|
|
10
|
-
"passRate": 0,
|
|
9
|
+
"passed": true,
|
|
10
|
+
"passRate": 0.6666666666666666,
|
|
11
11
|
"criteria": {
|
|
12
12
|
"has_function": {
|
|
13
|
-
"passed":
|
|
14
|
-
"reason": "
|
|
13
|
+
"passed": true,
|
|
14
|
+
"reason": "A real, working function named isPalindrome is defined with proper TypeScript syntax and implementation"
|
|
15
15
|
},
|
|
16
16
|
"handles_edge_cases": {
|
|
17
|
-
"passed":
|
|
18
|
-
"reason": "
|
|
17
|
+
"passed": true,
|
|
18
|
+
"reason": "The code handles edge cases by converting to lowercase, removing non-alphanumeric characters, and comparing cleaned strings - covers cases like mixed case, spaces, and punctuation"
|
|
19
19
|
},
|
|
20
20
|
"is_tested": {
|
|
21
21
|
"passed": false,
|
|
22
|
-
"reason": "
|
|
22
|
+
"reason": "No test cases or test calls are provided in the output; only the function definition exists without any testing code"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"judgeMode": "llm",
|
|
26
|
-
"duration":
|
|
27
|
-
"output": "
|
|
26
|
+
"duration": 8242,
|
|
27
|
+
"output": "```typescript\nfunction isPalindrome(s: string): boolean {\n const cleaned = s.toLowerCase().replace(/[^a-z0-9]/g, '');\n return cleaned === cleaned.split('').reverse().join('');\n}\n```\n"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"taskId": "eval-002",
|
|
@@ -35,20 +35,20 @@
|
|
|
35
35
|
"criteria": {
|
|
36
36
|
"uses_async": {
|
|
37
37
|
"passed": false,
|
|
38
|
-
"reason": "No async/await code
|
|
38
|
+
"reason": "No async/await code is present in the output. The AI only asks for clarification instead of providing refactored code."
|
|
39
39
|
},
|
|
40
40
|
"preserves_behavior": {
|
|
41
41
|
"passed": false,
|
|
42
|
-
"reason": "
|
|
42
|
+
"reason": "No refactored code was provided, so behavior cannot be preserved or verified."
|
|
43
43
|
},
|
|
44
44
|
"no_nested_callbacks": {
|
|
45
45
|
"passed": false,
|
|
46
|
-
"reason": "No
|
|
46
|
+
"reason": "No code was refactored at all. The output is a request for input rather than a solution."
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"judgeMode": "llm",
|
|
50
|
-
"duration":
|
|
51
|
-
"output": "
|
|
50
|
+
"duration": 8332,
|
|
51
|
+
"output": "Which file or code snippet would you like me to refactor?\n"
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"taskId": "eval-003",
|
|
@@ -59,72 +59,72 @@
|
|
|
59
59
|
"criteria": {
|
|
60
60
|
"bug_fixed": {
|
|
61
61
|
"passed": false,
|
|
62
|
-
"reason": "No code was
|
|
62
|
+
"reason": "No code was fixed; the AI requested clarification instead of fixing the bug"
|
|
63
63
|
},
|
|
64
64
|
"no_new_bugs": {
|
|
65
65
|
"passed": false,
|
|
66
|
-
"reason": "
|
|
66
|
+
"reason": "No code was provided to evaluate for new bugs"
|
|
67
67
|
},
|
|
68
68
|
"explains_fix": {
|
|
69
69
|
"passed": false,
|
|
70
|
-
"reason": "No explanation was provided; the
|
|
70
|
+
"reason": "No explanation of any fix was provided; the AI only asked for more information"
|
|
71
71
|
}
|
|
72
72
|
},
|
|
73
73
|
"judgeMode": "llm",
|
|
74
|
-
"duration":
|
|
75
|
-
"output": "
|
|
74
|
+
"duration": 9222,
|
|
75
|
+
"output": "Could you point me to the file and loop you'd like me to fix? Or share the relevant code snippet?\n"
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"taskId": "eval-004",
|
|
79
79
|
"taskName": "add_feature",
|
|
80
80
|
"weight": 1.5,
|
|
81
|
-
"passed":
|
|
82
|
-
"passRate": 0
|
|
81
|
+
"passed": false,
|
|
82
|
+
"passRate": 0,
|
|
83
83
|
"criteria": {
|
|
84
84
|
"has_pagination": {
|
|
85
|
-
"passed":
|
|
86
|
-
"reason": "
|
|
85
|
+
"passed": false,
|
|
86
|
+
"reason": "No pagination code is implemented. The AI only asks for clarification instead of providing a working solution."
|
|
87
87
|
},
|
|
88
88
|
"has_limit": {
|
|
89
|
-
"passed":
|
|
90
|
-
"reason": "
|
|
89
|
+
"passed": false,
|
|
90
|
+
"reason": "No limit parameter is defined or implemented in the output."
|
|
91
91
|
},
|
|
92
92
|
"has_offset": {
|
|
93
93
|
"passed": false,
|
|
94
|
-
"reason": "
|
|
94
|
+
"reason": "No offset parameter is defined or implemented in the output."
|
|
95
95
|
},
|
|
96
96
|
"backwards_compatible": {
|
|
97
|
-
"passed":
|
|
98
|
-
"reason": "
|
|
97
|
+
"passed": false,
|
|
98
|
+
"reason": "No code is provided to evaluate backwards compatibility. The output is a clarification request rather than a solution."
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
101
|
"judgeMode": "llm",
|
|
102
|
-
"duration":
|
|
103
|
-
"output": "
|
|
102
|
+
"duration": 9128,
|
|
103
|
+
"output": "Which API endpoint should I add pagination to? Please share the file path or endpoint name.\n"
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
"taskId": "eval-005",
|
|
107
107
|
"taskName": "code_review",
|
|
108
108
|
"weight": 1.3,
|
|
109
|
-
"passed":
|
|
110
|
-
"passRate": 0
|
|
109
|
+
"passed": false,
|
|
110
|
+
"passRate": 0,
|
|
111
111
|
"criteria": {
|
|
112
112
|
"identifies_security_issue": {
|
|
113
|
-
"passed":
|
|
114
|
-
"reason": "
|
|
113
|
+
"passed": false,
|
|
114
|
+
"reason": "The output does not identify any security issue. Instead, it asks for PR details and provides no analysis."
|
|
115
115
|
},
|
|
116
116
|
"identifies_performance_issue": {
|
|
117
117
|
"passed": false,
|
|
118
|
-
"reason": "
|
|
118
|
+
"reason": "The output does not identify any performance issue. It only requests information rather than providing a review."
|
|
119
119
|
},
|
|
120
120
|
"actionable_feedback": {
|
|
121
|
-
"passed":
|
|
122
|
-
"reason": "
|
|
121
|
+
"passed": false,
|
|
122
|
+
"reason": "The output provides no actionable feedback. It is a request for input, not a code review with concrete suggestions or findings."
|
|
123
123
|
}
|
|
124
124
|
},
|
|
125
125
|
"judgeMode": "llm",
|
|
126
|
-
"duration":
|
|
127
|
-
"output": "
|
|
126
|
+
"duration": 17368,
|
|
127
|
+
"output": "Which PR would you like me to review? Please share the PR URL, PR number, or branch name.\n"
|
|
128
128
|
},
|
|
129
129
|
{
|
|
130
130
|
"taskId": "sm-001",
|
|
@@ -135,28 +135,28 @@
|
|
|
135
135
|
"criteria": {
|
|
136
136
|
"has_switch_case": {
|
|
137
137
|
"passed": false,
|
|
138
|
-
"reason": "
|
|
138
|
+
"reason": "Only described in text; no actual switch/case code block is provided in the output"
|
|
139
139
|
},
|
|
140
140
|
"has_zod_schema": {
|
|
141
141
|
"passed": false,
|
|
142
|
-
"reason": "
|
|
142
|
+
"reason": "Schema is mentioned but not actually defined in code; only described as text"
|
|
143
143
|
},
|
|
144
144
|
"validates_input": {
|
|
145
145
|
"passed": false,
|
|
146
|
-
"reason": "
|
|
146
|
+
"reason": "Validation is discussed but no actual validation code is shown in the output"
|
|
147
147
|
},
|
|
148
148
|
"returns_typed_response": {
|
|
149
149
|
"passed": false,
|
|
150
|
-
"reason": "
|
|
150
|
+
"reason": "Return format is described but no actual return statement or typed response object is provided"
|
|
151
151
|
},
|
|
152
152
|
"handles_not_found": {
|
|
153
153
|
"passed": false,
|
|
154
|
-
"reason": "
|
|
154
|
+
"reason": "Error handling is mentioned ('throws if not found') but no actual try/catch or error handling code is shown"
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
"judgeMode": "llm",
|
|
158
|
-
"duration":
|
|
159
|
-
"output": "\n"
|
|
158
|
+
"duration": 28686,
|
|
159
|
+
"output": "Please approve the file write permission and I'll apply the change. The edit adds a `get_frame_summary` case between `close_frame` and `default` that:\n\n1. Validates `frameId` with `z.object({ frameId: z.string().min(1) })`\n2. Looks up the frame, throws if not found\n3. Returns `{ frameId, name, status, eventCount: frame.events.length }`\n"
|
|
160
160
|
},
|
|
161
161
|
{
|
|
162
162
|
"taskId": "sm-002",
|
|
@@ -167,52 +167,52 @@
|
|
|
167
167
|
"criteria": {
|
|
168
168
|
"has_delete_trigger": {
|
|
169
169
|
"passed": false,
|
|
170
|
-
"reason": "
|
|
170
|
+
"reason": "No DELETE trigger is provided in the output, only a request for permission"
|
|
171
171
|
},
|
|
172
172
|
"uses_fts_delete_syntax": {
|
|
173
173
|
"passed": false,
|
|
174
|
-
"reason": "No FTS5 DELETE syntax is present
|
|
174
|
+
"reason": "No FTS5 DELETE syntax is present in the output"
|
|
175
175
|
},
|
|
176
176
|
"references_old_row": {
|
|
177
177
|
"passed": false,
|
|
178
|
-
"reason": "
|
|
178
|
+
"reason": "No reference to OLD row values in any trigger code"
|
|
179
179
|
},
|
|
180
180
|
"matches_column_list": {
|
|
181
181
|
"passed": false,
|
|
182
|
-
"reason": "
|
|
182
|
+
"reason": "No column list or trigger definition is included in the output"
|
|
183
183
|
}
|
|
184
184
|
},
|
|
185
185
|
"judgeMode": "llm",
|
|
186
|
-
"duration":
|
|
187
|
-
"output": "
|
|
186
|
+
"duration": 37943,
|
|
187
|
+
"output": "Please approve the write permission so I can apply the fix.\n"
|
|
188
188
|
},
|
|
189
189
|
{
|
|
190
190
|
"taskId": "sm-003",
|
|
191
191
|
"taskName": "daemon_service_lifecycle",
|
|
192
192
|
"weight": 1.5,
|
|
193
|
-
"passed":
|
|
194
|
-
"passRate":
|
|
193
|
+
"passed": true,
|
|
194
|
+
"passRate": 1,
|
|
195
195
|
"criteria": {
|
|
196
196
|
"clears_old_interval": {
|
|
197
|
-
"passed":
|
|
198
|
-
"reason": "
|
|
197
|
+
"passed": true,
|
|
198
|
+
"reason": "The fix adds `if (this.isRunning) this.stop();` at the top of `start()`, which ensures any existing interval is cleared via `stop()` before a new one is created. This directly addresses the timer leak."
|
|
199
199
|
},
|
|
200
200
|
"prevents_double_start": {
|
|
201
|
-
"passed":
|
|
202
|
-
"reason": "
|
|
201
|
+
"passed": true,
|
|
202
|
+
"reason": "The guard `if (this.isRunning) this.stop();` prevents double-start by checking the running state and stopping the old interval before proceeding, making `start()` idempotent."
|
|
203
203
|
},
|
|
204
204
|
"has_getstate_method": {
|
|
205
|
-
"passed":
|
|
206
|
-
"reason": "
|
|
205
|
+
"passed": true,
|
|
206
|
+
"reason": "A complete `getState()` method is defined in the output that returns an object with the required properties. The method is shown as actual code, not just a TODO or mention."
|
|
207
207
|
},
|
|
208
208
|
"returns_correct_state_shape": {
|
|
209
|
-
"passed":
|
|
210
|
-
"reason": "
|
|
209
|
+
"passed": true,
|
|
210
|
+
"reason": "The `getState()` method returns an object with all four required properties: `isRunning`, `intervalMs`, `lastRunTime`, and `errorCount`. The intervalMs calculation matches the service's interval conversion logic."
|
|
211
211
|
}
|
|
212
212
|
},
|
|
213
213
|
"judgeMode": "llm",
|
|
214
|
-
"duration":
|
|
215
|
-
"output": "\n"
|
|
214
|
+
"duration": 39514,
|
|
215
|
+
"output": "It seems write permission isn't granted. Here are both changes needed — apply them manually or grant write access:\n\n**Fix 1 — `start()`: guard against double-start (lines 25–31)**\n\n```ts\n// Before\n// BUG: No guard against double-start — calling start() twice\n// creates two intervals but only stores the second one.\n// The first interval leaks and keeps running forever.\nstart(): void {\n this.isRunning = true;\n const intervalMs = this.config.interval * 60 * 1000;\n\n// After\nstart(): void {\n if (this.isRunning) this.stop();\n this.isRunning = true;\n const intervalMs = this.config.interval * 60 * 1000;\n```\n\n**Fix 2 — remove stale `updateConfig` comment and add `getState()` (lines 47–57)**\n\n```ts\n// Before\n// BUG: Calls stop() then start() but start() doesn't check\n// if already running, so if stop() fails to clear the interval\n// (e.g., intervalId is undefined), we leak.\nupdateConfig(config: Partial<ServiceConfig>): void {\n const wasRunning = this.isRunning;\n if (wasRunning) this.stop();\n this.config = { ...this.config, ...config };\n if (wasRunning && this.config.enabled) this.start();\n}\n\n// TODO: Add getState() method returning ServiceState\n\n// After\nupdateConfig(config: Partial<ServiceConfig>): void {\n const wasRunning = this.isRunning;\n if (wasRunning) this.stop();\n this.config = { ...this.config, ...config };\n if (wasRunning && this.config.enabled) this.start();\n}\n\ngetState(): ServiceState {\n return {\n isRunning: this.isRunning,\n intervalMs: this.config.interval * 60 * 1000,\n lastRunTime: this.lastRunTime,\n errorCount: this.errorCount,\n };\n}\n```\n\n---\n\n**Root cause:** `start()` unconditionally called `setInterval` without checking `isRunning`. Any call path that triggers `start()` while the service is already running (direct double-call, or `updateConfig` if `stop()` somehow left `isRunning = true`) would orphan the old interval — `intervalId` gets overwritten so `clearInterval` can never reach it.\n\n**The fix:** `if (this.isRunning) this.stop("
|
|
216
216
|
}
|
|
217
217
|
]
|
|
218
218
|
}
|