@easysociable/cli 0.1.3 → 0.1.4

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 (59) 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/__pycache__/build.cpython-310.pyc +0 -0
  33. package/content-engine/workbench/build.py +306 -97
  34. package/content-engine/workbench/serve.py +0 -0
  35. package/content-engine/workbench/template.html +173 -27
  36. package/dist/easysociable.js +191 -133
  37. package/dist/easysociable.js.map +1 -1
  38. package/package.json +13 -14
  39. package/skills/ONBOARDING.md +14 -15
  40. package/skills/easysociable-content/SKILL.md +100 -19
  41. package/skills/easysociable-content/workflows/INTERVIEW.md +70 -0
  42. package/skills/easysociable-content/workflows/NEEDS.md +82 -0
  43. package/skills/easysociable-slideshow/SKILL.md +79 -45
  44. package/skills/easysociable-slideshow/references/ARC.md +44 -0
  45. package/skills/easysociable-slideshow/references/CONTENT_PACK.md +34 -6
  46. package/skills/easysociable-slideshow/workflows/CREATE_RUN.md +24 -5
  47. package/skills/easysociable-slideshow/workflows/OUT_OF_SCOPE.md +3 -0
  48. package/skills/easysociable-template/SKILL.md +13 -16
  49. package/skills/easysociable-template/references/CATALOG_METADATA.md +21 -18
  50. package/skills/easysociable-template/scripts/generate-theme-from-hex.mjs +0 -0
  51. package/skills/easysociable-template/workflows/FILL_AND_RENDER.md +4 -83
  52. package/skills/easysociable-template/workflows/OUT_OF_SCOPE.md +3 -2
  53. package/content-engine/starter/discovery/README.md +0 -18
  54. package/content-engine/starter/discovery/_index.md +0 -27
  55. package/content-engine/starter/discovery/_template.md +0 -41
  56. package/content-engine/starter/topics/WATCHLIST.md +0 -65
  57. package/content-engine/starter/topics/watchlists/README.md +0 -10
  58. package/content-engine/starter/topics/watchlists/_shared.md +0 -14
  59. package/content-engine/starter/topics/watchlists/default.md +0 -6
@@ -6,6 +6,9 @@
6
6
  "runs": "runs",
7
7
  "exports": "exports",
8
8
  "topics": "topics",
9
+ "needs": "needs",
10
+ "products": "products",
11
+ "recommendations": "recommendations",
9
12
  "swipe": "swipe",
10
13
  "profiles": "profiles",
11
14
  "inbox": "inbox",
