@vextlabs/theron-cli 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/dist/api.d.ts +8 -0
  2. package/dist/api.js +3 -0
  3. package/dist/api.js.map +1 -1
  4. package/dist/auth.js +51 -1
  5. package/dist/auth.js.map +1 -1
  6. package/dist/banner.js +3 -2
  7. package/dist/banner.js.map +1 -1
  8. package/dist/checkpoints.d.ts +32 -0
  9. package/dist/checkpoints.js +61 -0
  10. package/dist/checkpoints.js.map +1 -0
  11. package/dist/index.js +61 -5
  12. package/dist/index.js.map +1 -1
  13. package/dist/input.d.ts +61 -0
  14. package/dist/input.js +574 -0
  15. package/dist/input.js.map +1 -0
  16. package/dist/profiles/index.js +5 -0
  17. package/dist/profiles/index.js.map +1 -1
  18. package/dist/profiles/methodologies/build_domains.d.ts +6 -0
  19. package/dist/profiles/methodologies/build_domains.js +170 -0
  20. package/dist/profiles/methodologies/build_domains.js.map +1 -0
  21. package/dist/profiles/methodologies/operate_domains.d.ts +8 -0
  22. package/dist/profiles/methodologies/operate_domains.js +1239 -0
  23. package/dist/profiles/methodologies/operate_domains.js.map +1 -0
  24. package/dist/profiles/methodologies/regulated_domains.d.ts +6 -0
  25. package/dist/profiles/methodologies/regulated_domains.js +153 -0
  26. package/dist/profiles/methodologies/regulated_domains.js.map +1 -0
  27. package/dist/profiles/methodologies/research_domains.d.ts +8 -0
  28. package/dist/profiles/methodologies/research_domains.js +179 -0
  29. package/dist/profiles/methodologies/research_domains.js.map +1 -0
  30. package/dist/profiles/methodologies/strategy_domains.d.ts +15 -0
  31. package/dist/profiles/methodologies/strategy_domains.js +193 -0
  32. package/dist/profiles/methodologies/strategy_domains.js.map +1 -0
  33. package/dist/profiles/seeds.js +241 -95
  34. package/dist/profiles/seeds.js.map +1 -1
  35. package/dist/receipt.d.ts +17 -0
  36. package/dist/receipt.js +46 -0
  37. package/dist/receipt.js.map +1 -0
  38. package/dist/render.d.ts +4 -1
  39. package/dist/render.js +95 -28
  40. package/dist/render.js.map +1 -1
  41. package/dist/repl.d.ts +8 -1
  42. package/dist/repl.js +420 -62
  43. package/dist/repl.js.map +1 -1
  44. package/dist/sessions.d.ts +14 -0
  45. package/dist/sessions.js +100 -0
  46. package/dist/sessions.js.map +1 -1
  47. package/dist/ship.d.ts +2 -0
  48. package/dist/ship.js +62 -0
  49. package/dist/ship.js.map +1 -0
  50. package/dist/skills/catalog.d.ts +13 -0
  51. package/dist/skills/catalog.js +86 -0
  52. package/dist/skills/catalog.js.map +1 -0
  53. package/dist/tools/bash.js +81 -14
  54. package/dist/tools/bash.js.map +1 -1
  55. package/dist/tools/edit.js +21 -1
  56. package/dist/tools/edit.js.map +1 -1
  57. package/dist/tools/glob.js +4 -1
  58. package/dist/tools/glob.js.map +1 -1
  59. package/dist/tools/grep.d.ts +5 -0
  60. package/dist/tools/grep.js +101 -2
  61. package/dist/tools/grep.js.map +1 -1
  62. package/dist/tools/index.d.ts +22 -0
  63. package/dist/tools/index.js +177 -41
  64. package/dist/tools/index.js.map +1 -1
  65. package/dist/tools/ls.d.ts +3 -0
  66. package/dist/tools/ls.js +23 -12
  67. package/dist/tools/ls.js.map +1 -1
  68. package/dist/tools/multiedit.d.ts +12 -0
  69. package/dist/tools/multiedit.js +79 -0
  70. package/dist/tools/multiedit.js.map +1 -0
  71. package/dist/tools/stoa.d.ts +1 -1
  72. package/dist/tools/stoa.js +7 -3
  73. package/dist/tools/stoa.js.map +1 -1
  74. package/dist/tools/task.d.ts +9 -0
  75. package/dist/tools/task.js +166 -0
  76. package/dist/tools/task.js.map +1 -0
  77. package/dist/tools/todowrite.d.ts +12 -0
  78. package/dist/tools/todowrite.js +38 -0
  79. package/dist/tools/todowrite.js.map +1 -0
  80. package/dist/tools/webfetch.d.ts +6 -0
  81. package/dist/tools/webfetch.js +98 -0
  82. package/dist/tools/webfetch.js.map +1 -0
  83. package/dist/tools/websearch.d.ts +7 -0
  84. package/dist/tools/websearch.js +83 -0
  85. package/dist/tools/websearch.js.map +1 -0
  86. package/dist/tools/write.js +17 -1
  87. package/dist/tools/write.js.map +1 -1
  88. package/dist/verifiers/calc_gate.d.ts +2 -0
  89. package/dist/verifiers/calc_gate.js +112 -0
  90. package/dist/verifiers/calc_gate.js.map +1 -0
  91. package/dist/verifiers/citation_gate.d.ts +2 -0
  92. package/dist/verifiers/citation_gate.js +130 -0
  93. package/dist/verifiers/citation_gate.js.map +1 -0
  94. package/dist/verifiers/confidence_marked.d.ts +2 -0
  95. package/dist/verifiers/confidence_marked.js +49 -0
  96. package/dist/verifiers/confidence_marked.js.map +1 -0
  97. package/dist/verifiers/disclaimer_gate.d.ts +2 -0
  98. package/dist/verifiers/disclaimer_gate.js +57 -0
  99. package/dist/verifiers/disclaimer_gate.js.map +1 -0
  100. package/dist/verifiers/evidence_gate.d.ts +2 -0
  101. package/dist/verifiers/evidence_gate.js +108 -0
  102. package/dist/verifiers/evidence_gate.js.map +1 -0
  103. package/dist/verifiers/index.d.ts +5 -0
  104. package/dist/verifiers/index.js +28 -7
  105. package/dist/verifiers/index.js.map +1 -1
  106. package/dist/verifiers/lint.js +4 -3
  107. package/dist/verifiers/lint.js.map +1 -1
  108. package/dist/verifiers/promoted_kernels.d.ts +8 -0
  109. package/dist/verifiers/promoted_kernels.js +190 -0
  110. package/dist/verifiers/promoted_kernels.js.map +1 -0
  111. package/dist/verifiers/source_gate.d.ts +2 -0
  112. package/dist/verifiers/source_gate.js +125 -0
  113. package/dist/verifiers/source_gate.js.map +1 -0
  114. package/dist/verifiers/test_smoke.js +30 -0
  115. package/dist/verifiers/test_smoke.js.map +1 -1
  116. package/dist/verifiers/types.d.ts +3 -0
  117. package/package.json +4 -2
  118. package/skills/README.md +123 -0
  119. package/skills/ab-test.md +89 -0
  120. package/skills/api-design.md +175 -0
  121. package/skills/architecture-design.md +185 -0
  122. package/skills/business-case.md +77 -0
  123. package/skills/causal-inference.md +77 -0
  124. package/skills/clinical-guideline.md +98 -0
  125. package/skills/code-review.md +98 -0
  126. package/skills/cold-outreach.md +268 -0
  127. package/skills/competitive-teardown.md +223 -0
  128. package/skills/component-spec.md +121 -0
  129. package/skills/content-calendar.md +280 -0
  130. package/skills/contract-review.md +155 -0
  131. package/skills/data-analysis.md +187 -0
  132. package/skills/debug.md +91 -0
  133. package/skills/design-audit.md +121 -0
  134. package/skills/differential-diagnosis.md +79 -0
  135. package/skills/discovery-call.md +206 -0
  136. package/skills/edit-pass.md +80 -0
  137. package/skills/engineering-calc.md +101 -0
  138. package/skills/estimate.md +70 -0
  139. package/skills/experiment-design.md +105 -0
  140. package/skills/fact-check.md +82 -0
  141. package/skills/financial-model.md +104 -0
  142. package/skills/grant-proposal.md +93 -0
  143. package/skills/harmony-analysis.md +93 -0
  144. package/skills/hypothesis-generation.md +99 -0
  145. package/skills/incident-response.md +134 -0
  146. package/skills/interview-loop.md +62 -0
  147. package/skills/job-scorecard.md +92 -0
  148. package/skills/kb-article.md +174 -0
  149. package/skills/launch-plan.md +85 -0
  150. package/skills/lease-review.md +93 -0
  151. package/skills/lesson-plan.md +198 -0
  152. package/skills/literature-review.md +69 -0
  153. package/skills/market-entry.md +137 -0
  154. package/skills/market-sizing.md +159 -0
  155. package/skills/meta-analysis.md +140 -0
  156. package/skills/migrate.md +117 -0
  157. package/skills/optimize.md +88 -0
  158. package/skills/options-strategy.md +166 -0
  159. package/skills/peer-review.md +96 -0
  160. package/skills/pentest-plan.md +193 -0
  161. package/skills/pitch-review.md +132 -0
  162. package/skills/plan.md +88 -0
  163. package/skills/policy-brief.md +124 -0
  164. package/skills/positioning.md +192 -0
  165. package/skills/postmortem.md +168 -0
  166. package/skills/prd.md +105 -0
  167. package/skills/prioritize.md +162 -0
  168. package/skills/proof.md +91 -0
  169. package/skills/property-underwrite.md +159 -0
  170. package/skills/recipe-develop.md +109 -0
  171. package/skills/red-team.md +142 -0
  172. package/skills/refactor.md +58 -0
  173. package/skills/reflection-session.md +115 -0
  174. package/skills/regulatory-compliance.md +136 -0
  175. package/skills/reproduce.md +87 -0
  176. package/skills/runbook.md +344 -0
  177. package/skills/security-audit.md +154 -0
  178. package/skills/seo-brief.md +201 -0
  179. package/skills/sql-query.md +161 -0
  180. package/skills/story-craft.md +163 -0
  181. package/skills/tdd.md +59 -0
  182. package/skills/term-sheet.md +298 -0
  183. package/skills/theory-of-change.md +88 -0
  184. package/skills/threat-model.md +104 -0
  185. package/skills/ticket-triage.md +200 -0
  186. package/skills/tolerance-analysis.md +149 -0
  187. package/skills/training-program.md +151 -0
  188. package/skills/translate.md +64 -0
  189. package/skills/unit-economics.md +238 -0
  190. package/skills/valuation.md +112 -0
  191. package/skills/write-tests.md +77 -0
