@antoneeo/mkt-agentic-sdlc-skill 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,444 +1,616 @@
1
- # Document templates — Marketing Agentic SDLC
2
-
3
- General rules:
4
- - Concise documents: ≤ ~80 lines each (handoff ≤ 20; final MARKETING_PLAN exempt). If a document grows beyond that, split it, do not inflate it.
5
- - Template conformance is not the goal: if a section has no real content, state explicitly why it does not apply. Never filler text.
6
- - Every number cites its ledger entry as `[EV-nn]`. Dates always absolute.
7
- - Deliverable language: the target market's language (decided in Discovery). Structure and field names stay as templated so the validator can parse them.
8
-
9
- ## Canonical document header (vision/ strategy/ tactics/ deliverables/)
10
-
11
- Every durable canonical document opens with this frontmatter: it feeds the generated manifest `mkt_docs/INDEX.md` and gives an agent the freshness signal before it trusts the content.
12
-
13
- ```markdown
14
- ---
15
- description: One line — what the document is and when to read it.
16
- status: CURRENT # CURRENT | SUPERSEDED | DRAFT | DEPRECATED
17
- supersedes: old_doc.md # only if it replaces another canonical doc
18
- ---
19
- # Document Title
20
- ```
21
-
22
- When a doc replaces another: the new one declares `supersedes:`, the old one switches to `status: SUPERSEDED` (it stays as history, do not delete it). `mkt_check.py validate` warns if `status` is missing or if a superseded doc is still `CURRENT`.
23
-
24
- ## mkt_docs/README.md
25
-
26
- Curated must-read index, by hand (it is NOT the generated manifest). Created at init, updated rarely.
27
-
28
- ```markdown
29
- # mkt_docs — reading guide
30
-
31
- Must-reads for this marketing project, in order. The full manifest of
32
- canonical docs is `INDEX.md` (generated — regenerate with `mkt_check.py
33
- index`, never edit by hand).
34
-
35
- 1. `vision/MKT_VISION.md` — why this plan exists (check its Status first).
36
- 2. `research/evidence_ledger.md` — the single source for every number.
37
- 3. `strategy/STRATEGY.md` — the approved strategy (if present).
38
- 4. `audit/handoff.md` — where work stopped last session (if present).
39
-
40
- Directory purposes: `vision/` (marketing vision and principles), `research/`
41
- (evidence ledger and research outputs, discovery-by-grep), `strategy/`
42
- (ICP/personas, threat map, objectives, strategy), `tactics/` (tactical plan,
43
- 90-day action, measurement, campaigns), `deliverables/` (assembled plan and
44
- exports), `spikes/` (research spikes), `audit/` (handoff).
45
- ```
46
-
47
- ## mkt_docs/vision/MKT_VISION.md
48
-
49
- ```markdown
50
- ---
51
- description: Marketing vision — expected benefit, market, non-goals, success signals.
52
- status: DRAFT
53
- ---
54
- # Marketing Vision
55
- Status: DRAFT
56
- <!-- Status: DRAFT (reconstructed by the agent, NOT a gating authority)
57
- or APPROVED (by <who>, <date>) — only after the user's explicit confirmation -->
58
-
59
- ## Business Goal
60
- <!-- the business outcome marketing must serve, in one paragraph. Cite FACTs. -->
61
-
62
- ## Expected Benefit
63
- <!-- what a successful plan changes for the business, stated measurably -->
64
-
65
- ## Market & Audience
66
- <!-- target market, geography, deliverable language; who we serve (short — the
67
- detailed ICP lives in strategy/ICP_PERSONAS.md) -->
68
-
69
- ## Non-Goals
70
- <!-- what this plan explicitly does NOT pursue (markets, segments, channels).
71
- The strategy review checks divergence against these. -->
72
-
73
- ## Success Signals
74
- <!-- how the user recognizes the plan is working, in their words -->
75
-
76
- ## Constraints
77
- <!-- budget range [EV-nn], team capacity [EV-nn], legal/brand limits -->
78
- ```
79
-
80
- ## mkt_docs/vision/principles.md
81
-
82
- ```markdown
83
- ---
84
- description: Stable decision principles guiding marketing trade-offs.
85
- status: DRAFT
86
- ---
87
- # Marketing Decision Principles
88
-
89
- <!-- bullet list, most critical first. Examples: "no channel we cannot staff",
90
- "brand voice X non-negotiable", "experiments capped at 10% of budget" -->
91
- ```
92
-
93
- ## mkt_docs/research/evidence_ledger.md
94
-
95
- The single source for every number. `[EV-nn]` references across all documents resolve here. Classes: FACT (user input / primary data), BENCHMARK (external, Source URL + Date mandatory), ASSUMPTION (Range + Confidence mandatory, rationale in Claim).
96
-
97
- ```markdown
98
- # Evidence Ledger
99
-
100
- | ID | Claim | Class | Value / Range | Source | Date | Confidence |
101
- |---|---|---|---|---|---|---|
102
- | EV-01 | (example) monthly marketing budget | FACT | 5000 EUR/month | user, Wave 1 | 2026-01-01 | HIGH |
103
- ```
104
-
105
- ## mkt_docs/strategy/ICP_PERSONAS.md
106
-
107
- ```markdown
108
- ---
109
- description: Ideal customer profile and evidence-based personas.
110
- status: DRAFT
111
- ---
112
- # ICP & Personas
113
-
114
- ## Ideal Customer Profile
115
- | Criterion | Value | Anti-profile (who we do NOT serve) |
116
- |---|---|---|
117
-
118
- ## Persona: [name]
119
- <!-- max 2-3 personas. Every trait cites VoC evidence [EV-nn] or is labeled ASSUMPTION. -->
120
- - **Job to be done:**
121
- - **Buying trigger:**
122
- - **Top objections:**
123
- - **Watering holes:** <!-- where they actually are — feeds channel selection -->
124
- - **Vocabulary:** <!-- verbatim words from VoC — feeds messaging -->
125
-
126
- <!-- B2B variant: the unit is the ACCOUNT (firmographic ICP), and the
127
- "personas" are the ROLES in the buying committee (e.g. economic buyer,
128
- technical decider, gatekeeper/veto), not consumer JTBD segments. Replace
129
- Job/Trigger/Objections/Watering-holes per role; add who decides vs signs
130
- vs blocks. Firmographic ICP criteria (size, sector, geography, trigger)
131
- go in the ICP table above. -->
132
-
133
- ```
134
-
135
- ## mkt_docs/strategy/THREAT_MAP.md
136
-
137
- ```markdown
138
- ---
139
- description: Competitive threats and plan risks with mitigations.
140
- status: DRAFT
141
- ---
142
- # Threat Map
143
-
144
- ## Competitive threats
145
- | Threat | Evidence | Likelihood | Impact | Mitigation |
146
- |---|---|---|---|---|
147
-
148
- ## Plan risks
149
- <!-- budget concentration, single-channel dependence, seasonality, capacity,
150
- brand/reputation risks. Same table shape. -->
151
- ```
152
-
153
- ## mkt_docs/strategy/SITUATION_SWOT.md
154
-
155
- Sintesi della fase Situation (dopo la ricerca, prima degli obiettivi). Ogni
156
- cella cita il ledger: adjectives senza [EV-nn] vanno cancellati. PESTEL /
157
- Five Forces solo quando il mercato lo merita (frameworks.md); se saltati,
158
- dichiararlo con la ragione.
159
-
160
- ```markdown
161
- ---
162
- description: Sintesi SWOT evidence-based della fase Situation.
163
- status: CURRENT
164
- ---
165
- # SWOT — [business] ([canale/scope])
166
-
167
- <!-- PESTEL/Five Forces: usati o saltati-con-ragione (frameworks.md) -->
168
-
169
- ## Strengths
170
- <!-- ogni bullet cita [EV-nn] -->
171
- ## Weaknesses
172
- ## Opportunities
173
- ## Threats
174
- ```
175
-
176
- ## mkt_docs/strategy/OBJECTIVES.md
177
-
178
- Objectives are `### O1 — Title` headings — the validator reads the `O#` ids for trace checks. 3-5 objectives maximum.
179
-
180
- ```markdown
181
- ---
182
- description: SMART marketing objectives for the plan cycle.
183
- status: DRAFT
184
- ---
185
- # Objectives
186
- Status: DRAFT <!-- APPROVED (by <who>, <date>) after the user gate -->
187
-
188
- ### O1 — [title]
189
- - **Target:** [number] by [date] [EV-nn justifying plausibility]
190
- - **Owner:**
191
- - **Why this is achievable:** <!-- cite ledger entries -->
192
-
193
- ### O2 — [title]
194
- ...
195
- ```
196
-
197
- ## mkt_docs/strategy/STRATEGY.md
198
-
199
- ```markdown
200
- ---
201
- description: Segmentation, targeting, positioning and messaging for the plan cycle.
202
- status: DRAFT
203
- ---
204
- # Strategy
205
- Status: DRAFT <!-- APPROVED (by <who>, <date>) after the user gate -->
206
-
207
- ## Segmentation
208
- <!-- segments found in research, with evidence -->
209
-
210
- ## Targeting
211
- <!-- the CHOICE and its rationale; segments explicitly rejected and why -->
212
-
213
- ## Positioning
214
- - **Competitive alternatives:** <!-- incl. "do nothing" -->
215
- - **Unique attributes:**
216
- - **Value (evidence-backed):**
217
- - **Best-fit segment:**
218
- - **Market category:**
219
-
220
- > For [segment] who [need], [name] is the [category] that [unique value],
221
- > unlike [main alternative] which [limitation].
222
-
223
- <!-- Swap test result: statement with top competitor's name substituted must be FALSE. State it. -->
224
-
225
- ## Messaging house
226
- - **Roof (value proposition):**
227
- - **Pillar 1:** ... — proof points: ...
228
- - **Pillar 2:** ... — proof points: ...
229
- ```
230
-
231
- ## mkt_docs/tactics/TACTICAL_PLAN.md
232
-
233
- Parsed mechanically: keep the `Total budget:` line and the three tables with these exact column headers. Budget numbers plain or with k/M suffix; the validator strips currency symbols.
234
-
235
- ```markdown
236
- ---
237
- description: Channel plan, budget allocation and funnel model.
238
- status: DRAFT
239
- ---
240
- # Tactical Plan
241
-
242
- Total budget: 15000
243
-
244
- ## Channel Plan
245
- | Channel | Objective | KPI | Budget | Owner |
246
- |---|---|---|---|---|
247
- | (example) Google Ads | O1 | CPL <= 30 [EV-04] | 6000 | founder |
248
-
249
- <!-- Enabler-row convention: an objective that is a PRECONDITION (measurement,
250
- tracking, tooling setup) is not a spend channel but still needs a serving
251
- tactic for the trace check. Give it a row with Budget 0 and Owner set;
252
- it is intentionally absent from Budget Allocation (which must sum). -->
253
- <!-- Gate riders: when the client approves a plan/strategy at a gate WITH a
254
- condition, record the rider in the approved doc's header (Status line),
255
- not only in chat — the next session and the reviewer must see it. -->
256
-
257
-
258
- ## Budget Allocation
259
- | Channel | Budget | Share |
260
- |---|---|---|
261
- | (example) Google Ads | 6000 | 40% |
262
-
263
- <!-- allocations must sum to Total budget (±1%) — mkt_check.py budget -->
264
-
265
- ## Funnel Model
266
- | Channel | Budget | CPC | Clicks | CVR % | Leads | Close % | Customers | CAC |
267
- |---|---|---|---|---|---|---|---|---|
268
- | (example) Google Ads | 6000 | 1.50 [EV-04] | 4000 | 3 [EV-05] | 120 | 20 [EV-02] | 24 | 250 |
269
-
270
- <!-- each row must recompute: Clicks=Budget/CPC, Leads=Clicks*CVR%,
271
- Customers=Leads*Close%, CAC=Budget/Customers (±5%) — mkt_check.py funnel.
272
- Compare total Customers to the objective targets; declare any gap. -->
273
- <!-- Sales-led / B2B: this table is shaped for immediate-purchase e-commerce.
274
- For a long-cycle B2B motion, read `Customers` as QUALIFIED DEMOS/LEADS and
275
- `CAC` as cost-per-qualified-demo (state the relabel), put ONLY paid click
276
- channels here, and represent referral/content/outbound + the multi-stage
277
- sales funnel (MQL→SQL→demo→POC→won) and closed-won lag in a separate
278
- "Pipeline build-up vs objective" section. See frameworks.md. -->
279
-
280
- ## Channel selection rationale
281
- <!-- matrix scores or written rationale per chosen channel; rejected channels and why -->
282
- ```
283
-
284
- ## mkt_docs/tactics/ACTION_90D.md
285
-
286
- ```markdown
287
- ---
288
- description: Sequenced 90-day action plan.
289
- status: DRAFT
290
- ---
291
- # 90-Day Action Plan
292
-
293
- ## Weeks 1-2 (day-level)
294
- | Day | Action | Owner | Depends on |
295
- |---|---|---|---|
296
-
297
- ## Weeks 3-12 (week-level)
298
- | Week | Actions | Owner | Milestone |
299
- |---|---|---|---|
300
- ```
301
-
302
- ## mkt_docs/tactics/MEASUREMENT_PLAN.md
303
-
304
- The KPI table is parsed for trace: every objective id must appear.
305
-
306
- ```markdown
307
- ---
308
- description: KPI tree, targets, review cadence and kill/scale criteria.
309
- status: DRAFT
310
- ---
311
- # Measurement Plan
312
-
313
- ## North star
314
- <!-- the one metric, and why -->
315
-
316
- ## KPI table
317
- | Objective | KPI | Target | Benchmark | Cadence |
318
- |---|---|---|---|---|
319
- | O1 | (example) CPL | <= 30 | [EV-04] | weekly |
320
-
321
- ## Kill / scale criteria
322
- | Channel | Kill if | Scale if |
323
- |---|---|---|
324
- | (example) Google Ads | CAC > 400 after 3000 spent | CAC < 200 at 2x volume |
325
-
326
- ## Review cadence
327
- <!-- weekly channel KPIs, monthly objectives, quarterly strategy -->
328
- ```
329
-
330
- ## mkt_docs/tactics/CAMPAIGN_[name].md (E2)
331
-
332
- ```markdown
333
- ---
334
- description: Campaign plan for [name].
335
- status: DRAFT
336
- ---
337
- # Campaign: [name]
338
-
339
- ## Brief
340
- <!-- objective (link to O# or approved strategy context), audience, offer, KPI -->
341
-
342
- Total budget: 3000
343
-
344
- ## Budget Allocation
345
- | Channel | Budget | Share |
346
- |---|---|---|
347
-
348
- ## Funnel Model
349
- | Channel | Budget | CPC | Clicks | CVR % | Leads | Close % | Customers | CAC |
350
- |---|---|---|---|---|---|---|---|---|
351
-
352
- ## Timeline & owners
353
- ## Kill / scale criteria
354
- ```
355
-
356
- ## mkt_docs/deliverables/MARKETING_PLAN.md
357
-
358
- Assembled from the APPROVED artifacts — assembly, not rewriting; on divergence the approved artifact wins. Exempt from the 80-line cap.
359
-
360
- ```markdown
361
- ---
362
- description: The assembled marketing plan (SOSTAC) — the deliverable.
363
- status: DRAFT
364
- ---
365
- # Marketing Plan — [business], [cycle]
366
-
367
- ## Executive Summary
368
- <!-- one page: goal, strategy in two sentences, budget, expected outcome, top 3 risks -->
369
-
370
- ## Assumptions
371
- <!-- every material ASSUMPTION [EV-nn] with range and what changes if it is wrong -->
372
-
373
- ## 1. Situation
374
- <!-- from research + situation analysis: market [EV], competitors, VoC, SWOT -->
375
-
376
- ## 2. Objectives
377
- <!-- from OBJECTIVES.md -->
378
-
379
- ## 3. Strategy
380
- <!-- from STRATEGY.md: STP, positioning, messaging -->
381
-
382
- ## 4. Tactics
383
- <!-- from TACTICAL_PLAN.md: channels, budget, funnel -->
384
-
385
- ## 5. Action
386
- <!-- from ACTION_90D.md -->
387
-
388
- ## 6. Control
389
- <!-- from MEASUREMENT_PLAN.md: KPIs, cadence, kill/scale -->
390
-
391
- ## Appendix — Evidence Ledger
392
- <!-- the ledger table, verbatim -->
393
- ```
394
-
395
- ## mkt_docs/deliverables/ONE_PAGER.md
396
-
397
- ```markdown
398
- ---
399
- description: One-page strategy summary for stakeholders.
400
- status: DRAFT
401
- ---
402
- # [Business] — Marketing on a Page
403
-
404
- **Goal:** ... **Budget:** ... [EV-nn] **Horizon:** ...
405
- **Positioning:** <!-- the statement -->
406
- **Objectives:** <!-- O1..On, one line each -->
407
- **Core channels:** <!-- 2-3, with budget share -->
408
- **We will know it works when:** <!-- top KPIs -->
409
- **We stop/scale when:** <!-- headline kill/scale criteria -->
410
- ```
411
-
412
- ## mkt_docs/spikes/RESEARCH_[topic].md
413
-
414
- ```markdown
415
- # Research Spike: [topic]
416
-
417
- ## Question to answer
418
- ## Time-box
419
- ## Method & sources
420
- ## Answer / Outcome
421
- <!-- ledger rows created: EV-nn..EV-mm -->
422
- ## Consequences
423
- <!-- max 1 page. For strategy decisions, feed into E2/E3. -->
424
- ```
425
-
426
- ## mkt_docs/audit/handoff.md
427
-
428
- Just a pointer, ≤ 20 lines.
429
-
430
- ```markdown
431
- # Handoff
432
- Date: 2026-01-01 (UTC)
433
- Engagement: E3 — [name]
434
- Agent: Claude
435
-
436
- ## Phase state
437
- - Phase reached: <!-- e.g. 6 Strategy, awaiting user gate -->
438
-
439
- ## Next step
440
- <!-- one line -->
441
-
442
- ## Session notes
443
- <!-- gates passed? open review findings? ledger rows pending sources? -->
444
- ```
1
+ # Document templates — Marketing Agentic SDLC
2
+
3
+ General rules:
4
+ - Concise documents: ≤ ~80 lines each (handoff ≤ 20; final MARKETING_PLAN exempt). If a document grows beyond that, split it, do not inflate it.
5
+ - Template conformance is not the goal: if a section has no real content, state explicitly why it does not apply. Never filler text.
6
+ - Every number cites its ledger entry as `[EV-nn]`. Dates always absolute.
7
+ - Deliverable language: the target market's language (decided in Discovery). Structure and field names stay as templated so the validator can parse them.
8
+
9
+ ## Canonical document header (vision/ strategy/ tactics/ deliverables/)
10
+
11
+ Every durable canonical document opens with this frontmatter: it feeds the generated manifest `mkt_docs/INDEX.md` and gives an agent the freshness signal before it trusts the content.
12
+
13
+ ```markdown
14
+ ---
15
+ description: One line — what the document is and when to read it.
16
+ status: CURRENT # CURRENT | SUPERSEDED | DRAFT | DEPRECATED
17
+ supersedes: old_doc.md # only if it replaces another canonical doc
18
+ ---
19
+ # Document Title
20
+ ```
21
+
22
+ When a doc replaces another: the new one declares `supersedes:`, the old one switches to `status: SUPERSEDED` (it stays as history, do not delete it). `mkt_check.py validate` warns if `status` is missing or if a superseded doc is still `CURRENT`.
23
+
24
+ ## mkt_docs/README.md
25
+
26
+ Curated must-read index, by hand (it is NOT the generated manifest). Created at init, updated rarely.
27
+
28
+ ```markdown
29
+ ---
30
+ default_domain: marketing
31
+ ---
32
+ # mkt_docs — reading guide
33
+
34
+ Must-reads for this marketing project, in order. The full manifest of
35
+ canonical docs is `INDEX.md` (generated — regenerate with `mkt_check.py
36
+ index`, never edit by hand).
37
+
38
+ 1. `vision/MKT_VISION.md` — why this plan exists (check its Status first).
39
+ 2. `research/evidence_ledger.md` — the single source for every number.
40
+ 3. `strategy/STRATEGY.md` — the approved strategy (if present).
41
+ 4. `audit/handoff.md` — where work stopped last session (if present).
42
+
43
+ Directory purposes: `vision/` (marketing vision and principles), `research/`
44
+ (evidence ledger and research outputs, discovery-by-grep), `strategy/`
45
+ (ICP/personas, threat map, objectives, strategy), `tactics/` (tactical plan,
46
+ 90-day action, measurement, campaigns), `deliverables/` (assembled plan and
47
+ exports), `spikes/` (research spikes), `audit/` (handoff).
48
+ ```
49
+
50
+ ## mkt_docs/vision/MKT_VISION.md
51
+
52
+ ```markdown
53
+ ---
54
+ description: Marketing vision — expected benefit, market, non-goals, success signals.
55
+ status: DRAFT
56
+ ---
57
+ # Marketing Vision
58
+ Status: DRAFT
59
+ <!-- Status: DRAFT (reconstructed by the agent, NOT a gating authority)
60
+ or APPROVED (by <who>, <date>) — only after the user's explicit confirmation -->
61
+
62
+ ## Business Goal
63
+ <!-- the business outcome marketing must serve, in one paragraph. Cite FACTs. -->
64
+
65
+ ## Expected Benefit
66
+ <!-- what a successful plan changes for the business, stated measurably -->
67
+
68
+ ## Market & Audience
69
+ <!-- target market, geography, deliverable language; who we serve (short — the
70
+ detailed ICP lives in strategy/ICP_PERSONAS.md) -->
71
+
72
+ ## Non-Goals
73
+ <!-- what this plan explicitly does NOT pursue (markets, segments, channels).
74
+ The strategy review checks divergence against these. -->
75
+
76
+ ## Success Signals
77
+ <!-- how the user recognizes the plan is working, in their words -->
78
+
79
+ ## Constraints
80
+ <!-- budget range [EV-nn], team capacity [EV-nn], legal/brand limits -->
81
+ ```
82
+
83
+ ## mkt_docs/vision/principles.md
84
+
85
+ ```markdown
86
+ ---
87
+ description: Stable decision principles guiding marketing trade-offs.
88
+ status: DRAFT
89
+ ---
90
+ # Marketing Decision Principles
91
+
92
+ <!-- bullet list, most critical first. Examples: "no channel we cannot staff",
93
+ "brand voice X non-negotiable", "experiments capped at 10% of budget" -->
94
+ ```
95
+
96
+ ## mkt_docs/research/evidence_ledger.md
97
+
98
+ The single source for every number. `[EV-nn]` references across all documents resolve here. Classes: FACT (user input / primary data), BENCHMARK (external, Source URL + Date mandatory), ASSUMPTION (Range + Confidence mandatory, rationale in Claim).
99
+
100
+ ```markdown
101
+ # Evidence Ledger
102
+
103
+ | ID | Claim | Class | Value / Range | Source | Date | Confidence |
104
+ |---|---|---|---|---|---|---|
105
+ | EV-01 | (example) monthly marketing budget | FACT | 5000 EUR/month | user, Wave 1 | 2026-01-01 | HIGH |
106
+ ```
107
+
108
+ ## mkt_docs/strategy/ICP_PERSONAS.md
109
+
110
+ ```markdown
111
+ ---
112
+ description: Ideal customer profile and evidence-based personas.
113
+ status: DRAFT
114
+ ---
115
+ # ICP & Personas
116
+
117
+ ## Ideal Customer Profile
118
+ | Criterion | Value | Anti-profile (who we do NOT serve) |
119
+ |---|---|---|
120
+
121
+ ## Persona: [name]
122
+ <!-- max 2-3 personas. Every trait cites VoC evidence [EV-nn] or is labeled ASSUMPTION. -->
123
+ - **Job to be done:**
124
+ - **Buying trigger:**
125
+ - **Top objections:**
126
+ - **Watering holes:** <!-- where they actually are — feeds channel selection -->
127
+ - **Vocabulary:** <!-- verbatim words from VoC — feeds messaging -->
128
+
129
+ <!-- B2B variant: the unit is the ACCOUNT (firmographic ICP), and the
130
+ "personas" are the ROLES in the buying committee (e.g. economic buyer,
131
+ technical decider, gatekeeper/veto), not consumer JTBD segments. Replace
132
+ Job/Trigger/Objections/Watering-holes per role; add who decides vs signs
133
+ vs blocks. Firmographic ICP criteria (size, sector, geography, trigger)
134
+ go in the ICP table above. -->
135
+
136
+ ```
137
+
138
+ ## mkt_docs/strategy/THREAT_MAP.md
139
+
140
+ ```markdown
141
+ ---
142
+ description: Competitive threats and plan risks with mitigations.
143
+ status: DRAFT
144
+ ---
145
+ # Threat Map
146
+
147
+ ## Competitive threats
148
+ | Threat | Evidence | Likelihood | Impact | Mitigation |
149
+ |---|---|---|---|---|
150
+
151
+ ## Plan risks
152
+ <!-- budget concentration, single-channel dependence, seasonality, capacity,
153
+ brand/reputation risks. Same table shape. -->
154
+ ```
155
+
156
+ ## mkt_docs/strategy/SITUATION_SWOT.md
157
+
158
+ Sintesi della fase Situation (dopo la ricerca, prima degli obiettivi). Ogni
159
+ cella cita il ledger: adjectives senza [EV-nn] vanno cancellati. PESTEL /
160
+ Five Forces solo quando il mercato lo merita (frameworks.md); se saltati,
161
+ dichiararlo con la ragione.
162
+
163
+ ```markdown
164
+ ---
165
+ description: Sintesi SWOT evidence-based della fase Situation.
166
+ status: CURRENT
167
+ ---
168
+ # SWOT — [business] ([canale/scope])
169
+
170
+ <!-- PESTEL/Five Forces: usati o saltati-con-ragione (frameworks.md) -->
171
+
172
+ ## Strengths
173
+ <!-- ogni bullet cita [EV-nn] -->
174
+ ## Weaknesses
175
+ ## Opportunities
176
+ ## Threats
177
+ ```
178
+
179
+ ## mkt_docs/strategy/OBJECTIVES.md
180
+
181
+ Objectives are `### O1 — Title` headings — the validator reads the `O#` ids for trace checks. 3-5 objectives maximum.
182
+
183
+ ```markdown
184
+ ---
185
+ description: SMART marketing objectives for the plan cycle.
186
+ status: DRAFT
187
+ ---
188
+ # Objectives
189
+ Status: DRAFT <!-- APPROVED (by <who>, <date>) after the user gate -->
190
+
191
+ ### O1 — [title]
192
+ - **Target:** [number] by [date] [EV-nn justifying plausibility]
193
+ - **Owner:**
194
+ - **Why this is achievable:** <!-- cite ledger entries -->
195
+
196
+ ### O2 — [title]
197
+ ...
198
+ ```
199
+
200
+ ## mkt_docs/strategy/STRATEGY.md
201
+
202
+ ```markdown
203
+ ---
204
+ description: Segmentation, targeting, positioning and messaging for the plan cycle.
205
+ status: DRAFT
206
+ ---
207
+ # Strategy
208
+ Status: DRAFT <!-- APPROVED (by <who>, <date>) after the user gate -->
209
+
210
+ ## Segmentation
211
+ <!-- segments found in research, with evidence -->
212
+
213
+ ## Targeting
214
+ <!-- the CHOICE and its rationale; segments explicitly rejected and why -->
215
+
216
+ ## Positioning
217
+ - **Competitive alternatives:** <!-- incl. "do nothing" -->
218
+ - **Unique attributes:**
219
+ - **Value (evidence-backed):**
220
+ - **Best-fit segment:**
221
+ - **Market category:**
222
+
223
+ > For [segment] who [need], [name] is the [category] that [unique value],
224
+ > unlike [main alternative] which [limitation].
225
+
226
+ <!-- Swap test result: statement with top competitor's name substituted must be FALSE. State it. -->
227
+
228
+ ## Messaging house
229
+ - **Roof (value proposition):**
230
+ - **Pillar 1:** ... — proof points: ...
231
+ - **Pillar 2:** ... — proof points: ...
232
+ ```
233
+
234
+ ## mkt_docs/tactics/TACTICAL_PLAN.md
235
+
236
+ Parsed mechanically: keep the `Total budget:` line and the three tables with these exact column headers. Budget numbers plain or with k/M suffix; the validator strips currency symbols.
237
+
238
+ ```markdown
239
+ ---
240
+ description: Channel plan, budget allocation and funnel model.
241
+ status: DRAFT
242
+ ---
243
+ # Tactical Plan
244
+
245
+ Total budget: 15000
246
+
247
+ ## Channel Plan
248
+ | Channel | Objective | KPI | Budget | Owner |
249
+ |---|---|---|---|---|
250
+ | (example) Google Ads | O1 | CPL <= 30 [EV-04] | 6000 | founder |
251
+
252
+ <!-- Enabler-row convention: an objective that is a PRECONDITION (measurement,
253
+ tracking, tooling setup) is not a spend channel but still needs a serving
254
+ tactic for the trace check. Give it a row with Budget 0 and Owner set;
255
+ it is intentionally absent from Budget Allocation (which must sum). -->
256
+ <!-- Gate riders: when the client approves a plan/strategy at a gate WITH a
257
+ condition, record the rider in the approved doc's header (Status line),
258
+ not only in chat — the next session and the reviewer must see it. -->
259
+
260
+
261
+ ## Budget Allocation
262
+ | Channel | Budget | Share |
263
+ |---|---|---|
264
+ | (example) Google Ads | 6000 | 40% |
265
+
266
+ <!-- allocations must sum to Total budget (±1%) — mkt_check.py budget -->
267
+
268
+ ## Funnel Model
269
+ | Channel | Budget | CPC | Clicks | CVR % | Leads | Close % | Customers | CAC |
270
+ |---|---|---|---|---|---|---|---|---|
271
+ | (example) Google Ads | 6000 | 1.50 [EV-04] | 4000 | 3 [EV-05] | 120 | 20 [EV-02] | 24 | 250 |
272
+
273
+ <!-- each row must recompute: Clicks=Budget/CPC, Leads=Clicks*CVR%,
274
+ Customers=Leads*Close%, CAC=Budget/Customers (±5%) — mkt_check.py funnel.
275
+ Compare total Customers to the objective targets; declare any gap. -->
276
+ <!-- Sales-led / B2B: this table is shaped for immediate-purchase e-commerce.
277
+ For a long-cycle B2B motion, read `Customers` as QUALIFIED DEMOS/LEADS and
278
+ `CAC` as cost-per-qualified-demo (state the relabel), put ONLY paid click
279
+ channels here, and represent referral/content/outbound + the multi-stage
280
+ sales funnel (MQL→SQL→demo→POC→won) and closed-won lag in a separate
281
+ "Pipeline build-up vs objective" section. See frameworks.md. -->
282
+
283
+ ## Channel selection rationale
284
+ <!-- matrix scores or written rationale per chosen channel; rejected channels and why -->
285
+ ```
286
+
287
+ ## mkt_docs/tactics/ACTION_90D.md
288
+
289
+ ```markdown
290
+ ---
291
+ description: Sequenced 90-day action plan.
292
+ status: DRAFT
293
+ ---
294
+ # 90-Day Action Plan
295
+
296
+ ## Weeks 1-2 (day-level)
297
+ | Day | Action | Owner | Depends on |
298
+ |---|---|---|---|
299
+
300
+ ## Weeks 3-12 (week-level)
301
+ | Week | Actions | Owner | Milestone |
302
+ |---|---|---|---|
303
+ ```
304
+
305
+ ## mkt_docs/tactics/MEASUREMENT_PLAN.md
306
+
307
+ The KPI table is parsed for trace: every objective id must appear.
308
+
309
+ ```markdown
310
+ ---
311
+ description: KPI tree, targets, review cadence and kill/scale criteria.
312
+ status: DRAFT
313
+ ---
314
+ # Measurement Plan
315
+
316
+ ## North star
317
+ <!-- the one metric, and why -->
318
+
319
+ ## KPI table
320
+ | Objective | KPI | Target | Benchmark | Cadence |
321
+ |---|---|---|---|---|
322
+ | O1 | (example) CPL | <= 30 | [EV-04] | weekly |
323
+
324
+ ## Kill / scale criteria
325
+ | Channel | Kill if | Scale if |
326
+ |---|---|---|
327
+ | (example) Google Ads | CAC > 400 after 3000 spent | CAC < 200 at 2x volume |
328
+
329
+ ## Review cadence
330
+ <!-- weekly channel KPIs, monthly objectives, quarterly strategy -->
331
+ ```
332
+
333
+ ## mkt_docs/tactics/CAMPAIGN_[name].md (E2)
334
+
335
+ ```markdown
336
+ ---
337
+ description: Campaign plan for [name].
338
+ status: DRAFT
339
+ ---
340
+ # Campaign: [name]
341
+
342
+ ## Brief
343
+ <!-- objective (link to O# or approved strategy context), audience, offer, KPI -->
344
+
345
+ Total budget: 3000
346
+
347
+ ## Budget Allocation
348
+ | Channel | Budget | Share |
349
+ |---|---|---|
350
+
351
+ ## Funnel Model
352
+ | Channel | Budget | CPC | Clicks | CVR % | Leads | Close % | Customers | CAC |
353
+ |---|---|---|---|---|---|---|---|---|
354
+
355
+ ## Timeline & owners
356
+ ## Kill / scale criteria
357
+ ```
358
+
359
+ ## mkt_docs/deliverables/MARKETING_PLAN.md
360
+
361
+ Assembled from the APPROVED artifacts — assembly, not rewriting; on divergence the approved artifact wins. Exempt from the 80-line cap.
362
+
363
+ ```markdown
364
+ ---
365
+ description: The assembled marketing plan (SOSTAC) — the deliverable.
366
+ status: DRAFT
367
+ ---
368
+ # Marketing Plan — [business], [cycle]
369
+
370
+ ## Executive Summary
371
+ <!-- one page: goal, strategy in two sentences, budget, expected outcome, top 3 risks -->
372
+
373
+ ## Assumptions
374
+ <!-- every material ASSUMPTION [EV-nn] with range and what changes if it is wrong -->
375
+
376
+ ## 1. Situation
377
+ <!-- from research + situation analysis: market [EV], competitors, VoC, SWOT -->
378
+
379
+ ## 2. Objectives
380
+ <!-- from OBJECTIVES.md -->
381
+
382
+ ## 3. Strategy
383
+ <!-- from STRATEGY.md: STP, positioning, messaging -->
384
+
385
+ ## 4. Tactics
386
+ <!-- from TACTICAL_PLAN.md: channels, budget, funnel -->
387
+
388
+ ## 5. Action
389
+ <!-- from ACTION_90D.md -->
390
+
391
+ ## 6. Control
392
+ <!-- from MEASUREMENT_PLAN.md: KPIs, cadence, kill/scale -->
393
+
394
+ ## Appendix — Evidence Ledger
395
+ <!-- the ledger table, verbatim -->
396
+ ```
397
+
398
+ ## mkt_docs/deliverables/ONE_PAGER.md
399
+
400
+ ```markdown
401
+ ---
402
+ description: One-page strategy summary for stakeholders.
403
+ status: DRAFT
404
+ ---
405
+ # [Business] — Marketing on a Page
406
+
407
+ **Goal:** ... **Budget:** ... [EV-nn] **Horizon:** ...
408
+ **Positioning:** <!-- the statement -->
409
+ **Objectives:** <!-- O1..On, one line each -->
410
+ **Core channels:** <!-- 2-3, with budget share -->
411
+ **We will know it works when:** <!-- top KPIs -->
412
+ **We stop/scale when:** <!-- headline kill/scale criteria -->
413
+ ```
414
+
415
+ ## mkt_docs/spikes/RESEARCH_[topic].md
416
+
417
+ ```markdown
418
+ # Research Spike: [topic]
419
+
420
+ ## Question to answer
421
+ ## Time-box
422
+ ## Method & sources
423
+ ## Answer / Outcome
424
+ <!-- ledger rows created: EV-nn..EV-mm -->
425
+ ## Consequences
426
+ <!-- max 1 page. For strategy decisions, feed into E2/E3. -->
427
+ ```
428
+
429
+ ## mkt_docs/audit/handoff.md
430
+
431
+ Just a pointer, ≤ 20 lines.
432
+
433
+ ```markdown
434
+ # Handoff
435
+ Date: 2026-01-01 (UTC)
436
+ Engagement: E3 — [name]
437
+ Agent: Claude
438
+
439
+ ## Phase state
440
+ - Phase reached: <!-- e.g. 6 Strategy, awaiting user gate -->
441
+
442
+ ## Next step
443
+ <!-- one line -->
444
+
445
+ ## Session notes
446
+ <!-- gates passed? open review findings? ledger rows pending sources? -->
447
+ ```
448
+
449
+ ## audit/handoff.md (under the docs root) — the workstream registry
450
+
451
+ One row per OPEN workstream, ≤ 20 lines. **Parallel-safe by construction**: closing
452
+ one milestone removes one row and never touches another's resume point — the defect
453
+ this replaces was a single narrative slot where the last session to close overwrote
454
+ everyone else's handoff. It is an **inventory for lookup** (like the generated
455
+ manifest), not a work board: no assignment, no due dates, no execution ordering.
456
+
457
+ Updated at every L3 closure (row removed) AND at session end with work still
458
+ IN_PROGRESS (row refreshed) — see Write Triggers.
459
+
460
+ **Coming from a pre-1.17 project** (narrative handoff with `## Active features` /
461
+ `## Next step` / `## Session notes`): nothing is broken and nothing is urgent — the
462
+ validator only checks the `Date:` header and its age, and the orientation hook reads
463
+ the file verbatim. Read it as a one-row registry, and convert it the next time the
464
+ write trigger fires: each `## Active features` bullet becomes a row, `## Next step`
465
+ becomes that row's next step, `## Session notes` becomes `## Project-wide notes`.
466
+ Migrating a repository that is not being worked on buys nothing.
467
+
468
+ ```markdown
469
+ # Handoff — workstream registry
470
+ Date: 2026-06-11 (UTC)
471
+
472
+ | Workstream | Level | Branch | Status | Since | Next step | Details |
473
+ |---|---|---|---|---|---|---|
474
+ | F-001 SSO login | L3 | feature/sso-login | PROGRESS | 2026-06-10 | wire callback tests | HANDOFF_login_sso.md · ANALYSIS_login_sso.md |
475
+ | F-002 Audit refresh | L3 | feature/audit | PAUSED | 2026-06-02 | resume at Phase 4 | ANALYSIS_audit_refresh.md (no volatile state) |
476
+
477
+ ## Project-wide notes
478
+ <!-- one or two lines: release pending, environment quirks that affect everyone -->
479
+ ```
480
+
481
+ ## audit/reviews/REVIEW_LOG.md (under the docs root)
482
+
483
+ One row per completed review (`review.md` §When a review is due). Append-only; it
484
+ is the record that the gate ran and what it was worth. **One schema for both
485
+ modes** — a Hybrid project's devPNT gates write to this same file, so Standalone
486
+ adds values to the existing columns rather than a second table.
487
+
488
+ ```markdown
489
+ # Independent Review Log
490
+
491
+ | date | doc_key | tier | reviewer | findings_raised | findings_real | verdict | revise_rounds |
492
+ |---|---|---|---|---|---|---|---|
493
+ | 2026-06-11 | ANALYSIS_login_sso.md | design | subagent (opus, fresh ctx) | 4 | 3 | PASS | 2 |
494
+ | 2026-06-12 | diff feature/sso-login | closure | self-pass (declared; no subagent facility) | 2 | 2 | PASS | 1 |
495
+
496
+ ## Notes
497
+ <!-- One short paragraph per review that found something worth remembering: what
498
+ the findings actually were, and what changed because of them. The table
499
+ answers "was it reviewed and by what"; this answers "what did it find" —
500
+ which is where `review.md`'s per-finding outcomes live. Omit for a clean
501
+ review; a row with 0 findings needs no note. -->
502
+ ```
503
+
504
+ `tier` is the moment plus, in Hybrid, the reviewer weight: `design`, `design (late)`
505
+ and `closure` (Standalone); `deep`, `light`, `code`, `guide`, `vision` (devPNT gates
506
+ and the Vision blind check). The validator reads this column by its header name, so
507
+ extra or reordered columns are fine — but the header must say `tier`. `reviewer`
508
+ records the realization actually used — fresh subagent, one-shot client run, or a
509
+ **declared** self-pass. Writing `self-pass` where independence was unavailable is
510
+ honest; writing nothing, or implying independence you did not have, is the failure
511
+ this column exists to prevent. `findings_real` is how many raised findings survived
512
+ triage: over time it is the only evidence of whether the gate earns its cost.
513
+
514
+ ## audit/HANDOFF_[engagement].md (under the docs root) — volatile resume logistics (ephemeral)
515
+
516
+ **Resume logistics ONLY; the ANALYSIS Diary keeps the durable narrative (DRY).**
517
+ The boundary: Diary = what happened and why (decisions, state of the work — survives
518
+ forever); this file = how to pick the work back up (branch/worktree, uncommitted
519
+ state, environment notes, the next concrete command — worthless once resumed).
520
+ Created only when a session pauses the feature WITH volatile state to record;
521
+ **DELETED at the feature's closure**, in the same step that flips the ANALYSIS to
522
+ COMPLETED — anything in it worth keeping was in the wrong file.
523
+
524
+ ```markdown
525
+ # HANDOFF: [engagement] (ephemeral — deleted at closure)
526
+ Updated: 2026-06-11 (UTC)
527
+ Branch: feature/sso-login (worktree ../wt-sso)
528
+
529
+ ## Resume state
530
+ <!-- uncommitted files, half-run migrations, env vars, running services -->
531
+
532
+ ## Next command
533
+ <!-- the literal next thing to run or edit -->
534
+
535
+ ## Watch out
536
+ <!-- traps discovered this session that bite on resume (locks, CRLF, flaky test) -->
537
+ ```
538
+
539
+ ## strategic/architecture.md and existing_features.md (under the docs root)
540
+
541
+ Canonical docs: they open with the header (`description:`/`status:`) so they enter the `INDEX.md` manifest cleanly.
542
+
543
+ ```markdown
544
+ ---
545
+ description: Stack, directory structure, component map and architectural patterns of the project.
546
+ status: CURRENT
547
+ ---
548
+ # Project Architecture
549
+ ## Technology Stack
550
+ ## Directory Structure
551
+ ## Component Map
552
+ <!-- The inventory the architect pass reads BEFORE searching the code
553
+ (`architect.md` §2). One row per component that OWNS a capability:
554
+ Capability = what it lets the system DO (a verb over a domain noun, naming
555
+ no file). Contract = what it guarantees its consumers, in one line, stated
556
+ without naming any single consumer. Where = a path, or `path#symbol` when
557
+ the component is smaller than its file.
558
+ Seeded at bootstrap; a row is added or corrected in the SAME closure that
559
+ builds — or merely discovers — a component, and the area is marked ANALYZED.
560
+ A directory is not a component: rows name what owns a capability, not where
561
+ files sit (that is ## Directory Structure above). An absent or stale map is
562
+ why the next feature rules the same capability MISSING a second time and
563
+ builds it again. -->
564
+
565
+ Coverage: whatever `audit/audit_plan.md` marks ANALYZED — **read it, do not trust a
566
+ list restated here** (a hand-copied list is a cache with no invalidation). Outside
567
+ those areas this map is **unread, not empty**: it can never ground a MISSING
568
+ verdict, and the code is searched instead (`architect.md` §2).
569
+
570
+ | Component | Capability it owns | Contract | Where |
571
+ |---|---|---|---|
572
+ | ... | ... | ... | ... |
573
+
574
+ <!-- Where is `path/to/file.py#Symbol`. Leave the placeholder row untouched until
575
+ the map has a real component: the validator skips an all-`...` row, so a
576
+ freshly seeded project is never nagged about a table nobody has filled in. -->
577
+
578
+ ## Architectural Patterns
579
+ ```
580
+
581
+ ```markdown
582
+ ---
583
+ description: Concise catalog of the project's existing features.
584
+ status: CURRENT
585
+ ---
586
+ # Existing Features
587
+ - [ID] **Feature Name**: Description
588
+ ```
589
+
590
+ `strategic/features_history.md` and `INDEX.md` (under the docs root) have NO template: they are generated by the validator's `index` command.
591
+
592
+ ## README.md (the docs root's reading guide)
593
+
594
+ Curated must-read index, by hand (it is NOT the generated manifest). Created at init, updated rarely, only for real must-reads.
595
+
596
+ ```markdown
597
+ ---
598
+ default_domain: marketing
599
+ ---
600
+ # docs root — reading guide
601
+
602
+ Must-reads for this project, in order. The full manifest of canonical docs is
603
+ `INDEX.md` (generated — regenerate with `sdlc_check.py index`, never edit by hand).
604
+
605
+ 1. `reference/INDEX.md` — the guide router: which guide already governs the work you are about to do (generated).
606
+ 2. `vision/project_vision.md` — why the project exists (check its Status first).
607
+ 3. `strategic/architecture.md` — how it is built.
608
+ 4. `audit/handoff.md` — where work stopped last session (if present).
609
+
610
+ Directory purposes: `vision/` (project direction), `strategic/` (architecture and
611
+ feature catalog), `reference/` (operative guides), `solutions/` (per-feature
612
+ analyses, discovery-by-grep), `audit/` (audit plan and handoff).
613
+ ```
614
+
615
+ `default_domain:` is the project's answer for every document that does not declare its own `domain:`. Whichever lens's `init` created the project seeds it; a later init never overwrites it, and an absent line resolves to `code` — so every project created before this field existed keeps behaving exactly as it did. It is written once, at project level, precisely so that the same tree gets **the same verdict from every installed lens**.
616
+