@@ -0,0 +1,38 @@
1
+ # needs/
2
+
3
+ First-class **user-needs library**. Not an inbox type. Inbox stays structure / link / insight.
4
+
5
+ | Path | Role |
6
+ |------|------|
7
+ | `_index.md` | Quote registry (source of truth for list/status) |
8
+ | `entries/N-YYYYMMDD-XX.md` | One need: verbatim quote + sightings + optional gloss |
9
+ | `_template.md` | Entry shape |
10
+
11
+ ## Status machine (only these words)
12
+
13
+ ```text
14
+ captured → just written, or still captured after a synonym merge (frequency ≥ 1)
15
+ promoted → and only when a T- exists whose need_ids contain this N-; topic_ids lists that T-
16
+ retired → user discarded
17
+ ```
18
+
19
+ Do **not** use `clustered`. Merge is not a status.
20
+
21
+ ## Do not
22
+
23
+ - Invent quotes or FAQ template sentences
24
+ - Treat a watchlist hook / viral title as a need
25
+ - Put `N-` into a topic `capture_id` (`capture_id` is inbox `C-…` only)
26
+ - Hosted clustering
27
+
28
+ ## Quote shape (not product copy, not index rows)
29
+
30
+ These lines are the **shape** of a creator's audience talking. They are **not** EasySociable features and must **not** be seeded as rows:
31
+
32
+ - 我不知道自己适合做什么 AI 自媒体方向
33
+ - 我每天用 AI 写稿,还是断更
34
+ - 我账号有流量,但为什么没人咨询
35
+ - 我想接广告,要多少粉丝才可以
36
+ - 我不会出镜,能不能先做图文
37
+
38
+ When a quote is reused as published copy, redact names / DMs / student details.
@@ -0,0 +1,31 @@
1
+ # Needs index
2
+
3
+ Registry of **audience quotes**. Source of truth for need lifecycle.
4
+
5
+ Newest rows on top. **Zero starter rows** — do not invent quotes.
6
+
7
+ | id | date | profile | source_type | quote | speaker | frequency | status | topic_ids | file |
8
+ |----|------|---------|-------------|-------|---------|-----------|--------|-----------|------|
9
+
10
+ ## Columns
11
+
12
+ | Column | Meaning |
13
+ |--------|---------|
14
+ | `id` | `N-YYYYMMDD-XX`, increment per day (same shape as `C-` / `D-` / `T-`) |
15
+ | `date` | First sighting date |
16
+ | `profile` | Default current `profile_id` |
17
+ | `source_type` | `comment` \| `dm` \| `consult` \| `faq` \| `student` \| `other` |
18
+ | `quote` | **Verbatim.** Never put a gloss in this cell |
19
+ | `speaker` | Optional; anonymous → `anon`. Do not invent names |
20
+ | `frequency` | Integer, default 1. Same-meaning merge: `+1` on this row, append a sighting — do **not** create a second row |
21
+ | `status` | `captured` \| `promoted` \| `retired` (**never** `clustered`) |
22
+ | `topic_ids` | Cited `T-…`, comma-separated. Non-empty **iff** status=`promoted` |
23
+ | `file` | `needs/entries/N-….md` |
24
+
25
+ ## Agent rules
26
+
27
+ - Every need: new row + new `entries/<id>.md`
28
+ - Merge is not a new status. After a user-approved synonym merge, keep `captured`, bump `frequency`, append sighting
29
+ - Do not mark `promoted` without a `T-` whose `need_ids` contain this `N-`
30
+ - Scan-for-topics input set: `status=captured` (`topic_ids` empty). Max 5 `produce`
31
+ - Quotes may include DMs / student info. Keep local. Redact PII if a quote is used in published copy
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: N-YYYYMMDD-XX
3
+ date: YYYY-MM-DD
4
+ profile: default
5
+ source_type: comment | dm | consult | faq | student | other
6
+ frequency: 1
7
+ status: captured
8
+ ---
9
+
10
+ # N-… — five-character-or-less need label (Agent-coined, not the quote)
11
+
12
+ ## Quote
13
+ > (verbatim, unedited)
14
+
15
+ ## Sightings
16
+ | date | source_type | where |
17
+ |------|-------------|-------|
18
+ | YYYY-MM-DD | comment | url or `pasted` |
19
+
20
+ ## Our gloss(optional, separate from the quote)
21
+ One line: what they are hiring us to solve.
22
+
23
+ ## Status
24
+ captured
@@ -0,0 +1,5 @@
1
+ # needs/entries/
2
+
3
+ One file per need (`N-YYYYMMDD-XX.md`). Registry: `../_index.md`.
4
+
5
+ Do not pre-seed FAQ rows.
@@ -0,0 +1,38 @@
1
+ # products/
2
+
3
+ First-class **product facts library**. Products describe what the creator
4
+ offers; they are not audience needs, topics, or published claims.
5
+
6
+ | Path | Role |
7
+ |------|------|
8
+ | `_index.md` | Product registry and lifecycle |
9
+ | `entries/P-*.md` | Product facts, boundaries, pricing, proof and claims |
10
+ | `_template.md` | Product entry shape |
11
+
12
+ ## Relationship to the content engine
13
+
14
+ ```text
15
+ Needs (demand evidence) + Profile (identity)
16
+ → Topic (editorial judgment)
17
+ → optional Product fit (offer context)
18
+ → Run
19
+ ```
20
+
21
+ - A `Need` records what an audience member actually said.
22
+ - A `Product` records what is currently offered and what it does not promise.
23
+ - A `Topic` decides whether something is worth saying. It may cite zero, one, or
24
+ several products.
25
+ - Product fit never makes a Topic `ready` by itself, and a product description
26
+ never becomes a Need quote.
27
+
28
+ ## Rules
29
+
30
+ - Keep product facts current. Prices and entitlements must include an
31
+ `effective_from` date and a source of truth.
32
+ - Do not invent customers, outcomes, metrics, testimonials or proof.
33
+ - Mark a product `retired` instead of silently deleting a product used by a
34
+ Topic or Run.
35
+ - Use `product_fit: none` for useful education that does not need a product
36
+ connection. Do not force a CTA into every Topic.
37
+ - Product claims here describe the offer. The `wiki/claims/` catalog tracks
38
+ propositions tested through published content; they are different objects.
@@ -0,0 +1,24 @@
1
+ # Products index
2
+
3
+ Newest rows on top. This is the registry; product facts live in the entry
4
+ file.
5
+
6
+ | id | name | status | audience | price | effective_from | file |
7
+ |----|------|--------|----------|-------|----------------|------|
8
+ | P-001 | EasySociable | active | creators and teams producing branded multi-page social visuals | see entry | 2026-09-04 | products/entries/P-001-easysociable.md |
9
+
10
+ ## Status values
11
+
12
+ | status | Meaning |
13
+ |--------|---------|
14
+ | `draft` | Being defined; do not use for product claims |
15
+ | `active` | Current offer; may be cited by Topics and Runs |
16
+ | `retired` | No longer offered; retained for historical references |
17
+
18
+ ## Agent rules
19
+
20
+ - Read the product entry before making a product claim.
21
+ - `price` is a lookup hint only; use the dated entry for exact pricing and
22
+ entitlements.
23
+ - A Topic may cite `product_ids: none` even when the account has active
24
+ products.
@@ -0,0 +1,56 @@
1
+ ---
2
+ id: P-YYYYMMDD-XX
3
+ name:
4
+ status: draft
5
+ effective_from: YYYY-MM-DD
6
+ source_of_truth:
7
+ ---
8
+
9
+ # Product name
10
+
11
+ ## Product promise
12
+
13
+ One sentence describing the customer change. Do not promise an outcome the
14
+ product cannot control.
15
+
16
+ ## What it is
17
+
18
+ ## Best for
19
+
20
+ ## Not for
21
+
22
+ ## Problem
23
+
24
+ ## Mechanism
25
+
26
+ How the product addresses the problem.
27
+
28
+ ## Not solving
29
+
30
+ Explicit exclusions and limitations.
31
+
32
+ ## Pricing and entitlements
33
+
34
+ Include currency, billing period, limits and plan differences. Record the
35
+ effective date above.
36
+
37
+ ## Proof
38
+
39
+ Named evidence only. Empty is valid.
40
+
41
+ ## Objections
42
+
43
+ ## Claims
44
+
45
+ ### Safe to say
46
+
47
+ ### Say carefully
48
+
49
+ ### Do not say
50
+
51
+ ## CTA
52
+
53
+ When to educate, mention, invite, or sell.
54
+
55
+ ## Version notes
56
+
@@ -0,0 +1,150 @@
1
+ ---
2
+ id: P-001
3
+ name: EasySociable
4
+ status: active
5
+ effective_from: 2026-09-04
6
+ source_of_truth:
7
+ - docs/prd.md
8
+ - docs/pricing-v1.md
9
+ - apps/easysociable/app/routes/home.tsx
10
+ ---
11
+
12
+ # EasySociable
13
+
14
+ ## Product promise
15
+
16
+ Turn an agent-produced content argument into a reusable, branded,
17
+ reviewable, multi-page social visual pack.
18
+
19
+ ## What it is
20
+
21
+ EasySociable is the hosted visual production layer for an external Agent. It
22
+ provides reusable Page Templates, Brands, durable Slideshow Runs, Studio
23
+ review/editing, and browser Download of the reviewed PNG pack.
24
+
25
+ The Agent supplies the content reasoning and page structure. EasySociable does
26
+ not write the content or provide a hosted LLM.
27
+
28
+ ## Best for
29
+
30
+ - Creators who already use Codex, Claude Code, or a comparable Agent for
31
+ content reasoning.
32
+ - Creators and teams producing branded carousels across TikTok, Instagram,
33
+ LinkedIn, or Threads.
34
+ - Operators who need reusable visual systems, role-specific layouts, and a
35
+ review step before download.
36
+
37
+ ## Not for
38
+
39
+ - Users looking for a browser-only content writing assistant.
40
+ - Users who want a general-purpose freeform design editor instead of a
41
+ constrained reusable visual system.
42
+ - Users who want EasySociable to manage their social accounts or publish
43
+ automatically.
44
+
45
+ ## Problem
46
+
47
+ An Agent can produce the argument, but the visual production context is often
48
+ lost: each carousel starts from a blank design, brand instructions are
49
+ repeated, and a small revision can require regeneration.
50
+
51
+ When one idea must become several platform deliverables, the operator also has
52
+ to repeat layout and export work while checking platform-specific canvases.
53
+
54
+ ## Mechanism
55
+
56
+ - Page Templates are discoverable by layout role such as `cover`, `hook`,
57
+ `value`, `steps`, `proof`, and `cta`, so a content structure can be matched
58
+ to an appropriate visual layout.
59
+ - A Brand and reusable templates persist visual decisions across future Runs.
60
+ - Studio keeps the complete Run reviewable and allows supported text and image
61
+ slot edits before Download.
62
+ - Platform-specific Layout Family variants and exports adapt the same
63
+ structured content to supported canvas presets.
64
+
65
+ ## Not solving
66
+
67
+ - Content strategy, audience research, or the quality of the Agent's thesis.
68
+ - Guaranteed reach, engagement, conversions, or viral performance.
69
+ - Automatic social posting or social-account connection.
70
+ - A hosted LLM or a replacement for the user's Agent.
71
+ - Unlimited arbitrary canvas editing or unrestricted template composition.
72
+
73
+ ## Pricing and entitlements
74
+
75
+ Early-access prices; list prices and free limits may change.
76
+
77
+ | Plan | Monthly | Annual | Slideshow Download | Brands | Image library |
78
+ |------|---------|--------|--------------------|--------|---------------|
79
+ | Free | $0 | — | 3/month, 1 platform per pack | 1 | 2 GB |
80
+ | Creator | $19 | $190/year | Unlimited, all selected V1 platforms | 5 | 50 GB |
81
+ | Pro | $39 | $390/year | Unlimited, all selected V1 platforms | 25 | 200 GB |
82
+ | Agency | Sales-led | Contract | Contract | >25 | >200 GB |
83
+
84
+ Paid plans include the full system-template catalog, up to 20 pages per
85
+ Slideshow Run, private drafts, three API keys, no overage and no watermark.
86
+ Pixels leave the product through Studio Download; CLI/MCP is not a final PNG
87
+ factory.
88
+
89
+ ## Proof
90
+
91
+ No customer proof is recorded here. Do not invent testimonials, adoption
92
+ metrics or performance improvements.
93
+
94
+ ## Objections
95
+
96
+ ### “Canva already does this.”
97
+
98
+ Canva is the broader freeform design workspace. EasySociable is for an
99
+ Agent-first, repeatable visual production workflow with role-aware templates,
100
+ durable Runs and Studio review.
101
+
102
+ ### “Can the Agent write my post?”
103
+
104
+ The Agent can do that outside EasySociable. EasySociable owns the visual
105
+ production layer.
106
+
107
+ ### “Can I publish directly?”
108
+
109
+ V1 produces a reviewed Download from Studio. It does not connect social
110
+ accounts or publish posts.
111
+
112
+ ## Claims
113
+
114
+ ### Safe to say
115
+
116
+ - Reuse saved Brands and Page Templates.
117
+ - Select layouts by supported page role.
118
+ - Review and edit supported slots in Studio before Download.
119
+ - Create platform-specific variants for supported V1 platforms and canvases.
120
+
121
+ ### Say carefully
122
+
123
+ - “One idea, multiple platforms” means the structured Run is adapted and
124
+ exported for supported platform formats; it does not mean one identical file
125
+ is valid everywhere.
126
+ - “Faster” requires a user-specific baseline. Do not claim a universal time
127
+ saving.
128
+ - “Branded” means the configured Brand and selected templates are applied; it
129
+ does not mean every creative decision is automatically correct.
130
+
131
+ ### Do not say
132
+
133
+ - “Guaranteed higher engagement.”
134
+ - “One-click automatic publishing.”
135
+ - “AI writes all your content.”
136
+ - “No review is needed.”
137
+ - “Every platform receives the same file.”
138
+
139
+ ## CTA
140
+
141
+ - `educate`: explain the Agent-to-visual production gap.
142
+ - `mention`: show how a role-specific template or Brand persists.
143
+ - `invite`: ask users to try a real content Run and review it in Studio.
144
+ - `sell`: use only when the audience has a validated need for repeated
145
+ branded visual production.
146
+
147
+ ## Version notes
148
+
149
+ - 2026-09-04: early-access pricing and V1 entitlements from
150
+ `docs/pricing-v1.md`.
@@ -3,11 +3,14 @@
3
3
  Reusable **content profiles**: pillars + audience + voice.
