Back to the collection
Selected work / Decision support unknown

Swiss Retirement Planner

Compare Swiss retirement choices with traceable calculations and adviser-ready reports.

Rendered preliminary adviser report showing verified calculation status, executive summary, input quality, and six synthetic policy and scenario rows.

01 — The brief

Start with the useful tension.

The problem

Swiss retirement decisions combine dated evidence, pension choices, portfolio cash flows, tax and fee assumptions, and uncertainty. The implementation is designed to keep unsupported or conflicting inputs as named blockers instead of silently turning them into defaults.

The audience

Advisers reviewing local Swiss retirement scenarios and the households whose inputs are being evaluated; the captured surface is the adviser report profile.

My contribution

Independently built local-first Swiss retirement decision-support product and deterministic portfolio/reporting implementation by the portfolio owner.

02 — Capability ledger

What exists, what is next.

A plain-language status check, so a polished surface never implies more than the work supports.

Implemented

05
  • Immutable local evidence and input provenance

    The local case boundary records source bytes and hashes, separates evidence classes, and carries verification and blocker states through validation rather than treating missing or conflicting material as zero.

  • Deterministic exact-accounting portfolio runs

    The portfolio and ledger engines execute dated events with Decimal/minor-unit accounting, explicit event ordering, and residual checks; generated runs expose policy/scenario outcomes and accounting fields.

  • Sealed offline adviser report projection

    A configured adviser allowlist projects verified run artifacts into a preliminary HTML report with linked metrics, blockers, scenario rows, limitations, and no adviser-approved conclusion unless one is supplied.

  • Model-conditional synchronized historical bootstrap

    The stochastic boundary samples synchronized moving blocks across mapped historical columns, reruns each sampled path through the deterministic portfolio engine, and labels stability as model-conditional rather than a forecast.

  • Explicit limitations and non-advice delivery boundary

    Rendered reports keep preliminary/reviewed state visible, surface input quality and limitations, and state that the output does not execute transactions, elections, applications, or regulated advice.

Planned

00

Nothing recorded here yet.

Unverified

00

Nothing recorded here yet.

03 — Design decisions

The reasoning stays in the room.

01Represent settled money as exact minor units

Money and deterministic calculations avoid binary floating-point ambiguity by using strict minor-unit values and Decimal-based rounding at explicit boundaries.

02Capture case inputs once and hash the immutable snapshot

Compilation and execution retain the exact bytes and parsed snapshot used for a run, so mutable case-file rereads cannot silently change the calculation or its provenance.

03Render reports as read-only allowlisted projections

Reporting reads verified canonical run artifacts and applies an explicit profile allowlist, keeping raw documents and unapproved fields out of the human-facing pack.

04Keep bootstrap results model-conditional

The historical moving-block sampler preserves synchronized row provenance and reruns deterministic policies; stability output is labeled model-conditional and is not presented as a forecast.

05 — A short walk-through

See the shape of the interaction.

Capture storyboard

Planned bounded CLI-to-adviser-report capture

0:30
Storyboard · recording not supplied
  1. Start with a copied synthetic portfolio case and show the terminal command selecting capital-growth, capital-withdrawal, and capital-guardrails for R00 and M01; do not use private cases or real reports.
  2. Run the bounded deterministic command and show the emitted run directory, then run verify-run and show the exact provenance/accounting gate passing.
  3. Render the adviser profile into a new temporary output directory and run verify-report; keep the report visibly marked PRELIMINARY and avoid implying a recommendation.
  4. Open the local report, scroll from the executive summary to the policy/scenario outcome table and limitations, then stop on the synthetic, not-financial-advice report footer.

The materials

Built with care.

Stack
  • Python 3.13
  • Pydantic 2
  • Decimal exact accounting
  • NumPy (stochastic boundary)
  • PyMuPDF (PDF intake)
  • openpyxl (XLSX intake)
  • Offline HTML report rendering