Two-Provider Dry Run Plan (Gate Artifact 3)
1) Goal
Validate end-to-end gate path with claude + codex before expanding to more providers.
What must be proven:
- Idempotency works.
- State transitions are correct.
- Artifact persistence chain is complete.
- Notifications are deduplicated.
2) Scope
In scope:
- Single repo dry run on fixed commit.
- Two providers in parallel (
claude,codex). - One duplicate submission and one forced timeout scenario.
Out of scope:
- Full cost optimization.
- Multi-day production soak.
3) Preconditions
- Capability probes passed for
claudeandcodex(C0,C1,C2minimum). - Adapter contract mandatory cases passed.
- Redaction and allowlist policies enabled.
4) Test Inputs
repo: fixture or pilot reporevision: fixed commit SHAprompt: fixed review prompt templatescope: fixed file setpolicy_version: pinned
Generate deterministic idempotency key from these values.
5) Execution Steps
Run A: Baseline successful run
- Submit task once with both providers enabled.
- Verify states:
QUEUED -> DISPATCHED -> RUNNING -> AGGREGATING -> COMPLETED|PARTIAL_SUCCESS
- Verify artifacts:
summary.mddecision.mdproviders/claude.jsonproviders/codex.jsonaudit-log.json
- Verify one terminal notification sent.
Run B: Duplicate submission test
- Resubmit same task input (same idempotency key) within active window.
- Expect orchestrator returns existing task reference.
- Verify:
- No duplicate dispatch keys.
- No duplicate provider runs.
- No duplicate terminal notifications.
Run C: Expired/recovery path
- Submit a run with reduced timeout and induced long-running behavior.
- Confirm reaper marks attempt/task as
EXPIRED. - Confirm compensation:
- native cancel or shim termination path executed
- partial artifacts preserved
- terminal notification emitted once
6) Validation Checklist
Idempotency:
same key -> same task id
duplicate submit does not spawn new attempts
State machine:
all transitions legal
no transition from terminal -> non-terminal
Persistence:
all expected artifacts exist
artifact writes are atomic (no partial JSON)
Notification:
exactly one terminal notification per
(task_id, terminal_state, channel)Dedupe/normalize:
normalized findings parse successfully
schema-valid with nullable
evidence.line
7) Pass/Fail Criteria
PASS:
- Run A, B, C all meet checklist with zero P0 failures.
FAIL:
- Any duplicate dispatch/notification.
- Missing mandatory artifact.
- Invalid state transition.
- Unclassified adapter error.
8) Deliverables
reports/dry-run/<date>/execution-log.mdreports/dry-run/<date>/state-transition.jsonreports/dry-run/<date>/idempotency-check.jsonreports/dry-run/<date>/artifacts-manifest.jsonreports/dry-run/<date>/gate-decision.md
Gate opens only if dry-run gate-decision.md is PASS.