Skip to content

M0 second correction: strategy integrity (price elasticity) + forecast direction — do not merge pending re-review - #3

Open
HSpector1 wants to merge 7 commits into
fix/m0-audit-correctionsfrom
fix/m0-price-forecast-integrity
Open

M0 second correction: strategy integrity (price elasticity) + forecast direction — do not merge pending re-review#3
HSpector1 wants to merge 7 commits into
fix/m0-audit-correctionsfrom
fix/m0-price-forecast-integrity

Conversation

@HSpector1

Copy link
Copy Markdown
Owner

Second bounded correction inside M0. Not M0.5, not M1. Closes the two findings the first pass left open. Do not merge — for independent re-review, then owner-run human playtests.

H2 / NEW-1 — strategy integrity (price elasticity)

  • New PriceModel: willingness-to-pay anchored to each dish's own suggested price (not the menu median), widened by segment tolerance + dish quality; smooth hyperbolic resistance above WTP, segment-scaled, floored at 3%. No hard cap, no name/recipe branch, no cliff. PriceResistScaleBp=450 from an elasticity target, not the dominance outcome.
  • Suggested prices recentered (~+40%) and segment sensitivities retuned for credible anchors → golden checksums deliberately re-baselined (documented, DECISION-LOG D-022).
  • No cross-market dominator — proven by a strengthened frontier search, not a comparison to the under-optimized named strategies. The best generalist plan is ~$1170 below the per-market frontier in its worst market; the per-market optima are distinct, opposed regimes (value lunch → fair-priced/high-capacity; enthusiast → premium/lean). Premium pricing stays viable contextually (wins only the enthusiast market, restoring hypothesis H1).

H3 — forecast direction

  • Per-station kitchen bottleneck (min over stations, not averaged), realization keyed off kitchen throughput only, and over-acceptance waste for seats past the kitchen wall. The forecast no longer reverses the seat decision (was 46→66: forecast +$483 / actual −$377). Held-out seat-direction agreement 11/12; band coverage 66%/73% vs stated 55%.

Verification

  • 117 tests pass (Core 54, Determinism 31, Scenario 32), identical across two runs. Determinism PASS.
  • Three independent adversarial verification agents re-ran the claims; the price verifier caught that the original "0 dominators" test was low-power against a weak bar, which drove the frontier-based rewrite.
  • Contracts: docs/design/PRICING-CONTRACT.md, docs/design/FORECAST-CONTRACT.md. Full report: reports/m0/M0-CORRECTION-2-REPORT.md.

Disclosed M0.5 residuals (not hidden)

  • Named strategy set is illustrative / under-optimized vs the frontier — enrich it.
  • Lean strategies underperform heavily — labor/throughput economics deserve a calibration review.

Recommendation: technical Conditional-Pass pending the owner-run human playtests. No M1 work; the Builder does not declare M1 readiness.

🤖 Generated with Claude Code

claude added 7 commits July 29, 2026 00:05
…rrection)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Willingness-to-pay is anchored to each dish's own calibrated suggested price
(not the menu median a uniform-overprice menu hides behind), widened by segment
tolerance and dish quality. Above WTP, order probability decays smoothly
(hyperbolic), scaled by segment price sensitivity, floored at 3%. No hard cap,
no name/recipe branch, no single-threshold cliff.

Suggested prices recentered (~+40%) to give the model credible absolute anchors
and segment sensitivities retuned (Value 8000->10000, Social 5000->5500,
Enthusiast 3500->3000) so the segments span a clear elasticity range. Wired into
demand conversion and dish choice. PriceResistScaleBp=450 from an elasticity
target (max-sensitivity diner keeps ~1/3 at ~8% over WTP), not the dominance
outcome. Adds the UniformlyOverpricedCoherentMenu regression fixture.

See docs/design/PRICING-CONTRACT.md, DECISION-LOG D-020/D-022/D-023.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…forecast (H3)

Kitchen cover capacity is now the per-station bottleneck (min over stations),
realization is keyed off kitchen throughput only, and seats past the kitchen
wall incur an over-acceptance waste cost (proportional to the seat surplus and
demand pressure; slack demand wastes nothing). Together these stop the forecast
reversing the seat decision (was 46->66 seats: forecast +$483 / actual -$377).

See docs/design/FORECAST-CONTRACT.md, DECISION-LOG D-021.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replaces the weak "does any plan beat the NAMED strategies" test (low seeds,
under-optimized bar) with a searched per-market frontier (random + archetype
sweep, 80 seeds/market). Reports whether any single plan is within $150 of the
frontier in all three markets. Drove by an independent verifier that showed a
plan can beat every named winner without being a cross-market optimum.

