Strategy Memo Skill
Produces Amazon 6-pager-style strategy memos as Quarto documents that render to publication-quality PDF (+ HTML). The canonical reference is pre-read.qmd in the intelligence-strategy-sessions project — everything in this skill is distilled from that document.
Workflow
Step 1: Interview the user
Before generating anything, ask these questions (all at once, numbered):
- Company & domain — What company/team is this for? What domain (product strategy, platform investment, org change, technical direction)?
- Audience — Who reads this? (e.g., Engineering + Product Directors, Board, VP-level)
- Leadership framework — How should intent be framed? (Intent-Based Leadership = "I intend to…"; OKR-driven; DACI; or neutral)
- Strategic thesis — In one sentence: what is the central argument or direction you are asserting?
- Key questions — What are the 3–5 strategic choices the document must help the audience decide or validate?
- Data sources — BigQuery project + key table names? Or will data be provided manually / hardcoded?
- Target length — 6 pages is the Amazon canon. More than 8 pages is too long regardless of figures.
- Tone — Urgent inflection point? Confident direction-setting? Diagnostic + open questions?
Step 2: Generate the scaffold
Once you have answers, generate a new .qmd file by adapting assets/template.qmd:
- Replace all
{{PLACEHOLDER}}tokens with content derived from the interview - For each key question, create a
## Part N: ...section with prose and a figure cell stub - For each data source, create a cache block in the key-numbers cell (cache-read-or-query pattern)
- Set
\fancyheadvalues (company name, document title, author) - Populate the intent declarations from the thesis and questions
- Leave figure cells as stubs with
# TODO: implement visualizationcomments
Step 3: Set up the project
Copy the supporting assets into the project root:
cp assets/Justfile ./Justfile
cp assets/scripts/preview-fig.py ./scripts/preview-fig.py
cp assets/scripts/validate-cache.py ./scripts/validate-cache.py
mkdir -p data/cache scripts
Add to .gitignore:
data/cache/
.drive-file-id
.jupyter_cache/
For Google Drive sync, create .drive-file-id containing the Drive file ID of the target PDF.
Step 4: Build loop
just render # Full render: PDF + HTML + check + sync to Drive
just preview # HTML only, opens in browser (fast)
just preview-fig fig1 # Screenshot a single figure (~15s, no full render)
just check # Scan PDF for unrendered Python literals
just delete-cache # Wipe data/cache/ — forces live BigQuery re-query
just validate # Compare cache to live BigQuery (fails if drift > 5%)
Core Authoring Rules
See references/6pager-spec.md for document structure and writing style.
See references/visualization-standards.md for figure patterns, color palette, and anti-patterns.
No hardcoded numbers in prose (strict)
Every factual number must flow from a Python variable:
Analysis of `{python} f"{total_deals:,}"` lost opportunities...
Never: Analysis of 847 lost opportunities...
Numbers that CAN be hardcoded: stylistic/non-factual values ("25 minutes of silent reading").
Cache-read-or-query pattern (mandatory for BigQuery)
_c = _read_cache('my_dataset')
if _c:
df = pd.DataFrame(_c['records'])
my_scalar = float(_c['scalars']['my_scalar'])
else:
df = run_bq_query(my_query)
my_scalar = float(df['col'].values[0])
_write_cache('my_dataset', df.to_dict(orient='records'), {
'my_scalar': my_scalar,
})
Never: except Exception: my_scalar = 42 — silent fallback masks broken queries.
Figure captions: insight, not description
#| fig-cap: "Lost deal flow (2024+). The dominant flow: customers who evaluated and stayed put."
Not: #| fig-cap: "Sankey diagram of deal flow by loss reason."
LaTeX in PDF output
\begin{quote}
\small\itshape
"Customer quote here."
\upshape---Attribution, Date
\end{quote}
Escape dollars: \$110M. Em-dashes: --- (renders as —). Page breaks: \newpage.
Figure captions cannot use {python} expressions
Quarto limitation. Add a sync comment adjacent to any hardcoded caption value:
# CAPTION-SYNC: ratio={ratio:.0f} — update caption if ratio changes
#| fig-cap: "...approximately 4×..."
Document Structure
The proven 4-part structure from pre-read.qmd:
- Introduction — Intent declarations (3 statements of "I intend to…") + "How These Sessions Work"
- Part 1: The Situation — Diagnosis, primary visualization, customer/evidence quote
- Part 2: Why This Intent — Strategic rationale, data moat, revenue/product evidence
- Part 3: What This Requires — Technical, organizational, and execution dependencies
- Part 4: Questions to Refine Intent — Exactly 3–5 strategic choices, not action items
Never add: self-blame tone, tactical product details, "Risks and Mitigations" framing, top-down action items, more than 5 strategic choices, appendices, bullet points in narrative prose.
Pre-flight Audit Checklist
Before just publish, scan for:
- [ ]
int(N)literals inside{python}inline expressions (literal masquerading as variable) - [ ] Numbers assigned in
if _c:blocks without a precedingrun_bq_query()call - [ ] Dollar amounts in LaTeX attribution blocks with no Python variable reference
- [ ] Percentages written as words ("Seventy-three percent") with no
{python}backing - [ ] Figure captions containing bare
%characters (LaTeX compile failure) - [ ]
text labels beyond xlimin matplotlib (causes comically small PDF figures) - [ ] Missing
plt.close('all')after each figure cell