Skip to content

WP14: absolute cost ranges + derived CU anchor + FoM/prioritization upgrade#29

Merged
HeliCorgi merged 5 commits into
masterfrom
wp14-cost-fom
Jul 11, 2026
Merged

WP14: absolute cost ranges + derived CU anchor + FoM/prioritization upgrade#29
HeliCorgi merged 5 commits into
masterfrom
wp14-cost-fom

Conversation

@HeliCorgi

Copy link
Copy Markdown
Owner

Implements spec §6 WP14 + §4 amendments. Zero existing numbers moved — CU coefficients, both FoM weight tables, amortization (0.285×), tornado, all 95 pre-existing wp6 CSV keys verified value-identical vs master by the adversarial pass.

What this adds

  • Itemized absolute-cost table (12 rows × low/mid/high MUSD), every row carrying a bracketed provenance flag (D10, test-enforced): [web-verified] (SpaceX rideshare card, Electron 10-Q, AWS Ground Station rates, FCC fee schedules, insurance-market reports, NASA CEH reserves) / [web-verified (analog)] / [training-data extrapolation] (the 9-t kit unit) / [PLACEHOLDER] (SSA — LeoLabs declines to quote; stated, not faked).
  • Runtime-derived CU→MUSD anchor — 5-CU-mapped-components-only numerator over the baseline C_campaign CU p50, full arithmetic printed in the CSV notes: 0.0628 / 0.1546 / 0.4213 MUSD/CU (launch width deliberately preserved: low=rideshare $0.35M ... high=dedicated $7.5M). Campaign rows split into auditable core_5_component / additives / base_total / with_reserves (contingency % on base; insurance % on asset-scale insured value only, never on multi-year opex). Config cu_to_musd_* stay 0.0 sentinels — the anchor is derived, not configured.
  • cost_per_risk_equiv_mass (+ MUSD) — reciprocal of the FoM percentiles by construction (documented: NOT the percentile of per-run reciprocals).
  • generated/wp14_prioritization.{csv,md} (new stdlib tool + ctest): per-class FoM/cost/kit table + one-paragraph defense per class; SL-16 first (mass-dominant under both weightings + McKnight top-20-all-SL-16), SL-8 second, Envisat-class = separate controlled-reentry mission class. D12: legal enters as gate+flags, never a FoM factor.
  • README number-block automation + CI gate (closes review finding C4 permanently): tools/readme/fill_readme_numbers.py regenerates the WP5/WP6 marker blocks from the committed CSVs; CI runs it and the reproducibility gate now includes README.md.
  • Evidence pack: "Absolute cost ranges (WP14)" section (all numbers machine-read; provenance flags lifted from the CSV notes themselves) + the PLACEHOLDER inventory gains the spec-mandated importance column (140 marks: 56 decision-critical / 43 moderate / 41 cosmetic).

Honesty framing (baked into artifacts, audit-enforced)

"External absolute-cost estimation by an unaffiliated author is inherently low-standing; agencies re-run with their own parametric models; the relative CU results remain primary." No point-value currency anywhere ('$' glyph banned + tested; ranges only). The criticality FoM weighting got a citation-only upgrade: McKnight 2021 anchors the 840–850 km peak, but non-peak ratios are not extractable from accessible sources, so the weight VALUES stay PLACEHOLDER — inventing dynamic range would be fabrication (T5 stays open; the mass-sort critique is acknowledged in the artifacts).

