@easysociable/cli 0.1.3 → 0.1.5

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 (58) hide show
  1. package/README.md +13 -10
  2. package/content-engine/scripts/starter.mjs +3 -1
  3. package/content-engine/scripts/workbench.mjs +13 -8
  4. package/content-engine/starter/CLAUDE.md +217 -128
  5. package/content-engine/starter/engine.json +3 -0
  6. package/content-engine/starter/needs/README.md +38 -0
  7. package/content-engine/starter/needs/_index.md +31 -0
  8. package/content-engine/starter/needs/_template.md +24 -0
  9. package/content-engine/starter/needs/entries/README.md +5 -0
  10. package/content-engine/starter/products/README.md +38 -0
  11. package/content-engine/starter/products/_index.md +24 -0
  12. package/content-engine/starter/products/_template.md +56 -0
  13. package/content-engine/starter/products/entries/P-001-easysociable.md +150 -0
  14. package/content-engine/starter/profiles/_index.md +6 -3
  15. package/content-engine/starter/profiles/default/README.md +4 -1
  16. package/content-engine/starter/profiles/default/boundaries.md +14 -0
  17. package/content-engine/starter/profiles/default/expression.md +18 -0
  18. package/content-engine/starter/profiles/default/lanes.md +12 -0
  19. package/content-engine/starter/profiles/default/stories.md +15 -0
  20. package/content-engine/starter/profiles/default/voice.md +14 -0
  21. package/content-engine/starter/recommendations/README.md +21 -0
  22. package/content-engine/starter/recommendations/_index.md +21 -0
  23. package/content-engine/starter/recommendations/_template.md +44 -0
  24. package/content-engine/starter/runs/_template/brief.md +1 -1
  25. package/content-engine/starter/runs/_template/pack.md +15 -7
  26. package/content-engine/starter/runs/_template/packet.md +6 -0
  27. package/content-engine/starter/swipe/_template.md +3 -1
  28. package/content-engine/starter/topics/README.md +4 -8
  29. package/content-engine/starter/topics/_index.md +12 -5
  30. package/content-engine/starter/topics/_template-item.md +64 -51
  31. package/content-engine/starter/topics/scoring.md +55 -4
  32. package/content-engine/workbench/build.py +315 -97
  33. package/content-engine/workbench/serve.py +0 -0
  34. package/content-engine/workbench/template.html +172 -94
  35. package/dist/easysociable.js +191 -133
  36. package/dist/easysociable.js.map +1 -1
  37. package/package.json +13 -14
  38. package/skills/ONBOARDING.md +14 -15
  39. package/skills/easysociable-content/SKILL.md +100 -19
  40. package/skills/easysociable-content/workflows/INTERVIEW.md +70 -0
  41. package/skills/easysociable-content/workflows/NEEDS.md +82 -0
  42. package/skills/easysociable-slideshow/SKILL.md +79 -45
  43. package/skills/easysociable-slideshow/references/ARC.md +44 -0
  44. package/skills/easysociable-slideshow/references/CONTENT_PACK.md +34 -6
  45. package/skills/easysociable-slideshow/workflows/CREATE_RUN.md +24 -5
  46. package/skills/easysociable-slideshow/workflows/OUT_OF_SCOPE.md +3 -0
  47. package/skills/easysociable-template/SKILL.md +13 -16
  48. package/skills/easysociable-template/references/CATALOG_METADATA.md +21 -18
  49. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  50. package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
  51. package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
  52. package/content-engine/starter/discovery/README.md +0 -18
  53. package/content-engine/starter/discovery/_index.md +0 -27
  54. package/content-engine/starter/discovery/_template.md +0 -41
  55. package/content-engine/starter/topics/WATCHLIST.md +0 -65
  56. package/content-engine/starter/topics/watchlists/README.md +0 -10
  57. package/content-engine/starter/topics/watchlists/_shared.md +0 -14
  58. package/content-engine/starter/topics/watchlists/default.md +0 -6
@@ -1,5 +1,36 @@
1
1
  # ContentPack v1
2
2
 
