From deal-research
Triggers when converting a competitive landscape, market mapping, or M&A target spreadsheet into a board-ready executive deliverable. Preserves the raw research sheet and adds a second sheet that compresses each cell while preserving the full rating + key evidence — fidelity over brevity. Verdict-led layout, Pattern brand styling, and consulting-grade formatting. Mines the rating-and-rationale source format produced by the Pattern competitive landscape pipeline.
How this skill is triggered — by the user, by Claude, or both
Slash command
/deal-research:competitive-landscape-deliverableThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Transform a detailed competitive landscape workbook into a board/executive-ready deliverable while preserving the raw research. Add or replace a second sheet (`Executive Deliverable`) that:
Transform a detailed competitive landscape workbook into a board/executive-ready deliverable while preserving the raw research. Add or replace a second sheet (Executive Deliverable) that:
Default workflow:
Source workbook (.xlsx or Google Sheets URL)
→ scripts/pull_from_sheets.py (if URL)
→ scripts/build_deliverable.py
→ Same workbook with new "Executive Deliverable" sheet added
Trigger this skill when the user asks to:
The Pattern competitive landscape template produced by the n8n orchestrator (L8mR6NM9u6VoVdrJ) has:
Competitive LandscapeCompetitive Landscape Mapping1. Entity identity, 2. Market taxonomy, etc.)Company Name, Legal Entity Name, ...)"Rating value — McKinsey-style rationale" (em-dash separator)See references/template-fields.md for the complete field map.
Robust detection rule: never hardcode rows. Scan column B for known field names (e.g., Company Name, Total Moat Score) and anchor relative positions from there. The engine script does this automatically.
The mechanical work — read source, build sheet, apply formatting — happens in scripts/build_deliverable.py. Do not generate XLSX/XML by hand. Invocation:
py scripts/build_deliverable.py \
--source "<path-to-source.xlsx>" \
--output "<path-or-blank-for-in-place>" \
[--sort-by priority|fit|moat|source]
The script:
(rating, rationale) by splitting on em-dashExecutive Deliverable sheet with verdict block + 8 grouped sections--output)If the synthesis logic needs new mappings or richer phrasing, edit build_deliverable.py rather than re-implementing the logic per invocation.
For a Google Sheets URL, run:
py scripts/pull_from_sheets.py --url <sheets-url> --out <local.xlsx>
This uses the Google Sheets v4 API (set GOOGLE_SHEETS_TOKEN env var to an OAuth access token, or it falls back to gcloud-application-default-credentials). Output is a local .xlsx snapshot ready for build_deliverable.py.
The Pattern Competitive Landscape sheet ID is 159cKsL9YEWmIoo0BTt6NelobAmAm6qan-VyOagUJuJ4.
Competitive Landscape — Executive View (24pt, white, on #0F4761 band)Concise strategic readout from detailed research (10pt, #4280F4)| Row | Label (col B) | Cell content |
|---|---|---|
| 3 | Verdict | ACQUIRE / MONITOR / PASS — green/amber/grey conditional fill |
| 4 | Recommended posture | 7–10-word phrase from posture vocabulary |
| 5 | Score triplet | moat / fit / ma (e.g., 16 / 8.2 / 6.8) |
| 6 | Acquisition thesis | 10–14-word one-liner |
Freeze panes at C7 (below verdict block, after both label columns).
Eight sections, each preceded by a styled section header row:
Total ~108 rows + 6-row header = ~114-row deliverable.
See references/output-row-spec.md for the exact label list and source-field mapping.
The deliverable must be as concise as possible without losing or transforming meaning. Compression is achieved by removing filler and transitional language, NOT by truncating substantive content.
Source cells follow "Rating — McKinsey rationale". Both halves carry meaning:
Yes, Tier B, Strong, Critical, 4). Never drop it.| Source pattern | Output format | Example |
|---|---|---|
| Both rating and rationale | Rating — compressed rationale | Yes — embedded across OMS, helpdesk, customer notifications |
| Rating only (no rationale) | Rating (verbatim) | Tier B |
| Numeric score + rationale | N — qualifier | 4 — captures returns data across 1,200+ carriers |
| Rationale only (no rating) | Compressed rationale | Recently acquired by Blue Yonder August 2025 |
| List values (Notable Customers, etc.) | First 5 items + (+N more) | Sephora, Levi's, Patagonia, Adidas, Lululemon (+12 more) |
| Empty source | — (em-dash) | — |
Apply in this order:
<cite index="..."> tags from agent output)for example, notably, in particular, as evidenced by, the company, which is, etc.)leading, robust, innovative, comprehensive, cutting-edge, best-in-class) UNLESS the rating itself contains it (then preserve)These are fidelity ceilings, not aspirational caps. Going under doesn't earn points if it sacrifices meaning.
✅ Good (rating preserved, evidence compressed):
Source: "Partial — owns return and exchange records but synchronizes core order data from Shopify or OMS upstream"
Output: "Partial — owns return/exchange records, syncs orders from Shopify or OMS"
✅ Good (rating + rich rationale):
Source: "Strong — implementation complexity creates ~12-month migration cost; deeply embedded in helpdesk, OMS, and customer notification workflows"
Output: "Strong — embedded in helpdesk, OMS, customer notifications; ~12mo migration"
❌ Bad (drops the rating, loses verdict):
Source: "Yes — embedded across OMS, helpdesk, and customer notification workflows"
Output: "embedded across OMS, helpdesk, and notifications" # missing "Yes"
❌ Bad (truncates mid-clause, loses meaning):
Source: "Tier B — captures order, return, and shipment data but excludes payment card data and PII routed to Stripe"
Output: "captures order, return, and shipment data but excludes" # mid-clause cut
❌ Bad (over-compresses to the point of distortion):
Source: "Pass — Blue Yonder's August 2025 acquisition eliminates buy option while returns management represents non-core capability"
Output: "Off the table" # loses the WHY
For fields where the source is already a list or descriptive text rather than a rated assessment, use lighter cleanup:
(+N more) if more$208M Series D)The engine script handles this via is_passthrough_field() and trim_list().
—Unknown or Unclear → keep verbatim, don't substituteLikely, Reported, Validate, preserve that qualifier — it's the epistemic signal the executive needsThe 100+ output rows are derived from raw fields per the mapping in references/output-row-spec.md. Defaults:
The full mapping lives in the reference file and is implemented in build_deliverable.py:SYNTHESIS_MAP.
By default: re-sort companies by deal priority:
CLI flags:
--sort-by priority (default)--sort-by fit — descending strategic fit score--sort-by moat — descending total moat score--sort-by source — preserve raw sheet orderWhen generating the row 4 "Recommended posture" cell:
| Pattern in source | Posture phrase |
|---|---|
| High fit + high priority + low complexity | Pursue active diligence this quarter |
| High fit + high complexity | Partner first, revisit acquisition next year |
| High moat + low Pattern fit | Useful benchmark, weak Pattern fit |
| Recently acquired | Off-market, monitor competitive impact |
| Low confidence | Validate thesis before leadership outreach |
| Strong moat + early stage | Track for inflection, no near-term action |
All formatting uses the Pattern visual system (matches Word doc standard):
| Element | Font | Size | Color | Fill |
|---|---|---|---|---|
| Title row 1 | Wix Madefor Display SemiBold | 24pt | #FFFFFF | #0F4761 |
| Subtitle row 2 | Wix Madefor Display | 10pt | #4280F4 | none |
| Verdict ACQUIRE | Wix Madefor Display SemiBold | 11pt | #1A5C1A | #E2EFDA |
| Verdict MONITOR | Wix Madefor Display SemiBold | 11pt | #7A5C00 | #FFF3CD |
| Verdict PASS | Wix Madefor Display SemiBold | 11pt | #8B1A1A | #FFE0E0 |
| Section header | Wix Madefor Display SemiBold | 11pt | #0F4761 | #F5F8FF |
| Field label (col B) | Wix Madefor Display | 9pt | #000000 | none |
| Body cell | Wix Madefor Display | 9pt | #000000 | alt rows #F5F8FF |
| Borders | thin | — | #DDDDDD | — |
Cell formatting:
Before returning the workbook, the engine script asserts:
Competitive Landscape (or detected source) exists and is byte-identical to inputExecutive Deliverable sheet exists with ≥80 rows and N+2 columns (where N = company count)ACQUIRE, MONITOR, PASS, or —.xlsx (not .xlsm or .xltx)If any check fails, the script raises and prints the specific failure.
competitive-landscape-deliverable/
├── SKILL.md (this file)
├── references/
│ ├── template-fields.md (full Pattern field map)
│ └── output-row-spec.md (executive deliverable row spec)
├── scripts/
│ ├── build_deliverable.py (engine — openpyxl)
│ └── pull_from_sheets.py (Google Sheets ingestion)
└── assets/
└── (sample output.xlsx if available)
npx claudepluginhub ian-lawrence423/claude-skills --plugin deal-researchGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.