taketomarket 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +419 -0
  4. package/agents/ttm-producer.md +53 -0
  5. package/bin/lib/campaign.cjs +553 -0
  6. package/bin/lib/commit.cjs +105 -0
  7. package/bin/lib/core.cjs +172 -0
  8. package/bin/lib/deviation.cjs +149 -0
  9. package/bin/lib/drift-log.cjs +219 -0
  10. package/bin/lib/health.cjs +438 -0
  11. package/bin/lib/slug.cjs +59 -0
  12. package/bin/lib/state.cjs +96 -0
  13. package/bin/ttm-tools.cjs +157 -0
  14. package/gates/base-gates.md +266 -0
  15. package/gates/discipline/.gitkeep +0 -0
  16. package/gates/gate-evaluation.md +341 -0
  17. package/gates/meta-gates.md +19 -0
  18. package/install.js +307 -0
  19. package/package.json +53 -0
  20. package/playbooks/.gitkeep +0 -0
  21. package/playbooks/aeo.md +223 -0
  22. package/playbooks/affiliate.md +272 -0
  23. package/playbooks/base.md +110 -0
  24. package/playbooks/email.md +306 -0
  25. package/playbooks/events.md +320 -0
  26. package/playbooks/linkedin.md +263 -0
  27. package/playbooks/paid-ads.md +318 -0
  28. package/playbooks/pr-media.md +296 -0
  29. package/playbooks/seo.md +284 -0
  30. package/playbooks/social.md +305 -0
  31. package/playbooks/youtube.md +325 -0
  32. package/references/context-loading.md +107 -0
  33. package/references/learnings-extraction.md +94 -0
  34. package/references/measurement-template.md +48 -0
  35. package/references/meta-gate-evaluation.md +169 -0
  36. package/references/positioning-check-report.md +197 -0
  37. package/references/review-checklist.md +78 -0
  38. package/references/ship-checklist-items.md +94 -0
  39. package/settings.json +4 -0
  40. package/skills/ttm-aeo-check/SKILL.md +20 -0
  41. package/skills/ttm-affiliate-kit/SKILL.md +19 -0
  42. package/skills/ttm-archive/SKILL.md +13 -0
  43. package/skills/ttm-brand-refresh/SKILL.md +19 -0
  44. package/skills/ttm-brief/SKILL.md +14 -0
  45. package/skills/ttm-competitor-scan/SKILL.md +19 -0
  46. package/skills/ttm-email-preflight/SKILL.md +19 -0
  47. package/skills/ttm-fix/SKILL.md +13 -0
  48. package/skills/ttm-health/SKILL.md +12 -0
  49. package/skills/ttm-icp-refresh/SKILL.md +19 -0
  50. package/skills/ttm-init/SKILL.md +12 -0
  51. package/skills/ttm-keyword-map/SKILL.md +19 -0
  52. package/skills/ttm-learn/SKILL.md +14 -0
  53. package/skills/ttm-measure/SKILL.md +14 -0
  54. package/skills/ttm-new-campaign/SKILL.md +13 -0
  55. package/skills/ttm-next/SKILL.md +12 -0
  56. package/skills/ttm-positioning-check/SKILL.md +19 -0
  57. package/skills/ttm-positioning-shift/SKILL.md +19 -0
  58. package/skills/ttm-produce/SKILL.md +14 -0
  59. package/skills/ttm-repurpose/SKILL.md +20 -0
  60. package/skills/ttm-research/SKILL.md +13 -0
  61. package/skills/ttm-resume/SKILL.md +13 -0
  62. package/skills/ttm-review/SKILL.md +13 -0
  63. package/skills/ttm-seo-audit/SKILL.md +20 -0
  64. package/skills/ttm-ship/SKILL.md +13 -0
  65. package/skills/ttm-state/SKILL.md +13 -0
  66. package/skills/ttm-verify/SKILL.md +14 -0
  67. package/templates/agents-md.md +65 -0
  68. package/templates/campaign-brief.md +74 -0
  69. package/templates/campaign-research.md +39 -0
  70. package/templates/campaign-state.md +40 -0
  71. package/templates/claude-md.md +65 -0
  72. package/templates/deviation-log.md +12 -0
  73. package/templates/drift-log.md +17 -0
  74. package/templates/fix-brief.md +59 -0
  75. package/templates/fix-log.md +22 -0
  76. package/templates/measurement-report.md +75 -0
  77. package/templates/migration-plan.md +24 -0
  78. package/templates/production-manifest.json +20 -0
  79. package/templates/reference-files/brand.md +45 -0
  80. package/templates/reference-files/calendar.md +30 -0
  81. package/templates/reference-files/channels.md +40 -0
  82. package/templates/reference-files/competitors.md +40 -0
  83. package/templates/reference-files/icp.md +50 -0
  84. package/templates/reference-files/learnings.md +40 -0
  85. package/templates/reference-files/metrics.md +42 -0
  86. package/templates/reference-files/positioning.md +38 -0
  87. package/templates/reference-files/state.md +27 -0
  88. package/templates/verification-report.md +59 -0
  89. package/workflows/discipline/.gitkeep +0 -0
  90. package/workflows/discipline/aeo-check.md +180 -0
  91. package/workflows/discipline/affiliate-kit.md +147 -0
  92. package/workflows/discipline/email-preflight.md +150 -0
  93. package/workflows/discipline/keyword-map.md +125 -0
  94. package/workflows/discipline/repurpose.md +329 -0
  95. package/workflows/discipline/seo-audit.md +169 -0
  96. package/workflows/lifecycle/.gitkeep +0 -0
  97. package/workflows/lifecycle/brief-positioning-check.md +90 -0
  98. package/workflows/lifecycle/brief.md +355 -0
  99. package/workflows/lifecycle/fix.md +495 -0
  100. package/workflows/lifecycle/learn.md +405 -0
  101. package/workflows/lifecycle/measure.md +379 -0
  102. package/workflows/lifecycle/produce.md +383 -0
  103. package/workflows/lifecycle/research.md +264 -0
  104. package/workflows/lifecycle/review.md +432 -0
  105. package/workflows/lifecycle/ship.md +521 -0
  106. package/workflows/lifecycle/verify.md +507 -0
  107. package/workflows/reference-mgmt/.gitkeep +0 -0
  108. package/workflows/reference-mgmt/brand-refresh.md +193 -0
  109. package/workflows/reference-mgmt/competitor-scan.md +228 -0
  110. package/workflows/reference-mgmt/icp-refresh.md +200 -0
  111. package/workflows/reference-mgmt/positioning-check.md +339 -0
  112. package/workflows/reference-mgmt/positioning-shift.md +368 -0
  113. package/workflows/setup/.gitkeep +0 -0
  114. package/workflows/setup/init-questions.md +225 -0
  115. package/workflows/setup/init-validation.md +155 -0
  116. package/workflows/setup/init.md +449 -0
  117. package/workflows/setup/new-campaign.md +134 -0
  118. package/workflows/utility/.gitkeep +0 -0
  119. package/workflows/utility/archive.md +334 -0
  120. package/workflows/utility/health.md +166 -0
  121. package/workflows/utility/next.md +187 -0
  122. package/workflows/utility/resume.md +249 -0
  123. package/workflows/utility/state.md +207 -0