3
+ Page `role` is a **weak retrieval tag** (layout-ish), not sequence position.
4
+ `pageTemplateId` is the explicit published single-page template chosen by the
5
+ Agent. `slots` are public values only. Do not add a `deck_template_id`,
6
+ `bindingMap`, AST, ContentDocument, or product `arc` / `pageSequence`.
7
+
8
+ The Gateway validates each `role` against the closed enum and that slots exist.
9
+ It does not require Cover → Point → Steps → Recap → CTA.
10
+
11
+ This skill **does** require page 1 to be cover/hook class (`supportedRoles`
12
+ includes `cover` or `hook`) and forbids that class on later pages.
13
+
14
+ ## Example: cost → mechanism (TikTok)
15
+
16
+ Opening beat is cost; page 1 is still a hook-class template.
17
+
18
+ ```json
19
+ {
20
+ "schemaVersion": "content-pack.v1",
21
+ "platform": "tiktok",
22
+ "title": "Stop briefing a blank canvas",
23
+ "pages": [
24
+ { "role": "hook", "pageTemplateId": "tpl_hook_001", "slots": { "text_0": "You finish the copy. Then you start over.", "text_1": "The design file kept none of the argument." } },
25
+ { "role": "point", "pageTemplateId": "tpl_stack_001", "slots": { "text_0": "Roles, Brand, Layouts persist" } },
26
+ { "role": "steps", "pageTemplateId": "tpl_stair_001", "slots": { "text_0": "Use them in that order" } },
27
+ { "role": "cta", "pageTemplateId": "tpl_close_001", "slots": { "text_0": "Don't brief a blank canvas" } }
28
+ ]
29
+ }
30
+ ```
31
+
32
+ ## Example: hook → value → cta
33
+
3
34
  ```json
4
35
  {
5
36
  "schemaVersion": "content-pack.v1",
@@ -13,12 +44,9 @@
13
44
  }
14
45
  ```
15
46
 
16
- Page `role` is semantic and `pageTemplateId` is the explicit published
17
- single-page template chosen by the Agent. `slots` are public values only. Do not
18
- add a `deck_template_id`, `bindingMap`, AST or ContentDocument.
19
-
20
- The Gateway validates that each selected template supports the page role and
21
- belongs to the account-visible catalog. It never silently replaces a selection.
47
+ Pick templates by **platform + canvas + slotSummary + density**, not by matching
48
+ the beat name to a family named Cover / Point / Steps / Recap / CTA. Page 1
49
+ must still be cover/hook class.
22
50
 
23
51
  The renderer accepts any supported page count within the platform cap. A newly
24
52
  published Page Template can be selected in a new Run without creating a
@@ -1,7 +1,26 @@
1
1
  # Create Run
2
2
 
3
- 1. Build `content-pack.v1` from the agent's semantic outline.
4
- 2. Check platform hardMin/hardMax.
5
- 3. Call `create_run` or `run create` through Gateway.
6
- 4. Save `runId`, `studioUrl`, and `status=draft`.
7
- 5. Do not call a Deck API or create a carousel template.
3
+ 1. Write one arc line (`references/ARC.md`). Forbidden default:
4
+ Cover → Point → Steps → Recap → CTA.
5
+ 2. Build `content-pack.v1` from that argument. Page count follows the beats
6
+ (TikTok often 4–8), not the number of P0 families.
7
+ 3. Check platform hardMin/hardMax.
8
+ 4. List published Page Templates. `pages[0]` must be cover/hook class
9
+ (`supportedRoles` includes `cover` or `hook`). Do not use that class on
10
+ later pages. Remaining pages: platform + canvas + `slotSummary` + density.
11
+ `role` is a weak tag.
12
+ 5. If `contentSlug` already has a Run: update only when topology matches
13
+ (same page count and `pageTemplateId`s). Otherwise create a new Run.
14
+ 6. **Before** `create_run` / `slideshows create` (every create, not only the
15
+ first Run): check the knowledge hard gate — Identity Role / What I build /
16
+ Point of view have no `(fill)` and are non-empty; `boundaries.md` exists
17
+ with Not covering and Never claim non-empty; if `needs/` exists, ≥3 `N-`
18
+ rows, else skip. Read the files or run
19
+ `easysociable engine validate --run <run-dir> --require-knowledge`.
20
+ Fail → hand back to **easysociable-content** / refuse create; list missing
21
+ files. User must say **强制继续** / **force continue** to call Gateway.
22
+ No new Gateway or MCP params.
23
+ 7. Call `create_run` / `slideshows create` through Gateway.
24
+ 8. Save `runId`, `studioUrl`, and `status=draft`.
25
+ 9. Do not call a Deck API, create a carousel template, or send a product
26
+ `pageSequence` / `arc` field.
@@ -1,6 +1,9 @@
1
1
  # Out of scope
2
2
 
3
3
  - DeckTemplate creation, `list_decks`, `CREATE_DECK`, or `BIND_P0_DECKS`.
