feat: enforce proactive report gate during force-recall preflight

This commit is contained in:
Eve
2026-05-04 11:55:05 +08:00
parent 3e45643f9b
commit c51bd84449
4 changed files with 230 additions and 3 deletions

View File

@@ -73,6 +73,49 @@ const fixtures = [
assert.equal(JSON.stringify(output.progressEvidence).includes('Wait for delegated log survey'), false, 'subagent wait: progressEvidence must not derive from taskRecord.task_name');
},
},
{
name: 'report binding fields preserved',
input: {
requestText: 'Dispatch a subagent to inspect logs and wait for the result.',
canReplyNow: false,
needsSubagent: true,
needsWaiting: true,
checkpointTrigger: 'when delegated work returns or the next checkpoint fires',
externalizedTrigger: 'wrapper-derived checkpoint artifact',
triggerKind: 'artifact',
firstReportTrigger: 'when delegated work returns or at 10 minutes, whichever comes first',
nextReportCondition: 'report again only after new verifier output or blocker-state change',
fallbackState: 'blocked',
reportMode: 'watchdog',
ownerVisibleIfStalled: true,
},
assert(output) {
assert.equal(output.firstReportTrigger, 'when delegated work returns or at 10 minutes, whichever comes first');
assert.equal(output.nextReportCondition, 'report again only after new verifier output or blocker-state change');
assert.equal(output.fallbackState, 'blocked');
assert.equal(output.reportMode, 'watchdog');
assert.equal(output.ownerVisibleIfStalled, true);
},
},
{
name: 'wrapper does not fabricate hard report binding fields',
input: {
requestText: 'Dispatch a subagent to inspect logs and wait for the result.',
canReplyNow: false,
needsSubagent: true,
needsWaiting: true,
checkpointTrigger: 'when delegated work returns or the next checkpoint fires',
externalizedTrigger: 'wrapper-derived checkpoint artifact',
triggerKind: 'artifact',
},
assert(output) {
assert.equal(output.firstReportTrigger, 'when delegated work returns or the next checkpoint fires');
assert.equal(output.nextReportCondition, 'After next meaningful milestone');
assert.equal(output.fallbackState, '');
assert.equal(output.reportMode, '');
assert.equal(output.ownerVisibleIfStalled, false);
},
},
];
function runFixture(fixture) {