4
4
  Accounts point here; do not copy profile bodies into account files.
5
5
 
6
- | id | path | voice | one_liner | accounts |
7
- |----|------|-------|-----------|----------|
8
- | default | profiles/default/ | `profiles/default/voice.md` | Replace this one-liner with the profile’s job | your-handle |
6
+ | id | path | voice | one_liner | accounts | product_ids | recommendation_scope |
7
+ |----|------|-------|-----------|----------|-------------|---------------------|
8
+ | default | profiles/default/ | `profiles/default/voice.md` | Replace this one-liner with the profile’s job | your-handle | none | none |
9
9
 
10
10
  ## Voice column
11
11
 
12
12
  - Empty or `profile` → load `profiles/<id>/voice.md`
13
13
  - Explicit path → load that file instead
14
+
15
+ `profiles/<id>/lanes.md` describes publishing lanes such as teaching, building,
16
+ reviewing and comparing. A lane is not a replacement for a pillar.
@@ -6,6 +6,9 @@ Replace this starter profile before the first serious draft.
6
6
  |------|------|
7
7
  | `pillars.md` | Topics this profile may cover |
8
8
  | `audience.md` | Readers + per-platform emphasis |
9
- | `voice.md` | Identity + tone |
9
+ | `voice.md` | Identity + Experience + Values + Persona |
10
+ | `stories.md` | Story inventory (cite or none) |
11
+ | `boundaries.md` | Creator must-avoid (Not covering / Never claim) |
12
+ | `expression.md` | Expression likes / dislikes |
10
13
 