4
+ - Product-level `arc` / Deck `pageSequence` SKUs (ADR-0026). Structure stays in the Content Pack.
5
+ - Defaulting every Run to Cover → Point → Steps → Recap → CTA.
6
+ - Cover/hook class templates on page 2+ (they belong on `pages[0]` only).
4
7
  - ContentDocument as a render input (ADR-0021).
5
8
  - Client-side RenderPlan or AST compilation.
6
9
  - Full cross-platform Page Template coverage and ad-placement variants.
@@ -2,18 +2,15 @@
2
2
  name: easysociable-template
3
3
  description: >
4
4
  Create single-page social image templates for EasySociable via the unified
5
- Template MCP or `easysociable` CLI, and fill published template slots to Hosted Render
6
- (get_template → slots → create_render_job). Default create path is a Layout Family:
5
+ Template MCP or `easysociable` CLI. Default create path is a Layout Family:
7
6
  one master canvas plus derived multi-platform variants (e.g. XHS 3:4, IG/Threads 4:5,
8
7
  TikTok 9:16, LinkedIn 1:1) with hand-tuned layouts per preset. Use when the user wants
9
- to author a page template from a reference image or text brief (including “做多平台
10
- 模板”), write a shared visual design philosophy, explore 2–3 professional layout
11
- concepts, plan or generate visual assets, co-create Theme/preview tokens with brand-hex
12
- palette generation, choose a Surface, pull icons via Template Gateway
13
- search_icons/get_icon, run screenshot-based visual QA, attach catalog metadata, open
14
- Authoring Studio, publish, or render by filling public slots. Do not use for multi-slide
15
- slideshow composition, ContentDocument as render input, local content library, or
16
- carousel packs.
8
+ to author a page template from a reference image or text brief, write a shared visual
9
+ design philosophy, explore layout concepts, co-create Theme/preview tokens, pull icons
10
+ via search_icons/get_icon, open Authoring Studio, or publish. Do not use for
11
+ fill-slots hosted PNG jobs (`create_render_job` is retired), multi-slide slideshow
12
+ composition, ContentDocument as render input, or carousel packs. Customer PNG packs
13
+ come from Slideshow Studio Download.
17
14
  ---
18
15
 
19
16
  # EasySociable Template Skill
@@ -22,12 +19,12 @@ The public entry points are the unified `easysociable` CLI and one unified MCP
22
19
  server. Do not install or invoke `easysociable-template`, `easysociable-slideshow`,
23
20
  `easysociable-content`, or a separate Content/Slideshow MCP in V1.
24
21
 
25
- **This skill owns two single-page paths:**
22
+ **This skill owns template authoring:**
26
23
 
27
24
  1. **Author** templates as a **Layout Family** (master + multi-platform variants) → Studio + Publish (`workflows/MULTI_PLATFORM_FAMILY.md`).
28
- 2. **Fill slots → Hosted Render** for a published PageTemplate (`workflows/FILL_AND_RENDER.md`).
25
+ 2. Fill-slots Hosted Render (`create_render_job`) is **retired** as a paid delivery path. Customer PNG packs come from Slideshow Studio Download.
29
26
 
30
- It is a template factory **and** the Agent surface for single-page fill-slots rendering (ADR-0021). It is **not** a multi-slide slideshow compositor. Single-page ≠ single-platform.
27
+ It is a template factory. It is **not** a multi-slide slideshow compositor and it is **not** a PNG API.
31
28
 
32
29
  Every published page must carry **P0 catalog metadata** so Agents can filter and fill templates (`references/CATALOG_METADATA.md`).
33
30
 
@@ -51,7 +48,7 @@ Out of scope (hand off):
51
48
  9. Layout model is **absolute positioning** on a **flat canvas tree** (see prior authoring rules / `AUTHORING_SOURCE.md`).
52
49
  10. **Runtime layout CSS:** put exact geometry in JSX inline `style={{...}}`. Never depend on Tailwind arbitrary-value classes for geometry.
53
50
  11. Run `scripts/validate-authoring-source.mjs` before every create/update.
54
- 12. `supportedRoles` uses closed **pageRoles**; `platforms` is a multi-select array.
51
+ 12. `supportedRoles` uses closed **pageRoles** as a **weak retrieval tag**, not sequence position. Family `name` describes **layout** (Poster / Stack / Count / Stair / Close), not a narrative beat. `platforms` is a multi-select array.
55
52
  13. Canvas sizes must follow `references/PLATFORM_SPECS.md`.
