← Back to the trial Plan Court Pass

Case file PC-2026-09

The complete, unedited record of a real run — every critique, disposition, ruling and amendment.

DocketPC-2026-09
In reSubscription billing migration
Table5 seats · DeepSeek V4 Pro presiding
Rounds3 of 3 · 33 amendments folded in
Cost$0.3617 est. (69,092 in / 134,138 out)
VerdictPass

Plan Court Report: Migrate subscription billing from Stripe to the internal ledger

Date: 2026-09-07T14:01:40.550Z
Verdict: PASS
Rounds: 3 (max 3 by setting)
Stopped: max rounds reached
Seats: Red Team (deepseek-v4-flash), Scope Cop (Google: Gemini 3.7 Flash), Architect (Qwen: Qwen3.8 27B), Tracer (Ox Alpha), Stress Test (Tencent: Hy-MT2-1.8B) | Judge: deepseek / deepseek-v4-pro
Tokens: 69092 in / 134138 out | Est. cost: $0.3617

Round 1

SeatProviderModelLensVote
Red Teamdeepseekdeepseek-v4-flashCorrectness & failure modesFAIL
Scope CopOpenRoutergoogle/gemini-3.7-flashCompleteness & hidden assumptionsFAIL
ArchitectOpenRouterqwen/qwen3.8-27bDesign & simplicityFAIL
TracerOpenRouterstealth/ox-alphaExecution & rolloutFAIL
Stress TestOpenRoutertencent/hy-mt2-1.8bData & integrityFAIL

Red Team — deepseek-v4-flash — FAIL

Lens: Correctness & failure modes

Scope Cop — Google: Gemini 3.7 Flash — FAIL

Lens: Completeness & hidden assumptions

Architect — Qwen: Qwen3.8 27B — FAIL

Lens: Design & simplicity

Tracer — Ox Alpha — FAIL

Lens: Execution & rollout

Stress Test — Tencent: Hy-MT2-1.8B — FAIL

Lens: Data & integrity

Round 2

SeatProviderModelLensVote
Red Teamdeepseekdeepseek-v4-flashCompleteness & hidden assumptionsFAIL
Scope CopOpenRoutergoogle/gemini-3.7-flashDesign & simplicityFAIL
ArchitectOpenRouterqwen/qwen3.8-27bExecution & rolloutFAIL
TracerOpenRouterstealth/ox-alphaData & integrityFAIL
Stress TestOpenRoutertencent/hy-mt2-1.8bSecurity & permissionsFAIL

Red Team — deepseek-v4-flash — FAIL

Lens: Completeness & hidden assumptions

Scope Cop — Google: Gemini 3.7 Flash — FAIL

Lens: Design & simplicity

Architect — Qwen: Qwen3.8 27B — FAIL

Lens: Execution & rollout

Tracer — Ox Alpha — FAIL

Lens: Data & integrity

Stress Test — Tencent: Hy-MT2-1.8B — FAIL

Lens: Security & permissions

Round 3

SeatProviderModelLensVote
Red Teamdeepseekdeepseek-v4-flashDesign & simplicityFAIL
Scope CopOpenRoutergoogle/gemini-3.7-flashExecution & rolloutFAIL
ArchitectOpenRouterqwen/qwen3.8-27bData & integrityFAIL
TracerOpenRouterstealth/ox-alphaSecurity & permissionsFAIL
Stress TestOpenRoutertencent/hy-mt2-1.8bUX & edge casesPASS

Red Team — deepseek-v4-flash — FAIL

Lens: Design & simplicity

Scope Cop — Google: Gemini 3.7 Flash — FAIL

Lens: Execution & rollout

Architect — Qwen: Qwen3.8 27B — FAIL

Lens: Data & integrity

Tracer — Ox Alpha — FAIL

Lens: Security & permissions

Stress Test — Tencent: Hy-MT2-1.8B — PASS

Lens: UX & edge cases

No issues raised.

Revised Plan — after Round 1

Judge dispositions (addressed 15 · deferred 0 · rejected 2):

Migrate subscription billing from Stripe to the internal ledger

Goal

Move all subscription billing (creation, renewal, cancellation) off Stripe's Subscriptions API
onto our internal ledger service, keeping Stripe as the payment processor only. Target: 100% of
renewals flowing through the ledger by Oct 31.

Background

The ledger service (services/ledger) already records one-time invoices. It does not yet own
subscription lifecycles. The billing team (3 devs) owns both codebases.

Phases

Phase 0 — Staging and safety net before dual-write

Phase 1 — Ledger subscription support (3 days)

Phase 2 — Dual-write and backfill (1 week)

Phase 3 — Canary cutover with rollback protocol

Phase 4 — Cleanup (later)

Success criteria

Rollout