11
14
  Accounts: see `accounts/_index.md`.
@@ -0,0 +1,14 @@
1
+ # Boundaries — profile `default`
2
+
3
+ **Role:** Topics, audiences, and claims this creator will not write.
4
+ **Not:** Audience “Not for” (`./audience.md`) — that excludes readers.
5
+
6
+ Missing this file is a **hard-gate fail**. Write this starter, then interview. Never invent boundaries.
7
+
8
+ ## Not covering
9
+
10
+ - (fill)
11
+
12
+ ## Never claim
13
+
14
+ - (fill)
@@ -0,0 +1,18 @@
1
+ # Expression — profile `default`
2
+
3
+ **Role:** Concrete likes and dislikes (phrases, structures, clichés).
4
+ **Not:** Hype bans (`./voice.md` Do not say).
5
+
6
+ Missing this file = `profile: partial`, not a hard-gate fail.
7
+
8
+ ## Likes
9
+
10
+ 1. (fill)
11
+ 2. (fill)
12
+ 3. (fill)
13
+
14
+ ## Dislikes
15
+
16
+ 1. (fill)
17
+ 2. (fill)
18
+ 3. (fill)
@@ -0,0 +1,12 @@
1
+ # Content lanes
2
+
3
+ Lanes describe how this profile publishes, not what the profile is about.
4
+ Pillars remain the durable subjects.
5
+
6
+ | id | name | purpose | status |
7
+ |----|------|---------|--------|
8
+ | teach | Teaching | Explain systems, mechanisms and workflows | active |
9
+ | build | Building in public | Share implementation decisions and lessons | active |
10
+ | review | Tool review | Review third-party AI products with evidence | active |
11
+ | compare | Tool comparison | Compare options by a stated user job | active |
12
+ | offer | Product education | Explain owned product mechanisms and limits | active |
@@ -0,0 +1,15 @@
1
+ # Stories — profile `default`
2
+
3
+ **Role:** Narrative inventory the draft may cite.
4
+ **Not:** Identity table facts (`./voice.md` Experience).
5
+
6
+ 0–1 stories is enough for a first session (`profile: partial`). Skip if the user has none they will make public.
7
+
8
+ ## Stories
9
+
10
+ ### S1 — (title)
11
+
12
+ - **Situation:** (fill)
13
+ - **Choice:** (fill)
14
+ - **Lesson:** (fill)
15
+ - **Public:** yes | no
@@ -13,12 +13,26 @@
13
13
  | **Point of view** | (fill) |
