The owner (2026-10-13): when what wanderbooks knows is stale, check the date, research it or ask the owner or CPA, and update the rule for everyone with a pull request (best) or an issue (worst). - ledger_core::rules: a registry of rules set by law that change over time. Each says the years it's known for, its rules.md entry, its vendored official source, and a review date. stale_rules(today) is pure; the engine has no clock. - The 1099 threshold is the first: $600 through 2025, $2,000 in 2026, then indexed for inflation (26 U.S.C. §6041(h)). default_threshold and vendor_1099_report now return Result; for 2027+ they refuse with LedgerError::RuleNotKnown, whose message says what to do: get the figure from the official source or the owner/CPA, pass it explicitly, then open a PR (or issue) at github.com/swaits/wanderbooks. Before, 2027+ silently used $2,000. - MCP: books.vendor_1099 relays that refusal; books.digest gains stale_rules; the server instructions tell the agent the procedure (and how to handle control-account conflicts: explain, never renumber). The CPA package writes a NOT-INCLUDED note instead of a guessed 1099 worksheet. - Viewer: "Needs attention" shows each stale rule with a ready prompt for the agent; the 1099 page explains instead of guessing. Review date for the 1099 rule: 2026-11-01, when the IRS usually publishes next year's inflation adjustments (CONVENTION, marked as such in the registry). Tests: an_unknown_year_threshold_is_never_guessed, dated_rules_go_stale_on_their_review_date (dates passed in, so no clock in the test), MCP stdio: 2027 refused with guidance, explicit threshold accepted, digest carries stale_rules (asserted date-independently). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GWVo7x3UHw5kwCUaWxiejX
73 lines
2.9 KiB
Rust
73 lines
2.9 KiB
Rust
//! `ledger-core`: canonical double-entry bookkeeping semantics.
|
|
//!
|
|
//! This crate is the engine. Everything else in the workspace — persistence,
|
|
//! import, the oracle harness, the UI — builds on top of it and never
|
|
//! reimplements accounting logic.
|
|
//!
|
|
//! Design rules (see `AGENTS.md` at the repo root):
|
|
//!
|
|
//! * Money is [`Money`]: an exact [`rust_decimal::Decimal`] plus an ISO 4217
|
|
//! currency code. Binary floats never touch money paths.
|
|
//! * A [`Ledger`] is single-currency for now (see `docs/requirements.md` R-5).
|
|
//! * All mutations go through [`Ledger`] commands (`create_entry`, `add_line`,
|
|
//! `post_entry`, `reverse_entry`). Posted entries are immutable; corrections
|
|
//! are reversing entries.
|
|
//! * Reports ([`trial_balance`], [`balance_sheet`], [`profit_and_loss`]) are
|
|
//! pure functions of a ledger, which is what makes the semantic oracle
|
|
//! (`docs/oracle.md`) possible.
|
|
|
|
pub mod account;
|
|
pub mod analysis;
|
|
pub mod arap;
|
|
pub mod assets;
|
|
pub mod classes;
|
|
pub mod error;
|
|
pub mod form1099;
|
|
pub mod journal;
|
|
pub mod kernel;
|
|
pub mod ledger;
|
|
pub mod money;
|
|
pub mod payouts;
|
|
pub mod payroll;
|
|
pub mod periods;
|
|
#[cfg(kani)]
|
|
mod proofs;
|
|
pub mod reports;
|
|
pub mod rules;
|
|
pub mod schedules;
|
|
pub mod tax;
|
|
|
|
pub use account::{Account, AccountId, AccountType, ChartOfAccounts, Side};
|
|
pub use arap::{
|
|
AgingRow, Bill, BillId, Customer, CustomerId, DocumentLine, DocumentStatus, Invoice, InvoiceId,
|
|
Vendor, VendorId,
|
|
};
|
|
pub use assets::{
|
|
Asset, AssetId, AssetStatus, DepreciationMethod, DisposalAmounts, NewAsset, ScheduleLine,
|
|
accumulated_depreciation, book_value, depreciation_schedule, disposal_amounts,
|
|
};
|
|
pub use classes::{Class, ClassId};
|
|
pub use error::LedgerError;
|
|
pub use form1099::{Form1099, Vendor1099Line, Vendor1099Report, vendor_1099_report};
|
|
pub use journal::{EntryId, EntryStatus, JournalEntry, JournalLine};
|
|
pub use ledger::{
|
|
ControlAccount, GENERAL_EXPENSES, Ledger, PAYABLES, PAYROLL, RECEIVABLES, RETAINED_EARNINGS,
|
|
REVENUE, ReconciliationReport, UnclearedLine,
|
|
};
|
|
pub use money::{Currency, Money};
|
|
pub use payouts::{Payout, PayoutAdjustment, PayoutLine, PayoutTotals, payout_plan};
|
|
pub use payroll::{PayrollLine, PayrollRun, PayrollRunId};
|
|
pub use periods::{CloseTo, MemberClose, Period, PeriodId, PeriodStatus, RETAINED_EARNINGS_CODE};
|
|
pub use reports::{
|
|
BalanceSheet, BalanceSheetStatement, CashFlowLine, CashFlowParams, CashFlowStatement,
|
|
ClassProfitAndLoss, GeneralLedger, LedgerAccount, LedgerPosting, MemberCapital,
|
|
MemberEquityColumn, MembersEquityStatement, ProfitAndLoss, ProfitAndLossStatement,
|
|
StatementLine, TrialBalance, TrialBalanceLine, balance_sheet_as_of, cash_flow, general_ledger,
|
|
members_equity, profit_and_loss_for_period, trial_balance_as_of,
|
|
};
|
|
pub use schedules::{
|
|
AmortizationSchedule, Frequency, NewRecurring, NewSchedule, RecurringEntry, RecurringId,
|
|
ScheduleId, ScheduleKind, TemplateLine,
|
|
};
|
|
pub use tax::{TaxCategory, TaxForm, TaxKind, TaxSummary, TaxSummaryLine, tax_summary};
|