@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.
- package/CHANGELOG.md +68 -18
- package/README.md +67 -45
- package/gemini-extension.json +6 -6
- package/package.json +50 -45
- package/scripts/init.js +214 -146
- package/scripts/lib.js +183 -170
- package/scripts/postinstall.js +42 -42
- package/scripts/preuninstall.js +17 -17
- package/skills/mkt-agentic-sdlc/ENFORCEMENT.md +116 -82
- package/skills/mkt-agentic-sdlc/SKILL.md +236 -201
- package/skills/mkt-agentic-sdlc/dispatch.md +87 -0
- package/skills/mkt-agentic-sdlc/elicitation.md +147 -89
- package/skills/mkt-agentic-sdlc/frameworks.md +105 -105
- package/skills/mkt-agentic-sdlc/guides.md +287 -0
- package/skills/mkt-agentic-sdlc/research.md +104 -104
- package/skills/mkt-agentic-sdlc/review.md +168 -73
- package/skills/mkt-agentic-sdlc/routing.md +100 -0
- package/skills/mkt-agentic-sdlc/scripts/mkt_check.py +677 -567
- package/skills/mkt-agentic-sdlc/scripts/sdlc_core.py +1996 -0
- package/skills/mkt-agentic-sdlc/templates.md +616 -444
- package/skills/mkt-agentic-sdlc/vision.md +245 -0
|
@@ -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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
##
|
|
63
|
-
<!--
|
|
64
|
-
|
|
65
|
-
##
|
|
66
|
-
<!--
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
##
|
|
77
|
-
<!--
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
---
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
-
|
|
123
|
-
- **
|
|
124
|
-
- **
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
---
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
<!--
|
|
171
|
-
|
|
172
|
-
##
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
##
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
<!--
|
|
209
|
-
|
|
210
|
-
##
|
|
211
|
-
<!--
|
|
212
|
-
|
|
213
|
-
##
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
- **
|
|
218
|
-
- **
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
<!--
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
##
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
---
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
##
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
---
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
##
|
|
371
|
-
<!--
|
|
372
|
-
|
|
373
|
-
##
|
|
374
|
-
<!--
|
|
375
|
-
|
|
376
|
-
##
|
|
377
|
-
<!-- from
|
|
378
|
-
|
|
379
|
-
##
|
|
380
|
-
<!-- from
|
|
381
|
-
|
|
382
|
-
##
|
|
383
|
-
<!-- from
|
|
384
|
-
|
|
385
|
-
##
|
|
386
|
-
<!-- from
|
|
387
|
-
|
|
388
|
-
##
|
|
389
|
-
<!-- from
|
|
390
|
-
|
|
391
|
-
##
|
|
392
|
-
<!--
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
---
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
**
|
|
408
|
-
**
|
|
409
|
-
**
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
##
|
|
421
|
-
|
|
422
|
-
##
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
##
|
|
440
|
-
<!--
|
|
441
|
-
|
|
442
|
-
##
|
|
443
|
-
<!--
|
|
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
|
+
|