Goodwill (Reputation)¶
Deep dive on the reputation system. Goodwill is the soft-power axis of the game — it gates and modifies what the construction and business-dealings systems can achieve.
→ Parent: GDD.md
Reputation Tracks¶
Reputation is tracked per entity, per stakeholder. Every named entity that acts in the world has its own reputation, scored independently across each relevant stakeholder. The player character and the main company are the two most prominent reputation-bearers for the player's day-to-day interaction, but they are not the only ones — subsidiaries and named individuals each carry their own reputations as well, computed and tracked the same way.
Entities with their own reputation tracks:
- The player character — the person running the show. Personal reputation; travels with them across scenarios under the carryover rules described later.
- Companies — each railroad is an institution with its own reputation, distinct from any one person. The player's primary company is the most prominent, but every company the player leads, sits on the board of, or holds (per Multiple Companies) carries its own track; the player's personal reputation spans them all.
- Subsidiaries — businesses owned by the company (construction firms, manufacturers, refineries, producers). Each carries its own reputation in the regions where it operates.
- Named individuals — key staff hired by the company, each arriving with their own history and continuing to build their own record (see Construction — Reputation of Named Individuals).
Each (entity, stakeholder) pair has its own goodwill score, built from the same itemized modifiers used everywhere else in the system. There is no aggregate top-line summary number for any entity; each track is read on its own terms, similar to how Victoria 3 surfaces interest groups.
Player Goodwill¶
The reputation of the player character as an individual operator and businessperson. It travels with the player. It reflects:
- How the player is personally regarded by other industrialists, politicians, regulators, and the public.
- The player's perceived integrity, ruthlessness, competence, and trustworthiness.
- Personal alliances and personal enmities.
The mechanical form of this track — what moves it, how it decays, what seeds it, and what reads it — is specified in Personal Standing (Player Scope). The four qualities above are the organizing principle of its conduct table.
Company Goodwill¶
The reputation of the railroad company as an institution, distinct from any one person. It reflects:
- The company's perceived reliability and operational quality.
- Its track record of finishing projects, honoring contracts, and treating workers and partners.
- Its standing in financial markets and with government bodies.
- Its brand among shippers and passengers.
Track Divergence and Interaction¶
Reputation tracks can — and should — diverge. A player who personally bullies suppliers and bribes officials may build company goodwill (trains run, contracts are won) while their personal goodwill collapses. A figurehead with sterling personal reputation can preside over a company that wrecks itself on cost overruns. A construction subsidiary can earn a sterling reputation in Pennsylvania while its parent company is reviled in California. A star Chief Engineer may carry their own pristine name through a series of struggling employers.
Tracks are independent but interact. A tarnished parent company can drag down the reputation of its subsidiaries (guilt by association). A respected executive can lift the company that employs them (positive halo). These interactions are themselves modifier effects subject to the same rules as everything else in the system.
The interplay across all these tracks is the point — the railroad business is a constellation of named entities, each with its own standing, jointly painting the picture of how the operation is regarded.
What Moves Goodwill¶
Goodwill is moved by actions and outcomes, not by direct expenditure. Some categories:
Project Outcomes (Construction → Goodwill)¶
- Projects delivered on time and at or under projected cost: company goodwill ↑, often player goodwill ↑.
- Cost overruns, delays, accidents, or worker incidents: company goodwill ↓, possibly player goodwill ↓.
- Methods used during construction (eminent domain, displacement, environmental damage) can dent player goodwill specifically with affected groups while leaving company goodwill intact.
Business Conduct (Business Dealings → Goodwill)¶
- Honoring contracts, paying dividends, servicing bond coupons cleanly: company goodwill ↑.
- Defaulting, restructuring, or aggressively renegotiating: company goodwill ↓.
- Hostile equity acquisitions vs. friendly ones: differential effect on player goodwill with the target's previous owners and peers.
- Sweetheart deals to a politically sensitive customer can lift one stakeholder's goodwill while denting another's.
Operational Reputation¶
- On-time service, accident rates, labor relations: company goodwill drift over time.
- Public-facing decisions (rate hikes, route closures, service quality) move both axes.
Scripted and Emergent Events¶
- Strikes, disasters, scandals, regulatory hearings, press coverage. Many of these surface in the inbox as events that present the player with explicit choices, each option carrying labeled goodwill consequences.
What Goodwill Modifies¶
Goodwill is not vanity — it is leverage. It modifies the costs, options, and outcomes of construction and business dealings.
Effects on Construction¶
- Permits and right-of-way depend on player goodwill with the relevant regional or government stakeholders. Low player goodwill increases the cost or time required to acquire land, or blocks projects outright.
- Labor and supplier costs reflect company goodwill. A respected company gets favorable terms; a notorious one pays a premium or faces work stoppages.
- Project risk — incidents, labor disputes, sabotage — is more likely against a company with poor goodwill.
Effects on Business Dealings¶
- Bond pricing. A company with high goodwill issues bonds at a low coupon. A tarnished company pays more or cannot place bonds at all.
- Equity acquisitions. Friendly buyouts and partial stakes are easier with high player goodwill toward the target's owners; hostile takes are gated by company financial muscle but cost goodwill on both axes.
- Contract terms. Sweetheart deals are typically conditional on player goodwill thresholds with the customer. Government contracts (mail, guaranteed-volume freight) require company goodwill above some bar.
- Counterparty trust. Whether a competing line accepts trackage rights, whether a bank extends emergency credit, whether a government regulator looks the other way — all of these key off goodwill.
Cross-System Soft Effects¶
- High goodwill on either axis surfaces more opportunities (events that simply don't fire for a disreputable company).
- Low goodwill surfaces different opportunities (e.g., desperate distressed-asset offers that a respected company would never see).
Representation¶
Granular Stakeholder Standings¶
Goodwill is tracked per stakeholder rather than as a single global score. Stakeholders fall into two categories:
Population-driven stakeholders are tied to regional populations and emerge from each region's interest-group composition. They are tracked per region — Labor in Chicago is a separate stakeholder from Labor in St. Louis, each with its own goodwill score, modifier list, and Clout. The UI groups them by category to keep the panel readable, but every entry stands on its own. Stakeholder categories:
- Labor — the union-supporting fraction of each region's population.
- The Public — the uninvolved plus locally relevant active interests in each region.
- Company Men — populations personally loyal to a specific company (your company, a rival's, etc.) within a region.
- Local Government — region-level political bodies, often shaped by who carries Clout in their constituency.
The full population/interest model lives in Populations.md. For the goodwill system's purposes, what matters is that the size of an interest faction in a region drives that stakeholder's local importance, and that compositions shift over time. The county-scoped instantiation of these categories — plus two new county-only types (Farmers & Landowners, Local Business) and the roll-up rule — is specified in Geographic Goodwill (County Scope).
Cross-regional abstract stakeholders are scenario-wide entities not tied to any one region's population. They are authored, not emergent:
- National Government (and possibly state/province-level government layers).
- Major industrial barons (named individuals).
- Financial markets.
- Competing railroads.
Scenarios can introduce additional stakeholders in either category as needed.
Stakeholder Clout¶
Each stakeholder carries a Clout value indicating how much they matter at this moment. Clout is shown as a categorical tier badge for at-a-glance reading — five tiers parallel to the goodwill score ladder:
- Negligible
- Minor
- Notable
- Major
- Dominant
Tier labels and breakpoints are starting playtest defaults; final values come from real play.
Clout comes from a baseline plus shifts during play. The baseline depends on stakeholder type:
- Population-driven stakeholders have an emergent baseline: the size of the relevant interest fraction in the regions where the player operates. Starting breakpoints: ≤5% Minor, 5–15% Notable, 15–30% Major, 30%+ Dominant (below 1% Negligible). Cross-region Clout rolls up from regional presence.
- Cross-regional abstract stakeholders have an authored baseline set per scenario by the scenario script. A Civil War-era scenario weights the federal Government heavily; a Penn Central-style collapse weights Financial Markets above almost everything else.
In both cases, Clout is dynamic — it shifts during play through three mechanisms:
- Population shifts (population-driven stakeholders). Population composition changes in response to events and player decisions, and Clout follows directly. Supporting local unions grows the union-supporter fraction; firing on strikers radicalizes the uninvolved into union supporters; both push Labor Clout up. See Populations.md.
- Scripted events (primarily abstract stakeholders). Scenario events explicitly mutate Clout. "Onset of war: Government Clout → Dominant for the duration." "Financial Panic of 1893 fires: Financial Markets Clout → Dominant for 18 months."
- Natural gameplay shifts (primarily abstract stakeholders). Player actions carry Clout-shift consequences the same way they carry goodwill-modifier consequences. Issuing major bonds raises Financial Markets Clout (the company is now entangled with capital markets). Signing a government mail contract raises Government Clout. Hostile equity moves against an industrial baron raise Industrial Barons Clout. These shifts are itemized, stackable, scale with the magnitude of the action (a $5M bond moves Clout more than a $100k one), and decay using the same buckets as goodwill modifiers — typically remaining in force while the underlying entanglement (outstanding bonds, active contracts, current stakes) is in force, and fading once it ends.
Clout-shift magnitudes are authored as a hybrid: global defaults plus per-scenario overrides. A default table covers most scenarios; era-specific or unusual scenarios override individual entries. For example, an 1830s scenario would override the default "bond issuance shifts Financial Markets Clout" entry, because in that era bonds were sold directly to local populations rather than through capital markets — the shift would land on regional Public Clout instead (see Business Dealings — Bonds).
The principle: Clout reflects who actually matters to your specific game. A bond-financed empire has high Financial Markets Clout because that is the truth of its situation; a cash-only operator's Financial Markets Clout sits low. Scenario authors set the baseline; player choices and scripted events move it from there.
Clout, in any form, does not scale modifier magnitudes or goodwill scores. A −10 hit to a high-Clout stakeholder is the same −10 it would be against a low-Clout one; what differs is how loudly the consequence reverberates through the player's experience. High-Clout stakeholder events appear more prominently in the inbox, get richer tooltip detail, and shape AI behaviors of competitors and counterparties. Whether an event stops the sim is a player setting, not a Clout effect — see Events.md.
This pattern echoes Victoria 3's interest-group model, where each interest group's Clout signals importance and Approval signals current relationship.
The Score: 0–100¶
Each per-stakeholder relationship is shown as a score from 0 to 100, with 0 being maximum hostility and 100 being maximum favor. The internal representation can be whatever is most efficient (modifier sum, clamped accumulator, etc.) — what the player sees is simply 0–100, displayed identically across cultures and scenarios.
The score maps to a categorical tier for at-a-glance reading:
- 0–19: Reviled
- 20–39: Distrusted
- 40–59: Neutral
- 60–79: Respected
- 80–100: Revered
Tier labels and breakpoints are starting playtest defaults; final tuning will come from real play.
Each stakeholder carries two of these scores — one for the player track and one for the company track. These per-stakeholder, per-track scores are the only goodwill numbers in the system; there are no aggregates. Mechanical gating, contract pricing, procurement terms, and event triggers all key off the relevant per-stakeholder, per-track score directly.
Itemized Modifiers¶
Each per-stakeholder score is the sum of itemized modifiers — discrete entries with a magnitude, a label, and a decay declaration. Modifiers declare decay using one of a small standardized set of buckets:
- Minor — fades quickly. Starting rate: 5 points per in-game year. Used for everyday operational events that should not haunt the company long-term.
- Moderate — fades steadily. Starting rate: 2 points per year. The middle bucket for routine reputational events.
- Major — fades slowly. Starting rate: 1 point per year. For consequential events that shape the next several years of play.
- Sticky / permanent — does not decay. Used for the most consequential outcomes. Whether a sticky modifier can later be cleared by a repair action depends on the modifier's repair affordance — a sticky modifier may be repair-clearable, or it may be flagged permanent and never clearable.
The bucket count and names are stable; the specific rate numbers are starting playtest defaults and are tunable in one place.
Examples:
- Cost overrun on local depot: −3 with Public (this region), minor (5/yr).
- Mail Contract Honored: +10 with National Government, moderate (2/yr).
- Bond Issue Repaid in Full: +15 with Financial Markets, major (1/yr).
- Pullman Strike, 1894: −25 with Labor, major (1/yr).
- Default of 1873: −40 with Financial Markets, sticky/permanent, flagged permanent.
Some modifiers fade naturally; others are sticky and only clear through specific repair actions (construction projects targeted at the cause, settlements, public works, scenario-scripted resolutions).
Decay is specified here but not built (flagged 2026-07-31, M26_D-1). The shipped
GoodwillModifiercarries magnitude, label, applied-day, and aPermanentflag — no decay bucket and no fade;StakeholderGoodwill.ScoreOnsums every modifier ever applied and clamps 0–100. Every modifier is therefore effectively permanent, and goodwill is a ratchet, not a spring. This inverts the usual reading of the model: a single −20 event choice parks a stakeholder at 30 / Distrusted for the rest of the scenario, and a decade of +0.5 project-completion credits ratchets Public upward with nothing pulling it back. The bucket rates above are the correct target and are not the thing to retune — they have never run. See Implementation State. The fade arithmetic, what decay pulls toward, and what Sticky/Permanent mean at each scope are ruled in Decay mechanism and target.⚠ Half of that is stale, and the half that survives is worse than it reads (corrected 2026-08-19, M33_C — read on disk). The mechanism shipped in M30_A/M30_B:
GoodwillModifier.Bucketexists,StakeholderGoodwill.FadedMagnitudeimplements the fade, and every liveGoodwillServiceis constructed with the authored rates. What did not ship is the bucket assignment.Stickyis the enum's zero value — deliberately, so the M30_A migration changed no behaviour — and the engine's own writers to the four globals still pass no bucket, so every one of them lands at rate 0. Authored events declare their bucket inevents.jsonand do fade. The result is exactly backwards: the world's compliments fade and the engine's complaints are permanent. Ruled in Both Directions or Neither.
What the Player Sees¶
The reputation panel is a list of stakeholders, each row showing:
- The stakeholder's name and Clout tier badge (Negligible / Minor / Notable / Major / Dominant).
- Their player goodwill score (0–100) and tier.
- Their company goodwill score (0–100) and tier.
There is no aggregate top-line number. The player reads the list directly, and each stakeholder is a first-class entry — not summed away into an average that hides the bad ones.
The interaction model follows the Victoria 3 pattern: at-a-glance from the row itself, deeper detail on hover, full causal legibility on click.
- Mouseover a Clout badge — tooltip showing the source of that Clout. For population-driven stakeholders: the relevant interest fraction (e.g., "Labor: 18% of population — Notable") plus the regional breakdown summary. For abstract stakeholders: the scenario-set Clout and any active triggers that could shift it.
- Mouseover a goodwill score — tooltip showing the score (0–100), its tier, and the top contributing modifiers ("+10 Mail Contract Honored, decays in 4 years; −25 Pullman Strike, decays in 11 years; +15 Bond Issue Repaid in Full, decays in 8 years; …"), with a "see all" affordance.
- Click into a stakeholder's row — opens the full stakeholder panel. The full goodwill score is shown with all itemized modifiers for both player and company tracks, listed with magnitudes, decay buckets, and remaining duration. Population-driven stakeholders also expose their full population breakdown chart. Available repair affordances and decision options are listed for each modifier where applicable.
Before any decision that triggers goodwill effects, the consequences are labeled up-front on the decision prompt itself ("Approving this: −10 Labor for 5 years, +5 Industrialists permanently"). No hidden gotchas.
Information Lag¶
Visibility into goodwill standings is itself filtered by the information-and-communication system. A score the player reads for a distant region or stakeholder may be weeks out of date in the postal era and only minutes-to-hours fresh in the telegraph era. Once information is in hand, it is fully transparent — every line item visible — but the as-of date on that information matters, especially before acting on it.
Geographic Goodwill (County Scope)¶
The Representation model establishes that population-driven stakeholders are tracked per region. This section makes that concrete at the county level — the lowest geographic scope at which a goodwill standing is stored — and wires it into the feasibility verdict. It is an extension of the existing stakeholder model, not a replacement: the four global stakeholders the live engine ships with (Public, Labor, Government, Financial Markets) stay; two of them gain a county-scoped instantiation, and two new county-scoped types are added.
County Is the Goodwill Anchor¶
Geographic goodwill is held at the county node, per stakeholder type. Settlements do not each carry their own standing score. A settlement-scoped action (a depot sited in a town, a town bypassed) applies its modifier up to the parent county's standing — that is the "settlement → county" direction. The county is the atomic store; there is nothing below it to sum.
This is deliberate and structural. Geographic goodwill does not ride the population roll-up path (RegionHierarchy.RollUp, which sums leaves only and migrates a metric off a county once it gains a settlement child). Goodwill is a bounded standing score (0–100), not an additive metric — a county keeps its standing regardless of how many settlement nodes it has, so there is no leaf-migration and no double-count risk. County → region → state aggregation is a separate, weighted read (below), not a leaf-sum.
County Stakeholder Set¶
Per county, four stakeholder types are tracked (each carrying the standard player and company tracks and itemized modifiers):
| County stakeholder | Relationship to the global four | Period grounding (1920s Michigan) |
|---|---|---|
| County Board | County-scoped instantiation of the Local Government category; rolls up to the global Government node | County Board of Supervisors — the era's county governing body. Local-consent layer: road-crossing consent, franchises, bridge/drain cooperation, tax treatment. |
| Farmers & Landowners | New county-scoped population-driven category | The people whose land the right-of-way crosses and who ship farm produce. Their organized voice (Grange / Farm Bureau) is the state-level body they roll up to. Sets the price and smoothness of land acquisition. |
| Local Business | New county-scoped population-driven category (a commercial refinement distinct from the general Public) | Board of Trade / Chamber of Commerce, merchants, mill and elevator operators, dominant employers. Boosters when served, blockers when bypassed. |
| County Public | County-scoped instantiation of the global Public; the local press is folded in as an amplifier on this track, not a separate stakeholder | General county sentiment plus the county-seat/town newspapers that amplify whatever they cover. |
Out of scope for the verdict, but riding the same county machinery for consistency: the global Labor stakeholder is also slated to instantiate per county under this model, but its primary effect is on labor sourcing and project execution, not on the feasibility approval path. The global Financial Markets stakeholder stays cross-regional (it does not decompose to county). The global Government node represents the higher regulatory authority (state MPUC / federal ICC); a scenario may split it into separate state and federal nodes, but the model only requires that county standings roll up to feed it.
Roll-Up Rule (County → Region → State)¶
County standings aggregate upward by a population-weighted mean, computed per stakeholder type, never an additive sum:
region_standing(type) = Σ_counties( county_population × county_standing(type) )
─────────────────────────────────────────────────────
Σ_counties( county_population )
State standing is the same weighted mean across all counties in the state — and is the value the state-level globals (Government, and the agrarian Grange/Farm Bureau body that Farmers & Landowners roll up to) read for their influence. Because each input is a bounded 0–100 score, the weighted mean stays in 0–100. A hostile populous county drags the regional/state read further than a hostile sparse one (a big county's opposition carries more weight at the higher hearing — the historical channel). The weight (county population) is the area-layer county population field; Clout-weighting is an equivalent authoring option, but population-weighting is the default.
A company's reputation reads its footprint (pinned 2026-08-08, M30)¶
The roll-up above answers "what does the state think?" — the right question for the regulatory hearing. It is the wrong question for "what is this company's standing?", and the two must not share one read.
Ruling: the company-reputation read is a population-weighted mean over the counties where the company actually operates, falling back to the full-state mean when it operates nowhere. A road with no track in Wayne County is not judged by Detroit's opinion of it.
Why this needs saying: the state read is population-weighted across all counties, so a player operating six sparse rural counties moves it by a fraction of a point no matter how decisively they earn or lose those counties. A ΔG_county of +7.4 in a county holding 2% of the state's population is +0.15 on the state read. Every institutional bite that reads state standing — board independents' votes, hostile-takeover defence, the friendly-acquisition premium — would therefore stay effectively dead even after the county layer becomes writable, which is the Pillar 2 "read but never written" failure surviving its own fix.
Footprint-weighting is also the period-honest read and the Pillar 7 one: a railroad's name is made where it runs. The counties the player built into are precisely the ones whose opinion should carry into the boardroom.
Two consequences worth authoring explicitly:
- Scope of the fix is the read, not the model.
G_county, the blend weights, the seeds, and the state roll-up are all unchanged. Only the set of counties summed over differs between the two reads. - The state read keeps its own job. The regulatory/verdict channel still hears the whole state (Gating the Feasibility Path) — a road cannot escape a hostile legislature by not building there.
✅ BUILT 2026-08-19 (M33_B), and it was genuinely unbuilt rather than built-and-lost — the history was checked across every branch before it was rebuilt, as M30_G's nine-day unpushed branch taught.
GoodwillService.GStateFor(counties)narrows the read;GameSession.CompanyReputationOfpassesOperatedCountiesOf(rt); a company that operates nowhere falls back to the state mean, as ruled. The state read keeps its own job, unchanged.What it was worth, measured rather than reasoned — and the argument above overstates it. Before the narrowing, on the live seed, Ingham souring by −20.95 moved the company read UP by 0.37: four other counties took their annual
local_employmentcredit on the same tick and, weighted across 83 counties, outvoted the fall. That is this ruling's premise, observed. But the narrowing is worth 2.33×, not the order of magnitude "one county in five instead of one in eighty-three" implies. That phrase counts counties; the read weights population, and the seed road's five counties include Wayne — 32% of the state and 75% of the footprint. Dropping the other 78 counties drops 57% of the weight, not 94%. A decisive −22.2 in Ingham is −1.15 on the company read where it was −0.49: real, no longer a rounding error, and still not large.The minimum-presence floor stays open and stays un-invented; the ruled fallback for zero footprint is the state mean. That open question now has a measured motivation: on a road whose footprint is three-quarters one city, footprint-weighting alone does not make a rural county's opinion matter, and the remedy (a presence floor, or a non-population weight for the company read specifically) is a design call nobody has made. (Still open 2026-09-08, M34_D — with a named trigger and a reason: see Open questions. The section below may remove the need for it entirely.)
Two reads, and the asker chooses: institutional and local (pinned 2026-09-08, M34_D)¶
The ruling above settles what a company's standing reads over. It never settled whether it varies by who is asking — and the answer is that there are two numbers, not one, because there are two different questions and the model has always specified both.
Ruling: a company's standing is read two ways. The institutional read is the footprint-weighted mean above, and it is the same number to every asker — a name is. The local read is the same blend over one county: the county of whoever is asking. A constituency with an address reads the local number; an asker with no address reads the name.
| Institutional read | Local read | |
|---|---|---|
| The question | What is this company's name worth? | What does this county make of this company? |
| Summed over | the counties the company operates in | one county — the asker's |
| Varies by asker | no | yes |
| Who reads it | the company asking about itself; a head judging whether the road is sliding; a named board holder, who represents a holder and not a place | a public-float block, an independent board seat (which is a float block with a vote), and an acquirer's standing toward a target's home place |
Terminology, because this document uses "region" for two things. Goodwill's roll-up means the area tier between county and state. The cap table's "public float, broken down per region" means a float block keyed to a settlement (the underwriter's home and affinity cities). The local read takes either and resolves it to a county, which is the only tier that holds a standing.
Both are the same function over a different county set — which is the whole point, and the reason this is a read and not a new mechanism. Over a single county the population weight cancels, so the local read is identically G_county: the number the map's goodwill lens already tints, that drift detection already watches, and that M33_D's crossing notice already speaks a sentence about. A surprising vote is therefore explainable from a sentence the player has already been sent. Nothing new is computed anywhere.
A settlement-scoped ask resolves up to its parent county, by County Is the Goodwill Anchor — settlements carry no standing, so "the company's reputation in Detroit" is Wayne County's standing, under a rule that predates the question.
Fallback, three steps. The asker's county → if that county lies outside the footprint, the institutional read → if the company operates nowhere, the state mean. The middle step follows from the local read's own justification: the local read exists because local experience differs from the institutional name, so where there is no local experience there is nothing to differ from and the honest answer is the name. A shareholder in a city the road has never reached judges it by its reputation, not by his own depot.
Two things this deliberately does not do.
- It does not fold
PlayerStandingin. The local read isG_county, company-track — notG_verdict.G_verdictis the construction-approval channel, which is where the player's personal name enters atw_player = 0.20; a shareholder referendum is about the company. Mixing them would conflate two tracks this model exists to keep apart (Track Divergence), and Blast Radius already pins that the oust vote and takeover defence read the company track on purpose. - It does not make the threshold regional. The band ladder is the shared language of every standing in the game, and the governance cutoffs sit on its lines. Authoring a threshold per county would make "Distrusted" mean different things in different places — Pillar 3's opaque-score red flag inverted — and the geography is already carried by which county each constituency reads. One regional term, not two.
Why this is a Pillar 2 repair and not a refinement. Pillar 2's own worked example is "hostile takeovers depend on regional reputation, not just direct ownership." Market Dynamics has always specified the float voting county by county. Answering every one of those asks with a single company-wide number is Pillar 3's red flag exactly — eighty-three named counties aggregated away into one score — and it made a pillar's own example false in play. The governance half is pinned in BusinessDealings — What the float actually reads.
Measured consequence, so the ruling is not abstract. On the delegated decade the M34 connection verb produces (M34 §11.10), ingham ends at 35.96 — below the 40 cutoff at which a constituency turns on the incumbent seat. Under the institutional read, Lansing's shareholders read a footprint blend comfortably above the bar and nothing happens. Under the local read they read 35.96 and turn: the road that stopped at Lansing and never built into Mason loses Lansing. Full reasoning: M34 §12.2.
⚠ One limit, named rather than discovered later. A rival's standing is its authored
Rival.BaseStanding, read before any county store, so a rival's local read is that flat number everywhere. The referendum therefore becomes real against the player's company and stays uniform against rivals. That is Reputation Tracks' "every company carries its own track" not yet being true of rivals — larger than this ruling, and recorded in M34 §12.7.
Player Personal Standing as a Weighted Input¶
The player character's personal standing is weighted into county goodwill — it is one of the inputs to the county standing, not a separate gate bolted on top. Who the player is personally moves how a county receives them, alongside how the company is regarded. This keeps Pillar 2 — reputation always matters honest at the local scale.
This rides the bounded weighted-mean mechanism (the Roll-Up Rule above), not the additive leaf RollUp. County goodwill stays a bounded standing (Neutral = 50, 0–100, per County Is the Goodwill Anchor); the player's personal standing enters as a weighted input term and the result stays in 0–100. It does not sum into the county like an additive modifier, and it does not pass through RegionHierarchy.RollUp (reserved for additive leaf metrics). The two mechanisms stay separate — this is a blend, not a sum.
Concretely, the standing the verdict consumes is a second-stage blend that folds the player personal-standing term in alongside the four-stakeholder company-track blend (G_county). Call it G_verdict. It is a bounded convex combination:
G_verdict = (1 − w_player) · G_county + w_player · PlayerStanding
G_countyis the four-stakeholder company-track blend defined in Gating the Feasibility Path (0–100).PlayerStandingis the player character's personal standing (0–100), read through the seam below.w_playeris the player term's relative weight, a scenario-tunable default of0.20authored to JSON (per Seed Defaults, keycounty.playerWeight).
Because both inputs are bounded 0–100 and 0 ≤ w_player ≤ 1, G_verdict stays in 0–100 — it is a blend, never an additive sum, and never passes through RegionHierarchy.RollUp. At the default w_player = 0.20 the company-track blend remains the dominant local signal (the institution is what builds the railroad; Pillar 3), while the player's personal reputation is a real, minority input that always moves the result (Pillar 2). G_verdict — not bare G_county — is the standing the verdict, approval odds, and permitting cost read (see ProjectManagement — The Verdict and Approval Model); land cost is the one exception — it stays keyed to the raw Farmers & Landowners standing, because the right-of-way price is a property-owner negotiation, not the civic-approval channel the player term rides.
The seam is filled; the value behind it still does not move (updated 2026-08-08, M30_C). M14_C C-6 landed the slot's live source, so the paragraph below is now history rather than a forward plan — but the value it reads has no write path in play, so
PlayerStandingis a de-facto constant 50 for a different reason than the one described. Personal Standing (Player Scope) is what makes it move; the formula,w_player, and the bounds are still unchanged.
Deferred dependency — M14_C C-6 fills the seam. The full player-character personal-goodwill entity does not land until M14_C C-6. Phase F reads PlayerStanding through a single input slot — the seam — and that slot is an explicit constant Neutral = 50 until C-6 lands. There is no real player-character entity to read today, so the interim proxy is not an existing stakeholder score (it is deliberately not wired to the global Public track or any other live value, which would couple the verdict to an unrelated standing); it is the bare scale-midpoint constant. The weighting logic reads the slot; it never reaches past it. When C-6 lands the real player-character entity, it slots into that input without re-architecting Phase F's weighting: the formula, w_player, and the 0–100 bounds are unchanged — only the source feeding the slot changes from the constant-50 proxy to the real entity. (Consequence game-dev must account for in the seed: with the proxy pinned at 50, G_verdict is compressed toward 50 — its achievable range over G_county ∈ [0,100] is [10, 90] at w_player = 0.20. The test seeds below are authored so the hostile and friendly counties clear their thresholds after this compression, not before it.)
What Moves County Goodwill¶
County standings move through the same three channels as every other goodwill track — project outcomes, business conduct, and scripted/emergent events — and through repair actions. The movers below are grounded in the period research; magnitudes are starting playtest defaults, scenario-tunable, authored to JSON:
| Lever | County stakeholder(s) moved | Dir. | Suggested bucket | Channel |
|---|---|---|---|---|
| Depot/station sited in the county | Local Business ↑↑, County Public ↑, County Board ↑ | up | Major | Project outcome |
| Serving previously unserved (rural-feeder) territory | County Board ↑, Local Business ↑ | up | Major | Project outcome |
| Honest land acquisition (fair price, crossings, drainage) | Farmers & Landowners ↑ | up | Moderate | Project outcome |
| Grade-crossing safety (gates/flashers) | County Board ↑, County Public ↑ | up | Moderate | Operational / event |
| Local employment (depot, section gang, yard) | County Public ↑, County Board ↑ | up | Minor–Moderate | Operational |
| Fair, non-discriminatory freight rates | Farmers & Landowners ↑, Local Business ↑ | up | Moderate | Business conduct |
| Reliable car supply at harvest | Farmers & Landowners ↑ | up | Minor | Business conduct |
| Bypassing the county seat / a booster town | Local Business ↓↓, County Board ↓, County Public ↓ | down | Major | Project outcome |
| Service abandonment / depot downgrade | County Public ↓, Local Business ↓, County Board ↓ | down | Major (abandonment may be Sticky) | Event / business conduct |
| Grade-crossing accident (fatality) | County Public ↓ (press flashpoint), County Board ↓ | down | Major | Event |
| Eminent-domain / right-of-way abuse | Farmers & Landowners ↓ | down | Major | Project outcome |
| Rate discrimination (favoring big shippers / a rival town) | Farmers & Landowners ↓, Local Business ↓ | down | Moderate–Major | Business conduct |
| Cars not furnished — freight the county tendered and the road could not move (added 2026-08-19, row 15) | Farmers & Landowners ↓↓, Local Business ↓ | down | Moderate | Operational |
| Watering / over-capitalization scandal | Farmers & Landowners ↓, County Public ↓, + global Financial Markets ↓ | down | Major (may be Sticky) | Event |
| Crossing / right-of-way disputes | County Board ↓ | down | Moderate | Project outcome / event |
The local press is not its own stakeholder — it is a multiplier folded into County Public events: a press-amplified incident (a crossing death, a scandal) lands a larger County Public modifier than the same event uncovered. (Per the period research, the press "effectively a modifier on other stakeholders.")
Lever magnitudes (pinned 2026-07-31, M26_D-1)¶
The table above authored direction and bucket but never magnitude, and none of the fourteen levers is wired — the county layer is a read-only JSON terrain map. (Fourteen was the count at this pin; a fifteenth — cars_not_furnished — was added 2026-08-19.) The magnitude ladder below closes that, grounded in the authored seed spread, not invented: the 83-county seed runs ~15 (hostile) to ~80 (friendly) against 20-point bands, so a band is 20 points wide and the live range is ~65.
| Bucket | Per-stakeholder magnitude | What it should feel like |
|---|---|---|
| Major | ±8 – ±12 | One decisive act moves the county most of a band once it lands on two or three stakeholders through the blend; two such acts cross one. Never two bands from one act. |
| Moderate | ±4 – ±6 | Conduct over a season; several accumulate into a crossing. |
| Minor | ±1 – ±3 | The recurring channel. Individually invisible; the thing a sustained-direction detector reads. |
Worked, at the authored blend weights (0.40 Board / 0.25 Local Business / 0.20 Farmers / 0.15 Public): depot sited in the county at Local Business +12, County Board +8, County Public +8 yields ΔG_county = +7.4 → ΔG_verdict = +5.9. Build twice into a county and it moves ~12 points — most of a band. Bypassing the county seat, symmetrically, costs about the same downward.
That is the intended shape and it is Pillar 7 as much as Pillar 2: you earn the counties you build into and lose the ones you pass by. It is also why this is revealed rather than manufactured signal — a county the player never touches still never moves, so nothing crosses a band on a wobble.
The county layer must become writable. There is currently no mutation surface at county scope at all: county standings resolve straight out of goodwill.json and are never appended to. Wiring the levers means the county needs the same itemized-modifier store the global stakeholders have — magnitude, label, applied-day, decay bucket — not a mutable scalar. Decay applies identically; the county is not a special case.
The authored lever table (pinned 2026-08-08, M30_A)¶
The ladder above is not re-tuned here — it has never executed and is not a number to move. What follows authors within it: each of the fourteen levers gets a concrete signed magnitude per county stakeholder, a decay bucket, and a trigger source, so goodwill.json can be written without further interpretation. A fifteenth row was added 2026-08-19 — cars_not_furnished, the recurring negative — and nothing in rows 1–14 was re-tuned to make room for it.
Authoring rule — a lever moves only the stakeholders it names. A blank cell is a real zero, not an oversight. If every lever touched all four types the county would collapse back into a single scalar, which is Pillar 3's opaque-mass red flag wearing four labels. The whole point of the county stakeholder set is that different acts anger and please different constituencies — condemning land is a Farmers matter and a crossing death is a Public one, and the player should be able to be loved and resented in the same county at once.
Blend weights are the authored 0.40 Board / 0.25 Local Business / 0.20 Farmers / 0.15 Public from Gating the Feasibility Path; ΔG_verdict = 0.80 · ΔG_county at the default w_player = 0.20.
| # | Lever id | Board | Local Bus. | Farmers | Public | Bucket | ΔG_county | ΔG_verdict | Trigger |
|---|---|---|---|---|---|---|---|---|---|
| 1 | depot_sited |
+8 | +12 | — | +8 | Major | +7.4 | +5.9 | Conduct |
| 2 | unserved_territory_served |
+10 | +8 | — | — | Major | +6.0 | +4.8 | Conduct |
| 3 | honest_land_acquisition |
— | — | +5 | — | Moderate | +1.0 | +0.8 | Event |
| 4 | grade_crossing_protected |
+5 | — | — | +6 | Moderate | +2.9 | +2.3 | Event |
| 5 | local_employment |
+2 | — | — | +3 | Minor | +1.25 | +1.0 | Conduct (recurring) |
| 6 | fair_rates |
— | +4 | +4 | — | Moderate | +1.8 | +1.4 | Event |
| 7 | car_supply_at_harvest |
— | — | +3 | — | Minor | +0.6 | +0.5 | Event |
| 8 | county_seat_bypassed |
−8 | −12 | — | −8 | Major | −7.4 | −5.9 | Conduct |
| 9 | service_abandoned |
−8 | −10 | — | −10 | Sticky | −7.2 | −5.8 | Conduct |
| 10 | grade_crossing_fatality |
−8 | — | — | −8 ‡ | Major | −4.4 (−5.0 ‡) | −3.5 (−4.0 ‡) | Event |
| 11 | eminent_domain_abuse |
— | — | −12 | — | Major | −2.4 | −1.9 | Event |
| 12 | rate_discrimination |
— | −8 | −10 | — | Major | −4.0 | −3.2 | Event |
| 13 | watering_scandal |
— | — | −8 | −8 ‡ | Major | −2.8 (−3.4 ‡) | −2.2 (−2.7 ‡) | Event |
| 14 | crossing_dispute |
−5 | — | — | — | Moderate | −2.0 | −1.6 | Event |
| 15 | cars_not_furnished |
— | −5 | −6 | — | Moderate | −2.45 | −1.96 | Conduct (recurring) |
‡ Press amplifier. The local press is a multiplier on the County Public term, not a stakeholder. pressMultiplier (default 1.5, scenario-authored) applies to the County Public delta only, and the result is clamped to the top of the modifier's bucket band (Major → 12). The two press-amplified levers are authored at −8 precisely so that amplification lands them exactly at the Major ceiling rather than through it: a crossing death the papers seize on is −12 with the County Public, and −12 is as bad as one act is ever allowed to be.
Calibration anchors and deliberate asymmetries.
- Row 1 reproduces the pinned worked example exactly (+7.4 / +5.9); every other row is scaled against it.
- Rows 1 and 8 are exact mirrors. That is Pillar 7 stated in numbers: you earn the counties you build into and lose the ones you pass by, at the same price either way.
- Rows 1 + 2 co-fire on a first build into a county with no prior rail:
ΔG_county = +13.4,ΔG_verdict = +10.7— half a band from one decisive act, and the largest single movement any lever combination can produce. This is the intended ceiling; nothing authored here can move two bands at once. - Rows 6 and 12 are deliberately asymmetric (fair rates Moderate +4/+4; discrimination Major −10/−8). Fair dealing is the baseline a shipper expects and barely registers; discrimination is an offence and is remembered. The Granger/Farm-Bureau memory the
lenaweearchetype is built on is exactly this asymmetry, and flattening it would erase the period characterization. - Rows 3/11 and 4/10 are authored as option pairs on a single event, not as independent levers — see the trigger split below.
- Row 13 additionally carries a global Financial Markets hit, authored by the event in the existing global −3…−25 range (suggested −15, Major). Globals are not on the county ladder; the county terms above are the county half of the same scandal.
Bucket rule for Sticky. Sticky is a decay bucket, not a magnitude bucket. At county scope a Sticky modifier takes Major-band magnitudes (±8–12) — the ±25/±40 examples in Itemized Modifiers are global-stakeholder scale and do not apply to a county standing whose whole live range is ~65 points.
Row 15 — cars_not_furnished, the recurring negative (pinned 2026-08-19, M33_B)¶
Grounded in the M33_A before-figures: 0 counties below their authored seed on every arm ever run, and 0 county band crossings in a live decade whether the road idles or builds.
The ratchet is not "the negative levers are dead." Two of them reach the live game — watering_scandal fires every decade and county_seat_bypassed fired three times without souring anything. The asymmetry is frequency, and it is structural rather than tuned:
Every county positive is recurring or permanent; every county negative is a one-shot or unfireable.
depot_sitedandunserved_territory_servedareheldWhile— they never fade while the depot stands.local_employmentre-fires every year. Against that:county_seat_bypassedfires once and arrives bundled inside a larger gain,watering_scandalfires once and fades at 1/yr,service_abandonedhas no act to fire from, and the remaining nine are one-shot authored events concentrated in the seed's first ~90 days.
That is why wayne nets +0.36 across a decade that contained a scandal: the scandal decayed while the credit was re-earned. A souring lever therefore has to be something the road keeps doing wrong, not something it did once.
Ruling: the county sours on service, not on construction. Every existing Conduct lever is keyed to a build, and a build is by construction a gift to the county it lands in — so the only channel through which the simulation has an opinion about the player is a channel in which the player can only be generous. Row 15 opens the other one: freight the county tendered that the road could not move.
| Lever id | cars_not_furnished — label "Cars not furnished when the county shipped" (period vocabulary is the historian's to confirm; the 1920s grievance is the car shortage) |
| Constituency | Local Business −5, Farmers & Landowners −6. County Board and County Public are real zeros: a car shortage is a commercial grievance, not a franchise question, and the general public notices crossings and accidents, not a late hopper. |
| Bucket | Moderate (2/yr) — one bad quarter is forgotten in three years |
maxStack |
4 — a year of quarterly failures saturates at ΔG_county −9.8, half a band, and a fifth firing refreshes rather than deepens |
| Trigger | Conduct, evaluated on a rolling 90-day window per county: fires when the county accumulates ≥ 15 starved-contract-days in the window, at most once per county per 90 days |
| Scope | The origin and destination counties of the starved contract — the shipper and the receiver. Once per county per firing even when both endpoints share one. |
Why each number, so it is not re-derived:
- It is row 7's missing twin.
car_supply_at_harvest(+3 Farmers, Minor) is the only positive in the table with no negative counterpart. Row 15 supplies it under the rows 6/12 asymmetry: furnishing cars is what a shipper expects and barely registers; failing to is remembered. It is deliberately lighter thanrate_discrimination(−4.0) — failing to furnish cars is incapacity, refusing to is malice. - −2.45 beats the ambient positive by design.
local_employmentdoes not accumulate — at Minor it fades in ~7 months, so its live contribution is ~+1.25 for part of each year no matter how many times it has fired. One firing of row 15 outweighs that whole standing credit; four hold the county ~9.8 below wherever its credits leave it. - ≥ 15 starved-contract-days per quarter is half the engine's own terminal bar. Thirty consecutive starved days already auto-breach a contract; half of that, over a quarter, is the natural "this is a pattern, not a bad week" threshold. Authored to JSON under
county.leverTriggers, scenario-tunable, never baked. - Quarterly, never daily. A per-day county lever would make the county layer a throughput readout — the same defect the personal axis's rarity guard forbids one scope over. The failure has to be sustained before the county forms an opinion, which is the same philosophy drift detection already applies to the read.
- Endpoints, not the whole route.
Contract.Pathcarries every intermediate node, so a traversed county is addressable — but using it would push writes outsideOperatedCounties, the pinned observation scope that drift detection and the Events cadence budget both size against. Endpoints keep every write inside the operated set — a contract endpoint the road actually serves is a node it holds rail at, which is the operated-county predicate — so no pinned scope changes. (Assert it rather than assume it: a firing outsideOperatedCountiesis a bug in this lever, not a scope extension.) See the traversed county.
✅ BUILT 2026-08-19 (M33_B).
scripts/services/CountyServiceFailureDetector.csholds the rolling window;GameSession.ObserveCountyServiceFailurescharges each day's starved contracts to their endpoint counties and fires the lever. The endpoint scoping was asserted, not assumed, as this section asked: every firing on a live decade landed insideOperatedCounties. One assumption behind the trigger did not survive contact: the delegated arm never starves anything at all — it plans accepts against fleet headroom and produced 0 starved-contract-days in a decade — so row 15 fires only on a road that signs beyond its fleet, which is the policy a human ran in the first hand-played year and is now a fourth probe arm. Recovery is real and takes about two years, not one: three counties returned to seed 725 days after the road stopped failing, which is whatModerateat 2/yr buys and is consistent with this section's own "one bad quarter is forgotten in three years."
What the player feels, and why it is not a tax on being poor. The grievance is repairable by acts the player already has: buy motive power, or release the contract the road cannot serve. Stop failing and the county recovers at 2/yr. The fall and the return are one ruling (Both Directions or Neither); a souring lever that could not be earned back would be the ratchet again, pointing down. That both verbs are reachable from the shipping shell is a precondition of this lever, not a nicety — a grievance with no counter-move is a penalty for the state of the world rather than a consequence of the player's conduct, which is Pillar 6's no-penalty shape violated one system over.
Consequence worth stating: this is the first thing in the game that can make drift fire. Three or four quarterly firings in one county clear the 4.0 magnitude bar, satisfy 3-of-4 same-direction quarters, and have no quarter contributing more than half the net. The detector has never been observed firing in any run; row 15 is the arm it was waiting for.
⚠ Measured 2026-08-19 (M33_B as built): that consequence does not occur on
michigan_1920s, and the reason is structural rather than a tuning miss. The four quarterly firings the paragraph above assumes cannot happen, because the engine's own 30-day auto-breach clears the starved book faster than the offer pool refills: on the over-signing arm the whole decade's starvation is a 74-day burst of 962 starved-contract-days, and each county gets one firing, not four. Drift therefore still fires 0 times on four arms. Row 8's annual re-raise cannot supply the arm either — −7.4 lands in one quarter of four, which is precisely what drift's condition 4 excludes by design. Nothing here is re-tuned on the strength of that; it is recorded so the next pass does not go looking for a bug in the detector.
Row 8 — a bypass must be able to compound (pinned 2026-08-19, M33_B)¶
The co-firing stays. county_seat_bypassed applying in the same pass as the arrival levers is not the defect — it is the authored tradeoff, priced in the code's own words: "+13.4 if you serve it properly, +6.0 if you run past it." Rows 1 and 8 are exact mirrors and the mirror is of a build decision; decoupling them would delete the choice the lever exists to create.
The defect is that the grievance is frozen. It is raised once, from OnProjectCompleted, and being heldWhile it never fades — so a road that ran past the courthouse in 1921 and never came back carries the same −7.4 in 1931 that it carried on the day it arrived, permanently outweighed by the +13.4 it arrived with. The county can never fall below its seed from bypass, at any horizon.
Ruling:
maxStack: 3oncounty_seat_bypassed— the exact mirror ofdepot_sited's authored 3. Three depots is a well-served county and gratitude saturates; three years of watching the trade go one town over is a county that has made up its mind, and resentment saturates too.- Re-raised on the annual conduct tick — the same tick that fires
local_employment— for every county wherenoStationInCountySeatstill holds. The first firing still lands with the arrival; subsequent ones do not.
The resulting arc on a county the road arrives in and never serves properly: +13.4 → +6.0 → −1.4 → −8.8, below its seed in year two and saturated in year three. (Built 2026-08-19, M33_B, in CountyConduct.OnAnnualTick. Measured on the shipping seed, where the affected county is one the road starts in rather than arrives in — Ingham, whose legal seat is Mason while the road stops at Lansing — so there is no arrival credit to be spent first and the arc is simply −7.4 → −14.8 → −22.2. That produced the county layer's first downward band crossing ever measured on a live arm, Neutral→Distrusted, on every arm including the idle one.) The repair is unchanged and is the whole point of heldWhile: site a station in the seat, the predicate stops holding, all three instances begin fading from that day, and the seat itself fires depot_sited.
The trigger asymmetry with row 1 is deliberate. Gratitude stacks on acts — each depot is a new gift. Bypass stacks on a condition — the deprivation is ongoing, and the merchants of a bypassed county seat historically agitated for decades. That is the same "offence is remembered" asymmetry rows 6/12 already carry.
The traversed county is addressable, and is not lever 8's constituency (pinned 2026-08-19, M33_B)¶
OperatedCounties' own comment calls the merely-traversed county "the county_seat_bypassed constituency," while the build event yields only endpoints. The comment describes an intent the code does not implement, and the code is right. Two rulings, so neither is re-litigated (the comment was corrected 2026-08-19, M33_B, in CountyConduct.OperatedCounties and its GameSession twin):
- Lever 8's constituency is the code's, not the comment's — the road operates in this county and holds no station in its legal seat. That object is repairable by building; a county the road has no presence in is not. Nothing to change but the comment.
- The traversed county is expressible, and not through
Project.Projectcarries endpoints and the rail graph's edges carry no geometry, so at construction scope it genuinely does not exist.Contract.Pathcarries the full node chain, so it exists at operating scope: the counties the road's freight runs through without stopping. Deliberately out of M33_B — writing there would move the pinned operated-county scope that three budgets key off, and a scope change with three consumers is not a side effect of a lever. Recorded here so the next pass does not repeat "not expressible."
Row 9 — service_abandoned is waiting for a verb, not a hook (pinned 2026-08-19, M33_B)¶
The field contract says "an unimplemented Conduct hook is a bug." Row 9 is the exception that proves the rule: the hook is not missing, the act is. Nothing in the game removes a station, so there is no moment for the engine to have an opinion about.
Ruling: leave row 9 authored, unfired, and out of M33_B. What it needs is abandon a branch / close a depot — a Pillar 1 executive decision (the player commissions the closure; the division executes it) that belongs with the operating-cost lever family in Operations — Maintenance as a Lever, and it would be the game's first negative Pillar 7 act — the railroad un-shaping the world. That is a design pass of its own, not a line in a reputation milestone.
Conduct-triggered vs. event-authored¶
Six levers fire from the engine; nine arrive as authored events (five and nine at the M30_A pin; row 15 joined the Conduct set 2026-08-19). Game-dev should not go looking for a hook for the nine — there is no accident model, no rate-setting mechanic, and no right-of-way method choice in the engine, and M30 does not add one.
| Levers | What fires it | |
|---|---|---|
| Conduct (engine event, M30_A wires these) | depot_sited, unserved_territory_served, local_employment, county_seat_bypassed, service_abandoned, cars_not_furnished |
Station completed in a county · first line completed into a county with no prior rail · annual tick for each county with an operating station · annual tick for each operated county whose legal seat holds no station (row 8, and once more on the build that first bypasses it) · the county's last station is removed · ≥15 starved-contract-days in a rolling 90 days at either endpoint county (row 15) |
Event-authored (events.json, the historian's content pass) |
honest_land_acquisition, grade_crossing_protected, fair_rates, car_supply_at_harvest, grade_crossing_fatality, eminent_domain_abuse, rate_discrimination, watering_scandal, crossing_dispute |
An event option's goodwill effect naming a county lever id and a county |
That the conduct set is the build / serve / fail-to-serve / bypass / abandon set is not a coincidence or a scope compromise — it is Pillar 7 being the only channel through which the simulation itself has an opinion about the player's conduct toward a county. Everything else is the world speaking, and the world speaks through events (Pillar 3).
"Fail-to-serve" is the half M30_A did not have, and its absence was the ratchet (added 2026-08-19, M33_B). Build, serve, bypass and abandon are all construction verbs; on a road that commits two builds in a decade the simulation therefore had an opinion about the player twice, and both times it was grateful. Operating conduct runs every day whether or not the network ever changes, which is why it is the only channel that can carry a county relationship on a frozen network.
Two of the nine are option pairs, and should be authored as one event each (Repair Actions — Channel 1): a right-of-way negotiation offering pay fairly (honest_land_acquisition, +5 Farmers, cash cost) against condemn (eminent_domain_abuse, −12 Farmers, cash saved); and a crossing-protection appropriation offering install gates (grade_crossing_protected, cash cost) against defer (which leaves the county exposed to grade_crossing_fatality later). A lever with no counter-option is not a decision, and a choice with an obviously correct answer is not a choice.
JSON shape¶
Levers live under county.levers in data/scenarios/<scenarioId>/goodwill.json (the file established in Seed Defaults), keyed by lever id. Decay rates live at the top level because they govern global and county modifiers alike.
{
"decay": { "minor": 5.0, "moderate": 2.0, "major": 1.0, "sticky": 0.0 },
"county": {
"playerWeight": 0.20,
"pressMultiplier": 1.5,
"levers": {
"depot_sited": {
"label": "Depot sited in the county",
"bucket": "Major",
"channel": "ProjectOutcome",
"trigger": "Conduct",
"deltas": { "countyBoard": 8, "localBusiness": 12, "farmersLandowners": 0, "countyPublic": 8 },
"heldWhile": "stationOperatingInCounty",
"maxStack": 3
},
"grade_crossing_fatality": {
"label": "Grade-crossing fatality",
"bucket": "Major",
"channel": "Event",
"trigger": "Event",
"deltas": { "countyBoard": -8, "localBusiness": 0, "farmersLandowners": 0, "countyPublic": -8 },
"pressAmplified": true
},
"service_abandoned": {
"label": "Service abandoned",
"bucket": "Sticky",
"channel": "BusinessConduct",
"trigger": "Conduct",
"deltas": { "countyBoard": -8, "localBusiness": -10, "farmersLandowners": 0, "countyPublic": -10 },
"clearedBy": ["depot_sited"]
},
"county_seat_bypassed": {
"label": "County seat bypassed",
"bucket": "Major",
"channel": "ProjectOutcome",
"trigger": "Conduct",
"deltas": { "countyBoard": -8, "localBusiness": -12, "farmersLandowners": 0, "countyPublic": -8 },
"heldWhile": "noStationInCountySeat",
"maxStack": 3
},
"cars_not_furnished": {
"label": "Cars not furnished when the county shipped",
"bucket": "Moderate",
"channel": "Operational",
"trigger": "Conduct",
"deltas": { "countyBoard": 0, "localBusiness": -5, "farmersLandowners": -6, "countyPublic": 0 },
"maxStack": 4
}
},
"leverTriggers": {
"carsNotFurnished": {
"windowDays": 90,
"starvedContractDaysInWindow": 15,
"cooldownDays": 90
}
}
}
}
Field contract:
bucket—Minor|Moderate|Major|Sticky. Selects the fade rate from the top-leveldecayblock.channel—ProjectOutcome|Operational|BusinessConduct|Event. Provenance only; drives the modifier's displayed label grouping, not its arithmetic.trigger—Conduct|Event. Whether the engine raises it orevents.jsondoes.Eventlevers are never raised by the engine — an unimplementedConducthook is a bug; an unfiredEventlever is just unwritten content.deltas— signed per-stakeholder magnitudes. All four keys present;0means "this constituency does not care."pressAmplified(optional, default false) — applypressMultiplierto thecountyPublicterm, clamped to the bucket band ceiling.heldWhile(optional) — a named world-state predicate. See Decay mechanism and target.clearedBy(optional) — lever ids whose firing in the same county clears this modifier. The repair affordance in JSON form.maxStack(optional, default 1) — how many instances of this lever may be simultaneously in force in one county. Default 1 means a re-fire refreshes rather than stacks.depot_sitedis authored at 3 (three depots is a well-served county; gratitude saturates), andcounty_seat_bypassedat 3 for the mirrored reason — starting playtest defaults.county.leverTriggers(added 2026-08-19, M33_B) — the window/threshold/cooldown parameters for a Conduct lever whose trigger is a sustained condition rather than an instant. OnlycarsNotFurnisheduses it today. It lives besideleversrather than inside a lever entry because it parameterises the detector, not the modifier — the same separation drift detection already keeps.
Every number above is a starting playtest default, authored to JSON, scenario-tunable, and never hardcoded in C#.
Decay mechanism and target (pinned 2026-08-08, M30_B)¶
Resolves the open question "do county standings decay toward their authored seed, or toward Neutral?" — toward the authored seed.
Ruling: modifiers fade toward zero; the standing therefore returns to its authored seed, never to Neutral. The seed is the floor the modifiers ride on, not a starting position they drift away from. A county authored hostile at Farmers = 8 relaxes back to 8, not up to 50.
This is Pillar 3. Decaying every county to Neutral would, over a decade, make the lenawee archetype — rail-saturated, Granger-hostile, authored at 8/14/15/20 — indistinguishable from an unauthored county in the Upper Peninsula. The period characterization is the seed; erasing it converts a constellation of named counties into 83 copies of the same average. It is also Pillar 7: a county's disposition is terrain the railroad reshapes and must keep reshaping, not a rubber band that snaps to neutral whichever way you pull it.
Resolution, stated precisely enough to implement:
standing(county, type, day) = clamp( seed(county, type)
+ Σ_m activeMagnitude(m, day), 0, 100 )
activeMagnitude(m, day):
if m.heldWhile is set AND the predicate still holds → m.magnitude (no fade)
else:
t0 = m.releasedDay ?? m.appliedDay (fade starts on release)
years = (day − t0) / 365
→ sign(m.magnitude) · max(0, |m.magnitude| − decay[m.bucket] · years)
- The global stakeholders use the identical rule against their own seed (default 50, per
globalStakeholders). Decay is not a county special case. decay["sticky"] = 0, so a Sticky modifier never fades; it leaves only viaclearedBy.- Clamping is applied to the resolved standing, never to individual modifiers, so a modifier that is clamped out of range today reappears if others fade.
heldWhile — modifiers anchored to a standing world fact. Four levers describe a fact about the world rather than an incident: depot_sited (stationOperatingInCounty), unserved_territory_served (lineOperatingInCounty), and county_seat_bypassed (noStationInCountySeat). A held modifier does not fade while its predicate holds, and begins fading at its bucket rate from the day the predicate stops holding (releasedDay).
Without this, decay would erase M30_A: a depot_sited +12 at Major (1/yr) is gone by year twelve while the depot is still standing and still serving the county, and the county quietly reverts to its hostile seed as if nothing had been built. That is the Pillar 7 red flag — a world that looks the same whether the player built a trunk line or nothing. This is not a new mechanic: it is the entanglement rule Clout shifts already use ("remaining in force while the underlying entanglement is in force, and fading once it ends") applied to the goodwill store that parallels them. heldWhile is also what makes bypass and abandonment repairable by building rather than only by waiting.
Sticky and Permanent at county scope.
- Sticky =
decayrate 0. Never fades. May be repair-clearable viaclearedBy(per Modifier-Level Repair Affordances). Exactly one county lever is Sticky:service_abandoned, cleared by re-serving the county. A county remembers an abandoned branch until you come back — which is period-true and is a real, earnable repair path. - Permanent (never decays, never clearable) is not available at county scope. No county lever may be authored
permanent: true. A permanent county modifier is authored terrain under a new name: it makes the county's disposition unearnable for the rest of the scenario, which re-creates the precise "read but never written" defect (Pillar 2's red flag) that this milestone exists to fix, one act later. Permanent stays reserved for global stakeholders, where the ledger genuinely does not forget — a bond default with Financial Markets is the canonical case.
Sustained-drift detection (pinned 2026-08-08, M30_E)¶
A band crossing is 20 points wide, and the Minor levers move G_county by ~1 point. Without a second, quieter signal the smallest levers move the number and say nothing — "correct but quiet." Drift detection is the read that makes them audible: a sustained direction over a window, narrated in the inbox without any band having moved.
It runs on the county layer (G_county), not the four globals.
What qualifies as drift — all four conditions, evaluated on a rolling 365-day window over the modifier history:
- Scope: operated counties only. A county where the company has an operating station or line — the same predicate Events — Cadence sizes its budget against, and it must resolve identically in both places. This is a design guard, not a rate limiter: an untouched county cannot drift because nothing writes to it (Pillar 7), and a county the player has no presence in is not something the world would write to them about.
It is a smaller guard than first stated (corrected 2026-08-08, M30_D). This condition was pinned on the assumption that it collapsed 83 potential emitters to "the 6–10 the player actually runs in." The measured baseline network operates 68 counties by year ten, so scope removes ~18% of the emitters, not ~90%. The guard is still correct and still worth keeping — it is what stops the world commenting on places the player has never been — but it is not the flood guard; conditions (2)–(4) and the volume ceiling below are. Size them against 68, not 6–10. 2. Magnitude: |ΔG_county| ≥ 4.0 across the window. 3. Direction persistence: ≥ 3 of the window's 4 quarters move in the same direction as the net change. 4. No single quarter contributes more than half the window's net change.
Conditions 3 and 4 are what answer the charter's guard — drift must not restore the noise M30 refuses to manufacture. A score that wobbles cannot satisfy (3): alternating quarters fail the same-sign test regardless of amplitude. A single decisive act cannot satisfy (4): a depot_sited at +7.4 lands in one quarter and is excluded by construction — and rightly so, because that event narrates itself and does not need a second voice saying it happened slowly. Drift can only be produced by several same-direction movements spread across the year, which is exactly the thing no other signal reports.
Volume.
- Per-county cooldown: 365 days after an emission.
- Ceiling: ≤ 40 drift notices per decade, absolute — asserted in the 10-year playtest test alongside M26_C's 200-notice total. Originally written as "≤40 on a 6–10 county network"; on the measured 68-county network the 365-day per-county cooldown alone permits 680 per decade, which would consume M26_C's entire no-nag budget three times over, so the cap is absolute and does not scale with footprint. Sub-cap for authoring sanity: ≤ 4 per operated county per decade. If a measured run exceeds either, raise the magnitude threshold in (2); do not add a rate limiter — a limiter would hide the fact that the detector is firing on things that do not deserve narration.
- Suppressed when a band crossing already fired for the same county inside the window. The louder signal wins; the world does not report the same movement twice.
No-nag contract — inherited verbatim from M26_C (UIArchitecture §3): severity capped below Major by construction, row actionless, excluded from the inbox badge count. A drift notice is the world reporting, never the world asking.
What the notice names (Pillar 3): the county by name, the direction, the current band, and the single stakeholder contributing the largest share of the drift — because "Huron County has been turning against the road all year" is atmosphere, and "…and it is the farmers" is a decision.
Gating the Feasibility Path¶
County goodwill drives the feasibility verdict. The full verdict/permitting/approval-odds specification lives in ProjectManagement; the goodwill-side contract is:
The verdict reads the company track of the target county's four stakeholders, blended into a single county standing the verdict consumes:
G_county = 0.40·CountyBoard + 0.25·LocalBusiness + 0.20·FarmersLandowners + 0.15·CountyPublic
The County Board carries the most weight because it is the local-consent layer and the body that championed or obstructed a project before the higher (state/federal) authority. Land cost is keyed specifically to the Farmers & Landowners standing (they set the right-of-way price), not the blended G_county. Weights are scenario-tunable defaults.
Design call — where approval legally sits (labeled abstraction). Historically the build/extend certificate was federal (ICC, Transportation Act of 1920), with the state (MPUC) over intrastate rates/service/grade-crossings and local boards holding consent/land/tax leverage but not issuing the construction permit. This model takes the period-honest influence path, not a literal county permit: county goodwill gates (a) land-acquisition cost and permitting/civic cost through the local-consent layer the county genuinely controlled, and (b) the weight of community support/opposition the higher authority hears — which the model lets rise to a binding "no" when opposition is organized enough (a hostile county defeats the certificate at the hearing). The verdict is presented county-first (the player reads the target county's feasibility) for legibility; that presentation — treating the county standing as the effective gate — is the deliberate, labeled abstraction. The binding certificate remains a higher-authority node the county standing rolls up to; the game does not pretend a county issues a construction permit.
Why this call (pillars): Pillar 3 — the world is a constellation of named entities is the tie-breaker between the two period-honest options. A pure "it all funnels to one opaque federal verdict" would aggregate the player's local standing into a single faceless gate — exactly the opaque-mass red flag Pillar 3 forbids. Keeping the county and its named stakeholder types as the legible, first-class entities the player reads and acts on honors Pillar 3, while the influence-not-permit mechanism keeps it period-honest. Pillar 2 — reputation always matters is satisfied by making the verdict goodwill-gated, not money-gated. Pillar 7 is honored by tracking standing at county granularity. The rejected option (a county literally issuing the construction certificate) is both an anachronism and less legible than the named-stakeholder read, so it loses on both grounds.
Seed Defaults: JSON Shape and Location¶
All goodwill seed values are authored to JSON, never hardcoded in C# (per the project's data-architecture rule). This is the home for both the cross-regional global stakeholders and the county seeds, lifted into one file so game-dev authors them in a single consistent pass.
File: data/scenarios/<scenarioId>/goodwill.json (for the full-state seed, scenarioId = michigan_1920s); game-dev owns the load wiring. This supersedes the earlier countyGoodwill.json name — the file now carries the globals too, so it is named goodwill.json. Shape:
{
"globalStakeholders": [
{ "id": "Public", "displayName": "Public" },
{ "id": "Labor", "displayName": "Labor" },
{ "id": "Government", "displayName": "Government" },
{ "id": "FinancialMarkets", "displayName": "Financial Markets" }
],
"county": {
"playerWeight": 0.20,
"defaults": {
"countyBoard": 50,
"farmersLandowners": 50,
"localBusiness": 50,
"countyPublic": 50
},
"counties": {
"lenawee": { "countyBoard": 15, "farmersLandowners": 8, "localBusiness": 14, "countyPublic": 20 },
"huron": { "countyBoard": 70, "farmersLandowners": 78, "localBusiness": 72, "countyPublic": 65 }
}
}
}
globalStakeholders (lifts the hardcoded globals). The four global stakeholders the live engine constructs as a C# literal at GameSession's GoodwillService wiring — ("Public","Public"), ("Labor","Labor"), ("Government","Government"), ("FinancialMarkets","Financial Markets") — move here verbatim, closing the no-baked-data violation flagged in Phase C. Each entry is an { id, displayName } pair; an optional seed (starting score, default 50) supports scenario divergence without code change. This is an extension, not a replacement (Geographic Goodwill): the global set is unchanged in content; only its authoring home moves from C# to JSON. The global stakeholders stay cross-regional and do not decompose to county — the county block is the separate county-scoped layer, so the two never collide.
county.playerWeight is w_player from Player Personal Standing as a Weighted Input (default 0.20). The verdict thresholds it pairs with (HostileThreshold, the odds band breakpoints, the permit-multiplier band) are feasibility tunables and live with the rest of the study economics (economy.json feasibilityStudy block); game-dev owns that exact placement.
Defaulting rule (so the county block stays sparse — author only what diverges from neutral):
- A county absent from
counties→ all four stakeholders take thedefaultsvalue. - A stakeholder omitted within a listed county → that stakeholder takes the
defaultsvalue. - A type omitted from
defaults, or the whole file absent → Neutral = 50 (the midpoint of the score ladder; a scale property, the only permissible code constant).
Seed scores are authored per track if the scenario needs player/company divergence at start; the default seed sets both tracks equal.
Authored test counties (Phase F end-to-end assertion targets)¶
Two counties are authored away from neutral to give Phase F a concrete hostile → not-feasible and friendly → feasible target. Per-stakeholder values are the historian's period archetypes turned into numbers; G_county and G_verdict are computed below so game-dev asserts exact targets. Both are real LP counties in the seed (lenawee, huron).
HOSTILE — lenawee (historian archetype H1: rail-saturated southern-LP farm county; a new entrant offers little and threatens much):
| Stakeholder | Value | Period rationale |
|---|---|---|
| Farmers & Landowners | 8 | Lowest — Granger/Farm-Bureau anti-corporate teeth, discriminatory short-haul-rate memory, eminent-domain and grade-crossing hostility. |
| Local Business | 14 | Merchants/elevators aligned with the incumbent road; a competitor is disruption, not opportunity. |
| County Board | 15 | No upside (county already has rail); wary of franchise/tax concessions and of antagonizing the incumbent. |
| County Public | 20 | Weakly motivated; nuisance concerns but not the driver. |
G_county = 0.40·15 + 0.25·14 + 0.20·8 + 0.15·20 = 6.00 + 3.50 + 1.60 + 3.00 = 14.10
G_verdict = 0.80·14.10 + 0.20·50 = 11.28 + 10.00 = 21.28 (≈ 21.3)
G_verdict 21.3 < HostileThreshold 25 → Not feasible. Resolves the historian's open flag: Farmers alone cannot drive the county under the threshold — at 0.20 weight, even Farmers = 0 with the other three at neutral 50 yields G_county = 40, far above hostile. The roll-up is a weighted mean, so a sub-25 verdict requires multiple depressed stakeholders, which the H1 archetype already supplies (Board, Local Business, and Public all low alongside the lowest Farmers).
FRIENDLY — huron (historian archetype F1: isolated thumb agricultural county wanting market access — potatoes, dry beans, sugar beets, dairy wagon-hauled to a distant railhead):
| Stakeholder | Value | Period rationale |
|---|---|---|
| Farmers & Landowners | 78 | Highest driver — direct market access, higher farmgate prices, perishables shipped before spoilage, right-of-way land that appreciates. |
| Local Business | 72 | A depot makes the town a shipping point; merchants want freight both directions. |
| County Board | 70 | Tax base and town growth; happy to grant the franchise. |
| County Public | 65 | Jobs, mobility, mail, connection to the outside world. |
G_county = 0.40·70 + 0.25·72 + 0.20·78 + 0.15·65 = 28.00 + 18.00 + 15.60 + 9.75 = 71.35
G_verdict = 0.80·71.35 + 0.20·50 = 57.08 + 10.00 = 67.08 (≈ 67.1)
G_verdict 67.1 ≥ 25 → Feasible; approval odds clamp01((67.1−25)/35) = 1.0 → band Clear (≥60).
Neutral baseline (every unlisted county): G_county = 50, G_verdict = 0.80·50 + 0.20·50 = 50.0 → Feasible; odds clamp01((50−25)/35) = 0.714 → band Likely (40–60). A neutral county builds, but not as a clean lock.
Acceptance Criteria (Phase F asserts)¶
- Extension, not replacement: the four global stakeholders still exist after the county model loads (now authored in
goodwill.json→globalStakeholders, not a C# literal); County Board / Farmers & Landowners / Local Business / County Public exist per county (83) in addition. - County is the anchor: a settlement-scoped goodwill event mutates its parent county's standing; no settlement carries an independent score; geographic goodwill does not pass through
RegionHierarchy.RollUp. - Roll-up:
region_standing(type)equals the population-weighted mean of member-county standings; a hostile populous county moves the state read more than a hostile sparse one; the result stays in 0–100. - Defaulting: an unlisted county loads all four at the
defaultsvalue; a partially-listed county loads listed types as authored and the rest atdefaults; an absent file loads every county at Neutral (50). - Verdict linkage:
G_countyis the documented weighted blend of the target county's company-track standings;G_verdictis the player-blended standing the verdict actually consumes; the feasibility verdict criteria hold againstG_verdict. - Player standing weighted in: the standing the verdict consumes is
G_verdict = (1 − w_player)·G_county + w_player·PlayerStandingwith defaultw_player = 0.20(authored ascounty.playerWeight) — a bounded convex blend (not an additive sum, not viaRollUp); the result stays in 0–100. Phase F readsPlayerStandingthrough a single input slot that is a constant50until the M14_C C-6 player-character entity lands; swapping the proxy for C-6 changes only the slot's source, not the formula,w_player, or the bounds. Asserted concretely:lenawee→G_county 14.1,G_verdict 21.3→ Not feasible;huron→G_county 71.35,G_verdict 67.1→ Feasible/Clear; a neutral county →G_verdict 50→ Feasible/Likely. - No hardcoded seeds: all seed values resolve from JSON — both the
globalStakeholdersdefinitions and the county seeds load fromgoodwill.json; the only code constant is the Neutral=50 fallback (and the C-6-seam player-standing proxy, which is that same scale midpoint).
Personal Standing (Player Scope)¶
The third goodwill scope. The global stakeholders hold cross-regional standings; the county layer holds geographic ones; personal standing is the player character's own name — one scope, no geography, no stakeholder partition. It is the mechanical form of Player Goodwill, and the value G_verdict reads through the C-6 seam.
The aggregate is a labeled abstraction¶
Player Goodwill and The Score describe the player track as per-stakeholder — every stakeholder carrying a player score alongside its company score. What ships is one scalar: the player-character aggregate personal standing.
Ruling (2026-08-08, M30_C): for M30 the aggregate scalar is the model, and it is a labeled abstraction — not a placeholder for a per-stakeholder build. The precedent is the verdict's own labeled abstraction: state the simplification, do not pretend it away.
- It is the right shape for what the personal axis is for. A name is the thing people who have never met you repeat about you; the aggregate is exactly that, and "broad and thin" (Order of Repair item 3) is a property of a single number touching everything, not of many numbers touching a few things each.
- The cost, stated plainly: a hostile takeover that impresses the industrial barons while appalling the farm counties cannot be expressed — the aggregate carries one signed number, and the levers below therefore encode the general read of an act.
- Per-stakeholder player tracks are a later milestone. They require the stakeholder store to carry two tracks; it carries one (Implementation State). That is a store change across every stakeholder, not a personal-axis change, and it is out of M30's scope.
What Moves Personal Standing (pinned 2026-08-08, M30_C)¶
Authoring rule — the player's name moves only for acts a person is credited or blamed for by name. An institution completes projects, honors contracts, and services coupons; a man raids a rival, breaks his word, defaults on his paper, or is turned out by his own board. Routine operating outcomes belong on the company track and stay there.
This rule is doing more work here than the county authoring rule does at county scope, and it is the primary guard on the whole axis. County levers are scoped by geography — a county the player never touches never moves. Personal standing has no such scoping: it is one number reaching every county verdict at once. Any lever with meaningful frequency therefore converts the personal axis from a reputation into a throughput slider. Rarity is the design constraint, not an accident of which hooks exist.
Magnitudes are the charter-pinned ±3–8 band, per modifier. They are grounded in the four qualities Player Goodwill names — integrity, ruthlessness, competence, trustworthiness — and each lever below is legible as one of them.
The conduct table (engine-raised)¶
| # | Lever id | Δ | Bucket | Quality read | maxStack |
What fires it |
|---|---|---|---|---|---|---|
| 1 | friendly_acquisition_completed |
+5 | Moderate | Alliances / trustworthiness | 3 | A control acquisition resolves on the friendly path with the acquirer being the player's company |
| 2 | hostile_bid_defended |
+5 | Moderate | Competence | 2 | A hostile bid against the player's company resolves and control does not transfer |
| 3 | contract_breached |
−3 | Minor | Trustworthiness | 3 | The player breaches an active contract |
| 4 | board_refused_proposal |
−4 | Moderate | Competence | 2 | A proposal the player director raised resolves Failed |
| 5 | hostile_bid_launched |
−5 | Moderate | Ruthlessness | 2 | A hostile bid the player initiates tables (i.e. clears the ICC gate) |
| 6 | hostile_takeover_completed |
−8 | Major | Ruthlessness | 2 | A control acquisition resolves on the hostile path with the player as acquirer |
| 7 | bond_defaulted |
−8 | Major | Integrity | 2 | A bond the player's company issued goes to default |
ΔG_verdict = w_player · Δ = 0.20 · Δ — so the ladder runs ±0.6 to ±1.6 on every county verdict in the state, which is the charter's pinned shape.
Calibration anchors and deliberate asymmetries.
- Row 6 at −8 reproduces the charter's anchor exactly (−1.6 everywhere), and is the largest single personal debit in the game. Nothing on this axis is allowed to be worse than a completed raid.
- Rows 5 and 6 stack on the same raid: launching costs −5 whether the bid succeeds or fails, completing costs a further −8. A carried raid is −13 → −2.6 on every verdict, decaying on two different clocks. That is intended — a completed hostile take is the single most reputation-defining act available, and it should read that way for years.
- A defeated raid still costs −5. You tried, in public. It fades in 2.5 years.
- Rows 1 and 6 are the Business Conduct differential made concrete — "hostile equity acquisitions vs. friendly ones: differential effect on player goodwill." The same asset, taken two ways, is an 18-point spread on the player's name (+5 vs −13). That spread is Pillar 2 on the personal axis.
- Rows 1 and 6 are deliberately asymmetric in bucket, not just sign (Moderate +5 fades in 2.5 years; Major −8 takes 8). This is the
fair_rates/rate_discriminationasymmetry one axis over: buying a road amicably is how business is done and barely registers; taking one by force is remembered. Do not "fix" it later as an inconsistency. - Row 3 is deliberately the smallest lever in the table and the fastest to fade (Minor, 5/yr — a single breach is gone in seven months). One broken contract is a businessman's prerogative; three live at once is −9 and is a reputation. The pattern is what the axis punishes, never the instance — and at
maxStack3 a fourth breach refreshes rather than deepens, so the axis cannot be ground down by churn. - Row 4 fires on
Failedonly. ALapsedproposal (no quorum) carries no delta — the directors not showing up is nobody's act, so the authoring rule excludes it by construction. A defeat is a verdict on the man; an empty room is not. (It would also be a tax on the player for the simulation's absence — the shape Pillar 6's no-penalty ruling forbids in its own domain, and there is no reason to import it here.) AWithdrawnproposal likewise carries nothing.
Firing rules that are not levers¶
- Friendly-first, hostile-fallback. A
pursueAcquisitionthat is tabled friendly, refused, and falls back to the hostile path fires row 6 only, never row 5 — no raid was tabled, and the player approached honestly first. The reward for trying the consensual path is real and legible: −8 instead of −13. - Rivals never move this axis. A rival has no player character; the C-6 isolation guard already returns the Neutral midpoint for a rival runtime, and every lever above is keyed to the player-owned company. A rival raid resolving elsewhere in the state is not the player's conduct.
Explicitly excluded — do not go hunting for these hooks¶
These acts exist in the engine and are deliberately not on the personal axis. Named here so implementation does not read the omission as an oversight, exactly as the nine event-authored county levers are named.
| Act | Why it is not a personal lever |
|---|---|
| Project completed | Routine and high-frequency; it is the organization's work, already credited on the company track. On the personal axis it would make the player's name a build counter. Pillar 1: the executive commissioned it; the named engineer who delivered it has their own reputation. |
| Bond issued | Financing is an institutional act, not a character question. It already carries its consequence as a Financial Markets Clout shift. |
| Bond repaid / matured in full | Routine and expected. Its credit is the company-track Financial Markets modifier the Itemized Modifiers examples already author. Paying what you owe is not a personal achievement; failing to (row 7) is a personal failure — the same "fair dealing is expected" asymmetry. |
| Contract completed / honored | Same reasoning at higher frequency. The company earns the reliability; the man does not earn a name for it. |
| Board proposal carried | Routine governance. Winning votes on your own board is the baseline expectation of holding the seat. |
Industry / partial equity stakes (AcquisitionService) |
Buying a fraction of a mill is a portfolio move, not a control fight. The personal differential the corpus names is specifically about control of another company. |
Event-authored personal levers¶
The conduct table is the simulation's opinion of the player. Everything else is the world speaking, and the world speaks through events (Pillar 3). An event option may name a personal lever the same way it names a county lever.
No engine hook exists for these and M30 does not add one — they are unwritten content, not unimplemented code. Four exemplars, as anchors for the content pass:
| Lever id | Δ | Bucket | Pairs with | Note |
|---|---|---|---|---|
candid_testimony |
+5 | Moderate | evasive_testimony |
An ICC / MPUC hearing. Costs operationally or in cash. |
evasive_testimony |
−6 | Major | candid_testimony |
The cash-neutral option, and therefore the permissible default. |
stood_by_a_partner |
+4 | Moderate | abandoned_a_partner |
"Personal alliances" (Player Goodwill). Cash cost. |
abandoned_a_partner |
−5 | Moderate | stood_by_a_partner |
Cash-neutral. |
Both are authored as option pairs on one event, per the same rule the county levers follow: a lever with no counter-option is not a decision.
The event channel is also the personal axis's repair path. A wrecked name is repaired by decay plus deliberate, cash-costing public conduct — there is no "repair" button and no clearedBy at this scope.
The axis is asymmetric by design, and that is the point¶
Two levers up, five down, before content. That is not an oversight to balance out. Integrity is the absence of these acts, not an accumulation of credits — a player who never raids, never defaults, never breaches, and never loses a vote sits exactly at their seed, which is where a man of unremarkable conduct belongs. The decision the axis creates is not "how do I farm my name?" but "is this raid worth what it costs me everywhere, for eight years?"
JSON shape (personal levers)¶
Personal levers live under a new top-level playerCharacter block in data/scenarios/<scenarioId>/goodwill.json (the file established in Seed Defaults). Decay rates stay at the top level — they govern global, county, and personal modifiers alike.
{
"decay": { "minor": 5.0, "moderate": 2.0, "major": 1.0, "sticky": 0.0 },
"playerCharacter": {
"personalStanding": 50,
"levers": {
"hostile_takeover_completed": {
"label": "Took control of a rival against its board",
"bucket": "Major",
"channel": "BusinessConduct",
"trigger": "Conduct",
"delta": -8,
"maxStack": 2
},
"contract_breached": {
"label": "Broke a signed contract",
"bucket": "Minor",
"channel": "BusinessConduct",
"trigger": "Conduct",
"delta": -3,
"maxStack": 3
}
}
}
}
Field contract — the county lever contract with three deliberate omissions:
delta— a single signed magnitude, not a four-keydeltasmap. There is no stakeholder partition at this scope.bucket,channel,trigger,maxStack— identical semantics to the county contract.- No
pressAmplified. The press multiplier amplifies the County Public term; the aggregate personal standing has no constituency term to amplify — it already is the general read. - No
heldWhile. Ruled below. - No
clearedBy, nosticky, nopermanent. Ruled below.
Every number is a starting playtest default, authored to JSON, scenario-tunable, never hardcoded in C#.
Decay and Seed at Personal Scope (pinned 2026-08-08, M30_C)¶
Ruling: personal standing decays, toward an authored seed — and it becomes a seed + itemized-modifier store, not a mutable scalar.
The resolution is M30_B's arithmetic verbatim, one scope over:
personalStanding(day) = clamp( seedPersonalStanding + Σ_m activeMagnitude(m, day), 0, 100 )
heldWhile never applies (below), so activeMagnitude always takes the fade branch from appliedDay.
Why it must decay at all — and the argument is stronger here than at county scope. A reputation that only accumulates is the ratchet Pillar 2 exists to fix; that much is inherited. What is specific to this axis is breadth: personal standing is a term in every county's verdict simultaneously. A ratcheting global term is strictly worse than a ratcheting local one — a player who banks credits becomes permanently and universally easier to say yes to, which flattens the county layer M30_A just built by adding a rising constant to all 83 of its outputs. Decay is what keeps G_county the dominant local signal, which is the whole reason w_player is 0.20 and not 0.50.
Why toward the seed rather than toward 50 — argued on its own footing, not by analogy to M30_B. The county ruling turns on authored period terrain; a person's seed is a different object — their background, the reputation they walked in with. The test is what should remain when every particular incident has faded:
- Decaying to the seed says: strip away everything you have done and what is left is who you were when you arrived. The Detroit financier's protégé is still the Detroit financier's protégé in year ten.
- Decaying to 50 says: strip away everything you have done and every man is a stranger. That is the Pillar 3 red flag — the player character is a named entity, and a named entity that reverts to the scale midpoint has no identity at all. It would also erase the player's setup traits by roughly year eight, silently deleting the one authored fact about who they are.
The two rulings therefore agree, but for different reasons, and neither is load-bearing for the other.
Seed source, by game mode:
| Mode | seedPersonalStanding |
|---|---|
| Standalone / Campaign | The authored playerCharacter.personalStanding in goodwill.json. Absent ⇒ Neutral 50 — the Seed Defaults rule-3 fallback, the same scale-midpoint constant that is the only permissible code constant. |
| Free Scenario | Derived from the player's setup traits — ruled below. It replaces the authored value; the two do not stack. |
| Campaign carryover | Carried buffs/penalties land as normal modifiers on the personal store, over that scenario's seed, following the same decay rules as any other modifier (Carryover). |
That last row closes a latent gap: Carryover promises campaign authors can carry personal consequences ("Won the Erie War as the aggressor"), and until the personal axis had a modifier store there was nowhere for one to land.
No Sticky, no Permanent, no heldWhile at personal scope.
- Permanent is banned, for the M30_B county reason amplified by breadth: a permanent −8 here is a permanent −1.6 on every feasibility verdict for the rest of the scenario — an unearnable global handicap, which is authored terrain wearing a conduct lever's name. Permanent stays global-only.
- Sticky is banned for the same reason with the same force: rate 0 without a
clearedByis permanence, and there is no repair verb at this scope to clear against. - The split that keeps this period-honest: a bond default is Permanent on the Financial Markets company track (the ledger genuinely does not forget) and Major on the personal axis (row 7, −8, gone in eight years). Institutions never forget a default; people eventually stop bringing it up.
heldWhilenever applies. Every personal lever is an incident, not a standing world fact. The county mechanism exists so the world does not forget a benefit it is still receiving (a depot still standing, still serving); a completed raid delivers nothing ongoing to anyone's opinion of the man. There is no personal lever for which a predicate could be written, and none may be authored.
Seeding Personal Standing from Free-Scenario Setup (pinned 2026-08-08, M30_C)¶
Closes the factual gap flagged in Implementation State: setup does not write
PersonalStandingtoday — it writes a per-region founding dict through a different pipeline. On a fresh game the value is the bare 50 by field initializer.
Ruling: yes. Free-Scenario setup derives the starting personal standing as the unweighted mean of the trait-assembled per-region founding standings, over the seed's majorUrban set.
seedPersonalStanding = mean over majorUrban regions of S_player(region)
where S_player is the existing trait assembly — baseline 50, plus each selected trait's per-region deltas, clamped to the catalog's floor/ceiling. No new authoring. The same numbers, read a second way.
Why it is right rather than scope creep:
- The scales are already identical. PlayerSetupTraits — The standing scale traits operate in states the deltas are on this 0–100 goodwill scale with Neutral 50.
S_playeris, by its own name and definition, the player's personal standing in a region. The mean of a set of personal standings is a personal standing; nothing is being reinterpreted. - The corpus already promises it. Carryover says Free Scenario's starting goodwill "is set by the player's trait selections at setup." That is currently true of the founding map and false of the personal scalar. This ruling makes the document true rather than adding a promise.
- The magnitude is self-limiting, and lands inside the charter's own band without a new cap. The trait catalog's tension rule caps positive deltas at +30 across six regions (≈ +5 on the mean) and makes liability traits — which are pure penalties — the only way to raise that cap. Positives and the penalties that buy them therefore move the mean in opposite directions by construction. Worked over realistic builds the mean lands in roughly 48–55: two strong traits at the budget cap ⇒ 51.0; the no-penalty modest trait alone ⇒ 54.0; a liability-funded three-trait build ⇒ 48.0. A player's background is worth about one conduct act; their decade of conduct is worth several. That is the correct proportion and it needs no new clamp — a mean of values each ≥ the catalog floor is itself ≥ the floor.
- Unweighted, deliberately. Not population-weighted and not HQ-weighted. Population-weighting would let Detroit decide the player's name, re-importing the exact defect the footprint ruling corrects one level up; HQ-weighting would confuse what your own backers think with what your name is. A flat mean is the honest read of "what the money centers, collectively, make of this man."
- The floor clamp is slightly generous and that is accepted. A heavy-liability build whose penalties would push a region below the catalog floor has that region clamped up, nudging the mean. It is a fraction of a point; noting it so it is not later mistaken for a bug.
What this does not do. It does not promote PlayerSetupTraits — Flavor-only companions. Per-stakeholder starting standing (Labor, a named baron, a rival road) remains flavor-only, because that needs the two-track stakeholder store the aggregate abstraction rules out of M30. What is promoted is exactly one thing: an aggregate personal seed, derived from a seam that already ships.
Blast Radius: What Reads Personal Standing (pinned 2026-08-08, M30_C)¶
Confirmed: one consumer — G_verdict, at w_player = 0.20, on every county at once — and that is the intended shape, not an accidental global lever.
The proportion, stated as the calibration anchor:
| ΔG_verdict, statewide | |
|---|---|
| One decisive personal act (row 6, −8) | −1.6 |
| A completed raid (rows 5 + 6 live) | −2.6 |
A single depot_sited, in one county |
+5.9 |
So a career-defining personal act is worth about a quarter of a depot, everywhere. The personal axis is never the loudest thing in any one county and is always present in all of them. That is "broad and thin," and it is why w_player is 0.20.
Why it is not an accidental global lever — the guard is frequency, not weight. A 20% term on every verdict would be an accidental global lever if ordinary play moved it. It does not: nothing in building, hauling, financing, or completing projects touches this axis at all (excluded acts). Reaching the extremes requires a specific, deliberate, character-defining career — serial raids, a default, a pattern of broken contracts — every step of which is behind a confirmation, a board vote, or an ICC gate, and all of which fade. The authoring rule is the blast-radius guard; the two halves of this ruling are one argument.
Should the personal axis reach anything besides the verdict? Not in M30. Three candidates were costed; all three are tracker rows, with the arithmetic recorded so the next pass does not re-derive it:
| Candidate | Finding | Disposition |
|---|---|---|
| Friendly-acquisition premium (leverage model) — blend the personal term into the acquirer's effective standing | The most attractive on theme (it is the surface Implementation State names as "exactly the fully-ignorable term the pillar forbids") but arithmetically too thin to fix it: at w_player = 0.20, feeding one of two additively-substituting inputs into a premium band, a full-career personal swing moves a deal price by ~2%. Wiring it would let M30 claim a Pillar 2 fix it does not deliver. Doing it properly needs a distinct dealings.playerWeight — a second tunable, invented before the first has ever executed. |
Tracker. Revisit once w_player has measured play behind it. |
Friendly-consent gate (HeadConsentsToFriendlyAcquisition) — the acquirer's name bears on whether anyone will sell to him |
The bite that would bind, because it is binary, and squarely on "personal alliances and personal enmities" (Player Goodwill). But it is a pivot change on the path whose sign-off explicitly carries a no-new-pivot drift guard (D-3). | Tracker. Needs its own design pass, not a line in M30_C. |
Founding standing (S_player ≥ 60 eligibility gate) — conduct drift shifts every founding region equally |
Correct in principle and cheap in form (S_player(region) + (personalStanding − seed)), and it would make a wrecked name mean no underwriter in the state will touch you. Near-inert today: the only live surface is a start-of-game founding review of the primary company. It becomes real the day a mid-game found-a-new-company verb exists. |
Tracker, blocked on that verb. |
What deliberately does not change. The board-independents' oust vote and hostile-takeover defence read the company reputation, and the footprint ruling is what revives them. Three of the four institutional bites run through that read, not this one. Stacking a second axis onto the same predicates in the same milestone would make neither change measurable.
⚠ Half of that sentence is corrected 2026-09-08 (M34_D), and the half that fails is the interesting one. "They read the company reputation, not the personal axis" stands exactly as written. "The footprint ruling is what revives them" does not: the oust vote and the takeover float are local consumers — a float block and an independent seat both have an address — and the footprint read, being one number for the whole road, is not what revives them. The two-reads split is. The footprint ruling revives the institutional consumers (a head judging whether the road is sliding, a named director's lean, the acquisition premium's company-level half).
Both Directions or Neither (pinned 2026-08-19, M33)¶
The invariant, and it binds every scope:
An axis that cannot fall and an axis that cannot be earned back are the same defect wearing opposite signs. Either one satisfies Pillar 2 on paper and violates it in play, because in both cases the standing has stopped carrying information about what the player is doing now.
This is one ruling, dispatched as two phases, because M33_A's measurement found the two halves at opposite ends of the same model:
| scope | the failure measured | which half of the invariant |
|---|---|---|
| County (83 standings) | 0 counties below their authored seed, on every arm ever run; 0 band crossings in a live decade | cannot fall |
| Global (Public) | reaches 0 on day 223 and holds it 3,428 days — 94% of the decade, and no act of the player's ever moves it again | cannot return |
Fixing one without the other just moves the ratchet. The county rulings are row 15 and row 8; the global ruling is below.
Zero is a floor, never an absorbing state¶
Ruling: 0 is a floor. A stakeholder is at 0 exactly while the conduct that put it there is still going on, and it comes back when the conduct stops. (Fourth time this question has been asked — M26, M26_D-1, M26_D §5, M30. It is closed here.)
The fall on the measured arm is correct and is not to be softened. A road that signs thirteen contracts against fleet it does not own, breaches ten of them and starves the rest should be Reviled by day 223. That is Pillar 2 working, it is the first hand-played year's cascade doing exactly what it should, and any change that makes the collapse gentler is a change in the wrong direction.
What is wrong is that it is terminal. After day 223 nothing the player does moves the number — not hauling cleanly, not releasing the contracts, not a decade of restraint. An axis that cannot be recovered has stopped mattering just as surely as one that cannot fall, and every later decision in that run is reputation-free.
The cause is one unfinished migration, not a magnitude. GoodwillDecayBucket.Sticky is the enum's zero value, chosen deliberately so M30_A changed no behaviour, with the note that "assigning buckets to those call sites is a deliberate act, not a side effect." The deliberate act was never taken. So the fade shipped, the rates are wired from goodwill.json, authored events declare buckets and fade — and the engine's own writers still pass none, landing permanently at rate 0.
Ruling: there is no permissible unbucketed write to a goodwill store. A caller that does not name a bucket is a bug in the same class the field contract already names ("an unimplemented Conduct hook is a bug"), not a caller taking a sensible default. Sticky must be reachable only by explicit choice — it is the never fades bucket, and nothing should land there by omission.
The engine's live writers, assigned:
| Writer | Stakeholder | Bucket | Why |
|---|---|---|---|
| Triage starvation drag (≤ −2.0/day) | Public | Minor (5/yr) | The definition of Minor — "everyday operational events that should not haunt the company long-term." One day's freight not moved is one day's grievance. |
| Contract breach goodwill half (M30_G's obligation-proportional, tier-scaled model) | Public | Moderate (2/yr) | The company-track counterpart of the personal axis's contract_breached, which is Minor because a man's individual slip is his prerogative. An institution's reliability record is a longer memory than a man's. |
| Government-tier breach second charge | Government | Moderate | Same act, same memory; the regulator's grievance is not a different clock. |
| Project-completed credit (+0.5) | Public | Minor | Symmetry is the whole point: leaving the one positive engine feed permanent while the negatives fade would be this same defect with the sign flipped. At Minor it becomes a brief public nod, which is correct — a completed build is properly credited at county scope, held for as long as the depot stands, and does not also deserve a permanent statewide credit. |
| Bond default → Financial Markets | FinancialMarkets | Permanent, unchanged | Institutions never forget a default; people eventually stop bringing it up — the authored split. This is what Permanent is for, and it stays global-only. |
Buckets are the rate; the seed-plus-modifiers resolution is unchanged at this scope, and a global stakeholder's seed is its authored globalStakeholders value (default 50) exactly as a county's is its authored standing.
Where these live: a globalWrites block in goodwill.json, keyed by StandingCause. Not baked in C#, by the same rule everything else here follows — and keyed on the cause enum rather than on a call site because M32_A already put a closed, name-serialized cause on every modifier, so the key exists and no new identifier is invented:
{
"globalWrites": {
"ContractBreached": { "bucket": "Moderate", "maxStack": 3 },
"FreightNotMoved": { "bucket": "Minor" },
"ProjectCompleted": { "bucket": "Minor" }
}
}
Field semantics are the county lever contract's verbatim — bucket selects the fade rate from the top-level decay block, maxStack (default 1, meaning a re-fire refreshes) caps live instances per stakeholder. Two notes for whoever wires it: the Government second charge on a Government-tier breach is the same act and takes the ContractBreached entry — it currently carries no Cause at all and needs one; and an unlisted cause is a bug to be authored, not a Sticky default.
Buckets alone are not enough, and the arithmetic says why. The starvation drag is self-bounding once it fades: a day's −2.0 at Minor is gone in 146 days, so a continuously-failing road reaches a steady-state stock of about −146 — deep, but not deepening. It sits on the floor while it is failing (correct) and the stock falls back under the 50-point seed about 60 days after the failure stops, clearing entirely by day 146. That is a floor.
The breach charge is not self-bounding, because it has no saturation rule. goodwillCeiling is 25 on this seed, so ten breaches in the M32 cascade can levy up to −250 against a 0–100 scale — a hole no decay rate clears inside a scenario. The globals are the only scope with no maxStack: the county levers have one, the personal conduct table has one on every row, and the four global stakeholders have none.
Ruling: maxStack applies at global scope, and the breach charge to Public is authored at 3 — the same number and the same sentence as the personal axis's contract_breached: three live at once is a reputation; a fourth refreshes. A fourth breach re-stamps the oldest instance rather than deepening the total.
This is not a softening and the distinction is load-bearing. Every individual breach still charges its full discriminating, obligation-proportional magnitude; what saturates is the account, not the act. And because a fourth refreshes the clock rather than being ignored, a road that keeps breaching stays pinned indefinitely — churn cannot grind the axis into a permanent hole, and having already breached is not a licence to breach freely.
What the two rulings together buy, stated so it can be measured rather than assumed:
| after the failure stops | stock | reads as |
|---|---|---|
| at the moment of reform (drag + 3 saturated breaches at −15) | ≈ −190 | 0 · Reviled |
| ~60 days later (drag decayed under the seed) | ≈ −90 | 0 · Reviled |
| ~146 days later (drag gone; breaches alone) | ≈ −45 | above 0 — the number moves for the first time |
| ~2.5 years later (breaches decayed at 2/yr) | ≈ −30 | Distrusted — the first band improvement |
| ~7.5 years later | 0 | back at the authored seed |
That shape is the ruling. A catastrophic year is not forgiven in a season — it should take years, and it does — but the number starts moving within months, and every clean day is visibly buying something. The failure mode being fixed is not "recovery is slow," it is "recovery is impossible."
⚠ One authored number's stated rationale is now void, and it is not re-tuned here.
economy.json'sbreachPenaltyblock records thatgoodwillCeiling(25) "exists because goodwill modifiers do NOT decay yet (that is M30_B)." They do now. A ceiling of 25 makes one broken freight contract as heavy as the Pullman Strike example in this document's own table, which is out of proportion — but the right response is measure, then decide, not a retune inside a ruling about persistence. Recorded so the next pass finds it rather than re-deriving it.
Deliberately NOT ruled, and each refusal has a reason:
- Do not clamp or truncate the modifier ledger. M30_B pins that clamping applies to the resolved standing, never to individual modifiers, "so a modifier that is clamped out of range today reappears if others fade." That rule was written assuming decay runs; once it does, the sum cannot run away and the clamp needs no help. Bounding the ledger would be treating the symptom the missing buckets caused.
- Do not add a per-day "freight moved" credit. Recovery is decay's job. A throughput-proportional positive would make Public a tonnage readout — the exact defect the personal axis's rarity guard forbids one scope over — and would let a large road out-haul its own breaches.
- Do not soften M30_G's teeth. The
maxStackabove is not an exception to this and the distinction is the whole argument: it saturates the account, never the act — every breach still charges its full obligation-proportional, tier-scaled magnitude, and the fourth refreshes the clock rather than being waived. They are correct; they were being levied against an account that could not fall. Once the account recovers, they bite in every state except total collapse — and in that state the model's cash half is what should bite, which is blocked on the seed authoring no Government or Sweetheart contracts (M30 carry-forward register, row 8), a content gap and not a design one.
✅ BUILT 2026-08-19 (M33_C), and two things the ruling assumed did not survive contact. The assignment lives in
goodwill.json'sglobalWritesblock; the engine's write seam takes no bucket parameter at all (the bucket is a property of the authored cause),GoodwillIntent.Causeisrequiredso a forgetful producer does not compile, and an unlisted cause throws. Measured on the over-signing arm: 0 · Reviled for 3,624 days of the decade → 0 for 126 days, then back to 46 · Neutral, with the fall unmoved (first day at 0: 27 → 29).(1)
maxStack's "default 1 = refresh", imported verbatim from the county contract, would have softened the fall. Applied to the starvation drag it leaves ONE live entry, taking the steady state from ~−146 to −2. The same section's arithmetic requires accumulation, so absentmaxStackmeans UNBOUNDED at global scope and the two recurring feeds are authored without one.(2) The predicted recovery shape is right in kind and fast in degree, and
goodwillCeilingis far from binding. Above 0 at +79 days against a modelled ~146, first band at +102 days against a modelled ~2.5 years, Neutral at +375. The one breach charge measured directly on this seed is −4.37, not −15 — reaching the ceiling of 25 needs a remaining obligation over ~$8,300 at the authored 0.003, so the "ten breaches, −250" arithmetic overstates by roughly 5× against what this road is actually charged. The ceiling is not re-tuned; the measurement the ruling asked for before deciding is inM33-ReputationThatBites.md§10.And the road stops failing on its own. The engine's 30-day auto-breach ends the failure on day 76 whatever the player does, so "days at 0 while the failure continues" was never what 3,624 counted — 3,496 of them were the ratchet holding after the failure had ended. That is the whole defect, and it is the only part of the figure that moved.
An absorbed charge is still reported¶
Ruling: when a charge lands on a stakeholder already at 0, the world reports the act and says the account is spent. The player must be able to tell "this cost me nothing" from "this cost me everything I had left, and I had none." Those are opposite facts about the world and they currently render identically — as silence.
Concretely: a notice that names a reputational consequence states the felt movement (the standing before minus the standing after), not the computed magnitude, and when the felt movement is zero it says so in the counterparty's voice — there is nothing left to lose with the public. This is the no-hidden-gotchas rule applied to the floor, and it costs nothing to compute: the standing is already an as-of-today read.
✅ BUILT 2026-08-19 (M33_C).
GoodwillService.FeltMovementForis the read; the breach inbox row (BreachInboxBridge.LeadFor) and the release confirmation (ReleaseContractModal) both state the felt movement, and when a real charge moves nothing they say "nothing left to lose with the public — the road's standing there is already spent" rather than quoting a number or falling silent. The confirmation's resolver is optional and its absence is the M30_G behaviour verbatim, and Public and Government resolve separately because the regulator's account has its own floor.
Repair Actions¶
Goodwill modifiers don't only fade through decay. The player can take deliberate action to repair specific damage. Repair flows through two channels.
Channel 1: Event-Driven Choices¶
When a discrete incident affects the company (a strike, an accident, a scandal, a regulatory hearing, a pending settlement offer), the game surfaces it in the inbox as an event with a small choice set — typically 1 to 4 named options. Each option's consequences are modeled into the game systems and labeled up-front:
- Cash costs — settlement payouts, fines, legal fees.
- Goodwill changes — one option may restore Labor goodwill at the cost of Industrialist goodwill; another may avoid the cash hit but leave a sticky modifier in place.
- Operational consequences — loss of revenue from a closure, boycott, or service suspension.
- Direct modifier mutations — clearing or attenuating a specific named modifier; adding a new sticky one.
The player picks one. The chosen consequences land. This channel covers ad-hoc repair (settlements, public apologies, executive replacements), scripted-event branches (responding to a strike, choosing a stance in a regulatory hearing), and crisis decisions where the player is reacting rather than planning.
Channel 2: Ongoing Maintenance Levers¶
Some things are not one-time repairs — they are ongoing operating items that the company keeps doing because of its size and infrastructure footprint. Track maintenance, equipment maintenance, safety inspections, customer-service operations, labor relations spend, and similar overheads fall here.
Each maintenance item is a lever the player can adjust:
- Default funded: pays the recurring operating cost; no penalty accrues.
- Suspended or underfunded: saves cash now, but accumulates a stacking debuff for as long as the lever is off. The debuff grows over time the longer the neglect persists.
- Reinstated: stops the debuff from growing, and the existing debuff begins gradual self-healing — fading on its own as the maintenance regime catches the network back up.
Example: suspending track maintenance produces a stacking debuff to throughput on the affected corridor. The longer it's off, the worse throughput gets and the more incidents (accidents, derailments) become likely — which themselves are events that trigger Channel 1 choices, and which damage goodwill. Reinstating maintenance halts the bleeding and the corridor gradually returns to full health.
Maintenance levers are primarily operational — they affect throughput, accident rates, breakdown frequency — but they feed back into goodwill indirectly. A neglected railroad accumulating accidents and service failures will see goodwill drift downward across multiple stakeholder groups regardless of any single discrete event.
The operational mechanics of maintenance levers (categories, debuff stacking, self-heal rates) live in Operations and Maintenance.
Modifier-Level Repair Affordances¶
Each modifier in the system declares its repair affordances at authoring time:
- Auto-decay only — the modifier fades on its own at its declared rate; no explicit repair available.
- Repair-clearable — the modifier names specific repair triggers (event choices, completed projects, sustained maintenance) that clear it or accelerate its decay.
- Permanent — the modifier never decays and cannot be repaired. Reserved for the most consequential outcomes (a bond default, a fatal disaster covered up).
This per-modifier authoring keeps repair affordances flexible without requiring a new global rule for every category.
Carryover Across Scenarios¶
How goodwill persists across scenario boundaries depends on the game mode the scenario is being played in (see GDD — Setting and Scenarios):
- Campaign mode — a scripted storyline of multiple scenarios played in sequence. Buffs and penalties carry from one scenario to the next based on whether the player succeeded or failed at specific goals in prior scenarios. The carry is fully scripted by the campaign author: each downstream scenario declares which prior-scenario goal outcomes apply which modifiers at its start. (E.g., "Won the Erie War as the aggressor → start the next scenario with +20 with Industrialists, −15 with Labor.")
- Standalone mode — a single self-contained scenario played in isolation. Starting goodwill is scripted by the scenario itself; no state carries in from anywhere because there is nowhere to carry from.
- Free Scenario mode — open-ended single-scenario play with player-chosen starting parameters. Starting goodwill is set by the player's trait selections at setup, with scenario-defined ranges or defaults; no carryover, since it is just the one scenario. This covers both the per-region founding standings (PlayerSetupTraits) and the player's starting personal standing, which is derived from the same assembly.
The defining principle: carryover is always explicit and authored, never automatic. Campaign authors get full control over the narrative shape of progression, and we avoid the failure mode where a downstream scenario starts under a wall of decade-old, no-longer-relevant modifiers from upstream play.
Carryover modifiers themselves are normal goodwill modifiers. They appear in the relevant stakeholder's modifier list at scenario start alongside any seed modifiers the new scenario adds, and they follow the same decay/repair rules as any other modifier — sticky if authored sticky, decaying if authored decaying, repair-clearable if authored that way.
A carried personal consequence ("Won the Erie War as the aggressor") lands on the personal-standing store the same way, over that scenario's authored personal seed. Sticky and Permanent are unavailable at personal scope, so a carried personal modifier always fades.
Implementation State of the Goodwill Model (pinned 2026-07-31, M26_D-1)¶
M26_C narrated the world's reactions into the inbox and measured one goodwill band crossing in ten sim years (M26 close diary). The audit that followed found the presentation layer correct and the model underneath largely unbuilt — the presentation doing its job by making an old gap audible.
The ruling: Pillar 2 stands as written and is currently aspirational rather than true in play. The fix is not narrower bands, not smaller magnitudes, and not a faster decay rate. It is that three of the four channels this document says move goodwill do not exist in the engine, and the fourth has no recurring content.
| Channel this doc specifies | Shipped state |
|---|---|
| Itemized-modifier decay (Minor/Moderate/Major/Sticky) | Not built. No bucket field, no fade. Goodwill is a ratchet. |
| County goodwill movers — the 14-lever table (15 since 2026-08-19) | Not built. County standings are a read-only JSON terrain map; no mutation surface exists at county scope. The levers are now authored to concrete per-stakeholder numbers and a JSON schema (the authored lever table); wiring them is M30_A. |
| Player-character personal standing | Not built as a moving value — and less built than first recorded. Corrected 2026-08-08 (M30_C): setup does not write it. The only write path is save-restore; on a fresh game it is the bare field-initializer 50. No action in play moves it, and no act of setup seeds it. The levers, decay, seed source, and blast radius are now ruled in Personal Standing (Player Scope); wiring them is M30_C. |
| Scripted and emergent events | Built. But the michigan_1920s seed authors no repeatable goodwill-bearing event — its goodwill events are one-shots concentrated in the first ~90 days. |
| Procurement terms via the leverage model | Not built. No supplier stakeholder exists; procurement is goodwill-blind. |
⚠ Rows 1–3 are a 2026-07-31 snapshot and three of them have moved (updated 2026-08-19, M33_B/M33_C, read on disk). Decay: built in M30_B — bucket field, fade arithmetic and authored rates all ship. What did not ship is the bucket assignment on the engine's own writers, so they land at
Sticky/rate 0; ruled in Both Directions or Neither. County movers: wired in M30_A — the county store is writable and five (now six) Conduct levers fire. What did not follow is a lever the county can fall on; ruled in row 15. Personal standing: wired in M30_C and measured over a decade at M33_A — all seven levers fire through their shipping verbs, realised range 34.52…50. This table is history; do not read it as current state.
Why this matters more than a tuning note: the biggest bites read the layers that cannot move. The feasibility verdict reads G_verdict — a static county blend times a static player constant, so whether a county will let you build is fixed at scenario load and no conduct changes it. Board independents' votes and hostile-takeover defense read the same static roll-up — and making the counties writable is not by itself enough to revive them, because that roll-up is population-weighted over all 83 counties and the player operates in six to ten of the sparser ones; see A company's reputation reads its footprint. (Sharpened 2026-09-08, M34_D: narrowing to the footprint was necessary and not sufficient for these two, which are local consumers with an address — what revives them is the two-reads split.) The friendly-acquisition premium reads effective standing, where only the volume half moves — so on that surface goodwill is exactly the "fully ignorable" term the pillar forbids. The one genuinely live bite is the bond coupon off global Financial Markets.
Order of repair (each closes behind a before/after 10-year distribution):
- Wire the county movers at the magnitudes pinned above. Highest leverage: the county layer is what the verdict, the board, and takeover defense all read, and it is the layer Pillar 7 says the railroad should be reshaping.
- Build decay to the rates already authored. Without a restoring force, step 1 becomes a monotone climb and bands stop meaning anything by mid-scenario. Decay is what makes standing a maintained thing rather than an accumulated score — which is what "always matters" means.
- Let personal standing move. Small magnitudes (±3–8): at
w_player = 0.20a ±8 personal swing is ±1.6 on every county verdict at once — broad and thin, the right shape for a personal name. Authored 2026-08-08 (M30_C): Personal Standing (Player Scope) — a seven-lever conduct table, decay toward a mode-dependent seed, a Free-Scenario seed derived from the setup traits, and the confirmed single-consumer blast radius. - Author recurring events. A content pass, not a mechanic change — the railroad-historian's and scenario-authoring's call, not this document's.
Open Questions¶
Two questions previously open here are now resolved (2026-08-08, M30): the decay target is the authored seed, ruled in Decay mechanism and target; the event-cadence target is authored in Events — Cadence as an explicit starting playtest default with a measurement plan.
A third is resolved 2026-08-19 (M33_C), on its fourth appearance: is zero a floor or an absorbing state? — a floor, ruled in Zero is a floor, never an absorbing state. Do not re-open it as a magnitude question; the cause was an unfinished bucket migration, not a number.
Still open:
-
Does the footprint-weighted company read need a minimum-presence floor? A road with a single station in a single county would be judged entirely by that one county's opinion, which is sharp to the point of brittle. A floor (blend toward the state mean below some footprint size) is plausible but should be set from measured play, not invented. Not a blocker: the fallback for zero footprint is already the state mean.
⏸ RE-ASKED AND STILL OPEN, deliberately, with a named trigger (2026-09-08, M34_D). M33_B measured that footprint weighting bought 2.33×, not an order of magnitude, because the seed road's five counties include Wayne at 75% of the footprint by population — so this question acquired a measured motivation. M34 unfroze the network and the question was re-asked against a grown footprint. It is deferred for three reasons, none of them caution. (1) The available measurement is an artefact — the reputation-probe arm that reaches 14 operated counties holds 5 counties for the first 3,410 of 3,650 days, first exceeds five on day 3,411, reaches fourteen nineteen days from the end, and buys them with $4.9M of credited capital; a floor calibrated on that is calibrated on a state the world held for half a percent of a decade, funded by money no road earns. (2) The arm that grew steadily emitted no county figures — the delegated connection arm grows across 2,800 days with no credited capital and reports exactly one county number, so the measurement a floor needs does not exist yet: a concrete gap, not a plea for more data. (3) Two reads may remove the need for a floor — the floor was proposed to fix dilution inside an average, and the split's answer is that the average was never the only listener: a county's fall now reaches its own float block and its own board seat undiluted, at full weight, which is the entire effect the floor was asked to buy. Adding a corrective for a dilution one may no longer need to correct is the wrong order.
Rule it once both hold: (a) a reputation-probe arm running the delegated connection verb, reporting per year the operated-county count, the largest county's share of footprint population, the footprint read, the all-83 read and the per-county spread (home: M34_E or M35's re-baseline; game-dev → playtester); (b) the two reads shipped and measured, so it is known whether the institutional read still needs a floor after the split. Owner game-designer.
And a standing guard, pinned here because it generalises beyond this question: a floor on a footprint may not be authored against an arm whose footprint has not stood for at least one full in-game year. Not an invented duration — a year is the period at which every county mechanism completes one cycle: decay rates are per-year,
local_employmentre-fires annually, row 8's re-raise is annual, and drift needs three of four quarters. A nineteen-day footprint has completed none of them. Full reasoning: M34 §12.3. - Procurement terms have no stakeholder to key off. Procurement — Goodwill, Volume, and Procurement Terms specifies the bite, but no supplier stakeholder exists anywhere in the model as built. Standing this up is not a modification of the goodwill layer — it is a new stakeholder class with named members (Pillar 3 requires Pullman and Baldwin to be named entities with their own standings, not a "Suppliers" scalar) plus the leverage model wired to read it. Milestone-sized, and deliberately not part of making the existing reputation layer written. - Does the personal axis deserve a second consumer, and at what weight? Three candidates are costed and dispositioned in Blast Radius — the friendly-acquisition premium (thin atw_player = 0.20; a proper wire needs a distinctdealings.playerWeight), the friendly-consent gate (would bind, but is a pivot change), and the founding eligibility gate (blocked on a mid-game found-a-company verb). All three are deliberately out of M30_C, which delivers the charter's single-consumer shape. The premium one is a genuine product call, not a design call — it trades scope now against a named Pillar 2 hole staying open. - Should the player track be per-stakeholder? Player Goodwill and The Score say yes; the shipped store carries one track per stakeholder and the personal axis is an aggregate scalar by ruling. Closing this is a store change across every stakeholder, not a personal-axis change, and it is what would let a hostile take impress one constituency while appalling another. Milestone-sized; deliberately not M30. - Are the Minor levers worth their cost?local_employmentat +1.25ΔG_countyper year is invisible except to drift detection. If drift measures at the low end of its ceiling, the Minor tier may be carrying no signal at all and should be either strengthened within its band or cut. Measure before deciding. Partially answered 2026-08-19 (M33_A/M33_B):local_employmentfired 50 times on a live decade and the county it fired in (wayne) netted +0.36 across a decade that also contained a scandal — so it is neither invisible nor dominant, it is the frequency term that a one-shot negative loses to over time. Re-ask it once row 15 has given drift something to detect; the Minor tier's worth cannot be judged against a detector that has never fired. - Does souring a county need a repair verb the poor road can afford? Row 15's repairs — buy motive power, or release the contract — are both cash or capacity decisions, and the live game's road cannot afford a feasibility study for 3,605 days. If measurement shows a county souring on a road that had no affordable way out, the answer is the frozen economy, not a softer lever. Named here so a measured bleed is diagnosed at its cause rather than retuned at its symptom.
Remaining tuning and authoring details are scattered across other docs (Events, Populations, Business Dealings) where they more naturally live.