Run the Phase 0 staging cutover drill first. Start dual-write on a Monday and let it run for one
week with full reconciliation. On cutover Friday after standup, use the customer-cohort gates from
Phase 3: 1% for two hours, then 25%, 50%, 100% after passing the Phase 0 metrics. Ping #billing in
Slack at each expansion and when done. If any cohort shows a failed renewal or duplicate charge,
pause expansion and follow the rollback runbook.

Revised Plan — after Round 2

Judge dispositions (addressed 18 · deferred 0 · rejected 2):

Migrate subscription billing from Stripe to the internal ledger

Goal

Move all subscription billing (creation, renewal, cancellation) off Stripe's Subscriptions API
onto our internal ledger service, keeping Stripe as the payment processor only. Target: 100% of
renewals flowing through the ledger by Oct 31.

Background

The ledger service (services/ledger) already records one-time invoices. It does not yet own
subscription lifecycles. The billing team (3 devs) owns both codebases.

Phases

Phase 0 — Staging and safety net before dual-write

Phase 1 — Ledger subscription support (3 days)

Phase 2 — Dual-write and backfill (1 week)

Phase 3 — Canary cutover with rollback protocol

Phase 4 — Cleanup (later)

Success criteria

Rollout

Run the Phase 0 staging cutover drill first. Start dual-write on Monday of week 1 and run it for at
least seven full calendar days with nightly ownership-aware reconciliation. Begin canary cutover on
Friday of week 2 only after seven consecutive zero-diff reports for non-migrated subscriptions and
all Phase 0 metrics passing. Use the customer-cohort gates from Phase 3: 1% of customers for two
hours, then 25%, 50%, 100% after passing the Phase 0 metrics and exactly-one-engine verification.
Ping #billing in Slack at each expansion and when done. If any cohort shows a failed renewal or
duplicate charge, pause expansion and follow the rollback runbook.

Revised Plan — after Round 3

Judge dispositions (addressed 12 · deferred 0 · rejected 2):

Migrate subscription billing from Stripe to the internal ledger

Goal

Move all subscription billing (creation, renewal, cancellation) off Stripe's Subscriptions API onto our internal ledger service, keeping Stripe as the payment processor only. Target: 100% of renewals flowing through the ledger by Oct 31.

Background

The ledger service (services/ledger) already records one-time invoices. It does not yet own subscription lifecycles. The billing team (3 devs) owns both codebases.

Phases

Phase 0 — Staging and safety net before dual-write

Phase 1 — Ledger subscription support (3 days)

Phase 2 — Dual-write and backfill (1 week)

Phase 3 — Canary cutover with rollback protocol

Phase 4 — Cleanup (later)

Success criteria

Rollout

Run the Phase 0 staging cutover drill first. Start the transactional outbox dual-write path on Monday of week 1, then run the backfill migration, and run dual-write for at least seven full calendar days with nightly ownership-aware reconciliation. Begin canary cutover on Friday of week 2 only after seven consecutive zero-diff reports for non-migrated subscriptions and all Phase 0 metrics passing. Use the customer-cohort gates from Phase 3: 1% of customers for two hours, then 25%, 50%, 100% after passing the Phase 0 metrics and exactly-one-engine verification. Ping #billing in Slack at each expansion and when done. If any cohort shows a failed renewal or duplicate charge, pause expansion and follow the rollback runbook.

Judge rulings

Finalized Plan

Migrate subscription billing from Stripe to the internal ledger

Goal

Move all subscription billing (creation, renewal, cancellation) off Stripe's Subscriptions API onto our internal ledger service, keeping Stripe as the payment processor only. Target: 100% of renewals flowing through the ledger by Oct 31.

Background

The ledger service (services/ledger) already records one-time invoices. It does not yet own subscription lifecycles. The billing team (3 devs) owns both codebases.

Phases

Phase 0 — Staging and safety net before dual-write

Phase 1 — Ledger subscription support (3 days)

Phase 2 — Dual-write and backfill (1 week)

Phase 3 — Canary cutover with rollback protocol

Phase 4 — Cleanup (later)

Success criteria

Rollout

Run the Phase 0 staging cutover drill first. Start the transactional outbox dual-write path on Monday of week 1, then run the backfill migration, and run dual-write for at least seven full calendar days with nightly ownership-aware reconciliation. Begin canary cutover on Friday of week 2 only after seven consecutive zero-diff reports for non-migrated subscriptions and all Phase 0 metrics passing. Use the customer-cohort gates from Phase 3: 1% of customers for two hours, then 25%, 50%, 100% after passing the Phase 0 metrics and exactly-one-engine verification. Ping #billing in Slack at each expansion and when done. If any cohort shows a failed renewal or duplicate charge, pause expansion and follow the rollback runbook.


Generated by Plan Court