Skip to content

Repository files navigation

FMP Calculator

For AbilityOne BD and pricing analysts: a transparent fair-market-price band builder that mirrors the U.S. AbilityOne Commission's official cost structure (Policy 51.601) with every number cited and every assumption named. Part of TENS HQ.

This tool produces a recommended-price band estimate, never "the FMP." Not affiliated with the U.S. AbilityOne Commission, SourceAmerica, or NIB.

What it produces

A provenance-carrying cost ledger. The table below is real output, not a mock-up: it is printed by python scripts/render_golden_ledger.py, which runs the shipped compute_services_ledger against golden vector 1 — one Janitor FTE, $18.00/hr WD base rate, 2,000 hours, 10% overhead, 5% G&A, 5% net proceeds, 3.75% Program Fee — and asserts every figure against tests/golden/services_single_occupation.json before it will print anything. The same assertion runs in CI as tests/test_golden_services.py.

Line Amount Provenance Basis
Direct labor $36,000.00 ESTIMATE base WD rate x effective hours
H&W fringe $11,100.00 ESTIMATE H&W 5.55 x effective hours (standard)
Other WD fringe (vacation/holiday/sick) $0.00 ESTIMATE other WD fringe hourly x effective hours
Payroll burden $3,289.00 ESTIMATE FICA/FUTA/SUTA/WC, annualized-per-employee approximation (ESTIMATE)
Materials $0.00 user-entered analyst-entered direct materials
Other Direct Costs $0.00 user-entered analyst-entered ODC (subcontracts/travel/equipment)
Overhead $5,038.90 ESTIMATE overhead_rate x labor base
G&A $2,771.40 ESTIMATE ga_rate x tci base
Net Proceeds $2,909.97 ESTIMATE net_proceeds x total_cost base
Rehabilitation costs (job coaches, vocational counselors) — unallowable, excluded $0.00 observed Procedure 51.610-01: rehab costs not allowable
Total NPA Compensation $61,109.27 ESTIMATE sum of the lines above
Program Fee $2,291.60 ESTIMATE on fee base $61,109.27
Recommended FMP $63,400.87 ESTIMATE Total NPA Compensation + Program Fee

Rate caveat: that 3.75% Program Fee is primary-verified only through 2025-12-31 — fmp/constants.py flags the extension to 2026-09-30 as "secondary-summarized, unconfirmed", and the app's Methodology & Citations page shows the same note. Re-verify the ceiling before quoting a current-period number.

Every derived line is labeled ESTIMATE, every factual line carries its provenance, and the unallowable rehabilitation-cost line is shown at $0.00 rather than hidden. The app's export renders the same ledger as a cited markdown packet.

Quickstart

python -m venv .venv
.venv/Scripts/activate        # Windows;  source .venv/bin/activate on POSIX
pip install -r requirements.txt
pip install -e . --no-deps
streamlit run app/Home.py

On Home, click "Load the seeded custodial-services demo" and walk Services → Band → Benchmarks → Export. See docs/DEMO.md for the 30-second script.

What it does

  • Services buildup — the Policy 51.601 provenance-carrying ledger (labor → fringe → burden → indirects → Net Proceeds → Total NPA Compensation → Program Fee → Recommended FMP).
  • Products buildup — the simplified Procedure 51.610-01 unit model (wholesale, not retail).
  • Band — Low/Med/High as three named full-recompute scenarios, never a confidence interval.
  • Option-year adjuster — the FAR 52.222-43 / 52.222-44 wage-delta pass-through (OH/G&A/profit frozen).
  • Handoff — loads a typed packet-fmp/v1 file and re-verifies it into the same scenario manual entry builds.
  • Benchmarks — live-but-honestly-empty USAspending comparable obligations + CALC+ ceiling rates.
  • Export — a cited markdown packet + a formula-injection-guarded CSV. Services lane only today; the products lane has no export yet.
  • Limits & Governance / Methodology & Citations — every constant, citation, effective date, and convention in one auditable place.

Testing

pytest                    # golden vectors + property + AppTest + envelope + socket + citation guards
python scripts/validate.py

Money is computed in Decimal (ROUND_HALF_UP, cents). Core modules are network-free (socket-guarded); network happens only behind injectable client Protocols and is never called in CI.

How this was built

I specified this app, cut it into gated slices, and verified each one; AI agents wrote most of the line-level code. The gate is what CI runs on every push: ruff check ., ruff format --check ., pytest, python scripts/validate.py, a headless Streamlit boot, and pip-audit -r requirements.txt.

An adversarial review pass then read slices 1–4. ADR-001 (docs/adr/ADR-001-products-carve-semantics.md) comes out of it — "Deciders: FMP Calculator maintainers (Slices 1–4 final review)" — and records what it found: the products buildup had reused the services-lane carve-out, one scenario-level dollar amount, and subtracted it from every unit's per-unit Total NPA Compensation, double-counting across lines and able to take a unit's fee base negative with no visible error. The fix is not a clamp — the carve became a per-line field, and the scenario-level one now raises there, because a fee base that quietly goes negative is worse than a refusal to compute. tests/golden/products_multi_unit_carve.json locks it.

That pass fixed one side and declared the other correct, and it was not. A later credibility review found the services lane still had no upper bound on the carve — a carve above Total NPA Compensation returned a negative fee base, a negative Program Fee and a negative Recommended FMP in silence — and found something worse next to it: because the packet-fmp contract deliberately carries no internal rates, a loaded handoff defaulted overhead, G&A and net proceeds to 0.00 and printed the result as Recommended FMP (ESTIMATE): $579,220.51, understated by the entire indirect load and labeled exactly like a computed figure. ADR-002 (docs/adr/ADR-002-refuse-unset-indirect-rates.md) records the fix: an unentered rate is None, not 0; every compute entry point and every render path refuses and names what is missing; and the app finally has the numeric inputs three shipped strings had been pointing at. An ESTIMATE label on an imputed zero is worse than no number, because it reads as computed.

The app arrives in the log as one commit, so the slice boundaries are not visible there; its Co-Authored-By trailer names Claude. The judgment calls — where the slices were cut, what to refuse to compute, and running an adversarial pass at all — are the part worth evaluating.

License

MIT — see LICENSE.

About

Transparent AbilityOne fair-market-price band calculator - mirrors Commission Policy 51.601 with every number cited. Assistive estimate, never 'the' FMP. Part of TENS HQ.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages