# Weekly 1-on-1 Doc · Full Build Spec

**Purpose:** End-to-end reproducible spec for building the Weekly Review one-pager for Stephanie Ervin. Run this every week. Do not rebuild from scratch.

**Owner:** Jason De Leon (GTME, Apollo.io)
**Audience:** Stephanie Ervin (manager) and the operator (Clyde / Cowork session) building the doc
**First built:** 2026-04-20 for week of Apr 13-19 (1:1 on Tue Apr 21)
**Approved version:** `gtme-weekly-review-2026-04-19-onepager.docx` (in this folder)

---

## TL;DR Build Recipe

```
1. Pull data sources (Calendar, Notion CC, BoB v5.x, Slack ZC channels, SURFACE-SYNC)
2. Generate intervention chart PNG (matplotlib, Apollo colors)
3. Run python build script (python-docx)
4. QA via qlmanage thumbnail + em-dash scan
5. Open in Word for visual approval
6. Drop in Drive folder "Weekly 1-on-1 Docs" (ID 1BTy9ajRVe2uuHFEF1tBDDwf826ukZIUs)
7. Send to Stephanie
```

---

## Skills to Co-Load (mandatory)

| Skill | Purpose | Where it lives |
|-------|---------|----------------|
| `apollo-brand-master` | Color tokens, validated logo paths, typography, Context 2 (internal) rules | `~/Library/Application Support/Claude/.../skills/apollo-brand-master/` |
| `gtm--exec-briefing` | Framework: headline + metrics + decisions/asks + next steps + under 150 words top section | `.claude/skills/gtm--exec-briefing/` |
| `weekly-1on1-format` | This doc's frozen format spec | `.claude/skills/weekly-1on1-format/` (to create) |
| `extraction-accuracy-framework` | EXTRACTED vs INFERRED tagging on every claim | `.claude/rules/extraction-accuracy-framework.md` |
| `ground-truth-data-integrity` | No fabricated metrics or attendees | `.claude/rules/ground-truth-data-integrity.md` |
| `context-layer` | Pre-flight context bundle if any client work bleeds into the doc | `.claude/skills/context-layer/` |

## Agents (optional, for delegation)

| Agent | Use when |
|-------|---------|
| `executive-briefing-officer` | Need an SCQA-formatted leadership view built in parallel |
| `portfolio-intelligence-officer` | Need risk radar / weekly portfolio sweep numbers |
| `qa-gate` | Final pass before send |

---

## Data Sources (always pull these)

| Source | Tool | Query Pattern |
|--------|------|---------------|
| Google Calendar | `mcp__8650ee71-...__list_events` | `startTime: YYYY-MM-DD` (Mon), `endTime: YYYY-MM-DD` (Sun), `pageSize: 100` |
| Notion Call Context | `mcp__f34db16c-...__notion-query-meeting-notes` | filter `created_time` between Mon-Sun |
| Notion BoB | `mcp__f34db16c-...__notion-search` + `notion-fetch` | for any account context |
| BoB v5.x dataset | Read JSON | `Douglas/bob-dashboard/pipelines/bob-dashboard/out/05_itbd_scored_v51.json` |
| ZC Slack channels | `mcp__025826ac-...__slack_read_channel` | per-account channel ID (e.g., Solvo `C09894RKA3E`) |
| SURFACE-SYNC | Read MD | `Douglas/95-Memory/dynamic-state/SURFACE-SYNC.md` |
| Vince/Jason bi-weekly notes | Notion CC search | filter title `Vince / Jason- Bi-weekly Account Sync` |
| #csql-notifications | Slack channel | for formal CSQL submissions |
| Prior week 1:1 | Read DOCX in this folder | for resolved/unresolved items |

---

## Filesystem Paths (always)

| Path | Purpose |
|------|---------|
| `Douglas/deliverables/weekly-1on1/` | Local source-of-truth for DOCX builds |
| `Douglas/95-Memory/deliverables/DEL-SYSTEM-XXX_*.md` | 95-Memory pointer entry |
| `Douglas/95-Memory/deliverables/_index.md` | Index entry under "1on1 Prep" section |
| `Douglas/95-Memory/dynamic-state/SURFACE-SYNC.md` | SYNC entry on completion |
| `Douglas/system/templates/apollo-pdf-deliverable/apollo_logo_black_512.png` | Logo (Apollo brand-master Context 2) |
| `/tmp/build_1on1_onepager_v2.py` | Reusable build script (this exact name) |
| `/tmp/build_intervention_chart.py` | Reusable chart generator |
| `/tmp/intervention_breakdown.png` | Generated chart, embedded in doc |
| `/tmp/qa-1on1/` | QA preview directory |
| Drive folder ID `1BTy9ajRVe2uuHFEF1tBDDwf826ukZIUs` | Final approved DOCX destination |

---

## Build Steps (detailed)

### Step 1: Pull last week's data (5-10 min)

In parallel:
- Calendar events for the week (Mon-Sun)
- Notion CC records for the week
- BoB v5.x JSON for ARR
- Last 50 messages from any active ZC channel that surfaced critical asks (e.g., Solvo, Verkada, VideoAmp)
- SURFACE-SYNC entries from the week

### Step 2: Compute the 4 KPI stats

```
Client Calls:   filter Calendar to external-attendee meetings (exclude internal team, focus blocks, 1:1s)
CSQLs Submitted: count formal CSQL submissions only (NOT GTME intros)
ARR Touched:    sum financial.arr_total in BoB v5.x for matched account names
Intervention Touches: total = New CSQLs + New Engagements + First Sessions + Continued
```

### Step 3: Identify wins (always 2)

- **Win 1:** the week's highest-impact CSQL or revenue-affecting outcome
- **Win 2:** team-wide / cross-tool / system-level move (consolidation, distribution, pattern-standardization)

Anti-pattern: do not list intro calls as wins. Wins are revenue or systems.

### Step 4: Triangulate Decisions/Asks for Stephanie (3 max)

Pull from:
- Open ZC channel asks (anything Vince or AM tagged Stephanie on)
- Carry-forward items from last week's 1:1 that did not resolve
- Active escalations (VideoAmp, Verkada, Solvo, etc.)

Rank by urgency. Tag the most urgent with "ADDRESS TOMORROW" if applicable.

### Step 5: Build Next Week priorities (5 max)

Pull from:
- This week's calendar (next 5 business days)
- Pending CSQLs that need closing
- Open items that require Stephanie alignment

### Step 6: Generate the intervention chart

```bash
python3 /tmp/build_intervention_chart.py
```

Categories (always these 4, in this order):
1. Continued (Ocean 300 `#3A6783`)
2. New CSQLs (Sunbeam Core `#F8FF2C`)
3. New Engagements (Iris 300 `#9C73FF`)
4. First Sessions (Mist 300 `#FF8077`)

Output: `/tmp/intervention_breakdown.png`

### Step 7: Build the DOCX

```bash
python3 /tmp/build_1on1_onepager_v2.py
```

Reads:
- Intervention chart from `/tmp/intervention_breakdown.png`
- Apollo logo from `Douglas/system/templates/apollo-pdf-deliverable/apollo_logo_black_512.png`

Writes:
- `Douglas/deliverables/weekly-1on1/gtme-weekly-review-YYYY-MM-DD-onepager.docx`

### Step 8: QA loop

```bash
# Em dash scan (must return 0)
grep -c "—" /Users/jasondeleon/GTME/Douglas/deliverables/weekly-1on1/gtme-weekly-review-YYYY-MM-DD-onepager.docx

# Visual preview
qlmanage -t -s 1500 -o /tmp/qa-1on1 /Users/jasondeleon/GTME/Douglas/deliverables/weekly-1on1/gtme-weekly-review-YYYY-MM-DD-onepager.docx
open /tmp/qa-1on1/*.png
```

Verify:
- One page only
- Apollo logo top-left, black, 0.55"
- All 10 sections present
- Chart visible and correctly colored
- No content cut off
- Cross-Tool Evolution links underlined and clickable

### Step 9: Open in Word for final approval

```bash
open /Users/jasondeleon/GTME/Douglas/deliverables/weekly-1on1/gtme-weekly-review-YYYY-MM-DD-onepager.docx
```

### Step 10: Upload to Drive folder

Two paths:
- **Manual (recommended):** drag the DOCX into the Drive folder `1BTy9ajRVe2uuHFEF1tBDDwf826ukZIUs` ("Weekly 1-on-1 Docs"). Takes 5 seconds.
- **MCP automation:** call `mcp__dbc11cac-...__create_file` with `parentId=1BTy9ajRVe2uuHFEF1tBDDwf826ukZIUs`, `mimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document`, base64-encoded content. Note: 100KB+ DOCX requires chunked context handling.

### Step 11: Dual-write to 95-Memory

Create:
- `Douglas/95-Memory/deliverables/DEL-SYSTEM-XXX_stephanie-1on1-YYYY-MM-DD.md` (pointer entry)
- Append entry to `Douglas/95-Memory/deliverables/_index.md` under "1on1 Prep"
- Append SYNC entry to `Douglas/95-Memory/dynamic-state/SURFACE-SYNC.md`

---

## The 10-Section Layout (frozen)

| # | Section | Source code marker in build script |
|---|---------|-----------------------------------|
| 1 | Header (logo + title + meta) | `# HEADER (Apollo logo + title block in 2-column table)` |
| 2 | Yellow rule | `add_yellow_rule()` |
| 3 | KPI stats (4 cards) | `# STATS (4 KPIs)` |
| 4 | Week Headline | `# WEEK HEADLINE` |
| 5 | Wins (2 callouts) | `# WINS (2 callouts)` |
| 6 | Intervention chart | `# INTERVENTIONS BREAKDOWN GRAPHIC` |
| 7 | Cross-Tool Evolution callout | `# CROSS-TOOL EVOLUTION (NEW)` |
| 8 | Decisions / Asks for Stephanie | `# DECISIONS / ASKS FOR STEPHANIE` |
| 9 | Next Week Top Priorities | `# NEXT WEEK TOP PRIORITIES` |
| 10 | Footer | `# FOOTER` |

---

## Apollo Brand Master Tokens (Context 2: Internal/Light)

| Token | Hex | Where used |
|-------|-----|-----------|
| Function Black | `#1A1A1A` | All headers, body text, table headers |
| Sunbeam Core | `#F8FF2C` | Yellow rules, callout left borders, KPI underlines, chart "New CSQLs" bar |
| Sunbeam Light | `#FEFFD9` | Cross-Tool Evolution callout background |
| Sand 100 | `#F3F0EE` | KPI cards background, Wins callouts background |
| Sand 700 | `#47423D` | Subhead text, chart legend secondary text |
| Iris 300 | `#9C73FF` | Hyperlinks (underlined), chart "New Engagements" bar |
| Mist 300 | `#FF8077` | Chart "First Sessions" bar |
| Ocean 300 | `#3A6783` | Chart "Continued" bar |

**Logo:** always `apollo_logo_black_512.png` (validated, viewBox 0 0 303 303). Black on light bg per Context 2 rule.

**Typography:** `Helvetica Neue` (hero) + `Helvetica` (body). DOCX-safe substitutes for Founders Grotesk + ABC Diatype.

---

## Standing Cross-Tool Evolution Block (lock these in)

These 4 always appear. URL changes only when Jason confirms an update.

