[ { "id": "F001", "description": "Define a recurring due-work row contract that can represent both client billing-cycle windows and contract-cadence execution windows.", "implemented": true }, { "id": "F002", "description": "Add a stable due-work identity model with row key, execution identity key, selection key, and retry key semantics for recurring invoice targets.", "implemented": true }, { "id": "F003", "description": "Add a due-work reader action that returns invoice-ready recurring rows from persisted recurring service periods instead of only client billing cycles.", "implemented": true }, { "id": "F004", "description": "Teach the due-work reader to surface compatibility client-cadence rows where billing-cycle-backed recurring invoices still rely on `client_billing_cycles`.", "implemented": true }, { "id": "F005", "description": "Return cadence-source metadata on due-work rows so the UI can distinguish client schedule vs contract anniversary windows.", "implemented": true }, { "id": "F006", "description": "Return service-period labels and invoice-window labels on due-work rows so operators can see what will be billed before preview.", "implemented": true }, { "id": "F007", "description": "Return contract and contract-line context on due-work rows when the target is contract-cadence-derived.", "implemented": true }, { "id": "F008", "description": "Return early/due status and other operator-visible state on due-work rows without relying on `client_billing_cycles.period_end_date` alone.", "implemented": true }, { "id": "F009", "description": "Provide a repository/read layer over `recurring_service_periods` for due selection outside the billing engine hot path.", "implemented": true }, { "id": "F010", "description": "Persist or derive schedule-key and period-key fields into the due-work reader so the UI can correlate future edits, generated runs, and historical invoices.", "implemented": true }, { "id": "F011", "description": "Include lifecycle-state filtering in due-work selection so only invoiceable recurring service periods surface in ready-to-invoice views.", "implemented": true }, { "id": "F012", "description": "Suppress billed, archived, superseded, and otherwise non-due recurring service periods from the ready-to-invoice reader.", "implemented": true }, { "id": "F013", "description": "Expose due-work rows even when no `billing_cycle_id` bridge exists, using selector-input execution windows as the primary identity.", "implemented": true }, { "id": "F014", "description": "Add backfill support so active recurring obligations have materialized recurring service periods before the UI depends on them.", "implemented": true }, { "id": "F015", "description": "Add replenishment support so future recurring service periods stay generated far enough ahead for billing operations.", "implemented": true }, { "id": "F016", "description": "Add regeneration support for recurring service periods when contract cadence, timing, anchors, or activity windows change.", "implemented": true }, { "id": "F017", "description": "Widen the recurring service-period participation model so hourly recurring obligations can invoice on service-driven cadence windows.", "implemented": true }, { "id": "F018", "description": "Widen the recurring service-period participation model so usage recurring obligations can invoice on service-driven cadence windows.", "implemented": true }, { "id": "F019", "description": "Resolve whether hourly/usage support requires widening the persisted `charge_family` constraint or a family-agnostic due-window layer, and implement the chosen model.", "implemented": true }, { "id": "F020", "description": "Link billed recurring service periods back to invoice charge detail rows for all recurring execution-window paths, not only bridged billing-cycle invoices.", "implemented": true }, { "id": "F021", "description": "Repair recurring service-period linkage when recurring invoices are deleted, reversed, or rebuilt from service-driven windows.", "implemented": true }, { "id": "F022", "description": "Expose generation gaps or missing-materialization state so operator surfaces can explain why expected recurring due rows are absent.", "implemented": true }, { "id": "F023", "description": "Add a service-period generation/replenishment runbook or system action entrypoint that billing operators can invoke when due rows are missing.", "implemented": true }, { "id": "F024", "description": "Ensure duplicate-prevention semantics remain deterministic for recurring due-work rows with and without `billing_cycle_id` bridges.", "implemented": true }, { "id": "F025", "description": "Replace `AutomaticInvoices` ready-to-invoice loading with the new due-work reader instead of `getAvailableBillingPeriods(...)`.", "implemented": true }, { "id": "F026", "description": "Update `AutomaticInvoices` row typing so the table can represent due-work rows without requiring `billing_cycle_id`.", "implemented": true }, { "id": "F027", "description": "Update `AutomaticInvoices` selection state to use execution-window identity rather than raw billing-cycle UUIDs.", "implemented": true }, { "id": "F028", "description": "Update `AutomaticInvoices` filtering and pagination to operate over due-work rows while preserving current search and date-filter behavior.", "implemented": true }, { "id": "F029", "description": "Show cadence-source, service-period, and invoice-window information in the ready-to-invoice grid.", "implemented": true }, { "id": "F030", "description": "Show contract-name or contract-line context for contract-cadence due-work rows in the ready-to-invoice grid.", "implemented": true }, { "id": "F031", "description": "Support bulk selection and batch generation for mixed client-cadence and contract-cadence due-work rows in one operator workflow.", "implemented": true }, { "id": "F032", "description": "Map recurring run failures back to the rendered due-work row even when no `billing_cycle_id` exists.", "implemented": true }, { "id": "F033", "description": "Replace `AutomaticInvoices` preview action with selector-input preview support so contract-cadence rows preview from execution windows.", "implemented": true }, { "id": "F034", "description": "Replace `AutomaticInvoices` generate action with selector-input execution where no billing-cycle bridge exists.", "implemented": true }, { "id": "F035", "description": "Replace `AutomaticInvoices` PO-overage batch analysis with selector-input-aware overage checks.", "implemented": true }, { "id": "F036", "description": "Replace `AutomaticInvoices` preview-dialog generate-from-preview flow with selector-input recurring generation.", "implemented": true }, { "id": "F037", "description": "Preserve the existing compatibility path for client-cadence billing-cycle rows during the UI cutover.", "implemented": true }, { "id": "F038", "description": "Show user-facing warnings or badges when a row is contract-cadence-based and has no client billing-cycle bridge.", "implemented": true }, { "id": "F039", "description": "Ensure preview state can store and reopen execution-window-based rows without assuming a `billing_cycle_id` key.", "implemented": true }, { "id": "F040", "description": "Ensure bulk and single-row PO-overage dialogs can address recurring due-work rows by execution identity.", "implemented": true }, { "id": "F041", "description": "Add a selector-input invoice preview action alongside the legacy `previewInvoice(billing_cycle_id)` wrapper.", "implemented": true }, { "id": "F042", "description": "Add a selector-input PO-overage action alongside the legacy `getPurchaseOrderOverageForBillingCycle(...)` wrapper.", "implemented": true }, { "id": "F043", "description": "Refactor invoice preview internals so preview generation reuses selector-input billing calculation rather than client-billing-cycle lookup logic.", "implemented": true }, { "id": "F044", "description": "Refactor recurring invoice generation APIs so selector-input execution is a first-class request contract, not an internal-only path.", "implemented": true }, { "id": "F045", "description": "Update recurring invoice bridge-id handling so preview/generate APIs tolerate nullable `billing_cycle_id` without losing duplicate detection or diagnostics.", "implemented": true }, { "id": "F046", "description": "Return service-period-aware failure details from preview/generate actions so the UI can explain selector-input errors accurately.", "implemented": true }, { "id": "F047", "description": "Ensure preview view models preserve canonical service-period detail rows regardless of cadence source.", "implemented": true }, { "id": "F048", "description": "Keep client billing email validation and PO validation working for selector-input recurring invoice generation.", "implemented": true }, { "id": "F049", "description": "Replace `getInvoicedBillingCyclesPaginated(...)` with a recurring invoiced-history reader that works for both bridged and unbridged recurring invoices.", "implemented": true }, { "id": "F050", "description": "Display invoiced recurring rows in the billing UI using service-period and execution-window metadata rather than only billing-cycle metadata.", "implemented": true }, { "id": "F051", "description": "Record and surface whether an invoiced recurring row came from client cadence or contract cadence in history views.", "implemented": true }, { "id": "F052", "description": "Rework reverse recurring invoice actions so they correctly restore or reopen recurring service-period state.", "implemented": true }, { "id": "F053", "description": "Rework hard-delete recurring invoice actions so they correctly repair recurring service-period linkage and lifecycle state.", "implemented": true }, { "id": "F054", "description": "Define operator semantics for deleting/reversing recurring invoices that have no `billing_cycle_id` bridge.", "implemented": true }, { "id": "F055", "description": "Keep compatibility delete/reverse behavior for legacy billing-cycle-backed recurring invoices during the cutover.", "implemented": true }, { "id": "F056", "description": "Add clear UI messaging for recurring history rows when reversal/delete affects service-period linkage rather than a client billing-cycle row.", "implemented": true }, { "id": "F057", "description": "Extend invoice preview request schemas to accept selector-input execution windows in addition to `billing_cycle_id`.", "implemented": true }, { "id": "F058", "description": "Extend invoice generation request schemas/controllers to accept selector-input execution windows in addition to `billing_cycle_id`.", "implemented": true }, { "id": "F059", "description": "Update InvoiceService preview generation to operate on selector-input execution windows instead of direct `client_billing_cycles` lookup.", "implemented": true }, { "id": "F060", "description": "Update API controller/service flows so recurring preview/generate behavior is symmetric between browser actions and API endpoints.", "implemented": true }, { "id": "F061", "description": "Update invoice list/filter contracts where necessary so recurring invoices can be filtered or inspected by execution-window metadata rather than only `billing_cycle_id`.", "implemented": true }, { "id": "F062", "description": "Update invoice response models where necessary to surface recurring execution metadata without breaking legacy consumers.", "implemented": true }, { "id": "F063", "description": "Remove direct `client_billing_cycles.cycle_id` assumptions from invoice preview service code paths that should now be selector-input-driven.", "implemented": true }, { "id": "F064", "description": "Preserve compatibility wrappers for external callers that still send `billing_cycle_id` while routing them through the selector-input pipeline internally.", "implemented": true }, { "id": "F065", "description": "Add minimal operator-facing view/manage surfaces for recurring service periods where billing operations need to inspect future generated windows.", "implemented": true }, { "id": "F066", "description": "Wire recurring service-period governance permissions into the new operator-facing service-period review/manage surfaces.", "implemented": true }, { "id": "F067", "description": "Add regeneration or repair operator actions for recurring service periods when due-work rows are stale, missing, or mislinked.", "implemented": true }, { "id": "F068", "description": "Add explicit UI or workflow handling for recurring service-period conflicts discovered during regeneration/backfill.", "implemented": true }, { "id": "F069", "description": "Ensure recurring workflow/run events and diagnostics distinguish contract-cadence windows in started/completed/failed billing runs.", "implemented": true }, { "id": "F070", "description": "Ensure support/debug logs and UI error states include execution identity when a recurring due-work row does not have a billing-cycle bridge.", "implemented": true }, { "id": "F071", "description": "Document the cutover sequence from billing-cycle-driven recurring invoicing to service-driven invoicing for operators and implementers.", "implemented": true }, { "id": "F072", "description": "Add migration/runbook steps for backfilling, replenishing, validating, and repairing recurring service periods before enabling the full UI cutover.", "implemented": true }, { "id": "F073", "description": "Restrict AutomaticInvoices preview to single-member invoice candidates so grouped candidates cannot silently preview only the first member.", "implemented": true }, { "id": "F074", "description": "Render AutomaticInvoices contract context from candidate members and show explicit metadata warnings when contract identity is partially missing.", "implemented": true }, { "id": "F075", "description": "Use exhaustive cadence-source formatting in AutomaticInvoices (including unknown-source fallback copy) instead of defaulting unknown values to client schedule.", "implemented": true }, { "id": "F076", "description": "Make recurring run target selection candidate-first end to end, including one-target-per-candidate semantics and pagination totals derived from candidate pages.", "implemented": true }, { "id": "F077", "description": "Block invoicing of partially materialized recurring windows by validating missing eligible persisted selections before generation.", "implemented": true }, { "id": "F078", "description": "Enrich due-work candidate grouping inputs with real scope/currency/tax/export split keys so grouping reflects actual invoice-splitting constraints.", "implemented": true }, { "id": "F079", "description": "Remove legacy billing-window recurring generation fallbacks and migrate remaining callers/tests to canonical selector-input execution contracts.", "implemented": true }, { "id": "F080", "description": "Refactor billingInvoiceTiming integration assertions to validate candidate-level behavior directly rather than flattening members into row-style checks.", "implemented": true }, { "id": "F081", "description": "Migrate admin client billing configuration reads/writes from `client_contract_lines` to the post-drop `client_contracts -> contracts -> contract_lines` structure.", "implemented": true }, { "id": "F082", "description": "Migrate client-portal billing/account/services reads from `client_contract_lines` to the post-drop contract structure.", "implemented": true }, { "id": "F083", "description": "Remove template-contract fallback joins from live billing computations so instantiated contract lookups depend on canonical `client_contracts.contract_id` only.", "implemented": true }, { "id": "F084", "description": "Split contract detail and template detail assignment loading so template IDs are not accepted in instantiated contract-assignment queries.", "implemented": true }, { "id": "F085", "description": "Stop `ContractLineService` from mutating `client_contracts.template_contract_id` as a runtime fallback side effect.", "implemented": true }, { "id": "F086", "description": "Extend client-contract-line post-drop static hygiene guards to include `packages/client-portal` and `packages/clients` test coverage.", "implemented": true }, { "id": "F087", "description": "Centralize paginated recurring due-work response types in `@alga-psa/types` and consume the shared contracts across billing actions and UI.", "implemented": true }, { "id": "F088", "description": "Decide and implement final `billingCycleId` semantics on recurring due-work rows (remove from canonical contract or mark as explicit legacy display-only metadata).", "implemented": true } ]