@@ -0,0 +1,107 @@
1
+ # Context Loading Strategy
2
+
3
+ ## Overview
4
+
5
+ takeToMarket uses a two-tier context loading strategy to maximize the usable context window for actual work. Every reference file in `.marketing/` has a compact Tier 1 summary and a full Tier 2 body. Workflows load only what they need.
6
+
7
+ ## Tier 1: Universal Summaries
8
+
9
+ **Budget:** ~2,000 tokens total across all 9 reference files.
10
+
11
+ Tier 1 content is the `<!-- _SUMMARY -->` block at the top of each reference file, delimited by `<!-- END_SUMMARY -->`. It contains the minimum context needed to enforce positioning invariants, check brand voice, and understand campaign scope.
12
+
13
+ **When loaded:** Every workflow loads all Tier 1 summaries. This is non-negotiable -- positioning enforcement requires ambient awareness of the positioning summary in every context.
14
+
15
+ **Implementation:** The AI reads from the start of the file to the `<!-- END_SUMMARY -->` delimiter. Everything below the delimiter is Tier 2.
16
+
17
+ ## Tier 2: Full Reference Content
18
+
19
+ Tier 2 is the complete file content below `<!-- END_SUMMARY -->`. It includes detailed tables, examples, history, and configuration.
20
+
21
+ **When loaded:** Only by workflows that need the full content for their specific task. Loading Tier 2 for all files would consume ~15,000-20,000 tokens -- acceptable for production workflows but wasteful for state checks.
22
+
23
+ ## Per-File Token Budgets
24
+
25
+ | File | Tier 1 Budget | Tier 2 Loaded By |
26
+ |------|---------------|------------------|
27
+ | POSITIONING.md | ~150 words | produce, verify, positioning-check |
28
+ | BRAND.md | ~100 words | produce, verify, brand-refresh |
29
+ | ICP.md | ~100 words | produce, verify, icp-refresh, brief |
30
+ | CHANNELS.md | ~80 words | brief, measure |
31
+ | STATE.md | frontmatter only | state, resume, next, health |
32
+ | CALENDAR.md | ~80 words | brief, new-campaign |
33
+ | COMPETITORS.md | ~80 words | research, competitor-scan |
34
+ | METRICS.md | ~80 words | measure, brief |
35
+ | LEARNINGS.md | ~80 words | brief, learn |
36
+
37
+ **Total Tier 1:** ~830 words / ~1,100 tokens (well within the ~2,000 token budget)
38
+
39
+ ## Workflow-to-Reference Loading Matrix
40
+
41
+ | Workflow | Tier 1 (all summaries) | Tier 2 Files Loaded |
42
+ |----------|----------------------|---------------------|
43
+ | /ttm-init | N/A (creates files) | N/A |
44
+ | /ttm-new-campaign | Yes | CALENDAR.md |
45
+ | /ttm-brief | Yes | ICP.md, CHANNELS.md, METRICS.md, CALENDAR.md |
46
+ | /ttm-produce | Yes | POSITIONING.md, BRAND.md, ICP.md + playbook |
47
+ | /ttm-verify | Yes | POSITIONING.md, BRAND.md, ICP.md + gates |
48
+ | /ttm-review | Yes | None (human review) |
49
+ | /ttm-fix | Yes | Same as verify |
50
+ | /ttm-ship | Yes | CHANNELS.md |
51
+ | /ttm-measure | Yes | METRICS.md, CHANNELS.md |
52
+ | /ttm-learn | Yes | LEARNINGS.md, METRICS.md |
53
+ | /ttm-state | Yes | None |
54
+ | /ttm-resume | Yes | None |
55
+ | /ttm-health | Yes | None |
56
+ | /ttm-positioning-check | Yes | POSITIONING.md |
57
+ | /ttm-positioning-shift | Yes | POSITIONING.md |
58
+ | /ttm-brand-refresh | Yes | BRAND.md |
59
+ | /ttm-icp-refresh | Yes | ICP.md |
60
+ | /ttm-competitor-scan | Yes | COMPETITORS.md |
61
+ | /ttm-research | Yes | COMPETITORS.md |
62
+
63
+ ## Rules for Workflow Authors
64
+
65
+ 1. **Always load Tier 1 summaries.** Every workflow starts by reading the `_SUMMARY` block from all 9 reference files. This ensures positioning enforcement is always active.
66
+
67
+ 2. **Only load Tier 2 when your workflow needs the full content.** Check the loading matrix above. If your workflow is not listed as a Tier 2 consumer for a file, do not load the full file.
68
+
69
+ 3. **STATE.md is special.** It uses YAML frontmatter instead of `_SUMMARY` blocks. Tier 1 is the frontmatter (parsed by `ttm-tools.cjs state read`). Tier 2 is the Markdown body.
70
+
71
+ 4. **Campaign-specific files are always full-loaded.** Files inside `CAMPAIGNS/<slug>/` do not use the two-tier pattern. They are loaded in full by the workflow that owns that campaign phase.
72
+
73
+ 5. **Playbooks are Tier 2 only.** Playbooks live in the plugin's `playbooks/` directory (not in `.marketing/`). They are loaded only by the produce workflow, one at a time, based on the campaign brief's channel selection.
74
+
75
+ ## Implementation Details
76
+
77
+ ### Delimiter Format
78
+
79
+ ```markdown
80
+ <!-- _SUMMARY: Tier 1 context (loaded universally, <200 words) -->
81
+ [compact summary content]
82
+ <!-- END_SUMMARY -->
83
+
84
+ [full Tier 2 content]
85
+ ```
86
+
87
+ ### Reading Tier 1 Only
88
+
89
+ The AI reads from line 1 to the line containing `<!-- END_SUMMARY -->`. Everything after is ignored unless the workflow explicitly requests Tier 2.
90
+
91
+ ### .marketing/ Directory Structure
92
+
93
+ ```
94
+ .marketing/
95
+ ├── POSITIONING.md
96
+ ├── BRAND.md
97
+ ├── ICP.md
98
+ ├── CHANNELS.md
99
+ ├── STATE.md
100
+ ├── CALENDAR.md
101
+ ├── COMPETITORS.md
102
+ ├── METRICS.md
103
+ ├── LEARNINGS.md
104
+ └── CAMPAIGNS/
105
+ ```
106
+
107
+ Note: The `.marketing/` directory does NOT contain a `PLAYBOOKS/` subdirectory. Playbooks live in the plugin's `playbooks/` directory and are loaded by reference during the Produce phase.
@@ -0,0 +1,94 @@
1
+ # Learnings Extraction Guide
2
+
3
+ Reference file for /ttm-archive workflow. Provides structured instructions for extracting
4
+ compound learnings from a completed campaign before archival. Loaded via @-syntax to keep
5
+ the archive workflow under 500 lines.
6
+
7
+ ## Extraction Structure
8
+
9
+ ### What Worked
10
+
11
+ Scan the campaign artifacts for indicators of success:
12
+
13
+ - **Gate passes on first attempt:** Check STATE.md gate fields -- any gate with `pass` result AND verify.run_count = 1 indicates a strong pattern worth extracting.
14
+ - **High review scores:** Check REVIEW-FEEDBACK-*.md for "approved" or "ship-ready" without revision requests.
15
+ - **No fix loops:** If fix.run_count is null or 0, the campaign passed verification without needing fixes -- extract the approach that drove this.
16
+ - **Asset-level wins:** Check MANIFEST.json for assets with review_status = "approved" on first submission.
17
+
18
+ For each success, identify the specific pattern or approach that drove it (positioning angle, hook strategy, format choice, channel timing).
19
+
20
+ ### What Didn't Work
21
+
22
+ Scan for indicators of failure or friction:
23
+
24
+ - **Gate failures:** Any gate field with `fail` result -- check VERIFICATION.md for the specific failure details and root cause.
25
+ - **Fix loops:** If fix.run_count > 0, the campaign needed corrections. Check FIX-BRIEF-*.md for what was wrong and what was changed.
26
+ - **Review rejections:** Check REVIEW-FEEDBACK-*.md for revision requests -- extract what the reviewer flagged and why.
27
+ - **Multiple verification runs:** If verify.run_count > 1, initial assets failed quality gates -- determine what was missed.
28
+
29
+ For each failure, categorize using the Root-Cause Taxonomy below and extract the lesson.
30
+
31
+ ### Campaign-Level Decisions
32
+
33
+ Extract key strategic decisions made during the campaign for future reference:
34
+
35
+ - **Positioning anchor chosen:** Which specific positioning element from POSITIONING.md was the primary anchor? Did it resonate or need adjustment?
36
+ - **Channel mix rationale:** Why were the chosen channels selected? Was the rationale validated by results?
37
+ - **Hook strategy:** What hook approach was used (pain-point, curiosity, authority, social proof)? How did it perform?
38
+ - **ICP targeting:** Which ICP segment was targeted? Were there signals of fit or misfit?
39
+ - **Format decisions:** Why was the chosen format selected? Would a different format have worked better?
40
+
41
+ ## Root-Cause Taxonomy
42
+
43
+ Every lesson extracted from a failed or underperforming element must be categorized into one of these root causes:
44
+
45
+ | Category | Description |
46
+ |----------|-------------|
47
+ | positioning-drift | Asset deviated from POSITIONING.md -- used competitor language, wrong value prop, or off-brand messaging |
48
+ | weak-hook | Opening failed to capture attention -- generic intro, no specific pain addressed, buried lede |
49
+ | wrong-channel | Content published on ineffective channel for target ICP or content type |
50
+ | bad-timing | Published at wrong time, wrong cadence, or conflicted with external events |
51
+ | unverifiable-claim | Claim lacked proof point, source, or measurable evidence |
52
+ | broken-funnel | CTA or conversion path was broken, misaligned, or missing |
53
+ | creative-fatigue | Repeated format or angle with diminishing returns -- audience saturation |
54
+
55
+ For successful elements, use category `success` with a description of what pattern drove the win.
56
+
57
+ ## Output Format
58
+
59
+ Each extracted lesson must produce a table row for LEARNINGS.md:
60
+
61
+ ```
62
+ | Date | Campaign | Category | Lesson | Action Taken |
63
+ ```
64
+
65
+ Field definitions:
66
+
67
+ - **Date:** Archive date (today's ISO date, e.g., 2024-03-15)
68
+ - **Campaign:** Campaign slug (e.g., `spring-launch-2024`)
69
+ - **Category:** One of the root-cause taxonomy values above, or `success` for wins
70
+ - **Lesson:** One-sentence summary of what happened and why (be specific, not generic)
71
+ - **Action Taken:** Recommended or completed reference file update, or `none` if no systemic fix needed
72
+
73
+ Example rows:
74
+ ```
75
+ | 2024-03-15 | spring-launch | success | Pain-point hook with specific dollar amount drove 3x click-through vs generic hooks | Updated BRAND.md hook guidelines |
76
+ | 2024-03-15 | spring-launch | weak-hook | Email subject line was generic "Check out our new feature" with 8% open rate | none -- one-off issue |
77
+ | 2024-03-15 | spring-launch | positioning-drift | Blog post used "best-in-class" (competitor language) instead of our differentiation | Added to POSITIONING.md anti-patterns |
78
+ ```
79
+
80
+ ## Artifact Scanning Guide
81
+
82
+ Read these files from the campaign directory to extract learnings:
83
+
84
+ | File | What to Extract |
85
+ |------|----------------|
86
+ | `STATE.md` (frontmatter) | Gate results (gate.* fields), fix counts (fix.run_count), phase timestamps, verify run count |
87
+ | `MANIFEST.json` | Per-asset results, review status, asset types produced |
88
+ | `BRIEF.md` | Original strategy, positioning anchor, target ICP, channel mix rationale |
89
+ | `VERIFICATION.md` | Gate check details, pass/fail specifics, deviation justifications |
90
+ | `FIX-BRIEF-*.md` | What failed, root cause analysis, fix applied |
91
+ | `REVIEW-FEEDBACK-*.md` | Human reviewer comments, approval/rejection reasons, revision requests |
92
+ | `ASSETS/` | Final asset content for qualitative assessment of what shipped |
93
+
94
+ Scan order: STATE.md first (quantitative summary), then VERIFICATION.md and FIX-BRIEF (failure details), then REVIEW-FEEDBACK (human signal), then BRIEF.md (strategy context).
@@ -0,0 +1,48 @@
1
+ # Measurement Data Template
2
+
3
+ Paste your analytics data in any of these formats: CSV, Markdown table, or plain text.
4
+ Group your data into these categories:
5
+
6
+ ## Traffic Metrics
7
+
8
+ | Metric | Value |
9
+ |--------|-------|
10
+ | Page views | |
11
+ | Sessions | |
12
+ | Unique visitors | |
13
+ | Referral sources (top 5) | |
14
+
15
+ ## Engagement Metrics
16
+
17
+ | Metric | Value |
18
+ |--------|-------|
19
+ | Average time on page | |
20
+ | Bounce rate | |
21
+ | Pages per session | |
22
+ | Scroll depth (if available) | |
23
+
24
+ ## Conversion Metrics
25
+
26
+ | Metric | Value |
27
+ |--------|-------|
28
+ | Primary conversions (signups, purchases, etc.) | |
29
+ | Conversion rate | |
30
+ | Revenue (if applicable) | |
31
+ | Pipeline value (if applicable) | |
32
+
33
+ ## Channel Attribution Data
34
+
35
+ | Channel | Touches | Conversions | Revenue |
36
+ |---------|---------|-------------|---------|
37
+ | | | | |
38
+
39
+ ## Campaign-Specific Metrics
40
+
41
+ | Metric | Target | Actual |
42
+ |--------|--------|--------|
43
+ | [outcome metric from brief] | | |
44
+ | [output metric 1] | | |
45
+ | [output metric 2] | | |
46
+
47
+ > You can paste raw CSV, a screenshot transcript, or any structured data.
48
+ > The AI will map columns to the expected fields and ask for clarification on unmapped data.
@@ -0,0 +1,169 @@
1
+ # Meta-Gate Evaluation Reference
2
+
3
+ > This file is loaded by verify.md Step 4c via @-syntax. All meta-gates are Tier 2 advisory -- they produce findings in the report but do NOT block verification.
4
+
5
+ ## Usage
6
+
7
+ Meta-gates operate at the **portfolio level**, not on individual assets. They evaluate the campaign mix, scheduling, thematic alignment, and learning plans across all active campaigns.
8
+
9
+ **Data collection:** Run the following command to get all campaign states:
10
+
11
+ ```bash
12
+ node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs campaign list --raw
13
+ ```
14
+
15
+ Additional data sources: `.marketing/CALENDAR.md`, `.marketing/CAMPAIGNS/<slug>/BRIEF.md`
16
+
17
+ ## Structured Output Format
18
+
19
+ Each meta-gate evaluation MUST produce output in this format:
20
+
21
+ - **Gate:** [Gate Name] (META-XX)
22
+ - **Tier:** 2 (Advisory)
23
+ - **Result:** [PASS|WARN|FAIL]
24
+ - **Summary:** [One-sentence summary]
25
+ - **Evidence:** [Data supporting the finding]
26
+ - **Recommendation:** [Suggested action if WARN or FAIL; "None" if PASS]
27
+
28
+ ---
29
+
30
+ ## META-01: Portfolio Balance
31
+
32
+ **What it checks:** Whether the active campaign mix covers all funnel stages (awareness, consideration, conversion, retention) and does not over-index on any single stage.
33
+
34
+ **Tier:** 2 (Advisory)
35
+
36
+ **Data source:** `campaign list --raw` output + each campaign's BRIEF.md (funnel stage field)
37
+
38
+ ### Evaluation Criteria
39
+
40
+ **Check 1: Funnel Coverage**
41
+
42
+ Count the distinct funnel stages represented across all active campaigns.
43
+
44
+ - **PASS:** 3 or more funnel stages covered (e.g., awareness + consideration + conversion)
45
+ - **WARN:** 2 funnel stages covered
46
+ - **FAIL:** 1 funnel stage covered (all campaigns targeting the same stage)
47
+
48
+ **Check 2: Channel Diversity**
49
+
50
+ Count the distinct channels used across all active campaigns.
51
+
52
+ - **PASS:** 3 or more distinct channels
53
+ - **WARN:** 2 distinct channels
54
+ - **FAIL:** 1 channel only (single-channel dependency)
55
+
56
+ ### Aggregation
57
+
58
+ - If ALL checks PASS: META-01 = PASS
59
+ - If ANY check is WARN and none FAIL: META-01 = WARN
60
+ - If ANY check is FAIL: META-01 = FAIL
61
+
62
+ ---
63
+
64
+ ## META-02: Calendar Collision
65
+
66
+ **What it checks:** Scheduling conflicts between campaigns -- overlapping launch dates, competing for the same audience segment simultaneously, or conflicting messages in market at the same time.
67
+
68
+ **Tier:** 2 (Advisory)
69
+
70
+ **Data source:** `campaign list --raw` output + `.marketing/CALENDAR.md` + each campaign's BRIEF.md (launch date, audience segment)
71
+
72
+ ### Evaluation Criteria
73
+
74
+ **Check 1: Launch Overlap**
75
+
76
+ Compare launch dates across all active and scheduled campaigns.
77
+
78
+ - **PASS:** No 2 campaigns launch within a 3-day window
79
+ - **WARN:** 2 campaigns launch in the same week (but not within 3 days)
80
+ - **FAIL:** 3 or more campaigns launch in the same week
81
+
82
+ **Check 2: Audience Collision**
83
+
84
+ Compare target audience segments across campaigns launching in the same 2-week window.
85
+
86
+ - **PASS:** Different audience segments (no overlap)
87
+ - **WARN:** Same audience segment but different channels
88
+ - **FAIL:** Same audience segment AND same channel in the same 2-week window
89
+
90
+ ### Aggregation
91
+
92
+ - If ALL checks PASS: META-02 = PASS
93
+ - If ANY check is WARN and none FAIL: META-02 = WARN
94
+ - If ANY check is FAIL: META-02 = FAIL
95
+
96
+ ---
97
+
98
+ ## META-03: Theme Consistency
99
+
100
+ **What it checks:** Whether active campaigns align with the quarterly theme defined in CALENDAR.md. Flags campaigns that drift from the strategic narrative.
101
+
102
+ **Tier:** 2 (Advisory)
103
+
104
+ **Data source:** `.marketing/CALENDAR.md` (quarterly theme section) + each campaign's BRIEF.md
105
+
106
+ ### Evaluation Criteria
107
+
108
+ **Check 1: Theme Alignment**
109
+
110
+ Compare each active campaign's messaging theme against the current quarter's theme in CALENDAR.md.
111
+
112
+ - **PASS:** Campaign BRIEF.md contains explicit reference to the quarterly theme or directly supports it
113
+ - **WARN:** Campaign theme is adjacent to the quarterly theme but does not explicitly reference it
114
+ - **FAIL:** Campaign contradicts or ignores the quarterly theme without documented rationale
115
+
116
+ ### Aggregation
117
+
118
+ - If ALL campaigns PASS: META-03 = PASS
119
+ - If ANY campaign is WARN and none FAIL: META-03 = WARN
120
+ - If ANY campaign is FAIL: META-03 = FAIL
121
+
122
+ ---
123
+
124
+ ## META-04: Learning Plan
125
+
126
+ **What it checks:** Whether every campaign has a measurement plan and a learning hypothesis. Flags campaigns that ship without defining what success looks like or what the team will learn.
127
+
128
+ **Tier:** 2 (Advisory)
129
+
130
+ **Data source:** Each campaign's BRIEF.md (outcome metric, measurement plan, hypothesis sections)
131
+
132
+ ### Evaluation Criteria
133
+
134
+ **Check 1: Measurement Plan**
135
+
136
+ Verify each active campaign's BRIEF.md defines a complete measurement plan.
137
+
138
+ - **PASS:** Campaign has outcome metric + numeric target + measurement time window
139
+ - **WARN:** Campaign has outcome metric but is missing target value or measurement window
140
+ - **FAIL:** Campaign has no outcome metric defined
141
+
142
+ **Check 2: Testable Hypothesis**
143
+
144
+ Verify each active campaign's BRIEF.md includes a testable hypothesis.
145
+
146
+ - **PASS:** Campaign defines a specific, falsifiable hypothesis (e.g., "We believe [action] will produce [result] because [reason]")
147
+ - **WARN:** Campaign states a goal but does not frame it as a testable hypothesis
148
+ - **FAIL:** Campaign only has output targets (impressions, clicks) with no hypothesis about outcomes
149
+
150
+ ### Aggregation
151
+
152
+ - If ALL checks PASS: META-04 = PASS
153
+ - If ANY check is WARN and none FAIL: META-04 = WARN
154
+ - If ANY check is FAIL: META-04 = FAIL
155
+
156
+ ---
157
+
158
+ ## Summary Table Format
159
+
160
+ After evaluating all 4 meta-gates, present results in a summary table:
161
+
162
+ | # | Meta-Gate | Result | Key Finding |
163
+ |---|-----------|--------|-------------|
164
+ | 1 | Portfolio Balance (META-01) | [PASS/WARN/FAIL] | [one-line summary] |
165
+ | 2 | Calendar Collision (META-02) | [PASS/WARN/FAIL] | [one-line summary] |
166
+ | 3 | Theme Consistency (META-03) | [PASS/WARN/FAIL] | [one-line summary] |
167
+ | 4 | Learning Plan (META-04) | [PASS/WARN/FAIL] | [one-line summary] |
168
+
169
+ **All meta-gates are advisory.** They appear in the verification report's meta-gate section but do not affect the overall PASS/FAIL result of asset verification.
@@ -0,0 +1,197 @@
1
+ # Positioning Check Report Format
2
+
3
+ ## Usage
4
+
5
+ Referenced by `workflows/reference-mgmt/positioning-check.md` via @-syntax.
6
+ Defines the audit report format, drift categorization, trend comparison logic,
7
+ and cross-reference handling for accepted deviations.
8
+
9
+ ---
10
+
11
+ ## Drift Categories
12
+
13
+ Drift is evaluated using GATE-01's 3 checks. Each check maps to a category:
14
+
15
+ | Check # | Category | PASS Criteria | WARN Criteria | FAIL Criteria |
16
+ |---------|----------|---------------|---------------|---------------|
17
+ | 1 | Differentiator Alignment | Asset restates or naturally extends primary differentiator | Asset is neutral -- neither reinforces nor contradicts | Asset introduces a different/competing claim |
18
+ | 2 | Proof Point Sourcing | All factual claims backed by POSITIONING.md proof points | Some claims present but not all sourced | Claims contradict or fabricate proof points |
19
+ | 3 | Must-Not-Say Compliance | No terms from must-not-say list appear | Terms appear in non-customer-facing context | Must-not-say terms in customer-facing copy |
20
+
21
+ ---
22
+
23
+ ## Bleeding Analysis
24
+
25
+ Bleeding occurs when must-not-say terms from POSITIONING.md appear in **customer-facing** materials. This is distinct from general must-not-say drift -- non-customer-facing usage (internal briefs, planning docs) is a WARN, but customer-facing usage represents positioning "bleeding" into territory the brand explicitly avoids.
26
+
27
+ ### Asset Type Classification
28
+
29
+ Classify each asset as customer-facing or non-customer-facing based on its file path and content type:
30
+
31
+ | Asset Type | Classification | Examples |
32
+ |------------|---------------|----------|
33
+ | Landing pages, blog posts, ad copy, social posts, email campaigns | Customer-facing | Assets intended for external audience consumption |
34
+ | Internal briefs, research docs, planning notes, strategy docs | Non-customer-facing | Assets used internally for planning and alignment |
35
+
36
+ When asset type is ambiguous, classify as customer-facing (conservative default).
37
+
38
+ ### Bleeding Severity
39
+
40
+ | Check 3 Result | Asset Type | Bleeding Status | Severity |
41
+ |----------------|-----------|-----------------|----------|
42
+ | FAIL | Customer-facing | BLEEDING | Critical -- must-not-say term reaching external audience |
43
+ | WARN | Non-customer-facing | NOT BLEEDING | Advisory -- internal usage, lower risk |
44
+ | PASS | Any | CLEAN | No must-not-say terms found |
45
+
46
+ ---
47
+
48
+ ## Per-Asset Drift Calculation
49
+
50
+ Per-asset drift percentage = (WARN checks + FAIL checks) / total checks evaluated * 100
51
+
52
+ - 3 checks evaluated per asset (one per GATE-01 sub-check)
53
+ - PASS = 0 drift points, WARN = 1 drift point, FAIL = 1 drift point
54
+ - 0% = fully on-positioning, 33% = one check drifted, 67% = two checks drifted, 100% = fully off-positioning
55
+
56
+ ---
57
+
58
+ ## Aggregate Drift Calculation
59
+
60
+ Aggregate drift % = total drift points across all assets / (total assets * 3) * 100
61
+
62
+ Where:
63
+ - total drift points = count of all WARN + FAIL results across all assets and all 3 checks
64
+ - total assets * 3 = maximum possible drift points (3 checks per asset)
65
+
66
+ Example: 5 assets, 3 WARN findings, 1 FAIL finding = 4 / 15 * 100 = 26.7% aggregate drift
67
+
68
+ ---
69
+
70
+ ## Trend Comparison Logic
71
+
72
+ When a prior audit entry exists in `.marketing/DRIFT-LOG.md`:
73
+
74
+ 1. Find the most recent row in the Audit Trail table where Event = `audit`
75
+ 2. Parse the Details column to extract the prior aggregate drift percentage
76
+ - Expected format: `"Nd audit: X% drift, Y findings across Z assets"`
77
+ - Extract X as the prior drift percentage
78
+ 3. Calculate delta: current aggregate drift % - prior aggregate drift %
79
+ 4. Determine trend arrow:
80
+ - Delta > +5%: UP arrow (drift increasing -- worse)
81
+ - Delta < -5%: DOWN arrow (drift decreasing -- better)
82
+ - Delta between -5% and +5%: STABLE (no significant change)
83
+
84
+ If no prior audit entry exists: display "First audit -- no trend data available."
85
+
86
+ ---
87
+
88
+ ## Cross-Reference Logic
89
+
90
+ For each campaign in the audit window:
91
+
92
+ 1. Read `.marketing/CAMPAIGNS/<slug>/DEVIATIONS.md` if it exists
93
+ 2. Filter for rows where Gate = `positioning_drift` (GATE-01 deviations)
94
+ 3. These are assets where drift was previously detected but explicitly accepted by the user
95
+ 4. Include in the "Accepted Deviations" section of the report
96
+ 5. Accepted deviations still count toward the aggregate drift calculation (they represent
97
+ real drift, just intentionally accepted drift)
98
+
99
+ ---
100
+
101
+ ## Report Template
102
+
103
+ Present the audit report in this exact format:
104
+
105
+ ```
106
+ ========================================
107
+ takeToMarket > POSITIONING AUDIT REPORT
108
+ ========================================
109
+
110
+ Audit Window: last ${WINDOW}
111
+ Assets Audited: ${ASSET_COUNT} across ${CAMPAIGN_COUNT} campaigns
112
+ Date: ${ISO_DATE}
113
+
114
+ ----------------------------------------
115
+ AGGREGATE DRIFT: ${AGGREGATE_DRIFT}% ${TREND_ARROW}
116
+ ----------------------------------------
117
+ ${TREND_DETAIL}
118
+
119
+ ## Per-Asset Results
120
+
121
+ | # | Asset | Campaign | Differentiator | Proof Points | Must-Not-Say | Drift % |
122
+ |---|-------|----------|----------------|--------------|--------------|---------|
123
+ | 1 | ${ASSET_NAME} | ${CAMPAIGN_SLUG} | ${CHECK_1} | ${CHECK_2} | ${CHECK_3} | ${DRIFT_PCT}% |
124
+ | ... | ... | ... | ... | ... | ... | ... |
125
+
126
+ ## Drift Type Breakdown
127
+
128
+ | Category | Count | % of Total Findings |
129
+ |----------|-------|---------------------|
130
+ | Differentiator Alignment | ${DIFF_COUNT} | ${DIFF_PCT}% |
131
+ | Proof Point Sourcing | ${PROOF_COUNT} | ${PROOF_PCT}% |
132
+ | Must-Not-Say Violations | ${MNS_COUNT} | ${MNS_PCT}% |
133
+
134
+ ## Bleeding Analysis
135
+
136
+ Must-not-say terms that have bled into customer-facing materials:
137
+
138
+ | # | Asset | Campaign | Term Found | Context | Severity |
139
+ |---|-------|----------|------------|---------|----------|
140
+ | 1 | ${ASSET_NAME} | ${CAMPAIGN_SLUG} | "${TERM}" | "${SURROUNDING_CONTEXT}" | Critical |
141
+ | ... | ... | ... | ... | ... | ... |
142
+
143
+ **Bleeding count:** ${BLEEDING_COUNT} of ${MNS_VIOLATION_COUNT} must-not-say violations are in customer-facing materials
144
+ **Bleeding rate:** ${BLEEDING_RATE}% of must-not-say violations have bled into customer-facing territory
145
+
146
+ ${IF_NO_BLEEDING}No must-not-say terms found in customer-facing materials. Positioning boundaries are holding.${END_IF}
147
+ ${IF_BLEEDING}Customer-facing assets contain must-not-say terms. These should be prioritized for /ttm-fix as they represent active positioning leakage to your audience.${END_IF}
148
+
149
+ ## Findings Detail
150
+
151
+ For each WARN or FAIL result, show:
152
+
153
+ ### [ASSET_NAME] (${CAMPAIGN_SLUG}) -- ${CATEGORY} [${RESULT}]
154
+
155
+ **Evidence:** "[exact quote or description from asset]"
156
+ **Reference:** "[corresponding text from POSITIONING.md]"
157
+ **Recommendation:** [specific action to resolve]
158
+
159
+ ## Accepted Deviations
160
+
161
+ Previously accepted positioning deviations found in campaign DEVIATIONS.md files:
162
+
163
+ | Asset | Campaign | Gate | Justification | Run |
164
+ |-------|----------|------|---------------|-----|
165
+ | ${ASSET} | ${SLUG} | ${GATE} | ${JUSTIFICATION} | ${RUN} |
166
+
167
+ If no accepted deviations: "No previously accepted positioning deviations found."
168
+
169
+ ## Trend Comparison
170
+
171
+ ${TREND_TABLE_OR_FIRST_AUDIT_MESSAGE}
172
+
173
+ If prior audit exists:
174
+ | Metric | Prior Audit | Current Audit | Delta |
175
+ |--------|-------------|---------------|-------|
176
+ | Aggregate Drift | ${PRIOR_PCT}% | ${CURRENT_PCT}% | ${DELTA}% ${ARROW} |
177
+ | Assets Audited | ${PRIOR_COUNT} | ${CURRENT_COUNT} | -- |
178
+ | Window | ${PRIOR_WINDOW} | ${CURRENT_WINDOW} | -- |
179
+
180
+ ## Recommendations
181
+
182
+ - If aggregate drift > 30%: "Aggregate drift exceeds 30%. Consider running /ttm-positioning-shift to evaluate whether your positioning needs updating."
183
+ - If aggregate drift > 0% and <= 30%: "Some drift detected. Run /ttm-fix on specific assets with FAIL results to bring them back on-positioning."
184
+ - If aggregate drift = 0%: "All assets are on-positioning. No action needed."
185
+ - For any FAIL results: "Assets with FAIL results should be addressed via /ttm-fix [campaign-slug]."
186
+ ```
187
+
188
+ ---
189
+
190
+ ## Status Thresholds
191
+
192
+ | Aggregate Drift % | Status | Recommended Action |
193
+ |--------------------|--------|-------------------|
194
+ | 0% | On-Positioning | No action needed |
195
+ | 1-15% | Minor Drift | Fix individual assets via /ttm-fix |
196
+ | 16-30% | Moderate Drift | Review positioning strategy, fix flagged assets |
197
+ | 31%+ | Significant Drift | Run /ttm-positioning-shift to evaluate positioning changes |