Winning by Design * Data Model & Agent Handoff · WS2

SPICED Pulse: The Data Model

This is the contract everything reads. SPICED-tagged, speaker-resolved call segments from Grain, joined to HubSpot deals on the deal id, scored in Claude against the SPICED rubric, and every score anchored to a verbatim customer quote. Each rep gets one object per account per week. The coaching card renders it, the manager rollup aggregates it, the Deal Pulse forecasts against it, and the query box answers over it. This document is the spine the engineer builds against.

One object per rep per account Joined on HubSpot deal id Every score carries a verbatim quote Derived-only egress gate
1 · The core object

One analysis object per rep, per account, per weekly run.

Derived directly from the real analysis output the scorer already produces. The object joins to the pipeline on the account and deal id, carries the seven SPICED sub-dimensions plus sentiment and call structure, and pairs each dimension score with the customer line, the rep's actual response, and the ideal response that grounds it. No score exists without evidence.

FieldTypeDescription
Identity and join keys
accountstringAccount domain, the join key to HubSpot. Example: cbre.com.
account_namestringHuman-readable account label, may carry the opportunity thread context.
repstringDeal owner, resolved from the HubSpot owner at ingest and denormalized onto every segment.
managerstringThe rep's frontline manager, drives the coaching-card routing and the access scope.
deal_stagestringCurrent bowtie stage for the deal. Example: Discovery.
deal_stage_basisstringThe evidence for the stage call: call types logged, latest activity, days dormant.
SPICED, seven sub-dimensions
spiced.situation{score,state,gap}score 1 to 5, state (weak, solid, strong), gap boolean. Situation understanding.
spiced.pain{score,state,gap}Same shape. Buyer-articulated pain in their own words.
spiced.impact{score,state,gap}Same shape. The quantified business consequence of the pain.
spiced.critical_event{score,state,gap}Same shape. A dated compelling event with a consequence.
spiced.decision_criteria{score,state,gap}Same shape. What the buyer will judge the decision on.
spiced.decision_process{score,state,gap}Same shape. Who decides, the approval path, multi-threading.
spiced.engagement{score,state,gap}Same shape. Depth and reciprocity of buyer engagement.
Impact review, the evidence bundle
impact_review.asked_impact_questionbooleanDid the rep actually ask an impact question. The behavioral binary underneath the score.
impact_review.basisstringWhy the score is what it is, in plain language tied to what was and was not said.
impact_review.old_score / new_scorenumberScore before and after the review pass, so re-scans are auditable.
impact_review.best_moment.callstringWhich call the evidence quote comes from, deep-links to the Grain moment.
impact_review.best_moment.customer_linestringThe verbatim customer quote. The trust anchor, the buyer's actual words.
impact_review.best_moment.rep_actualstringWhat the rep actually said in response, verbatim.
impact_review.best_moment.ideal_responsestringWhat a top rep could have said. The rewrite the coaching card renders.
Sentiment and call structure
sentiment.scorenumberBuyer warmth index, 1 to 5.
sentiment.trajectorystringDirection across the call sequence. Example: warming.
sentiment.notestringThe nuance, including when warmth rides on low-authority champions and inflates true deal health.
call_structure.scorenumberCall-flow discipline, 1 to 5, with a gap boolean.
call_structure.notestringProcess observations: next-step discipline, talk ratio, ACE opening quality.
Diagnosis and coaching
headline_gapstringThe single most deal-limiting gap, named with its dimension and score.
top_gaps[]{dimension,score,why}[]The ranked shortlist of gaps, each with the reason it scored where it did.
best_coaching_moment{dimension,call,customer_line,rep_actual,ideal_response,why}The single moment that best teaches the coachable point, fully sourced.
recommendation.rep_patternstringThe rep's recurring pattern across deals, the coaching thesis.
recommendation.playbook_sectionstringThe matching Managing for Impact play to run.
recommendation.one_on_one_focusstringThe concrete agenda for the Tuesday 1:1, tied to the gaps.
recommendation.primary_prompt / secondary_prompts[]{label,url}The coaching prompt links (question bank, role-play, 1:1 agenda) the manager runs.
Deal outlook
recommended_next_stepstringThe single next action to advance the deal.
deal_risk.at_riskbooleanRisk flag for the Deal Pulse row.
deal_risk.levelstringlow, medium, or high.
deal_risk.reasonstringWhy the deal is flagged: dormancy, single-threading, missing Critical Event, unquantified Impact.
rolling_notestringThe running deal narrative, carried across weekly runs.

Field names and shapes are lifted verbatim from the live analysis output (cbre.com.result.json). The engineer treats this object as the canonical record; every surface downstream is a projection of it.

