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.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +419 -0
- package/agents/ttm-producer.md +53 -0
- package/bin/lib/campaign.cjs +553 -0
- package/bin/lib/commit.cjs +105 -0
- package/bin/lib/core.cjs +172 -0
- package/bin/lib/deviation.cjs +149 -0
- package/bin/lib/drift-log.cjs +219 -0
- package/bin/lib/health.cjs +438 -0
- package/bin/lib/slug.cjs +59 -0
- package/bin/lib/state.cjs +96 -0
- package/bin/ttm-tools.cjs +157 -0
- package/gates/base-gates.md +266 -0
- package/gates/discipline/.gitkeep +0 -0
- package/gates/gate-evaluation.md +341 -0
- package/gates/meta-gates.md +19 -0
- package/install.js +307 -0
- package/package.json +53 -0
- package/playbooks/.gitkeep +0 -0
- package/playbooks/aeo.md +223 -0
- package/playbooks/affiliate.md +272 -0
- package/playbooks/base.md +110 -0
- package/playbooks/email.md +306 -0
- package/playbooks/events.md +320 -0
- package/playbooks/linkedin.md +263 -0
- package/playbooks/paid-ads.md +318 -0
- package/playbooks/pr-media.md +296 -0
- package/playbooks/seo.md +284 -0
- package/playbooks/social.md +305 -0
- package/playbooks/youtube.md +325 -0
- package/references/context-loading.md +107 -0
- package/references/learnings-extraction.md +94 -0
- package/references/measurement-template.md +48 -0
- package/references/meta-gate-evaluation.md +169 -0
- package/references/positioning-check-report.md +197 -0
- package/references/review-checklist.md +78 -0
- package/references/ship-checklist-items.md +94 -0
- package/settings.json +4 -0
- package/skills/ttm-aeo-check/SKILL.md +20 -0
- package/skills/ttm-affiliate-kit/SKILL.md +19 -0
- package/skills/ttm-archive/SKILL.md +13 -0
- package/skills/ttm-brand-refresh/SKILL.md +19 -0
- package/skills/ttm-brief/SKILL.md +14 -0
- package/skills/ttm-competitor-scan/SKILL.md +19 -0
- package/skills/ttm-email-preflight/SKILL.md +19 -0
- package/skills/ttm-fix/SKILL.md +13 -0
- package/skills/ttm-health/SKILL.md +12 -0
- package/skills/ttm-icp-refresh/SKILL.md +19 -0
- package/skills/ttm-init/SKILL.md +12 -0
- package/skills/ttm-keyword-map/SKILL.md +19 -0
- package/skills/ttm-learn/SKILL.md +14 -0
- package/skills/ttm-measure/SKILL.md +14 -0
- package/skills/ttm-new-campaign/SKILL.md +13 -0
- package/skills/ttm-next/SKILL.md +12 -0
- package/skills/ttm-positioning-check/SKILL.md +19 -0
- package/skills/ttm-positioning-shift/SKILL.md +19 -0
- package/skills/ttm-produce/SKILL.md +14 -0
- package/skills/ttm-repurpose/SKILL.md +20 -0
- package/skills/ttm-research/SKILL.md +13 -0
- package/skills/ttm-resume/SKILL.md +13 -0
- package/skills/ttm-review/SKILL.md +13 -0
- package/skills/ttm-seo-audit/SKILL.md +20 -0
- package/skills/ttm-ship/SKILL.md +13 -0
- package/skills/ttm-state/SKILL.md +13 -0
- package/skills/ttm-verify/SKILL.md +14 -0
- package/templates/agents-md.md +65 -0
- package/templates/campaign-brief.md +74 -0
- package/templates/campaign-research.md +39 -0
- package/templates/campaign-state.md +40 -0
- package/templates/claude-md.md +65 -0
- package/templates/deviation-log.md +12 -0
- package/templates/drift-log.md +17 -0
- package/templates/fix-brief.md +59 -0
- package/templates/fix-log.md +22 -0
- package/templates/measurement-report.md +75 -0
- package/templates/migration-plan.md +24 -0
- package/templates/production-manifest.json +20 -0
- package/templates/reference-files/brand.md +45 -0
- package/templates/reference-files/calendar.md +30 -0
- package/templates/reference-files/channels.md +40 -0
- package/templates/reference-files/competitors.md +40 -0
- package/templates/reference-files/icp.md +50 -0
- package/templates/reference-files/learnings.md +40 -0
- package/templates/reference-files/metrics.md +42 -0
- package/templates/reference-files/positioning.md +38 -0
- package/templates/reference-files/state.md +27 -0
- package/templates/verification-report.md +59 -0
- package/workflows/discipline/.gitkeep +0 -0
- package/workflows/discipline/aeo-check.md +180 -0
- package/workflows/discipline/affiliate-kit.md +147 -0
- package/workflows/discipline/email-preflight.md +150 -0
- package/workflows/discipline/keyword-map.md +125 -0
- package/workflows/discipline/repurpose.md +329 -0
- package/workflows/discipline/seo-audit.md +169 -0
- package/workflows/lifecycle/.gitkeep +0 -0
- package/workflows/lifecycle/brief-positioning-check.md +90 -0
- package/workflows/lifecycle/brief.md +355 -0
- package/workflows/lifecycle/fix.md +495 -0
- package/workflows/lifecycle/learn.md +405 -0
- package/workflows/lifecycle/measure.md +379 -0
- package/workflows/lifecycle/produce.md +383 -0
- package/workflows/lifecycle/research.md +264 -0
- package/workflows/lifecycle/review.md +432 -0
- package/workflows/lifecycle/ship.md +521 -0
- package/workflows/lifecycle/verify.md +507 -0
- package/workflows/reference-mgmt/.gitkeep +0 -0
- package/workflows/reference-mgmt/brand-refresh.md +193 -0
- package/workflows/reference-mgmt/competitor-scan.md +228 -0
- package/workflows/reference-mgmt/icp-refresh.md +200 -0
- package/workflows/reference-mgmt/positioning-check.md +339 -0
- package/workflows/reference-mgmt/positioning-shift.md +368 -0
- package/workflows/setup/.gitkeep +0 -0
- package/workflows/setup/init-questions.md +225 -0
- package/workflows/setup/init-validation.md +155 -0
- package/workflows/setup/init.md +449 -0
- package/workflows/setup/new-campaign.md +134 -0
- package/workflows/utility/.gitkeep +0 -0
- package/workflows/utility/archive.md +334 -0
- package/workflows/utility/health.md +166 -0
- package/workflows/utility/next.md +187 -0
- package/workflows/utility/resume.md +249 -0
- 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 |
|