[ { "id": "T001", "mode": "automated", "description": "Cycle orchestration: successful inbound advances cursor to fetch time; inbound applier failure leaves cursor_before in place.", "implemented": true, "featureIds": [ "F008", "F009" ] }, { "id": "T002", "mode": "automated", "description": "Cycle orchestration: fetchChanges is called with last cursor_after minus the 5-minute overlap window.", "implemented": true, "featureIds": [ "F009" ] }, { "id": "T003", "mode": "automated", "description": "Cycle orchestration: outbound op failure increments attempts and retries next cycle; at the cap the op becomes skipped and an exception is filed; cursor still advances.", "implemented": true, "featureIds": [ "F008", "F010" ] }, { "id": "T004", "mode": "automated", "description": "Cycle orchestration: hard auth failure aborts before CDC \u2014 no fetch, no cursor change, connection marked expired, immediate notification sent.", "implemented": true, "featureIds": [ "F008", "F034" ] }, { "id": "T005", "mode": "automated", "description": "Ops queue: enqueueing the same entity+operation while one is pending dedupes to a single op; a done op allows re-enqueue.", "implemented": true, "featureIds": [ "F010" ] }, { "id": "T006", "mode": "automated", "description": "Scheduling: OAuth connect registers the cycle job (15-min, singleton per tenant\u00d7realm), disconnect deregisters, startup re-registers for connected tenants; interval is not coerced to 24h.", "implemented": true, "featureIds": [ "F011" ] }, { "id": "T007", "mode": "automated", "description": "Cycle guard: CE edition or disconnected tenant \u2192 cycle exits as a no-op without error or cursor write.", "implemented": true, "featureIds": [ "F013" ] }, { "id": "T008", "mode": "automated", "description": "Payment applier: single full payment \u2192 invoice_payments row (method quickbooks), payment transaction with qbo_payment_id metadata, invoice status 'paid'.", "implemented": true, "featureIds": [ "F016" ] }, { "id": "T009", "mode": "automated", "description": "Payment applier: partial allocation \u2192 status 'partially_applied'; second payment completing the balance \u2192 'paid'.", "implemented": true, "featureIds": [ "F015", "F016" ] }, { "id": "T010", "mode": "automated", "description": "Payment applier: one QBO payment allocated across two mapped invoices applies per-allocation amounts to each.", "implemented": true, "featureIds": [ "F016" ] }, { "id": "T011", "mode": "automated", "description": "Idempotency: re-delivering an already-mapped, unchanged payment (overlap window duplicate) is a no-op \u2014 no duplicate invoice_payments or transactions.", "implemented": true, "featureIds": [ "F017" ] }, { "id": "T012", "mode": "automated", "description": "Payment edit: moved sync token reverses prior application and reapplies current allocations; net invoice_payments/transactions/status reflect only the edited amounts.", "implemented": true, "featureIds": [ "F018" ] }, { "id": "T013", "mode": "automated", "description": "Payment delete: CDC-deleted payment writes payment_reversal transactions and recomputes status back to sent/partially_applied.", "implemented": true, "featureIds": [ "F019" ] }, { "id": "T014", "mode": "automated", "description": "Payment exceptions: allocation to an unmapped QBO invoice files accounting_sync_unmapped_payment and applies nothing; currency mismatch likewise.", "implemented": true, "featureIds": [ "F020" ] }, { "id": "T015", "mode": "automated", "description": "Stats-only inputs: unapplied remainder and RefundReceipt increment cycle stats without creating records.", "implemented": true, "featureIds": [ "F021" ] }, { "id": "T016", "mode": "automated", "description": "Stripe regression: existing PaymentService/webhook tests pass unchanged after the recordExternalPayment extraction.", "implemented": true, "featureIds": [ "F014" ] }, { "id": "T017", "mode": "automated", "description": "Customer applier: QBO rename refreshes mapping display name; deleted/inactive mapped customer files an exception.", "implemented": true, "featureIds": [ "F022" ] }, { "id": "T018", "mode": "automated", "description": "Drift comparator: total change \u2192 drift with both versions in the exception; balance-only change \u2192 no drift; doc-number change \u2192 drift.", "implemented": true, "featureIds": [ "F023", "F024" ] }, { "id": "T019", "mode": "automated", "description": "Drift resolutions: re-export sparse-updates QBO (mocked), refreshes snapshot, clears drift and closes the task; accept refreshes snapshot without touching the Alga invoice.", "implemented": true, "featureIds": [ "F025", "F026" ] }, { "id": "T020", "mode": "automated", "description": "QBO-side void of a mapped invoice \u2192 external-voided mapping state + drift exception; status read action reports Voided.", "implemented": true, "featureIds": [ "F027", "F037" ] }, { "id": "T021", "mode": "automated", "description": "Auto-export producer: finalize with auto-sync on + connected realm enqueues export_invoice; off, CE, or disconnected \u2192 no-op.", "implemented": true, "featureIds": [ "F028", "F004" ] }, { "id": "T022", "mode": "automated", "description": "Outbound drain: pending export ops grouped into one batch with origin 'scheduled'; delivered ops marked done, failed ops carry the batch error.", "implemented": true, "featureIds": [ "F029", "F003" ] }, { "id": "T023", "mode": "automated", "description": "Scheduled-batch validation failure (missing item mapping) files accounting_sync_export_error and fails the op.", "implemented": true, "featureIds": [ "F030" ] }, { "id": "T024", "mode": "automated", "description": "Manual batch creation marks matching pending export ops done (no double export).", "implemented": true, "featureIds": [ "F031" ] }, { "id": "T025", "mode": "automated", "description": "Exception dedupe: a second occurrence for the same entity+type updates the open task's context; resolving allows a fresh task next occurrence.", "implemented": true, "featureIds": [ "F033", "F032" ] }, { "id": "T026", "mode": "automated", "description": "Token countdown: crossing 14/7/2-day thresholds notifies once per threshold; repeated cycles inside a threshold don't re-notify.", "implemented": true, "featureIds": [ "F035" ] }, { "id": "T027", "mode": "automated", "description": "Cycle summary notification fires only on cycles that produced new exceptions.", "implemented": true, "featureIds": [ "F036" ] }, { "id": "T028", "mode": "automated", "description": "Status aggregation: mapping+ops permutations produce Not synced / Queued / Synced / Drift / Error / Voided correctly (table-driven).", "implemented": true, "featureIds": [ "F037" ] }, { "id": "T029", "mode": "automated", "description": "UI contract: InvoiceSyncBadge renders each state with tooltip content (doc number, last synced, deep link present).", "implemented": true, "featureIds": [ "F038", "F039" ] }, { "id": "T030", "mode": "automated", "description": "UI contract: settings health panel renders cycle summary, counts with inbox links, token countdown; auto-sync toggle persists via the setting action.", "implemented": true, "featureIds": [ "F041", "F004" ] }, { "id": "T031", "mode": "automated", "description": "Sync-now action is EE + billing_settings gated and triggers a cycle (mocked runner).", "implemented": true, "featureIds": [ "F012", "F040" ] }, { "id": "T032", "mode": "automated", "description": "DB-backed integration: seeded tenant with one exported invoice; mocked QBO returns CDC payment + invoice edit; one cycle \u2192 invoice paid, drift exception filed, queued invoice exported in a scheduled batch, cursor advanced, cycle stats recorded.", "implemented": false, "featureIds": [ "F008", "F016", "F024", "F029" ] }, { "id": "T033", "mode": "automated", "description": "Migrations up/down clean for accounting_sync_cycles, accounting_sync_operations, batches.origin, task definitions.", "implemented": false, "featureIds": [ "F001", "F002", "F003", "F032" ] }, { "id": "T034", "mode": "live-smoke", "description": "Sandbox: connect, finalize an invoice with auto-sync on \u2192 appears in QBO within one cycle; badge flips Queued \u2192 Synced with working deep link.", "implemented": false, "featureIds": [ "F028", "F029", "F038" ] }, { "id": "T035", "mode": "live-smoke", "description": "Sandbox: receive payment in QBO \u2192 Alga invoice flips to paid within one cycle; portal shows paid.", "implemented": false, "featureIds": [ "F016" ] }, { "id": "T036", "mode": "live-smoke", "description": "Sandbox: edit the QBO payment amount \u2192 Alga follows (partially_applied); delete the payment \u2192 reversal, invoice back to sent.", "implemented": false, "featureIds": [ "F018", "F019" ] }, { "id": "T037", "mode": "live-smoke", "description": "Sandbox: edit an exported invoice's amount in QBO \u2192 drift exception appears in inbox; re-export resolution restores QBO and clears the badge.", "implemented": false, "featureIds": [ "F024", "F025" ] }, { "id": "T038", "mode": "live-smoke", "description": "Sandbox: record a payment against a QBO-only invoice \u2192 unmapped-payment exception with usable context.", "implemented": false, "featureIds": [ "F020" ] }, { "id": "T039", "mode": "live-smoke", "description": "Sandbox: force token expiry (tamper stored credential) \u2192 connection-expired notification + health panel shows expired; reconnect restores cycles.", "implemented": false, "featureIds": [ "F034", "F035", "F041" ] }, { "id": "T040", "mode": "live-smoke", "description": "Sandbox: Sync Now from settings and from invoice detail both produce an immediate cycle; health panel reflects the run.", "implemented": false, "featureIds": [ "F012", "F040", "F041" ] }, { "id": "T041", "mode": "live-smoke", "description": "Regression sanity: client-portal Stripe payment still lands correctly (invoice paid, transaction written) after the recordExternalPayment refactor.", "implemented": false, "featureIds": [ "F014" ] } ]