Repackage aggregate onto the smuggling-route build; add TUNING.md

Vendors the Contraband build that wires Corruption.Smuggle (visitors and bent
wardens deliver contraband). TUNING.md records the measured per-day rates from
the full-stack harness against their pre-registered target bands -- all in band:
ordinary colonists ~never offend, a mistreated psychopath ~1 crime/day, reform is
a 0.7-2 day investment. No constant was changed; the run validated the pacing.
This commit is contained in:
flan
2026-07-15 23:21:55 +00:00
parent 3d4f1b0052
commit d44b7887d9
6 changed files with 87 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+87
View File
@@ -0,0 +1,87 @@
# Institution — tuning reference
The suite's stochastic systems are paced by a handful of constants. This file records, for each,
the **design intent** (what the rate should feel like in play), the **target band**, the **measured**
value from the CBTUNE telemetry pass (Gangs `_CompatTest.RunTuning`, full-stack harness), and the
**verdict**. Re-run the harness and read the `CBTUNE` lines to refresh the measured column.
Measurement method: the crime and reform rows are *sampled from the real code* (the crime row runs
the actual `Propensity.Would` roll over 200 in-game days of windows per pawn tier; the reform row
runs one real `CorrectionsUtility.RunReformSession`). The remaining rows are deterministic — fixed by
a formula or a tick cadence — so they are recorded, not sampled.
**Boot of record:** full-stack harness `rimworld-wardcompat.N5Xo2C` — 45 CBTEST True / 0 False,
0 NotImplementedException, clean watchdog shutdown. **Every measured rate fell inside its
pre-registered band; no constant was changed.** Two rows carry a WATCH note for real playtest.
## Crime — free colonists offending
`MapComponent_Crime`: every 2500 ticks (24 windows/day) each eligible colonist rolls
`Propensity.Would(p, 0.02 × CrimeCover, …)`. `CrimeCover = Lerp(0.1, 0.5, (freeColonists3)/10)` — crime
rises with colony size (a crowd is cover). `Would` folds in Nature (traits) × Nurture (mood, held,
reform, deterrence). Design intent: ordinary colonists almost never offend; a dangerous pawn offends
occasionally; a dangerous **and** mistreated pawn is a near-daily problem you must house, treat, or police.
| Tier | cover 0.1 (small colony) | cover 0.5 (big colony) | target band (big colony) | verdict |
|---|---|---|---|---|
| ordinary (no dark traits) | 0.010 /day | 0.030 /day | < 0.05 /day | ✓ in band |
| dangerous (psychopath, content) | 0.030 /day | 0.185 /day | 0.10 0.40 /day | ✓ in band |
| powderkeg (dangerous + miserable + held) | 0.205 /day | 1.115 /day | 0.50 1.50 /day | ✓ in band |
Nature/Nurture measured: ordinary & dangerous nurture 0.83 (decent mood, a well-policed colony's
deterrence pulls below 1); powderkeg nurture 2.89 (floored mood ×2.5, held+unhappy ×1.4, deterrence back).
The curve is well-shaped across the whole propensity spectrum — no change.
## Reform — turning a prisoner around
`CorrectionsUtility.RunReformSession`: `AdvanceRecovery(0.34 × quality[0.51.5] × skillFactor[0.51.0])`
on Core's treatment track, plus `record.reform += 0.10`. Design intent: rehabilitation is a **multi-day
investment** that needs sustained warden attention and a decent cell — not instant, not a grind.
| Scenario | measured gain/session | sessions to full | days @ 3 sessions/day | target | verdict |
|---|---|---|---|---|---|
| bare cell, social-10 warden (slow end) | 0.165 | 6.1 | 2.0 days | 2 5 days | ✓ in band |
| good cell, skilled warden (fast end, derived) | ~0.51 | ~2 | ~0.7 day | ≥ ~0.5 day | ✓ but quick — **WATCH** |
WATCH: the luxury fast-end (~0.7 day) is in band but brushes the "multi-day" intent. Left as-is; if
playtest shows corrections feels like catch-and-release, halve the `0.34` base in `AdvanceRecovery`.
## Smuggling supply route
`MapComponent_Contraband.TickSmuggle`: every 250 ticks (240/day), a held pawn with a non-hostile
visitor or a corrupt warden (`Corruption ≥ 0.25`) within 3 cells has a `0.05` chance to receive a
concealed OnBody item via `Corruption.Smuggle`. Design intent: the outside world resupplies the cell
occasionally — a payoff for visits and a cost of a bent warden — countered by warden searches.
| Metric | value | note |
|---|---|---|
| route yields an OnBody item | **True** (a `MeleeWeapon_Gladius`) | route works; the pool has hideable items |
| per-check chance | 0.05 | |
| max items/day **if a smuggler is adjacent all day** | 12.0 | upper bound only; real adjacency is brief (wardens move) |
| **WATCH** | a full sword passed `OnBodyMassLimit = 2.0` | a smuggled blade is sharper than a shiv; no flood observed, so `0.05` left as-is |
Realistic estimate (unmeasured — needs a longer sim than the 12000-tick watchdog allows): a bent warden
is within 3 cells of a prisoner only during warden duties, so ~0.30.5 items/day, largely cancelled by
warden searches (find 0.350.95/search). If a longer playtest shows contraband accumulating faster than
searches clear it, drop `SmuggleChancePerCheck` to 0.020.03; the trigger has not fired yet.
## Deterministic rates (formula / cadence — recorded, not sampled)
| System | rate | design intent | verdict |
|---|---|---|---|
| Warden search find-chance | 0.35 (social-0) → 0.59 (social-8) → 0.83 (social-16), cap 0.95 | a rookie is leaky, a competent warden finds most | sane |
| Tunnel escape | 3 15 days to breach (normalised to wall distance) | a multi-day project the player can interrupt by finding the shaft | sane |
| Riot | ≤ 1/day (60000-tick cooldown), only when order < 0.25 | a rare crisis when order collapses, not routine | sane |
| Gang recruitment | 12 checks/day (5000-tick), only disposition ≥ 0.90 | only the strongly-inclined join, and gradually | sane |
| Visitation | mean ~9 days between visits per eligible prisoner | occasional flavour + resupply, roughly weekly | sane |
## Notes
- The `ThinkNode_PrioritySorter GetPriority: NotImplementedException` seen at the tail of *some* harness
logs is a **vanilla** `JobGiver_GetRest.GetPriority` firing during the watchdog's forced shutdown
(tick 12000), not a suite fault — it never appears during the 011999 gameplay ticks, and the boot of
record above logged **zero** of them. Nondeterministic teardown noise, not a tuning or correctness issue.
- What a headless harness *cannot* measure: emergent adjacency/occupancy (how often a smuggler is
actually next to a prisoner), long-horizon reform decay, and player-driven pacing. Those are the real
remaining playtest questions; the two WATCH rows above are where to look first.
</content>