@@ -0,0 +1,223 @@
1
+ ---
2
+ name: competitive-teardown
3
+ description: Tear down a named AI/SaaS competitor end-to-end — positioning, ICP, pricing/packaging, product strengths and gaps, GTM motion, moat, and the specific wedges where we win or lose — grounded in public evidence; outputs a ranked battlecard and a single recommended attack vector.
4
+ allowed-tools: Read, WebSearch, WebFetch, Write
5
+ ---
6
+
7
+ KEY PRINCIPLE: A competitive teardown is only as valuable as its honesty about where we lose — a battlecard that only lists wins trains your team to walk into ambushes. Every "WHERE WE WIN" entry must have a matching "WHERE WE LOSE / NOT YET" entry; asymmetry is a planning landmine, not a confidence signal.
8
+
9
+ ═══ HARD RULES ═══
10
+
11
+ 1. NEVER assert a positioning claim about the competitor without citing the specific page, ad copy, job post, or earnings call it came from — label every claim with its source type (website, LinkedIn, G2 review, SEC filing, podcast, etc.).
12
+ 2. NEVER state a competitor's revenue, valuation, ARR, or headcount as fact unless the number comes from a public filing, verified press release, or named credible source — label all estimates "est." with the inference method (e.g., "est. $8M ARR — inferred from 40-seat ACV × disclosed logo count").
13
+ 3. NEVER conflate "they market X" with "they ship X" — product claims must be verified against changelog entries, API docs, or independent user reviews, not marketing copy alone.
14
+ 4. NEVER compare our product to theirs on dimensions we have not ourselves measured or experienced firsthand; flag untested dimensions explicitly as UNVERIFIED.
15
+ 5. NEVER recommend a competitive wedge that requires us to abandon our core strategic position (receipted personalization + own-weights serving + auditable agency) — only wedges that sharpen it.
16
+ 6. NEVER treat G2 / Capterra ratings as representative without checking: (a) total review count, (b) recency distribution, (c) whether reviews cluster within 60 days of a funding announcement or Product Hunt launch (solicitation signal — check Crunchbase funding date vs. G2 review date histogram).
17
+ 7. NEVER present a "WHERE WE WIN" list without a matching "WHERE WE LOSE / NOT YET" list of equal candor and equal length.
18
+ 8. Flag loudly when the competitor's stated moat is a commodity (e.g., "best-in-class AI" via OpenAI/Anthropic API) vs. a structural differentiator (e.g., proprietary training data, exclusive distribution channel, regulatory certification that requires years to obtain).
19
+ 9. All pricing figures carry the exact date observed; SaaS pricing changes without notice and stale data corrupts live deal prep.
20
+ 10. The output is a battlecard for a senior sales or product strategist — not a summary for a general audience. Density over polish; omit anything that doesn't change a decision.
21
+
22
+ ═══ PHASE A — TARGET SCOPING ═══
23
+
24
+ A1. Define the teardown target precisely before collecting any evidence:
25
+ - Competitor legal name + primary product name (they often differ; e.g., "Anthropic" sells "Claude")
26
+ - The specific product line or tier being analyzed (enterprise flagship? self-serve PLG tier? a vertical add-on?)
27
+ - Our product context: which Theron surface or SKU will this battlecard defend or attack with?
28
+ - Tear-down mode: DEFENSIVE (they are winning deals we should be winning) or OFFENSIVE (we are targeting their installed base)?
29
+ - Time horizon: is this for an imminent deal (next 30 days) or strategic roadmap input (next 12 months)? This changes what evidence to prioritize.
30
+
31
+ A2. Identify primary evidence sources to collect in Phase B — do not collect yet, just list them:
32
+ - Marketing site: /, /pricing, /customers, /enterprise, /security, /blog, /changelog or /releases
33
+ - LinkedIn: company page (headcount, hiring velocity, department mix), active job postings
34
+ - G2 / Capterra / TrustRadius: filter to last 12 months; pull 1-3 star reviews (pain = our wedge) and 4-5 star reviews (what users love = their real moat)
35
+ - Crunchbase / PitchBook / SEC EDGAR: funding stage, investors, disclosed ARR or revenue
36
+ - Twitter/X, Hacker News ("Ask HN: who uses [competitor]?"), Reddit: unguarded user sentiment
37
+ - GitHub: public repos reveal architecture choices, what they build vs. what they buy, and contributor velocity
38
+ - Job postings: engineering roles reveal infra stack and model strategy; sales roles reveal ICP and deal motion; ML/AI roles reveal whether they are building proprietary models or wrapping APIs
39
+ - Podcast appearances or conference talks by founders or executives: the language they use off-script is often more honest than their marketing copy
40
+
41
+ ═══ PHASE B — EVIDENCE COLLECTION ═══
42
+
43
+ B1. Pricing and Packaging — WebFetch /pricing on the date of analysis; record:
44
+ - All tier names, prices, billing periods, and seat definitions
45
+ - What is gated at each tier boundary: feature gates, usage caps, API access, SSO, audit logs, SLA, support tier
46
+ - Whether pricing is fully public or "contact sales" for any tier (hidden pricing above a threshold = enterprise-motion signal, not a prestige signal)
47
+ - Any usage-based components: per-seat vs. per-call vs. per-output-token vs. hybrid
48
+ - Free tier or trial structure (time-limited vs. usage-limited vs. feature-limited — each signals a different GTM motion)
49
+ - Date observed: required field, not optional
50
+
51
+ B2. Positioning — collect verbatim from their homepage hero, About page, and recent paid ads:
52
+ - To find paid ads: search Meta Ad Library at facebook.com/ads/library for their brand name; search Google Ads Transparency Center; search "[competitor name] ad" on Twitter/X
53
+ - Primary headline: the one-sentence claim above the fold on their homepage
54
+ - Secondary positioning: the paragraph or bullet list under the headline
55
+ - Named ICP in copy: specific job titles, company sizes, or verticals called out
56
+ - Key proof points cited: customer logos, benchmark claims, compliance certifications, analyst recognitions
57
+ - Emotional hook: is the lead emotion speed, safety, cost reduction, autonomy, or trust?
58
+
59
+ B3. Product capabilities — do NOT rely on their marketing feature list; cross-reference with:
60
+ - Their API or developer docs: what endpoints actually exist vs. what is described as "coming soon"
61
+ - Changelog or "What's New" page: look for /changelog, /releases, /updates, or their GitHub releases tab
62
+ - 1-3 star G2 reviews mentioning missing features (signal: "I wish it could…" or "it still can't…")
63
+ - Job postings describing features as "building" or "launching Q[X]" (not yet shipped)
64
+ - Open-source repos: reveals which components they build vs. which they wrap (a heavy langchain or litellm dependency means their AI layer is thinner than marketed)
65
+
66
+ B4. GTM motion — infer from observable signals, not self-description:
67
+ - Sales page CTA: self-serve checkout card = PLG; "book a demo" as the only CTA above free = SLG
68
+ - LinkedIn hiring mix: SDR/AE ratio, presence of Solutions Engineers and Implementation Managers, CS headcount relative to sales headcount
69
+ - Content strategy: high-volume SEO blog = inbound/PLG; ROI calculators + compliance whitepapers + case studies with named CFO quotes = enterprise
70
+ - Partner ecosystem page: reseller/channel motion? marketplace listing (AWS Marketplace, Salesforce AppExchange)? OEM integrations?
71
+ - Event sponsorship: developer conferences = developer-led; enterprise IT events (Gartner Summit, RSA) = CISO/IT buyer; consumer channels = B2C or prosumer
72
+
73
+ B5. Funding and burn signals — collect from Crunchbase + press:
74
+ - Total raised, last round size and date, lead investors and their typical portfolio profile
75
+ - Disclosed ARR or revenue: label source and date
76
+ - Headcount trend: LinkedIn "employees" count over the last 6-12 months — fast growth post-raise = burning capital to acquire; flat or declining post-Series-B = efficiency mode or growth plateau
77
+ - Any layoffs, pivots, or C-suite changes in the last 18 months: these are instability signals that create buying uncertainty in their customer base — a wedge opportunity
78
+
79
+ ═══ PHASE C — ANALYSIS: POSITIONING AND ICP ═══
80
+
81
+ C1. Decode their actual ICP — infer from actions, not stated intentions:
82
+ - Which customer logos they lead with: company size, industry, geographic region
83
+ - Job titles named in copy and case studies (the title that appears in a hero quote is usually their champion persona)
84
+ - The pain points they lead with: operational efficiency, compliance/audit, cost reduction, speed, or competitive advantage
85
+ - The integration partners they highlight: Salesforce/HubSpot = revenue/GTM buyers; Slack/Notion/Linear = SMB/PLG; AWS Marketplace/Azure Marketplace = IT buyer; SOC 2/ISO 27001 badge placement = security-sensitive enterprise
86
+ - Their lowest paid tier's price point and its specific feature unlock: reveals the minimum viable buyer they want to land
87
+
88
+ C2. Map their positioning to one of four archetypes and note if they are caught between two (bifurcation between archetypes = a weakness we can exploit with a cleaner story):
89
+ - AUTOMATION PLATFORM: "replaces headcount / automates workflows end-to-end"
90
+ - INTELLIGENCE LAYER: "makes your existing tools smarter / decision support without replacing them"
91
+ - TRUST INFRASTRUCTURE: "makes AI outputs auditable, compliant, or safe for regulated use"
92
+ - PERSONALIZED ASSISTANT: "learns your domain, your style, your workflows — forms around you"
93
+
94
+ C3. Identify their narrative SEAM — the specific gap between what they claim and what their product actually delivers:
95
+ This is our primary attack surface. Examples of seams:
96
+ - Claiming "AI you can trust" when their verifier is their own model (self-referential trust = not trust)
97
+ - Claiming "enterprise-grade" while lacking SSO, audit logs, or a data processing agreement on their pricing page
98
+ - Claiming "understands your domain" when their base is a generic API wrapper with a system prompt
99
+ - Claiming "proprietary AI" while their changelog shows only prompt engineering and UI changes, and their ML job postings require "experience with OpenAI API"
100
+ A seam is where their marketing runs ahead of their product — it is where a well-prepared buyer will catch them, and where we position our alternative.
101
+
102
+ ═══ PHASE D — ANALYSIS: PRODUCT STRENGTHS AND GAPS ═══
103
+
104
+ D1. Catalog genuine product strengths — only list items with supporting evidence:
105
+ Format: [Strength] → [Evidence source and date] → [Why users value it, in their words if possible]
106
+ Do not list "clean UI" or "responsive support" without a quote or a review count and rating that substantiates the claim.
107
+
108
+ D2. Catalog verified product gaps — only list items with supporting evidence:
109
+ Format: [Gap] → [Evidence source and date] → [User pain, quoted or closely paraphrased]
110
+ Priority-sort by: (1) frequency of mention across multiple independent reviews, (2) alignment with our current shipped strengths.
111
+
112
+ D3. Rate their execution velocity from their changelog:
113
+ - Source: /changelog, /releases, GitHub releases, or Product Hunt activity — specify which
114
+ - Count major capability releases vs. minor bug fixes in the last 12 months
115
+ - Identify any category where they ship multiple releases per quarter (signal: they believe it is core to their moat)
116
+ - Identify any category with no changelog activity in 6+ months (signal: deliberately deprioritized, stuck, or that roadmap item was dropped after a failed bet)
117
+ - Compare their shipping cadence to their fundraise date — post-raise slowdown is a culture or architecture signal
118
+
119
+ D4. Assess their AI substrate honesty — this is the highest-leverage analysis dimension for an AI competitor:
120
+ - Do they name their underlying model? If they do not, it is almost certainly an API wrapper; that is fair game to surface with a buyer.
121
+ - Do they claim proprietary training or fine-tuning? If yes: is there a model card, an independent benchmark report, or a published eval methodology? A claim without a methodology is a marketing claim, not a product claim.
122
+ - Is their entire "AI" feature set reproducible by a competent prompt engineer with OpenAI or Anthropic API access and two weeks of work? If yes, their AI moat is commodity risk — the next OpenAI model release may erase it.
123
+ - Do they disclose what happens to customer data used for inference? Absence of a data processing addendum at the self-serve tier is an enterprise sales blocker we can weaponize.
124
+
125
+ ═══ PHASE E — ANALYSIS: MOAT ASSESSMENT ═══
126
+
127
+ E1. Evaluate their moat against the four durable moat types; label each as REAL, FRAGILE, or ABSENT with specific supporting evidence:
128
+ - DATA NETWORK EFFECT: does using their product generate data that improves the product for other users? This requires a proprietary behavioral data loop — most AI SaaS products do not have this even when they claim it. ABSENT unless they can point to a specific mechanism.
129
+ - SWITCHING COST: how much workflow, integration, institutional knowledge, or reformatting work would a customer lose by leaving? Estimate in hours or dollars where possible. High switching cost = data exports are painful, or their output format is embedded in downstream systems.
130
+ - DISTRIBUTION LOCK-IN: are they embedded inside a mandatory workflow the buyer cannot remove — e.g., native to VS Code, inside a Salesforce workflow, inside a compliance audit trail a regulator touches?
131
+ - PROPRIETARY SUBSTRATE: do they own their model weights, their training pipeline, or a corpus that cannot be replicated with money alone? An exclusive data licensing deal or a proprietary synthetic data pipeline counts; "we fine-tune on OpenAI" does not.
132
+
133
+ E2. Identify their most FRAGILE claimed advantage — the one that collapses if:
134
+ - OpenAI, Anthropic, or Google releases the same capability natively into their base model or API
135
+ - A well-funded open-source project (Llama, Mistral, Qwen, DeepSeek) delivers equivalent quality at zero marginal cost
136
+ - Their primary API provider changes pricing, terms of service, or deprecates the specific model version they depend on
137
+
138
+ E3. Identify their stickiest genuine advantage — the one it would be strategically foolish to compete with head-on. Note explicitly what it would cost us in time and capital to close this gap, and whether it is worth attempting.
139
+
140
+ ═══ PHASE F — WIN / LOSE MAP ═══
141
+
142
+ F1. WHERE WE WIN — list only dimensions where we have a durable, evidence-backed advantage today:
143
+ Format: [Dimension] | [Our position — specific, not "we are better"] | [Their gap — with evidence source] | [Evidence for our claim]
144
+ Do not list a dimension where our advantage is theoretical, on the roadmap, or unshipped.
145
+
146
+ F2. WHERE WE LOSE / NOT YET — list with the same rigor and equal number of entries as F1:
147
+ Format: [Dimension] | [Their strength — with evidence] | [Our gap — honest assessment] | [What closing this gap requires — time, capital, strategic choice]
148
+ Label each gap with one of:
149
+ - STRATEGIC CHOICE: we will not close this because it conflicts with our position — explain why our position is correct
150
+ - ROADMAP: we will close this; specify by when and what ships
151
+ - REAL RISK: they may lock us out if we do not move within [timeframe]
152
+
153
+ F3. DEAL SCENARIO TABLE — for the three most common deal types we encounter against this competitor:
154
+ | Deal type | Buyer's primary criterion | We win if... | We lose if... |
155
+ |------------------|--------------------------|-------------------------------------|--------------------------------------|
156
+ | [e.g., mid-mkt] | [e.g., time-to-value] | [specific condition, not "we're better"] | [specific condition] |
157
+ | [e.g., ENT] | [e.g., compliance audit] | [specific condition] | [specific condition] |
158
+ | [e.g., PLG/self-serve] | [e.g., price] | [specific condition] | [specific condition] |
159
+
160
+ ═══ PHASE G — WEDGE SELECTION ═══
161
+
162
+ G1. Define THE single recommended attack vector — one paragraph, structured with these five labeled elements:
163
+ TARGET BUYER: [specific title + company profile + the trigger event that puts them in market now]
164
+ PAIN WE NAME: [the exact language from their 1-3 star reviews, job-post pain signals, or forum complaints — not our paraphrase of their pain]
165
+ OUR PROOF: [what we can demonstrate in a 30-minute meeting that they cannot replicate — must be something we can show, not describe]
166
+ THEIR SEAM WE EXPOSE: [the specific claim vs. reality gap from C3, surfaced as a buyer-facing question rather than an attack: "How do you verify that the AI's output is correct if the verifier is the same model that produced it?"]
167
+ ONE-LINE POSITIONING AGAINST THEM: [the exact sentence a sales rep uses when the prospect says "we're also looking at [competitor]" — should name the category we own, not attack their brand]
168
+
169
+ G2. Secondary wedges (max 2) — use the same five-element structure as G1 at lower confidence; label each element's confidence as HIGH / MEDIUM / LOW and note what evidence would upgrade it:
170
+ TARGET BUYER: [...] [confidence: X]
171
+ PAIN WE NAME: [...] [confidence: X]
172
+ OUR PROOF: [...] [confidence: X]
173
+ THEIR SEAM WE EXPOSE: [...] [confidence: X]
174
+ ONE-LINE POSITIONING: [...] [confidence: X]
175
+
176
+ G3. ANTI-PATTERNS TO AVOID in this specific competitive situation — at least 2, specific to this competitor:
177
+ Generic anti-patterns (e.g., "don't be arrogant") are not acceptable here. These must be specific to competing with this company: e.g., "do not compete on price — they have 3x our runway and will match any discount we offer"; "do not lead with benchmark comparisons — their developer community will publicly dispute any benchmark we publish without a live demo to anchor it"; "do not attack their enterprise sales motion — their AEs are senior and will outmaneuver us on legal/security review every time; go around them to the technical champion."
178
+
179
+ ═══ PHASE H — BATTLECARD OUTPUT ═══
180
+
181
+ H1. Deliver a structured battlecard with these exact sections, in this order:
182
+
183
+ COMPETITOR: [legal name — product name]
184
+ SNAPSHOT DATE: [date — re-verify before any live deal]
185
+
186
+ ONE-LINER: [one sentence — what they are, who they are for, and the category they claim]
187
+
188
+ ICP:
189
+ - [Buyer persona 1: title, company profile, trigger]
190
+ - [Buyer persona 2]
191
+ - [Buyer persona 3 if applicable]
192
+
193
+ PRICING SNAPSHOT: [date observed]
194
+ - [Tier name]: $[price]/[period] — [key feature gate at this tier]
195
+ - [Tier name]: $[price]/[period] — [key feature gate]
196
+ - [Enterprise]: [public price or "contact sales"] — [what triggers the enterprise conversation]
197
+
198
+ THEIR REAL MOAT: [1-2 sentences — the thing that is genuinely hard to beat and why; be honest]
199
+
200
+ THEIR SEAM: [1-2 sentences — the specific gap between their biggest claim and what their product actually delivers]
201
+
202
+ WHERE WE WIN:
203
+ - [Dimension] — [evidence-backed, shipped today]
204
+ - [Dimension] — [evidence-backed, shipped today]
205
+
206
+ WHERE WE LOSE / NOT YET:
207
+ - [Dimension] — [their strength; labeled STRATEGIC CHOICE / ROADMAP / REAL RISK]
208
+ - [Dimension]
209
+
210
+ RECOMMENDED WEDGE: [G1 condensed to 4-5 lines; keep all five labeled elements]
211
+
212
+ TALK TRACK — OBJECTION HANDLERS:
213
+ Format for each: Prospect says: "[verbatim or close paraphrase of the objection]" → We say: "[the response — one to three sentences, leads with agreement or acknowledgment, pivots to our structural advantage, never attacks their brand by name]"
214
+ - Prospect says: "[most common objection]" → We say: "[response]"
215
+ - Prospect says: "[second most common objection]" → We say: "[response]"
216
+ - Prospect says: "[third]" → We say: "[response]"
217
+ - Prospect says: "[fourth if applicable]" → We say: "[response]"
218
+
219
+ OPEN QUESTIONS: [what we still do not know that would materially change this analysis — list as questions, not statements; include what evidence source would answer each]
220
+
221
+ H2. After the battlecard, state: the single assumption in this entire analysis most likely to be wrong, why it might be wrong, and what specific evidence would correct it.
222
+
223
+ H3. Date-stamp the entire output: "Competitive snapshot as of [DATE]. Re-verify pricing, changelog, and headcount before any live deal. This battlecard expires in 90 days or at their next funding announcement, whichever comes first."
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: component-spec
3
+ description: Produce a complete, build-ready UI component specification covering anatomy, prop/variant matrix, every interaction and data state, design tokens (color/space/type/motion/dark-mode), full accessibility contract (ARIA roles, keyboard, focus), responsive rules, automation hooks, breaking-change policy, and do/don't usage — output is the single source of truth a designer and engineer both build from without a meeting.
4
+ allowed-tools: Read, Write
5
+ ---
6
+
7
+ ═══ HARD RULES ═══
8
+ 1. Every prop must carry: name · type · required/optional · default · enumerated values (no open-ended "string" when a union is correct).
9
+ 2. Never invent token names — derive them from the consuming system's actual token scale; flag UNKNOWN if tokens are unresolved.
10
+ 3. State matrix must be exhaustive: enumerate every combination of data state × interaction state before writing prose.
11
+ 4. Accessibility contract is non-negotiable — every interactive element needs role, aria-label strategy, keyboard trigger, and focus-visible treatment.
12
+ 5. Do/Don't examples must be component-specific; reject any example that could apply to a generic element.
13
+ 6. Motion tokens (duration, easing) must appear wherever a state transition is visible — "no animation" is a valid explicit value, and every motion rule must declare whether it respects prefers-reduced-motion.
14
+ 7. A spec is DONE only when a senior engineer could build the component to pixel-fidelity without asking a follow-up question.
15
+ 8. Every interactive element must expose a stable data-testid or equivalent automation hook — document its naming convention and ownership (component-owned vs. caller-provided).
16
+ 9. Any prop change that alters the public API (rename, type narrowing, removal) is a BREAKING CHANGE and must be flagged before spec sign-off; the spec must record the semantic version bump required.
17
+ 10. This spec covers web surfaces only (desktop/tablet/mobile browser). Native (iOS/Android) and email/print are explicitly OUT OF SCOPE unless the consuming system opts them in with a separate native-contract section.
18
+
19
+ ═══ PHASE A — ORIENT: NAME, SCOPE, AND ROLE ═══
20
+ A1. State the component's canonical name in PascalCase and its package import path (e.g., `import { Button } from '@acme/ui/button'`).
21
+ A2. Write one sentence: what user need does this component solve, and what it intentionally does NOT do (e.g., "handles label + icon button affordance; does NOT handle menu-trigger or link navigation — use IconButton or LinkButton for those").
22
+ A3. Identify the component's layer in the design system hierarchy:
23
+ - primitive — no external component dependencies (e.g., Token, Icon)
24
+ - composite — composes two or more primitives (e.g., InputField = Input + Label + ErrorText)
25
+ - pattern — composes composites to express a recurring UX workflow (e.g., SearchBar)
26
+ - page-section — full layout region, not reusable at component granularity
27
+ A4. List every direct child component this component composes — note which are internal (same package) and which are external (peer dependency). If an external component's version is pinned, record it.
28
+ A5. Record the consuming surfaces in scope for this spec: web-desktop · web-tablet · web-mobile. State any responsive behavior that differs by surface.
29
+
30
+ ═══ PHASE B — ANATOMY ═══
31
+ B1. Produce a named-parts diagram in ASCII or structured list — every visual region gets a part name (root, trigger, label, icon-leading, icon-trailing, helper-text, error-text, badge, overlay, etc.).
32
+ B2. For each part:
33
+ - Semantic HTML element (e.g., `<button>`, `<span>`, `<div role="status">`)
34
+ - Whether it is always-rendered or conditionally-rendered (and the condition)
35
+ - The CSS class slot it exposes for external override (e.g., `.btn__label`) and the data-attribute for state querying (e.g., `data-state="loading"`)
36
+ B3. Call out which parts are SLOTS (caller-provided content via children/slot prop) vs. OWNED (component-controlled). Slots that accept arbitrary JSX must document any rendering constraints (e.g., "only one child, must be an inline element").
37
+ B4. Assign a stable data-testid to each part that an automated test may need to target. Use a hierarchical naming convention: `{component}-{part}` (e.g., `button-label`, `button-icon-leading`). Mark which are component-owned vs. caller-overridable.
38
+
39
+ ═══ PHASE C — PROPS AND VARIANTS ═══
40
+ C1. Build a full prop table with columns: Prop | Type | Required | Default | Notes.
41
+ C2. Define the variant axis first (e.g., `variant: 'primary' | 'secondary' | 'ghost' | 'danger'`), then size, then boolean modifiers (disabled, loading, fullWidth, etc.). Every value in a union must appear — no "and others" shortcuts.
42
+ C3. State which prop combinations are INVALID and what the component does on receipt: warn-to-console + graceful fallback, or hard error with thrown exception. Document the exact console.warn message text so engineers can search for it.
43
+ C4. List every compound variant: style overrides that apply only when two or more props intersect (e.g., `size="sm" + loading=true` collapses label to visually-hidden; `variant="ghost" + disabled=true` removes border, not just reduces opacity).
44
+ C5. Enumerate every data state and describe how props map to each:
45
+ - empty / blank
46
+ - loading / pending
47
+ - populated / success
48
+ - error / invalid
49
+ - warning
50
+ - read-only
51
+ - disabled
52
+ Add any component-specific states not listed here (e.g., indeterminate for checkboxes, dragging for sortable items).
53
+
54
+ ═══ PHASE D — INTERACTION AND BEHAVIOR STATES ═══
55
+ D1. List all interaction states the component must render: default · hover · focus-visible · focus-within · active/pressed · dragging · selected · indeterminate (where applicable).
56
+ D2. For EVERY state: describe the exact visual delta using token names only — no raw hex, no raw px. Example: "background changes from --color-action-bg to --color-action-bg-hover; border-color unchanged."
57
+ D3. For each state transition: property animated · duration token · easing token · whether the transition is suppressed under prefers-reduced-motion (state "suppressed" or "retained — motion is meaningful").
58
+ D4. Define the pointer/touch target area explicitly:
59
+ - Minimum 44×44 px per WCAG 2.5.5 and Apple HIG.
60
+ - If the visual hit area is smaller than 44×44 px, describe the invisible touch-target expansion technique used (padding, ::before overlay, etc.).
61
+ D5. Specify any non-default pointer behaviors if applicable: long-press (with delay token), right-click / context-menu, pointer-capture during drag. If none apply, write "none."
62
+ D6. For composite components: describe internal event routing. State explicitly which child events propagate to the root and which are stopped (e.g., "click on icon-trailing fires onClear; does NOT propagate to the root onClick").
63
+
64
+ ═══ PHASE E — DESIGN TOKENS ═══
65
+ E1. Group tokens by category: Color · Space · Typography · Border · Shadow · Motion.
66
+ E2. Color — for every part × every interaction/data state, map to a semantic token for each property:
67
+ - background → --color-{semantic}-bg[-{state}]
68
+ - text → --color-{semantic}-text[-{state}]
69
+ - border → --color-{semantic}-border[-{state}]
70
+ - focus ring (outline) → --color-focus-ring
71
+ - icon fill → --color-{semantic}-icon[-{state}]
72
+ Use semantic tokens (e.g., --color-action-bg-hover) not primitive tokens (e.g., --blue-500). If the system has no semantic layer yet, note this and use the primitive token with a FIXME comment.
73
+ E3. Dark mode — for every semantic token used, state whether the system's dark-mode token contract swaps it automatically (via CSS color-scheme / data-theme attribute) or whether the component must apply a dark-specific token override. Flag any token that has no dark-mode equivalent as UNKNOWN-DARK.
74
+ E4. Space — for each size variant: block padding, inline padding, gap between internal parts, icon size. State whether the component is margin-agnostic (preferred — the component sets no external margin).
75
+ E5. Typography — per text part (label, helper-text, error-text, placeholder): font-family token · size token · line-height token · font-weight token.
76
+ E6. Motion — duration token + easing token for each transition identified in Phase D.
77
+ E7. Flag every token that is UNKNOWN (not yet defined in the system). Do not silently substitute a raw value; a spec with raw values is not shippable.
78
+
79
+ ═══ PHASE F — ACCESSIBILITY CONTRACT ═══
80
+ F1. State the ARIA role of the root element and every interactive child. Where the role is implicit from the HTML element, write both (e.g., `<button>` → implicit role="button"; do not add an explicit role attribute).
81
+ F2. Define the aria-label / aria-labelledby / aria-describedby strategy:
82
+ - When is each attribute required vs. optional?
83
+ - What is the fallback if the consumer omits a required label? (The component must warn in development; document the exact warning.)
84
+ F3. List every aria-* live state that applies: aria-disabled · aria-expanded · aria-selected · aria-checked · aria-invalid · aria-busy · aria-pressed · aria-haspopup. For each: what prop drives it, and what is the value in each data state.
85
+ F4. Keyboard contract — table with columns: Key | Condition | Action | Focus destination after.
86
+ Must include at minimum: Enter, Space, Escape, Tab, Shift+Tab. Add arrow keys, Home, End if the component implements a composite widget pattern (listbox, menu, tabs, grid).
87
+ F5. Focus management:
88
+ - Does the component trap focus (modal/dialog pattern)?
89
+ - Does it restore focus to a previous element on close, and under what condition?
90
+ - Does it programmatically move focus (e.g., after async action completes)? If so, what is the timing (synchronous, or after a microtask/frame)?
91
+ F6. Color contrast — for each distinct text-on-background combination in the component: name the token pair and the required WCAG 2.1 ratio (4.5:1 for normal text, 3:1 for large text and UI controls). Do not compute the ratio here — mark each as MUST VERIFY against live resolved token values before sign-off.
92
+ F7. Screen reader announcement — describe the complete VoiceOver/NVDA read-out for the most complex interaction path through this component (e.g., for a password input: "Password, secure text field, 8 characters, required, You must include a number, invalid"). Include the role, name, state, and any live-region announcements triggered by async feedback.
93
+
94
+ ═══ PHASE G — RESPONSIVE RULES ═══
95
+ G1. Define the breakpoint vocabulary using the system's canonical breakpoint tokens (e.g., sm / md / lg / xl) — never raw px values in this section.
96
+ G2. For each breakpoint where layout changes: list every change explicitly — stack vs. inline, full-width collapse, icon-only mode, truncation behavior. State prop overrides that are forced by the component at a breakpoint (e.g., "below sm, fullWidth is forced true regardless of prop").
97
+ G3. State whether the component uses intrinsic sizing (min-content / fit-content) or extrinsic sizing (parent-controlled width) as its default. Document how each size variant interacts with a constrained container.
98
+ G4. Call out any pointer-type behavior changes: behaviors available only on hover (e.g., tooltip reveal) must have a touch-equivalent disclosure path.
99
+
100
+ ═══ PHASE H — DO / DON'T USAGE GUIDE ═══
101
+ H1. List 4–6 DO examples specific to THIS component's domain. Each must:
102
+ - Show the correct prop or composition pattern.
103
+ - Explain the user or accessibility benefit.
104
+ - Be wrong or suboptimal without following the rule.
105
+ H2. List 4–6 DON'T examples. Each must:
106
+ - Identify the anti-pattern and the exact prop combination that creates it.
107
+ - State the harm: accessibility regression, visual breakage, semantic mismatch, or performance cost.
108
+ H3. Adjacent components — for each named alternative in the system, write one line: "Use [X], not [this component], when [specific condition]." Do not name components that do not exist in the consuming system.
109
+ H4. Third-party integration constraints — if this component internally wraps or conflicts with any third-party library that consumers are likely to also use (e.g., a tooltip library, a focus-trap library, a form library), document the constraint as a pattern: "Do not add an external [tooltip / focus-trap / form-field wrapper] around this component — doing so breaks [specific ARIA relationship / event contract / focus behavior] because [reason]." Name the third-party library only if it is a confirmed peer dependency of this design system.
110
+
111
+ ═══ PHASE I — OPEN QUESTIONS, VERSIONING, AND SIGN-OFF ═══
112
+ I1. Breaking-change register — list any prop rename, type narrowing, removal, or behavior change relative to the previous version of this component. For each: record the semver bump required (major / minor / patch) and the migration path (codemod available? manual change needed?).
113
+ I2. Deferred decisions — for every decision that is not yet resolved: state the question, the owner (name or role), and the target date. A spec with unresolved decisions must not be marked ready for engineering.
114
+ I3. Unknown tokens — list every token flagged UNKNOWN or UNKNOWN-DARK from Phase E. Do not ship a spec with silent placeholder values.
115
+ I4. Record: spec version · author · last-updated date · design file link (Figma frame or equivalent).
116
+ I5. Sign-off requirement — all three reviews must be explicitly recorded before this spec is considered shippable:
117
+ - Design review ✓ — [name, date]
118
+ - Engineering review ✓ — [name, date]
119
+ - Accessibility review ✓ — [name, date]
120
+
121
+ KEY PRINCIPLE: A component spec is not documentation after the fact — it is the contract that makes design and engineering the same conversation before a single line of code is written. Every UNKNOWN is a future meeting; eliminate them here.