# PDF PRD → executive artifacts pattern

Captured from a session where the user uploaded `GetBlock_Inference_PRD_v2.pdf` and then asked for three outputs: CEO/board memo, 45–60 day execution plan with Linear-ready tickets, and a financial/sensitivity template.

This is a reusable pattern, not a record of the project state.

## Good output package

Create a small artifact directory with:

1. `01_investment_memo.md`
   - decision requested
   - recommendation
   - strategic rationale
   - what must be true to continue
   - gates/checkpoints
   - economic frame
   - risk table
   - kill criteria
   - approve / do-not-approve-yet scope

2. `02_execution_plan_linear_tickets.md`
   - phase overview table
   - operating cadence
   - initiatives
   - tickets with ID, priority, owner, phase, estimate, description, acceptance criteria, dependencies
   - decision checkpoints
   - kill/continue checklists

3. `03_financial_model_sensitivity_template.xlsx`
   Suggested workbook tabs:
   - `Inputs` — prices, GPU cost, utilization, reserve, fixed opex, benchmark coefficients
   - `VolumeMix` — scenario volumes and mix
   - `PL` — revenue, COGS, contribution profit, contribution/GPU-hour, full-loaded operating profit
   - `Sensitivity` — stress/base/upside grid and downside price tests
   - `DashboardMetrics` — live metrics required to operate the experiment

Optional:
- `03_sensitivity_grid.csv`
- `03_financial_model_notes.md`
- one ZIP bundling the artifacts

## Extraction and verification

- Extract the PDF text first and save it to `.extracted.txt`.
- Record page count and approximate character count.
- Use the source’s own decision language when available: gates, budget caps, non-goals, KPIs, kill criteria.
- If spreadsheet libraries are unavailable, a minimal XLSX can be generated with Python stdlib `zipfile` and OOXML worksheet XML.
- Validate generated XLSX with `zipfile.testzip()`.
- If the `zip` binary is unavailable, use Python stdlib `zipfile` to package the outputs.

## Economic modeling lesson

When a PRD explicitly rejects a blended metric, reflect that in the model. In the GetBlock inference case, the model needed:

- token-type revenue: uncached input, cached input, output/reasoning
- measured GPU-seconds by token type
- sustainable utilization, not peak utilization
- provisioned GPU-hour economics
- primary KPI: contribution profit per provisioned GPU-hour
- full-loaded operating profit after engineering/SRE/Product/tooling
- sensitivity around price compression, GPU $/hour, utilization, model traffic, and routed share

## Pitfalls

- Do not use a stale historical break-even/share figure as the decision threshold if the document reframes the KPI.
- Do not collapse multi-deliverable requests into a single summary.
- Do not claim the XLSX or ZIP is valid unless actually checked.
- Do not treat missing optional packaging/spreadsheet utilities as blockers; provide Markdown/CSV fallback or stdlib-generated XLSX/ZIP.