14
14
  | **Not claiming** | Invented metrics, customers, quotes, or team size |
15
15
 
16
+ ## Experience
17
+
18
+ Facts copy may cite (year, role, thing done). Write `not claiming` when unknown.
19
+
20
+ - (fill)
21
+
22
+ ## Values
23
+
24
+ Claims this profile will always make / will never make. Repeatable topics go in `pillars.md`, not here.
25
+
26
+ - (fill)
27
+
16
28
  ## Persona
17
29
 
30
+ - (fill)
18
31
  - Direct. Concrete nouns. Address the reader as **you**.
19
32
  - Do not invent bio facts not listed in Identity.
20
33
 
21
34
  ## Do not say
22
35
 
36
+ - (fill)
23
37
  - Fake social proof
24
38
  - Empty hype (“game-changer”, “unlock your potential”)
@@ -0,0 +1,21 @@
1
+ # recommendations/
2
+
3
+ First-class **third-party product and tool library**. This is separate from
4
+ `products/`: entries here are products the profile may review, compare, or
5
+ recommend, not products EasySociable owns or sells.
6
+
7
+ ```text
8
+ Profile + Needs + review evidence
9
+ → Topic
10
+ → optional recommendation_ids
11
+ → Run
12
+ ```
13
+
14
+ ## Rules
15
+
16
+ - Do not treat a recommendation as an owned Product or as a product CTA.
17
+ - Do not copy vendor marketing claims into `quote` or evidence.
18
+ - Record the research date and source URLs. Prices and features can change.
19
+ - Record affiliate, sponsorship, or other commercial relationships when known.
20
+ - A recommendation needs a review basis: observed workflow, named source,
21
+ comparison, or user-provided evidence. An empty entry is not a review.
@@ -0,0 +1,21 @@
1
+ # Recommendations index
2
+
3
+ Third-party tools and products available for review or comparison. No starter
4
+ entries are provided.
5
+
6
+ | id | name | status | category | profiles | pillars | last_researched | relationship | file |
7
+ |----|------|--------|----------|----------|---------|-----------------|--------------|------|
8
+ | -- | ---- | ------ | -------- | -------- | ------- | --------------- | ------------ | ---- |
9
+
10
+ ## Status values
11
+
12
+ | status | Meaning |
13
+ |--------|---------|
14
+ | `candidate` | Captured for possible research; not publishable |
15
+ | `researched` | Evidence and limits recorded |
16
+ | `active` | Available for Topics and reviews |
17
+ | `retired` | No longer maintained or relevant |
18
+
19
+ `profiles` is a comma-separated many-to-many association. Use `*` only when
20
+ the subject is intentionally shared across all profiles. `pillars` records
21
+ where the subject is relevant; it does not make the subject an owned product.
@@ -0,0 +1,44 @@
1
+ ---
2
+ id: R-YYYYMMDD-XX
3
+ name:
4
+ status: candidate
5
+ category:
6
+ profiles: default
7
+ pillars:
8
+ last_researched: YYYY-MM-DD
9
+ relationship: none | affiliate | sponsor | client | other
10
+ source_urls:
11
+ ---
12
+
13
+ # Recommendation subject
14
+
15
+ ## What it is
16
+
17
+ ## Best for
18
+
19
+ ## Not for
20
+
21
+ ## Problem addressed
22
+
23
+ ## Observed workflow
24
+
25
+ ## Strengths
26
+
27
+ ## Limitations
28
+
29
+ ## Alternatives
30
+
31
+ ## Pricing snapshot
32
+
33
+ Include currency, plan, limits and date. Do not assume the price is current.
34
+
35
+ ## Evidence
36
+
37
+ Named sources, tests, screenshots, or user reports. Empty is not publishable.
38
+
39
+ ## Disclosure
40
+
41
+ State affiliate, sponsorship, ownership, or other commercial relationship.
42
+
43
+ ## Review notes
44
+
@@ -43,7 +43,7 @@ gate_pass: false
43
43
  ## Constraints
