markform 0.1.4 → 0.1.5

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 (28) hide show
  1. package/README.md +40 -53
  2. package/dist/ai-sdk.d.mts +1 -1
  3. package/dist/ai-sdk.mjs +1 -1
  4. package/dist/{apply-C54EMAJ1.mjs → apply-BCCiJzQr.mjs} +3 -3
  5. package/dist/bin.mjs +3 -3
  6. package/dist/{cli-BhWhn6L9.mjs → cli-D469amuk.mjs} +5 -11
  7. package/dist/cli.mjs +3 -3
  8. package/dist/{coreTypes-cbNTYAcb.d.mts → coreTypes-9XZSNOv6.d.mts} +2 -2
  9. package/dist/index.d.mts +1 -1
  10. package/dist/index.mjs +2 -2
  11. package/dist/{src-BNh7Cx9P.mjs → src-Df0XX7UB.mjs} +19 -6
  12. package/docs/markform-reference.md +19 -19
  13. package/docs/markform-spec.md +20 -20
  14. package/examples/earnings-analysis/earnings-analysis.form.md +86 -808
  15. package/examples/earnings-analysis/earnings-analysis.valid.ts +16 -148
  16. package/examples/movie-research/movie-research-basic.form.md +16 -16
  17. package/examples/movie-research/movie-research-deep.form.md +36 -36
  18. package/examples/movie-research/movie-research-minimal.form.md +4 -4
  19. package/examples/simple/simple-mock-filled.form.md +16 -16
  20. package/examples/simple/simple-skipped-filled.form.md +16 -16
  21. package/examples/simple/simple-with-skips.session.yaml +3 -3
  22. package/examples/simple/simple.form.md +16 -16
  23. package/examples/simple/simple.session.yaml +3 -3
  24. package/examples/startup-deep-research/startup-deep-research.form.md +22 -22
  25. package/examples/startup-research/startup-research-mock-filled.form.md +12 -12
  26. package/examples/startup-research/startup-research.form.md +12 -12
  27. package/package.json +1 -1
  28. package/examples/celebrity-deep-research/celebrity-deep-research.form.md +0 -967
@@ -1,880 +1,158 @@
1
1
  ---
2
2
  markform:
3
3
  spec: MF/0.1
4
- title: Company Quarterly Analysis
5
- description: Financial analysis with one user field (company) and agent-filled quarterly analysis sections.
4
+ title: Earnings Analysis
5
+ description: Company earnings analysis with key metrics, outlook, and custom validators.
6
6
  roles:
7
7
  - user
8
8
  - agent
9
9
  role_instructions:
10
- user: "Enter company identification (legal name, ticker, fiscal year) and the quarter you want analyzed."
11
- agent: "Complete the company profile and quarterly analysis based on the provided company context."
12
- harness_config:
13
- max_issues_per_turn: 5
14
- max_patches_per_turn: 10
10
+ user: "Enter the company name and ticker symbol."
11
+ agent: |
12
+ Research the company and fill in the key financial metrics and analysis.
13
+ Focus on the most recent quarterly results and forward outlook.
15
14
  ---
15
+ {% form id="earnings_analysis" title="Earnings Analysis" %}
16
16
 
17
- {% form id="company_analysis" title="Company Quarterly Analysis Worksheet" %}
17
+ ## Company Earnings Analysis
18
18
 
19
- {% description ref="company_analysis" %}
20
- This worksheet supports systematic research on a company for a given quarter.
21
- It has two parts: a relatively static company profile, and a period-specific analysis section.
22
- {% /description %}
19
+ {% group id="company_input" title="Company Identification" %}
23
20
 
24
- {% documentation ref="company_analysis" %}
25
- **Part 1: Company Profile** — Foundational information that changes slowly.
26
- Update as needed but expect most content to persist quarter-to-quarter.
21
+ Which company do you want to analyze? \[*This field is filled in by the user (`role="user"`).*\]
27
22
 
28
- **Part 2: Quarterly Analysis** Period-specific analysis.
29
- Complete fresh each quarter.
30
- {% /documentation %}
23
+ {% field kind="string" id="company" label="Company" role="user" required=true minLength=1 maxLength=300 %}{% /field %}
24
+ {% instructions ref="company" %}Enter the company name and ticker symbol (e.g., "Apple (AAPL)" or "Microsoft MSFT").{% /instructions %}
31
25
 
32
- <!-- PART 1: COMPANY PROFILE -->
26
+ {% /group %}
33
27
 
34
- {% field-group id="identity_structure" title="1. Identity and Structure" %}
28
+ ## Company Overview
35
29
 
36
- {% field kind="string" id="company_legal_name" label="Company legal name" role="user" required=true %}{% /field %}
30
+ {% group id="company_overview" title="Company Overview" %}
37
31
 
38
- {% field kind="string_list" id="tickers" label="Ticker(s)" role="user" required=true minItems=1 %}{% /field %}
32
+ **Company name:**
39
33
 
40
- {% instructions ref="tickers" %}
41
- List at least one ticker symbol. Add multiple if the company trades on different exchanges.
42
- {% /instructions %}
34
+ {% field kind="string" id="company_name" label="Company Name" role="agent" required=true %}{% /field %}
35
+ {% instructions ref="company_name" %}Official company name.{% /instructions %}
43
36
 
44
- {% field kind="string" id="hq_regions" label="HQ / key operating regions" required=true %}{% /field %}
37
+ **Ticker symbol:**
45
38
 
46
- {% field kind="string" id="fiscal_year_end" label="Fiscal year end" role="user" required=true pattern="^(0[1-9]|1[0-2])(-(0[1-9]|[12][0-9]|3[01]))?$|^(January|February|March|April|May|June|July|August|September|October|November|December)$" %}{% /field %}
39
+ {% field kind="string" id="ticker" label="Ticker Symbol" role="agent" required=true %}{% /field %}
47
40
 
48
- {% instructions ref="fiscal_year_end" %}
49
- Enter month name (e.g., December) or MM-DD format (e.g., 12-31).
50
- {% /instructions %}
41
+ **Exchange:**
51
42
 