56
53
  14. **Text-only V2.1 authoring:** `DESIGN_BRIEF` → Philosophy → Concepts → assets/surface → author → Visual QA.
57
54
  15. **Visual QA** before Studio handoff when authoring. For `image_reference`, QA **must** side-by-side compare Studio canvas to the reference (`VISUAL_QA.md` § Reference compare).
@@ -59,8 +56,8 @@ Out of scope (hand off):
59
56
  16b. **Reference image → template (hard):** follow `workflows/AUTHORING_FROM_IMAGE.md` as SoT. **Read the reference with a vision tool**, write `referenceSpec` + `referenceImageInventory` into `design-plan.json`, and place pictorial regions as **`image` slots** (empty frames matching the boxes). `validate-design-v2.mjs` rejects `image_reference` plans missing those fields or using `css_svg` stand-ins for inventoried pictures. Do not mood-board a different layout.
60
57
  17. Preserve `draftId`, `templateId`, `themeId`, `jobId`, `authoringStudioUrl`, and `previewUrl` across steps.
61
58
  18. **Theme / Surface confirmation gates** unchanged for authoring (see `PALETTE_REVIEW`, `SURFACE_REVIEW`).
62
- 19. **Fill-slots render (primary consumption path):** `get_template` → fill `slots[]` → `create_render_job({ templateId, slots, output })` → poll Job/Manifest. Image slots always use an account-owned `imageId` from the existing Gateway → R2 + Directus `Image` flow. Never pass a third-party URL, local path, transient `renderAssetId`, ContentDocument or `contentDocumentHash`. See `workflows/FILL_AND_RENDER.md`.
63
- 20. **Hosted Capture first:** default delivery is Hosted Artifact. Local capture only when the error includes `fallback.capture` — follow `workflows/FILL_AND_RENDER.md` §5 (CLI `capture` or same-URL Playwright). Do not use page html-to-image buttons as the Agent primary path.
59
+ 19. **Consumption is Slideshow Studio Download**, not fill-slots Hosted Render. `create_render_job` / CLI `renders create` return `HEADLESS_RENDER_DISABLED`. See `workflows/FILL_AND_RENDER.md`.
60
+ 20. **Do not** treat Hosted Capture or local html-to-image as the Agent primary PNG path.
64
61
  21. **Icons (hard rule — no shortcuts):**
65
62
  - Any **recognizable icon** (arrows, chevrons, checkmarks, social glyphs, UI symbols, “next page” cues, etc.) **MUST** use Gateway Icon Catalog:
66
63
  `search_icons` / CLI `icons search` → show ≤8 candidates → **user confirm** (or explicit “你定 / 用第 N 个”) → `get_icon` / CLI `icons get --idempotency-key …` → embed returned **`canonicalSvg`** and record **`iconAssetId`** / `iconId` on the decoration node.
@@ -5,9 +5,10 @@ Private AST/bindings stay server-side; this document is the **public selection c
5
5
 
6
6
  ## Design choices (locked)
7
7
 
8
- 1. **One closed `pageRoles` set** (stored as `supportedRoles`) — narrative beat + layout kind in one enum. Do not maintain a second parallel taxonomy.
8
+ 1. **One closed `pageRoles` set** (stored as `supportedRoles`) — a **retrieval tag for layout kind**, not page position and not a story recipe. `cover` means poster-like slots, not “must be page 1”. Do not add a parallel `arc` / `pageSequence` taxonomy (ADR-0026).
9
9
  2. **`platforms` is a multi-select array**. Include `generic` when the page fits any platform at that aspect.
10
10
  3. **P0 fields are required to Publish.** P1 should be filled when known; P2 optional.
11
+ 4. **Family `name` describes layout**, not a narrative beat. Prefer Poster / Stack / Count / Stair / Close (plus platform). Do not name families Cover / Point / Steps / Recap / CTA — choosers will glue those five names into one default pack.
11
12
 
12
13
  Max **1–2** `supportedRoles` per page (primary + optional secondary).
13
14
 
@@ -33,25 +34,25 @@ Always also store exact `canvas: { width, height }`. Use `16:9` for X **1200×67
33
34
 
34
35
  ### Page roles (`supportedRoles` / pageRoles) — pick 1–2
35
36
 
36
- | Role | When to use |
37
+ | Role | Layout kind (not sequence position) |
37
38
  |---|---|
