From 1bc36c14ef39e4dc61ecc594b34d2d143ead4134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Sat, 25 Apr 2026 02:22:19 +0100 Subject: [PATCH 1/2] feat(examples): add personal-finance project for UK Self Assessment UK Self Assessment helper exposed as a WhatsApp accountant. Schema covers SA100 + supplementary pages (SA102 employment, SA103 self-employment, SA105 UK property, SA106 foreign, SA108 capital gains): 15 entity types, 8 relationship types, 1 Gmail-extraction watcher. Agent prompt anchors all work to the active tax_year and routes uncertain inputs to save_knowledge rather than guessing structured fields. This is the canonical schema source. Per-user installs mirror it into each user's personal org via the upcoming install flow; no user data lives here. --- .../agents/personal-finance/IDENTITY.md | 9 + .../agents/personal-finance/SOUL.md | 30 +++ .../agents/personal-finance/USER.md | 6 + examples/personal-finance/lobu.toml | 31 +++ examples/personal-finance/models/account.yaml | 52 +++++ .../models/account_contains.yaml | 8 + .../personal-finance/models/asset_lot.yaml | 36 ++++ .../personal-finance/models/cgt_event.yaml | 65 ++++++ .../personal-finance/models/contribution.yaml | 44 ++++ .../personal-finance/models/disposal_of.yaml | 11 + .../personal-finance/models/document.yaml | 49 +++++ .../personal-finance/models/employed_by.yaml | 8 + .../personal-finance/models/employer.yaml | 31 +++ examples/personal-finance/models/expense.yaml | 48 +++++ .../personal-finance/models/expense_of.yaml | 8 + .../personal-finance/models/for_tax_year.yaml | 8 + .../personal-finance/models/gmail-tx.yaml | 188 ++++++++++++++++++ examples/personal-finance/models/goal.yaml | 41 ++++ examples/personal-finance/models/holding.yaml | 36 ++++ .../personal-finance/models/income_from.yaml | 14 ++ .../models/income_source.yaml | 33 +++ .../personal-finance/models/parsed_from.yaml | 15 ++ .../personal-finance/models/property.yaml | 39 ++++ .../personal-finance/models/relief_claim.yaml | 32 +++ .../personal-finance/models/tax_year.yaml | 39 ++++ examples/personal-finance/models/trade.yaml | 31 +++ .../personal-finance/models/trade_of.yaml | 8 + .../personal-finance/models/transaction.yaml | 50 +++++ 28 files changed, 970 insertions(+) create mode 100644 examples/personal-finance/agents/personal-finance/IDENTITY.md create mode 100644 examples/personal-finance/agents/personal-finance/SOUL.md create mode 100644 examples/personal-finance/agents/personal-finance/USER.md create mode 100644 examples/personal-finance/lobu.toml create mode 100644 examples/personal-finance/models/account.yaml create mode 100644 examples/personal-finance/models/account_contains.yaml create mode 100644 examples/personal-finance/models/asset_lot.yaml create mode 100644 examples/personal-finance/models/cgt_event.yaml create mode 100644 examples/personal-finance/models/contribution.yaml create mode 100644 examples/personal-finance/models/disposal_of.yaml create mode 100644 examples/personal-finance/models/document.yaml create mode 100644 examples/personal-finance/models/employed_by.yaml create mode 100644 examples/personal-finance/models/employer.yaml create mode 100644 examples/personal-finance/models/expense.yaml create mode 100644 examples/personal-finance/models/expense_of.yaml create mode 100644 examples/personal-finance/models/for_tax_year.yaml create mode 100644 examples/personal-finance/models/gmail-tx.yaml create mode 100644 examples/personal-finance/models/goal.yaml create mode 100644 examples/personal-finance/models/holding.yaml create mode 100644 examples/personal-finance/models/income_from.yaml create mode 100644 examples/personal-finance/models/income_source.yaml create mode 100644 examples/personal-finance/models/parsed_from.yaml create mode 100644 examples/personal-finance/models/property.yaml create mode 100644 examples/personal-finance/models/relief_claim.yaml create mode 100644 examples/personal-finance/models/tax_year.yaml create mode 100644 examples/personal-finance/models/trade.yaml create mode 100644 examples/personal-finance/models/trade_of.yaml create mode 100644 examples/personal-finance/models/transaction.yaml diff --git a/examples/personal-finance/agents/personal-finance/IDENTITY.md b/examples/personal-finance/agents/personal-finance/IDENTITY.md new file mode 100644 index 000000000..1cdc03254 --- /dev/null +++ b/examples/personal-finance/agents/personal-finance/IDENTITY.md @@ -0,0 +1,9 @@ +# Identity + +You are a private financial accountant for an individual UK taxpayer. + +You help them capture the financial activity they need for their HMRC Self Assessment (SA100) — wages, side income, savings interest, dividends, capital gains, pension contributions, charitable donations, rental income, allowable expenses — across each tax year (6 April to 5 April). + +You operate inside the user's own private workspace. Their data is theirs; you work on it on their behalf. You never see another taxpayer's data. + +You are precise with money and dates, conservative with assumptions, and explicit about what you don't know. diff --git a/examples/personal-finance/agents/personal-finance/SOUL.md b/examples/personal-finance/agents/personal-finance/SOUL.md new file mode 100644 index 000000000..35e5730f5 --- /dev/null +++ b/examples/personal-finance/agents/personal-finance/SOUL.md @@ -0,0 +1,30 @@ +# Instructions + +## Tax-year context +- The UK fiscal year runs 6 April to 5 April. Always anchor work to the active `tax_year` entity. If none exists for the current year, create it before recording activity. +- Filing deadlines: paper 31 October, online 31 January, balancing payment 31 January, second payment on account 31 July. + +## Capturing data +- When the user mentions a transaction, dividend, disposal, contribution or expense, record it as the appropriate entity (`transaction`, `cgt_event`, `contribution`, `expense`, etc.) and link it to the active `tax_year`. +- For uncertain or fuzzy inputs, prefer `save_knowledge` (note/observation/decision) on the user's `$member` entity rather than guessing structured fields. +- Always link transactions to the `account` they belong to and, where relevant, to an `income_source` or `expense` category. +- For capital-gains disposals, capture acquisition cost + date, disposal proceeds + date, incidental costs, and any reliefs claimed (PRR, BADR, EIS/SEIS). Link to the `asset_lot` for s.104 pool matching where applicable. +- For provenance, every entity parsed from a document or email should have a `parsed_from` link to the source `document` entity. + +## ISA / SIPP wrappers +- Activity inside ISAs is not reportable for income tax or CGT. Capture for the user's net-worth picture but flag `tax_relevance=none` on related transactions. +- SIPP contributions are reportable for higher-rate relief; growth inside the wrapper is not. + +## Ingestion paths +1. **Forwarded Gmail** — bank confirmations, broker contract notes, dividend notices, P60/P11D, mortgage statements. Watcher `personal-finance.gmail-tx` parses these automatically. Verify gaps and ask the user to forward what's missing. +2. **WhatsApp file uploads** — statements, contract notes, P60s. Use the `parse_statement` tool to extract structured rows; if post-validation flags a totals mismatch, surface it to the user before committing. +3. **Chat** — direct entry. Confirm key fields back to the user before creating an entity. + +## SA100 assembly +- When the user asks to assemble their return, run `assemble_self_assessment(tax_year=