anymorph 0.2.6 → 0.5.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 (36) hide show
  1. package/README.md +53 -39
  2. package/dist/index.js +9261 -256
  3. package/package.json +2 -1
  4. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/SKILL.md +0 -54
  5. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/agents/openai.yaml +0 -4
  6. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/diagnosis-contract.md +0 -96
  7. package/dist/skillpacks/geo/skills/brand-owned-diagnosis/references/workflow.md +0 -191
  8. package/dist/skillpacks/geo/skills/geo-generating-actions/SKILL.md +0 -100
  9. package/dist/skillpacks/geo/skills/geo-generating-actions/agents/openai.yaml +0 -4
  10. package/dist/skillpacks/geo/skills/geo-generating-actions/references/orchestrator.workflow.md +0 -274
  11. package/dist/skillpacks/geo/skills/geo-initializing-strategy/SKILL.md +0 -50
  12. package/dist/skillpacks/geo/skills/geo-initializing-strategy/agents/openai.yaml +0 -4
  13. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/external-authority-diagnosis.md +0 -66
  14. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/foundation-diagnosis.md +0 -86
  15. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/memory-contract.md +0 -15
  16. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/semantic-clusters-diagnosis.md +0 -58
  17. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/strategy-map-contract.md +0 -26
  18. package/dist/skillpacks/geo/skills/geo-initializing-strategy/references/visibility-diagnosis.md +0 -50
  19. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/SKILL.md +0 -51
  20. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/agents/openai.yaml +0 -4
  21. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/diagnosis-contract.md +0 -106
  22. package/dist/skillpacks/geo/skills/geo-pages-diagnosis/references/workflow.md +0 -219
  23. package/dist/skillpacks/geo/skills/geo-writer/SKILL.md +0 -234
  24. package/dist/skillpacks/geo/skills/geo-writer/agents/openai.yaml +0 -4
  25. package/dist/skillpacks/geo/skills/geo-writer/references/content-writer-contract.md +0 -316
  26. package/dist/skillpacks/geo/skills/geo-writer/references/direct-sql.md +0 -187
  27. package/dist/skillpacks/geo/skills/geo-writer/references/seo-geo-insights.md +0 -269
  28. package/dist/skillpacks/geo/skills/social-execution-planning/SKILL.md +0 -53
  29. package/dist/skillpacks/geo/skills/social-execution-planning/agents/openai.yaml +0 -5
  30. package/dist/skillpacks/geo/skills/social-execution-planning/references/execution-contract.md +0 -68
  31. package/dist/skillpacks/geo/skills/social-execution-planning/references/platform-playbooks.md +0 -59
  32. package/dist/skillpacks/geo/skills/social-execution-planning/references/reddit-rules.md +0 -69
  33. package/dist/skillpacks/geo/skills/third-party-diagnosis/SKILL.md +0 -54
  34. package/dist/skillpacks/geo/skills/third-party-diagnosis/agents/openai.yaml +0 -4
  35. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/diagnosis-contract.md +0 -111
  36. package/dist/skillpacks/geo/skills/third-party-diagnosis/references/workflow.md +0 -174
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "GEO Pages Diagnosis"
3
- short_description: "Diagnose generated GEO pages and GEO page creation gaps."
4
- default_prompt: "Use $geo-pages-diagnosis to diagnose generated-page GEO opportunities for this workspace."
@@ -1,106 +0,0 @@
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
- ```
@@ -1,219 +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
- - 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.
@@ -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`
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "GEO Writer"
3
- short_description: "Create SEO/GEO content briefs from domain, language, and topic."
4
- default_prompt: "Use $geo-writer to create a page-generation brief from this domain, language, and topic."