38
- | `cover` | Cover / first-frame poster |
39
- | `hook` | Scroll-stop hook (often with cover) |
40
- | `setup` | Setup / problem framing |
41
- | `context` | Background / context |
42
- | `value` | Single takeaway / value page |
39
+ | `cover` | Poster / first-frame-capable layout — may open a run, need not |
40
+ | `hook` | Scroll-stop / short-copy layout |
41
+ | `setup` | Problem-framing layout |
42
+ | `context` | Background / context layout |
43
+ | `value` | Single takeaway layout |
43
44
  | `point` | One sharp point (lighter than value) |
44
45
  | `checklist` | Fixed N text lines (no list binding type) |
45
- | `proof` | Proof / credibility |
46
+ | `proof` | Proof / credibility layout |
46
47
  | `evidence` | Evidence artifacts (data, case) |
47
- | `compare` | Before/after or A/B compare |
48
+ | `compare` | Before/after or A/B layout — valid as page 1 |
48
49
  | `screenshot` | App/web UI screenshot frame |
49
- | `metric` | Big number / KPI / milestone |
50
- | `quote` | Pull quote / testimonial |
51
- | `steps` | Fixed-step howto |
52
- | `cta` | Call to action |
53
- | `follow` | Follow / profile CTA |
54
- | `recap` | Summary / closing recap |
50
+ | `metric` | Big number / KPI — valid as page 1 |
51
+ | `quote` | Pull quote / testimonial — valid as page 1 |
52
+ | `steps` | Fixed-step howto layout |
53
+ | `cta` | Call to action layout |
54
+ | `follow` | Follow / profile CTA layout |
55
+ | `recap` | Summary / closing layout |
55
56
 
56
57
  Legacy-compatible: `cover`, `setup`, `value`, `proof`, `cta` remain valid.
57
58
 
@@ -98,7 +99,7 @@ hero | screenshot | avatar | product
98
99
 
99
100
  | Field | Type | Notes |
100
101
  |---|---|---|
101
- | `name` | string | Human title |
102
+ | `name` | string | Human title — **layout**, not beat (e.g. `P0 Poster TikTok`, not `P0 Cover TikTok`) |
102
103
  | `shortDescription` | string | One sentence for chooser UI |
103
104
  | `platforms` | `Platform[]` | Multi-select; use `generic` when truly cross-platform |
104
105
  | `canvasPreset` | preset enum | Plus exact `canvas` pixels |
@@ -189,7 +190,7 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
189
190
 
190
191
  ```json
191
192
  {
192
- "name": "XHS metric milestone 3:4",
193
+ "name": "XHS Count 3:4",
193
194
  "shortDescription": "大数字涨粉庆祝页,可选头像",
194
195
  "platforms": ["xiaohongshu", "generic"],
195
196
  "canvasPreset": "3:4",
@@ -207,7 +208,7 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
207
208
  "visualStyle": "swiss",
208
209
  "bestFor": ["涨粉节点", "数据庆祝封面"],
209
210
  "notFor": ["长清单干货", "多步教程"],
210
- "selectionHints": "Prefer when slide.role is metric or cover and a single KPI dominates.",
211
+ "selectionHints": "Prefer when slotSummary has one number + short text (KPI / cost hook), any page index.",
211
212
  "locale": "zh-CN"
212
213
  }
213
214
  ```
