docs(issue-5): phase 2b scenarios, operations note and task checklist

Three scenarios join the contract set, so the fifteen vectors now cover an
unproven side effect, an undecidable attribution, and an agent whose state goes
unreadable in the window between finalization and notification. All fifteen
match their expected decision.

The side-effect case needed a decision about layering. Authoritative enforcement
belongs in manifest verification, which has the job record and therefore knows
what was declared; the policy honours an explicit negative from the collector so
the case is expressible as a vector. Absence is not read as proof there, because
the manifest check is the layer that fails closed on missing evidence.

The operations note records why the agent declares and the reader re-derives,
the three gates and why the backend allowlist can only be narrowed, the
notification transaction, and the rollback.

It also records a deviation from my own plan. §D2 asked for reviewer sign-off
before promoting an attempt id into the record, since that changes a contract
phase 1 froze. Measurement during implementation showed the change was not
needed: the attempt guard already lives in the evidence layer, where attempt
identity actually is, so auto-completion passes the engine a status precondition
instead. The schema is untouched, the frozen contract holds, and a
characterization test fails the moment a record starts carrying an attempt id,
which is when to revisit it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UrDNJkHmm18uu7n7JwV5Qd
This commit is contained in:
GodopuandClaude Opus 5 committed 2026-09-06 21:32:48 +09:00
1 parent 803ba43884
commit 8adbe2245c
9 files changed
+329 -6

No files matched your search

+18
View File
@@ -73,6 +73,24 @@
"provenance": "simulated",
"expected_decision": "reject_stale",
"description": "The pane was restarted mid-flight, so the idle signal comes from a different pane than the one dispatched to."
},
"side_effect_unproven": {
"file": "side_effect_unproven.json",
"provenance": "simulated",
"expected_decision": "hold",
"description": "The job declared an external side effect but the manifest carries no evidence for it. Partial evidence is no evidence."
},
"no_verdict_fail_closed": {
"file": "no_verdict_fail_closed.json",
"provenance": "simulated",
"expected_decision": "hold",
"description": "The collector could not establish the agent session, so attribution cannot be completed. An undecidable case must hold."
},
"notification_crash_window": {
"file": "notification_crash_window.json",
"provenance": "simulated",
"expected_decision": "hold",
"description": "The agent's state became unreadable between finalization and notification. Unknown is not quiescent."
}
}
}
@@ -0,0 +1,66 @@
{
"schema_version": "1.0.0",
"scenario_id": "no_verdict_fail_closed",
"backend": "backend_agnostic",
"provenance": "simulated",
"description": "The collector could not establish the agent session, so attribution cannot be completed. An undecidable case must hold.",
"dispatch_context": {
"job_id": "test-job-no-verdict-01",
"attempt_id": 1,
"agent_session_uuid": "7d5700d0-bab1-4f65-9665-6b887396a9a6",
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z",
"dispatch_ack": true,
"execution_anchor_observed": true
},
"timeline": [
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 0,
"source_kind": "event",
"source_provenance": "simulated",
"payload": {
"event": "started",
"job_id": "test-job-no-verdict-01"
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 5000,
"source_kind": "filesystem",
"source_provenance": "simulated",
"payload": {
"report_manifest": {
"report_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"attempt_id": 1,
"finalized": true
}
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 6000,
"source_kind": "herdr",
"source_provenance": "simulated",
"payload": {
"agent_status": "idle",
"interactive_ready": true
},
"collector_attribution": {
"job_id": "test-job-no-verdict-01",
"attempt_id": 1,
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z"
}
}
],
"filesystem": {
"report_path": ".mam/jobs/test-job-finalized-01/report-final.md",
"exists": true,
"manifest_committed": true,
"hash_verified": true
},
"expected_policy": {
"decision": "hold",
"reason": "no observed agent_session_uuid to attribute this completion to",
"policy_version": "2.0.0"
}
}
@@ -0,0 +1,67 @@
{
"schema_version": "1.0.0",
"scenario_id": "notification_crash_window",
"backend": "backend_agnostic",
"provenance": "simulated",
"description": "The agent's state became unreadable between finalization and notification. Unknown is not quiescent.",
"dispatch_context": {
"job_id": "test-job-notify-crash-01",
"attempt_id": 1,
"agent_session_uuid": "7d5700d0-bab1-4f65-9665-6b887396a9a6",
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z",
"dispatch_ack": true,
"execution_anchor_observed": true
},
"timeline": [
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 0,
"source_kind": "event",
"source_provenance": "simulated",
"payload": {
"event": "started",
"job_id": "test-job-notify-crash-01"
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 5000,
"source_kind": "filesystem",
"source_provenance": "simulated",
"payload": {
"report_manifest": {
"report_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"attempt_id": 1,
"finalized": true
}
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 6000,
"source_kind": "herdr",
"source_provenance": "simulated",
"payload": {
"agent_status": "unknown",
"interactive_ready": false
},
"collector_attribution": {
"job_id": "test-job-notify-crash-01",
"attempt_id": 1,
"agent_session_uuid": "7d5700d0-bab1-4f65-9665-6b887396a9a6",
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z"
}
}
],
"filesystem": {
"report_path": ".mam/jobs/test-job-finalized-01/report-final.md",
"exists": true,
"manifest_committed": true,
"hash_verified": true
},
"expected_policy": {
"decision": "hold",
"reason": "agent status is unknown; fail closed",
"policy_version": "2.0.0"
}
}
@@ -0,0 +1,68 @@
{
"schema_version": "1.0.0",
"scenario_id": "side_effect_unproven",
"backend": "backend_agnostic",
"provenance": "simulated",
"description": "The job declared an external side effect but the manifest carries no evidence for it. Partial evidence is no evidence.",
"dispatch_context": {
"job_id": "test-job-sideeffect-missing-01",
"attempt_id": 1,
"agent_session_uuid": "7d5700d0-bab1-4f65-9665-6b887396a9a6",
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z",
"dispatch_ack": true,
"execution_anchor_observed": true
},
"timeline": [
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 0,
"source_kind": "event",
"source_provenance": "simulated",
"payload": {
"event": "started",
"job_id": "test-job-sideeffect-missing-01"
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 5000,
"source_kind": "filesystem",
"source_provenance": "simulated",
"payload": {
"report_manifest": {
"report_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"attempt_id": 1,
"finalized": true
}
}
},
{
"collector_clock_id": "CLOCK_MONOTONIC",
"relative_ms": 6000,
"source_kind": "herdr",
"source_provenance": "simulated",
"payload": {
"agent_status": "idle",
"interactive_ready": true
},
"collector_attribution": {
"job_id": "test-job-sideeffect-missing-01",
"attempt_id": 1,
"agent_session_uuid": "7d5700d0-bab1-4f65-9665-6b887396a9a6",
"pane_process_generation": "w2X:p1:1234:2026-09-06T00:00:00Z"
}
}
],
"filesystem": {
"report_path": ".mam/jobs/test-job-finalized-01/report-final.md",
"exists": true,
"manifest_committed": true,
"hash_verified": true,
"side_effects_verified": false
},
"expected_policy": {
"decision": "hold",
"reason": "declared side effect has no evidence in the commit manifest",
"policy_version": "2.0.0"
}
}