anymorph 0.4.0 → 0.6.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/README.md +3 -3
- package/dist/index.js +79 -6
- package/package.json +1 -1
- package/dist/skillpacks/geo/scaffold/AGENTS.md +0 -38
- package/dist/skillpacks/geo/scaffold/CLAUDE.md +0 -33
- package/dist/skillpacks/geo/shared/evidence-principles.md +0 -35
- package/dist/skillpacks/geo/shared/geo-principles.md +0 -281
- package/dist/skillpacks/geo/shared/vertical-playbooks/beauty.md +0 -65
- package/dist/skillpacks/geo/shared/vertical-playbooks/commerce.md +0 -65
- package/dist/skillpacks/geo/shared/vertical-playbooks/ota.md +0 -62
- package/dist/skillpacks/geo/shared/vertical-playbooks/saas.md +0 -64
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +0 -54
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +0 -95
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +0 -194
- package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +0 -188
- package/dist/skillpacks/geo/skills/geo-generating-actions/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +0 -440
- package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo-scaffold.mjs +0 -358
- package/dist/skillpacks/geo/skills/geo-generating-actions/scripts/geo.mjs +0 -66
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/SKILL.md +0 -50
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/external-authority-diagnosis.md +0 -66
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +0 -86
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/memory-contract.md +0 -15
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/semantic-clusters-diagnosis.md +0 -58
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/strategy-map-contract.md +0 -26
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/visibility-diagnosis.md +0 -50
- package/dist/skillpacks/geo/skills/geo-local-setup/SKILL.md +0 -66
- package/dist/skillpacks/geo/skills/geo-local-setup/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-page-writer/SKILL.md +0 -81
- package/dist/skillpacks/geo/skills/geo-page-writer/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-page-writer/references/research.md +0 -61
- package/dist/skillpacks/geo/skills/geo-page-writer/references/validation.md +0 -59
- package/dist/skillpacks/geo/skills/geo-page-writer/references/writing.md +0 -55
- package/dist/skillpacks/geo/skills/geo-page-writer/scripts/check-page-mdx.mjs +0 -210
- package/dist/skillpacks/geo/skills/geo-page-writer/scripts/collect-page-sources.mjs +0 -303
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +0 -51
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +0 -125
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +0 -269
- package/dist/skillpacks/geo/skills/geo-writer/SKILL.md +0 -234
- package/dist/skillpacks/geo/skills/geo-writer/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/geo-writer/references/content-writer-contract.md +0 -316
- package/dist/skillpacks/geo/skills/geo-writer/references/direct-sql.md +0 -187
- package/dist/skillpacks/geo/skills/geo-writer/references/seo-geo-insights.md +0 -269
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/SKILL.md +0 -82
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-ecommerce-opportunity/references/ecommerce-rules.md +0 -31
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/SKILL.md +0 -57
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-internal-link-opportunity/references/link-rules.md +0 -28
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/SKILL.md +0 -141
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/references/action-contract.md +0 -62
- package/dist/skillpacks/geo/skills/seo-opportunity-audit/scripts/seo-toolkit.mjs +0 -248
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/SKILL.md +0 -56
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-page-diagnosis/references/page-checks.md +0 -38
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/SKILL.md +0 -66
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/page-type-taxonomy.md +0 -40
- package/dist/skillpacks/geo/skills/seo-serp-opportunity-research/references/serp-methodology.md +0 -38
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/SKILL.md +0 -64
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/agents/openai.yaml +0 -5
- package/dist/skillpacks/geo/skills/seo-technical-diagnosis/references/checks.md +0 -58
- package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +0 -54
- package/dist/skillpacks/geo/skills/third-party-diagnosis/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +0 -111
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +0 -174
- package/dist/skillpacks/geo/skills/third-party-execution-planning/SKILL.md +0 -64
- package/dist/skillpacks/geo/skills/third-party-execution-planning/agents/openai.yaml +0 -4
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/execution-contract.md +0 -90
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/non-social-surface-playbooks.md +0 -123
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/reddit-rules.md +0 -69
- package/dist/skillpacks/geo/skills/third-party-execution-planning/references/social-platform-playbooks.md +0 -59
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
# GEO Pages Diagnosis Workflow
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
|
|
5
|
-
The `geo_pages` channel diagnosis diagnoses and proposes actions for Anymorph-generated GEO pages.
|
|
6
|
-
|
|
7
|
-
It works on pages where:
|
|
8
|
-
|
|
9
|
-
- `source = generated`
|
|
10
|
-
- `renderMode = CMS`
|
|
11
|
-
- the action would create, iterate, re-research, regenerate, or retire a GEO page
|
|
12
|
-
|
|
13
|
-
## Non-Goals
|
|
14
|
-
|
|
15
|
-
- Do not update customer-owned discovered pages.
|
|
16
|
-
- Do not choose final production routes. The page generation executor owns route creation.
|
|
17
|
-
- Do not propose third-party outreach in MVP.
|
|
18
|
-
- Do not use legacy Astro generation paths.
|
|
19
|
-
|
|
20
|
-
## Inputs
|
|
21
|
-
|
|
22
|
-
- candidate rows routed by the orchestrator
|
|
23
|
-
- tenant `agent/BRAND.md`
|
|
24
|
-
- tenant `agent/STRATEGY.md`
|
|
25
|
-
- tenant `agent/LEARNINGS.md`
|
|
26
|
-
- relevant rows from:
|
|
27
|
-
- `geo_pages`
|
|
28
|
-
- `geo_intent_coverage`
|
|
29
|
-
- `geo_recommendation_quadrants`
|
|
30
|
-
- `geo_page_intent_visibility_gaps`
|
|
31
|
-
- `geo_page_performance`
|
|
32
|
-
- `geo_strategy_actions_recent`
|
|
33
|
-
- page age and indexation signals when present:
|
|
34
|
-
- `createdAt`, `generatedAt`, `deployedAt`, `publishedAt`, or equivalent page timestamp
|
|
35
|
-
- indexation state, indexed URL inspection state, GSC impressions/clicks, crawler logs, or sitemap/canonical errors
|
|
36
|
-
- generated page scrape when needed
|
|
37
|
-
- representative prompts
|
|
38
|
-
- AI answer samples
|
|
39
|
-
- competitor cited/recommended page scrape when needed
|
|
40
|
-
|
|
41
|
-
## Workflow
|
|
42
|
-
|
|
43
|
-
### 1. Filter Candidates
|
|
44
|
-
|
|
45
|
-
Keep candidates where:
|
|
46
|
-
|
|
47
|
-
- generated page exists and the intent is weak
|
|
48
|
-
- no page exists and the intent is weak
|
|
49
|
-
- generated page is healthy and may support adjacent expansion
|
|
50
|
-
|
|
51
|
-
Drop candidates when:
|
|
52
|
-
|
|
53
|
-
- recent action mask suppresses the same action
|
|
54
|
-
- tenant strategy forbids generated pages for that intent class
|
|
55
|
-
- evidence is too thin
|
|
56
|
-
- the only negative evidence is missing performance data for a fresh generated page still inside the minimum observation window
|
|
57
|
-
|
|
58
|
-
### 2. Classify Candidate Case
|
|
59
|
-
|
|
60
|
-
Assign one primary case.
|
|
61
|
-
|
|
62
|
-
### Freshness and Indexing Guard
|
|
63
|
-
|
|
64
|
-
Before using Case A for an existing generated page, check page age and indexation state.
|
|
65
|
-
|
|
66
|
-
Use a minimum observation window of 7 days after the page was first generated, deployed, or published. If the generated page was published less than 7 days ago, default to `no_action` / monitor unless there is a concrete non-performance defect:
|
|
67
|
-
|
|
68
|
-
- wrong intent or prompt mismatch
|
|
69
|
-
- broken route, bad canonical, blocked crawl, noindex, sitemap omission, or render failure
|
|
70
|
-
- duplicate/cannibalizing page
|
|
71
|
-
- missing brand/entity clarity visible in the page content
|
|
72
|
-
- factual, compliance, or product-claim defect
|
|
73
|
-
|
|
74
|
-
For fresh pages, do not use low visibility, zero traffic, zero GSC impressions, or zero AI citations alone as evidence for `update_existing_page`, `replace_existing_page`, or `remove_or_merge_page`. Record the page in `rejected` or `noActionRationale` with a monitor note and the next evaluation date when possible.
|
|
75
|
-
|
|
76
|
-
If a generated page is not indexed after 7 days, flag this in the analysis. Treat it as a possible `technical_issue` or `insufficient_evidence` finding depending on the evidence:
|
|
77
|
-
|
|
78
|
-
- Use `technical_issue` when there is an indexation, crawlability, canonical, sitemap, robots, noindex, render, or status-code signal.
|
|
79
|
-
- Use `insufficient_evidence` when indexation status is unknown but there are still no GSC impressions, crawler hits, or external visibility signals after the 7-day window.
|
|
80
|
-
- Prefer a diagnostic note or SEO technical follow-up over a content update unless the page content itself is also defective.
|
|
81
|
-
|
|
82
|
-
#### A. Generated Page Exists But Visibility Is Low
|
|
83
|
-
|
|
84
|
-
Use when:
|
|
85
|
-
|
|
86
|
-
- `geo_page_count > 0`
|
|
87
|
-
- `current_visibility` is low
|
|
88
|
-
- quadrant is mostly `absent`, `cited_unnamed`, or `mentioned_not_recommended`
|
|
89
|
-
- the page is outside the freshness guard, or there is a concrete non-performance defect
|
|
90
|
-
|
|
91
|
-
Diagnosis questions:
|
|
92
|
-
|
|
93
|
-
1. Does the generated page match representative prompts?
|
|
94
|
-
2. Is the page too generic?
|
|
95
|
-
3. Does it need re-research?
|
|
96
|
-
4. Does the competitor page have stronger content coverage, proof, comparison, or structure?
|
|
97
|
-
5. Is there a technical issue blocking citation or understanding?
|
|
98
|
-
|
|
99
|
-
#### B. Cited But Not Mentioned
|
|
100
|
-
|
|
101
|
-
Use when:
|
|
102
|
-
|
|
103
|
-
- generated page is cited
|
|
104
|
-
- brand is not clearly mentioned
|
|
105
|
-
|
|
106
|
-
Diagnosis questions:
|
|
107
|
-
|
|
108
|
-
1. Is the generated page visibly tied to the brand?
|
|
109
|
-
2. Does the page lead with generic category information instead of brand-specific evidence?
|
|
110
|
-
3. Are publisher/entity/schema signals weak?
|
|
111
|
-
|
|
112
|
-
#### C. Mentioned But Not Recommended
|
|
113
|
-
|
|
114
|
-
Use when:
|
|
115
|
-
|
|
116
|
-
- tenant brand is mentioned
|
|
117
|
-
- competitors are recommended more often
|
|
118
|
-
|
|
119
|
-
Diagnosis questions:
|
|
120
|
-
|
|
121
|
-
1. Which competitors are recommended?
|
|
122
|
-
2. What reasons did the answer give?
|
|
123
|
-
3. Does the generated page lack the proof, comparison criteria, or positioning that caused competitors to win?
|
|
124
|
-
|
|
125
|
-
#### D. Low Visibility And No Page Exists
|
|
126
|
-
|
|
127
|
-
Use when:
|
|
128
|
-
|
|
129
|
-
- `brand_owned_page_count = 0`
|
|
130
|
-
- `geo_page_count = 0`
|
|
131
|
-
- `current_visibility` is low
|
|
132
|
-
- `absent_rate` is high
|
|
133
|
-
|
|
134
|
-
Diagnosis questions:
|
|
135
|
-
|
|
136
|
-
1. Is the intent real and valuable?
|
|
137
|
-
2. Does the tenant strategy allow a generated page for this intent?
|
|
138
|
-
3. Is there enough evidence to generate a useful page?
|
|
139
|
-
|
|
140
|
-
### 3. Gather Evidence
|
|
141
|
-
|
|
142
|
-
Default evidence:
|
|
143
|
-
|
|
144
|
-
- view rows
|
|
145
|
-
- representative prompts
|
|
146
|
-
- quadrant rates
|
|
147
|
-
- page performance summary
|
|
148
|
-
- page age and indexation status
|
|
149
|
-
- AI answer excerpts
|
|
150
|
-
|
|
151
|
-
Fetch generated page scrape when:
|
|
152
|
-
|
|
153
|
-
- an existing generated page is being evaluated
|
|
154
|
-
|
|
155
|
-
Fetch competitor page scrape when:
|
|
156
|
-
|
|
157
|
-
- competitor pages are cited or recommended repeatedly
|
|
158
|
-
- the action depends on comparison with competitor content
|
|
159
|
-
|
|
160
|
-
Do not fetch competitor pages for every candidate.
|
|
161
|
-
|
|
162
|
-
### 4. Pick Root Cause Buckets
|
|
163
|
-
|
|
164
|
-
Allowed buckets:
|
|
165
|
-
|
|
166
|
-
- `intent_coverage_gap`
|
|
167
|
-
- `content_depth_gap`
|
|
168
|
-
- `entity_clarity_gap`
|
|
169
|
-
- `generic_content_gap`
|
|
170
|
-
- `proof_gap`
|
|
171
|
-
- `comparison_gap`
|
|
172
|
-
- `positioning_gap`
|
|
173
|
-
- `technical_issue`
|
|
174
|
-
- `authority_gap`
|
|
175
|
-
- `product_fit_gap`
|
|
176
|
-
- `prompt_mismatch`
|
|
177
|
-
- `already_healthy`
|
|
178
|
-
- `insufficient_evidence`
|
|
179
|
-
|
|
180
|
-
Use `authority_gap` only when external citation evidence or recommendation reasons support it.
|
|
181
|
-
|
|
182
|
-
### 5. Route Action
|
|
183
|
-
|
|
184
|
-
Allowed action families:
|
|
185
|
-
|
|
186
|
-
- `create_hub_page`
|
|
187
|
-
- `create_spoke_page`
|
|
188
|
-
- `update_existing_page`
|
|
189
|
-
- `replace_existing_page`
|
|
190
|
-
- `remove_or_merge_page`
|
|
191
|
-
- `no_action`
|
|
192
|
-
|
|
193
|
-
Routing defaults:
|
|
194
|
-
|
|
195
|
-
- Broad uncovered intent that should anchor related questions -> `create_hub_page`
|
|
196
|
-
- Narrow uncovered or non-overlapping long-tail intent under an existing hub -> `create_spoke_page`
|
|
197
|
-
- Existing page has the right role and intent but needs content, proof, comparison, research, or technical improvement -> `update_existing_page`
|
|
198
|
-
- Existing page slot should remain but the angle/brief is fundamentally wrong -> `replace_existing_page`
|
|
199
|
-
- Existing page should not remain independent because it is duplicate, overlapping, or should consolidate into a stronger page -> `remove_or_merge_page`
|
|
200
|
-
- Healthy page or weak evidence -> `no_action`
|
|
201
|
-
- Fresh generated page with no concrete defect -> `no_action` until the minimum observation window has passed
|
|
202
|
-
- Page not indexed after 7 days -> flag the indexation issue in analysis; route to `no_action` or a technical follow-up unless there is enough evidence for a concrete fix
|
|
203
|
-
|
|
204
|
-
### 6. Output
|
|
205
|
-
|
|
206
|
-
Return a compact diagnosis for each accepted action:
|
|
207
|
-
|
|
208
|
-
- candidate type
|
|
209
|
-
- page URL/pageId when available
|
|
210
|
-
- intentId
|
|
211
|
-
- root cause buckets with confidence
|
|
212
|
-
- recommended action family
|
|
213
|
-
- concrete operations
|
|
214
|
-
- evidence references
|
|
215
|
-
- why other actions were rejected
|
|
216
|
-
- freshness/indexation rationale for monitored fresh pages or pages not indexed after 7 days
|
|
217
|
-
|
|
218
|
-
For create actions:
|
|
219
|
-
|
|
220
|
-
- do not invent final URL
|
|
221
|
-
- optional `target.suggestedSlug` is non-binding only
|
|
222
|
-
- include `target.pageRole` as `HUB` for `create_hub_page` and `SPOKE` for `create_spoke_page`
|
|
223
|
-
|
|
224
|
-
## Examples
|
|
225
|
-
|
|
226
|
-
### Existing Generated Page Is Weak
|
|
227
|
-
|
|
228
|
-
If a generated page exists but competitors win because their cited pages contain stronger comparison criteria:
|
|
229
|
-
|
|
230
|
-
- root cause: `comparison_gap`
|
|
231
|
-
- action family: `update_existing_page`
|
|
232
|
-
- operation: add comparison criteria, direct recommendation framing, and proof points
|
|
233
|
-
|
|
234
|
-
### Existing Generated Page Is Fresh
|
|
235
|
-
|
|
236
|
-
If a generated page was published less than 7 days ago and the only weak signals are zero traffic, zero GSC impressions, or zero AI citations:
|
|
237
|
-
|
|
238
|
-
- root cause: `insufficient_evidence`
|
|
239
|
-
- action family: `no_action`
|
|
240
|
-
- operation: monitor until the minimum observation window has passed
|
|
241
|
-
|
|
242
|
-
### Existing Generated Page Is Not Indexed After 7 Days
|
|
243
|
-
|
|
244
|
-
If a generated page is not indexed after 7 days:
|
|
245
|
-
|
|
246
|
-
- root cause: `technical_issue` when crawl/indexation evidence identifies a blocker
|
|
247
|
-
- root cause: `insufficient_evidence` when indexation status is unknown
|
|
248
|
-
- action family: `no_action` or technical follow-up, not a content update by default
|
|
249
|
-
- operation: flag the indexation issue in the analysis and recommend checking sitemap, canonical, robots, noindex, status code, and rendered HTML
|
|
250
|
-
|
|
251
|
-
### No Page Exists
|
|
252
|
-
|
|
253
|
-
If no discovered or generated page covers a weak intent:
|
|
254
|
-
|
|
255
|
-
- root cause: `intent_coverage_gap`
|
|
256
|
-
- action family: `create_hub_page`
|
|
257
|
-
- operation: generate a CMS-backed GEO page for the intent
|
|
258
|
-
|
|
259
|
-
## Guardrails
|
|
260
|
-
|
|
261
|
-
- Use CMS-backed generation only.
|
|
262
|
-
- Do not use legacy Astro paths.
|
|
263
|
-
- Do not duplicate a discovered page that clearly owns the intent.
|
|
264
|
-
- Do not replace a page when a targeted update is sufficient.
|
|
265
|
-
- Do not create a spoke page unless the differentiation from the hub or existing page is explicit.
|
|
266
|
-
- Do not diagnose authority from low visibility alone.
|
|
267
|
-
- Do not diagnose a fresh generated page as underperforming from missing performance data alone.
|
|
268
|
-
- Do not recommend generated-page content updates for pages published less than 7 days ago unless a concrete non-performance defect is present.
|
|
269
|
-
- Do flag pages that are not indexed after 7 days, but separate indexation analysis from content-quality analysis.
|
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: geo-writer
|
|
3
|
-
description: Use when the user asks to write SEO/GEO content, create a page-generation brief, turn weak intents or prompts into E-E-A-T page copy, use auto mode from domain/lang/topic, or extract Anymorph data for a content writer using ~/brain SEO GEO insight principles.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# GEO Writer
|
|
7
|
-
|
|
8
|
-
## When to use
|
|
9
|
-
|
|
10
|
-
- "SEO GEO insight 기반으로 content 써줘"
|
|
11
|
-
- "page generation용 content writer brief 만들어줘"
|
|
12
|
-
- "weak intent를 E-E-A-T한 페이지로 바꿔줘"
|
|
13
|
-
- "Anymorph DB에서 데이터 뽑아서 page content context 만들어줘"
|
|
14
|
-
- "GEO 페이지를 독창적이고 citation-ready하게 써줘"
|
|
15
|
-
- "이 prompt/keyword/pageId로 글 초안 또는 generation brief 만들어줘"
|
|
16
|
-
- "domain/lang/topic만 줄 테니 나머지는 알아서 채워줘"
|
|
17
|
-
|
|
18
|
-
## Core principle
|
|
19
|
-
|
|
20
|
-
이 Skill은 글쓰기 프롬프트가 아니라 **page generation 직전의 authoring intelligence layer**다. 목표는 검색어를 반복하는 글이 아니라, 사람에게는 결정을 돕고 AI에게는 답변에 인용할 수 있는 `answer unit + evidence unit`을 만드는 것이다.
|
|
21
|
-
|
|
22
|
-
The output must be one of:
|
|
23
|
-
|
|
24
|
-
- `Content Data Pack` + `Editorial Kernel` + `Section Evidence Contract`
|
|
25
|
-
- research-only content brief / outline
|
|
26
|
-
- `generate_managed_pages.context`에 넣을 page generation brief
|
|
27
|
-
- tenant repo direct-edit용 page copy plan
|
|
28
|
-
|
|
29
|
-
## Input modes
|
|
30
|
-
|
|
31
|
-
### Auto mode
|
|
32
|
-
|
|
33
|
-
Use this mode by default when the user gives only a domain/workspace, language, and free-form topic.
|
|
34
|
-
|
|
35
|
-
Minimum input:
|
|
36
|
-
|
|
37
|
-
```yaml
|
|
38
|
-
domain: "example.com"
|
|
39
|
-
lang: "ko"
|
|
40
|
-
topic: "GEO page generation이 기존 SEO 블로그 생성과 다른 이유"
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Auto-fill the rest:
|
|
44
|
-
|
|
45
|
-
| Field | How to infer |
|
|
46
|
-
| --- | --- |
|
|
47
|
-
| `workspaceId` | `list_workspaces()` then exact/fuzzy match domain. If ambiguous, ask once. |
|
|
48
|
-
| `market` | `get_brand_profile.primaryCountry`; fallback from lang (`ko`→`KR`, `ja`→`JP`, `en`→`US`, `zh`→`CN`, `th`→`TH`) and mark as inferred. |
|
|
49
|
-
| `output_mode` | default `generation_brief`; use `managed_generation` only if the user says to create/generate now. |
|
|
50
|
-
| `data_mode` | default `mcp_first`; direct SQL stays off unless explicitly requested or necessary and approved. |
|
|
51
|
-
| `target_reader` | brand profile audience + topic; fallback to the likely buyer/researcher for the content type. |
|
|
52
|
-
| `content_type` | infer from topic: vs/comparison, alternatives, what-is/glossary, how-to/guide, benchmark/report, pricing/ROI, docs/API, case-study; default guide. |
|
|
53
|
-
| `primary_question` | rewrite topic into one direct reader question in the target language. |
|
|
54
|
-
| `page_goal` | infer from funnel and brand fit: educate, compare, shortlist, prove ROI, implementation support, or conversion assist. |
|
|
55
|
-
| `cta_goal` | infer from workspace/brand instructions; fallback to a low-friction next step such as demo, examples, docs, pricing, or audit. |
|
|
56
|
-
| `title_selection_mode` | default `user_select_before_generation`; use `auto_recommended` only if the user explicitly asks to auto-pick. |
|
|
57
|
-
| `route_or_slug` | derive from topic in target language style, then check collisions with `list_managed_pages`. |
|
|
58
|
-
|
|
59
|
-
Do not ask for optional fields unless the missing value changes risk or execution path. If a field is inferred, label it as `inferred` in the brief.
|
|
60
|
-
|
|
61
|
-
### Full input mode
|
|
62
|
-
|
|
63
|
-
Use this when the user provides structured inputs or wants precise control.
|
|
64
|
-
|
|
65
|
-
```yaml
|
|
66
|
-
domain: "anymorph.ai"
|
|
67
|
-
workspaceId: "optional"
|
|
68
|
-
lang: "ko"
|
|
69
|
-
market: "KR"
|
|
70
|
-
topic: "GEO page generation이 기존 SEO 블로그 생성과 다른 이유"
|
|
71
|
-
output_mode: "generation_brief" # auto | generation_brief | research_only | managed_generation | tenant_repo_copy
|
|
72
|
-
data_mode: "mcp_first" # mcp_first | allow_direct_sql
|
|
73
|
-
target_reader: "B2B SaaS founder와 마케팅 리더"
|
|
74
|
-
page_goal: "Anymorph를 GEO 페이지 생성 솔루션으로 신뢰하게 만들기"
|
|
75
|
-
content_type: "guide"
|
|
76
|
-
primary_question: "GEO 페이지는 SEO 블로그와 무엇이 다른가?"
|
|
77
|
-
cta_goal: "demo 요청"
|
|
78
|
-
title_selection_mode: "user_select_before_generation" # user_select_before_generation | auto_recommended | user_provided
|
|
79
|
-
route_or_slug: "/geo-page-generation"
|
|
80
|
-
pageId: "optional existing page"
|
|
81
|
-
intentId: "optional weak intent"
|
|
82
|
-
promptIds: ["optional prompt ids"]
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Source hierarchy
|
|
86
|
-
|
|
87
|
-
Use sources in this order:
|
|
88
|
-
|
|
89
|
-
1. User-provided page/topic/workspace constraints
|
|
90
|
-
2. Anymorph MCP read tools
|
|
91
|
-
3. Workspace living document, brand profile, product/catalog facts
|
|
92
|
-
4. Existing page research reports and page visibility diagnostics
|
|
93
|
-
5. Bundled SEO/GEO Insight Reference from `~/brain/01-Projects/Content/SEO GEO insight`: [seo-geo-insights.md](references/seo-geo-insights.md)
|
|
94
|
-
6. External research only when the topic needs fresh third-party evidence
|
|
95
|
-
7. Guarded direct SQL only when MCP tools cannot return the needed slice
|
|
96
|
-
|
|
97
|
-
## Workflow
|
|
98
|
-
|
|
99
|
-
### Step 1 - Resolve workspace and objective
|
|
100
|
-
|
|
101
|
-
Parse the input as Auto mode or Full input mode. If only `domain`, `lang`, and `topic` are present, run Auto mode and infer the remaining fields. If `workspaceId` is unknown, call `list_workspaces()` and match by domain; ask only if no match or multiple likely matches exist. If the user gave a page path or URL, resolve it with `list_managed_pages`. If the user gave `pageId`, use it directly.
|
|
102
|
-
|
|
103
|
-
Classify the task:
|
|
104
|
-
|
|
105
|
-
| User intent | Output mode |
|
|
106
|
-
| --- | --- |
|
|
107
|
-
| domain/lang/topic only | auto → default `generation_brief` |
|
|
108
|
-
| "먼저 방향/brief만" | research-only brief |
|
|
109
|
-
| "대시보드 generation으로" or no tenant repo path | managed generation brief |
|
|
110
|
-
| "바로 생성", "generate now", "대시보드에 만들어" | managed_generation |
|
|
111
|
-
| local tenant repo path, code/layout edits | tenant repo direct-edit plan |
|
|
112
|
-
| existing page refresh | hand off to `refreshing-existing-pages` unless user specifically wants a new authoring brief |
|
|
113
|
-
|
|
114
|
-
### Step 2 - Build the Content Data Pack
|
|
115
|
-
|
|
116
|
-
Before collecting or drafting anything, read [seo-geo-insights.md](references/seo-geo-insights.md). Treat it as the non-negotiable operating and content law for the brief: SEO is page selection, GEO is answer inclusion, and every page must become a people-first, evidence-backed, citation-ready answer asset.
|
|
117
|
-
|
|
118
|
-
Use MCP tools first:
|
|
119
|
-
|
|
120
|
-
| Need | Tools |
|
|
121
|
-
| --- | --- |
|
|
122
|
-
| Workspace/brand rules | `get_workspace_instructions`, `get_brand_profile`, `get_brand_voice_kit` |
|
|
123
|
-
| Demand/opportunity | `list_weak_intents`, `list_seo_opportunities`, `search_keywords`, `serp_snapshot` |
|
|
124
|
-
| Existing page context | `list_managed_pages`, `get_page`, `get_page_research`, `get_page_prompts`, `get_page_visibility`, `get_page_insights` |
|
|
125
|
-
| Brand/product evidence | `search_living_document`, `list_catalog_products`, `get_catalog_product`, `get_page_products` |
|
|
126
|
-
| Prompt diagnostics | `insight_list_action_candidates`, `insight_get_prompt_diagnostic` |
|
|
127
|
-
|
|
128
|
-
When the user explicitly asks for DB extraction, or MCP tools cannot answer a necessary data question, read [direct-sql.md](references/direct-sql.md) and use the guarded SQL path.
|
|
129
|
-
|
|
130
|
-
When constructing the final data object or generation brief, read [content-writer-contract.md](references/content-writer-contract.md).
|
|
131
|
-
|
|
132
|
-
### Step 3 - Build the Editorial Kernel before drafting
|
|
133
|
-
|
|
134
|
-
Do not start with an article draft. First produce:
|
|
135
|
-
|
|
136
|
-
- `primaryQuestion`: the one question this page answers
|
|
137
|
-
- `readerJob`: what the reader is trying to decide/do
|
|
138
|
-
- `answerPromise`: the shortest true answer
|
|
139
|
-
- `originalAngle`: the non-commodity POV, method, benchmark, product truth, or field observation
|
|
140
|
-
- `evidenceWedge`: the strongest evidence type available
|
|
141
|
-
- `honestBrandRole`: where the brand belongs and where it should not be forced
|
|
142
|
-
- `hook`: concrete first sentence, not clickbait
|
|
143
|
-
- `titlePosture`: whether this page needs an orthodox, hybrid, or POV-led title strategy
|
|
144
|
-
- `caveats`: constraints, exceptions, non-fit cases, freshness limits
|
|
145
|
-
|
|
146
|
-
Good hook shape:
|
|
147
|
-
|
|
148
|
-
```text
|
|
149
|
-
Reader pain/context + concrete answer + useful tension + evidence promise
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Never use vague hooks such as "In today's digital age", "Have you ever wondered", "ultimate guide", "game-changing", or "transform your business".
|
|
153
|
-
|
|
154
|
-
### Step 4 - Create the Section Evidence Contract
|
|
155
|
-
|
|
156
|
-
For every proposed H2, define:
|
|
157
|
-
|
|
158
|
-
- the exact question answered
|
|
159
|
-
- a 1-2 sentence answer capsule
|
|
160
|
-
- allowed evidence IDs
|
|
161
|
-
- forbidden claims
|
|
162
|
-
- internal link target when useful
|
|
163
|
-
- table/list/component recommendation only when it helps the reader
|
|
164
|
-
|
|
165
|
-
Each H2 must be independently understandable. Do not rely on "as mentioned above".
|
|
166
|
-
|
|
167
|
-
### Step 5 - Write the brief or hand off to generation
|
|
168
|
-
|
|
169
|
-
For **managed generation**, call `generate_managed_pages` only after the brief is ready:
|
|
170
|
-
|
|
171
|
-
- If no title has been selected by the user, output the Title Candidate Set and stop for selection. Do not call `generate_managed_pages` yet.
|
|
172
|
-
- Mark the title `selection_status` as `needs_user_selection` until the user chooses a candidate or explicitly authorizes auto-pick.
|
|
173
|
-
- The user may choose by candidate ID (`T1`, `T2`, etc.) or edit a candidate. Preserve the user's chosen title unless it violates evidence, trust, or hype rules.
|
|
174
|
-
- If the user explicitly requested auto-pick/auto-generate, use the `recommended` title candidate and mark `title_selection_mode: auto_recommended`.
|
|
175
|
-
|
|
176
|
-
```text
|
|
177
|
-
generate_managed_pages(
|
|
178
|
-
workspaceId,
|
|
179
|
-
title,
|
|
180
|
-
slug,
|
|
181
|
-
description,
|
|
182
|
-
context: "<Data Pack summary + Editorial Kernel + Section Evidence Contract + QA rules>",
|
|
183
|
-
enableDeepResearch: true|false
|
|
184
|
-
)
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
Set `enableDeepResearch` to `true` only when the current evidence is not enough. If the Data Pack already contains strong first-party facts, page research, SERP patterns, and third-party sources, use `false`.
|
|
188
|
-
|
|
189
|
-
For **research-only**, output the brief and outline without calling generation tools.
|
|
190
|
-
|
|
191
|
-
For **tenant repo direct edit**, inspect the repo structure first, edit native page/content files, and run the repo's build/test/lint path.
|
|
192
|
-
|
|
193
|
-
### Step 6 - QA before final output
|
|
194
|
-
|
|
195
|
-
Reject or repair the brief if any of these fail:
|
|
196
|
-
|
|
197
|
-
- People-first: reader can complete the job without searching again.
|
|
198
|
-
- E-E-A-T: who/how/why, source, method, date, and responsibility are clear where relevant.
|
|
199
|
-
- Originality: not just a public-summary rewrite.
|
|
200
|
-
- Answer-first: intro and every H2 start with a direct answer.
|
|
201
|
-
- Evidence: factual claims map to evidence IDs; no invented stats or quotes.
|
|
202
|
-
- Fan-out: major subquestions are covered without creating thin variants.
|
|
203
|
-
- Scannability: meaningful headings, short paragraphs, useful tables only.
|
|
204
|
-
- Hook/title: concrete, useful, intent-clear, and not hype or curiosity bait.
|
|
205
|
-
- Brand honesty: fit and non-fit are clear.
|
|
206
|
-
- Technical readiness: crawlable/indexable assumptions, metadata, visible content/schema consistency.
|
|
207
|
-
|
|
208
|
-
## Writing rules
|
|
209
|
-
|
|
210
|
-
- Use the brand voice kit, but never expose the voice-kit payload in page copy.
|
|
211
|
-
- Use statistics only when source material contains the exact number, source, year, and URL when available.
|
|
212
|
-
- Use exact quotes only when the source contains the exact quote and attribution.
|
|
213
|
-
- Prefer first-party/proprietary evidence when available: product facts, methodology, case detail, support patterns, benchmark, screenshots, pricing assumptions.
|
|
214
|
-
- Do not fabricate customer stories, expert titles, testimonials, comparisons, prices, dates, screenshots, or proprietary data.
|
|
215
|
-
- One page = one primary intent. Cover fan-out questions as supporting sections, not as thin sibling pages.
|
|
216
|
-
- Avoid forced FAQ/table/schema. Include them only when they help the reader or extraction.
|
|
217
|
-
- For YMYL-like topics, require stronger source quality and caveats.
|
|
218
|
-
|
|
219
|
-
## Failure modes
|
|
220
|
-
|
|
221
|
-
- **No workspace access**: use `list_workspaces`; if empty, stop and ask for Anymorph authentication.
|
|
222
|
-
- **MCP data too thin**: say which data is missing, then choose direct SQL, external research, or research-only brief.
|
|
223
|
-
- **Direct SQL requested**: read `references/direct-sql.md`; enforce SELECT-only, workspace scoped, limited queries.
|
|
224
|
-
- **No original angle**: do not write generic content. Ask for brand/product proof or create a research-only brief listing the missing evidence.
|
|
225
|
-
- **Existing page collision**: use `list_managed_pages`; if route already exists, hand off to `refreshing-existing-pages`.
|
|
226
|
-
- **Weak evidence for a claim**: remove the claim or rewrite qualitatively without numbers.
|
|
227
|
-
|
|
228
|
-
## References
|
|
229
|
-
|
|
230
|
-
- Canonical SEO/GEO insight operating and content principles: [seo-geo-insights.md](references/seo-geo-insights.md)
|
|
231
|
-
- Data pack, editorial kernel, section contract, and generation brief templates: [content-writer-contract.md](references/content-writer-contract.md)
|
|
232
|
-
- Direct DB extraction guard and SQL recipes: [direct-sql.md](references/direct-sql.md)
|
|
233
|
-
- Research foundation: `docs/seo-geo-eeat-content-writer-research.md`
|
|
234
|
-
- Shared GEO principles: `../../shared/geo-principles.md`
|