@@ -219,3 +220,5 @@ Agent must produce a `selection-metadata.json` (or equivalent fields on the draf
219
220
  - Checklist without `fixedItemCount`
220
221
  - `requiresImage: true` but `imageRoles` empty
221
222
  - Platforms empty or inventing values outside the enum
223
+ - Naming a family Cover / Point / Steps / Recap / CTA so choosers assemble that sequence
224
+ - Treating `supportedRoles` as “this page must appear at this beat in every Run”
@@ -1,86 +1,7 @@
1
- # Fill slots and Hosted Render (published template)
1
+ # Fill slots and Hosted Render — RETIRED
2
2
 
3
- Primary **Agent use** of a published single-page template: read the public slot table, fill values, submit a Hosted Render Job, poll for Artifact / Manifest.
3
+ **Retired as a paid delivery path (2026-09-04).** PNG packs come from Slideshow **Studio Download** (browser ZIP). Gateway `POST /v1/renders`, CLI `renders create|export`, and MCP `create_render_job` return `HEADLESS_RENDER_DISABLED`.
4
4
 
5
- This path belongs to **Template Skill** (ADR-0021 / AC-25~26). Do **not** hand off to Content Skill for single-page fill-slots out图.
5
+ Do not invoke fill-slots render for customer output. Author templates with this skill; consume carousels with Slideshow Skill → Studio → Download.
6
6
 
7
- ## Preconditions
8
-
9
- ```bash
10
- easysociable auth status --json
11
- ```
12
-
13
- Prefer Template MCP tools when available; CLI is the fallback.
14
-
15
- ## Steps
16
-
17
- ### 1. Get template + public slots
18
-
19
- **MCP:** `get_template({ templateId })`
20
- **CLI:** `easysociable templates get --id <id> --json`
21
-
22
- Response MUST include `slots[]` with `key`, `type`, `required`, optional `maxCharacters` / `overflow` / `aiHint` / `label`.
23
- MUST NOT include AST, Binding Map, or RenderPlan.
24
-
25
- ### 2. Fill slots
26
-
27
- | Slot type | Agent action |
28
- |---|---|
29
- | `text` / `number` | Generate from user brief; respect `maxCharacters` / required |
30
- | `image` | Ask user: upload or choose an existing account image. After confirmation, use `import_template_image` / the unified image import flow so the bytes are stored through Gateway → R2 and the metadata is recorded in the existing Directus `Image` collection; put the returned **`imageId`** in the slot. Never pass temporary Unsplash/Pexels/Pinterest URLs, local paths or transient asset IDs as authority. |
31
-
32
- Omit optional empty slots (`null` / `''`) rather than inventing filler.
33
-
34
- All V1 image uploads use the account image import flow. There is no separate
35
- transient render-asset command.
36
-
37
- ### 3. Create Hosted Render Job
38
-
39
- **MCP:** `create_render_job({ templateId, slots, outputFormats, idempotencyKey? })`
40
- **CLI:**
41
-
42
- ```bash
43
- easysociable renders create \
44
- --template-id <id> \
45
- --slots '{"title":"Hello","caption":"World"}' \
46
- --format png \
47
- --idempotency-key fill_1 \
48
- --json
49
- ```
50
-
51
- **Forbidden inputs:** `ContentDocument`, `contentDocumentHash`, client `RenderPlan`, AST, Binding Map.
52
-
53
- ### 4. Poll Job / Manifest
54
-
55
- **MCP:** `get_render_job({ jobId })` → when completed, `get_render_manifest` if needed
56
- **CLI:** `easysociable renders wait --id <id> --json`
57
-
58
- Success: signed Artifact URL(s) on the public Manifest.
59
- Job may also return `previewUrl` + `capture` (signed Studio-parity page). Deliver the **Hosted Artifact**, not a local screenshot of that preview URL.
60
-
61
- ### 5. Hosted Capture failure
62
-
63
- V1 does not expose a second local capture command. If Hosted Capture fails,
64
- surface the Gateway error and retry only when it is marked retryable; do not
65
- invent a browser URL, selector or viewport and do not treat an Authoring Studio
66
- screenshot as a billable final Artifact.
67
-
68
- #### Error-code table
69
-
70
- | Code / signal | Local capture? | Agent action |
71
- |---|---|---|
72
- | Job `completed` + Manifest Artifact | No | Deliver signed Artifact URL(s) |
73
- | Retryable worker/queue/5xx error | No | Retry Hosted with the same idempotency key |
74
- | Rate limit | No | Respect retry-after/backoff and retry once if allowed |
75
- | `VALIDATION_ERROR` / missing required slots | **No** | Fix slots; no fallback expected |
76
- | Auth / entitlement / tier denied | **No** | Fix credentials/plan; no fallback |
77
- Failed jobs without a retryable error are surfaced to the user; no freestyle
78
- browser screenshot is accepted as final output.
79
-
80
- ## Anti-patterns
81
-
82
- - Building or submitting a local RenderPlan / AST / Binding Map
83
- - Using ContentDocument export as a render prerequisite
84
- - Treating Studio html-to-image as Hosted delivery or as the default on success
85
- - Local capture when Hosted succeeded or when `fallback.capture` is absent
86
- - Calling Content MCP/CLI for this single-page fill-slots flow
7
+ Public `slots[]` on a published template remain a catalog contract. They are not a PNG API.
@@ -10,6 +10,7 @@ If the user asks for any of the following, **do not** execute them under this sk
10
10
  | Pick Theme as slideshow “Look” for a whole Run | **easysociable-slideshow** + Profile Theme |
11
11
  | Local Obsidian content authoring | Content Skill |
12
12
  | UGC/publication/social posting | Deferred in V1 |
13
- | Submit `contentDocumentHash` / ContentDocument to Template render | **Forbidden** — use fill-slots (`FILL_AND_RENDER.md`) |
13
+ | Submit `contentDocumentHash` / ContentDocument to Template render | **Forbidden** |
14
+ | `create_render_job` / CLI `renders create` for customer PNG | **Forbidden** — Studio Download on a Slideshow Run |
14
15
 
15
- **In scope:** single-page template authoring/publish **and** fill-slots Hosted Render of one published PageTemplate (`get_template` → slots → `create_render_job`).
16
+ **In scope:** single-page template authoring/publish. Customer PNG packs are Slideshow Studio Download.
@@ -1,18 +0,0 @@
1
- # Discovery
2
-
3
- Discovery is the intermediate layer between watchlist signals and Topics.
4
-
5
- ```text
6
- watchlist → discovery → (explicit promote) → topic → brief
7
- ```
8
-
9
- It makes the source understandable before deciding whether the idea belongs to us.
10
-
11
- - `Source Digest` is a short natural-language note: what happened, the author's argument, support, native language, and limits.
12
- - `Source limits` records what the source does not establish.
13
- - `Decision` stores only workflow status and next action.
14
- - A source with high engagement can still remain `saved` or `rejected`.
15
-
16
- Do not add our audience, product, thesis, ownership, or candidate Topics to a Discovery.
17
- Do not use 5C as the default Discovery reading format.
18
- Discovery does not generate publish-ready copy.
@@ -1,27 +0,0 @@
1
- # Discovery index
2
-
3
- One row = one analyzed external signal from a watchlist scan. Discovery is not a topic queue.
4
-
5
- Newest on top.
6
-
7
- | id | date | profile | platform | source_handle | source_url | source_claim | source_role | status | next_action | topic_ids | file |
8
- |----|------|---------|----------|---------------|------------|--------------|-------------|--------|-------------|-----------|------|
9
- | -- | ---- | ------- | -------- | ------------- | ---------- | ------------ | ----------- | ------ | ----------- | --------- | ---- |
10
-
11
- ## Status values
12
-
13
- | status | Meaning |
14
- |--------|---------|
15
- | `unread` | Signal captured; digest not read |
16
- | `read` | Source Digest completed |
17
- | `saved` | Useful reference; no Topic decision yet |
18
- | `promoted` | User explicitly promoted it to Topic |
19
- | `rejected` | Not relevant, provable, or ownable |
20
-
21
- ## Rules
22
-
23
- - Watchlist heat is source context, not our evidence.
24
- - New Discovery records contain only Source Digest, source limits, and workflow state.
25
- - Do not create a Topic during watchlist scanning; Topic creation requires explicit promotion.
26
- - Do not store our audience, product, ownership, or candidate opportunities inside Discovery.
27
- - 5C belongs to Topic evaluation and is never the default Discovery reading surface.
@@ -1,41 +0,0 @@
1
- ---
2
- id: D-YYYYMMDD-XX
3
- date: YYYY-MM-DD
4
- status: read
5
- profile: default
6
- platform: x
7
- source_role: demand | ally | foil | mechanism
8
- ---
9
-
10
- # Discovery
11
-
12
- One sentence describing the external signal in the source's terms. Do not turn it into our topic here.
13
-
14
- ## Source
15
-
16
- - **handle:**
17
- - **url:**
18
- - **captured_at:**
19
- - **engagement snapshot:** likes / replies / bookmarks / views @ time
20
- - **why on watchlist:**
21
-
22
- ## Source Digest
23
-
24
- ### In one sentence
25
-
26
- ### What happened
27
-
28
- ### What the author is arguing
29
-
30
- ### How the author supports it
31
-
32
- ### The author's own language
33
-
34
- ### Source limits
35
-
36
- What the source does not establish. Keep this short.
37
-
38
- ## Decision
39
-
40
- - **status:** unread | read | saved | promoted | rejected
41
- - **next_action:** none | revisit | promote_to_topic
@@ -1,65 +0,0 @@
1
- # Watchlist (router)
2
-
3
- **Scheme B:** one radar table **per profile**, not one global table.
4
-
5
- No X Private List required. Agent updates files under `topics/watchlists/`; user works in chat only.
6
-
7
- ## File map
8
-
9
- | Path | Role |
10
- |------|------|
11
- | `topics/WATCHLIST.md` | **This file** — routing, columns, scan rules |
12
- | `topics/watchlists/_shared.md` | Shared rows (`*`) — merge into every scan |
13
- | `topics/watchlists/<profile_id>.md` | Profile-scoped radar (must match `profiles/_index` id) |
14
- | `topics/watchlists/README.md` | Short folder note |
15
-
16
- ### Profiles with a watchlist file today
17
-
18
- | profile_id | file |
19
- |------------|------|
20
- | default | `watchlists/default.md` |
21
-
22
- New profile → create `watchlists/<id>.md` (copy empty table header from `_shared.md` or an existing file).
23
-
24
- ## Columns (in each table file)
25
-
26
- | Column | Meaning |
27
- |--------|---------|
28
- | `#` | Id within that file (`#1…` profile-local; `#S-01…` in `_shared`) |
29
- | **`platform`** | Network of this handle + where Agent scans: `x` \| `tiktok` \| `linkedin` \| `ig` \| `youtube` \| `xhs` \| `threads` \| … |
30
- | `handle` | Platform-native id without `@` |
31
- | `niche_tag` | Topic/product tag — not a substitute for `platform` |
32
- | `why_on_list` | One line |
33
- | `weight` | 0.5–1.5 |
34
- | `status` | active / paused / removed |
35
-
36
- **No `profiles` column in the table** — the **filename** is the profile scope.
37
- Shared across profiles → put the row in `_shared.md` (same as `*`).
38
- Same handle needed by two profiles only (not all) → **copy the row into both files** (or later a small group file; avoid until needed).
39
-
40
- ## Resolve profile for scan / add (required)
41
-
42
- 1. User names **profile_id** → use it.
43
- 2. User names **account** handle → resolve via `accounts/_index.md` → `profile_id`.
44
- 3. User names **neither** → **do not default**. List active profiles from `profiles/_index.md` and **ask which profile** (or account).
45
- 4. Load rows = **`watchlists/_shared.md` (active)** ∪ **`watchlists/<profile_id>.md` (active)**.
46
- 5. Filter **`platform`**: user-specified, else default **`x`**; `全部平台` = no platform filter.
47
- 6. Create **Discovery** records first; do not create Topics during the scan. Cap **5** new **`produce`** topics only when the user later promotes. Sort watchlist rows by weight (≥1.3 first).
48
- 7. Wrong network for a row → never (e.g. no X tools on `platform=tiktok`).
49
-
50
- ## Maintenance
51
-
52
- | User says | Agent does |
53
- |-----------|------------|
54
- | 把 @foo 加进 watchlist | Resolve/ask **profile** + **platform**; append row to that profile file (or `_shared` if user says 全 profile / shared) |
55
- | 去掉 #n / @foo | Edit the correct file; if ambiguous, ask |
56
- | 新 profile 建雷达 | Create `watchlists/<id>.md` |
57
-
58
- ## Scan rules (also CLAUDE § Discovery)
59
-
60
- - Create one Discovery per meaningful signal; discard noise before analysis.
61
- - Watchlist scan creates **Discovery** records first; it does not create Topics directly.
62
- - Write a Source Digest + source limits only. Do not add our audience, product, ownership, or candidate Topics.
63
- - Keep source engagement as context on the Discovery file; copy `src_*` to `topics/_index.md` only after promotion.
64
- - Report `unread / read / saved / promoted / rejected` counts after the batch.
65
-
@@ -1,10 +0,0 @@
1
- # topics/watchlists/
2
-
3
- **One file per profile** + optional shared table.
4
-
5
- | Path | Scope |
6
- |------|--------|
7
- | `_shared.md` | All profiles (`*`) — merged on every scan |
8
- | `<profile_id>.md` | Only that profile (e.g. `easysociable-builder.md`) |
9
-
10
- Registry / scan rules: `../WATCHLIST.md`.
@@ -1,14 +0,0 @@
1
- # Watchlist — shared (`*`)
2
-
3
- Rows here apply to **every** profile when scanning (merge with `topics/watchlists/<profile_id>.md`).
4
-
5
- Use only for handles that are truly cross-positioning. Prefer putting niche-specific radars in the profile file.
6
-
7
- | # | platform | handle | niche_tag | why_on_list | weight | status |
8
- |---|----------|--------|-----------|-------------|--------|--------|
9
-
10
- *(empty — add rows only when a handle should appear for all profiles)*
11
-
12
- ## Id note
13
-
14
- Use `#S-01`, `#S-02`, … so shared ids do not collide with profile-local `#1…`.
@@ -1,6 +0,0 @@
1
- # Watchlist — profile `default`
2
-
3
- Profile-scoped radar. Merge with `topics/watchlists/_shared.md` on every scan.
4
-
5
- | # | platform | handle | niche_tag | why_on_list | weight | status |
6
- |---|----------|--------|-----------|-------------|--------|--------|