paired: carry forward latest owner final across superseded tasks

This commit is contained in:
ejclaw
2026-04-20 08:19:31 +09:00
parent a59813dee6
commit b6a24ad9fb
7 changed files with 154 additions and 15 deletions

View File

@@ -18,7 +18,9 @@ vi.mock('./db.js', () => {
getLatestOpenPairedTaskForChat: vi.fn(),
getPairedTaskById: vi.fn(),
getPairedTurnById: vi.fn(),
getPairedTurnOutputs: vi.fn(() => []),
getPairedWorkspace: vi.fn(),
insertPairedTurnOutput: vi.fn(),
updatePairedTask,
updatePairedTaskIfUnchanged: vi.fn((id, _expectedUpdatedAt, updates) => {
updatePairedTask(id, updates);
@@ -51,6 +53,7 @@ import * as config from './config.js';
import {
completePairedExecutionContext,
preparePairedExecutionContext,
resolveOwnerTaskForHumanMessage,
} from './paired-execution-context.js';
import * as pairedWorkspaceManager from './paired-workspace-manager.js';
import type {
@@ -250,6 +253,50 @@ describe('paired execution context', () => {
});
});
it('carries forward the latest owner final when a merge_ready task is superseded by new human input', () => {
const supersededTask = buildPairedTask({
id: 'task-superseded',
status: 'merge_ready',
updated_at: '2026-03-28T00:05:00.000Z',
});
vi.mocked(db.getLatestOpenPairedTaskForChat).mockReturnValue(supersededTask);
vi.mocked(db.getPairedTurnOutputs).mockReturnValue([
{
id: 1,
task_id: 'task-superseded',
turn_number: 1,
role: 'owner',
output_text: 'DONE_WITH_CONCERNS\n이전 task owner final',
created_at: '2026-03-28T00:01:00.000Z',
},
{
id: 2,
task_id: 'task-superseded',
turn_number: 2,
role: 'reviewer',
output_text: 'DONE\nreview approved',
created_at: '2026-03-28T00:02:00.000Z',
},
]);
const result = resolveOwnerTaskForHumanMessage({
group,
chatJid: 'dc:test',
roomRoleContext: ownerContext,
existingTask: supersededTask,
});
expect(db.createPairedTask).toHaveBeenCalledTimes(1);
expect(result.supersededTask).toEqual(supersededTask);
expect(db.insertPairedTurnOutput).toHaveBeenCalledWith(
expect.any(String),
0,
'owner',
'[Carried forward context from the previous task: latest owner final]\nDONE_WITH_CONCERNS\n이전 task owner final',
'2026-03-28T00:01:00.000Z',
);
});
it('uses room role context agent overrides when creating a paired task', () => {
preparePairedExecutionContext({
group,
@@ -626,7 +673,9 @@ describe('paired execution context', () => {
EJCLAW_PAIRED_ROLE: 'reviewer',
EJCLAW_UNSAFE_HOST_PAIRED_MODE: '1',
});
expect(result?.envOverrides.EJCLAW_CLAUDE_REVIEWER_READONLY).toBeUndefined();
expect(
result?.envOverrides.EJCLAW_CLAUDE_REVIEWER_READONLY,
).toBeUndefined();
expect(result?.envOverrides.EJCLAW_REVIEWER_RUNTIME).toBeUndefined();
delete process.env.EJCLAW_UNSAFE_HOST_PAIRED_MODE;
});