Repository navigation
v0.11.0
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
- @ericlakich made their first contribution in #470
Full Changelog: v0.10.1...v0.11.0