Disclosed deviations / scope notes (spec §10)

  1. FoM weight values unchanged (citation-only upgrade, see above).
  2. Viz task simplified: no cost_per_risk_equiv_mass chart (it is 1/FoM by construction — redundant with the existing FoM chart); the four wp6-consuming viz files changed only their embedded schema string (1.0→1.1). wp5_dashboard.html changed by that same 1 token — no wp5 datum moved.
  3. cost_per_risk_equiv_mass_musd is emitted at the mid anchor only (CU version carries full p05/p50/p95; low/high anchors are in-file, dollar bounds trivially derivable).
  4. fill_readme_numbers.py runs as its own CI step, not inside regenerate_all.sh (README is repo-root, outside that script's generated/+evidence/ contract — commented in ci.yml).
  5. SL-8's MUSD figures in the prioritization table reuse the catalog-A-derived anchor (no SL-8 anchor exists) — stated in the artifact itself.

Verification

  • CI fully green ×2 (build + 18/18 ctest incl. new prioritization and readme_numbers suites + regenerate_all/12 + the extended README gate).
  • Mandatory adversarial verification (spec §10): PASS, zero blockers — anchor & campaign rows recomputed independently to exact match; 3 cited rows live-web re-verified (SpaceX card, FCC $12,215 NGSO smallsat fee incl. RPO/OOS, NASA ~25% Class C/D reserves); '$'-glyph scan zero hits; pins verified byte-present. Its one substantive nit (an "identical by construction" overstatement in a cross-check note) was fixed and re-verified before this PR.

🤖 Generated with Claude Code

HeliCorgi and others added 5 commits July 12, 2026 01:11
…C++ side)

Adds the WP14 cost layer WITHOUT moving any existing number: CU coefficients,
both FoM weight tables, amortization, tornado -- all byte-identical code paths.

- cost.hpp: CostItemUsd + wp14_cost_items(); wp6 schema 1.0 -> 1.1;
  cu_to_musd_low/high stay 0.0 sentinels (comment: superseded -- the anchor
  is runtime-DERIVED, not configured).
