Measurement Schema¶
Status: Stable. Promoted from working notes 2026-05-31 after 16 swings + 16 repeats + 34 decompositions. Convergence threshold met at swing layer (6 consecutive refinement-only repeats) and decomposition layer (12 consecutive decompositions without substantive new findings). v0 primitive list, methodology principles, tagging conventions, architectural findings, and parked questions all stable.
Iteration history: See ../archive/measurement-schema-working.md for the full session log — swing constructions, decompositions, parked-question deliberations, synthesis derivations, and the convergence trajectory. The canonical doc here is the stable artifact; the working notes (archived 2026-06-01) preserve the deliberation.
New here? Start with the Reader's Guide — plain-language, with a diagram of the five layers — then come back to this canonical doc for the full primitive enumeration. Prefer to click around? Open the interactive schematic.
Connects to:
- docs/research/foundations/scenario-dimension-cube.md — companion design doc; the schema references substrate from it but does not own substrate.
- docs/decisions/074-pulse-as-multi-domain-judgment-layer.md — strategic context. Schema completeness is load-bearing for multi-domain expansion.
- docs/decisions/024-judgment-layer-signals.md — 12 behavioral signals; plus pragmatic-routing + self-aware-aspiration-gap from experiment-new-domain-signals.md = 14 total.
- docs/decisions/045-five-sync-dimensions.md / 056 / 057 / 065 / 070 / 071 — measurement-side ADRs informing exposure surfaces.
Purpose¶
The measurement schema is a structural enumeration of every primitive Pulse uses to measure judgment, organized by causal layer (capture → extraction → aggregation → exposure) plus a measured-outcomes bin for emergent properties.
Parallel to the scenario dimension cube: the cube specifies scenario inputs (what the designer commits to). The schema specifies player × system outputs and intermediates (what the running system records, derives, aggregates, and exposes).
Killer use case — multi-domain expansion under ADR-074. Cube + measurement schema together specify the architectural surface that needs to hold under non-governance corpus expansion. If the schema is complete, signal recalibration after corpus expansion is bounded work; if incomplete, recalibration risks discovering primitives we never named.
Four causal layers + measured outcomes¶
Capture → Extraction → Aggregation → Exposure are causally chained: each is a function of the prior. Measured outcomes sit outside the chain — emergent properties revealed but not specified.
Layer 1 — Capture¶
Per-round records authored by the player or by the system as basic logging. Frozen at write.
Layer 2 — Extraction¶
Computations on capture. Sub-distinguished: - Write-time extractions — computed once at the round, stored on the row, treated as frozen. - Read-time extractions — computed on demand from current capture state. Always reflect current logic.
The sub-distinction matters for update semantics (prompt-version changes), historical vs. current views (trajectory questions), and debugging triage ("is the input frozen or live?").
Layer 3 — Aggregation¶
Per-player roll-ups of extractions. Carries sample-size annotation per Convention 6.
Layer 4 — Exposure¶
External surfaces — user UI, agent context blocks, MCP tools, share cards.
Measured outcomes¶
Emergent properties of player × system interaction. Schema reveals; doesn't specify. Either scaffolded (extraction + aggregation feeding) or substrate-gated.
Substrate references — out of measurement schema scope¶
Scenario design metadata (cube vector, category, triggers, driver-per-option, content rules) is authored at scenario-creation time by a different actor (scenario author / generator). The cube doc owns substrate. The measurement schema references substrate as a precondition for extractions but does not enumerate it.
Naming disambiguation: the cube uses C-prefix for its content-layer axes (cube-C1 cost categories, cube-C2 expertise-requirement). The schema uses C1–C14 for capture primitives. Independent namespaces — when this doc references cube content-layer dimensions, it qualifies them as cube-C1 / cube-C2. Schema-side C1–C14 unqualified means capture primitives.
Layer 1 — Capture (C1–C14)¶
Player-authored or pure-logging records. Frozen at write.
| # | Primitive | Values / shape | Source | Notes |
|---|---|---|---|---|
| C1 | Option choice | A / B / C / D / none-of-the-above | Player | The atomic decision. |
| C2 | Rationale text | free-text | Player | Highest-bandwidth player input. |
| C3 | Conviction | 1–5 | Player | Self-reported certainty. |
| C4 | Decision time | ms | System clock | From scenario render to submit. |
| C5 | Post-reveal reaction | gets_me / off_track / interesting / null | Player | ADR-024 quick-tap. |
| C6 | Post-reveal note | free-text / null | Player | ADR-057 high-bandwidth signal. |
| C7 | Self-prediction (milestone) | predicted driver profile | Player | Games 10/25/50 + arc completion. mode: solo |
| C8 | Peer prediction | guessed option per other player | Player | mode: multi |
| C9 | Predictor confidence | 1–5 on peer prediction | Player | mode: multi |
| C10 | Post-discussion action | stand / revise / delegate | Player | mode: multi |
| C11 | Agent profile read event | read_id, client, timestamp | System logging | agent_profile_reads row (ADR-071). |
| C12 | "Why" request flag | bool | System logging | why_requested on read row (ADR-056). |
| C13 | Agent response feedback | rating up/down + free-text | Player via agent | agent_response_feedback joined via read_id. |
| C14 | Session metadata | timestamps, solo/multi, campaign, device, is_test_session | System logging | Frames the capture. |
Capture-gap candidates¶
A structurally new class: capture of the process of deciding, not just the decision. Promote when engineering work is scheduled.
| Candidate | Status | Closure path |
|---|---|---|
attention_state (tab focus/blur during decision window) |
Ready for promotion when eng happens. Two-swing load-bearing confirmation. | Closes E6 slow-regime contamination (distracted-vs-deliberating). |
option_tap_trace (tap sequence before final submit) |
Ready for promotion when eng happens. | Closes E7 solo-mode null (structured within-round persuadability signal). |
rationale_edit_trace (type/delete/retype on C2) |
Marginal; deferred. | Discrimination exists but not product-load-bearing; most cognitive-style discrimination covered by E6 + E_classify_driver. |
Submerged: hover times per option (noisy, no touch-device signal); scroll behavior (noisy); re-views (low frequency).
Layer 2 — Extraction¶
Write-time extractions¶
Computed at round write, stored on the row, treated as frozen. Re-deriving requires backfill.
| # | Primitive | Source | Notes |
|---|---|---|---|
| E_ai_pred | AI twin prediction + confidence | LLM call against profile, before player submits | Stored on round. Feeds E_sync_match + calibration. |
| E_rule_pred | Rule-engine prediction | Two-stage rule engine | Ensemble companion to E_ai_pred. |
| E_classify_driver | Driver / reasoning mode / attention focus / driver-tag classification | Claude call on C1 + C2 + substrate | ADR-024 prompt extension. Central extraction — see SPOF architectural finding. |
| E_chosen_driver | Driver of this round's choice | Deterministic: C1 × substrate (option-tagged driver) | Substrate-derived; distinct from Claude-derived classification. |
| E_chosen_trigger | Trigger(s) fired for this round | Deterministic: C1 × substrate trigger tags | Same shape as E_chosen_driver. |
| E_sync_match | Did E_ai_pred match C1? | Boolean + confidence-weighted | Feeds A1. Null on NoTA rounds — see OQ-1 territory and Convention 6. |
Read-time extractions¶
Computed on demand. Always reflect current logic.
| # | Primitive | Source | Notes |
|---|---|---|---|
| E5 | Confidence calibration | C3 × E_sync_match over rolling window | ADR-024 signal 5. Disjoint-subsample semantics (clarified Decomposition 38, 2026-05-31): over/underconfidence rates are computed over different subsamples — overconfidence_rate over high-conviction games (strength ≥ 4); underconfidence_rate over low-conviction games (strength ≤ 2). Both can fire simultaneously for players who fail calibration in both directions (Cici's real profile demonstrates this concretely). |
| E6 | Decision timing signature | C4 distribution; attention_state when shipped (slow-regime only) | ADR-024 signal 6. Closure asymmetric: attention_state closes slow-regime contamination (distracted-vs-deliberated); fast-regime intrinsically robust. Documentation refinement from Decomposition 12. |
| E7 | Persuadability profile | C10 × context (multi); option_tap_trace × context (solo, when shipped) | ADR-024 signal 7. Domain-conditional per experiment. mode: multi today; mode: both when option_tap_trace ships. |
| E8 | Peer read confidence | C8 × C9 × actual | ADR-024 signal 8. mode: multi. |
| E9 | Dissent profile | C1 NoTA rate + consensus deviation | ADR-024 signal 9. |
| E10 | Rationale-choice expression match | E_classify_driver × revealed pattern | ADR-024 signal 10. Formerly "rationale-choice alignment (authenticity)" — renamed for valuation-neutrality (Swing 3 Closure C, applied at canonical-doc promotion). ⚠️ Dual-interpretation — expression-match-low reads as inauthenticity OR epistemic humility; combine with other signals. |
| E11 | Learning rate | E_sync_match accuracy trend | ADR-024 signal 11. |
| E12 | Occasion noise | within-person variability on repeat-shape scenarios | ADR-024 signal 12. Refined: rationale-controlled algorithm (fire only when E_classify_driver outputs similar across repeats AND choices differ). SPOF dependency: depends on E_classify_driver. |
| E13 | Pragmatic routing | C2 patterns — frame-restructuring vs. binary acceptance | NEW per experiment. |
| E14 | Ideal-actual reference frequency | C2 + C6 patterns — explicit ideal-vs-actual statements | NEW per experiment. Formerly "self-aware aspiration gap" — renamed for valuation-neutrality (Swing 3 Closure C, applied at canonical-doc promotion). ⚠️ Dual-interpretation — reference-frequency reads as calibration OR verbal hedging; combine with other signals. |
| E15 | Reasoning style aggregation | E_classify_driver reasoning_mode over time | ADR-024 signal 1 aggregate. |
| E16 | Attention model aggregation | E_classify_driver attention over time | ADR-024 signal 4 aggregate. |
| E17 | Arc trajectory | choice + signal drift across campaign chapters | ADR-024 signal 3. |
| E18 | Self-awareness | C7 vs. computed profile + C5/C6 | ADR-024 signal 2. mode: solo. SPOF dependency on E_classify_driver. Exposure-layer null-guard discipline applies (Decomposition 5): multi-only players have null E18; must surface as "not measured" not "low self-awareness." |
| E19 | Drift indicator | last-N E_sync_match misses / N | ADR-045 override. |
| E20 | Domain-confidence inference | persuadability/risk variance across domain | Meta-signal per experiment. |
| E21 | Cross-domain signal consistency | comparing E5–E20 firings across substrate-domain | Computable once corpus spans domains. |
| E22 | E_context_bleed | classifies C2 + C6 for real-world-parallel mentions | Feeds M9. SPOF-family dependency on similar classifier. |
Read-time extraction candidates (not promoted)¶
Available from existing C14 metadata; not yet load-bearing.
| Candidate | What it would extract |
|---|---|
E_tod_calibration |
Conviction × accuracy across time-of-day buckets |
E_session_fatigue |
Drift across Nth scenario in single session |
E_device_signature |
Mobile vs. desktop differences |
E_persuadability_text |
Persuadability cues from C2 rationale (solo-mode persuadability signal alternative to option_tap_trace) |
Layer 3 — Aggregation (A1–A14)¶
Per-player roll-ups. All carry N denominator per Convention 6.
| # | Primitive | Form | Source | Notes |
|---|---|---|---|---|
| A1 | sync_score (lifetime) | int 0–100 | EMA of E_sync_match | Headline. scope: per-player-lifetime. ⚠️ EMA over variable-density input (null on NoTA). |
| A2 | Sync dimensions: Accuracy / Coverage / Readability | int 0–100 × 3 | computed on demand | ADR-045. Readability mode: multi. |
| A4 | category_patterns | EMA distribution per category | E_chosen_driver × substrate-category | scope: per-player-lifetime. |
| A5 | context_rules | EMA distribution per trigger | E_chosen_trigger | scope: per-player-lifetime. |
| A6 | option_preferences | EMA distribution per option-shape | C1 | scope: per-player-lifetime. |
| A7 | Signal JSONB columns | per-signal aggregates | E5–E22 outputs | scope: per-player-lifetime. |
| A8 | resonance_stats | per-reaction counts (+ note semantics per refinement) | C5 + C6 aggregated | scope: per-player-lifetime. Refined: classify C6 note semantics alongside C5 enum. |
| A9 | calibration_stats | overconfidence rate, etc. | E5 aggregated | scope: per-player-lifetime. Per-domain breakouts when Q4 ships. |
| A10 | behavioral_trajectory | per-campaign arc | E17 stored per campaign | scope: per-campaign. |
| A11 | A_why_rate | % of agent reads where C12 = true | C11 + C12 across reads | Feeds M5. scope: per-player-lifetime. |
| A12 | A_feedback_engagement | % of agent reads where C13 set | C11 + C13 across reads | Feeds M5. Discriminates trusting-engaged from indifferent-disengaged. |
| A13 | A_feedback_positivity | positive vs. negative split (rating + note semantics) | C13 rating + free-text | Feeds M5. Classifies free-text alongside rating from start. |
| A14 | A_context_bleed_rate | rate of E22 firings across rounds | E22 aggregated | Feeds M9. |
Per-group aggregation candidates (parked)¶
Multiplayer surfaces aggregations at scope: per-group not currently in the schema. Two are scope-variants (handled by Q4); two require new primitive shapes.
| Candidate | Architectural shape | Gap category |
|---|---|---|
A_group_sync |
Scope-variant of A1 | Aggregation-gap |
A_group_drivers |
Scope-variant of A4 | Aggregation-gap |
A_group_consensus |
New shape (cross-member distribution) | Architectural-gap |
A_dyadic_readability |
New shape (pair-level matrix, O(n²) in group size) | Architectural-gap |
Layer 4 — Exposure (X1–X11)¶
| # | Primitive | Audience | Source |
|---|---|---|---|
| X1 | sync_score (headline) | user + agent | A1 |
| X2 | Three Sync Dimensions | user (Play screen) | A2 |
| X3 | Behavioral attention signals (subset surfaced) | user (insights) | subset of A7 per ADR-065 |
| X4 | category_patterns cards | user (insights) | A4 |
| X5 | agent_context_block (prose) | agent (MCP + paste) | derived from A4–A14 + E5–E22. Mainstream paste-user path — highest interpretive load. Principle 7 applies: prose must consume rationale-text paths (C2, C6) when describing combinational frames, not only structured aggregates. |
| X6 | personal_context field | agent (MCP + paste) | A4–A14 condensed |
| X7 | MCP tools (get_profile / get_recent_decisions / submit_feedback) | agent (MCP-only) | exposes A1–A14 + capture history |
| X8 | Drift detection nudge | user | E19 override |
| X9 | Activity log | user | capture-layer rendering |
| X10 | Share cards / Twin pages / rankings | public/peer | X1 + X5 derivatives |
| X11 | "Why" expansion text | agent → user | A1–A14 + capture rendered as reasoning prose |
Held back from exposure (internal-only): E10 authenticity, E11 learning rate.
Measured outcomes (M1–M9)¶
| # | Outcome | Scaffolding |
|---|---|---|
| M1 | Identity load | Partial via A7 carrying E14. Exposure-gap territory (principle 7). |
| M2 | Subjective stakes threshold | Substrate-gated (cube axis 11). Aggregation-gap when Q4c ships. |
| M3 | Domain confidence asymmetry | Anchored to cube-C2 via OQ-5. Layered gap: aggregation (Q4d) + exposure-staleness (state-sensitive). Detection-vs-visibility nuance (Decomposition 10, 2026-05-31): detection occurs at the extraction layer via E20 per-round variance; Q4d makes aggregation surface the pattern but is not strictly required for detection. Principle 7 prose-synthesis discipline enables X5 to describe M3 from per-round E20 firings (in A7 JSONB) pre-Q4d. |
| M4 | Calibration drift | Scaffolded via E19. Layered gap: scaffolded + exposure-staleness (state-sensitive). |
| M5 | User trust state with agent | Scaffolded via A11/A12/A13. Layered gap: scaffolded + exposure-staleness (state-sensitive). |
| M6 | Aspiration gap magnitude | Partial via A7 carrying E14. Exposure-gap territory. |
| M7 | Frame-restructuring tendency | Partial via A7 carrying E13. Exposure-gap territory. Routes around X1 collapse for OQ-1. |
| M8 | Cross-domain signal stability | Substrate-gated (multi-domain corpus). Aggregation-gap when Q4 ships + corpus expands. |
| M9 | Play-time context bleed | Scaffolded via E22 + A14. |
Tagging conventions¶
How to read the primitive tables.
- Mode tag — every primitive carries an implicit
modetag (solo/multi/both). Defaultboth. Exceptions tagged inline. Exposure-layer null-guard discipline: mode-conditional null states (e.g., E7 null for solo-only players; E18 null for multi-only players; C7 null for multi-only players) must surface to consumers as "not measured" rather than zero/low. Originally identified at E7 (Swing 4 Closure B); generalized to all mode-tagged primitives at Decomposition 5 (MO multi-only profile). - Scope tag — aggregation primitives only. Values:
per-game/per-player-lifetime/per-domain/per-group/per-campaign. Defaultper-player-lifetime. - Write-time vs read-time — extraction layer only. Listed in separate sub-tables.
- Reference player calibration — inherited from cube. Magnitude and horizon calibrate to median Pulse user; player-conditional readings live in measured outcomes.
- Dominant-component rule — inherited from cube. Multi-component values per round tag by dominant component.
- Sample-size annotation — every aggregation primitive carries an explicit N denominator that propagates to consumers. Exposure surfaces aggregations differently when N is below a per-primitive confidence threshold. Prose-synthesis sub-rule: X5 prose should surface N or tentativeness when below threshold. N source sub-rule (clarified Decomposition 38): N annotations use
games_analyzed(per-scenario, signal-feeding count) notgames_played(per-session) unless explicitly stated otherwise. One session can contain multiple scenarios, sogames_analyzedis typically larger. Complementary with Convention 7 (staleness) and central-extraction SPOF dependency graph (signal quality) — three orthogonal reliability dimensions. - Staleness annotation (promoted from OQ-staleness, 2026-05-31, post-decomposition pass) — state-sensitive measured outcomes (M4 calibration drift, M5 user trust state with agent) carry explicit "as of [date]" annotation when surfaced through paste-based exposure (principle 6). Pattern outcomes (M1 identity load, M2 subjective stakes, M3 domain confidence asymmetry, M6 aspiration gap magnitude, M7 frame-restructuring tendency, M8 cross-domain stability, M9 play-time context bleed) are durable across paste freshness windows and do not require staleness annotation. Direction asymmetry sub-rule (Decomposition 19): for state outcomes in degrading direction (e.g., calibration regressing), include explicit "may have changed; recommend refresh" prompt — simple "as of [date]" annotation is insufficient because stale-favorable descriptions can give users false confidence in their current state. Promotion criteria: 3+ confirmations met (PU stale-staleness, NS direction-asymmetry, D17 + D18 implicit M4 confirmations). Composition with Convention 6 for state outcomes: pasted descriptions of M4/M5 carry both N denominator AND "as of [date]" annotation. Complementary with Convention 6 and SPOF dependency graph — three orthogonal reliability dimensions form the schema's complete reliability framework (sample size + temporal staleness + signal quality).
Methodology principles¶
- Swings — construct examples the schema would fail to capture. If it fails, add a primitive or refine a value.
- Decompositions — apply schema to N real player histories. Anything that doesn't fit gets promoted.
- Cross-check against cube — does each cube axis have a measurement correspondence? Gaps indicate missing primitives or unmeasured axes.
- Re-audit on rushed conclusions — methodical sweeps get one unit per turn, not batched.
- Assumption audit — for each primitive, surface implicit assumptions about player preference structure or behavior.
- Two-audience exposure check — agent-MCP clients (fresh reads, can re-query) vs. paste-based clients (frozen snapshot, no refresh). Static text exposure carries higher interpretive load.
- Final-state vs. process capture — any aggregation, extraction, or prose-synthesis layer consuming a final-state capture should check whether co-captured process information would provide additional discrimination. Examples: final C2 text vs. edit trace; final C1 choice vs. tap sequence; C4 timing vs. attention state; C5 enum vs. C6 note text; structured aggregates vs. rationale-text in X5 prose.
Architectural findings¶
Three-category gap synthesis¶
Gaps in the schema cluster into three categories with three different closure shapes:
- Architectural gap (need new structure). Examples: Q5 missing agent-side capture surface; capture-gap candidates for missing process information. Closures = add primitives.
- Aggregation gap (existing structure under-utilized). Examples: Convention 6 sample-size; Parked Q4 stratification by mode/category/cube-axis. Closures = fix aggregation algorithms.
- Exposure gap (downstream interpretation issues). Examples: Principle 7 consumer discipline; E10/E14 valuation-laden naming. Closures = fix interpretation discipline (prose generation, exposure annotation, renaming).
Refinements: - Layered gaps: primitives can have gaps at multiple categories simultaneously. M3, M4, M5 are canonical layered examples. - Spanning closures: conventions span multiple categories — Convention 6 spans aggregation (compute N) + exposure (surface tentativeness). - Architectural-gap sub-types: missing-surface (Q5, agent-side) vs. missing-process-capture (Swing 15 candidates, game-side).
Central-extraction single-points-of-failure¶
The schema relies on a small number of central extractions. E_classify_driver is canonical — it feeds A4, A5, A7, and is referenced by E10, E12 (post-refinement), E14, E18, A8, A13, E22. (Audit correction, ADR-080: A6 option_preferences is keyword-derived from option/rationale text in code and does not consume the classifier output — earlier "feeds A6" was an overstatement.)
Resolved — see ADR-080. The full audit (all eight live central extractions, the explicit
E_classify_driverconsumer graph, and per-SPOF mitigation decisions) lives in ADR-080. Both failure modes are now closed: missing via the ADR-024 backfill; contaminated via Swing 3 Closure A (verbal-style normalization, shipped with ADR-080). The organizing lens ADR-080 adds: prediction extractions are ground-truth-checkable (silent-failure-proof) so they are low-priority SPOFs despite feedingsync_score; only classification extractions fail silently, which is whyE_classify_driveris the one that warranted active mitigation.
Tension with principle 7: each principle 7 closure that "consumes rationale text path" adds another dependent on free-text classification. The two principles compound.
Substrate-side parallel: the tagger of cube axes (cube-C2 expertise-requirement, structural axes if implemented) is also a high-leverage point. Mis-tagged substrate propagates through every Q4c/Q4d-stratified primitive. Cube-doc territory; cross-doc handoff.
Contaminated vs missing distinction (Decompositions 35–37, real teammate profiles, 2026-05-31): the SPOF dependency-graph should distinguish two failure modes — contaminated (signal exists but biased; e.g., verbal-style confusion in E_classify_driver) and missing (signal absent due to backfill gap or feature timing; e.g., E_classify_driver outputs empty for 2 of 3 real teammate profiles created before ADR-024 promotion). Both produce downstream nulls but mitigations differ: contamination requires Closure A normalization at the classifier; missing data requires backfill of the central extraction.
Closure: document the dependency graph explicitly. Every primitive consuming E_classify_driver-style classification gets tagged; consumers know which signals are at risk if the central extraction is contaminated or missing. Complementary with Convention 6 and Convention 7: three orthogonal reliability dimensions — sample size, staleness, signal quality (with signal-quality sub-distinguishing contamination from missingness).
Schema architecture sound; gaps cluster at consumer discipline¶
The schema's structure is sound. Of the three gap categories, only the architectural-gap category needs new structure — and that category has exactly two occupants (Q5 missing agent-side capture; Swing 15 capture-gap candidates). The dominant work across the schema is consumer discipline at aggregation and exposure layers — principle 7 codifies the canonical fix direction.
Forward-applied lesson pattern¶
When a swing surfaces a closure for an existing primitive, future primitives in adjacent design space inherit the closure before it ships on the original. Canonical examples: A13 + E22 inherited Swing 8's classify-free-text-alongside-structured lesson before principle 7 was named. Saves duplicate gap-locating across primitive additions.
3-stage multi-swing closure-path methodology¶
Schema exercise consistently produces closure paths in 3 stages: - Stage 1: gap-surfacing swing identifies the gap. - Stage 2: closure-naming swing promotes a candidate to ready-status or names the algorithm refinement. - Stage 3: downstream implementation (engineering work or product decision) — outside schema's scope.
Schema's job is Stages 1 + 2. Five documented paths: E7 mode (Swing 4 → 15), E6 slow-regime (Swing 5 → 15), mode-stratification (Swing 9 → 12), sample-size (Swing 9 → 11), OQ-2 + verbal-style (Swing 2 → 3).
Closure-paths-to-profile-shapes mapping (refined from decomposition pass): each closure path gates a specific profile-class discrimination. The 5 paths are not arbitrary — they systematically map to distinct profile shapes whose schema decomposition requires the closure:
| Closure path | Profile-class it gates |
|---|---|
| Swing 4 → 15 (E7 mode relaxation via option_tap_trace) | Solo-only persuadability discrimination |
| Swing 5 → 15 (E6 slow-regime via attention_state) | Distracted-slow vs. deliberated-slow discrimination |
| Swing 9 → 12 (Q4a mode-stratification) | Regime-shifted (solo-vs-multi behavior) player discrimination |
| Swing 9 → 11 (Convention 6 sample-size annotation) | Low-N profile honest communication (minimum-viable-profile boundary) |
| Swing 2 → 3 (verbal-style normalization + NoTA handling) | Meta-blind + hedger + pragmatic-router discriminations (multiple profile classes) |
Refines synthesis claim: "Gaps cluster at specific closure paths; each closure enables specific profile-class decompositions." The schema's discipline closures are not abstract — they are precisely the work needed to discriminate concrete profile shapes that the corpus produces.
Closure paths compose additively (Decomposition 20): profile-class discrimination can require multiple closure paths concurrently (e.g., cross-domain asymmetric pragmatic-router needs 5: OQ-1, OQ-2 Closure C + Swing 3 Closure A, Q4b, Q4d, Convention 6). The closure paths are architecturally independent design dimensions — they compose without conflict and can be implemented in any order, in parallel, or sequentially without coordination. This is a strong claim about the schema's architectural coherence: gaps cluster at consumer discipline AND the discipline closures are mutually independent.
Single-swing closures included (Decomposition 22): the mapping framework above emphasizes multi-swing closure paths but applies equally to single-swing algorithm refinements that gate profile-class discrimination. Examples: Swing 7 Closure A (E12 rationale-controlled noise) gates refined occasion-noise discrimination; Swing 8 Closure A (A8 classify free-text alongside enum) gates engaged-divergence discrimination (reaction-note-divergent profiles).
Architectural independence of design dimensions¶
Generalization across the decomposition pass (D20 + D24): the schema's design dimensions — closure paths, measured outcomes, signals, conventions — are mutually independent. Multiple closure paths compose additively (D20: 5 paths concurrent on cross-domain asymmetric pragmatic-router). Multiple measured outcomes fire simultaneously without interaction effects (D24: M3 + M7 + M9 + M4 + M5 + E18 all firing high on maximalist profile). No cross-contamination at the architectural layer.
Strong claim about schema coherence: the schema's primitives, conventions, and closures are orthogonal design dimensions. This enables (a) independent implementation scheduling for closures, (b) parallel ADR work on different M-outcomes without coordination overhead, (c) reasoning about each design dimension in isolation when reviewing the schema.
Parked questions¶
Externally-gated. Revisit when trigger fires.
- Q1 — Per-driver / per-trigger conditional aggregation buckets. ADR-057 Phase B. Trigger: production observation that Phase A reaction-text integration fails to close domain-conditioning gaps.
- Q2 — Per-category sync scores. ADR-070. Trigger: ADR-070's three blocking questions resolve (category axis, display-vs-specialization, light-paper alignment).
- Q3 — Sync score decay. ADR-051 retune; not deployed. Trigger: ADR-050 permission tiers ship OR active-player base grows enough that current play volumes make decay meaningful.
- Q4 — Stratification of aggregations. Split into four sub-tasks:
- Q4a — Mode-stratification. Ship now. No substrate gate.
- Q4b — Category-stratification (extended). Ship now. No substrate gate.
- Q4c — Cube structural axis stratification (axes 1–12). Substrate-gated on cube going live in generator v1.9.0+ OR curated multiplayer corpus tagged with cube vectors. Axis-priority guideline: axis 11 (stakes magnitude), axis 2 (decision deadline), axis 8 (information topology) first; others pool by default.
- Q4d — Cube content axis stratification (cube-C1, cube-C2). Substrate-gated. Trigger: cube generator ships cube-C2 tagging OR curated corpus gets manual cube-C2 tagging.
- Q5 — Agent-side capture parity with game-side capture. Architectural-gap (missing-surface sub-type). Trigger: ADR-039 (decision capture from non-game contexts) moves from Proposed to Accepted. Candidates: agent recommendation text captured durably, user-action-after-recommendation captured, recommendation-vs-action match captured (agent-side analog of E_sync_match).
Open questions¶
OQ-staleness — measured-outcome staleness profiles. Measured outcomes have different staleness profiles for paste-based mainstream users (principle 6). Pattern outcomes (M1, M2, M3, M6, M7, M8, M9) durable across weeks. State outcomes (M4 calibration drift, M5 trust state) shift faster. Static text exposure should distinguish — time-sensitive outcomes deserve explicit "as of [date]" annotation in pasted profile snippets. Scope: bounded to M4 + M5 across 9 measured outcomes.
Submerged candidates¶
Logged so we don't re-litigate.
| Candidate | Why submerged | Where it lives instead |
|---|---|---|
| Scenario tagging vector as capture primitive | Different actor (scenario author/generator), different lifecycle. Cube owns it. | Substrate (cube doc); measurement schema references. |
| AI twin / rule-engine prediction as capture | System-computed, not player-authored. Live on the row but functionally extraction. | Write-time extractions (E_ai_pred, E_rule_pred). |
| Attestation / commitment hash as measurement primitive | Doesn't measure player; proves prediction-before-reveal. Infrastructure. | Infrastructure, not in schema. |
| Agent response itself as schema primitive | Produced by agent, not Pulse. | Agent's scope. |
| Sync dimensions Consistency / Information as exposure | ADR-045 demoted as vanity-without-direction. | Read-time extraction with no exposure. |
rationale_edit_trace as capture primitive |
Marginal per Swing 15; most cognitive-style discrimination covered by E6 + E_classify_driver. | Capture-gap demoted candidate. |
Multi-swing closure paths¶
Five documented paths. Schema work is Stages 1 + 2; Stage 3 is external.
| Path | Stage 1 (gap) | Stage 2 (closure-naming) | Stage 3 (implementation) |
|---|---|---|---|
| E7 mode relaxation | Swing 4 (E7 solo-mode null) | Swing 15 (option_tap_trace promoted) | Eng work |
| E6 slow-regime resolution | Swing 5 (distracted-vs-deliberated) | Swing 15 (attention_state promoted) | Eng work |
| Mode-stratification of aggregations | Swing 9 (mode pooled at A9) | Swing 12 (Q4a sub-task created) | Eng work |
| Sample-size handling | Swing 9 (SS-1 opened) | Swing 11 (Convention 6 promoted) | Eng work |
| OQ-2 closure C sequencing | Swing 2 (NoTA contamination) | Swing 3 (verbal-style normalization prerequisite) | Coupled product decision |
Falsification conditions¶
The schema is wrong if:
- Missing primitive — two player profiles with identical schema decompositions feel meaningfully different to a paste-user reading them, even after the M-series and exposure layers are exhausted.
- Missing layer — a recurring measurement can't slot into capture / extraction / aggregation / exposure / measured outcomes.
- New signal class — a signal type emerges from corpus (especially multi-domain) that requires a new primitive class no existing layer can absorb.
What this doc is NOT¶
- Not a generator / extraction spec — closures are direction-setting, not implementation specs.
- Not an audit of
player_decision_profilescolumns vs. schema primitives — that's a separate effort post-promotion. - Not a falsification protocol — falsification conditions are necessary triggers, not experimental designs.
- Not a frozen artifact — the schema is expected to iterate as the corpus expands across domains and the cube integrates new axes. Falsification conditions exist precisely because they'll fire eventually.