mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-23 03:18:09 +08:00
feat(ql3): compare bounded task run outcomes
This commit is contained in:
@@ -90,6 +90,44 @@ async function fixture(t) {
|
||||
priority: 1,
|
||||
createdAtMs: NOW - 3_000,
|
||||
});
|
||||
await transaction.insertRun({
|
||||
id: 'run-mcp-e2e-success',
|
||||
projectId: 'default',
|
||||
taskId: 'task-mcp',
|
||||
taskRevision: 'revision-3',
|
||||
taskName: 'MCP successful baseline',
|
||||
triggerType: 'manual',
|
||||
executionOrigin: 'manual',
|
||||
executionOwner: 'runtime',
|
||||
triggeredBy: 'user:mcp-owner',
|
||||
status: 'succeeded',
|
||||
version: 0,
|
||||
eventSequence: 0,
|
||||
priority: 0,
|
||||
createdAtMs: NOW - 4_000,
|
||||
queuedAtMs: NOW - 3_900,
|
||||
startedAtMs: NOW - 3_800,
|
||||
finishedAtMs: NOW - 3_600,
|
||||
});
|
||||
await transaction.insertRun({
|
||||
id: 'run-mcp-e2e-failure',
|
||||
projectId: 'default',
|
||||
taskId: 'task-mcp',
|
||||
taskRevision: 'revision-4',
|
||||
taskName: 'MCP failed candidate',
|
||||
triggerType: 'manual',
|
||||
executionOrigin: 'manual',
|
||||
executionOwner: 'runtime',
|
||||
triggeredBy: 'user:mcp-owner',
|
||||
status: 'failed',
|
||||
version: 0,
|
||||
eventSequence: 0,
|
||||
priority: 2,
|
||||
createdAtMs: NOW - 5_000,
|
||||
queuedAtMs: NOW - 4_850,
|
||||
startedAtMs: NOW - 4_700,
|
||||
finishedAtMs: NOW - 4_300,
|
||||
});
|
||||
await transaction.appendEvent({
|
||||
id: 'mcp-e2e-event-1',
|
||||
runId: 'run-mcp-e2e',
|
||||
@@ -473,6 +511,7 @@ test('serves the authenticated Run Tool over the real stdio protocol and persist
|
||||
'qinglong.run.list',
|
||||
'qinglong.run.get',
|
||||
'qinglong.run.compare',
|
||||
'qinglong.task.runs.compare',
|
||||
'qinglong.run.events.list',
|
||||
'qinglong.run.steps.list',
|
||||
'qinglong.task.get',
|
||||
@@ -684,6 +723,67 @@ test('serves the authenticated Run Tool over the real stdio protocol and persist
|
||||
changedFields: ['taskRevision', 'priority'],
|
||||
consistency: 'ordered_independent_point_reads',
|
||||
});
|
||||
const comparedOutcomes = await request('tools/call', {
|
||||
name: 'qinglong.task.runs.compare',
|
||||
arguments: { taskId: 'task-mcp' },
|
||||
});
|
||||
assert.equal(
|
||||
comparedOutcomes.result.isError,
|
||||
undefined,
|
||||
JSON.stringify(comparedOutcomes),
|
||||
);
|
||||
assert.deepEqual(comparedOutcomes.result.structuredContent, {
|
||||
taskId: 'task-mcp',
|
||||
baselineOutcome: 'succeeded',
|
||||
candidateOutcome: 'failed',
|
||||
baseline: {
|
||||
found: true,
|
||||
id: 'run-mcp-e2e-success',
|
||||
taskId: 'task-mcp',
|
||||
taskRevision: 'revision-3',
|
||||
status: 'succeeded',
|
||||
version: 0,
|
||||
eventSequence: 0,
|
||||
priority: 0,
|
||||
executionOrigin: 'manual',
|
||||
executionOwner: 'runtime',
|
||||
createdAtMs: NOW - 4_000,
|
||||
queuedAtMs: NOW - 3_900,
|
||||
startedAtMs: NOW - 3_800,
|
||||
finishedAtMs: NOW - 3_600,
|
||||
},
|
||||
candidate: {
|
||||
found: true,
|
||||
id: 'run-mcp-e2e-failure',
|
||||
taskId: 'task-mcp',
|
||||
taskRevision: 'revision-4',
|
||||
status: 'failed',
|
||||
version: 0,
|
||||
eventSequence: 0,
|
||||
priority: 2,
|
||||
executionOrigin: 'manual',
|
||||
executionOwner: 'runtime',
|
||||
createdAtMs: NOW - 5_000,
|
||||
queuedAtMs: NOW - 4_850,
|
||||
startedAtMs: NOW - 4_700,
|
||||
finishedAtMs: NOW - 4_300,
|
||||
},
|
||||
comparable: true,
|
||||
sameTask: true,
|
||||
sameTaskRevision: false,
|
||||
changedFields: ['taskRevision', 'status', 'priority'],
|
||||
queueDelayDeltaMs: 50,
|
||||
executionDurationDeltaMs: 200,
|
||||
totalDurationDeltaMs: 300,
|
||||
consistency: 'bounded_task_window_then_ordered_point_reads',
|
||||
selection: {
|
||||
windowLimit: 64,
|
||||
searchedRunCount: 4,
|
||||
hasOlderRuns: false,
|
||||
complete: true,
|
||||
order: 'created_at_desc_id_desc',
|
||||
},
|
||||
});
|
||||
const events = await request('tools/call', {
|
||||
name: 'qinglong.run.events.list',
|
||||
arguments: { runId: 'run-mcp-e2e', limit: 1 },
|
||||
@@ -765,6 +865,11 @@ test('serves the authenticated Run Tool over the real stdio protocol and persist
|
||||
outcome: 'allowed',
|
||||
subjectId: 'mcp-user',
|
||||
},
|
||||
{
|
||||
operationId: 'mcp.tool.call',
|
||||
outcome: 'allowed',
|
||||
subjectId: 'mcp-user',
|
||||
},
|
||||
],
|
||||
);
|
||||
} finally {
|
||||
|
||||
Reference in New Issue
Block a user