MakeOrKillIt wraps every non-deterministic LLM call in a knockout gate, banded scoring, and a fixed aggregation rule. Same input plus same review yields the same verdict — the model reads and argues, the math decides.
Averaging one number per dimension lets a strong score cancel a disqualifying one. The engine separates fatal from weak instead of summing them on one scale.
market=9 cancels legality=1. One collapsed number, real blind spots.
Fatal flaw caught pre-scoring. Survivors scored in confidence-weighted ranges.
LLM calls are non-deterministic; everything they touch is wrapped in a user-override plus deterministic band/aggregation layer.
(text) → attrs, confidencePull structured attributes from free text. Never fabricates numbers; thin evidence lowers confidence.
(attrs) → {killed, criteria}Five binary must-meet checks. Any clear fail → kill, no scoring. null → asked, not guessed.
(attrs) → [point, conf, band]Per-dimension point + confidence. band = f(point, conf). Low conf falls to user review.
(scores) → [low, high]Conservative weighted sum of bounds → 0..100. Correlated uncertainty widens the band.
(low, high) → verdictTwo thresholds + band width map to make / hold / kill.
() → constraints, experimentsBinding constraints, cheapest uncertainty-reducing tests, and what flips the verdict.
Guessing instead of reading drops confidence, which widens the band, which pushes the verdict toward hold. Uncertainty is priced in, not hidden behind a false point estimate.
derive_band(point, confidence):
half = (1 - confidence) * MAX_HALFWIDTH # 3.0
return clamp(point - half, 0, 10),
clamp(point + half, 0, 10)
decide(low, high):
if low >= 65: # worst case still clears
return "make"
if high <= 40: # best case still too weak
return "kill"
if (high - low) > 20:
return "hold", "reduce_uncertainty" # wide = unsure
else:
return "hold", "reshape" # narrow = mediocreWeights are the initial config; the calibration loop re-fits them from real outcomes.
Any passed == false → instant kill. passed == null → asked, never guessed.
Lawful and ethical to build at all.
A meaningful floor of users exists.
Core build is reasonably possible.
Fits the stated mission and strategy.
Minimum resources are reachable.
Every score ships with the strongest evidence against it.
The scoring model runs at low temperature and skeptical by default. Per dimension it emits disconfirming_evidence; for the whole idea it emits a kill_case — the most convincing argument for killing it, believed or not. Both are surfaced to you as the case against.
Worst realistic case still clears the bar. Build it.
width > 20 → reduce_uncertainty. else → reshape.
Best realistic case still too weak. Move on.
Each verdict is stored as a PredictionRecord. Real results land as OutcomeRecords. Past MIN_N_RECAL = 30 paired outcomes, weights and thresholds are re-fit against reality — human-approved, versioned, reversible. Without it the engine is an opinion generator; with it, it earns the verdict.
Paste the problem, the user, and the model. Gate, bands, and verdict resolve live.
> start_audit