anymorph 0.2.2 → 0.2.3
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 +5 -0
- package/dist/index.js +26 -6
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +54 -0
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +96 -0
- package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +191 -0
- package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +43 -0
- package/dist/skillpacks/geo/skills/geo-generating-actions/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +274 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/SKILL.md +50 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/external-authority-diagnosis.md +66 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +86 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/memory-contract.md +15 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/semantic-clusters-diagnosis.md +58 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/strategy-map-contract.md +26 -0
- package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/visibility-diagnosis.md +50 -0
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +51 -0
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +106 -0
- package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +219 -0
- package/dist/skillpacks/geo/skills/geo-writer/SKILL.md +234 -0
- package/dist/skillpacks/geo/skills/geo-writer/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/geo-writer/references/content-writer-contract.md +316 -0
- package/dist/skillpacks/geo/skills/geo-writer/references/direct-sql.md +187 -0
- package/dist/skillpacks/geo/skills/geo-writer/references/seo-geo-insights.md +269 -0
- package/dist/skillpacks/geo/skills/social-execution-planning/SKILL.md +53 -0
- package/dist/skillpacks/geo/skills/social-execution-planning/agents/openai.yaml +5 -0
- package/dist/skillpacks/geo/skills/social-execution-planning/references/execution-contract.md +68 -0
- package/dist/skillpacks/geo/skills/social-execution-planning/references/platform-playbooks.md +59 -0
- package/dist/skillpacks/geo/skills/social-execution-planning/references/reddit-rules.md +69 -0
- package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +54 -0
- package/dist/skillpacks/geo/skills/third-party-diagnosis/agents/openai.yaml +4 -0
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +111 -0
- package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +174 -0
- package/package.json +1 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# GEO Strategy: GEO Pages Diagnosis
|
|
2
|
+
|
|
3
|
+
You diagnose Anymorph-generated CMS-backed GEO pages and intent gaps where a new GEO page may be needed.
|
|
4
|
+
|
|
5
|
+
## Scope
|
|
6
|
+
|
|
7
|
+
Work on:
|
|
8
|
+
|
|
9
|
+
- generated CMS GEO pages
|
|
10
|
+
- weak intents with no suitable owned or generated page
|
|
11
|
+
- generated pages that need iteration, re-research, regeneration, or retirement
|
|
12
|
+
|
|
13
|
+
Do not choose final production routes. The page generation executor owns route creation.
|
|
14
|
+
|
|
15
|
+
## Cases
|
|
16
|
+
|
|
17
|
+
- generated page exists but visibility is low
|
|
18
|
+
- generated page is cited but brand is not mentioned
|
|
19
|
+
- brand is mentioned but not recommended
|
|
20
|
+
- low visibility and no page exists
|
|
21
|
+
|
|
22
|
+
## Evidence Order
|
|
23
|
+
|
|
24
|
+
Use the cheapest sufficient evidence.
|
|
25
|
+
|
|
26
|
+
1. Common run context and routed candidates.
|
|
27
|
+
2. `list_geo_strategy_candidates` for the first generated-page or no-page candidate slice.
|
|
28
|
+
3. `get_geo_intent_diagnostic` for one intent before deeper checks.
|
|
29
|
+
4. For commerce workspaces and create_geo_page candidates, `get_intent_products` to verify catalog fit and product ids.
|
|
30
|
+
5. `get_page_insights`, `get_page_visibility`, or `list_ai_responses` for prompt/answer evidence.
|
|
31
|
+
6. `get_page_content` or `get_page_source_code` for generated page body or technical diagnosis.
|
|
32
|
+
7. `web_scrape` only for a specific cited/recommended competitor URL.
|
|
33
|
+
8. `serp_snapshot` or `dataforseo_research` only when the evidence depends on external search demand or SERP shape.
|
|
34
|
+
|
|
35
|
+
## Root Cause Buckets
|
|
36
|
+
|
|
37
|
+
Allowed buckets:
|
|
38
|
+
|
|
39
|
+
- `intent_coverage_gap`
|
|
40
|
+
- `content_depth_gap`
|
|
41
|
+
- `entity_clarity_gap`
|
|
42
|
+
- `generic_content_gap`
|
|
43
|
+
- `proof_gap`
|
|
44
|
+
- `comparison_gap`
|
|
45
|
+
- `positioning_gap`
|
|
46
|
+
- `technical_issue`
|
|
47
|
+
- `authority_gap`
|
|
48
|
+
- `product_fit_gap`
|
|
49
|
+
- `prompt_mismatch`
|
|
50
|
+
- `already_healthy`
|
|
51
|
+
- `insufficient_evidence`
|
|
52
|
+
|
|
53
|
+
Use `authority_gap` only when external citation evidence or recommendation reasons support it.
|
|
54
|
+
|
|
55
|
+
## Action Families
|
|
56
|
+
|
|
57
|
+
Allowed families:
|
|
58
|
+
|
|
59
|
+
- `create_geo_page`
|
|
60
|
+
- `iterate_geo_page`
|
|
61
|
+
- `re_research_geo_page`
|
|
62
|
+
- `regenerate_geo_page`
|
|
63
|
+
- `retire_geo_page`
|
|
64
|
+
- `expand_adjacent_intent`
|
|
65
|
+
- `fix_technical_issue`
|
|
66
|
+
- `no_action`
|
|
67
|
+
|
|
68
|
+
## Output
|
|
69
|
+
|
|
70
|
+
Produce one `geo_pages` diagnosis object in this shape.
|
|
71
|
+
|
|
72
|
+
Do not write intermediate diagnosis JSON files directly.
|
|
73
|
+
|
|
74
|
+
Do not include `workspaceId`, `runId`, `channel`, final action id, final URL, or final `assetType`; the orchestrator and executor derive them.
|
|
75
|
+
|
|
76
|
+
For commerce workspaces, create_geo_page proposals must include product evidence from `get_intent_products` when catalog fit is fit or weak-fit. Put the selected product ids in `target.targetProductIds`. If catalog fit is no-fit, reject the create action or propose a non-product informational direction.
|
|
77
|
+
|
|
78
|
+
Use this shape:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"summary": "Short diagnosis.",
|
|
83
|
+
"proposals": [
|
|
84
|
+
{
|
|
85
|
+
"intentId": "intent_123",
|
|
86
|
+
"candidateType": "low_visibility_no_page",
|
|
87
|
+
"target": { "suggestedSlug": "optional-non-binding-hint", "targetProductIds": ["optional-commerce-product-id"] },
|
|
88
|
+
"rootCauses": [
|
|
89
|
+
{ "bucket": "intent_coverage_gap", "confidence": 0.81, "evidence": ["No page covers the weak intent."] }
|
|
90
|
+
],
|
|
91
|
+
"actionFamily": "create_geo_page",
|
|
92
|
+
"operations": ["Generate a CMS-backed GEO page for the intent"],
|
|
93
|
+
"priority": "high",
|
|
94
|
+
"confidence": "high",
|
|
95
|
+
"evidence": [
|
|
96
|
+
{ "type": "workspace", "ref": "geo_page_intent_visibility_gaps:intent_123", "summary": "Low visibility with no owned or generated page." }
|
|
97
|
+
],
|
|
98
|
+
"whyNow": "Why this matters this week.",
|
|
99
|
+
"risks": []
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"rejected": [
|
|
103
|
+
{ "ref": "page_456", "reason": "Existing page is healthy." }
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
```
|
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
- generated page scrape when needed
|
|
34
|
+
- representative prompts
|
|
35
|
+
- AI answer samples
|
|
36
|
+
- competitor cited/recommended page scrape when needed
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
### 1. Filter Candidates
|
|
41
|
+
|
|
42
|
+
Keep candidates where:
|
|
43
|
+
|
|
44
|
+
- generated page exists and the intent is weak
|
|
45
|
+
- no page exists and the intent is weak
|
|
46
|
+
- generated page is healthy and may support adjacent expansion
|
|
47
|
+
|
|
48
|
+
Drop candidates when:
|
|
49
|
+
|
|
50
|
+
- recent action mask suppresses the same action
|
|
51
|
+
- tenant strategy forbids generated pages for that intent class
|
|
52
|
+
- evidence is too thin
|
|
53
|
+
|
|
54
|
+
### 2. Classify Candidate Case
|
|
55
|
+
|
|
56
|
+
Assign one primary case.
|
|
57
|
+
|
|
58
|
+
#### A. Generated Page Exists But Visibility Is Low
|
|
59
|
+
|
|
60
|
+
Use when:
|
|
61
|
+
|
|
62
|
+
- `geo_page_count > 0`
|
|
63
|
+
- `current_visibility` is low
|
|
64
|
+
- quadrant is mostly `absent`, `cited_unnamed`, or `mentioned_not_recommended`
|
|
65
|
+
|
|
66
|
+
Diagnosis questions:
|
|
67
|
+
|
|
68
|
+
1. Does the generated page match representative prompts?
|
|
69
|
+
2. Is the page too generic?
|
|
70
|
+
3. Does it need re-research?
|
|
71
|
+
4. Does the competitor page have stronger content coverage, proof, comparison, or structure?
|
|
72
|
+
5. Is there a technical issue blocking citation or understanding?
|
|
73
|
+
|
|
74
|
+
#### B. Cited But Not Mentioned
|
|
75
|
+
|
|
76
|
+
Use when:
|
|
77
|
+
|
|
78
|
+
- generated page is cited
|
|
79
|
+
- brand is not clearly mentioned
|
|
80
|
+
|
|
81
|
+
Diagnosis questions:
|
|
82
|
+
|
|
83
|
+
1. Is the generated page visibly tied to the brand?
|
|
84
|
+
2. Does the page lead with generic category information instead of brand-specific evidence?
|
|
85
|
+
3. Are publisher/entity/schema signals weak?
|
|
86
|
+
|
|
87
|
+
#### C. Mentioned But Not Recommended
|
|
88
|
+
|
|
89
|
+
Use when:
|
|
90
|
+
|
|
91
|
+
- tenant brand is mentioned
|
|
92
|
+
- competitors are recommended more often
|
|
93
|
+
|
|
94
|
+
Diagnosis questions:
|
|
95
|
+
|
|
96
|
+
1. Which competitors are recommended?
|
|
97
|
+
2. What reasons did the answer give?
|
|
98
|
+
3. Does the generated page lack the proof, comparison criteria, or positioning that caused competitors to win?
|
|
99
|
+
|
|
100
|
+
#### D. Low Visibility And No Page Exists
|
|
101
|
+
|
|
102
|
+
Use when:
|
|
103
|
+
|
|
104
|
+
- `brand_owned_page_count = 0`
|
|
105
|
+
- `geo_page_count = 0`
|
|
106
|
+
- `current_visibility` is low
|
|
107
|
+
- `absent_rate` is high
|
|
108
|
+
|
|
109
|
+
Diagnosis questions:
|
|
110
|
+
|
|
111
|
+
1. Is the intent real and valuable?
|
|
112
|
+
2. Does the tenant strategy allow a generated page for this intent?
|
|
113
|
+
3. Is there enough evidence to generate a useful page?
|
|
114
|
+
|
|
115
|
+
### 3. Gather Evidence
|
|
116
|
+
|
|
117
|
+
Default evidence:
|
|
118
|
+
|
|
119
|
+
- view rows
|
|
120
|
+
- representative prompts
|
|
121
|
+
- quadrant rates
|
|
122
|
+
- page performance summary
|
|
123
|
+
- AI answer excerpts
|
|
124
|
+
|
|
125
|
+
Fetch generated page scrape when:
|
|
126
|
+
|
|
127
|
+
- an existing generated page is being evaluated
|
|
128
|
+
|
|
129
|
+
Fetch competitor page scrape when:
|
|
130
|
+
|
|
131
|
+
- competitor pages are cited or recommended repeatedly
|
|
132
|
+
- the action depends on comparison with competitor content
|
|
133
|
+
|
|
134
|
+
Do not fetch competitor pages for every candidate.
|
|
135
|
+
|
|
136
|
+
### 4. Pick Root Cause Buckets
|
|
137
|
+
|
|
138
|
+
Allowed buckets:
|
|
139
|
+
|
|
140
|
+
- `intent_coverage_gap`
|
|
141
|
+
- `content_depth_gap`
|
|
142
|
+
- `entity_clarity_gap`
|
|
143
|
+
- `generic_content_gap`
|
|
144
|
+
- `proof_gap`
|
|
145
|
+
- `comparison_gap`
|
|
146
|
+
- `positioning_gap`
|
|
147
|
+
- `technical_issue`
|
|
148
|
+
- `authority_gap`
|
|
149
|
+
- `product_fit_gap`
|
|
150
|
+
- `prompt_mismatch`
|
|
151
|
+
- `already_healthy`
|
|
152
|
+
- `insufficient_evidence`
|
|
153
|
+
|
|
154
|
+
Use `authority_gap` only when external citation evidence or recommendation reasons support it.
|
|
155
|
+
|
|
156
|
+
### 5. Route Action
|
|
157
|
+
|
|
158
|
+
Allowed action families:
|
|
159
|
+
|
|
160
|
+
- `create_geo_page`
|
|
161
|
+
- `iterate_geo_page`
|
|
162
|
+
- `re_research_geo_page`
|
|
163
|
+
- `regenerate_geo_page`
|
|
164
|
+
- `retire_geo_page`
|
|
165
|
+
- `expand_adjacent_intent`
|
|
166
|
+
- `fix_technical_issue`
|
|
167
|
+
- `no_action`
|
|
168
|
+
|
|
169
|
+
Routing defaults:
|
|
170
|
+
|
|
171
|
+
- No page + low visibility + absent -> `create_geo_page`
|
|
172
|
+
- Existing page + intent mismatch -> `regenerate_geo_page` or `retire_geo_page`
|
|
173
|
+
- Existing page + weak content -> `iterate_geo_page`
|
|
174
|
+
- Existing page + missing evidence -> `re_research_geo_page`
|
|
175
|
+
- Healthy page -> `expand_adjacent_intent` or `no_action`
|
|
176
|
+
|
|
177
|
+
### 6. Output
|
|
178
|
+
|
|
179
|
+
Return a compact diagnosis for each accepted action:
|
|
180
|
+
|
|
181
|
+
- candidate type
|
|
182
|
+
- page URL/pageId when available
|
|
183
|
+
- intentId
|
|
184
|
+
- root cause buckets with confidence
|
|
185
|
+
- recommended action family
|
|
186
|
+
- concrete operations
|
|
187
|
+
- evidence references
|
|
188
|
+
- why other actions were rejected
|
|
189
|
+
|
|
190
|
+
For create actions:
|
|
191
|
+
|
|
192
|
+
- do not invent final URL
|
|
193
|
+
- optional `target.suggestedSlug` is non-binding only
|
|
194
|
+
|
|
195
|
+
## Examples
|
|
196
|
+
|
|
197
|
+
### Existing Generated Page Is Weak
|
|
198
|
+
|
|
199
|
+
If a generated page exists but competitors win because their cited pages contain stronger comparison criteria:
|
|
200
|
+
|
|
201
|
+
- root cause: `comparison_gap`
|
|
202
|
+
- action family: `iterate_geo_page`
|
|
203
|
+
- operation: add comparison criteria, direct recommendation framing, and proof points
|
|
204
|
+
|
|
205
|
+
### No Page Exists
|
|
206
|
+
|
|
207
|
+
If no discovered or generated page covers a weak intent:
|
|
208
|
+
|
|
209
|
+
- root cause: `intent_coverage_gap`
|
|
210
|
+
- action family: `create_geo_page`
|
|
211
|
+
- operation: generate a CMS-backed GEO page for the intent
|
|
212
|
+
|
|
213
|
+
## Guardrails
|
|
214
|
+
|
|
215
|
+
- Use CMS-backed generation only.
|
|
216
|
+
- Do not use legacy Astro paths.
|
|
217
|
+
- Do not duplicate a discovered page that clearly owns the intent.
|
|
218
|
+
- Do not regenerate when a targeted iteration is sufficient.
|
|
219
|
+
- Do not diagnose authority from low visibility alone.
|
|
@@ -0,0 +1,234 @@
|
|
|
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`
|