| # | Asset | URL |
|---|-------|-----|
| 1 | Resource Library | https://jason-dashboards.pages.dev/ |
| 2 | AI OS Architecture Map | https://jason-dashboards.pages.dev/ai-os-architecture-map |
| 3 | GTME Codex + Cowork Playbook | https://jason-dashboards.pages.dev/gtme-codex-cowork-playbook |
| 4 | Shared Memory System (Notion) | _URL pending - lock once Jason confirms_ |

---

## Voice and Content Rules

- **Zero em dashes.** P0. Scan with `grep -c "—" file` before save. Must return 0.
- **No banned words:** seamless, robust, synergy, unlock, leverage. JDL voice only.
- **Crisp.** One sentence per ask body when possible. Cut every redundant clause.
- **Stephanie cares about:** decisions she needs to make, accounts at risk, expansion in motion, team-wide patterns. NOT granular call-by-call lists.
- **Volume context** when relevant. If client volume was unusually high or low, say so in the meta line.
- **CSQLs:** only count formal CSQL submissions. New GTME engagement intros are NOT CSQLs.

---

## Pre-Flight Checklist

- [ ] Logo loaded from validated source (never improvised)
- [ ] All 4 brand-color callout sections render correctly
- [ ] Intervention chart generated with current week's category counts
- [ ] CSQL count matches what was actually submitted (not GTME intros)
- [ ] Critical open asks (Solvo, Verkada, VideoAmp, etc.) pulled into Asks if active
- [ ] Cross-Tool Evolution links current and clickable
- [ ] Zero em dashes
- [ ] Footer present
- [ ] One page (verify with qlmanage thumbnail)
- [ ] Approved DOCX in this Drive folder

---

## File Inventory in This Folder

| File | Purpose |
|------|---------|
| `gtme-weekly-review-YYYY-MM-DD-onepager.docx` | The weekly approved doc (rolling, one per week) |
| `Weekly 1-on-1 Production Rules` (Google Doc) | Frozen rule set for the doc format |
| `Weekly 1-on-1 Build Spec` (this Google Doc) | End-to-end build instructions |

Future-add candidates:
- Quarterly summary roll-up
- YTD CSQL tracker

---

## Anti-Patterns (do not do these)

- Listing every account that had a call (Stephanie does not need the granular roster)
- Labeling GTME intro calls as CSQLs (intros are not CSQLs)
- Multi-page output (one page only)
- Yellow logo on white background
- Em dashes (forbidden P0)
- Adding new sections beyond the 10 above without explicit approval
- Rebuilding the python script from scratch each week (use `/tmp/build_1on1_onepager_v2.py` and update content variables)
- Pulling stats from one source without cross-validation (Calendar + Notion CC must agree on count)
- Skipping the qlmanage QA step before opening in Word

---

## Reusable Python Variables (update each week)

The build script (`/tmp/build_1on1_onepager_v2.py`) has these variables to update:

```python
# Header
WEEK_RANGE = "April 13-19, 2026"
META_LINE = "1-1 with Stephanie | 24 client calls (volume spike week) | 2 CSQLs | Verkada scope still open"

# Stats (4 KPIs)
nums = ["24", "2", "$640K", "20"]
labels = ["Client Calls", "CSQLs Submitted", "ARR Touched", "Intervention Touches"]

# Week headline (5-7 sentences)
HEADLINE_TEXT = "..."

# Wins (always 2)
wins = [(title, body), (title, body)]

# Intervention chart categories (always 4)
categories = [
    ("Continued", N, OCEAN_300),
    ("New CSQLs", N, SUNBEAM_CORE),
    ("New Engagements", N, IRIS_300),
    ("First Sessions", N, MIST_300),
]

# Asks (max 3)
asks = [(title, body), ...]

# Next Week priorities (max 5)
priorities = [(account, action), ...]

# Output filename
output_path = ".../gtme-weekly-review-YYYY-MM-DD-onepager.docx"
```

That's it. Update the variables, rerun the script, QA, send.

---

*Apollo.io GTME · Jason De Leon · Confidential · 2026-04-20*
