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,296 @@
1
+ ---
2
+ discipline: pr-media
3
+ asset_types: [press-release, media-pitch, media-kit, byline-article]
4
+ version: "1.0"
5
+ ---
6
+
7
+ # PR/Media Discipline Playbook
8
+
9
+ This playbook extends the base playbook contract (`base.md`) with PR/media-specific production guidance, discipline gates, and format rules. It is loaded by ttm-producer during content generation and parsed by ttm-verify for gate evaluation.
10
+
11
+ ---
12
+
13
+ ## Production Guidance
14
+
15
+ ### Media List Structure
16
+
17
+ Every PR campaign starts with a structured media list. Do not pitch without one:
18
+
19
+ - **Minimum 10 contacts** with: outlet name, journalist name, beat/coverage area, recent relevant article, and a specific pitch angle tailored to that journalist
20
+ - **Tiered organization:** Tier 1 (national/major trade), Tier 2 (regional/niche trade), Tier 3 (blogs/newsletters/podcasts). Allocate effort proportionally -- Tier 1 gets the most customization.
21
+ - **Beat matching:** Only pitch journalists who cover your space. A fintech pitch sent to a healthcare reporter wastes both parties' time and damages future relationships.
22
+ - **Recency check:** Verify each contact is still at the listed outlet and still covering the same beat. Journalist turnover is high -- stale lists produce bounced emails and irrelevant pitches.
23
+
24
+ ### Pitch Angle Customization
25
+
26
+ Generic pitches fail. Every pitch must connect the story to the journalist's specific interests:
27
+
28
+ - **Reference recent work:** Mention a specific article the journalist published and explain how your story extends, contrasts with, or adds a new angle to their coverage.
29
+ - **Angle-per-journalist:** The same announcement should be pitched differently to a product reviewer (focus on features/UX), an industry analyst (focus on market impact), and a business reporter (focus on funding/growth).
30
+ - **Subject line discipline:** 6-10 words, specific and newsworthy. Avoid clickbait, ALL CAPS, or exclamation marks. The subject line is the pitch -- if it does not convey the news, the email will not be opened.
31
+
32
+ ### Embargo Management
33
+
34
+ Embargoes give select journalists early access to a story in exchange for coordinated publication:
35
+
36
+ - **Clear terms:** Specify exact date and time (with timezone) for embargo lift. Use written confirmation (email) -- verbal agreements are unreliable.
37
+ - **NDA when needed:** For sensitive announcements (M&A, funding, partnerships), require a signed NDA before sharing embargoed information.
38
+ - **Break protocol:** Document what happens if an embargo is broken. Typically: immediate release to all other embargoed journalists, note the breaking outlet for future exclusion.
39
+ - **Selective use:** Reserve embargoes for genuinely significant news. Routine product updates do not warrant embargo complexity.
40
+
41
+ ### Press Release Structure
42
+
43
+ Follow the inverted pyramid -- most important information first:
44
+
45
+ 1. **Headline:** Factual, specific, 8-12 words. State the news clearly.
46
+ 2. **Dateline:** City, State/Country -- Date
47
+ 3. **Lead paragraph:** Who, what, when, where, why in 2-3 sentences
48
+ 4. **Supporting details:** Context, background, market data (2-3 paragraphs)
49
+ 5. **Executive quote:** One quote from a named executive providing perspective
50
+ 6. **Product/company details:** Specifics about the product or initiative
51
+ 7. **Boilerplate:** Standard company description paragraph (consistent across all releases)
52
+ 8. **Media contact:** Name, email, phone number for press inquiries
53
+
54
+ ### Byline Article Positioning
55
+
56
+ Byline articles (op-eds, thought leadership pieces published under an executive's name) require:
57
+
58
+ - **Original perspective:** The article must offer a viewpoint not available in the company's standard marketing. Personal experience, contrarian takes, or proprietary data analysis.
59
+ - **Publication fit:** Match the article's tone, length, and topic to the target publication's editorial standards. Read 5+ recent bylines in the target outlet before writing.
60
+ - **Attribution balance:** The byline builds the author's credibility and the company's thought leadership. Avoid overt product promotion -- publications reject advertorials.
61
+
62
+ ### Earned Media Measurement
63
+
64
+ Plan measurement before pitching, not after:
65
+
66
+ - **Baseline:** Document current share of voice, existing coverage volume, and brand mention frequency before the campaign starts.
67
+ - **Tracking method:** Specify how coverage will be monitored (Google Alerts, media monitoring tool, manual search, or combination).
68
+ - **Success criteria:** Define what "success" looks like in measurable terms (e.g., 5 Tier 1 placements, 20% share-of-voice increase, 500 referral visits from coverage).
69
+
70
+ ---
71
+
72
+ ## Discipline Gates
73
+
74
+ ### DISC-PR-MEDIA-01: Media List Structure -- Tier 1
75
+
76
+ **Checks:** Media outreach includes a structured journalist/outlet list with angles per PLAY-10
77
+ **Against:** Media list document or pitch plan
78
+
79
+ #### Evaluation Criteria
80
+
81
+ 1. **List completeness**
82
+ - PASS: Media list includes at least 10 contacts with outlet name, journalist name, beat, and a specific pitch angle per journalist
83
+ - WARN: Media list has contacts but uses the same generic pitch angle for all journalists
84
+ - FAIL: No media list, or list has fewer than 5 contacts, or no pitch angles defined
85
+
86
+ 2. **Contact recency**
87
+ - PASS: List notes when contacts were last verified (within 30 days) or references recent articles by each journalist
88
+ - WARN: List exists but verification date is not noted
89
+ - FAIL: List contains obviously stale contacts (wrong outlets, inactive journalists)
90
+
91
+ ### DISC-PR-MEDIA-02: Pitch Angle Specificity -- Tier 1
92
+
93
+ **Checks:** Each pitch is customized to the journalist's beat and recent coverage per PLAY-10
94
+ **Against:** Individual pitch content compared to journalist profile
95
+
96
+ #### Evaluation Criteria
97
+
98
+ 1. **Journalist-specific customization**
99
+ - PASS: Pitch references the journalist's recent work or beat and connects the story to their audience's interests
100
+ - WARN: Pitch is topically relevant to the beat but does not reference specific recent coverage
101
+ - FAIL: Generic pitch with no journalist-specific customization
102
+
103
+ 2. **Angle differentiation**
104
+ - PASS: Different journalists receive different angles of the same story (e.g., product angle vs. market impact angle)
105
+ - WARN: Slight variations in pitch but substantially the same angle for all contacts
106
+ - FAIL: Identical pitch sent to all journalists regardless of beat or outlet
107
+
108
+ ### DISC-PR-MEDIA-03: Embargo Management -- Tier 2
109
+
110
+ **Checks:** Embargo terms are documented and communicated if applicable per PLAY-10
111
+ **Against:** Pitch documentation and communication plan
112
+
113
+ #### Evaluation Criteria
114
+
115
+ 1. **Embargo clarity**
116
+ - PASS: Embargo date/time with timezone clearly stated in pitch, NDA or embargo agreement terms defined, break protocol documented
117
+ - WARN: Embargo mentioned but terms are vague (no specific date/time or missing timezone)
118
+ - FAIL: Embargoed information sent without embargo terms, or conflicting embargo dates across pitches
119
+
120
+ 2. **Non-embargo acknowledgment**
121
+ - PASS: If no embargo applies, the pitch explicitly states the information is for immediate use
122
+ - WARN: N/A (linked to embargo decision)
123
+ - FAIL: Ambiguous about whether information is embargoed or not
124
+
125
+ ### DISC-PR-MEDIA-04: Press Release Structure -- Tier 2
126
+
127
+ **Checks:** Press release follows inverted pyramid with required elements
128
+ **Against:** Press release content
129
+
130
+ #### Evaluation Criteria
131
+
132
+ 1. **Required elements**
133
+ - PASS: Includes headline, dateline, lead paragraph (who/what/when/where/why), supporting details, executive quote, boilerplate, and media contact info
134
+ - WARN: Missing one non-critical element (e.g., dateline or boilerplate)
135
+ - FAIL: Missing headline, lead paragraph, or more than 2 required elements
136
+
137
+ 2. **Inverted pyramid structure**
138
+ - PASS: Most newsworthy information appears in the first paragraph; details expand in subsequent paragraphs
139
+ - WARN: Key news is present but buried below background context
140
+ - FAIL: Release leads with company history or product features before stating the actual news
141
+
142
+ ### DISC-PR-MEDIA-05: Earned Media Measurement -- Tier 2
143
+
144
+ **Checks:** Coverage tracking and measurement plan exists per PLAY-10
145
+ **Against:** Campaign measurement documentation
146
+
147
+ #### Evaluation Criteria
148
+
149
+ 1. **Measurement plan completeness**
150
+ - PASS: Measurement plan specifies tracking method (media monitoring tool or manual), target outlets, share-of-voice baseline, and success criteria
151
+ - WARN: Success criteria defined but tracking method not specified
152
+ - FAIL: No measurement plan for earned media outcomes
153
+
154
+ 2. **Baseline documentation**
155
+ - PASS: Pre-campaign baseline metrics documented (current coverage volume, share of voice, brand mentions)
156
+ - WARN: Baseline mentioned but specific numbers not recorded
157
+ - FAIL: No baseline established before campaign launch
158
+
159
+ ---
160
+
161
+ ## Base Gate Overrides
162
+
163
+ | Base Gate ID | Default Tier | Override Tier | Reason |
164
+ |-------------|-------------|---------------|--------|
165
+ | GATE-02 (Claim Accuracy) | Tier 2 | Tier 1 | Press claims are amplified by journalists and become public record; inaccuracies are nearly impossible to retract once published |
166
+
167
+ ---
168
+
169
+ ## Format Rules
170
+
171
+ ### Press Release Format
172
+
173
+ - **Headline:** 8-12 words, factual, no jargon. Title case.
174
+ - **Dateline:** CITY, STATE (Month Day, Year) --
175
+ - **Lead paragraph:** 2-3 sentences. Answer who, what, when, where, why.
176
+ - **Body:** 3-5 paragraphs, 400-600 words total (excluding boilerplate).
177
+ - **Quote:** Attributed to a named individual with title. 2-3 sentences maximum.
178
+ - **Boilerplate:** 50-75 words. Consistent across all releases.
179
+ - **Media contact:** Full name, title, email, phone. At the bottom.
180
+
181
+ ### Media Pitch Email Format
182
+
183
+ ```
184
+ Subject: [6-10 words, specific news angle -- no clickbait]
185
+
186
+ Hi [Journalist first name],
187
+
188
+ [1 sentence referencing their recent coverage or beat relevance]
189
+
190
+ [2-3 sentences stating the news/story and why it matters to their audience]
191
+
192
+ [1 sentence offering: interview, exclusive data, demo, or early access]
193
+
194
+ [1 sentence with a clear ask: "Would this be worth a conversation?"]
195
+
196
+ Best,
197
+ [Name]
198
+ [Title, Company]
199
+ [Phone]
200
+ ```
201
+
202
+ Total pitch length: 100-150 words. Shorter is better.
203
+
204
+ ### Media Kit Contents
205
+
206
+ 1. **Company fact sheet:** 1 page with founding date, HQ, team size, funding, key metrics
207
+ 2. **Executive bios:** 100-150 words per executive, with high-resolution headshots
208
+ 3. **Product screenshots/visuals:** High-resolution, properly licensed, with captions
209
+ 4. **Press release archive:** Links to 3-5 most recent releases
210
+ 5. **Brand assets:** Logo files (SVG, PNG), brand color codes, usage guidelines
211
+ 6. **Media contact:** Dedicated PR contact with direct email and phone
212
+
213
+ ### Byline Article Structure
214
+
215
+ - **Length:** 800-1200 words for most publications (check target outlet guidelines)
216
+ - **Opening:** Personal anecdote or contrarian statement -- NOT a product pitch
217
+ - **Body:** 3-5 supporting points with data, examples, or industry references
218
+ - **Closing:** Forward-looking perspective or actionable takeaway
219
+ - **Bio:** 2-3 sentences about the author, company mention in final sentence only
220
+ - **Product mentions:** Zero to one. More than one and the publication will reject it.
221
+
222
+ ---
223
+
224
+ ## Examples
225
+
226
+ ### Good: Customized Pitch
227
+
228
+ ```
229
+ Subject: New data on developer tool adoption in enterprise (for your DevOps series)
230
+
231
+ Hi Sarah,
232
+
233
+ Your recent piece on CI/CD pipeline sprawl in Fortune 500 companies resonated
234
+ with what we are seeing in our customer base. We have new data from 200+
235
+ enterprise deployments showing that tool consolidation reduced pipeline
236
+ failures by 34%.
237
+
238
+ Would you be interested in an exclusive look at the data before we publish
239
+ the full report next month?
240
+
241
+ Best,
242
+ [Name]
243
+ ```
244
+
245
+ **Why it works:** References specific recent coverage, offers exclusive data, makes a clear ask, under 100 words.
246
+
247
+ ### Bad: Generic Spray-and-Pray Pitch
248
+
249
+ ```
250
+ Subject: EXCITING NEWS FROM [COMPANY]!!!
251
+
252
+ Dear Editor,
253
+
254
+ [Company] is thrilled to announce our latest product update! We are the
255
+ leading provider of innovative solutions that empower businesses to
256
+ transform their digital journey. Our new features include...
257
+
258
+ [500 words of product description]
259
+
260
+ Please let us know if you would like to cover this exciting news.
261
+ ```
262
+
263
+ **Problems:** No journalist name, no beat relevance, subject line is clickbait, self-congratulatory tone, too long, no specific ask, no news angle.
264
+
265
+ ---
266
+
267
+ ## Anti-Patterns
268
+
269
+ 1. **Spray-and-pray pitching** -- Sending the same generic pitch to 200+ journalists. Response rates drop below 1%. Customize every pitch or do not send it.
270
+
271
+ 2. **Self-congratulatory press releases** -- Leading with "We are thrilled/excited/proud to announce..." The journalist does not care about your feelings. Lead with the news and why it matters to their readers.
272
+
273
+ 3. **Ignoring journalist beat** -- Pitching a cybersecurity story to a consumer tech reporter. Shows you did not research the journalist and guarantees your email is deleted.
274
+
275
+ 4. **Burying the news** -- Starting the press release with 2 paragraphs of company history before stating what actually happened. The news goes in the first sentence.
276
+
277
+ 5. **Pitching without a media list** -- Ad-hoc outreach to whoever comes to mind. Without a structured list, you miss key outlets, duplicate efforts, and cannot track results.
278
+
279
+ 6. **Breaking your own embargo** -- Publishing on social media or the company blog before the embargo lifts. This kills journalist trust and ensures future embargoes are ignored.
280
+
281
+ 7. **Product pitches disguised as bylines** -- Submitting a byline article that reads like a product brochure. Editors reject these immediately and may blacklist the author.
282
+
283
+ ---
284
+
285
+ ## Metrics
286
+
287
+ Track these indicators for PR/media content after shipping:
288
+
289
+ - **Media mentions** -- Total coverage count across Tier 1, 2, and 3 outlets, measured per campaign
290
+ - **Share of voice** -- Brand mention frequency compared to competitors in the same coverage period
291
+ - **Backlinks from coverage** -- Number of dofollow links from media articles pointing to the brand's domain
292
+ - **Referral traffic from coverage** -- Website visits originating from media articles, tracked via UTM or referral source
293
+ - **Tier 1/2/3 coverage ratio** -- Distribution of coverage across outlet tiers to assess campaign quality
294
+ - **Pitch-to-placement rate** -- Percentage of pitches sent that resulted in published coverage
295
+ - **Message pull-through** -- Percentage of coverage that includes key messaging points from the pitch
296
+ - **Journalist response rate** -- Percentage of pitched journalists who responded (even if declining), indicating list quality
@@ -0,0 +1,284 @@
1
+ ---
2
+ discipline: seo
3
+ asset_types: [blog-post, landing-page, pillar-page, programmatic-seo]
4
+ version: "1.0"
5
+ ---
6
+
7
+ # SEO Discipline Playbook
8
+
9
+ This playbook extends the base playbook contract (`base.md`) with SEO-specific production guidance, discipline gates, and format rules. It is loaded by ttm-producer during content generation and parsed by ttm-verify for gate evaluation.
10
+
11
+ ---
12
+
13
+ ## Production Guidance
14
+
15
+ ### Search Intent First
16
+
17
+ Identify whether the target query is informational, commercial, navigational, or transactional. Match the content format to the intent:
18
+
19
+ - **Informational** ("how to X", "what is X"): long-form guide or explainer
20
+ - **Commercial** ("best X", "X vs Y"): comparison, listicle, or review
21
+ - **Navigational** ("brand X login", "X pricing"): direct landing page
22
+ - **Transactional** ("buy X", "X free trial"): conversion-focused landing page with CTA
23
+
24
+ If the content format does not match the dominant intent in top-ranking results, the asset will underperform regardless of quality.
25
+
26
+ ### Keyword Placement
27
+
28
+ Place the target keyword in:
29
+
30
+ - Title tag (near the front)
31
+ - H1 heading
32
+ - First 100 words of body content
33
+ - At least one H2 subheading
34
+
35
+ Do NOT stuff keywords. Maintain 1-2% keyword density maximum. Keyword variants and synonyms count toward topical coverage but not density.
36
+
37
+ ### Content Structure
38
+
39
+ Use H2/H3 hierarchy logically. Every H2 should answer a sub-question of the main query. Avoid skipping heading levels (H1 to H3). Each H2 section should be 150-400 words -- long enough for substance, short enough for scannability.
40
+
41
+ ### Internal Linking
42
+
43
+ Weave 3-6 contextual internal links per 1000 words to related content. Use descriptive anchor text that tells the reader what they will find. Avoid generic anchors like "click here" or "read more."
44
+
45
+ ### Schema Markup
46
+
47
+ Include Article schema at minimum for blog posts and pillar pages. Add FAQ schema if the content contains question-answer pairs. Add HowTo schema if the content has step-by-step instructions. Specify required fields (headline, author, datePublished for Article; name, acceptedAnswer for FAQ).
48
+
49
+ ### Entity-Based SEO
50
+
51
+ Reference known entities (people, organizations, concepts, products) that search engines associate with the topic. Build topical authority by connecting to established knowledge graph entities rather than relying on keyword repetition alone.
52
+
53
+ ### Performance Awareness
54
+
55
+ Content decisions impact Core Web Vitals. Follow these rules:
56
+
57
+ - Use optimized image formats (WebP/AVIF) with explicit width/height attributes
58
+ - Lazy-load images below the fold
59
+ - Avoid render-blocking embeds (video players, social widgets) above the fold
60
+ - Reserve space for ad slots and dynamic content to prevent layout shift
61
+ - Prefer native HTML elements (details/summary for accordions) over heavy JavaScript widgets
62
+
63
+ ---
64
+
65
+ ## Discipline Gates
66
+
67
+ ### DISC-SEO-01: Title/H1 Alignment -- Tier 1
68
+
69
+ **Checks:** Title tag and H1 heading convey the same primary topic
70
+ **Against:** Asset content structure
71
+
72
+ #### Evaluation Criteria
73
+
74
+ 1. **Title-H1 topic match**
75
+ - PASS: Title tag and H1 contain the same primary keyword and address the same topic
76
+ - WARN: Title and H1 address the same topic but use different keyword phrasing
77
+ - FAIL: Title and H1 address different topics or target different keywords
78
+
79
+ 2. **Title length**
80
+ - PASS: Title tag is 50-60 characters
81
+ - WARN: Title tag is 45-49 or 61-70 characters
82
+ - FAIL: Title tag is under 30 or over 70 characters
83
+
84
+ ### DISC-SEO-02: Search Intent Match -- Tier 1
85
+
86
+ **Checks:** Content matches the search intent of the target query
87
+ **Against:** Brief's target keyword and declared intent type
88
+
89
+ #### Evaluation Criteria
90
+
91
+ 1. **Intent alignment**
92
+ - PASS: First 100-150 words directly address the target query and match the declared intent
93
+ - WARN: Content addresses the query but the direct answer is buried below introductory context
94
+ - FAIL: Content does not match the declared intent type (e.g., informational content for a transactional query)
95
+
96
+ 2. **Content format match**
97
+ - PASS: Content format matches intent -- listicle for "best X", how-to guide for "how to X", comparison for "X vs Y"
98
+ - WARN: Content partially matches the expected format but includes mixed intent signals
99
+ - FAIL: Content format contradicts the search intent (e.g., a product page for an informational query)
100
+
101
+ ### DISC-SEO-03: Schema Markup -- Tier 2
102
+
103
+ **Checks:** Structured data presence and correctness
104
+ **Against:** schema.org specification for the applicable type (Article, FAQPage, HowTo)
105
+
106
+ #### Evaluation Criteria
107
+
108
+ 1. **Schema presence**
109
+ - PASS: Appropriate schema type (Article, FAQ, or HowTo) is specified in the asset with required fields populated
110
+ - WARN: Schema type is mentioned but one or more required fields are missing or incomplete
111
+ - FAIL: No schema markup specified for content that qualifies for structured data
112
+
113
+ 2. **Schema accuracy**
114
+ - PASS: All required fields present and correctly typed (e.g., datePublished is ISO 8601, author has name)
115
+ - WARN: Required fields present but optional fields (image, dateModified) are missing
116
+ - FAIL: Required fields missing, incorrect field types, or wrong schema type for the content
117
+
118
+ ### DISC-SEO-04: Internal Link Density -- Tier 2
119
+
120
+ **Checks:** Contextual internal link quantity and anchor text quality
121
+ **Against:** Asset content (self-contained check)
122
+
123
+ #### Evaluation Criteria
124
+
125
+ 1. **Link count**
126
+ - PASS: 3-6 contextual internal links per 1000 words of content
127
+ - WARN: 1-2 internal links per 1000 words
128
+ - FAIL: 0 internal links in the asset
129
+
130
+ 2. **Anchor text quality**
131
+ - PASS: All internal links use descriptive anchor text that indicates the destination content
132
+ - WARN: Some links use generic anchors ("click here", "read more", "learn more")
133
+ - FAIL: N/A -- linked to link count result
134
+
135
+ ### DISC-SEO-05: Thin Content Detection -- Tier 1
136
+
137
+ **Checks:** Content depth and uniqueness
138
+ **Against:** Asset content (self-contained check)
139
+
140
+ #### Evaluation Criteria
141
+
142
+ 1. **Word count**
143
+ - PASS: 800+ words for standard pages (blog-post, landing-page, pillar-page); 300+ words for programmatic-seo variants
144
+ - WARN: 500-799 words for standard pages
145
+ - FAIL: Under 500 words for standard pages or under 300 words for programmatic-seo
146
+
147
+ 2. **Unique substance**
148
+ - PASS: Content provides original analysis, proprietary data, unique perspective, or first-party research
149
+ - WARN: Content summarizes existing publicly available information with minor original commentary
150
+ - FAIL: Content is mostly boilerplate, template-generated text with only location/variable swaps, or restates common knowledge without adding value
151
+
152
+ ### DISC-SEO-06: Meta Description -- Tier 2
153
+
154
+ **Checks:** Meta description presence, length, and keyword inclusion
155
+ **Against:** Asset metadata fields
156
+
157
+ #### Evaluation Criteria
158
+
159
+ 1. **Presence and length**
160
+ - PASS: Meta description is present and 120-160 characters in length
161
+ - WARN: Meta description is present but under 120 or over 160 characters
162
+ - FAIL: No meta description provided
163
+
164
+ 2. **Keyword inclusion**
165
+ - PASS: Target keyword appears naturally within the meta description
166
+ - WARN: A keyword variant or close synonym is used instead of the exact target keyword
167
+ - FAIL: Neither the target keyword nor any recognizable variant appears in the meta description
168
+
169
+ ### DISC-SEO-07: Core Web Vitals Budget -- Tier 1
170
+
171
+ **Checks:** Content structure for Core Web Vitals impact -- whether the asset's content design stays within performance budgets
172
+ **Against:** Google Core Web Vitals thresholds (LCP < 2.5s, CLS < 0.1, INP < 200ms)
173
+
174
+ #### Evaluation Criteria
175
+
176
+ 1. **LCP risk**
177
+ - PASS: Hero/above-fold content uses optimized image formats (WebP/AVIF) with explicit width/height, lazy-loads below-fold images, no render-blocking embeds above fold
178
+ - WARN: Images present above fold but missing explicit dimensions or using unoptimized formats (PNG/uncompressed JPEG)
179
+ - FAIL: Above-fold content depends on heavy unoptimized media (>200KB hero image without dimensions), multiple render-blocking third-party embeds, or auto-playing video without poster frame
180
+
181
+ 2. **CLS risk**
182
+ - PASS: All images and embeds have explicit width/height or aspect-ratio CSS, no dynamically injected content above fold, ad slots have reserved space
183
+ - WARN: Most media has dimensions but 1-2 elements are missing explicit sizing
184
+ - FAIL: Images/embeds without dimensions that will cause layout shift, dynamically inserted banners or CTAs above existing content
185
+
186
+ 3. **INP risk**
187
+ - PASS: No heavy inline JavaScript or click handlers that would block interaction -- content relies on standard links and native form elements
188
+ - WARN: Interactive elements present (accordions, tabs) but use standard HTML patterns or lightweight JS
189
+ - FAIL: Content specifies complex interactive widgets, heavy carousels, or inline calculators without performance notes
190
+
191
+ ---
192
+
193
+ ## Base Gate Overrides
194
+
195
+ | Base Gate ID | Default Tier | Override Tier | Reason |
196
+ |-------------|-------------|---------------|--------|
197
+ | GATE-10 | Tier 2 (advisory) | Tier 1 (blocking) | SEO format correctness directly impacts search rankings; structural errors (missing H1, broken title tag) prevent proper indexing and SERP display |
198
+
199
+ ---
200
+
201
+ ## Format Rules
202
+
203
+ - **Title tag:** 50-60 characters, target keyword placed near the front
204
+ - **Meta description:** 120-160 characters, action-oriented with target keyword included
205
+ - **H1:** Exactly one per page, must address the same topic as the title tag
206
+ - **URL structure:** Short, hyphenated, includes primary keyword (e.g., `/seo-content-guide` not `/page?id=123`)
207
+ - **Image alt text:** Descriptive of the image content, includes target keyword where naturally appropriate
208
+ - **Images:** Explicit width/height attributes required, WebP/AVIF format preferred, lazy-load attribute on below-fold images
209
+ - **Heading hierarchy:** H1 > H2 > H3 in order, no skipped levels
210
+ - **Canonical URL:** Specified for every page to prevent duplicate content issues
211
+
212
+ ---
213
+
214
+ ## Examples
215
+
216
+ ### Good: Intent-Matching Blog Post Structure
217
+
218
+ ```
219
+ Title: "How to Optimize Core Web Vitals in 2024" (48 chars)
220
+ H1: "How to Optimize Core Web Vitals: A Step-by-Step Guide"
221
+ First 100 words: Directly explains what CWV optimization involves and why it matters.
222
+ Schema: HowTo with 6 numbered steps.
223
+ Internal links: 4 links to related performance articles with descriptive anchors.
224
+ ```
225
+
226
+ ### Good: Programmatic SEO with Sufficient Depth
227
+
228
+ ```
229
+ Title: "Best Coffee Shops in Austin, TX" (33 chars -- variant page)
230
+ H1: "Best Coffee Shops in Austin, Texas"
231
+ Content: 450 words with 3 unique reviews, local entity references, original ratings.
232
+ Schema: Article with LocalBusiness references.
233
+ Unique content ratio: 70%+ original text beyond the template.
234
+ ```
235
+
236
+ ### Bad: Keyword-Stuffed Landing Page
237
+
238
+ ```
239
+ Title: "Best SEO Tools | SEO Tools Reviews | Top SEO Tools 2024"
240
+ Problem: Title is 56 chars but keyword "SEO Tools" appears 3 times (stuffing).
241
+ H1: "SEO Tools" -- does not match the multi-topic title.
242
+ Body: "SEO tools" appears every other sentence (4%+ density).
243
+ ```
244
+
245
+ ### Bad: Thin Programmatic SEO Template
246
+
247
+ ```
248
+ Title: "Best Coffee Shops in [City], [State]"
249
+ Content: 120 words. Only the city name changes between variants.
250
+ Unique content: Template boilerplate with location swap only.
251
+ No schema, no internal links, no original substance.
252
+ ```
253
+
254
+ ---
255
+
256
+ ## Anti-Patterns
257
+
258
+ 1. **Keyword stuffing** -- Keyword density exceeding 2%. Search engines penalize unnatural repetition. Use synonyms and topical variants instead.
259
+
260
+ 2. **Title/H1 mismatch** -- Title tag targeting one keyword while H1 targets a different topic. This confuses search engines about the page's primary topic.
261
+
262
+ 3. **Missing schema markup** -- Publishing content that qualifies for Article, FAQ, or HowTo structured data without specifying the schema. Missed opportunity for rich results.
263
+
264
+ 4. **Generic internal link anchors** -- Using "click here", "read more", or "learn more" as anchor text. Descriptive anchors help search engines understand link relationships.
265
+
266
+ 5. **Duplicate/thin programmatic pages** -- Generating hundreds of pages where only a location or variable name changes. Each page must contain substantive unique content (300+ words unique).
267
+
268
+ 6. **Ignoring search intent** -- Serving informational content for a transactional query, or a product page for an informational query. Match the dominant intent visible in current SERP results.
269
+
270
+ 7. **Hero images without explicit dimensions** -- Placing large images above the fold without width/height attributes causes Cumulative Layout Shift (CLS), degrading Core Web Vitals scores and user experience.
271
+
272
+ ---
273
+
274
+ ## Metrics
275
+
276
+ Track these indicators for SEO content after shipping:
277
+
278
+ - **Organic impressions and clicks** -- Google Search Console, measured weekly for first 90 days
279
+ - **Average position for target keyword** -- GSC, track trend over 30/60/90 day windows
280
+ - **Click-through rate (CTR) from SERP** -- GSC, compare against position-adjusted benchmarks
281
+ - **Time on page / scroll depth** -- Analytics platform, indicates content engagement
282
+ - **Internal link click-through** -- Track clicks on internal links within the asset
283
+ - **Core Web Vitals pass rate** -- PageSpeed Insights or CrUX data, must maintain "Good" threshold
284
+ - **Indexed status** -- Confirm page is indexed within 7 days of publication via GSC