44
44
 
45
45
  - **must_include:**
46
- - **must_avoid:**
46
+ - **must_avoid:** (merge `profiles/<id>/boundaries.md` + voice Do not say)
47
47
 
48
48
  ## Selection (required; none allowed)
49
49
 
@@ -2,6 +2,7 @@
2
2
  # PagePack — this run is already one platform (image decks only; not pure x text)
3
3
  # Prefer filename: pack.md (or pack-<platform>.md)
4
4
  # Create when: user wants carousel/slideshow AND rubric SHIP for this run.
5
+ # Write the Arc line before pages. Do not default Cover → Point → Steps → Recap → CTA.
5
6
  ---
6
7
  status: unused
7
8
  id:
@@ -20,23 +21,30 @@ page_count: 0
20
21
  - **claim_id:**
21
22
  - **language:** en
22
23
 
24
+ ## Arc
25
+
26
+ <!-- One line: the argument that needs page turns. Required before Pages. -->
27
+ <!-- Recipes: cost-mechanism | listicle | mistakes | claim-proof | compare | (named) -->
28
+
29
+ - **one_liner:**
30
+ - **recipe:**
31
+
23
32
  ## Pages
24
33
 
25
- <!-- Each page: role + slots. Text only — no private AST. -->
34
+ <!-- Each page: role is a layout retrieval tag, not sequence position. -->
35
+ <!-- First page is not automatically cover. Text only — no private AST. -->
26
36
 
27
37
  ### page 1
28
38
 
29
- - **role:** cover
39
+ - **role:**
30
40
  - **slots:**
31
- - title:
32
- - subtitle:
41
+ - text_0:
33
42
 
34
43
  ### page 2
35
44
 
36
- - **role:** body
45
+ - **role:**
37
46
  - **slots:**
38
- - heading:
39
- - body:
47
+ - text_0:
40
48
 
41
49
  <!-- …repeat through page_count… -->
42
50
 
@@ -23,3 +23,9 @@
23
23
  ## Brief essentials
24
24
 
25
25
  ## Hard bans
26
+
27
+ ## Boundaries (must_avoid — from boundaries.md + voice Do not say)
28
+
29
+ ## Expression likes / dislikes
30
+
31
+ ## Story inventory (cite or none)
@@ -18,7 +18,9 @@ tags: []
18
18
 
19
19
  - …
20
20
 
21
- ## Beats / pages (structure only — no full copy)
21
+ ## Beats / pages (argument structure only — no full copy)
22
+
23
+ <!-- Not Cover → Point → Steps → Recap → CTA. Those are catalog family names. -->
22
24
 
23
25
  1. …
24
26
  2. …