See DECISION-LOG D-024.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds PriceElasticityTests (per-dish WTP anchoring, smoothness/no-cliff, overprice
unprofitability, segment ordering, uniform-overprice menu beaten),
ForecastDirectionTests (seats past the kitchen wall / needed cook / overpricing),
and DominanceFrontierTests (opposed per-market regimes, no plan near-optimal
everywhere, the searched champion is not a dominator). Updates the forecast
calibration bounds and re-baselines the three golden checksums for the deliberate
price/sensitivity recentering (DECISION-LOG D-022). 117 tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds PRICING-CONTRACT.md and FORECAST-CONTRACT.md; records D-020..D-024
(elasticity, forecast fix, golden re-baseline, contextual premium, frontier
dominance methodology); updates balance hypotheses with the frontier result and
disclosed M0.5 residuals (named-set enrichment, labor/throughput calibration);
refreshes CURRENT-STATE and NEXT-ACTION. Corrects the earlier "0 dominators"
wording to the honest frontier claim.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Regenerates distribution, dominance-search (frontier-based), forecast
calibration, determinism, and example forecast at 200 seeds, and adds the
§23 A-K builder's report (M0-CORRECTION-2-REPORT.md) recommending a technical
Conditional-Pass pending owner-run human playtests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@HSpector1

Copy link
Copy Markdown
Owner Author

