markform 0.1.3 → 0.1.4

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