2 · The two scores

Completion is the revenue headline. Quality is the coaching signal.

Every dimension carries a 1 to 5 quality score, but the object also resolves to a binary Completion for the two dimensions that move revenue: Impact and Critical Event. Completion drives the ELT Deal Pulse and the goal metric. Quality drives the week-over-week growth a rep watches. Both are shown; together they teach the framework at two levels, did you do it and how well.

Completion (yes or no)

Did the rep capture a validated Impact and an identified Critical Event at all. This is the revenue-linked headline that drives the completion-lift goal metric and every Deal Pulse row. It is a binary the scorer detects against the locked definitions below.

Quality (1 to 5)

How well they did it, the depth score already in the object as score per dimension. This is the coaching signal and the week-over-week delta a rep watches. Growth trajectory is the frame, not a static grade.

Completion definitions (LOCKED 2026-05-29)
  • IImpact is complete when there is a customer-validated, quantified impact tied to a metric the buyer owns or their team is responsible for (their KPI, their accountability). A generic pain does not qualify, and a number the buyer does not own does not qualify.
  • CECritical Event is complete when there is a real, dated compelling event with a consequence (a deadline plus what happens if they miss it), identified and validated, not a manufactured one.

These two definitions are the exact binary the scorer detects and the bar the completion-lift goal metric is measured against. In the CBRE object, both fail: Impact scores 2 (a named pain with no cost number the buyer owns) and Critical Event scores 1.5 (a Q3 budget cue with no dated consequence). Neither is complete.

3 · Bowtie stage mapping

SPICED completion gates the stage transition.

The deal moves through the bowtie stages the Deal Pulse already tracks: Educate, Orchestrate, Define, and Trade or SOW. Each transition has a SPICED completion that must hold before the deal earns the next stage. A deal sitting in a stage without its gating element complete is a forecast risk and a coaching trigger on the same row.

Bowtie stageSPICED elements in playCompletion that gates the transition out
EducateSituation, PainSituation understood and buyer-articulated Pain captured in the buyer's own words. Front-half SPICED is the entry bar to Orchestrate.
OrchestrateImpact, EngagementImpact complete: a quantified consequence tied to a metric the buyer owns. Without it, the deal is warm but unqualified and should not advance to Define.
DefineCritical Event, Decision Criteria, Decision ProcessCritical Event complete: a dated event with a consequence, plus a mapped decision process reaching the economic buyer. This is the gate most deals fail silently.
Trade / SOWDecision Process, Decision CriteriaConfirmed approval path, criteria the buyer will judge on, and a mutual action plan. The deal is defensible in the forecast.
Where the CBRE deal actually sits

The object stages CBRE at Discovery inside Educate to Orchestrate. Situation (3.5) and Pain (3.8) clear the Educate gate, but Impact (2) is incomplete, so the deal has not truly earned Orchestrate to Define. Critical Event (1.5) and single-threaded Decision Process (2.2) mean the Define gate is nowhere close. The completion binaries make the stall structural and visible, not a matter of rep optimism.

4 · The agents

Decompose by pipeline stage, fan out by rep.

The weekly run is a batch dispatch of five stages. Stage 0 is deterministic TypeScript; stages 1 through 4 are Claude skills. The extract stage fans out one task per rep and runs full SPICED in a single pass, which is what kills the corpus-reload and quote-misattribution problems that broke prior attempts. Each agent below declares its inputs, outputs, entry condition, exit condition, and handoff.