- cost.cpp: 12-row itemized table transcribed from the web-verified source
  pack (SpaceX rideshare card Feb-2026, Electron 10-Q, AWS Ground Station
  rates, FCC fee schedules, NASA CEH reserves, insurance-premium reports;
  tiers preserved: [web-verified] / [web-verified (analog)] /
  [training-data extrapolation] / [PLACEHOLDER] -- SSA row stays PLACEHOLDER,
  LeoLabs declines to quote). New CSV rows (additive column cost_scenario +
  record_types): cost_component_musd; currency_anchor_derived = 5-CU-mapped-
  components-only numerator (dev/bus/kit*N/launch/ops, launch low=rideshare
  0.35 / high=dedicated 7.5 preserving the source's do-not-narrow width) over
  the baseline C_campaign CU p50 (179.195140), full arithmetic printed in
  notes -> anchor 0.0628..0.4213 MUSD/CU; campaign_cost_musd split into
  auditable core_5_component / additives (ground+licensing+ssa) / base_total /
  with_reserves (contingency pct on base + insurance pct on asset-scale
  insured value only, never on multi-year opex); cost_per_removal_musd;
  cost_per_risk_equiv_mass (+_musd) = reciprocal of the FoM percentiles BY
  CONSTRUCTION (documented: NOT the percentile of per-run reciprocals).
- schema md rewritten for 1.1 with the D10 sourced-or-PLACEHOLDER rule and
  the honesty framing (absolute ranges are low-standing; CU stays primary;
  no point-value currency -- '$' remains banned and tested).
- test_cost.cpp: quote-aware RFC-4180-lite CSV splitter (WP14 notes contain
  literal commas), WP14 row assertions (anchor ordering, with-reserves >
  base, note-flag suffixes, itemized count), reciprocal identity asserted
  against the %.6f round-trip (exact by construction).

Round-1 note: generated/wp6_* regenerate with schema 1.1 on CI; the repro
gate is expected RED this push and the artifacts get committed next (the
documented no-local-toolchain flow, as in WP13). Build + ctest must be green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The WP14 itemized-cost table adds honestly-inventoried PLACEHOLDER lines
(SSA row, kit-unit extrapolation flags) and shifts existing mark line
numbers in cost.{hpp,cpp}. Auto-inventory only; no quoted number changes.
Unblocks CI ctest so regenerate_all can emit the schema-1.1 wp6 artifacts
for the follow-up commit (same flow as WP13).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Byte-for-byte from CI run 29159453886 (documented no-local-toolchain flow):
- wp6_cost_summary.csv: cost_scenario column + cost_component_musd (12 items
  x low/mid/high, each sourced-or-PLACEHOLDER), currency_anchor_derived
  (0.0628 / 0.1546 / 0.4213 MUSD/CU with the full 5-component arithmetic in
  notes), campaign_cost_musd core/additives/base_total/with_reserves,
  cost_per_removal_musd, cost_per_risk_equiv_mass(+_musd). All pre-existing
  rows value-identical.
- wp6_cost_schema.md: version 1.1 documentation.
- wp6_cost_summary.md: derived-anchor wording.
- viz SVGs + dashboard: captions embed schema_version (1.0 -> 1.1); the
  plotted values are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…CEHOLDER

importance classes, README number-block automation + CI gate

Python layer over the schema-1.1 artifacts (all stdlib, R9; all six local
suites green including the two NEW ctests):

- NEW tools/prioritization/make_prioritization.py -> generated/
  wp14_prioritization.{csv,md}: per-class FoM p50 (both weightings),
  cost/removal CU p50 + MUSD range via the derived anchor (SL-8 reuses the
  catalog-A anchor -- stated in the artifact, not hidden), recommended kit
  from WP13, D12 gate-not-multiplier sentence, one-paragraph defense per
  class (SL-16 first: mass-dominant under BOTH weightings + McKnight
  top-20-all-SL-16; SL-8 second: cheap sail kit, high count; Envisat-class:
  separate controlled-reentry mission class, not kit-ranked), and the T5
  honesty note (criticality weighting McKnight-anchored at the peak,
  non-peak ratios PLACEHOLDER, mass-sort critique acknowledged).
  + test_prioritization.py ctest (determinism, committed==regenerated,
  no-$-glyph, banned-words, required-content).
- make_evidence.py: "Absolute cost ranges (WP14)" subsection -- anchor band
  with 5-component provenance, base_total/with_reserves, cost/removal MUSD,
  cost_per_risk_equiv_mass, PLACEHOLDER/training-data flags read from the
  CSV notes themselves, honesty framing quoted from the schema doc.
  PLACEHOLDER inventory gains the spec-mandated importance column
  (decision-critical: 56 / moderate / cosmetic) with the count assert
  updated in test_evidence.py in the same commit (X+Y+Z==N).
- NEW tools/readme/fill_readme_numbers.py (+ ctest readme_numbers):
  regenerates the README WP5-NUMBERS/WP6-NUMBERS marker blocks from the
  committed CSVs, byte-exact against the current README; --check mode.
  ci.yml runs it after regenerate_all and the reproducibility gate now
  includes README.md -- closing the hand-maintained-README-numbers silent
  drift gap (review finding C4) permanently.
- regenerate_all.sh: prioritization step inserted, labels renumbered /12.
- main_kit_trade.cpp + committed wp13_classC.md (byte-identical static-string
  edit): the classC cost row no longer says "PLACEHOLDER until WP14" -- it
  points at the WP14 itemized rows; the Envisat row honestly states WP14
  ranges are servicer-campaign-scale and a controlled-reentry mission needs
  its own estimate (open). Evidence pack regenerated (inventory reflects the
  removed stale marks).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…n notes

The cost_per_removal_musd cross-check note said 'identical by construction',
but the tool multiplies by the 6dp-ROUNDED anchor while the wp6 row uses the
full-precision anchor -- the last printed digit can differ by rounding path
(2.812513 vs 2.812500, ~5 ppm; adversarial-verifier nit). Reworded to
'consistent to display precision' with the mechanism stated. Regenerated
artifacts (the evidence-pack inventory tracks the shifted source line).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@HeliCorgi HeliCorgi merged commit f41cb85 into master Jul 11, 2026
2 checks passed
@HeliCorgi HeliCorgi deleted the wp14-cost-fom branch July 11, 2026 17:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant