Skip to content

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.

  1. Mode tag — every primitive carries an implicit mode tag (solo / multi / both). Default both. 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).
  2. Scope tag — aggregation primitives only. Values: per-game / per-player-lifetime / per-domain / per-group / per-campaign. Default per-player-lifetime.
  3. Write-time vs read-time — extraction layer only. Listed in separate sub-tables.
  4. Reference player calibration — inherited from cube. Magnitude and horizon calibrate to median Pulse user; player-conditional readings live in measured outcomes.
  5. Dominant-component rule — inherited from cube. Multi-component values per round tag by dominant component.
  6. 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) not games_played (per-session) unless explicitly stated otherwise. One session can contain multiple scenarios, so games_analyzed is typically larger. Complementary with Convention 7 (staleness) and central-extraction SPOF dependency graph (signal quality) — three orthogonal reliability dimensions.
  7. 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

  1. Swings — construct examples the schema would fail to capture. If it fails, add a primitive or refine a value.
  2. Decompositions — apply schema to N real player histories. Anything that doesn't fit gets promoted.
  3. Cross-check against cube — does each cube axis have a measurement correspondence? Gaps indicate missing primitives or unmeasured axes.
  4. Re-audit on rushed conclusions — methodical sweeps get one unit per turn, not batched.
  5. Assumption audit — for each primitive, surface implicit assumptions about player preference structure or behavior.
  6. 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.
  7. 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:

  1. Architectural gap (need new structure). Examples: Q5 missing agent-side capture surface; capture-gap candidates for missing process information. Closures = add primitives.
  2. Aggregation gap (existing structure under-utilized). Examples: Convention 6 sample-size; Parked Q4 stratification by mode/category/cube-axis. Closures = fix aggregation algorithms.
  3. 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_driver consumer 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 feeding sync_score; only classification extractions fail silently, which is why E_classify_driver is 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.

  1. 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.
  2. Q2 — Per-category sync scores. ADR-070. Trigger: ADR-070's three blocking questions resolve (category axis, display-vs-specialization, light-paper alignment).
  3. 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.
  4. Q4 — Stratification of aggregations. Split into four sub-tasks:
  5. Q4a — Mode-stratification. Ship now. No substrate gate.
  6. Q4b — Category-stratification (extended). Ship now. No substrate gate.
  7. 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.
  8. 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.
  9. 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:

  1. 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.
  2. Missing layer — a recurring measurement can't slot into capture / extraction / aggregation / exposure / measured outcomes.
  3. 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_profiles columns 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.