ADR-039: Decision capture primitive — extend Sync beyond game scenarios¶
Status: Proposed Date: 2026-05-05 Context: Sync today only ingests data from game scenarios (solo, multiplayer, campaign). Real org decisions — the "should we keep Cici on reskin or pause for connector?" kind that happen in meetings, chat threads, and agent calls — are invisible to the trust graph. James (May 4 all-hands) reframed Sync as the "mother algorithm" / coordination substrate the Beacon white paper described, where decisions outside the game should also flow through Sync, get captured, and update trust weights. The current code is well-positioned to be that substrate but is missing the primitive that captures non-game decisions.
At a glance
What it decides: a proposal (not yet in force) for a decision_log primitive that pulls real org/team decisions — not just game scenarios — into Sync, so the trust graph can learn from how people actually decide.
- Core mechanism — capture decisions passively (transcripts now, agent calls and in-channel later), then a 14-day "worked / didn't / mixed" outcome tag turns them into trust signal.
- Phased — only Phase 1 (transcript ingestion + outcome tagging) ships now; agent-call and in-channel capture are deferred until Phase 1 proves useful.
- Main rejected alternative — building James's full ZHC closed-loop coordination layer up front; this ships the smallest testable unit instead.
- Cost/risk — without outcome tags the data is just noise; trust depends on people actually tagging outcomes (target ≥40% at 14 days).
- Open question — how a captured decision should reweight existing judgment-layer signals (held until there's enough data to decide empirically).
Decision¶
Introduce a decision_log primitive that captures real decisions (not game scenarios) into Sync, with three progressive ingestion layers and a paired outcome-tagging mechanism. Phase 1 ships transcript ingestion and outcome tagging only; Phases 2–3 are deferred until Phase 1 data proves useful.
Schema:
decision_log:
id, source ('transcript' | 'agent' | 'manual'),
source_ref (meeting URL, MCP request_id, etc),
question_text, context_text, options_jsonb,
decision_text, decided_at,
outcome_text, outcome_rating ('worked'|'didnt'|'mixed'|null),
outcome_at, linked_signals_jsonb
decision_participants:
decision_id, user_id, stance, weight
Three ingestion layers:
- Transcript ingestion (Phase 1, ship-this-month). Fathom (or pasted) transcripts → LLM extraction pass →
decision_logrows. No new product UI required for capture; just a pipeline. Two transcript sources, both Phase 1: - Org meetings (all-hands, 1:1s) — the original framing.
- Post-game discussions (added May 5 after Cici's observation that the 30-min conversation after a 5-min scenario reveals values, context, and reasoning that the choice-only data misses). The Fathom transcript of a multiplayer game session is high-density signal — rationale + cross-talk + mind-changes — and feeds the same
decision_logpipeline. CoachJ explicitly endorsed this on the May 5 call: "Hermes is taking in all the transcripts of the multiplayer games and is taking all of that context into the full algorithm."
First test corpus: the team's own all-hands transcripts + the May 5 post-game discussion (already recorded).
- Agent-call capture (Phase 2, 1–2 weeks after Phase 1). Persist the (question, profile-context, response) tuple from MCP
/synccalls that today is ephemeral. Already half-built — just needs a write. - In-channel capture (Phase 3, deferred).
/sync logTelegram/Discord bot or in-product button. Only after Phases 1+2 validate signal quality.
Outcome tagging (ships with Phase 1). Every captured decision gets a 14-day follow-up nudge: "you decided X — worked / didn't / mixed + optional why." One click; optional free text. Without outcomes, trust-weight updates are speculative.
flowchart LR
T[Transcripts<br/>Phase 1] --> X[LLM extraction]
A[Agent calls<br/>Phase 2] --> X
C[In-channel<br/>Phase 3] --> X
X --> D[(decision_log)]
D --> O[14-day outcome tag<br/>worked / didn't / mixed]
O --> W[Trust-weight update]
Three capture layers feed one extraction pass into decision_log; only outcome-tagged decisions update trust weights.
Rationale¶
- Validates James's "mother algorithm" reframe with the smallest testable unit. Rather than committing to ZHC-scale closed-loop architecture, we ship the primitive and check whether real decisions produce trust-relevant signal. If they don't, the whole reframe needs revisiting.
- Piggybacks on artifacts users already produce. Decision-capture products fail when they require a new habit. Transcripts already exist; agent calls already happen. Both layers are zero-new-friction.
- Structurally parallel to multiplayer scenarios. A captured decision with N participants and individual stances is shaped like a multiplayer game session. That keeps the trust-weight update path consistent — same downstream consumers, same scoring math, just a different source.
- Outcome tagging is the actual differentiator. Most "decision logging" products track decisions and stop there. The 14-day outcome loop is what makes the data update trust weights instead of just sitting in a table.
Alternatives Considered¶
- Build the full ZHC closed-loop coordination layer (James's full vision). Rejected as Phase 1 because: (a) requires agent-to-agent infrastructure that doesn't exist yet, (b) commits to a much larger architectural surface before any signal-quality validation, (c) couples capture, attribution, and trust-update updates into one bet instead of three. The full vision remains the north star; this ADR is the foundation for getting there.
- In-product "log a decision" form (Layer 3 only). Rejected as Phase 1 because new-habit products with daily-friction asks die. Better to capture passively first.
- Skip outcome tagging; capture decisions only. Rejected. Decisions without outcomes generate noise the trust graph can't act on. Better to capture fewer decisions with outcomes than many without.
- Treat captured decisions as game scenarios — same table. Rejected. Game scenarios are designed instruments with controlled prompts and scoring rubrics; real decisions are messy and post-hoc. Conflating them muddies both data quality and game integrity. Separate table, parallel structure, downstream consumers can union if needed.
Discussion¶
Surfaced from the May 4 all-hands when James reframed Sync as the "mother algorithm" coordinating all org decisions, not just a profile builder from games. The user (CoachJ) initially read this as a much larger pivot than it needs to be — partly because James was describing the full ZHC closed-loop end-state. The deliberation that produced this ADR landed on: the primitive that closes the gap between "game-only" and "full coordination substrate" is non-game decision capture. That's the smallest testable unit.
Two design pressures pulled in opposite directions: - Bias toward capture breadth — the more decisions captured, the richer the graph. Argues for low-friction passive ingestion of everything. - Bias toward signal quality — game scenarios are calibrated; real decisions aren't. Capturing noise dilutes the trust signal Sync exists to produce.
Resolution: capture passively (transcripts, agent calls) but only count toward trust weights once outcomes are tagged. The 14-day outcome loop is the gate that filters captured-decision noise into actionable signal. Speculative until outcome-tagged, weighted thereafter.
Tash's coordination-substrate security concern (manipulation/capture risk if Sync becomes mastermind) is acknowledged but scoped to a separate ADR. This ADR is the data primitive; the access/manipulation surface that primitive creates is a related-but-separable design question that should not gate Phase 1 ingestion of the team's own meetings.
Open question deferred: how does a captured decision_log row update the existing judgment-layer signals? Phase 1 stores linked_signals_jsonb as extracted-but-not-yet-applied. The trust-weight integration (do real decisions weight equal to / less than / more than game scenarios?) is held until Phase 1 produces enough rows to evaluate empirically.
Consequences¶
- New
decision_loganddecision_participantstables required; migration to follow. - Transcript-ingestion pipeline needs an LLM extraction prompt; cost is small (one extra Sonnet 4.6 call per meeting).
- Outcome-tagging UI needs a notification surface — could be email, in-product banner, or piggyback on existing dashboard. Smallest viable: dashboard banner that surfaces decisions awaiting outcomes.
- Pre-2026-05-05 decisions are not retroactively captured (would require manual ingest of historical transcripts; deferred).
- If Phase 1 data shows real decisions don't predict trust-relevant outcomes, this ADR is the trigger to revisit the full "mother algorithm" reframe rather than scaling to Phases 2–3.
- Watch: outcome-tag completion rate. If users don't tag outcomes, the captured data stays speculative and the whole loop fails. Target ≥ 40% tag rate at 14 days; below 20% means the nudge UX needs rework before more capture.
Key files (proposed):
- migrations/0XX_decision_log.sql — schema for decision_log + decision_participants
- src/lib/decisions/extract-from-transcript.ts — LLM extraction pipeline
- src/lib/decisions/outcome-nudge.ts — 14-day follow-up logic
- src/app/api/decisions/ingest-transcript/route.ts — Phase 1 entry point