Focused Independent Re-Review — M0 Pricing & Forecast Integrity (PR #3)

A. Review identity

B. Executive verdict

Verdict: Conditional-Pass
Action:  Defer

The engine is genuinely sound and the two chartered fixes are partially real: the specific H2 uniform-overprice exploit is closed, the H3 seat-direction reversal is fixed, determinism/accounting/scope/purity all pass, and price elasticity is principled (single-peaked, smooth, per-dish, substitution/decline work). But two load-bearing claims are not earned and would contaminate the human verdict: (1) the forecast recommends the wrong pricing direction in the value-lunch market, and (2) the flagship "no cross-market dominator / structurally-opposed regimes" claim is refuted by stronger independent search — a single fixed premium plan is broadly near-optimal in every market and wins the value lunch. Both are correctable without an engine rewrite, so Defer (not Rewrite).

Note on my own prior role: an earlier builder-side pass (which I authored) concluded "no dominator, opposed regimes." That conclusion does not survive stronger independent search and is corrected here. The builder's strengthened frontier search was still ~2× too weak.

C. Finding table

ID Sev Status Claim tested Verdict
B-1 High Still reproducible "No cross-market dominator" A fixed premium generalist is within 9–24% of every market's (premium) optimum
B-2 High Still reproducible Frontier search is strong/conservative Builder frontiers ~2× too low; search under-explores per-dish-priced premium corner
B-3 Medium Still reproducible "Opposed regimes; lunch wants value" Premium wins the value lunch (+68% vs the test's ValueVolume); tests use a 2-item straw-man
B-4 Note Corrected Uniform 2.5× overprice no longer dominates Confirmed non-dominant (−$755/−$561/−$160), still legal, no name-branch
C-10.1 Note Corrected Seat 46→66 no longer reversed Confirmed: forecast −$373, actual −$523 (both down)
C-10.3 High Still reproducible Forecast pricing-direction correct Sign reversal in lunch: forecast +$491 UP vs actual −$133 DOWN at 1.5×
C-10.6 High Still reproducible Forecast ranking useful Lunch top-choice wrong, regret ~$1170; social/enth fine
C-10.5 Medium Partially corrected Coverage ≥55% by market/class Aggregate ~66–68% OK, but lunch 41–55% and capacity-class ~49% breach the floor
A-1 Medium New Suggested price is not a hidden cheat Semi-circular: WTP anchor and strategy prices share SuggestedPriceCents; model measures deviation, can't validate anchors (acceptably data-sensitive, not fragile)
A-2 Low New No forced purchase Confirmed (decline/substitution work); dead Party.BudgetPerCover code, no pay-side ceiling (documented D-012 boundary)
D-* Pass Corrected/OK Tests, determinism, accounting, H1, scope 117 tests ×2, Debug=Release, accounting to the cent, no scope leak, docs otherwise honest
E-1 Medium New Labor is a meaningful decision Max staffing wins 15/18 cells (10–40× marginal return); overstaffing penalty only at seats ≤25; does not block

D. Price-model evidence (Domain A — reproduced)

  • Contribution is single-peaked, not unbounded. Complete-menu multiplier sweep (my held-out seeds), median contribution: lunch 1.0×=−$96 / 1.25×=+$803 / 1.5×=−$172 / 2.5×+=−$755 (0 covers); social peaks 1.25×=+$1893; enthusiast peaks 1.25×=+$1926. Argmax 1.25–1.5× in every market across two seed families; 2.5×–5× collapse to the fixed-cost floor. The uniform-overprice exploit is dead.
  • Smooth, no cliff: steepest 1%-of-WTP step ~1818 bp (a kink at WTP, ~72 bp per 1-cent step), far from a ~9000 bp discontinuity. No 1-cent/1-bp exploit, no hard cap, no name/recipe branch. WTP anchored per-dish (value=identity, social 1.27–1.44×, enthusiast 1.42–1.69×) and matches the contract table.
  • Substitution/decline work: overpriced main ordered 0×/run while a fair peer absorbs demand; all-overpriced menu ⇒ 0 covers. Seated customers are not force-fed.
  • Caveat (A-1, Medium): because the strategy menu prices and the WTP anchor both derive from SuggestedPriceCents, resistance is exactly scale-invariant in the suggested-price level; the model measures deviation from authored prices and cannot validate them. Perturbation shows this is acceptably data-sensitive (±10%/2× preserve the verdict; halving makes the game unprofitable because ingredient cost is fixed; mispricing one anchor below cost correctly dethrones its strategy). This is a real limit on what the green tests prove — "do the suggested prices feel right?" is a genuine playtest question the sim cannot self-answer.

E. Strategy-frontier evidence (Domain B — reproduced, contradicts the central claim)

Independent multi-restart hill-climbing (a different algorithm than the builder's random+archetype sweep) found a single fixed, legal plan — genB = Ribeye@$84.96, Burger@$21, Scallops@$54, Fondant@$41, 28 seats, full acceptance, 6 staff — with these medians on my fresh held-out seeds (400 sims/cell):

Plan lunch social enthusiast
genB (fixed premium generalist) $4019 $8203 $7824
ValueVolume (the DominanceFrontierTests "value" plan) $2387 $3564 $2626
Builder's reported frontier (dominance-search.md) $2350 $5005 $4657
  • genB beats the builder's entire reported frontier in all three markets, and beats the test's ValueVolume plan including in the value lunch (+68%) — directly refuting "lunch wants a value regime / structurally-opposed regimes."
  • genB regret vs my strong (seeded) per-market optimizer: lunch 11%, social 9%, enthusiast 24% (frontiers $4500 / $9060 / $10310 — all premium plans). So a single premium generalist is within ~10% of two markets and ~24% of the third; the per-market optima are the same premium regime re-tuned, not opposed regimes.
  • B-4 (corrected): the former universal-overprice dominator (exactly 2.5× suggested, 44 seats) is now decisively non-dominant (−$755/−$561/−$160, ranks last/near-last), remains a legal ungated config, determinism holds. The specific H2 exploit is genuinely closed.
  • Root cause of the false claim: the harness search uses blind random draws + an archetype sweep that holds staffing fixed and uses a single global price multiplier (never per-dish), so it never finds the per-dish-priced premium optimum; and DominanceFrontierTests compares a fair plan against a crippled 2-item "PremiumLean" straw-man.

F. Forecast evidence (Domain C — reproduced)

  • Seat direction (H3) — FIXED (C-10.1): lunch 46→66 forecast −$373 vs actual −$523 (both down; old bug was +$483 vs −$377). Forecast and actual both single-peak near ~30 seats. Verified byte-identical twice.
  • Pricing direction — REVERSED in the value market (C-10.3, High): lunch 1.0→1.5× forecast +$491 (UP) vs actual −$133 (DOWN). Social/enthusiast agree (premium helps there). Root cause: DemandModel.ConversionBp samples only the single top-appeal main's resistance while forecast revenue scales with all menu prices, so it under-penalizes moderate overpricing in the price-sensitive market. This violates the FORECAST-CONTRACT's own directional guarantee V0 — 3D Restaurant Readability Sandbox (visual track — do not merge, Art PM review) #4 and is a sibling of the very reversal H3 just fixed.
  • Ranking (C-10.6, High): lunch top-choice wrong (forecast floats premium/high-price plans above the actual best), regret ~$1170; social/enthusiast rankings are good (Spearman 0.85/0.97).
  • Calibration (C-10.5, Medium): aggregate coverage ~66–68% (I reproduced 67.6%) vs stated 55% — conservative in aggregate — but lunch (41–55%) and the capacity-constrained class (~49%) breach the 55% floor, driven by a systematic −$330 pessimistic bias (22/27 cells under-predict). The player-facing "55%" label matches the constant, but the "≥55% in every market/class" claim is false. Bands are also very wide (1.5–6.8× the true outcome spread).

G. Labor evidence (Domain E — non-blocking)

Understaffing is severely, legibly costly (a starved station ⇒ walkouts, 90–100% loss). A genuine lean strategy is viable with menu/station discipline (2 cooks + FOH on a 2-station menu: +$1186…+$1462, 0% loss). But on a fixed menu/seats, adding cooks to the maximum wins 15/18 market×seat cells (a bottleneck cook unlocks ~$1000–$2800 of contribution for a $60–$180 wage; 10–40× marginal return); max staffing is the profit-max cook count in all three markets at seats ≥30. The overstaffing penalty is real but only appears at seats ≤25. Gate ruling: does not block — understaffing is costly, overstaffing eventually loses money, staffing is not removable as a decision — but staffing level does not vary by market, which reinforces the Domain-B finding that context matters less than claimed. Recommend the playtest script include a small-capacity (~20–25 seat) scenario.

H. Regression & scope (Domain D — PASS)

Independently reproduced: 117 tests (Core 54, Determinism 31, Scenario 32), 0 fail/skip/warn, ×2 identical; Debug vs Release checksums byte-identical; accounting reconciles to the cent (contribution = revenue − ingredients − labor − overhead, verified incl. an 89-failure service); H1 attribution preserved (no 88%-util flip); integer-cents parsing, FIFO, labor, float/wall-clock/RNG guards all intact; scope clean (no M1/persistent-world code, no committed binaries, bin/obj/assets gitignored). Goldens were re-baselined for a genuine intentional change (D-020/D-022), not to suppress a behavior change. Docs are otherwise honest (cross-OS determinism correctly scoped as OPEN). One low nit: ADR-003 phrases portable determinism a touch more strongly than ADR-002.

I. Human-test ruling

NOT authorized. Two defects would contaminate the human M0 verdict: the player-facing forecast recommends the wrong pricing direction in a core market (teaching false cause-and-effect), and the balance claim the gate would be entered under ("no dominator / read-the-market-and-flip-regimes") is false (a premium generalist is broadly near-optimal and wins the value lunch). Neither is a determinism/accounting/scope defect — the technical foundation is sound — but both must be corrected or honestly re-scoped, then re-reviewed, before uncoached testers are exposed to the loop.

J. Final gate

Verdict: Conditional-Pass
Action:  Defer

Required corrections before the human gate (re-review after):

  1. Forecast pricing direction (C-10.3/C-10.6): make the forecast's demand/revenue response to price consistent with the sim (apply per-dish ResistBp/coherence across the ordered course mix, not just the top main in ConversionBp), or narrow the FORECAST-CONTRACT to disclose that the forecast under-penalizes 1.25–1.5× overpricing in value markets. Re-verify lunch top-choice/regret.
  2. Strategy-integrity claim (B-1/B-2/B-3): either strengthen the economics so a fixed premium plan cannot stay within ~10% of the value-lunch optimum (e.g. bind premium contribution in lunch via the segment's budget/price-sensitivity or a peak-throughput ceiling), or retract the "no dominator / structurally-opposed regimes" claim and replace the frontier tests with an optimizer-derived frontier and a percentage near-optimal band, honestly restating the property as "a coherent premium generalist is broadly strong; context tunes rather than reverses the best plan."
  3. Calibration wording (C-10.5): stop presenting per-market/per-class "≥55%" as established; state 55% as aggregate-only and disclose the lunch/capacity breach and the ~−$330 bias.

K. Required owner decision

Howard & Aaron must choose the path before the human gate: (a) direct the builder to fix — align the forecast's price response with the sim, and change the economics so premium does not broadly dominate the value lunch — then re-review; or (b) accept an honestly re-scoped balance claim (premium generalist is broadly strong; context tunes not reverses) plus a disclosed forecast pricing-caveat, and re-review a corrected-claims PR before the gate. Either way the two Highs must be resolved and re-verified before the five uncoached M0 playtests begin. Do not merge PR #1 into main until that gate passes; M1 stays unauthorized.

— Independent Reviewer (read-only; no branches modified, no PR merged, no human tests run, M1 not begun)

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.

2 participants