Brief: Multi-domain category taxonomy + signal-aggregate audit¶
Status: Design brief — ahead of corpus expansion
Date: 2026-05-31
Drives: ADR-074 ("Pulse as a multi-domain judgment layer") follow-up work — the category/trigger taxonomy expansion flagged in its Consequences.
Reads from: scenario-dimension-cube.md, measurement-schema.md, experiment-new-domain-signals.md, ADR-024, ADR-074.
Companion to: oq1-oq2-nota-handling-brief.md — the NoTA findings here cross-reference it.
TL;DR¶
- Add two categories:
personal-choiceandrelational-decision. Keep ADR-074's scope (1–2). Do not add a third — the temptation to splitpersonal-choiceinto health/finance is a signal-shape problem, not a category problem, and the schema's architectural-independence finding tells us to solve it on the signal axis, not by proliferating categories. - No new signal aggregate is required. All 14 fire cross-domain. The strongest evidence: the two newest signals (pragmatic-routing E13, ideal-actual-reference E14) were born in the personal-domain experiment — the set is, if anything, validated as cross-domain-complete by its own growth history.
- Two signal refinements, both already anticipated by the schema, neither a new aggregate: (R1) confidence-calibration (E5) and persuadability (E7) need an expertise / domain-confidence conditioning dimension — this is the experiment's Finding 1, anchored to cube-C2 / measured-outcome M3, tracked as schema Q4d. (R2) one speculative attention-model sub-category (
physical); defer until corpus shows signal. - One latent anti-pattern surfaced by the expansion: the per-category
risk_tolerancescalar incategory_patternsis the wrong shape forpersonal-choice, because the experiment proved risk-tolerance is expertise-conditional, not category-stable. Flagged for re-audit; does not block the category addition. - Timing split (the answer to "do the hard work sooner?"): do the taxonomy + type scaffolding now — it is cheap, additive, and authoring corpus against the right category tags from day one avoids an expensive retag-and-rebackfill later. Defer the signal-conditioning work (R1) — it is substrate-gated (needs a played multi-domain corpus) and "ship-and-observe" applies.
0. The distinction this whole brief rests on: category ≠ domain¶
The single most important thing to keep straight, because the codebase and the research docs use overlapping words:
- Category (
ScenarioCategoryinscenario-generator.ts:14; the key ofcategory_patterns) is a trade-off type — the canonical tension the scenario is built around. There are four today:governance,resource-allocation,team-dynamics,values-culture. The generator calls these "decision domains" internally (scenario-generator.ts:612), which is the source of the confusion. - Domain (in the cube and the experiment) is the surface the trade-off is dressed in — career / health / relational / financial / governance, or the world-themes (boardroom / frontier / court / rebuild / underground). The cube doc is emphatic: "Domain is NOT in the cube" — it is where a cube vector gets realized.
A single surface domain spans multiple categories. "Career" is not a category — a career scenario can be resource-allocation (which offer), values-culture (mission vs. money, S5), or team-dynamics (managing a report). The experiment validated four life surfaces; this brief proposes categories, and the mapping is many-to-many.
Why this matters for the proposal: personal-choice is not "the personal-life domain." It is a trade-off type — self-scoped decisions where the player bears the primary cost — that happens to correlate with self/dyad scope on cube axis 5. If we let it drift into meaning "the topic is personal," the taxonomy collapses into surface-tagging and we lose the domain-agnostic property that makes the cube load-bearing for ADR-074. This distinction is the guardrail for the whole proposal and recurs as anti-pattern AP3 below.
1. Final category taxonomy¶
Proposal: 6 categories. Keep all 4 existing; add 2.
| Category | Status | One-line trade-off type | Defining cube signature |
|---|---|---|---|
governance |
keep | Legitimacy / authority / precedent — who decides, by what mandate | scope = institution(+future-gen); authority = collective-vote / oversight |
resource-allocation |
keep (widen scope) | Distribution of a scarce resource | any scope; tension on a quantifiable constraint |
team-dynamics |
keep (tighten) | Interpersonal coordination under a shared work/org authority structure | scope = small group; distance = close; authority = oversight / collective-vote |
values-culture |
keep | The values tension is the decision (not a cost dimension of another) | C1 includes integrity; reads as identity-expressing |
personal-choice |
NEW | Self-scoped life-direction trade-off; player is the primary affected party | scope = self / dyad; distance = self / intimate; authority = full / oversight; visibility = private / dyadic |
relational-decision |
NEW | Dyadic / small-group interpersonal trade-off outside formal work authority | scope = dyad / small group; distance = intimate / close; topology often you-know-more; counterparty reactive / strategic |
Why 2, and why not 3 (engaging the pushback)¶
ADR-074 scoped "1–2 new categories." The pushback invitation asks whether the cube/schema work argues for more or fewer.
Argument that surfaced for a third category (split personal-choice → personal-wellbeing + personal-finance): the experiment's clearest single finding (Finding 1) is that risk calibration splits — CoachJ is risk-tolerant in financial decisions (S8: conviction 5, "math is the math") and risk-conservative in acute health decisions (S2: conviction 2, defers to doctor). If health and personal finance live in the same category, the per-category risk_tolerance scalar and the driver_distribution EMA blend two opposite regimes into mush. That is a real defect, and it is tempting to fix it by splitting the category.
Why I reject the split. The schema's architectural-independence finding is explicit: signals, categories, closures, and measured outcomes are orthogonal design dimensions. The risk-calibration split does not resolve on topic (health vs. finance) — the experiment says it resolves on expertise / authority-deference: risk-tolerant where CoachJ has an analytical frame, risk-conservative where he defers to authority. That is exactly cube-C2 (expertise requirement) and its player-side correlate M3 (domain-confidence asymmetry). So the right fix is to condition the signal on expertise (R1 below), not to split the category. If we split a category every time a signal varies within it, we get unbounded category growth and we have smuggled a measured-outcome (M3) into the substrate taxonomy — a category error. Keep personal-choice unified; fix the signal.
This is the cleaner answer and it is the one the schema's own coherence claim demands. It also leaves a real flaw visible rather than papering over it — see AP1.
Why not zero new (stay at 4)? Because the four existing categories are all other-affecting: governance (institution), resource-allocation (a pool), team-dynamics (a team), values-culture (a culture). None of them has a natural home for a self-scoped trade-off where the player is the most-affected party. The cube corpus finding confirms the gap structurally: governance is 75% institution-scope and personal/self/dyad scope is "absent" from the governance corpus. S6 (health overhaul, self-scope, lifelong) and S8 (debt-vs-invest, self/dyad) have nowhere clean to land today. The self-scope gap is the actual hole; personal-choice fills it.
The two new categories in detail¶
personal-choice¶
- Definition: A trade-off where the player is the primary affected party and bears the principal cost themselves — life-direction, health, personal finance (the experiment's financial Tier 4–7), lifestyle. Structurally: scope = self/dyad, distance to most-affected = self/intimate.
- Expected drivers (from the 8):
caution,growth,autonomy,pragmatismdominant;team_harmonyrare (no team);principlepresent in health/lifestyle commitments. The driver enum needs no change — these are the existing eight. - Expected signal patterns: high identity load (M1) and ideal-actual reference (E14) — the experiment's S5/S8 aspiration-gap statements all came from this shape. Domain-confidence asymmetry (M3) is strongly present and is the category's defining measurement challenge (health-deference vs. finance-confidence). Time-horizon orientation prominent (S6 overhaul, S8 invest-vs-paydown are both long-horizon). Persuadability and calibration are domain-conditional here (R1).
- Sample cube vectors that land here:
- S6-shape — self-scope, lifelong horizon, full authority, forces-choice, low-to-moderate C2: "commit fully to a health overhaul or hedge."
- S8-shape — self/dyad scope, full authority, mutual-uncertainty-intrinsic topology, high C2 (requires comfort with expected-value reasoning), partial-recoverable: "pay down guaranteed 4.5% debt or invest at uncertain 8–9%."
- A life-crossroads vector — self-scope, soft deadline, years horizon, favors-inaction-static default: "leave a stable path for an uncertain one."
relational-decision¶
- Definition: A dyadic or small-group interpersonal trade-off that sits outside a formal work-authority structure — loyalty vs. honesty, disclosure, conflict-avoidance, intimacy. The personal-interpersonal complement to
team-dynamics(work-interpersonal). - Why distinct from
team-dynamics: team-dynamics carries org-authority structure (you manage / vote with / report to the counterparty); relational-decision does not (friend, family, partner). The play shape differs: persuasion pressure is social, not authority; the cost mix leans on integrity and relational rather than developmental/reputational. - Expected drivers:
team_harmony(read as interpersonal harmony per ADR-074's mapping note),transparency,principle,autonomy. - Expected signal patterns: pragmatic-routing (E13) fires strongest here — the experiment's two cleanest routing instances were both relational (S3 friend's secret → redirect to Aaron; S7 investor intro → refer out). Persuadability under social pressure (distinct source from authority/analytical). Authenticity / rationale-choice match (E10) and loyalty-vs-merit are most legible here.
- Sample cube vectors:
- S3-shape — dyad/triad scope, intimate distance, you-know-more topology, forces-choice (silence reads as complicity): "hold a friend's secret or not."
- S7-shape — dyad scope, close distance, influence-only authority, strategic counterparty, dyadic-observed: "make an introduction you believe will fail."
2. Adjustments to existing categories¶
The cube/schema work suggests scope clarifications, not splits or redefinitions. Existing profile data stays valid; these are authoring-side guidance for the corpus going forward.
governance— keep, no definition change. ADR-074 calls it "borderline" for transfer. The transfer issue is a corpus property (75% institution-scope, per the cube corpus findings), not a category defect. Governance trade-offs exist in personal life (household, community board) but are rare; do not widen the definition to chase them. Leave the category clean; let corpus breadth, not redefinition, do the work.resource-allocation— keep, widen the framing. It generalizes cleanly (ADR-074), but the generator prompt frames it organizationally (budgets, headcount). Authoring guidance should make explicit that personal resource allocation (time, attention, personal money) is in-scope. No structural change — a prompt-copy note.team-dynamics— keep, tighten. Today it is the de-facto catch-all for anything interpersonal. Withrelational-decisionadded, restrictteam-dynamicsto work/organizational interpersonal coordination under a shared authority structure. This prevents overlap. No migration needed: all existingteam-dynamicsdata is already work-shaped, so the tightening is descriptive of what's there, not a reclassification.values-culture— keep, no change. Generalizes cleanly. Worth one authoring note: values-culture is the category when the values tension is the decision; when a values tension is merely a cost dimension of an otherwise-resource/personal decision, that belongs to C1 (cost categories), not to this category. This keeps it from becoming a second catch-all.
3. Signal-aggregate audit — all 14¶
ADR-024's 12 + E13 (pragmatic-routing) + E14 (ideal-actual reference) = 14. For each: does it fire in non-governance categories, and does it need a new sub-aggregate?
| # | Signal (schema id) | Fires cross-domain? | Needs new sub-aggregate? | Note |
|---|---|---|---|---|
| 1 | Reasoning style (E15) | Yes | No | 6 modes are cognitive, not domain-bound. Already has by_category; new keys auto-extend. |
| 2 | Self-awareness (E18) | Yes (solo) | No | Arguably fires better in personal-choice (high identity load). |
| 3 | Arc trajectory (E17) | Yes | No | Under-exercised today (campaigns are governance-narrative-shaped); multiplayer personal arcs will exercise it. Not broken. |
| 4 | Attention model (E16) | Mostly | Candidate — defer | See R2. The 6 attention categories include political (work/governance-shaped) but not physical. Health scenarios may need a physical attention category to mirror cube-C1. Speculative; defer until corpus shows players notice/ignore physical stakes differently. |
| 5 | Confidence calibration (E5) | Yes, but | Refinement R1 | Experiment Finding 1: calibration is expertise-conditional. Needs a by-expertise (cube-C2) breakout, not just by_category, or personal-choice (health+finance) blends opposite regimes. Schema Q4d. |
| 6 | Decision timing (E6) | Yes | No | Domain-agnostic. |
| 7 | Persuadability (E7) | Yes, but | Refinement R1 | Experiment: persuadability = inverse of domain confidence, not a trait. The source of pressure also differs by category (authority in health, social in relational, analytical in finance). Extends additively via the existing context dimension + the expertise conditioning. |
| 8 | Peer read confidence (E8) | Yes (multi) | No | About reading others' judgment; domain-agnostic. |
| 9 | Dissent profile (E9) | Yes — more | No | NoTA/dissent rate will be higher in personal/relational categories (CoachJ restructures binaries: S1, S3, S7 all non-governance). Not a defect, but it makes the NoTA-handling decision (companion brief OQ-1) more load-bearing as these categories grow. Cross-reference oq1-oq2-nota-handling-brief.md. |
| 10 | Rationale-choice / authenticity (E10) | Yes | No | Internal-only. More meaningful in personal-choice (aspiration gap). |
| 11 | Learning rate (E11) | Yes | No | Internal-only. Noisy early on new categories (low N) — Convention 6 covers it. |
| 12 | Occasion noise (E12) | Yes | No | Domain-agnostic; SPOF dependency on E_classify_driver unchanged. |
| 13 | Pragmatic routing (E13) | Yes — strongest here | No | Discovered in the personal-domain experiment (S1 career, S3/S7 relational). The canonical proof that new categories exercise existing signals harder rather than needing new ones. Ensure by_category exists for it. |
| 14 | Ideal-actual reference (E14) | Yes — born here | No | Surfaced in S5/S7/S8 (career/relational/financial). Feeds M1/M6. Same story as E13. |
Audit conclusion¶
No new signal aggregate is required. The 14 hold cross-domain. The decisive evidence is that the two most recently added signals (E13, E14) were discovered in the personal domains during experiment-new-domain-signals.md and then cross-checked back into governance — the set's own growth history is the strongest possible demonstration that it is cross-domain-complete rather than governance-shaped.
Two refinements emerge, both already named by the measurement schema, and neither is a new aggregate:
R1 — Expertise / domain-confidence conditioning on E5 (calibration) and E7 (persuadability). This is the experiment's Finding 1 made schema-precise. Risk-tolerance and persuadability are not flat per-player traits; they are conditional on whether the player has an analytical frame (confident) or defers to authority (deferential) for the scenario's domain. The scenario-side anchor is cube-C2 (expertise requirement); the player-side correlate is measured-outcome M3. The schema already tracks this as parked question Q4d (cube content-axis stratification, substrate-gated). The expansion does not create new work here — it confirms Q4d's priority. Spec, in schema language: extend A9 (calibration_stats) and the E7 persuadability aggregate with a by_expertise breakout keyed to cube-C2 values (low/moderate/high/expert-only), parallel to the existing by_category breakout. Gated on cube-C2 tagging reaching the corpus (Q4d trigger), so defer — see §6 timing.
R2 — Candidate physical attention sub-category on E16. ADR-024's attention categories (financial, interpersonal, political, temporal, ethical, technical) omit the physical/embodied dimension that health scenarios in personal-choice may surface; cube-C1 cost categories do include physical. This is the one place the signal set might be governance-shaped. But it is speculative — defer until the corpus shows players reliably noticing or ignoring physical stakes in a way the existing six don't capture (ship-and-observe). Not part of the now-work.
4. Changes to category_patterns (and adjacent structures)¶
The headline: category_patterns needs no schema/shape change. It is typed { [category: string]: {...} } (database.ts:948) and keys are added lazily in updateCategoryPatterns (player-model.ts:654) the first time a player plays a category. Adding categories is purely additive — confirmed in code, not just asserted by the schema's architectural-independence claim.
Concrete changes¶
ScenarioCategoryunion (scenario-generator.ts:14) — add'personal-choice' | 'relational-decision'. This propagates to the generator'svalidCategoriesarray (:956) and the prompt strings (:467,:558,:612,:623,:655). This is the only type change required.category_patternsJSONB — no shape change. New keys appear as the categories are played.migrateProfilealready handles missing fields gracefully (player-model.ts:99).- Per-category signal breakouts (
reasoning_style_distribution.by_category,attention_distribution.by_category,confidence_calibration.by_category) — string-keyed; auto-extend with no migration. - Triggers (
driver-trigger-constants.tsTRIGGERS) — add 2 non-work triggers (additive tocontext_rules/ A5): personal_crossroads— a self-scoped life-direction inflection (coverspersonal-choice;opportunity/crisis_mentionedonly partly reach it today).intimate_disclosure— a relational honesty / secret-keeping pressure (coversrelational-decision).- ADR-074 floated a third (
health_decision_point). Defer it: the existingrelational_proximitytrigger is already universal, andpersonal_crossroads+ the cube-C2/M3 health-deference machinery (R1) cover health without a dedicated trigger. Add later only if corpus shows health decisions failing to fire any trigger. calculateModelConfidence— verified safe, with one note (player-model.ts:858). It countsObject.keys(categoryPatterns).length(only played categories) and the category-coverage component already caps at 0.15, reached at ~4 categories. Adding two to the union therefore does not inflate or perturb existing profiles' confidence — they only gain credit if the player actually plays the new categories. No change needed. The note is for OQ-1 below: this is global confidence; per-category confidence is a separate, sparser quantity.
5. risk_tolerance — the anti-pattern the expansion surfaces (AP1)¶
Per the "changes-trigger-re-audit" discipline: adding personal-choice exposes a latent flaw in the existing category_patterns shape.
category_patterns[cat].risk_tolerance is a single 0–1 scalar per category (database.ts:952). The experiment proved risk-tolerance is expertise-conditional, not category-stable (tolerant in analytical-frame decisions, conservative in authority-deference decisions). For personal-choice — which deliberately unifies health (deferential) and finance (confident) — a single scalar averages two opposite regimes into an uninformative midpoint. The scalar was tolerable while the corpus was governance-only (one regime); the new category breaks its implicit assumption.
Recommendation (does not block the category addition):
- Do not split the category to rescue the scalar (that's AP2).
- Do treat risk_tolerance as deprecated-for-exposure in personal-choice, and route the real signal through E5 calibration's by_expertise breakout (R1) once Q4d ships.
- Flag the scalar for a dedicated re-audit when R1 lands: either retire it from the exposure layer or annotate it with the expertise split. Tracked, not urgent.
6. Anti-patterns and open questions¶
AP1 — risk_tolerance scalar. Covered in §5.
AP2 — Category proliferation to fix signal variance. Do not split a category because a signal varies within it. Signal variance within a category is the signal's job to condition (R1), not the taxonomy's job to partition. The schema's architectural-independence claim is the principle; respecting it keeps category count bounded.
AP3 — Category-as-surface drift. personal-choice must stay a trade-off type (self-scoped cost-bearing), not slide into meaning "the topic is personal life." If authors start tagging by surface, the domain-agnostic property ADR-074 depends on erodes. Guard in authoring guidance: tag by trade-off shape (cube scope/distance/authority), not by subject matter.
OQ-1 (the question explicitly asked: shared confidence intervals across personal/work?). No — they must not share. model_confidence is one global number (§4.5). A player with 80 governance games and 3 personal-choice games has high global confidence but near-zero confidence in personal-choice. Surfacing the global number against a personal-choice recommendation over-claims. The schema's answer is Convention 6 (per-aggregation sample-size annotation): category_patterns already carries games_in_category, so per-category confidence is derivable and should gate exposure of category-specific claims independently of the global score. This is consistent with how the agent layer should speak: confident about governance, explicitly tentative about a thinly-sampled personal category. Action: when surfacing any per-category pattern, annotate with games_in_category-derived N per Convention 6; never borrow the global model_confidence for a sparse category.
OQ-2 — Cross-category EMA contamination. None. The EMA is per-key; architectural independence holds. Confirmed in updateCategoryPatterns.
OQ-3 — Do personal scenarios belong in campaign arcs (E17)? Open. Arc trajectory is per-campaign and campaigns are governance-narrative-shaped today. Multiplayer personal-life campaigns would exercise E17 in personal categories; until then it's under-exercised, not broken. Resolve when the multiplayer corpus lands.
OQ-4 — The "do the hard work sooner" instinct: do it now, or wait for corpus? Split the answer:
- Do now (cheap, additive, avoids rework): the taxonomy decision, the ScenarioCategory union change, the 2 triggers, the authoring-guidance clarifications for existing categories. Reason: corpus is about to be authored. Authoring 50–100 scenarios against the wrong category set and retagging later is the expensive path; getting the tags right at authoring time is nearly free. This is the part of "do the hard work sooner" that is correct.
- Defer (substrate-gated, ship-and-observe applies): R1 (the E5/E7 expertise-conditioning, = schema Q4d) and R2 (the physical attention sub-category). Both need a played multi-domain corpus to calibrate against; building them now would be optimizing against hypothetical signal. ADR-074's own trigger-to-revisit ("after 50+ non-governance scenarios... signals show drift that doesn't recover with retuning") is exactly the right gate. This is the part of "do the hard work sooner" that would be premature.
The clean rule: scaffold the substrate now; recalibrate the signals on observed data. That sequencing also matches the schema's own staging — Q4b (category-stratification) is "ship now, no substrate gate"; Q4d (cube-C2 stratification) is "substrate-gated." The taxonomy work is the Q4b-adjacent scaffolding; R1 is Q4d.
7. Summary of recommended actions¶
Now (taxonomy scaffolding):
1. Add personal-choice and relational-decision to ScenarioCategory (scenario-generator.ts:14) and propagate through the generator's validators and prompt strings.
2. Add personal_crossroads and intimate_disclosure to TRIGGERS (driver-trigger-constants.ts).
3. Author-guidance clarifications: tighten team-dynamics to work-interpersonal; widen resource-allocation framing to personal resources; keep governance/values-culture definitions unchanged; tag by trade-off shape, not surface (AP3).
4. When exposing per-category patterns, gate on games_in_category N (Convention 6), never the global model_confidence (OQ-1).
Deferred (signal recalibration, gated on played corpus):
5. R1 — add by_expertise (cube-C2) breakouts to E5 calibration and E7 persuadability aggregates. = schema Q4d. Gate: cube-C2 tagging reaches corpus.
6. R2 — evaluate a physical attention sub-category on E16. Gate: corpus shows distinct physical-attention signal.
7. Re-audit the risk_tolerance scalar (AP1) when R1 lands.
No action required: no new signal aggregate; no category_patterns shape change; no migration; existing profiles unperturbed (verified in calculateModelConfidence).