tweakidea 0.1.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.
@@ -0,0 +1,186 @@
1
+ ---
2
+ name: ti-founder
3
+ description: Founder profile template, creation questions, section definitions, and fit question guidance for TweakIdea evaluations
4
+ user-invocable: false
5
+ ---
6
+
7
+ Reference data for all founder profile operations. The orchestrator (`evaluate.md`) uses this skill to create, read, and update `FOUNDER.md` at `~/.tweakidea/FOUNDER.md`.
8
+
9
+ ---
10
+
11
+ ## FOUNDER.md Template
12
+
13
+ ```
14
+ # Founder Profile
15
+
16
+ ## Expertise & Domain Knowledge
17
+ - Domain: [domain/industry]
18
+ - Depth: [depth/level]
19
+ - Insight: [unique perspective]
20
+
21
+ ## Relevant Experience
22
+ - Role: [most relevant role]
23
+ - Achievement: [relevant accomplishment]
24
+ - Duration: [time in space]
25
+
26
+ ## Network & Market Access
27
+ - Connections: [network]
28
+ - Channel: [customer access]
29
+ - Capital: [resources/funding]
30
+
31
+ ## Build Capabilities
32
+ - Technical: [build capability]
33
+ - Team: [team composition]
34
+ - Speed: [shipping ability]
35
+
36
+ ## Drive & Commitment
37
+ - Motivation: [why this problem]
38
+ - Experience: [personal connection]
39
+ - Commitment: [commitment level]
40
+
41
+ ---
42
+ *Created: [date] | Last updated: [date]*
43
+ ```
44
+
45
+ ### Template Rules
46
+
47
+ - Field names (Domain, Depth, Insight, etc.) are starter suggestions. Use whatever tagged entries naturally emerge from the founder's answers.
48
+ - Not every section needs all suggested fields -- some may have 1 entry, some may have 5.
49
+ - Keep FOUNDER.md under 100 lines (context budget).
50
+ - Do NOT add new sections beyond the 5 defined above. Fit additional information into the most relevant existing section as tagged list entries (e.g., `- Key: Value`).
51
+
52
+ ---
53
+
54
+ ## Profile Creation Questions
55
+
56
+ Ask these 5 questions one at a time using AskUserQuestion, waiting for each answer before proceeding to the next:
57
+
58
+ | # | Question | Maps to Section |
59
+ |---|----------|-----------------|
60
+ | 1 | "What's your professional background? (Industry experience, roles, education)" | Relevant Experience |
61
+ | 2 | "What domains do you have deep expertise in?" | Expertise & Domain Knowledge |
62
+ | 3 | "What relevant network or resources do you have? (Connections, advisors, potential early customers, capital access)" | Network & Market Access |
63
+ | 4 | "What can you or your team build? (Technical strengths, capabilities)" | Build Capabilities |
64
+ | 5 | "What drives you to work on hard problems? (Personal motivation, what keeps you going)" | Drive & Commitment |
65
+
66
+ Preamble before asking: "I don't have a founder profile yet. I'll ask a few quick questions to understand your background -- this helps evaluate founder-market fit and only needs to happen once."
67
+
68
+ If during the questioning flow the user volunteers additional relevant information beyond what was asked, capture it in the appropriate section. Do not add new sections.
69
+
70
+ ---
71
+
72
+ ## Fit Question Guidance
73
+
74
+ After profile creation/load, ask 2-4 questions about the founder's connection to THIS specific idea. These questions serve a dual purpose: surface persistent founder attributes while assessing idea-specific fit.
75
+
76
+ ### Design Principle
77
+
78
+ Each question must simultaneously:
79
+ 1. Surface a **persistent founder attribute** (expertise, experience, network, capability) that would appear in FOUNDER.md
80
+ 2. Assess **idea-specific fit** by anchoring that attribute to the current idea domain
81
+
82
+ Do NOT write questions that are purely idea-specific ("How big is this market?") or purely background ("What's your experience?"). The profile creation questions already captured generic background. Fit questions contextualize those attributes to this idea.
83
+
84
+ ### Focus
85
+
86
+ Founder-idea fit exclusively -- NOT generic idea questions. Do not ask about target customers, market size, competitors, or other idea details already present in the idea text.
87
+
88
+ ### Dynamic Generation
89
+
90
+ Questions must be generated based on:
91
+ - The idea domain (what industry/problem space is described)
92
+ - What FOUNDER.md already covers -- do NOT re-ask what is already known
93
+ - Gaps in understanding the founder-idea connection that would help evaluate founder-market fit
94
+
95
+ ### Example Dual-Purpose Patterns
96
+
97
+ Adapt to the specific idea -- do not use these verbatim if they don't fit:
98
+ - "What experience or expertise gives you an edge in [the idea's specific domain]?" -- surfaces expertise (persistent) + idea relevance
99
+ - "Have you personally experienced [the specific problem], and what was your situation?" -- surfaces personal connection (persistent) + idea validation
100
+ - "Do you have existing relationships with [target segment], and how strong is that access?" -- surfaces network (persistent) + idea-specific channel
101
+ - "What have you already built or shipped that's relevant to [this problem area]?" -- surfaces build capability (persistent) + idea relevance
102
+
103
+ ### Presentation
104
+
105
+ Present all 2-4 fit questions in a **single AskUserQuestion call** so the founder sees and answers all questions together in one interaction. Do NOT preview questions first, do NOT ask them one at a time. One call, all questions.
106
+
107
+ For each question, provide 2-4 answer options relevant to the question type (e.g., depth-of-experience options, yes/no with elaboration, etc.). AskUserQuestion auto-adds "Other" -- do NOT include "Other" as an explicit option.
108
+
109
+ ### Storage
110
+
111
+ Store all question-answer pairs as FOUNDER_FIT_ANSWERS:
112
+ ```
113
+ Q: [question text]
114
+ A: [founder's answer]
115
+ ```
116
+
117
+ Always ask fit questions even when FOUNDER.md already exists (returning user). The session covers founder-market fit for the current idea.
118
+
119
+ ---
120
+
121
+ ## Profile Update Rules
122
+
123
+ After fit Q&A, review answers for NEW persistent attributes about the founder -- information about background, expertise, network, capabilities, or motivation relevant across multiple evaluation runs.
124
+
125
+ ### What qualifies as persistent
126
+
127
+ - Background, expertise, network, capabilities, motivation details
128
+ - NOT idea-specific observations (e.g., "I think this market is growing")
129
+
130
+ ### Update mechanics
131
+
132
+ 1. Present relevant answers to the founder using AskUserQuestion with multiSelect
133
+ 2. Each option shows a summary and which FOUNDER.md section it would update
134
+ 3. Follow AskUserQuestion 2-4 option limit; chunk if more than 4 qualify
135
+ 4. If founder selects answers to persist: read current FOUNDER.md, **append** to relevant section (never replace), write updated file
136
+ 5. Update the "Last updated" date in the footer
137
+ 6. If founder selects nothing or no answers qualify, skip entirely
138
+
139
+ ### Old-Format Section Name Mapping
140
+
141
+ If an existing FOUNDER.md uses old-format section headers, map them:
142
+
143
+ | Old Section Name | New Section Name |
144
+ |---|---|
145
+ | Background | Relevant Experience |
146
+ | Domain Expertise | Expertise & Domain Knowledge |
147
+ | Network & Resources | Network & Market Access |
148
+ | Technical Capabilities | Build Capabilities |
149
+ | Passion & Motivation | Drive & Commitment |
150
+
151
+ If headers are unrecognized, try keyword proximity matching. If completely unparseable, display raw content to the user with a warning.
152
+
153
+ ---
154
+
155
+ ## Section Picker Flow
156
+
157
+ For standalone profile editing (outside of an evaluation run), use a two-call section picker:
158
+
159
+ ### First AskUserQuestion call (multiSelect: true)
160
+
161
+ Question: "Which sections of your founder profile would you like to update?"
162
+
163
+ Options (4 items):
164
+ 1. label: "No changes needed", description: "Looks good — exit without editing"
165
+ 2. label: "Expertise & Domain Knowledge", description: "Your domain expertise, industry knowledge, and unique insights"
166
+ 3. label: "Relevant Experience", description: "Professional background, roles, and achievements"
167
+ 4. label: "Network & Market Access", description: "Connections, customer access, and resources"
168
+
169
+ If "No changes needed" is selected: exit without editing.
170
+
171
+ ### Second AskUserQuestion call (multiSelect: true)
172
+
173
+ Question: "Any other sections to update?"
174
+
175
+ Options (2 items):
176
+ 1. label: "Build Capabilities", description: "Technical skills, team, and ability to ship"
177
+ 2. label: "Drive & Commitment", description: "Motivation, personal connection, and commitment level"
178
+
179
+ ### Conversational Editing
180
+
181
+ For each selected section, in selection order:
182
+ 1. Show current entries from that section (or "This section is currently empty" if new)
183
+ 2. Ask: "Here are your current entries for [section name]. What would you like to add, change, or remove?"
184
+ 3. Process response conversationally -- add, change, or remove tagged list entries using natural language understanding
185
+
186
+ After all sections processed, write updated FOUNDER.md and update the "Last updated" date.
@@ -0,0 +1,352 @@
1
+ ---
2
+ name: ti-html-report
3
+ description: Self-contained HTML report template with CSS styles and generation rules for TweakIdea evaluation reports
4
+ user-invocable: false
5
+ ---
6
+
7
+ Reference data for generating styled HTML evaluation reports. The orchestrator (`evaluate.md`) uses this skill when HTML_REQUESTED is true to produce `report.html` in the run directory.
8
+
9
+ ---
10
+
11
+ ## Data Extraction Rules
12
+
13
+ The orchestrator reads FINAL_REPORT (the merger's markdown output) semantically (as structured markdown, not via regex) and extracts:
14
+
15
+ - **Verdict**: first line -- indicator, label, and weighted score (split on `|`)
16
+ - **Dealbreakers**: lines starting with `> DEALBREAKER:` (may be zero)
17
+ - **Scorecard rows**: the 14 data rows from the markdown table (after the header row `| Dimension | Score | ...`)
18
+ - **Evidence quality**: the `**Evidence Quality:**` line with percentages
19
+ - **Assumption impacts**: bullet items under `**Assumption Impact:**` starting with `- *`
20
+ - **Strengths**: numbered items under `### Top 3 Strengths`
21
+ - **Weaknesses**: numbered items under `### Top 3 Weaknesses`
22
+ - **Next steps**: numbered items under `### Next Steps`
23
+
24
+ Also include IDEA_TEXT as the idea summary section, and if RESEARCH_AVAILABLE is true, include the research brief highlights (Competitors, Market Data, User Evidence sections from RESEARCH_RESULTS).
25
+
26
+ ---
27
+
28
+ ## HTML Template
29
+
30
+ Generate this EXACT structure, filling in data values only:
31
+
32
+ ```html
33
+ <!DOCTYPE html>
34
+ <html lang="en">
35
+ <head>
36
+ <meta charset="UTF-8">
37
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
38
+ <title>TweakIdea Evaluation Report</title>
39
+ <style>
40
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
41
+ body {
42
+ font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
43
+ line-height: 1.65; color: #1a1a2e; background-color: #f8f9fc; padding: 2.5rem 1.5rem;
44
+ letter-spacing: -0.01em;
45
+ }
46
+ .container { max-width: 940px; margin: 0 auto; }
47
+ h1 { font-size: 1.6rem; font-weight: 800; letter-spacing: -0.02em; color: #111827; }
48
+ h2 { font-size: 1.2rem; font-weight: 700; margin-bottom: 0.85rem; color: #1f2937; letter-spacing: -0.01em; }
49
+
50
+ /* Verdict banner */
51
+ .verdict { padding: 1.5rem 1.75rem; border-radius: 10px; margin-bottom: 1.75rem; }
52
+ .verdict-go { background-color: #dcfce7; border-left: 4px solid #22c55e; }
53
+ .verdict-pivot { background-color: #fef9c3; border-left: 4px solid #eab308; }
54
+ .verdict-stop { background-color: #fee2e2; border-left: 4px solid #ef4444; }
55
+ .verdict-label { font-size: 1.25rem; font-weight: 700; }
56
+ .verdict-score { font-size: 1rem; color: #4b5563; margin-top: 0.25rem; }
57
+
58
+ /* Cards */
59
+ .card { background: #fff; border-radius: 10px; padding: 1.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06); margin-bottom: 1.25rem; }
60
+
61
+ /* Dealbreaker */
62
+ .dealbreaker { background-color: #fef2f2; border-left: 4px solid #ef4444; padding: 1rem 1.25rem; border-radius: 8px; margin-bottom: 1rem; }
63
+ .dealbreaker-title { color: #dc2626; font-weight: 700; }
64
+
65
+ /* Scorecard table */
66
+ .scorecard-table { width: 100%; border-collapse: collapse; font-size: 0.92rem; }
67
+ .scorecard-table th { text-align: left; padding: 0.65rem 0.75rem; border-bottom: 2px solid #d1d5db; color: #6b7280; font-weight: 700; font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; }
68
+ .scorecard-table td { padding: 0.65rem 0.75rem; border-bottom: 1px solid #f3f4f6; vertical-align: middle; }
69
+ .scorecard-table tr:last-child td { border-bottom: none; }
70
+
71
+ /* Score explanation (below each scorecard row) */
72
+ .score-explanation td {
73
+ padding: 0.25rem 0.75rem 0.75rem 0.75rem;
74
+ border-bottom: 1px solid #e5e7eb;
75
+ font-size: 0.85rem;
76
+ color: #4b5563;
77
+ line-height: 1.55;
78
+ font-style: italic;
79
+ }
80
+
81
+ /* Radar chart */
82
+ .radar-chart { text-align: center; padding: 1rem 0; }
83
+ .radar-chart svg { max-width: 100%; height: auto; }
84
+
85
+ /* Score badges */
86
+ .score-badge { display: inline-block; width: 2.25rem; height: 2.25rem; line-height: 2.25rem; text-align: center; border-radius: 6px; font-weight: 700; font-size: 0.85rem; color: #1a1a1a; }
87
+ .score-5 { background-color: #22c55e; }
88
+ .score-4 { background-color: #14b8a6; }
89
+ .score-3 { background-color: #eab308; }
90
+ .score-2 { background-color: #f97316; }
91
+ .score-1 { background-color: #ef4444; }
92
+
93
+ /* Progress bars */
94
+ .progress-container { background-color: #e5e7eb; border-radius: 9999px; height: 10px; width: 100%; overflow: hidden; display: inline-block; vertical-align: middle; }
95
+ .progress-bar { height: 100%; border-radius: 9999px; }
96
+
97
+ /* Evidence tier badges */
98
+ .tier-badge { display: inline-block; padding: 2px 7px; border-radius: 9999px; font-size: 0.7rem; font-weight: 600; margin-right: 3px; }
99
+ .tier-verified { background-color: #22c55e; color: #1a1a1a; }
100
+ .tier-research { background-color: #3b82f6; color: #ffffff; }
101
+ .tier-founder { background-color: #eab308; color: #1a1a1a; }
102
+ .tier-assumed { background-color: #9ca3af; color: #1a1a1a; }
103
+
104
+ /* Evidence quality bar */
105
+ .evidence-bar { display: flex; height: 24px; border-radius: 6px; overflow: hidden; margin: 0.5rem 0; font-size: 0.75rem; font-weight: 600; }
106
+ .evidence-bar > div { display: flex; align-items: center; justify-content: center; color: #1a1a1a; min-width: 2rem; }
107
+ .evidence-bar .ev-verified { background-color: #22c55e; }
108
+ .evidence-bar .ev-research { background-color: #3b82f6; color: #fff; }
109
+ .evidence-bar .ev-founder { background-color: #eab308; }
110
+ .evidence-bar .ev-assumed { background-color: #9ca3af; }
111
+
112
+ /* Two-column layout */
113
+ .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
114
+
115
+ /* Lists */
116
+ .item-list { list-style: none; padding: 0; }
117
+ .item-list li { padding: 0.5rem 0; border-bottom: 1px solid #f3f4f6; }
118
+ .item-list li:last-child { border-bottom: none; }
119
+ .dim-tag { display: inline-block; background: #e5e7eb; color: #374151; padding: 1px 6px; border-radius: 4px; font-size: 0.75rem; font-weight: 500; }
120
+
121
+ /* Header and footer */
122
+ header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 2rem; padding-bottom: 1.25rem; border-bottom: 2px solid #e5e7eb; }
123
+ footer { text-align: center; color: #9ca3af; font-size: 0.78rem; margin-top: 2.5rem; padding-top: 1.25rem; border-top: 2px solid #e5e7eb; }
124
+
125
+ /* Print */
126
+ @media print {
127
+ body { background: #fff; padding: 0; }
128
+ .card { box-shadow: none; border: 1px solid #e5e7eb; }
129
+ .verdict, .score-badge, .tier-badge, .evidence-bar > div, .dealbreaker {
130
+ -webkit-print-color-adjust: exact; print-color-adjust: exact;
131
+ }
132
+ .card, .scorecard-table tr { break-inside: avoid; }
133
+ }
134
+ @media (max-width: 640px) {
135
+ .two-col { grid-template-columns: 1fr; }
136
+ }
137
+ </style>
138
+ </head>
139
+ <body>
140
+ <div class="container">
141
+ <header>
142
+ <h1>TweakIdea Evaluation</h1>
143
+ <span style="color:#6b7280;font-size:0.85rem;">{TIMESTAMP}</span>
144
+ </header>
145
+
146
+ <!-- VERDICT BANNER: use class verdict-go (>=4.0), verdict-pivot (3.0-3.99), verdict-stop (2.0-2.99 or <2.0) -->
147
+ <div class="verdict {verdict-class}">
148
+ <div class="verdict-label">{verdict indicator} {verdict label}</div>
149
+ <div class="verdict-score">Weighted Score: {X.X}/5.0 | Potential: {Y.Y}/5.0</div>
150
+ </div>
151
+
152
+ <!-- DEALBREAKERS: only include this section if dealbreakers exist. One div per dealbreaker. -->
153
+ <div class="dealbreaker">
154
+ <span class="dealbreaker-title">DEALBREAKER: {Dimension Name}</span> scored 1/5 -- {brief explanation}
155
+ </div>
156
+
157
+ <!-- IDEA SUMMARY -->
158
+ <div class="card">
159
+ <h2>Idea</h2>
160
+ <p>{IDEA_TEXT -- the full idea as provided by the founder}</p>
161
+ </div>
162
+
163
+ <!-- RADAR CHART: inline SVG showing 14 dimension scores -->
164
+ <div class="card">
165
+ <h2>Dimension Overview</h2>
166
+ <div class="radar-chart">
167
+ <svg viewBox="0 0 500 440" xmlns="http://www.w3.org/2000/svg">
168
+ <!-- Grid: 5 concentric polygons at r=30,60,90,120,150 from center (250,210) -->
169
+ <!-- Computed via: for each level L (1-5), for each dim i (0-13): angle = i*(360/14)-90 deg, x = 250 + L*30*cos(angle_rad), y = 210 + L*30*sin(angle_rad) -->
170
+ <g class="grid" stroke="#e5e7eb" fill="none" stroke-width="1">
171
+ <polygon points="250.0,180.0 263.0,183.0 273.5,191.3 279.2,203.3 279.2,216.7 273.5,228.7 263.0,237.0 250.0,240.0 237.0,237.0 226.5,228.7 220.8,216.7 220.8,203.3 226.5,191.3 237.0,183.0"/>
172
+ <polygon points="250.0,150.0 276.0,155.9 296.9,172.6 308.5,196.6 308.5,223.4 296.9,247.4 276.0,264.1 250.0,270.0 224.0,264.1 203.1,247.4 191.5,223.4 191.5,196.6 203.1,172.6 224.0,155.9"/>
173
+ <polygon points="250.0,120.0 289.0,128.9 320.4,153.9 337.7,190.0 337.7,230.0 320.4,266.1 289.0,291.1 250.0,300.0 211.0,291.1 179.6,266.1 162.3,230.0 162.3,190.0 179.6,153.9 211.0,128.9"/>
174
+ <polygon points="250.0,90.0 302.1,101.9 343.8,135.2 367.0,183.3 367.0,236.7 343.8,284.8 302.1,318.1 250.0,330.0 197.9,318.1 156.2,284.8 133.0,236.7 133.0,183.3 156.2,135.2 197.9,101.9"/>
175
+ <polygon points="250.0,60.0 315.1,74.9 367.3,116.5 396.2,176.6 396.2,243.4 367.3,303.5 315.1,345.1 250.0,360.0 184.9,345.1 132.7,303.5 103.8,243.4 103.8,176.6 132.7,116.5 184.9,74.9"/>
176
+ </g>
177
+
178
+ <!-- Spoke lines from center (250,210) to outer grid for each dimension -->
179
+ <g class="spokes" stroke="#e5e7eb" stroke-width="0.5">
180
+ <line x1="250" y1="210" x2="250.0" y2="60.0"/>
181
+ <line x1="250" y1="210" x2="315.1" y2="74.9"/>
182
+ <line x1="250" y1="210" x2="367.3" y2="116.5"/>
183
+ <line x1="250" y1="210" x2="396.2" y2="176.6"/>
184
+ <line x1="250" y1="210" x2="396.2" y2="243.4"/>
185
+ <line x1="250" y1="210" x2="367.3" y2="303.5"/>
186
+ <line x1="250" y1="210" x2="315.1" y2="345.1"/>
187
+ <line x1="250" y1="210" x2="250.0" y2="360.0"/>
188
+ <line x1="250" y1="210" x2="184.9" y2="345.1"/>
189
+ <line x1="250" y1="210" x2="132.7" y2="303.5"/>
190
+ <line x1="250" y1="210" x2="103.8" y2="243.4"/>
191
+ <line x1="250" y1="210" x2="103.8" y2="176.6"/>
192
+ <line x1="250" y1="210" x2="132.7" y2="116.5"/>
193
+ <line x1="250" y1="210" x2="184.9" y2="74.9"/>
194
+ </g>
195
+
196
+ <!-- Score polygon: filled area showing actual scores -->
197
+ <!-- For each dim i (0-13): angle = i*(360/14)-90 deg, score_r = (score/5)*150, x = 250 + score_r*cos(angle_rad), y = 210 + score_r*sin(angle_rad) -->
198
+ <!-- Dimension order: 0=Pain Intensity, 1=Willingness to Pay, 2=Solution Gap, 3=Founder-Market Fit, 4=Urgency, 5=Frequency, 6=Market Size, 7=Defensibility, 8=Market Growth, 9=Scalability, 10=Clarity of Target Customer, 11=Behavior Change Required, 12=Mandatory Nature, 13=Incumbent Indifference -->
199
+ <polygon points="{x_0},{y_0} {x_1},{y_1} {x_2},{y_2} {x_3},{y_3} {x_4},{y_4} {x_5},{y_5} {x_6},{y_6} {x_7},{y_7} {x_8},{y_8} {x_9},{y_9} {x_10},{y_10} {x_11},{y_11} {x_12},{y_12} {x_13},{y_13}" fill="rgba(59,130,246,0.2)" stroke="#3b82f6" stroke-width="2"/>
200
+
201
+ <!-- Dimension labels at radius 175 from center -->
202
+ <g class="labels" font-size="9" fill="#4b5563" font-family="system-ui, sans-serif">
203
+ <text x="250.0" y="35.0" text-anchor="middle" dy="0.35em">Pain Intensity</text>
204
+ <text x="325.9" y="52.3" text-anchor="middle" dy="0.35em">Willingness to Pay</text>
205
+ <text x="386.8" y="100.9" text-anchor="start" dy="0.35em">Solution Gap</text>
206
+ <text x="420.6" y="171.1" text-anchor="start" dy="0.35em">Founder Fit</text>
207
+ <text x="420.6" y="248.9" text-anchor="start" dy="0.35em">Urgency</text>
208
+ <text x="386.8" y="319.1" text-anchor="start" dy="0.35em">Frequency</text>
209
+ <text x="325.9" y="367.7" text-anchor="middle" dy="0.35em">Market Size</text>
210
+ <text x="250.0" y="385.0" text-anchor="middle" dy="0.35em">Defensibility</text>
211
+ <text x="174.1" y="367.7" text-anchor="middle" dy="0.35em">Market Growth</text>
212
+ <text x="113.2" y="319.1" text-anchor="end" dy="0.35em">Scalability</text>
213
+ <text x="79.4" y="248.9" text-anchor="end" dy="0.35em">Target Customer</text>
214
+ <text x="79.4" y="171.1" text-anchor="end" dy="0.35em">Behavior Change</text>
215
+ <text x="113.2" y="100.9" text-anchor="end" dy="0.35em">Mandatory Nature</text>
216
+ <text x="174.1" y="52.3" text-anchor="middle" dy="0.35em">Incumbent</text>
217
+ </g>
218
+
219
+ <!-- Score value dots at each polygon vertex -->
220
+ <g class="dots" fill="#3b82f6">
221
+ <circle cx="{x_0}" cy="{y_0}" r="4"/>
222
+ <circle cx="{x_1}" cy="{y_1}" r="4"/>
223
+ <circle cx="{x_2}" cy="{y_2}" r="4"/>
224
+ <circle cx="{x_3}" cy="{y_3}" r="4"/>
225
+ <circle cx="{x_4}" cy="{y_4}" r="4"/>
226
+ <circle cx="{x_5}" cy="{y_5}" r="4"/>
227
+ <circle cx="{x_6}" cy="{y_6}" r="4"/>
228
+ <circle cx="{x_7}" cy="{y_7}" r="4"/>
229
+ <circle cx="{x_8}" cy="{y_8}" r="4"/>
230
+ <circle cx="{x_9}" cy="{y_9}" r="4"/>
231
+ <circle cx="{x_10}" cy="{y_10}" r="4"/>
232
+ <circle cx="{x_11}" cy="{y_11}" r="4"/>
233
+ <circle cx="{x_12}" cy="{y_12}" r="4"/>
234
+ <circle cx="{x_13}" cy="{y_13}" r="4"/>
235
+ </g>
236
+ </svg>
237
+ </div>
238
+ </div>
239
+
240
+ <!-- RESEARCH HIGHLIGHTS: only include if RESEARCH_AVAILABLE is true. Omit entire section if false. -->
241
+ <div class="card">
242
+ <h2>Research Highlights</h2>
243
+ <p>{Summarize the key findings from the research brief -- Competitors, Market Data, and User Evidence sections. Keep to 3-5 bullet points or a brief paragraph highlighting the most important data points.}</p>
244
+ </div>
245
+
246
+ <!-- SCORECARD TABLE: 14 rows, one per dimension, ordered by weight descending -->
247
+ <div class="card" style="overflow-x:auto;">
248
+ <h2>Scorecard</h2>
249
+ <table class="scorecard-table">
250
+ <thead>
251
+ <tr>
252
+ <th>Dimension</th>
253
+ <th>Score</th>
254
+ <th style="width:120px;"></th>
255
+ <th>Potential</th>
256
+ <th>Evidence</th>
257
+ <th>Key Finding</th>
258
+ </tr>
259
+ </thead>
260
+ <tbody>
261
+ <!-- Repeat for each of 14 dimensions. Score badge uses class score-{N} where N is the integer score (1-5). Progress bar width = score/5 * 100%. Evidence tier badges use the compact notation from the merger. After each dimension row, include a score-explanation row. -->
262
+ <tr>
263
+ <td>{Dimension name}</td>
264
+ <td><span class="score-badge score-{N}">{N}</span></td>
265
+ <td><div class="progress-container"><div class="progress-bar score-{N}" style="width:{N*20}%"></div></div></td>
266
+ <td>{potential}/5</td>
267
+ <td>
268
+ <!-- If tier data available: render badge pills. If "(tier data unavailable)": show that text. -->
269
+ <span class="tier-badge tier-verified">{count}V</span>
270
+ <span class="tier-badge tier-research">{count}R</span>
271
+ <span class="tier-badge tier-founder">{count}F</span>
272
+ <span class="tier-badge tier-assumed">{count}A</span>
273
+ </td>
274
+ <td>{Key finding text}</td>
275
+ </tr>
276
+ <tr class="score-explanation">
277
+ <td colspan="6">{2-3 sentence score explanation from merger blockquote}</td>
278
+ </tr>
279
+ </tbody>
280
+ </table>
281
+ </div>
282
+
283
+ <!-- EVIDENCE QUALITY: stacked percentage bar -->
284
+ <div class="card">
285
+ <h2>Evidence Quality</h2>
286
+ <div class="evidence-bar">
287
+ <div class="ev-verified" style="width:{X}%">{X}% V</div>
288
+ <div class="ev-research" style="width:{Y}%">{Y}% R</div>
289
+ <div class="ev-founder" style="width:{Z}%">{Z}% F</div>
290
+ <div class="ev-assumed" style="width:{W}%">{W}% A</div>
291
+ </div>
292
+ <div style="font-size:0.75rem;color:#6b7280;margin-top:0.25rem;">V=Verified R=Research-Backed F=Founder-Asserted A=Assumed</div>
293
+ </div>
294
+
295
+ <!-- ASSUMPTION IMPACT: only include if assumption impact items exist -->
296
+ <div class="card">
297
+ <h2>Assumption Impact</h2>
298
+ <ul class="item-list">
299
+ <li><span class="dim-tag">{Dimension}</span> If {unconfirmed hypothesis} is confirmed, score rises from {X} to {Y} (+{impact} on total)</li>
300
+ </ul>
301
+ </div>
302
+
303
+ <!-- STRENGTHS & WEAKNESSES: two-column layout -->
304
+ <div class="two-col">
305
+ <div class="card">
306
+ <h2>Top 3 Strengths</h2>
307
+ <ol>
308
+ <li><strong>{Dimension}</strong> ({X}/5): {Why this is strong}</li>
309
+ </ol>
310
+ </div>
311
+ <div class="card">
312
+ <h2>Top 3 Weaknesses</h2>
313
+ <ol>
314
+ <li><strong>{Dimension}</strong> ({X}/5): {Why this is weak}</li>
315
+ </ol>
316
+ </div>
317
+ </div>
318
+
319
+ <!-- NEXT STEPS -->
320
+ <div class="card">
321
+ <h2>Next Steps</h2>
322
+ <ol class="item-list">
323
+ <li>{Concrete validation task} -- <span class="dim-tag">{Dimension}</span> {current}/5 -> {potential}/5 (+{uplift} on total)</li>
324
+ </ol>
325
+ </div>
326
+
327
+ <footer>
328
+ Generated by TweakIdea &middot; {TIMESTAMP}
329
+ </footer>
330
+ </div>
331
+ </body>
332
+ </html>
333
+ ```
334
+
335
+ ---
336
+
337
+ ## Generation Rules
338
+
339
+ - Copy the HTML template structure EXACTLY. Do not invent new CSS classes, sections, or layout elements.
340
+ - Fill in `{placeholder}` values with actual data extracted from FINAL_REPORT, IDEA_TEXT, and RESEARCH_RESULTS.
341
+ - For each of the 14 scorecard rows: use the integer score to select the CSS class (`score-1` through `score-5`) and compute the progress bar width percentage (score * 20).
342
+ - For the verdict banner: map the verdict prefix to the CSS class: label starts with "GO" = `verdict-go`, label starts with "PIVOT" = `verdict-pivot`, label starts with "STOP" = `verdict-stop`.
343
+ - If zero dealbreakers exist, omit the dealbreaker div(s) entirely.
344
+ - If RESEARCH_AVAILABLE is false, omit the "Research Highlights" card entirely.
345
+ - If a dimension shows `(tier data unavailable)` in the Evidence column instead of tier counts, render that text plain (no badge pills).
346
+ - If a dimension shows `--` in the Evidence column (e.g., Scalability with no compound tags), render "(tier data unavailable)".
347
+ - If no assumption impact items exist, omit the "Assumption Impact" card entirely.
348
+ - The `{TIMESTAMP}` in the header and footer uses the same TIMESTAMP generated in Stage 6 Step 1.
349
+ - All text content must be HTML-escaped (& -> `&amp;`, < -> `&lt;`, > -> `&gt;`) to prevent broken HTML from idea text containing special characters.
350
+ - For each scorecard dimension, extract the blockquote explanation line (starting with `>`) that follows the table row in FINAL_REPORT. Strip the `>` prefix and the bold dimension name prefix (e.g., `> **Pain Intensity:** ` becomes just the explanation text). Place the stripped text in the `<tr class="score-explanation">` row's `<td colspan="6">`.
351
+ - **Radar chart generation:** Compute SVG coordinates using the formula: center=(250,210), max_radius=150. For dimension index i (0-based, 0 through 13), angle_i = i * (360/14) - 90 degrees (so index 0 = Pain Intensity starts at top). Convert to radians: radian_i = angle_i * PI / 180. Score vertex: x = 250 + (score/5)*150*cos(radian_i), y = 210 + (score/5)*150*sin(radian_i). Grid polygon vertices use the same angles but with fixed radii (30, 60, 90, 120, 150). Dimension labels use radius 175. Use the Dimension Registry index order (01 through 14) for consistent spoke ordering. Abbreviate long dimension names: "Founder Fit" for "Founder-Market Fit", "Target Customer" for "Clarity of Target Customer", "Behavior Change" for "Behavior Change Required", "Incumbent" for "Incumbent Indifference".
352
+ - **Radar chart label positioning:** For labels at angles -45 to 45 degrees (right side), use text-anchor="start". For 135 to 225 degrees (left side), use text-anchor="end". For all others (top and bottom), use text-anchor="middle". Apply a dy="0.35em" baseline shift for vertical centering.
@@ -0,0 +1,63 @@
1
+ # Startup Problem Evaluation Dimensions
2
+
3
+ > Per-dimension signal tables and rubrics are in the `dimensions/` subdirectory. Each evaluator agent receives its assigned dimension file via prompt injection.
4
+
5
+ ---
6
+
7
+ ## Scoring Algorithm
8
+
9
+ Score = highest level where ALL criteria pass. If any criterion at a level fails, score drops to the previous level.
10
+
11
+ For criteria depending on an [UNCONFIRMED] hypothesis: mark as CONDITIONAL. CONDITIONAL criteria are treated as FAIL for actual score, PASS for potential score.
12
+
13
+ ## Evidence Tier Classification
14
+
15
+ | Condition | Tier |
16
+ |-----------|------|
17
+ | Founder confirmed AND research supports | Verified |
18
+ | Research supports, founder did not confirm | Research-Backed |
19
+ | Founder confirmed, no research support | Founder-Asserted |
20
+ | Inferred from reasoning, no direct support | Assumed |
21
+
22
+ ---
23
+
24
+ ## Problem Type Matrix
25
+
26
+ Categorize problems by intensity vs. breadth:
27
+
28
+ | Type | Description | Strategy |
29
+ |------|-------------|----------|
30
+ | **Type 1**: Many people, intense pain | Mass-market painkiller | Scale fast, network effects |
31
+ | **Type 2**: Many people, mild pain | Mass-market vitamin | Elevate urgency, make seamless |
32
+ | **Type 3**: Few people, intense pain | Niche painkiller | Deep value, high price, strong loyalty |
33
+ | **Type 4**: Few people, mild pain | Avoid | Hard to monetize, hard to find customers |
34
+
35
+ ---
36
+
37
+ ## Dimension Registry
38
+
39
+ > **Canonical source of truth.** All dimension metadata lives in this table. Agents receive registry values via orchestrator prompt injection at spawn time (D-06). Do not duplicate this data elsewhere.
40
+
41
+ | # | Name | Weight | File Slug | Output Filename | Research Cluster | Context Variant |
42
+ |---|------|--------|-----------|-----------------|------------------|-----------------|
43
+ | 01 | Pain Intensity | 12% | pain-intensity | 01-pain-intensity.md | USER_CLUSTER | EVALUATION_CONTEXT |
44
+ | 02 | Willingness to Pay | 12% | willingness-to-pay | 02-willingness-to-pay.md | USER_CLUSTER | EVALUATION_CONTEXT |
45
+ | 03 | Solution Gap | 12% | solution-gap | 03-solution-gap.md | COMPETITIVE_CLUSTER | EVALUATION_CONTEXT |
46
+ | 04 | Founder-Market Fit | 12% | founder-market-fit | 04-founder-market-fit.md | — | FOUNDER_EVALUATION_CONTEXT |
47
+ | 05 | Urgency | 8% | urgency | 05-urgency.md | USER_CLUSTER | EVALUATION_CONTEXT |
48
+ | 06 | Frequency | 8% | frequency | 06-frequency.md | — | EVALUATION_CONTEXT |
49
+ | 07 | Market Size | 8% | market-size | 07-market-size.md | MARKET_CLUSTER | EVALUATION_CONTEXT |
50
+ | 08 | Defensibility | 8% | defensibility | 08-defensibility.md | COMPETITIVE_CLUSTER | EVALUATION_CONTEXT |
51
+ | 09 | Market Growth | 4% | market-growth | 09-market-growth.md | MARKET_CLUSTER | EVALUATION_CONTEXT |
52
+ | 10 | Scalability | 4% | scalability | 10-scalability.md | — | EVALUATION_CONTEXT |
53
+ | 11 | Clarity of Target Customer | 4% | clarity-of-target-customer | 11-clarity-of-target-customer.md | — | EVALUATION_CONTEXT |
54
+ | 12 | Behavior Change Required | 4% | behavior-change-required | 12-behavior-change-required.md | — | EVALUATION_CONTEXT |
55
+ | 13 | Mandatory Nature | 2% | mandatory-nature | 13-mandatory-nature.md | — | EVALUATION_CONTEXT |
56
+ | 14 | Incumbent Indifference | 2% | incumbent-indifference | 14-incumbent-indifference.md | COMPETITIVE_CLUSTER | EVALUATION_CONTEXT |
57
+
58
+ ## Interpretation
59
+
60
+ - 4.0-5.0: GO -- Strong problem, worth pursuing
61
+ - 3.0-3.99: PIVOT -- Promising, address weak areas
62
+ - 2.0-2.99: STOP -- Significant concerns, reconsider
63
+ - 1.0-1.99: STOP -- Likely not worth pursuing
@@ -0,0 +1,7 @@
1
+ ---
2
+ name: ti-scoring
3
+ description: TweakIdea 14-dimension startup evaluation framework with scoring rubrics and signal tables
4
+ user-invocable: false
5
+ ---
6
+
7
+ Per-dimension signal tables and rubrics are in the `dimensions/` subdirectory. The scoring algorithm, evidence tiers, weights, and verdict thresholds are in `EVALUATION.md`.