52
- {% field kind="single_select" id="reporting_cadence" label="Reporting cadence" required=true %}
53
- - [ ] Yearly {% #yearly %}
54
- - [ ] Quarterly {% #quarterly %}
55
- - [ ] Monthly {% #monthly %}
56
- {% /field %}
57
-
58
- {% field kind="multi_select" id="business_model_type" label="Business model type" required=true minSelections=1 %}
59
- - [ ] One-time hardware {% #one_time_hardware %}
60
- - [ ] Recurring subscription {% #recurring_subscription %}
61
- - [ ] Usage-based {% #usage_based %}
62
- - [ ] Advertising {% #advertising %}
63
- - [ ] Marketplace / take rate {% #marketplace %}
64
- - [ ] Licensing {% #licensing %}
65
- - [ ] Services / consulting {% #services %}
66
- - [ ] Financial / credit {% #financial %}
67
- {% /field %}
68
-
69
- {% instructions ref="business_model_type" %}
70
- Check all that apply. At least one is required.
71
- {% /instructions %}
72
-
73
- {% field kind="string" id="business_model_other" label="Other business model (if applicable)" %}{% /field %}
43
+ {% field kind="string" id="exchange" label="Exchange" role="agent" %}{% /field %}
44
+ {% instructions ref="exchange" %}Primary stock exchange (e.g., NYSE, NASDAQ).{% /instructions %}
74
45
 
75
- {% instructions ref="business_model_other" %}
76
- Describe any other business model types not covered above.
77
- {% /instructions %}
46
+ **Sector:**
78
47
 
79
- {% field kind="string_list" id="subsidiaries" label="Subsidiaries / key entities" minItems=0 %}{% /field %}
48
+ {% field kind="string" id="sector" label="Sector" role="agent" %}{% /field %}
80
49
 
81
- {% field kind="string" id="company_summary" label="One-paragraph summary (plain English)" required=true validate=[{id: "min_words", min: 100}] %}{% /field %}
50
+ **Business summary:**
82
51
 
83
- {% instructions ref="company_summary" %}
84
- Provide a plain-English summary of what the company does. Minimum 100 words (approximately 400 characters).
85
- {% /instructions %}
52
+ {% field kind="string" id="business_summary" label="Business Summary" role="agent" maxLength=500 validate=[{id: "min_words", min: 20}] %}{% /field %}
53
+ {% instructions ref="business_summary" %}Brief description of what the company does. Minimum 20 words.{% /instructions %}
86
54
 
87
- {% /field-group %}
55
+ **Revenue segments:**
88
56
 
89
- {% field-group id="history_evolution" title="2. History and Evolution" %}
57
+ {% field kind="string_list" id="revenue_segments" label="Revenue Segments" role="agent" minItems=1 validate=[{id: "sum_to_percent_list", target: 100}] %}{% /field %}
58
+ {% instructions ref="revenue_segments" %}List each segment with percentage of revenue. Format: "Segment Name: XX%". Should sum to 100%.{% /instructions %}
90
59
 
91
- {% field kind="string_list" id="timeline_pivots" label="Timeline (key pivots)" required=true minItems=8 maxItems=12 %}{% /field %}
60
+ {% /group %}
92
61
 
93
- {% instructions ref="timeline_pivots" %}
94
- List 8-12 key pivotal moments in the company's history. One event per line.
95
- {% /instructions %}
62
+ ## Recent Earnings
96
63
 
97
- {% field kind="string" id="transformative_acquisitions" label="Transformative acquisitions / divestitures" %}{% /field %}
64
+ {% group id="recent_earnings" title="Recent Earnings" %}
98
65
 
99
- {% field kind="string" id="leadership_changes" label="Leadership changes that mattered" %}{% /field %}
66
+ **Fiscal quarter:**
100
67
 
101
- {% field kind="string" id="past_crises" label="Past crises and responses" %}{% /field %}
68
+ {% field kind="string" id="fiscal_quarter" label="Fiscal Quarter" role="agent" required=true %}{% /field %}
69
+ {% instructions ref="fiscal_quarter" %}Most recent reported quarter (e.g., "Q3 FY2024" or "Q4 2024").{% /instructions %}
102
70
 
103
- {% field kind="string" id="strategic_move_analysis" label="What single strategic move best explains the current model?" required=true validate=[{id: "min_words", min: 50}] %}{% /field %}
71
+ **Revenue:**
104
72
 
105
- {% instructions ref="strategic_move_analysis" %}
106
- Analyst prompt: Explain the strategic move that best explains the current business model. Minimum 50 words.
107
- {% /instructions %}
73
+ {% field kind="number" id="revenue" label="Revenue (millions)" role="agent" %}{% /field %}
74
+ {% instructions ref="revenue" %}Total revenue in millions USD.{% /instructions %}
108
75
 
109
- {% /field-group %}
110
-
111
- {% field-group id="operations_distribution" title="3. Operations and Distribution" %}
112
-
113
- {% field kind="string" id="core_operating_activities" label="Core operating activities (R&D, manufacturing, distribution)" required=true %}{% /field %}
114
-
115
- {% field kind="string" id="key_locations" label="Key locations (R&D hubs, manufacturing, data centers)" %}{% /field %}
116
-
117
- {% field kind="multi_select" id="distribution_model" label="Distribution model" required=true minSelections=1 %}
118
- - [ ] Direct (online / retail / salesforce) {% #direct %}
119
- - [ ] Channel / resellers {% #channel %}
120
- - [ ] Carrier / VARs {% #carrier_vars %}
121
- - [ ] Marketplace / app store {% #marketplace_appstore %}
122
- - [ ] OEM / embedded {% #oem_embedded %}
123
- {% /field %}
76
+ **Revenue growth YoY:**
124
77
 
125
- {% field kind="string" id="distribution_model_other" label="Other distribution model (if applicable)" %}{% /field %}
78
+ {% field kind="number" id="revenue_growth" label="Revenue Growth YoY (%)" role="agent" min=-100 max=1000 %}{% /field %}
126
79
 
127
- {% field kind="string" id="direct_indirect_mix" label="Mix of direct vs indirect (if disclosed)" %}{% /field %}
80
+ **EPS:**
128
81
 
129
- {% instructions ref="direct_indirect_mix" %}
130
- Enter percentages that should sum to 100% (e.g., "Direct: 60%, Indirect: 40%").
131
- {% /instructions %}
82
+ {% field kind="number" id="eps" label="Earnings Per Share" role="agent" %}{% /field %}
83
+ {% instructions ref="eps" %}Diluted EPS for the quarter.{% /instructions %}
132
84
 
133
- {% field kind="string" id="key_partners" label="Key partners required to deliver the product" %}{% /field %}
134
-
135
- {% field kind="string" id="capacity_constraints" label="Capacity constraints / bottlenecks" %}{% /field %}
136
-
137
- {% /field-group %}
138
-
139
- {% field-group id="offerings_primary" title="4.1 Offerings - Primary Family" %}
140
-
141
- {% description ref="offerings_primary" %}
142
- Tie every revenue line to something someone buys. Use "families," not SKUs.
143
- This section ideally uses repeating groups (future feature). For now, model one offering family.
144
- {% /description %}
145
-
146
- {% field kind="string" id="offering_1_name" label="Offering family name" required=true %}{% /field %}
147
-
148
- {% field kind="string" id="offering_1_value_prop" label="Value proposition (1 sentence)" required=true maxLength=250 %}{% /field %}
149
-
150
- {% instructions ref="offering_1_value_prop" %}
151
- Maximum 50 words. Describe the core value in one sentence.
152
- {% /instructions %}
153
-
154
- {% field kind="single_select" id="offering_1_delivery" label="Delivery type" required=true %}
155
- - [ ] Physical {% #physical %}
156
- - [ ] Digital {% #digital %}
157
- - [ ] Hybrid {% #hybrid %}
158
- {% /field %}
85
+ **Beat/miss consensus:**
159
86
 
160
- {% field kind="single_select" id="offering_1_revenue_type" label="Revenue type" required=true %}
161
- - [ ] One-time {% #one_time %}
162
- - [ ] Subscription {% #subscription %}
163
- - [ ] Usage-based {% #usage %}
164
- - [ ] Take-rate {% #take_rate %}
165
- - [ ] Advertising {% #ads %}
87
+ {% field kind="single_select" id="beat_miss" label="Beat/Miss Consensus" role="agent" %}
88
+ - [ ] Beat {% #beat %}
89
+ - [ ] Met {% #met %}
90
+ - [ ] Missed {% #missed %}
166
91
  {% /field %}
167
92
 
168
- {% field kind="string_list" id="offering_1_kpis" label="Primary KPIs" required=true minItems=1 maxItems=5 %}{% /field %}
169
-
170
- {% /field-group %}
171
-
172
- {% field-group id="offerings_bundles" title="4.2 Offerings - Bundles and Cross-Sell" %}
173
-
174
- {% field kind="string" id="what_is_bundled" label="What is bundled?" %}{% /field %}
175
-
176
- {% field kind="string" id="attach_paths" label="Attach paths (what gets added after first purchase)" %}{% /field %}
177
-
178
- {% field kind="string" id="cannibalization_risks" label="Cannibalization risks" %}{% /field %}
179
-
180
- {% /field-group %}
181
-
182
- {% field-group id="pricing_structure" title="5.1 Pricing Structure" %}
183
-
184
- {% description ref="pricing_structure" %}
185
- Make "pricing power" concrete.
186
- {% /description %}
187
-
188
- {% field kind="string" id="pricing_offering_name" label="Offering family" required=true %}{% /field %}
189
-
190
- {% field kind="string" id="list_price_range" label="List price / typical range" required=true %}{% /field %}
191
-
192
- {% instructions ref="list_price_range" %}
193
- Include currency and range (e.g., "$99-$499 USD" or "€50/month").
194
- {% /instructions %}
195
-
196
- {% field kind="multi_select" id="discounting_norms" label="Discounting norms" %}
197
- - [ ] None {% #none %}
198
- - [ ] Seasonal {% #seasonal %}
199
- - [ ] Channel promos {% #channel_promos %}
200
- - [ ] Enterprise {% #enterprise %}
201
- - [ ] Bundles {% #bundles %}
202
- {% /field %}
203
-
204
- {% field kind="string" id="contract_length" label="Contract length (B2B)" %}{% /field %}
205
-
206
- {% field kind="string" id="contract_renewal" label="Renewal terms" %}{% /field %}
207
-
208
- {% field kind="string" id="contract_escalators" label="Price escalators" %}{% /field %}
209
-
210
- {% field kind="string" id="payer_vs_user" label="Who pays vs who uses" %}{% /field %}
211
-
212
- {% field kind="string" id="arpu_asp_drivers" label="ARPU/ASP drivers" %}{% /field %}
93
+ **Beat/miss details:**
213
94
 
214
- {% field kind="string" id="pricing_changes_recent" label="Pricing changes last 12-18 months" %}{% /field %}
95
+ {% field kind="string" id="beat_miss_details" label="Beat/Miss Details" role="agent" validate=[{id: "required_if_set", when: "beat_miss"}] %}{% /field %}
96
+ {% instructions ref="beat_miss_details" %}Required if beat/miss is selected. Explain the variance from consensus.{% /instructions %}
215
97
 
216
- {% /field-group %}
98
+ {% /group %}
217
99
 
218
- {% field-group id="pricing_margins" title="5.2 Margin and Cost Structure" %}
100
+ ## Key Metrics
219
101
 
220
- {% field kind="string" id="primary_cost_drivers" label="Primary cost drivers (COGS, hosting, labor, content, etc.)" required=true %}{% /field %}
102
+ {% group id="key_metrics" title="Key Metrics" %}
221
103
 
222
- {% field kind="string" id="gross_margin_drivers" label="Gross margin drivers (pricing, mix, utilization, scale, FX)" %}{% /field %}
104
+ **Gross margin:**
223
105
 
224
- {% field kind="string" id="contribution_margin_framework" label="Contribution margin framework (if applicable)" %}{% /field %}
225
-
226
- {% field kind="number" id="cac" label="Customer Acquisition Cost (CAC)" %}{% /field %}
227
-
228
- {% field kind="string" id="payback_period" label="Payback period" %}{% /field %}
229
-
230
- {% field kind="number" id="ltv" label="Lifetime Value (LTV)" %}{% /field %}
231
-
232
- {% field kind="number" id="churn_rate" label="Churn rate (%)" min=0 max=100 %}{% /field %}
233
-
234
- {% field kind="string" id="operating_leverage" label="Operating leverage (fixed vs variable costs)" %}{% /field %}
235
-
236
- {% field kind="string" id="margin_risks" label="Biggest margin risks" %}{% /field %}
237
-
238
- {% /field-group %}
239
-
240
- {% field-group id="customers_segmentation" title="6.1 Customer Segmentation" %}
241
-
242
- {% field kind="string" id="segment_1" label="Segment 1 (size, needs, willingness to pay)" required=true %}{% /field %}
243
-
244
- {% field kind="string" id="segment_2" label="Segment 2" required=true %}{% /field %}
245
-
246
- {% field kind="string" id="segment_3" label="Segment 3" %}{% /field %}
247
-
248
- {% field kind="string" id="geography_mix" label="Geography mix" required=true %}{% /field %}
249
-
250
- {% instructions ref="geography_mix" %}
251
- Enter percentages that should sum to 100% (e.g., "Americas: 55%, EMEA: 30%, APAC: 15%").
252
- {% /instructions %}
253
-
254
- {% field kind="string" id="buyer_user_influencer" label="Buyer vs user vs influencer" %}{% /field %}
255
-
256
- {% /field-group %}
257
-
258
- {% field-group id="customers_buying" title="6.2 Buying Motion" %}
259
-
260
- {% field kind="string" id="purchase_trigger" label="What triggers purchase?" required=true %}{% /field %}
261
-
262
- {% field kind="string" id="decision_cycle_length" label="Decision cycle length" %}{% /field %}
263
-
264
- {% field kind="string" id="replacement_upgrade_cycle" label="Replacement/upgrade cycle (if relevant)" %}{% /field %}
265
-
266
- {% field kind="string" id="retention_churn_drivers" label="Retention/churn drivers (if recurring)" %}{% /field %}
267
-
268
- {% /field-group %}
269
-
270
- {% field-group id="customers_concentration" title="6.3 Concentration and Notable Customers" %}
271
-
272
- {% field kind="number" id="top_customer_concentration" label="Customer concentration risk (top customer %)" min=0 max=100 %}{% /field %}
273
-
274
- {% field kind="string" id="notable_customers" label="Notable customers / logos (B2B)" %}{% /field %}
275
-
276
- {% field kind="string" id="channel_dependencies" label="Channel partner dependencies" %}{% /field %}
277
-
278
- {% /field-group %}
279
-
280
- {% field-group id="market_competition" title="7. Market and Competition" %}
281
-
282
- {% field kind="string" id="primary_markets" label="Primary markets competed in" required=true %}{% /field %}
283
-
284
- {% field kind="string" id="tam_sam_som" label="TAM/SAM/SOM (and confidence)" %}{% /field %}
285
-
286
- {% instructions ref="tam_sam_som" %}
287
- Include currency values with confidence level (e.g., "TAM: $50B (high), SAM: $10B (medium), SOM: $500M (low)").
288
- {% /instructions %}
289
-
290
- {% field kind="string" id="market_growth_cyclicality" label="Market growth rate and cyclicality" %}{% /field %}
291
-
292
- {% field kind="string" id="competitors" label="Competitors by category (direct + substitutes)" required=true %}{% /field %}
293
-
294
- {% field kind="string_list" id="basis_of_competition" label="Basis of competition (ranked top 5)" required=true minItems=5 maxItems=5 %}{% /field %}
295
-
296
- {% instructions ref="basis_of_competition" %}
297
- List exactly 5 competitive factors, ranked by importance. First item is most important.
298
- {% /instructions %}
299
-
300
- {% field kind="multi_select" id="moat_diagnosis" label="Moat diagnosis" %}
301
- - [ ] Switching costs {% #switching_costs %}
302
- - [ ] Network effects {% #network_effects %}
303
- - [ ] Brand {% #brand %}
304
- - [ ] Scale / cost advantage {% #scale %}
305
- - [ ] IP {% #ip %}
306
- - [ ] Regulatory barriers {% #regulatory %}
307
- - [ ] Distribution advantage {% #distribution %}
308
- - [ ] Ecosystem {% #ecosystem %}
309
- - [ ] Data advantage {% #data %}
310
- {% /field %}
106
+ {% field kind="number" id="gross_margin" label="Gross Margin (%)" role="agent" min=0 max=100 %}{% /field %}
311
107
 
312
- {% field kind="string" id="moat_explanation" label="Moat explanation" validate=[{id: "required_if", when: "moat_diagnosis"}] %}{% /field %}
108
+ **Operating margin:**
313
109
 
314
- {% instructions ref="moat_explanation" %}
315
- Required if any moat is checked above. Explain why these moats apply. Minimum 25 words.
316
- {% /instructions %}
110
+ {% field kind="number" id="operating_margin" label="Operating Margin (%)" role="agent" min=-100 max=100 %}{% /field %}
317
111
 
318
- {% field kind="string" id="competitive_risks" label="Competitive risks (price wars, bundling, platform shifts)" %}{% /field %}
112
+ **Market cap:**
319
113
 
320
- {% /field-group %}
114
+ {% field kind="number" id="market_cap" label="Market Cap (billions)" role="agent" %}{% /field %}
115
+ {% instructions ref="market_cap" %}Current market capitalization in billions USD.{% /instructions %}
321
116
 
322
- {% field-group id="supply_constraints" title="8.1 Supply Constraints" %}
117
+ **P/E ratio:**
323
118
 
324
- {% field kind="string" id="key_inputs_suppliers" label="Key inputs / suppliers / single-source dependencies" required=true %}{% /field %}
119
+ {% field kind="number" id="pe_ratio" label="P/E Ratio" role="agent" %}{% /field %}
120
+ {% instructions ref="pe_ratio" %}Trailing twelve month P/E ratio.{% /instructions %}
325
121
 
326
- {% field kind="string" id="manufacturing_model" label="Manufacturing/fulfillment model" %}{% /field %}
122
+ {% /group %}
327
123
 
328
- {% field kind="string" id="critical_commodities" label="Critical commodities / bottlenecks" %}{% /field %}
329
-
330
- {% field kind="string" id="logistics_inventory_risks" label="Logistics and inventory risks" %}{% /field %}
331
-
332
- {% field kind="string" id="geopolitical_choke_points" label="Geopolitical choke points" %}{% /field %}
333
-
334
- {% /field-group %}
335
-
336
- {% field-group id="macro_sensitivity" title="8.2 Macro Sensitivity" %}
337
-
338
- {% field kind="string_list" id="macro_variables" label="Top 5 macro variables that historically mattered" required=true minItems=5 maxItems=5 %}{% /field %}
339
-
340
- {% instructions ref="macro_variables" %}
341
- List exactly 5 macro variables, ranked by importance.
342
- {% /instructions %}
343
-
344
- {% field kind="string" id="transmission_mechanism" label="Transmission mechanism (how each impacts revenue/margin/cash)" required=true validate=[{id: "min_words", min: 50}] %}{% /field %}
345
-
346
- {% instructions ref="transmission_mechanism" %}
347
- Minimum 50 words. Explain how each macro variable impacts the business.
348
- {% /instructions %}
349
-
350
- {% field kind="string" id="historical_episodes" label="Historical episodes (recession/inflation/FX/supply shock)" %}{% /field %}
351
-
352
- {% field kind="string" id="leading_indicators" label="Leading indicators to monitor pre-earnings" %}{% /field %}
353
-
354
- {% /field-group %}
355
-
356
- {% field-group id="financial_history" title="9. Financial History" %}
357
-
358
- {% field kind="string" id="trend_summary" label="3-5 year trend summary (revenue, margin, EPS, FCF)" required=true validate=[{id: "min_words", min: 75}] %}{% /field %}
359
-
360
- {% instructions ref="trend_summary" %}
361
- Minimum 75 words. Cover revenue, margin, EPS, and free cash flow trends.
362
- {% /instructions %}
363
-
364
- {% field kind="string" id="capital_return_policy" label="Capital return policy (buybacks/dividends)" %}{% /field %}
365
-
366
- {% field kind="string" id="major_inflection_points" label="Major inflection points (product cycles, pricing shifts, regulation)" %}{% /field %}
367
-
368
- {% field kind="string" id="stock_performance_context" label="Stock performance context (vs index/peers)" %}{% /field %}
369
-
370
- {% field kind="string" id="multiples_vs_history" label="Multiples context vs history" %}{% /field %}
371
-
372
- {% /field-group %}
373
-
374
- {% field-group id="open_questions_profile" title="10. Open Questions" %}
375
-
376
- {% field kind="string_list" id="unanswered_questions" label="Top unanswered questions (ranked by impact)" minItems=0 maxItems=10 %}{% /field %}
377
-
378
- {% field kind="string" id="how_to_answer" label="How to answer (data / calls / sources)" %}{% /field %}
379
-
380
- {% field kind="string" id="deadline" label="Deadline (before earnings, next quarter, etc.)" pattern="^\\d{4}-\\d{2}-\\d{2}$|^[A-Za-z].*$" %}{% /field %}
381
-
382
- {% instructions ref="deadline" %}
383
- Enter a date (YYYY-MM-DD format) or descriptive text (e.g., "Before Q2 earnings").
384
- {% /instructions %}
385
-
386
- {% /field-group %}
387
-
388
- <!-- PART 2: QUARTERLY ANALYSIS -->
389
-
390
- {% field-group id="quarterly_cover" title="Q1. Cover Sheet" %}
391
-
392
- {% description ref="quarterly_cover" %}
393
- This section is period-specific. Complete fresh each quarter.
394
- {% /description %}
395
-
396
- {% instructions ref="quarterly_cover" %}
397
- **Recommended Operating Cadence:**
398
- - **T-21 to T-14:** Refresh model + read filings; pick "what matters this quarter"
399
- - **T-14 to T-7:** Build expectations stack; peer read-across; gather alt data / checks
400
- - **T-7 to T-2:** Base/Bull/Bear scenarios + probabilities; pre-mortem; draft trade structure
401
- - **T-1:** Confirm options pricing + positioning; finalize risks and stops
402
- - **Earnings day:** Watchlist + rapid interpretation plan
403
- - **T+1 to T+2:** Post-mortem; update model; document learnings
404
- {% /instructions %}
405
-
406
- {% field kind="string" id="pre_earnings_thesis" label="One-sentence thesis (pre-earnings)" required=true maxLength=250 %}{% /field %}
407
-
408
- {% instructions ref="pre_earnings_thesis" %}
409
- Maximum 50 words. State your core thesis before the earnings release.
410
- {% /instructions %}
411
-
412
- {% field kind="string_list" id="what_matters_top_3" label="What matters this quarter (top 3 drivers)" required=true minItems=3 maxItems=3 %}{% /field %}
413
-
414
- {% /field-group %}
415
-
416
- {% field-group id="sources_log" title="Q2.1 Sourcing Log" %}
417
-
418
- {% description ref="sources_log" %}
419
- Check what you actually used. Fill the log as you go.
420
- {% /description %}
421
-
422
- {% instructions ref="sources_log" %}
423
- Maintain a log of sources accessed. Record: Date accessed, Source name, Type/tier, Link or file path, Key takeaways. At least 3 sources required.
424
- {% /instructions %}
425
-
426
- {% field kind="table" id="sources_accessed" label="Sources Accessed" required=true minRows=3
427
- columnIds=["date", "source", "type", "link", "takeaways"]
428
- columnTypes=[{type: "date", required: true}, {type: "string", required: true}, {type: "string", required: true}, {type: "url", required: true}, {type: "string", required: true}] %}
429
- | Date | Source | Type | Link | Takeaways |
430
- |------|--------|------|------|-----------|
431
- {% /field %}
432
-
433
- {% /field-group %}
434
-
435
- {% field-group id="sources_sec" title="Q2.2 SEC / Regulatory Documents" %}
436
-
437
- {% field kind="checkboxes" id="sec_docs_reviewed" label="SEC documents reviewed" checkboxMode="simple" %}
438
- - [ ] 10-K (latest) {% #ten_k %}
439
- - [ ] 10-Q (latest) {% #ten_q %}
440
- - [ ] 8-K earnings release (current quarter) {% #eight_k_current %}
441
- - [ ] Prior quarter 8-K earnings release {% #eight_k_prior %}
442
- - [ ] Proxy (DEF 14A) {% #proxy %}
443
- - [ ] S-1 / 20-F / 6-K (if applicable) {% #s1_20f_6k %}
444
- - [ ] Insider trading filings (Forms 3/4/5) {% #insider_filings %}
445
- - [ ] 13D/13G {% #thirteen_d_g %}
446
- - [ ] 13F read-through (if relevant) {% #thirteen_f %}
447
- {% /field %}
448
-
449
- {% /field-group %}
450
-
451
- {% field-group id="sources_company" title="Q2.3 Company Communications" %}
452
-
453
- {% field kind="checkboxes" id="company_comms_reviewed" label="Company communications reviewed" checkboxMode="simple" %}
454
- - [ ] Earnings press release {% #earnings_pr %}
455
- - [ ] Earnings call webcast/transcript {% #earnings_call %}
456
- - [ ] Prepared remarks + Q&A notes {% #prepared_remarks %}
457
- - [ ] Investor presentation / slide deck {% #investor_deck %}
458
- - [ ] Investor day materials (last 18 months) {% #investor_day %}
459
- - [ ] Product announcements / pricing updates {% #product_announcements %}
460
- - [ ] Guidance updates / pre-announcements {% #guidance_updates %}
461
- {% /field %}
462
-
463
- {% /field-group %}
464
-
465
- {% field-group id="sources_external" title="Q2.4 External / Market Sources" %}
466
-
467
- {% field kind="checkboxes" id="external_sources_reviewed" label="External sources reviewed" checkboxMode="simple" %}
468
- - [ ] Sell-side consensus snapshot {% #sellside_consensus %}
469
- - [ ] Key sell-side notes {% #sellside_notes %}
470
- - [ ] Relevant news (top 3 links) {% #relevant_news %}
471
- - [ ] Industry data {% #industry_data %}
472
- - [ ] Peer earnings read-across {% #peer_readacross %}
473
- - [ ] Options market data (implied move/IV/skew) {% #options_data %}
474
- - [ ] Short interest / borrow / CTB {% #short_interest %}
475
- - [ ] Alternative data (traffic/app downloads/card spend) {% #alt_data %}
476
- {% /field %}
477
-
478
- {% field kind="string" id="sellside_consensus_source" label="Sell-side consensus source" %}{% /field %}
479
-
480
- {% field kind="string" id="sellside_analyst_names" label="Key sell-side analyst names" %}{% /field %}
481
-
482
- {% field kind="string" id="news_links" label="Relevant news links (top 3)" %}{% /field %}
483
-
484
- {% field kind="string" id="industry_data_source" label="Industry data source" %}{% /field %}
485
-
486
- {% field kind="string" id="peer_tickers" label="Peer earnings tickers" %}{% /field %}
487
-
488
- {% field kind="string" id="options_data_source" label="Options market data source" %}{% /field %}
489
-
490
- {% field kind="string" id="short_interest_source" label="Short interest data source" %}{% /field %}
491
-
492
- {% field kind="string" id="alt_data_source" label="Alternative data source" %}{% /field %}
493
-
494
- {% field kind="string" id="other_sources" label="Other sources used" %}{% /field %}
495
-
496
- {% /field-group %}
497
-
498
- {% field-group id="sources_experts" title="Q2.5 Key Experts and Analysts" %}
499
-
500
- {% field kind="table" id="experts_list" label="Key Experts" minRows=0
501
- columnIds=["name", "angle", "lead_time", "hit_rate", "tier"]
502
- columnTypes=["string", "string", "string", "string", "string"] %}
503
- | Name | Angle | Lead Time | Hit Rate | Tier |
504
- |------|-------|-----------|----------|------|
505
- {% /field %}
506
-
507
- {% instructions ref="experts_list" %}
508
- Track key experts covering this company with their specialization and track record.
509
- {% /instructions %}
510
-
511
- {% /field-group %}
512
-
513
- {% field-group id="business_snapshot" title="Q3. Business Model Snapshot" %}
514
-
515
- {% field kind="string" id="how_makes_money" label="How the company makes money" required=true validate=[{id: "min_words", min: 25}, {id: "max_words", max: 75}] %}{% /field %}
516
-
517
- {% instructions ref="how_makes_money" %}
518
- 2-4 sentences; 25-75 words explaining how the company generates revenue.
519
- {% /instructions %}
520
-
521
- {% field kind="string_list" id="revenue_segments" label="Revenue segments (Segment: X%)" required=true minItems=1 validate=[{id: "sum_to_percent_list", target: 100}] %}{% /field %}
522
-
523
- {% instructions ref="revenue_segments" %}
524
- List each segment with percentage of revenue. Format: "Segment Name: XX%". Percentages should sum to 100%.
525
- {% /instructions %}
526
-
527
- {% field kind="single_select" id="price_changes_recently" label="Price changes recently?" required=true %}
528
- - [ ] Yes {% #yes %}
529
- - [ ] No {% #no %}
530
- {% /field %}
124
+ ## Outlook
531
125
 
532
- {% field kind="string" id="price_change_details" label="Price change details (if Yes)" validate=[{id: "required_if_equals", when: "price_changes_recently", equals: "yes"}] %}{% /field %}
126
+ {% group id="outlook" title="Outlook" %}
533
127
 
534
- {% field kind="string" id="volume_demand_indicators" label="Volume/demand indicators" %}{% /field %}
128
+ **Guidance:**
535
129
 
536
- {% field kind="string" id="mix_shift_risk" label="Mix shift risk" %}{% /field %}
130
+ {% field kind="string" id="guidance" label="Forward Guidance" role="agent" maxLength=500 %}{% /field %}
131
+ {% instructions ref="guidance" %}Summary of company's forward guidance for next quarter/year.{% /instructions %}
537
132
 
538
- {% field kind="string_list" id="key_kpis_quarterly" label="Key KPIs to track this quarter (KPI: why it matters)" required=true minItems=3 maxItems=8 validate=[{id: "item_format", pattern: "^.+:.+$", example: "Revenue Growth: tracks core business momentum"}] %}{% /field %}
133
+ **Key risks:**
539
134
 
540
- {% instructions ref="key_kpis_quarterly" %}
541
- Format: "KPI Name: Why it matters this quarter". 3-8 KPIs required.
542
- {% /instructions %}
135
+ {% field kind="string_list" id="key_risks" label="Key Risks" role="agent" minItems=0 maxItems=5 %}{% /field %}
136
+ {% instructions ref="key_risks" %}Primary risks or concerns (up to 5).{% /instructions %}
543
137
 
544
- {% /field-group %}
138
+ **Analyst sentiment:**
545
139
 
546
- {% field-group id="quant_income" title="Q4.1 Income Statement" %}
547
-
548
- {% field kind="number" id="revenue" label="Revenue" required=true %}{% /field %}
549
-
550
- {% field kind="number" id="revenue_yoy_pct" label="Revenue YoY %" %}{% /field %}
551
-
552
- {% field kind="number" id="revenue_qoq_pct" label="Revenue QoQ %" %}{% /field %}
553
-
554
- {% field kind="number" id="gross_margin_pct" label="Gross margin %" min=0 max=100 %}{% /field %}
555
-
556
- {% field kind="number" id="gross_margin_yoy_bps" label="Gross margin YoY (bps)" %}{% /field %}
557
-
558
- {% field kind="number" id="gross_margin_qoq_bps" label="Gross margin QoQ (bps)" %}{% /field %}
559
-
560
- {% field kind="number" id="op_margin_pct" label="Operating margin %" %}{% /field %}
561
-
562
- {% field kind="number" id="eps_diluted" label="Diluted EPS" required=true %}{% /field %}
563
-
564
- {% field kind="string" id="key_expense_drivers" label="Key expense drivers (R&D, SG&A)" %}{% /field %}
565
-
566
- {% field kind="string" id="one_time_items" label="One-time items / adjustments" %}{% /field %}
567
-
568
- {% /field-group %}
569
-
570
- {% field-group id="quant_balance" title="Q4.2 Balance Sheet / Liquidity" %}
571
-
572
- {% field kind="number" id="cash_equivalents" label="Cash & equivalents" %}{% /field %}
573
-
574
- {% field kind="number" id="net_debt" label="Net debt (negative for net cash)" %}{% /field %}
575
-
576
- {% field kind="string" id="working_capital_changes" label="Working capital changes affecting earnings quality" %}{% /field %}
577
-
578
- {% field kind="string" id="covenant_refinancing" label="Covenant / refinancing / maturity wall" %}{% /field %}
579
-
580
- {% /field-group %}
581
-
582
- {% field-group id="quant_cashflow" title="Q4.3 Cash Flow and Capital Return" %}
583
-
584
- {% field kind="number" id="operating_cash_flow" label="Operating cash flow" %}{% /field %}
585
-
586
- {% field kind="number" id="free_cash_flow" label="Free cash flow" %}{% /field %}
587
-
588
- {% field kind="string" id="fcf_definition" label="FCF definition used" %}{% /field %}
589
-
590
- {% field kind="string" id="buybacks" label="Buybacks (amount or share count)" %}{% /field %}
591
-
592
- {% field kind="string" id="dividends" label="Dividends (amount or per-share)" %}{% /field %}
593
-
594
- {% field kind="string" id="sbc_trend" label="Stock-based comp trend" %}{% /field %}
595
-
596
- {% /field-group %}
597
-
598
- {% field-group id="quant_quality" title="Q4.4 Quality Checks" %}
599
-
600
- {% field kind="single_select" id="unusual_accruals" label="Unusual accruals / reserve releases?" required=true %}
601
- - [ ] Yes {% #yes %}
602
- - [ ] No {% #no %}
603
- {% /field %}
604
-
605
- {% field kind="single_select" id="working_capital_pullforward" label="Working capital pull-forward?" required=true %}
606
- - [ ] Yes {% #yes %}
607
- - [ ] No {% #no %}
608
- {% /field %}
609
-
610
- {% field kind="multi_select" id="margin_change_drivers" label="Margin change drivers" %}
611
- - [ ] Mix {% #mix %}
612
- - [ ] Cost {% #cost %}
613
- - [ ] FX {% #fx %}
614
- - [ ] Other {% #other %}
615
- {% /field %}
616
-
617
- {% field kind="string" id="margin_change_notes" label="Margin change notes" %}{% /field %}
618
-
619
- {% /field-group %}
620
-
621
- {% field-group id="expect_guidance" title="Q5.1 Company Guidance" %}
622
-
623
- {% field kind="string" id="guidance_revenue" label="Revenue guidance" %}{% /field %}
624
-
625
- {% field kind="string" id="guidance_margin" label="Margin guidance" %}{% /field %}
626
-
627
- {% field kind="string" id="guidance_eps" label="EPS/Op income guidance" %}{% /field %}
628
-
629
- {% field kind="string" id="guidance_kpi" label="KPI guidance" %}{% /field %}
630
-
631
- {% field kind="string" id="guidance_qualitative" label="Qualitative guidance" %}{% /field %}
632
-
633
- {% /field-group %}
634
-
635
- {% field-group id="expect_consensus" title="Q5.2 Street Consensus" %}
636
-
637
- {% field kind="string" id="consensus_as_of" label="Consensus as-of date" required=true pattern="^\\d{4}-\\d{2}-\\d{2}$" %}{% /field %}
638
-
639
- {% field kind="string" id="consensus_source" label="Consensus source" required=true %}{% /field %}
640
-
641
- {% field kind="number" id="consensus_revenue" label="Consensus revenue" %}{% /field %}
642
-
643
- {% field kind="number" id="consensus_eps" label="Consensus EPS" %}{% /field %}
644
-
645
- {% field kind="string" id="consensus_kpis" label="Consensus key KPIs" %}{% /field %}
646
-
647
- {% /field-group %}
648
-
649
- {% field-group id="expect_estimate" title="Q5.3 Your Estimate (Base)" %}
650
-
651
- {% field kind="number" id="estimate_revenue" label="Your revenue estimate" required=true %}{% /field %}
652
-
653
- {% field kind="number" id="estimate_eps" label="Your EPS estimate" required=true %}{% /field %}
654
-
655
- {% field kind="string" id="estimate_kpis" label="Your KPI estimates" %}{% /field %}
656
-
657
- {% field kind="number" id="variance_vs_consensus" label="Variance vs consensus (%)" %}{% /field %}
658
-
659
- {% /field-group %}
660
-
661
- {% field-group id="expect_whisper" title="Q5.4 Whisper / Buyside Bar" %}
662
-
663
- {% instructions ref="expect_whisper" %}
664
- Only fill if evidence-based.
665
- {% /instructions %}
666
-
667
- {% field kind="number" id="whisper_revenue" label="Whisper revenue" %}{% /field %}
668
-
669
- {% field kind="number" id="whisper_eps" label="Whisper EPS" %}{% /field %}
670
-
671
- {% field kind="string" id="whisper_evidence" label="Whisper evidence" validate=[{id: "required_if", when: "whisper_revenue"}, {id: "required_if", when: "whisper_eps"}] %}{% /field %}
672
-
673
- {% instructions ref="whisper_evidence" %}
674
- Required if whisper values are provided. Explain the source of whisper estimates.
675
- {% /instructions %}
676
-
677
- {% /field-group %}
678
-
679
- {% field-group id="expect_market" title="Q5.5 Market-Implied" %}
680
-
681
- {% field kind="number" id="options_implied_move" label="Options implied move 1-day (%)" %}{% /field %}
682
-
683
- {% field kind="single_select" id="skew_indicates" label="Skew indicates" %}
684
- - [ ] Upside pay-up {% #upside %}
685
- - [ ] Downside pay-up {% #downside %}
140
+ {% field kind="single_select" id="analyst_sentiment" label="Analyst Sentiment" role="agent" %}
141
+ - [ ] Bullish {% #bullish %}
686
142
  - [ ] Neutral {% #neutral %}
143
+ - [ ] Bearish {% #bearish %}
687
144
  {% /field %}
688
145
 
689
- {% field kind="string" id="unusual_oi_flows" label="Unusual open interest / flows" %}{% /field %}
690
-
691
- {% /field-group %}
692
-
693
- {% field-group id="driver_1" title="Q6.1 Driver Model - Driver 1" %}
694
-
695
- {% description ref="driver_1" %}
696
- Simple, explicit, testable assumptions. At least 2 drivers required.
697
- {% /description %}
698
-
699
- {% field kind="string" id="driver_1_name" label="Driver name" required=true %}{% /field %}
700
-
701
- {% field kind="string" id="driver_1_indicators" label="Leading indicators observed (what/when/source)" required=true %}{% /field %}
702
-
703
- {% field kind="string" id="driver_1_assumption" label="Assumption (base)" required=true %}{% /field %}
704
-
705
- {% field kind="string" id="driver_1_sensitivity" label="Sensitivity: if +/-X%, EPS impact = Y" %}{% /field %}
706
-
707
- {% field kind="string" id="driver_1_what_breaks" label="What breaks this assumption" %}{% /field %}
708
-
709
- {% /field-group %}
710
-
711
- {% field-group id="driver_2" title="Q6.2 Driver Model - Driver 2" %}
712
-
713
- {% field kind="string" id="driver_2_name" label="Driver name" required=true %}{% /field %}
714
-
715
- {% field kind="string" id="driver_2_indicators" label="Leading indicators observed" required=true %}{% /field %}
716
-
717
- {% field kind="string" id="driver_2_assumption" label="Assumption (base)" required=true %}{% /field %}
718
-
719
- {% field kind="string" id="driver_2_sensitivity" label="Sensitivity" %}{% /field %}
720
-
721
- {% field kind="string" id="driver_2_what_breaks" label="What breaks this assumption" %}{% /field %}
722
-
723
- {% /field-group %}
724
-
725
- {% field-group id="driver_3" title="Q6.3 Driver Model - Driver 3 (optional)" %}
726
-
727
- {% field kind="string" id="driver_3_name" label="Driver name" %}{% /field %}
728
-
729
- {% field kind="string" id="driver_3_indicators" label="Leading indicators observed" %}{% /field %}
730
-
731
- {% field kind="string" id="driver_3_assumption" label="Assumption (base)" %}{% /field %}
732
-
733
- {% field kind="string" id="driver_3_sensitivity" label="Sensitivity" %}{% /field %}
734
-
735
- {% field kind="string" id="driver_3_what_breaks" label="What breaks this assumption" %}{% /field %}
736
-
737
- {% /field-group %}
738
-
739
- {% field-group id="driver_margin_bridge" title="Q6.4 Margin Bridge" %}
740
-
741
- {% instructions ref="driver_margin_bridge" %}
742
- All margin impacts should sum to total margin change.
743
- {% /instructions %}
744
-
745
- {% field kind="number" id="margin_mix_bps" label="Mix impact (bps)" %}{% /field %}
746
-
747
- {% field kind="number" id="margin_pricing_bps" label="Pricing impact (bps)" %}{% /field %}
748
-
749
- {% field kind="number" id="margin_input_costs_bps" label="Input costs impact (bps)" %}{% /field %}
750
-
751
- {% field kind="number" id="margin_fx_bps" label="FX impact (bps)" %}{% /field %}
752
-
753
- {% field kind="number" id="margin_one_offs_bps" label="One-offs impact (bps)" %}{% /field %}
754
-
755
- {% /field-group %}
756
-
757
- {% field-group id="scenario_base" title="Q7.1 Scenarios - Base Case" validate=[{id: "sum_to", fields: ["base_probability", "bull_probability", "bear_probability"], target: 100}] %}
758
-
759
- {% instructions ref="scenario_base" %}
760
- Probabilities across Base/Bull/Bear should sum to 100%.
761
- {% /instructions %}
762
-
763
- {% field kind="number" id="base_probability" label="Probability (%)" required=true min=0 max=100 %}{% /field %}
764
-
765
- {% field kind="number" id="base_revenue" label="Revenue" required=true %}{% /field %}
766
-
767
- {% field kind="number" id="base_eps" label="EPS" required=true %}{% /field %}
768
-
769
- {% field kind="string" id="base_key_kpi" label="Key KPI" %}{% /field %}
770
-
771
- {% field kind="string" id="base_narrative" label="Narrative (1-2 sentences)" required=true maxLength=250 %}{% /field %}
772
-
773
- {% field kind="string" id="base_stock_reaction" label="Expected stock reaction and why" required=true %}{% /field %}
774
-
775
- {% /field-group %}
776
-
777
- {% field-group id="scenario_bull" title="Q7.2 Scenarios - Bull Case" %}
778
-
779
- {% field kind="number" id="bull_probability" label="Probability (%)" required=true min=0 max=100 %}{% /field %}
780
-
781
- {% field kind="number" id="bull_revenue" label="Revenue" required=true %}{% /field %}
782
-
783
- {% field kind="number" id="bull_eps" label="EPS" required=true %}{% /field %}
784
-
785
- {% field kind="string" id="bull_key_kpi" label="Key KPI" %}{% /field %}
786
-
787
- {% field kind="string" id="bull_what_surprises" label="What surprises?" required=true %}{% /field %}
788
-
789
- {% field kind="string" id="bull_reaction" label="Expected reaction" required=true %}{% /field %}
790
-
791
- {% /field-group %}
792
-
793
- {% field-group id="scenario_bear" title="Q7.3 Scenarios - Bear Case" %}
794
-
795
- {% field kind="number" id="bear_probability" label="Probability (%)" required=true min=0 max=100 %}{% /field %}
796
-
797
- {% field kind="number" id="bear_revenue" label="Revenue" required=true %}{% /field %}
798
-
799
- {% field kind="number" id="bear_eps" label="EPS" required=true %}{% /field %}
800
-
801
- {% field kind="string" id="bear_key_kpi" label="Key KPI" %}{% /field %}
802
-
803
- {% field kind="string" id="bear_what_breaks" label="What breaks?" required=true %}{% /field %}
804
-
805
- {% field kind="string" id="bear_reaction" label="Expected reaction" required=true %}{% /field %}
806
-
807
- {% /field-group %}
808
-
809
- {% field-group id="scenario_triggers" title="Q7.4 Surprise Triggers" %}
810
-
811
- {% field kind="string_list" id="surprise_triggers" label="Key surprise triggers (ranked)" required=true minItems=2 %}{% /field %}
812
-
813
- {% /field-group %}
814
-
815
- {% field-group id="mgmt_risks" title="Q8. Management and Risks" %}
816
-
817
- {% field kind="single_select" id="management_tone" label="Management tone last quarter" required=true %}
818
- - [ ] Confident {% #confident %}
819
- - [ ] Cautious {% #cautious %}
820
- - [ ] Defensive {% #defensive %}
821
- - [ ] Mixed {% #mixed %}
822
- {% /field %}
823
-
824
- {% field kind="string_list" id="key_commitments" label="Key commitments/promises to track" required=true minItems=1 %}{% /field %}
825
-
826
- {% field kind="string_list" id="top_5_risks" label="Top 5 risks into this print (specific, not generic)" required=true minItems=5 maxItems=5 %}{% /field %}
827
-
828
- {% field kind="string" id="regulatory_legal_watch" label="Regulatory/legal watch items" %}{% /field %}
829
-
830
- {% field kind="string" id="competitive_threats" label="Competitive threats / share shifts" %}{% /field %}
831
-
832
- {% field kind="string" id="macro_sensitivities" label="Macro sensitivities (rates, FX, commodities, consumer)" %}{% /field %}
833
-
834
- {% /field-group %}
835
-
836
- {% field-group id="valuation" title="Q9. Valuation and Reaction" %}
837
-
838
- {% field kind="multi_select" id="valuation_metrics" label="Valuation metrics used" required=true minSelections=1 %}
839
- - [ ] P/E {% #pe %}
840
- - [ ] EV/EBITDA {% #ev_ebitda %}
841
- - [ ] EV/Sales {% #ev_sales %}
842
- - [ ] FCF yield {% #fcf_yield %}
843
- - [ ] SOTP {% #sotp %}
844
- {% /field %}
845
-
846
- {% field kind="string" id="valuation_other" label="Other valuation metric" %}{% /field %}
847
-
848
- {% field kind="single_select" id="valuation_vs_history" label="Current vs historical range" required=true %}
849
- - [ ] Cheap {% #cheap %}
850
- - [ ] Mid {% #mid %}
851
- - [ ] Expensive {% #expensive %}
852
- {% /field %}
853
-
854
- {% field kind="string" id="valuation_why" label="Why (valuation rationale)" required=true minLength=60 %}{% /field %}
855
-
856
- {% instructions ref="valuation_why" %}
857
- Required. Explain your valuation assessment. Minimum 15 words.
858
- {% /instructions %}
859
-
860
- {% field kind="number" id="avg_earnings_move" label="Avg earnings move last 8 quarters (%)" %}{% /field %}
861
-
862
- {% field kind="multi_select" id="reaction_drivers" label="What typically drives reaction" %}
863
- - [ ] Revenue {% #revenue %}
864
- - [ ] Margin {% #margin %}
865
- - [ ] Guidance {% #guidance %}
866
- - [ ] KPI {% #kpi %}
867
- - [ ] Other {% #other %}
868
- {% /field %}
869
-
870
- {% field kind="string" id="reaction_notes" label="Reaction pattern notes" %}{% /field %}
146
+ **Sentiment rationale:**
871
147
 
872
- {% field kind="string" id="short_interest_trend" label="Short interest trend" %}{% /field %}
148
+ {% field kind="string" id="sentiment_rationale" label="Sentiment Rationale" role="agent" validate=[{id: "required_if_set", when: "analyst_sentiment"}, {id: "min_words", min: 10}] %}{% /field %}
149
+ {% instructions ref="sentiment_rationale" %}Required if sentiment is selected. Explain why (minimum 10 words).{% /instructions %}
873
150
 
874
- {% field kind="string" id="flow_sentiment" label="Flow / sentiment" %}{% /field %}
151
+ **Summary:**
875
152
 
876
- {% field kind="string" id="crowded_factor" label="Crowded factor exposure" %}{% /field %}
153
+ {% field kind="string" id="summary" label="One-Line Summary" role="agent" maxLength=300 validate=[{id: "min_words", min: 10}, {id: "max_words", max: 50}] %}{% /field %}
154
+ {% instructions ref="summary" %}Brief overall assessment (10-50 words).{% /instructions %}
877
155
 
878
- {% /field-group %}
156
+ {% /group %}
879
157
 
880
158
  {% /form %}