Stage 0SpicedSegmentdeterministic TS, per call
Inputs
Grain (or Gong) call transcripts, HubSpot deals and owners, the call participant map.
Outputs
Speaker-resolved, SPICED-tagged segments with name and affiliation denormalized onto every utterance, joined to the deal id.
Entry condition
New or updated calls exist for a deal in the run window.
Exit condition
Every utterance carries a resolved speaker and an account and deal id. Misattribution is structurally impossible.
Handoff: the tagged-segment contract is the data everything reads. Passes per-rep segment bundles to CoachingCard.
Stage 1CoachingCardone task per rep
Inputs
One rep's SPICED-tagged segments across their accounts, plus the SPICED rubric, playbook, and top-performer calibration calls.
Outputs
The core object per account: full SPICED scores, impact_review, best_moment, headline_gap, top_gaps, and the four-part card content, all with provenance.
Entry condition
Tagged segments exist for the rep for the window.
Exit condition
Every score is paired with a verbatim customer_line, rep_actual, and ideal_response. No score without evidence.
Handoff: emits the canonical object. ManagerEnablement and Forecast both read it; nothing re-scores.
Stage 2ManagerEnablementone rollup per FLM
Inputs
All CoachingCard objects for the reps under one frontline manager, plus the REKS diagnostic and the Managing for Impact play database.
Outputs
Team gaps ranked in REKS, the matching play to run, the fixed reinforce-plus-improve pair per rep, and the one-on-one focus for the Tuesday 1:1.
Entry condition
All rep objects for the FLM's team are complete for the window.
Exit condition
Each rep has a deliverable card pair and the manager has one surfaced play in context.
Handoff: the manager rollup feeds the Monday review and Tuesday 1:1. The required manager verb is deliver one card per rep.
Stage 3Forecast / Deal Pulseportfolio rollup
Inputs
All CoachingCard objects joined to HubSpot deal amount, forecast category, close date, and last activity.
Outputs
Per-deal SPICED completion dots next to amount, weighted value, confidence percent, and a risk flag driven by deal_risk plus single-threading and staleness rules.
Entry condition
Objects are complete and the deal join is resolved.
Exit condition
Every deal row shows SPICED quality next to dollars and probability, with the drill path back to the rep's gap and card.
Handoff: the ELT Deal Pulse view. A weak-SPICED big deal is a forecast risk and a coaching trigger on one screen.
Stage 4CorpusQueryon demand, role-scoped
Inputs
A free-text question, the asker's role and org scope, and the corpus of derived objects (never raw transcripts).
Outputs
A scoped answer drawn from the objects the asker is allowed to see, with the supporting quote and deep link.
Entry condition
A user asks a question through the role-scoped query box.
Exit condition
The answer never returns data outside the asker's subtree and never surfaces a raw transcript.
Handoff: answers the asker in place. May ship in the beta or fast-follow. Reads the same objects; adds no new data.
5 · The derived-only egress gate

One chokepoint. Derived insight crosses. Raw never does.

Between compute (Layer 2, where the data lives) and the app (Layer 3), a single one-way gate serializes derived artifacts to a versioned JSON schema and pushes them out over one allowlistable endpoint. Nothing inbound to the customer environment is opened. This is the most security-load-bearing artifact in the system; its schema is designed first. What crosses is bounded below.

Layer 1 · Data
Grain plus HubSpot
Transcripts and deals, speaker-resolved and SPICED-tagged. Raw recordings live here and are never serialized to the gate.
Raw stays here
Layer 2 · Compute
The Claude instance
Skills score SPICED and build the objects where the data lives. The publisher serializes derived output only.
Runs where data lives
Layer 3 · Interface
The app
Role-scoped views and the query box on Cloudflare. A guarded ingest Worker rejects any raw-smelling payload.
Derived-only crosses
// The versioned payload that crosses Layer 2 to Layer 3.
// The ingest Worker rejects anything that does not match this schema.
{
  "schema_version": "ws2.1",
  "generated_at": "<ISO 8601 timestamp>",
  "scope": { "account": "string", "rep": "string", "manager": "string" },

  // 1. Derived insight and scores (the object, minus raw)
  "spiced": { "situation": {"score": 1..5, "state": "string", "gap": bool}, /* + 6 dims */ },
  "completion": { "impact": bool, "critical_event": bool },
  "headline_gap": "string",
  "recommendation": { "one_on_one_focus": "string", "playbook_section": "string" },
  "deal_risk": { "at_risk": bool, "level": "string", "reason": "string" },

  // 2. Exactly ONE short attributed quote per coaching point
  //    bounded to a rolling 120-day window (lookback AND retention)
  "evidence_quote": {
    "customer_line": "string",        // short excerpt, derived-OK
    "call_date": "<must be within 120 days>",
    "deep_link": "<points back into Grain, recording stays there>"
  },

  // 3. Usage telemetry only
  "telemetry": { "event": "string", "timestamp": "string", "behavior_tag": "string", "actor": "anonymized" }

  // 4. NEVER crosses: raw transcripts, full recordings, utterance logs,
  //    any quote from a call older than 120 days.
}
The rule in one line

Derived insight and scores cross. Exactly one short attributed quote per coaching point crosses, bounded to a rolling 120-day window as both lookback and retention. Usage telemetry crosses. Raw transcripts and full recordings never cross; the deep link points back into the customer's own environment, where the recording stays.

Closing note

This is the spine. The workflow layer aligns next.

Draft, pending the bowtie workflow slides

This data model and agent handoff is a working draft built from the live analysis output and the locked pre-build decisions. The bowtie stage mapping in section 3 is the piece most likely to move: it should be reconciled with Dan's bowtie workflow slides once they are available, so the stage names, the gating completions, and the transition logic match the canonical WbD bowtie exactly. Everything else, the object schema, the two scores, the five-stage agent decomposition, and the derived-only egress gate, is stable and buildable as written.