Skip to content

v0.11.0

Choose a tag to compare

@github-actions github-actions released this 12 Aug 03:26
· 149 commits to main since this release
0972963

Container image

docker pull ghcr.io/recurso-dev/recurso:v0.11.0

The Docker image is the release artifact; no binaries are attached.

What's Changed

  • docs(handoff): progress through v0.10.1 — the write-off arc by @swapnull-in in #479
  • fix(api): pagination consistency wave — unbounded lists bounded, inverted clamp honored, spec gaps closed by @swapnull-in in #480
  • fix(charts): don't animate in hidden documents — frozen rAF left charts looking empty by @swapnull-in in #481
  • fix(portal,ledger): Outstanding honors applied credit; ledger read stops masking PG errors with the unscoped TB fallback by @swapnull-in in #482
  • feat(tax): optional street address on SalesTaxQuery for rooftop rates by @ericlakich in #470
  • feat(ziptax): Ziptax US sales-tax provider adapter by @ericlakich in #469
  • fix(reliability): contain panics in detached goroutines — one nil-deref no longer crashes the API by @swapnull-in in #483
  • fix(security): portal logout revokes session server-side; magic-link stops leaking customer existence by @swapnull-in in #484
  • fix(integrations): one active tax provider per tenant + open remediation plan by @swapnull-in in #485
  • fix(ux): deferred tie-out never says 'unexplained'; Usage renders an error state (#466-B, #7a) by @swapnull-in in #486
  • fix(api): dedicated rate-limit bucket for expensive endpoints (#8) by @swapnull-in in #487
  • feat(observability): context-aware logging so incidents are reconstructable (#10) by @swapnull-in in #488
  • feat(validation): centralized currency/country validators, ISO-dataset backed (#12) by @swapnull-in in #489
  • fix(security): portal magic-link hardening — POST-body token + generic verify errors (#18) by @swapnull-in in #490
  • docs: source-of-truth folder (product, design, brand, UX, accounting, API, website, competitors) by @swapnull-in in #491
  • docs: re-derive source-of-truth docs from the codebase (evidence-based) + ARCHITECTURE + governance by @swapnull-in in #492
  • feat(accrual): increment 1 — Bad Debt Expense account + AccountingPolicy seam (#466/#477) by @swapnull-in in #493
  • docs(design): DESIGN.md §A — Recurso-specific hybrid direction + the trust filter by @swapnull-in in #494
  • feat(accrual): increment 2 — write-off bad-debt split (recognized→Bad Debt) (#466/#477) by @swapnull-in in #495
  • feat(accrual): increment 3 — schedule-at-issuance switch (opt-in) + pending-event cancel (#466) by @swapnull-in in #496
  • feat(accrual): increment 4 — exclude scheduled invoices from awaiting-payment; tie-out verified zero (#466) by @swapnull-in in #497
  • feat(accrual): backfill_schedules tool — issuance schedules for existing open invoices (#466) by @swapnull-in in #498
  • test(portal): behavioral coverage for login, redeem, verify by @swapnull-in in #499
  • fix(security): enforce portal CSRF via double-submit token (#25) by @swapnull-in in #500
  • fix(validation): reject negative money amounts at the API edge (#20) by @swapnull-in in #501
  • test(fx): lock the per-report/concurrency contract with a -race test (#21) by @swapnull-in in #502
  • fix(ui): scroll wide simulator tables + consolidate ad-hoc dates (#13, #26) by @swapnull-in in #503
  • ci: guard against a silent-skip of the ledger invariant harness (#23) by @swapnull-in in #504
  • docs(openapi): add operationId to the 16 unnamed operations (#19 partial) by @swapnull-in in #505
  • feat(ui): server-side pagination for Mandates + Disputes (#9 partial) by @swapnull-in in #506
  • feat(accrual): enforce 'Revenue Recognized ≤ recognizable' invariant in CI (#466) by @swapnull-in in #507
  • docs(adr): accounting ADRs (007-009) + defer brand refresh to post-GA by @swapnull-in in #508
  • feat(accounting): stamp revenue schedules with accounting-model version (#466, ADR-008) by @swapnull-in in #509
  • feat(accounting): journal-level accounting-model provenance (#466, ADR-008 inc 2) by @swapnull-in in #510
  • feat(accounting): surface accounting_version in the general-ledger export (#466, ADR-008) by @swapnull-in in #511
  • docs(design): restructure DESIGN.md for AI-assisted engineering (your review) by @swapnull-in in #512
  • docs(art): ART_DIRECTION.md — the missing creative-direction layer (your review) by @swapnull-in in #513
  • Dashboard polish: readable numbers + richer Events/Audit/Integrations inspectors by @swapnull-in in #514
  • Dunning: KPI context + navigable retry-history invoices by @swapnull-in in #515
  • Extend invariant harness: credit-note leg completeness by @swapnull-in in #516
  • Harness: assert every reconciler discrepancy class (5 → 10) by @swapnull-in in #517
  • Reconciler: detect missing credit-application (A/R drawdown) legs by @swapnull-in in #518
  • Risk register: log the reversal/drawdown-leg gap class (R-008..R-011) by @swapnull-in in #519
  • Reconciler: Customer-Credit liability invariant (systemic drawdown-leg check) by @swapnull-in in #520
  • Harness: exercise credit expiry & void end-to-end (close R-008, R-009) by @swapnull-in in #521
  • Risk register: correct R-010/R-011 (covered by close-pack tie-out) by @swapnull-in in #522
  • Ledger: name code 7 (LedgerCodeCreditApplication) — close R-004 by @swapnull-in in #523
  • Harness: exercise gateway refunds (close R-006) by @swapnull-in in #524
  • Harness: assert close-pack Deferred identity (layer 2) — close R-011 by @swapnull-in in #525
  • Risk register: correct R-010 (layer-2 doesn't hard-detect write-offs) by @swapnull-in in #526
  • Reconciler: write-off leg completeness check (close R-010) by @swapnull-in in #527
  • Reconciler: count wallets in Customer-Credit invariant (close R-014) by @swapnull-in in #528
  • Harness: exercise prepaid-wallet top-up money path (R-007 wallets) by @swapnull-in in #529
  • Harness: exercise wallet invoice-time drain money path (R-007 wallets) by @swapnull-in in #530
  • Harness: exercise promotional wallet-credit expiry sweep (R-007 wallets) by @swapnull-in in #531
  • Harness: exercise wallet closure refund+forfeit legs (R-007 wallets complete) by @swapnull-in in #532
  • Harness: exercise payment-reversal / chargeback cycle (R-007 code 19) by @swapnull-in in #533
  • Risk register: correct R-005 multi-currency analysis (disprove false-unbalance, pin masking gap) by @swapnull-in in #534
  • Harness: JPY multi-currency wallet op — empirically validate R-005 (reconciler safe) by @swapnull-in in #535
  • Risk register: R-015 — deferred_below_scheduled masks per-entity shortfall (+ fix landmine) by @swapnull-in in #536
  • Reconciler: per-entity deferred-vs-scheduled check (close R-015) by @swapnull-in in #537
  • Reconciler: don't flag no-money-moved refund notes (close R-013) by @swapnull-in in #538
  • Ledger: route primary postings to the primary account, not a sibling entity's (close R-016) by @swapnull-in in #539
  • Reconciler: Output-Tax leg completeness check + exercise it in the harness (R-007) by @swapnull-in in #540
  • Test: recognition-worker concurrency (two racing ProcessDueEvents, exactly-once) by @swapnull-in in #541
  • Test: dunning-retry-worker concurrency (racing claims disjoint, no double-charge) by @swapnull-in in #542
  • ADR-010: the GL is single-functional-currency; multi-currency GL out of scope by @swapnull-in in #543
  • docs: product design review (2026-08) — scored audit + sequenced fix plan by @swapnull-in in #544
  • Design Wave 0: component foundation — states, motion, button loading, table a11y by @swapnull-in in #545
  • Design Wave 0: FormField/Input a11y wiring (aria-invalid + describedby) by @swapnull-in in #546
  • Design Wave 0: shared ui/Switch + adopt in IRP/EU e-invoicing settings by @swapnull-in in #547
  • Design Wave 1: correctness-of-trust fixes (Profile bug, fake column, MCP confirm) by @swapnull-in in #548
  • Design Wave 1: fix headline/receipt currency rendering (Dashboard MRR, Checkout) by @swapnull-in in #549
  • Design Wave 1: right-align money columns in commerce tables (DESIGN §6) by @swapnull-in in #550
  • Landing: public marketing front door at / for signed-out visitors by @swapnull-in in #551
  • Typography: self-host Inter + JetBrains Mono; render money in a real mono by @swapnull-in in #552
  • Design Wave 1: render money via on commerce tables + a test matcher by @swapnull-in in #553
  • Design Wave 1: render money via on Ledger + Referrals tables by @swapnull-in in #554
  • Design Wave 1: fix OfflinePayments money alignment + render via by @swapnull-in in #555
  • Design Wave 2: resolve the Disputes customer to a name (not a raw UUID) by @swapnull-in in #556
  • Design Wave 2: give BillingSettings a real error path (was the worst offender) by @swapnull-in in #557
  • fix(collections): retryable error instead of $0 revenue-at-risk when analytics fails by @swapnull-in in #558
  • feat(credit-notes): scoped invoice picker instead of free-text UUID by @swapnull-in in #559
  • fix(developers): retryable error instead of empty list on failed reads by @swapnull-in in #560
  • fix(dashboard): retryable error on total outage instead of a page of zeros by @swapnull-in in #561
  • fix(portal): show customers their invoice number, not a truncated UUID by @swapnull-in in #562
  • fix(quotes): toast send/convert outcomes instead of silent console errors by @swapnull-in in #563
  • style(money): Quotes + Collections queue amounts in tabular-mono by @swapnull-in in #564
  • fix(ledger): name accounts from the entry instead of leaking a truncated UUID by @swapnull-in in #565
  • feat(reconciliation): drill from a discrepancy's invoice id to that invoice by @swapnull-in in #566
  • feat(developers): copy-ready authenticated-request quickstart (new CodeSample) by @swapnull-in in #567
  • feat(developers): document webhook signature verification (copy-ready samples) by @swapnull-in in #568
  • feat(statcard): metric definition tooltip; explain the Collections KPIs by @swapnull-in in #569
  • feat(dashboard): explain the MRR, Churn, and Recovered KPIs with definitions by @swapnull-in in #570
  • feat(ui): CopyableSecret primitive with copy-confirmation (API key + webhook secret) by @swapnull-in in #571
  • feat(analytics): define the ambiguous unit-economics + retention metrics by @swapnull-in in #572
  • feat(analytics): define dunning success rate + trial-balance debit/credit totals by @swapnull-in in #573
  • feat(exec-summary): define the headline finance metrics (ARR, NDR, LTV, deferred) by @swapnull-in in #574
  • feat(auth): show/hide password toggle on every credential field (PasswordInput) by @swapnull-in in #575
  • fix(team): confirm a role change before applying it (privilege guard) by @swapnull-in in #576
  • fix(tax): confirm before clearing all declared nexus (compliance guard) by @swapnull-in in #577
  • feat(auth): focus the first field on load across the auth forms by @swapnull-in in #578
  • feat(settings): persistent settings sub-nav (SettingsLayout with Outlet) by @swapnull-in in #579
  • refactor(data): migrate Churn + CancelFlows to react-query (ADR-005, batch 1) by @swapnull-in in #580
  • refactor(data): migrate Events + AuditLog to react-query (ADR-005, batch 2) by @swapnull-in in #581
  • refactor(data): migrate Usage + Organizations to react-query (ADR-005, batch 3) by @swapnull-in in #582
  • refactor(data): migrate BillingSettings + OfflinePayments to react-query (ADR-005, batch 4) by @swapnull-in in #583
  • refactor(data): migrate TaxNexusSettings to react-query (ADR-005, batch 5) by @swapnull-in in #584
  • refactor(data): migrate Wallets to react-query (ADR-005, batch 6) by @swapnull-in in #585
  • refactor(data): migrate Metering to react-query (ADR-005, batch 7) by @swapnull-in in #586
  • refactor(data): migrate Integrations to react-query (ADR-005, batch 8 — T8 complete) by @swapnull-in in #587
  • feat(ledger): type each entry's reference; drill invoice references to the invoice by @swapnull-in in #588
  • feat(aging): drill from an aging bucket to the invoices inside it by @swapnull-in in #589
  • chore(t10): delete dead portal code; cross-link the two revenue views by @swapnull-in in #590
  • chore(deps): bump nanoid to 3.3.18 for CVE-2026-67213 by @swapnull-in in #593
  • feat(gst): render GSTR-1/3B as structured statutory sections, not a JSON dump by @swapnull-in in #591
  • fix(ledger): GL export accepts a period; close-pack export is period-scoped by @swapnull-in in #592
  • fix(coupons): amount-off converts with a real currency, not an assumed USD by @swapnull-in in #594
  • fix(lists): push Subscriptions/Plans/Events filters to the server by @swapnull-in in #595
  • feat(forms): shared useFormErrors — inline errors + focus-first-error (T4) by @swapnull-in in #596
  • fix(invoices): load the whole invoice set, not the newest 250 by @swapnull-in in #597
  • docs(design-review): record closure of all 13 themes with PR map by @swapnull-in in #598
  • release: v0.11.0 — the design release by @swapnull-in in #599

New Contributors

Full Changelog: v0.10.1...v0.11.0