fix: preserve governance contract compatibility

This commit is contained in:
Eve
2026-05-08 09:58:24 +08:00
parent 47a2c4c727
commit 000f6b6a8b
3 changed files with 95 additions and 18 deletions

View File

@@ -109,6 +109,28 @@ test('capability descriptor -> policy evaluation -> decision planning yields ada
assert.equal(result.contract.runtime, 'openclaw-watchdog-reference');
});
test('executeGovernanceContract stays compatible for legacy callers without profile/packageVersion', () => {
const result = executeGovernanceContract({
event: {
type: 'silence_timeout',
payload: { checkpoint_overdue: true }
},
capabilityDescriptor,
policyPacks: [noSilencePack],
context: {
signals: ['checkpoint_overdue']
}
});
assert.equal(result.evaluation.decision.decision, 'force_checkpoint');
assert.equal(result.preflight.status, 'pass');
assert.equal(result.preflight.requested_plugin_version, null);
assert.ok(result.preflight.notes.some((note) => note.includes('skipped plugin version pin')));
assert.equal(result.planning.receipt.status, 'planned');
assert.deepEqual(result.contract.adapter_actions, ['notify_operator']);
assert.deepEqual(result.contract.package_actions, ['emit_event']);
});
test('contract truthfully degrades when notify path can queue but cannot directly dispatch', () => {
const limitedDescriptor = {
...capabilityDescriptor,
@@ -199,6 +221,46 @@ test('contract fails closed when capability descriptor cannot satisfy mandatory
assert.deepEqual(result.contract.package_actions, []);
assert.deepEqual(result.contract.blocked_actions, []);
assert.equal(result.contract.delivery_state, 'blocked');
assert.equal(result.contract.receipt_status, 'failed');
assert.equal(result.contract.receipt_status, 'blocked');
assert.equal(result.planning.receipt.status, 'blocked');
assert.equal(result.planning.receipt.delivery_state, 'blocked');
assert.deepEqual(result.planning.receipt.enforcement_intent, []);
assert.deepEqual(result.planning.receipt.blocked_actions, []);
assert.ok(result.planning.receipt.notes.some((note) => note.includes('failed closed')));
});
test('schema/version mismatch blocks contract before any runnable plan is produced', () => {
const brokenDescriptor = {
...capabilityDescriptor,
compatibility: {
...capabilityDescriptor.compatibility,
plugin_spec_versions: ['9.9.9'],
decision_schema: 'schemas/reporting-governance/not-the-canonical-decision.schema.json'
}
};
const result = executeGovernanceContract({
event: {
type: 'silence_timeout',
payload: { checkpoint_overdue: true }
},
capabilityDescriptor: brokenDescriptor,
policyPacks: [noSilencePack],
context: {
signals: ['checkpoint_overdue']
},
profile: strictProfile,
packageVersion: '0.1.0-mainline'
});
assert.equal(result.preflight.status, 'fail_closed');
assert.equal(result.contract.delivery_state, 'blocked');
assert.equal(result.contract.receipt_status, 'blocked');
assert.deepEqual(result.planning.enforcement_intent.planned_actions, []);
assert.deepEqual(result.planning.enforcement_intent.runtime_adapter_required, []);
assert.deepEqual(result.planning.enforcement_intent.package_core_actions, []);
assert.deepEqual(result.planning.receipt.enforcement_intent, []);
assert.deepEqual(result.planning.receipt.blocked_actions, []);
assert.ok(result.planning.receipt.notes.some((note) => note.includes('schema mismatch: decision_schema')));
assert.ok(result.planning.receipt.notes.some((note) => note.includes('plugin version 0.1.0-mainline is not declared compatible')));
});