feat: add governance evaluator and decision runner skeleton

This commit is contained in:
Eve
2026-05-07 23:38:46 +08:00
parent 7fd02348cf
commit c2a775b62c
8 changed files with 761 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { planDecisionExecution } from '../src/core/decision-runner.mjs';
const baseCapabilityDescriptor = {
capabilities: {
enforcement: {
block_transition: { supported: true, level: 'partial' },
force_checkpoint: { supported: true, level: 'partial' },
rewrite_message: { supported: false, level: 'none' },
annotate_placeholder: { supported: false, level: 'none' },
request_review: { supported: false, level: 'none' },
downgrade_status: { supported: false, level: 'none' },
escalate: { supported: true, level: 'full' }
},
notification_path: {
truth_model: {
delivery_states: ['prepared', 'queued', 'dispatched', 'pending_external_send', 'acked', 'blocked'],
ack_requires_proven_send: true,
pending_external_send_supported: true
}
}
}
};
test('planDecisionExecution produces runtime-adapter dispatch intent for force_checkpoint', () => {
const result = planDecisionExecution({
decision: {
decision: 'force_checkpoint',
policy_id: 'no-silence.missed-checkpoint',
severity: 'high',
reason: 'checkpoint overdue',
rewritten_message: 'Required update.',
suggested_status: 'in_progress',
required_actions: [
{ action: 'notify_operator', target: 'operator_channel', mandatory: true },
{ action: 'emit_event', target: 'event_stream', mandatory: true }
],
operator_notice: {
required: true,
channel: 'telegram',
urgency: 'high',
message: 'Required update.',
deadline: '2026-01-01T00:00:00.000Z'
}
},
capabilityDescriptor: baseCapabilityDescriptor
});
assert.equal(result.receipt.delivery_state, 'pending_external_send');
assert.deepEqual(result.enforcement_intent.runtime_adapter_required, ['notify_operator']);
assert.ok(result.receipt.notes.some((note) => note.includes('runtime-adapter responsibility')));
});
test('planDecisionExecution truthfully blocks unsupported package action paths', () => {
const result = planDecisionExecution({
decision: {
decision: 'downgrade_status',
policy_id: 'verified-completion-only.insufficient-evidence',
severity: 'high',
reason: 'completion evidence too weak',
rewritten_message: null,
suggested_status: 'pending_verification',
required_actions: [
{
action: 'set_status',
target: 'task_record',
mandatory: true,
details: { to: 'pending_verification' }
}
],
operator_notice: null
},
capabilityDescriptor: baseCapabilityDescriptor
});
assert.equal(result.receipt.status, 'degraded');
assert.equal(result.enforcement_intent.planned_actions.length, 0);
assert.equal(result.enforcement_intent.blocked_actions[0].action, 'set_status');
});