Uploaded PDFs (P60, PSS, chargeable-event certificates) are parsed, then permanently deleted from UK-region object storage 24 hours later. An hourly cron enforces the cutoff; nothing carries over between paraplanner sessions.
A calc your compliance officer will sign.
The case for ParaplanAI, in four pillars: correctness, replayability, separation of concerns, and the post-2021/22 top-slicing rule done right.
Every published HMRC worked example. Zero pence tolerance.
The HMRC PTM (pension) and IPTM (bond) manuals publish worked examples. We extract each one to a JSON corpus and run it against the engine on every commit. The tolerance is zero pence— not a rounding band, not “close enough”, literal byte-for-byte equality with the HMRC-published numbers.
Every published HMRC worked example runs as a test at zero-pence tolerance.
Method: PTM 057100 (pension) · IPTM 3830 (bond) · IPTM3820 / HMRC Agent Update 83 (2021) (TSR PSA recalc)
Twelve months on, against the same versioned config.
Every calculation persists: the full inputs, the engine version, the tax-year config version, the date, the inputs in pence-integer form, the result, and every intermediate step. Twelve months later you can pull the row, feed the inputs back into the engine at the recorded version, and produce a byte-identical result.
The compliance annex PDF stamps the tool version, config version, and calculation date on the footer of every page. Signed results are immutable and replayable.
AI extracts the figures. Code calculates the tax. Never the other way around.
LLMs read the documents — P60, P11D, pension annual statements, chargeable-event certificates — and surface the figures for your review. Every extracted figure is shown on screen with its source. You approve before any calc runs.
Once approved, the figures feed into a pure-TypeScript calc engine with no network calls, no randomness, no LLM access, no hidden state. Same inputs in, same output out — every time, on any machine, in any tax year. The architectural rule is enforced by the codebase, not by intention.
This matters because LLM-generated arithmetic is not safe to put in front of a compliance officer. We never ship it.
Sub-processors (Anthropic, Supabase, Vercel, Stripe, Resend, Sentry) and the 30-day abuse-retention window on the extraction side: /privacy §4 →
The post-2021/22 top-slicing rule. Done right.
“Errors still exist in HMRC's tax calculations.”
AccountingWEB →·Tax Adviser Magazine: Learn to slice correctly →
IPTM3820 / HMRC Agent Update 83 (2021) changed top-slicing relief for chargeable-event gains arising on or after 6 April 2021: the post-2021/22 PSA/SRB recalculation that many tools miss. ParaplanAI applies this rule by default and tests it against the HMRC IPTM corpus on every commit.
HMRC's own published calculator still applies the pre-2021/22 method. Several widely-used third-party tools follow the same pattern; we're publishing a side-by-side comparison vs Quilter's Chargeable Event Gain XLSM and Absolute Topslicer on this page later in May 2026. The result of getting this wrong is a misstated tax liability — sometimes by tens of thousands of pounds when the gain pushes income through the PSA-zero threshold.
ParaplanAI applies the post-2021/22 rule by default. Every step of the PSA / SRB recalculation appears on the compliance annex with its IPTM 3820 citation. The codebase pins this as a load-bearing differentiator and tests it against the HMRC IPTM corpus on every commit.
Source PDFs gone in 24 hours. Audit trail kept for six years.
The replayability story has a counterpart: data minimisation. We hold the smallest set of fields a defensible calculation needs and purge raw source documents on a 24-hour horizon — an hourly cron, not a manual policy. The structured figures lifted from each document live on in the case record so the audit trail still resolves; the PDF bytes don't need to.
The structured figures lifted from each document live on in the case record so the calc run that consumed them stays replayable. Retention floor is six years from the calc date per FCA SYSC 9 — the audit trail is append-only and survives subscription cancellation.
The compliance annex you download is held in storage for 30 days by default so it can be re-fetched without re-running the calc. Firms on the Firm tier can extend retention to the regulatory floor; the audit-trail rows that re-render it are kept regardless.
Every published HMRC worked example. In public.
HMRC's Pensions Tax Manual (PTM) and Insurance Policyholder Taxation Manual (IPTM) publish worked examples. We extract each one to a machine-readable JSON corpus and run it against the calculation engine on every commit. The tolerance is zero pence. A single failing example blocks every merge to main.
Method: HMRC PTM and IPTM manuals · IPTM3820 (HMRC Agent Update 83, 2021) · Open Government Licence v3.0 · corpus.json →
PTM · Pension Annual Allowance, Carry Forward, Tapered AA, MPAA, LSA / LSDBA · 19 rows
| Family | ID | What it tests | HMRC source | Expected (summary) | Status |
|---|---|---|---|---|---|
| PTM | PTM-EX-01 | Basic Standard AA - No Taper, No Carry Forward | PTM052000, PTM053100 | standardAA: 60000 · applicableAA: 60000 · taperActive: false · carryForwardAvailable: 0 … +5 more | matched |
| PTM | PTM-EX-02 | Carry Forward from Prior 3 Years | PTM055100, PTM055200 | standardAA: 60000 · applicableAA: 60000 · carryForwardAvailable: 33000 · totalAllowance: 93000 … +3 more | matched |
| PTM | PTM-EX-03 | Tapered Annual Allowance, Taper Active, No CF | PTM057100, PTM057200 | standardAA: 60000 · taperActive: true · applicableAA: 50000 · carryForwardAvailable: 0 … +4 more | matched |
| PTM | PTM-EX-04 | Tapered AA with Carry Forward Interaction | PTM057100, PTM055100 | standardAA: 60000 · taperActive: true · applicableAA: 40000 · carryForwardAvailable: 17000 … +4 more | matched |
| PTM | PTM-EX-05 | MPAA Triggered - DC Cap Applied, CF Lost (default chargeable amount, ADR-026) | PTM056500 + PTM056510 (ADR-026) | standardAA: 60000 · applicableAA: 60000 · mpaaActive: true · dcAfterMPAA: 10000 … +9 more | matched |
| PTM | PTM-EX-05B | MPAA Triggered - alternative chargeable amount binds (DC>MPAA, large DB) (ADR-026 / P01-09) | PTM056510 (ADR-026) | standardAA: 60000 · applicableAA: 60000 · mpaaActive: true · dcAfterMPAA: 10000 … +8 more | matched |
| PTM | PTM-EX-06 | MPAA Already Active in Prior Year | PTM056500 | mpaaActive: true · dcAfterMPAA: 8000 · dbUnaffected: 30000 · effectivePIA: 38000 … +4 more | matched |
| PTM | PTM-EX-08 | Taper Reaches Minimum Floor (£10k for 2023/24+) | PTM057100 | standardAA: 60000 · applicableAA: 10000 · taperActive: true · totalAllowance: 10000 … +3 more | matched |
| PTM | PTM-EX-10 | Multiple Schemes - Combined PIA | PTM053100 | effectivePIA: 63000 · applicableAA: 60000 · totalAllowance: 60000 · excess: 3000 … +1 more | matched |
| PTM | PTM-EX-11 | 2022/23 - £40k AA with £4k Floor Taper | PTM052000, PTM057100 | standardAA: 40000 · taperActive: true · applicableAA: 35000 · totalAllowance: 35000 … +3 more | matched |
| PTM | PTM-EX-12 | 2023/24 - First Year of £60k AA | PTM052000 | standardAA: 60000 · applicableAA: 60000 · totalAllowance: 60000 · effectivePIA: 48000 … +3 more | matched |
| PTM | PTM-EX-13 | Carry Forward Partially Consumed | PTM055100, PTM055200 | carryForwardAvailable: 22000 · totalAllowance: 82000 · effectivePIA: 75000 · excess: 0 … +1 more | matched |
| PTM | PTM-EX-14 | AA Charge - Multi-Scheme High PIA | PTM057200 | effectivePIA: 74000 · applicableAA: 60000 · totalAllowance: 60000 · excess: 14000 … +1 more | matched |
| PTM | PTM-EX-09 | DB PIA from opening/closing capital values (16x factor, 2025-26 CPI revaluation) | PTM053100, PTM053301, FA 2004 s.235 | openingCapitalValue: 480000 · revaluedOpeningCapitalValue: 488160 · closingCapitalValue: 520000 · pensionInputAmount: 31840 … +1 more | matched |
| PTM | PTM-LSA-01 | PCLS within unused LSA — no excess | PTM171000, PTM176100; F(2)A 2023 Sch 9 | lsaStandard: 268275 · lsaConsumedThisEvent: 200000 · lsaConsumedCumulative: 200000 · lsaRemaining: 68275 … +2 more | matched |
| PTM | PTM-LSA-02 | PCLS exceeds remaining LSA after prior usage | PTM171000, PTM176100; F(2)A 2023 Sch 9 | lsaStandard: 268275 · lsaConsumedThisEvent: 68275 · lsaConsumedCumulative: 268275 · lsaRemaining: 0 … +2 more | matched |
| PTM | PTM-LSDBA-01 | PCLS consumes LSDBA in lock-step with LSA | PTM172000; F(2)A 2023 Sch 9 | lsdbaStandard: 1073100 · lsdbaConsumedThisEvent: 200000 · lsdbaConsumedCumulative: 200000 · lsdbaRemaining: 873100 … +2 more | matched |
| PTM | PTM-EX-07 | PTM-EX-07 100% earnings cap binding scenario reduces tested PIA below AA. Current orchestrator surfaces a warning but does not reduce PIA — see ADR-011 for default. Implement when v2 introduces full PTM044100 PIA-reduction semantics. | PTM-deferred | — | deferred |
| PTM | PTM-EX-09 | PTM-EX-09 DB scheme PIA from 16× capital valuation. PIA computation exists at calc-engine/pension/db-pia.ts (calculateDBPensionInputAmount) but the AA-orchestrator corpus harness only consumes pre-computed PIA inputs. Wire the DB-PIA computation into the corpus harness so this example can run end-to-end with capital-value inputs. | PTM-deferred | — | deferred |
IPTM · Investment Bond Chargeable Event Gain & Top-Slicing Relief · 13 rows
| Family | ID | What it tests | HMRC source | Expected (summary) | Status |
|---|---|---|---|---|---|
| IPTM | IPTM-HMRC-01 | HMRC IPTM3850 Example 1 (Amanda) — onshore single event, no PA withdrawal | HMRC IPTM3850 worked Example 1 (verbatim) | topSlicing.annualEquivalent: 10000 · topSlicing.taxAttributableToGain: 8846 · topSlicing.notionalTaxOnSlice: 846 · topSlicing.relievedLiability: 4230 … +3 more | matched |
| IPTM | IPTM-DERIVED-01 | Onshore basic-rate slice with PSA recalc — relief offsets full attributable tax | IPTM3820 + IPTM3820 (HMRC Agent Update 83, 2021) (author-constructed) | topSlicing.annualEquivalent: 10000 · topSlicing.psaStep4: 1000 · topSlicing.notionalTaxOnSlice: 0 | matched |
| IPTM | IPTM-DERIVED-02 | Offshore, no credit, basic-rate slice | IPTM3820 (author-constructed) | topSlicing.annualEquivalent: 8000 · topSlicing.psaStep4: 1000 · topSlicing.notionalTaxOnSlice: 1400 · topSlicing.relievedLiability: 7000 | matched |
| IPTM | IPTM-DERIVED-03 | PSA recalc divergence: full-gain pushes to higher rate, slice stays basic | IPTM3820 (HMRC Agent Update 83, 2021) (author-constructed; canonical post-2021/22 case) | topSlicing.psaStep3: 500 · topSlicing.psaStep4: 1000 | matched |
| IPTM | IPTM-DERIVED-04 | Additional-rate member, no PSA, no SRB | IPTM3820 + IPTM3870 (author-constructed) | topSlicing.psaStep3: 0 · topSlicing.psaStep4: 0 · topSlicing.srbStep3: 0 · topSlicing.srbStep4: 0 … +1 more | matched |
| IPTM | IPTM-EX-03-OFFSHORE | IPTM3820 (HMRC Agent Update 83, 2021) differentiator — offshore: PSA recalc drives £600 TSR uplift | IPTM3820 + IPTM3820 / HMRC Agent Update 83 (2021) (constructed post-2021/22 rule case; load-bearing regression anchor) | topSlicing.psaStep3: 500 · topSlicing.psaStep4: 1000 · topSlicing.srbStep3: 0 · topSlicing.srbStep4: 0 … +5 more | matched |
| IPTM | IPTM-EX-03-ONSHORE | IPTM3820 (HMRC Agent Update 83, 2021) differentiator — onshore sibling: PSA divergence masked by 20% slice credit | IPTM3820 + IPTM3820 / HMRC Agent Update 83 (2021) (constructed sibling to IPTM-EX-03-OFFSHORE) | topSlicing.psaStep3: 500 · topSlicing.psaStep4: 1000 · topSlicing.srbStep3: 0 · topSlicing.srbStep4: 0 … +5 more | matched |
| IPTM | IPTM-HMRC-EX2 | IPTM-HMRC-EX2 HMRC IPTM3850 Example 2 (Amanda, two onshore events £50k/5yr + £10k/4yr, employment £40k, 2022/23): HMRC's published TSR is £8,185.20 using the 7-step multi-event method (sum of per-policy annual equivalents £12,500; relieved liability via the (relieved × total gain)/total AE apportionment). RESOLVED 2026-05-26 (V2-F-020 / ADR-028 — supersedes ADR-014's weighted-N): the engine now implements the IPTM3840 sum-of-slices method and reproduces this example BYTE-EQUAL (£8,185.20). It is asserted in calc-engine/bond/__tests__/top-slicing.multi-gain.test.ts (both calculateMultiGainTopSlicingRelief directly and via the calculateBondTSR orchestrator). Remains in `deferred` here only because the JSON corpus harness consumes single-event inputs and cannot express extras.additionalBonds — the dedicated test is the runnable home. The superseded weighted-N path gave annual equivalent £12,000 / TSR £8,616. | IPTM-deferred | — | deferred |
| IPTM | IPTM-HMRC-EX3 | IPTM-HMRC-EX3 HMRC IPTM3850 Example 3 (Mike, £150k onshore gain over 5yr, employment £50k, 2022/23): HMRC's published TSR is £3,500. The engine returns £8,474. ROOT CAUSE (NEW FINDING — escalated, see issues-encountered.md Week 4): Mike's £200k total income withdraws his personal allowance in the WITH-gain (Step 1) calc. HMRC's Step-2/Step-3 'tax attributable to the gain' isolates the gain's OWN tax bands (£62,500 − £30,000 basic-rate credit = £32,500). The engine's difference method (taxWithGain − taxWithoutGain = £37,474) wrongly attributes the extra EMPLOYMENT tax caused by PA withdrawal to the gain, OVER-stating relief (and so UNDER-stating tax) by ~£4,974. This is compliance-unsafe and needs an ADR + fix (do NOT change calc behaviour without one — the difference method is correct for the no-PA-withdrawal case IPTM-HMRC-01 and underpins the Brief-12/2021 anchors). UNMODIFIED HMRC example retained as the regression target. | IPTM-deferred | — | deferred |
| IPTM | IPTM-EX-01 | IPTM-EX-01 Time Apportionment Rules (non-residence years) — out of scope for v1; require period-of-residence tracking inputs. | IPTM-deferred | — | deferred |
| IPTM | IPTM-EX-02 | IPTM-EX-02 Author's source-markdown worked example (docs/research/hmrc-iptm-bond-corpus.md EXAMPLE 3) has internal restarts and disputed arithmetic ('No, this is wrong... let me restart Step 4 properly'; multiple candidate AET interpretations). It is NOT an HMRC-published number set. Per CLAUDE.md §Testing it is not extracted. RESOLUTION (P06-07, 2026-05-23): superseded as a ground-truth source by the verbatim HMRC IPTM3850 examples now in this corpus (IPTM-HMRC-01 passing; IPTM-HMRC-EX2/EX3 deferred). The constructed Brief-12/2021 anchors IPTM-EX-03-OFFSHORE/ONSHORE remain the engine regression tests for the recalc rule. IPTM-EX-02 stays deferred — its arithmetic could not be canonicalised against an authoritative source. | IPTM-deferred | — | deferred |
| IPTM | IPTM-EX-03 | IPTM-EX-03 Superseded — author's primary markdown example is degenerate (notional income £57,500 stays in higher rate, PSA recalc has no rate-band effect; markdown explicitly notes 'PSA recalculation made NO DIFFERENCE'). Replaced by constructed IPTM-EX-03-OFFSHORE + IPTM-EX-03-ONSHORE. | IPTM-deferred | — | deferred |
| IPTM | IPTM-EX-05 | IPTM-EX-05 Multi-CEC aggregation. RESOLVED 2026-05-26 (V2-F-020 / ADR-028): the engine implements the IPTM3840 sum-of-slices multi-gain TSR (calculateMultiGainTopSlicingRelief), verified byte-equal against HMRC IPTM3850 Example 2 in top-slicing.multi-gain.test.ts. Stays in `deferred` only because this JSON harness consumes single-event inputs; the dedicated test is the runnable home. | IPTM-deferred | — | deferred |
Find a mismatch? Email info@paraplanai.co.uk — confirmed mismatches in matched rows are patched within seven calendar days.
Where HMRC is ambiguous, here's what we apply.
Where HMRC guidance is ambiguous, we record the interpretation we apply and which way any error leans — available on request.
Wherever a default could turn out to be the wrong reading, we hold the conservative direction — the one that never silently understates a tax charge or over-relieves. Firms should confirm acceptance in writing before adopting the output.
HMRC PTM / IPTM · IPTM3820 (HMRC Agent Update 83, 2021) · Questions? info@paraplanai.co.uk →
- Privacy notice — what we collect, how long we keep it, who else sees it.
- Terms of service — the planning-only output, retention promises, billing.
- Security — controls, sub-processors, breach-notification commitment.
- Data minimisation — what we hold, what we don't, and how long for.
- Data Processing Agreement — UK GDPR Art. 28 contract for firms.
- Help & SLA — support channels and per-tier response targets.