Use when an agent workflow needs deterministic recovery evidence for sandbox, MCP/tool, worker, checkpoint, memory, or orchestration failures.
5cf4dfeUse a deterministic, non-production fault schedule to test whether an agent workflow preserves state, budgets, safety boundaries, and evidence when a dependency fails. The output is a small fault matrix, an event timeline, and a verdict that distinguishes recovered, contained, unrecoverable, and inconclusive runs.
Do not use this skill against a production target, real user data, live credentials, or an unbounded external service. Convert those cases to a local simulator or an authorized staging harness first.
inconclusive.Write the invariant before injecting a fault. A useful contract names the state that must survive and the side effects that must not repeat:
After recovery, resume from the latest durable checkpoint, preserve the task
identity and safety policy, spend no more than the remaining retry/deadline
budget, and commit each externally visible effect at most once.
Model the workflow with explicit states. For example:
created -> running -> checkpointed -> waiting_for_tool
| |
v v
failed <--------- recovering -> resumed -> completed
For each transition, define the owner, durable fields, allowed retry count, and terminal behavior. In-memory values are not checkpoints unless the harness proves they survive the simulated restart.
Select the smallest set of faults that covers the new recovery logic. Do not randomize the schedule until a deterministic schedule has passed.
| Fault | Injection boundary | Required observation | Expected containment |
|---|---|---|---|
| sandbox denial | before a tool starts | no unsafe side effect; reason is retained | retry only when policy allows |
| MCP/tool timeout | after request id is assigned | timeout is attributed to that request | bounded retry with same idempotency key |
| worker restart | after checkpoint write | worker reloads the same task version | resume from latest checkpoint |
| missing/stale checkpoint | before resume | stale data is rejected or marked | stop safely; never invent progress |
| parallel branch failure | one branch after fan-out | sibling status is preserved | join policy decides retry, degrade, or stop |
| memory loss | clear ephemeral context | durable facts are reconstructed | ask or stop when required facts are absent |
| retry/deadline exhaustion | on the final attempt | no extra call is scheduled | terminal failed or timed_out |
Use event numbers rather than wall-clock randomness. A schedule should be portable across harnesses:
{
"seed": "harness-fixture-07",
"faults": [
{"event": "tool.call", "ordinal": 2, "kind": "timeout", "tool": "search"},
{"event": "worker.start", "ordinal": 2, "kind": "restart"},
{"event": "branch.join", "ordinal": 1, "kind": "partial_failure", "branch": "summarize"}
]
}
The harness should emit the schedule, not merely the seed. Keep fault identity separate from the observed error so a wrapper cannot accidentally turn a timeout into a generic failure. Run the same schedule twice and compare the normalized timeline before trying a different schedule.
Represent each branch as its own child attempt. The join record must retain success, failure, timeout, and not-started states. Choose one predeclared join policy:
all_required: any required branch failure stops the join;best_effort: continue with an explicit degraded marker;compensate: run a bounded compensating action and then stop or resume.Never let a successful sibling erase a failed branch from the final ledger.
Clear only the ephemeral context named in the schedule. Rebuild from the
checkpoint and durable evidence, then check that the agent does not fabricate
missing user intent, tool output, or approval. If a required fact is absent,
the safe result is inconclusive or a human clarification state.
Track remaining attempts and remaining time after every event. Do not reset a budget on a worker restart or branch retry. Use these verdicts:
| Verdict | Meaning |
|---|---|
| recovered | The declared invariant held and the workflow completed within budget. |
| contained_failure | The fault was isolated and the workflow stopped safely as designed. |
| unrecoverable | Recovery violated an invariant, repeated a side effect, crossed a boundary, or exceeded budget. |
| inconclusive | The fixture, checkpoint, contract, or evidence was insufficient to judge. |
contained_failure is not autonomous success. Report it separately from
completed work and include the terminal reason.
Produce one machine-readable record and one concise human summary. Every event
should include run_id, monotonic seq, logical time, state_before,
state_after, actor, event, fault_id (when injected), attempt,
checkpoint_seq, retry_remaining, deadline_remaining_ms, and a redacted
evidence_ref.
{
"run_id": "fi-2026-08-19-07",
"verdict": "recovered",
"invariants": {"resume_from_checkpoint": "pass", "effect_at_most_once": "pass", "budget": "pass"},
"faults": [{"id": "f1", "kind": "tool_timeout", "at": "tool.call#2", "handled": true}],
"timeline": [
{"seq": 4, "event": "checkpoint.write", "checkpoint_seq": 3},
{"seq": 5, "event": "tool.timeout", "fault_id": "f1", "retry_remaining": 1},
{"seq": 8, "event": "workflow.completed", "checkpoint_seq": 4}
],
"limitations": ["Tool output was synthetic; no deployed MCP was exercised."]
}
The human summary should state the frozen contract, injected schedule, verdict, failed invariants, budget consumption, and the narrowest next verification. Redact prompts, tokens, private records, and tool payloads; stable references are enough for replay.
Fixture: checkout planner / seed harness-fixture-07
Schedule: search timeout on call 2; worker restart after checkpoint 3
Policy: one retry, 2s deadline, all_required branch join
Result: recovered
Proof: checkpoint 3 reloaded, search request key replayed once, no duplicate
commit, deadline remaining 640ms, final ledger contains both branch outcomes.
inconclusive, never as a passing recovery.inconclusive or unrecoverable with evidence.@agent-evaluation-reporting - Report autonomous, assisted, failed, timed-out, and invalid outcomes.@cross-platform-contract-propagation-audit - Trace recovery fields and status contracts across consumers.@multi-agent-patterns - Choose a multi-agent topology before testing its failure behavior.Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/agent-harness-fault-injection · pinned to the source commit
# Run from your project root
git clone https://github.com/sickn33/agentic-awesome-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cf4dfeb13ea966daa1e117897689cd7991e3f44
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/agentic-awesome-skills-claude/skills/agent-harness-fault-injection" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/sickn33/agentic-awesome-skills.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cf4dfeb13ea966daa1e117897689cd7991e3f44
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/agentic-awesome-skills-claude/skills/agent-harness-fault-injection" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/agent-harness-fault-injection
Scanner static-checks@0.1.0 · commit 5cf4dfeb13ea. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.