Files
bookspec/examples/p3-party-tin-last4.toml
T
swaitsandClaude Opus 5.5 01c920c4a7 P3 review: the surface, docs and proofs
Split kernel::entry_flows into entry_movements and flows_of so the
reversal-mirror proof fits CI; prove runs the fast harnesses, prove-slow
the 8 slow ones (own job in scheduled CI), prove-all both. Laws in
verification.md renumbered 1-31 with a table of all 55 harnesses.

MCP docs checked against the 115 tools (about 60 fixes) with a test that
every tool is documented; rules.md cross-references fixed; bookspec
statuses and loader tightened; viewer notes wrap and accounts sort by
code; STATUS.md says P3 is built, cutover pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01T3gXMVt7XJPi6ens1or9Dj
2026-10-22 02:13:08 -06:00

87 lines
2.1 KiB
TOML

# P3 defect 11 (audit finding F28): the directory showed a member's TIN as
# missing because it read W-9 facts only. Regression tests: ledger-core
# tests/spec_party_totals.rs
# defect11_a_partys_tin_last4_is_its_tin_facts_else_its_w9s; ledger-mcp
# tests/spec_vault.rs defect11_the_directory_shows_a_members_tin_last4.
# The shape: bookspec/README.md.
id = "p3-party-tin-last4"
title = "A party's TIN last four is its TIN facts', else its W-9's"
rule = """
The books keep a taxpayer identification number truncated to its last
four digits. A party's last four is its TIN facts' (a member's SSN for
the K-1), else its W-9 facts'; the two never disagree. A TIN purged from
the vault keeps its last four in the books. A party with neither has
none.
"""
status = "CHOICE"
sources = [
"Treas. Reg. §301.6109-4(a): a truncated TIN shows the last four digits (wanderbooks docs/spec/sources/irs-truncated-tin.md)",
"DECISION (owner, 2026-10-15): a party's TIN facts and W-9 facts never disagree (wanderbooks ledger-core parties INVARIANT 2a)",
]
tags = ["parties", "tin", "w9", "k1"]
# Nothing is posted: the facts are the directory's.
events = []
[setup]
currency = "USD"
fiscal_year_start = "01-01"
basis = "accrual"
rounding = "half-even"
[[setup.accounts]]
code = "1000"
name = "Checking"
type = "asset"
[[setup.parties]]
name = "Tobin Harlow"
roles = ["member"]
tin_last4 = "4321"
[[setup.parties]]
name = "Riley Chen"
roles = ["contractor"]
w9_tin_last4 = "8765"
[[setup.parties]]
name = "Morgan Ellis"
roles = ["member", "contractor"]
tin_last4 = "1111"
w9_tin_last4 = "1111"
[[setup.parties]]
name = "Lakeside Supply"
roles = []
[[setup.parties]]
name = "Avery Quinn"
roles = ["member"]
tin_last4 = "2468"
tin_purged = true
[[expect]]
query = "party_tin_last4"
party = "Tobin Harlow"
values = { tin_last4 = "4321" }
[[expect]]
query = "party_tin_last4"
party = "Riley Chen"
values = { tin_last4 = "8765" }
[[expect]]
query = "party_tin_last4"
party = "Morgan Ellis"
values = { tin_last4 = "1111" }
[[expect]]
query = "party_tin_last4"
party = "Lakeside Supply"
values = { tin_last4 = "" }
[[expect]]
query = "party_tin_last4"
party = "Avery Quinn"
values = { tin_last4 = "2468" }