@easysociable/cli 0.1.13 → 0.1.15

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easysociable/cli",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Agent-first CLI for EasySociable: Content Engine, Template, Slideshow, and MCP",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -16,12 +16,26 @@
16
16
  },
17
17
  "keywords": [
18
18
  "easysociable",
19
- "cli",
20
19
  "mcp",
20
+ "mcp-server",
21
+ "model-context-protocol",
22
+ "claude",
23
+ "claude-code",
24
+ "cursor",
25
+ "carousel",
26
+ "social-carousel",
27
+ "slideshow",
28
+ "slideshow-generator",
21
29
  "social-media",
30
+ "tiktok",
31
+ "linkedin",
32
+ "instagram",
33
+ "threads",
34
+ "xiaohongshu",
22
35
  "templates",
23
- "slideshow",
24
- "agent"
36
+ "agent",
37
+ "content-engine",
38
+ "cli"
25
39
  ],
26
40
  "engines": {
27
41
  "node": ">=20.0.0"
@@ -49,8 +63,8 @@
49
63
  "tsup": "^8.0.2",
50
64
  "typescript": "^5.8.3",
51
65
  "vitest": "^1.3.1",
52
- "@easysociable/mcp-server": "0.0.0",
53
66
  "@easysociable/tsconfig": "0.0.0",
67
+ "@easysociable/mcp-server": "0.0.0",
54
68
  "@easysociable/template-gateway-client": "0.0.0",
55
69
  "@easysociable/vitest-config": "0.0.0"
56
70
  },
@@ -1,21 +1,20 @@
1
1
  ---
2
2
  name: easysociable-content
3
3
  description: >
4
- Operate the EasySociable Content Engine (profile, needs, products, recommendations, topics, runs, workbench).
4
+ Operate the EasySociable Content Engine: Knowledge (Karpathy LLM Wiki), hook-led
5
+ Topics, formula-led Runs, profile, brand, media, workbench.
5
6
  Triggers: 采访我, 完善人设, interview me, who am I as a creator, 建立 profile
6
7
  — follow workflows/INTERVIEW.md (engine CLAUDE.md § Interview wins if present).
7
- Triggers: 记需求, 扫需求选题, 扫关键词, 路由 Hit, capture audience quotes, user needs, 调研需求, 需求落库
8
- — follow workflows/NEEDS.md + engine CLAUDE.md § Keywords / § Hits / § Needs.
9
- Triggers: 更新产品, 产品库, product facts, product pricing, product offer
10
- — follow the engine CLAUDE.md § Products and edit `products/`.
11
- Triggers: 推荐产品, 评测工具, compare tools, review an AI product
12
- — edit `recommendations/`; do not treat third-party subjects as owned Products.
13
- Triggers: 做成选题, 开一单, 出图
14
- — follow engine CLAUDE.md (§ Topics / § Open a run / § PagePack: Page Contracts → Media → Template Selection before templates).
8
+ Triggers: 记一下, 存资料, ingest, 问知识库, what do we know about, lint 知识库, 整理知识
9
+ — follow engine CLAUDE.md § Knowledge (Ingest / Query / Lint).
10
+ Triggers: 列出 hooks, 选 hook, 用 H-… 生成选题, 做成选题
11
+ — follow engine CLAUDE.md § Topics (Hook → Formula → Knowledge).
12
+ Triggers: 开一单, 用 T-… 开一单, 出图
13
+ — follow engine CLAUDE.md § Open a run (content straight from the Topic's Formula).
15
14
  If no engine exists, copy/clone the Content Engine core (see Create below;
16
15
  `easysociable engine init` is optional offline scaffold). Then follow
17
16
  Content Engine/CLAUDE.md. Render handoff: easysociable-template (1 page) or
18
- easysociable-slideshow (2+). Never publish or post.
17
+ easysociable-slideshow (2+, Formula handoff). Never publish or post.
19
18
  ---
20
19
 
21
20
  # EasySociable Content
@@ -24,62 +23,33 @@ Entry card for agents. **Do not invent a parallel workflow.** Instance SoT is th
24
23
 
25
24
  ## Product boundary
26
25
 
27
- - Teach a **Content Engine** (signal → decision → draft → review → reusable learning).
28
- - **EasySociable** is the **visual production layer** inside that engine — not the content brain, not the whole system.
29
- - For `easysociable-builder` needs research, prefer **L1 system / L2 judgment-review** pains (sustainable publishing) over **L3 visual-tool** friction, unless the user asks for L3.
26
+ - Teach a **Content Engine**: knowledge you own → a hook-led decision → formula-led content → feedback that updates knowledge.
27
+ - **EasySociable** supplies the **Hooks / Formulas catalog** and the **visual production layer** (Studio). It is not the content brain.
30
28
 
31
- ## Pipeline (do not collapse stages)
29
+ ## Three loops (do not collapse)
32
30
 
33
31
  ```text
34
- Profile / Audience
35
- → Needs (verbatim audience quotes)
36
- → optional Product (owned offer facts) or Recommendation (third-party review subject)
37
- → Pillar (what this profile discusses) + Lane (how it publishes)
38
- → Topic (decision summary + readable judgment + Score appendix)
39
- → Run → Pack → Publish / feedback
32
+ Knowledge raw/ (immutable) → knowledge/pages (agent-maintained wiki) → index.md + log.md
33
+ Topics Hook (H-…) → one of its Formulas (F-…) → angle from knowledge pages → T-…
34
+ Runs Topic's Formula beats → content.md + content-pack.v1 → Studio → feedback
40
35
  ```
41
36
 
42
37
  | Stage | Owns | Does not |
43
38
  |-------|------|----------|
44
- | Needs `N-` | Verbatim reader/operator quotes | Watchlist hooks, Agent rewrites |
45
- | Products `P-` | Owned offer facts, pricing, boundaries | Audience demand or third-party reviews |
46
- | Recommendations `R-` | Third-party subject, evidence, limits, disclosure | Owned product claims |
47
- | Pillars / lanes | Durable subject / publishing mode | A replacement for Needs or evidence |
48
- | Topic `T-` | Human judgment card + opp gate | Being auto-created from heat |
49
- | Workbench | Read-only observatory | Source of truth (markdown indexes are) |
39
+ | `raw/` | Verbatim sources + URL | Ever get edited after save |
40
+ | `knowledge/pages` | `source` / `concept` / `entity` / `synthesis` pages with `[[links]]` | Viral-post teardowns; facts no raw source supports |
41
+ | Topic `T-` | `hook_id` + `formula_id` + `knowledge_ids` + Beat plan | Exist without a hook and a formula |
42
+ | Run | One platform; one page per formula beat | Re-pick hook/formula; idea → brief → packet → draft → editor → rubric chain |
43
+ | Workbench | Read-only observatory (Knowledge graph, Topics, Runs) | Source of truth (markdown is) |
50
44
 
51
45
  ## Hard rules
52
46
 
53
- 1. **No invented quotes** — Needs quote cell = verbatim only. Gloss is separate (`layer=L1|L2|L3` allowed in gloss).
54
- 2. **Heat ≠ topic** — External source metrics never make `ready`.
55
- 3. **Never invent `N-` from a product, vendor claim, or headline.** Match captured needs only.
56
- 4. **Topic decision card first** — start with Verdict / Why this status / Who it’s for / Core judgment / Next step, then explain the problem, current belief, angle, timing, expected belief change, evidence gap, and recommended form. **Language:** readable judgment + `one_liner` = profile `voice.md` Language (else pillars / `engine.json` locale); verbatim Needs stay untranslated. Keep scores and IDs in the appendix. Chat output is the readable decision card, not a score walkthrough.
57
- 5. **`N-` never in `capture_id`** — needs go in `need_ids` only.
58
- 6. **Rebuild workbench** after markdown writes in the engine vault.
59
- 7. **Keep ownership explicit** — `products/` is for offers we own or provide;
60
- `recommendations/` is for third-party tools and products. A Topic may cite
61
- `product_ids`, `recommendation_ids`, both, or neither.
62
- 8. **Ask for Topic `generation_mode` before any `produce` write** — present the
63
- six modes; recommend `demand` when Need-led; do not silently assume.
64
- Product/recommendation inputs do not prove audience demand.
65
- 9. **Scan stages Hits, not Needs/Topics** — default keyword scan is
66
- `track=listen` only → `hits/` (`triage`); route to `needs/` or library
67
- only after confirm. `search` = SEO, `ask` = GEO questions — not default
68
- social scan. Hits are never Topic inputs.
69
- 10. **Generate keywords from evidence** — propose listen/search/ask candidates
70
- from Needs/audience in chat; write `keywords.md` only after confirm;
71
- set `seed_from`. Google volume never gates listen.
72
-
73
- Topic modes (ask before `produce`; recommend `demand` when Need-led):
74
-
75
- ```text
76
- demand = Needs + Profile
77
- demand_to_offer = Needs + Product + Profile
78
- demand_to_review = Needs + Recommendation + Profile
79
- review = Recommendation + evidence + Profile
80
- offer_education = Product + mechanism + Profile
81
- profile_thesis = Profile + Pillar
82
- ```
47
+ 1. **No invented facts or quotes** — slot text and Beat plans come from knowledge pages only; gaps go in **Do not claim**.
48
+ 2. **No hook → no topic.** Never invent `H-` / `F-` ids; read them from `easysociable hooks list` / `formulas get`.
49
+ 3. **Knowledge is compiled, not re-derived** — ingest updates every touched page, records contradictions instead of overwriting, regenerates `knowledge/index.md`, appends `knowledge/log.md`.
50
+ 4. **Runs follow the Formula** — same beat count, order and roles; `layoutFamilyId = look.slides[n] ?? look.layouts[role]`.
51
+ 5. **Rebuild workbench** after markdown writes in the engine vault (`python3 workbench/build.py`); after knowledge writes also `python3 scripts/lint-knowledge.py --engine .`.
52
+ 6. Hook link for the user: `https://easysociable.com/hooks/<hook_id>`.
83
53
 
84
54
  ## Create / serve / build
85
55
 
@@ -102,56 +72,39 @@ repo into `<parent>/Content Engine` (never overwrites an existing engine).
102
72
  ```bash
103
73
  easysociable engine serve --engine <parent>/Content Engine --no-open
104
74
  easysociable engine build --engine <parent>/Content Engine
105
- # --sync-workbench refreshes workbench files from the public core checkout
106
75
  ```
107
76
 
108
- On a dedicated agent computer (e.g. Grok Bot), prefer `/workspace` + clone or
109
- `engine init`. Mixed→split vault: see `scripts/migrate-split-vault.py` in the
110
- public repo.
111
-
112
- `python3` is required for the workbench. Observatory: `http://127.0.0.1:8765/workbench/` — top tabs include **需求库 / Needs**. If `serve.py` is already up, do not start a second server; rebuild only.
113
-
114
- Engine methodology updates: `git pull` on the core (or `--sync-workbench`), not
115
- CLI republishes.
77
+ `python3` is required for the workbench. Observatory: `http://127.0.0.1:8765/workbench/` — tabs **Knowledge** (graph) / Topics / Runs. If `serve.py` is already up, do not start a second server; rebuild only.
116
78
 
117
79
  ## Operate
118
80
 
119
81
  1. Resolve account → profile (engine `CLAUDE.md`).
120
82
  2. Route by intent (table below). Prefer engine `CLAUDE.md` sections; use `workflows/*` when that file is newer or the § is missing.
121
- 3. Always return the structured chat card the section defines.
83
+ 3. Always return a short result card in chat.
122
84
  4. Rebuild workbench after writes.
123
85
 
124
86
  | Intent | Action |
125
87
  |--------|--------|
126
88
  | 采访我 / interview me / 完善人设 / 建立 profile | **workflows/INTERVIEW.md** (not a render) |
127
- | 记需求 / 用户原话 / capture audience quotes / 调研需求 / 需求落库 | **workflows/NEEDS.md** (not a render) |
128
- | 加关键词 / 生成 listen\|search\|ask 词 / 扫关键词 / 路由 Hit | Engine **§ Keywords** + **§ Hits** — three-track recipes; scan listen→Hits |
129
- | 更新产品 / 产品库 / product facts | Engine **§ Products** — update owned offer facts and dated pricing |
130
- | 推荐产品 / 评测工具 / compare or review | `recommendations/` — collect evidence and disclosure before Topic |
131
- | 扫需求选题 | **NEEDS.md** then Topics from `needs/` `status=captured` — **ask `generation_mode` first** |
132
- | 做成选题 / 生成 topic | engine **§ Topics** — explicit input; **ask `generation_mode` before write** |
133
- | 开一单 / 用 T-… 开一单 | engine **§ Open a run** (ask platform; multi → N runs) |
134
- | 1 page / `media_mode=single_visual` | **easysociable-template** (after hard gate) |
135
- | 2+ pages / `media_mode=multi_page_pack` (any platform, incl. X + `pack_hook`) | **easysociable-slideshow** (after hard gate + **ADR-0036 identity chain**: Studio login → API key → `easysociable auth login` → create) |
136
- | X / xiaohongshu text-only | No render skill — ship copy from the Run |
89
+ | 记一下 / 存资料 / ingest + link or file | Engine **§ Knowledge · Ingest** |
90
+ | 问知识库 / what do we know about X | Engine **§ Knowledge · Query** (offer to file back as `synthesis`) |
91
+ | lint 知识库 / 整理知识 | Engine **§ Knowledge · Lint** |
92
+ | 列出 hooks / 选 hook / 用 H-… 生成选题 | Engine **§ Topics** |
93
+ | 开一单 / 用 T-… 开一单 | Hard gate → engine **§ Open a run** (ask platform; multi → N runs) |
94
+ | 1 page | **easysociable-template** with `Formula: <id>` (after hard gate) |
95
+ | 2+ pages (any platform) | **easysociable-slideshow** *Formula handoff* (after hard gate + **ADR-0036 identity chain**: Studio login → API key → `easysociable auth login` → create) |
96
+ | X / xiaohongshu text-only | No render skill — ship copy from `content.md` |
137
97
 
138
98
  ## Render hard gate
139
99
 
140
- **Before any template/slideshow call:** Identity in `profiles/<active>/voice.md` — Role / What I build / Point of view — no `(fill)` and non-empty; `boundaries.md` exists with Not covering and Never claim both non-empty. If `needs/` exists, `needs/_index.md` ≥ **3** `N-` rows; if `needs/` is absent, skip that count. Public handle MAY stay `(fill)`.
100
+ **Before any template/slideshow call:** Identity in `profiles/<active>/voice.md` — Role / What I build / Point of view — no `(fill)` and non-empty; `boundaries.md` exists with Not covering and Never claim both non-empty. Public handle MAY stay `(fill)`.
141
101
 
142
102
  On fail: **stay in this skill**. List missing files. Do not call template or slideshow. User must say **强制继续** / **force continue** to proceed.
143
103
 
144
104
  ```bash
145
- easysociable engine validate --run <run-dir> --require-pack --require-knowledge
105
+ easysociable engine validate --root <engine> --require-knowledge
146
106
  ```
147
107
 
148
- Slideshow packs need an **Arc** line, then **Page Contracts** (no `templateId`), then Media, then Template Selection. Do not default Cover → Point → Steps → Recap → CTA. Page 1 is cover/hook class; later pages are not. Handoff: **easysociable-slideshow** (`references/ARC.md`). Validate with `python3 scripts/validate-pack.py`.
149
-
150
- ## Research (Needs)
151
-
152
- - Prefer host research tools. On **X**: built-in `x_*` first; fall back to agent-reach / `twitter` only if insufficient.
153
- - Store **commenter** words when scraping threads. Do not invent `N-` when a platform tool is missing—stop and ask for paste.
154
-
155
108
  ## Out of scope
156
109
 
157
110
  No social posting, Content MCP, Local API, or SQLite content library.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Not a fourth skill. If the engine `CLAUDE.md` already has **§ Interview**, follow that section. Otherwise follow this file.
4
4
 
5
- Do **not** ingest needs / quotes here. Do **not** scan the watchlist. Do **not** create a slideshow or call template/slideshow.
5
+ Do **not** ingest sources into Knowledge here. Do **not** create a slideshow or call template/slideshow.
6
6
 
7
7
  ## Triggers
8
8
 
@@ -59,9 +59,9 @@ Do **not** ingest needs / quotes here. Do **not** scan the watchlist. Do **not**
59
59
 
60
60
  | Level | Condition | Behavior |
61
61
  |-------|-----------|----------|
62
- | **Hard gate** (refuse slideshow handoff / `create_run`) | Identity **only** Role / What I build / Point of view have no `(fill)` and are non-empty (Public handle and Not claiming MAY stay `(fill)` / starter copy) **and** `boundaries.md` exists with Not covering **and** Never claim both non-empty. If `needs/` exists, also `needs/_index.md` ≥ 3 `N-` rows; if `needs/` is absent, skip that count. | Refuse 出图 / PagePack handoff / `slideshows create`. List missing files. User must say **强制继续** / **force continue** to proceed. |
63
- | **First-session goal** | Hard gate **and** Persona has at least one personalized line **and** needs **target 5** (under 5 still passes the hard gate) **and** `stories.md` may be 0–1 | Open card `profile: partial`. May 扫需求选题. Still no graphics unless forced. |
64
- | **Complete seven dimensions** | Identity + Experience (≥2) + Values (≥3) + Persona/Do not say + `stories.md` ≥1 + `boundaries.md` + `expression.md` likes/dislikes ≥3 each + needs ≥5 | Open card `profile: complete`. Remaining gaps are draft reminders only — **not** a hard-stop on graphics. |
62
+ | **Hard gate** (refuse slideshow handoff / `create_run`) | Identity **only** Role / What I build / Point of view have no `(fill)` and are non-empty (Public handle and Not claiming MAY stay `(fill)` / starter copy) **and** `boundaries.md` exists with Not covering **and** Never claim both non-empty. | Refuse 出图 / run handoff / `slideshows create`. List missing files. User must say **强制继续** / **force continue** to proceed. |
63
+ | **First-session goal** | Hard gate **and** Persona has at least one personalized line **and** `stories.md` may be 0–1 | Open card `profile: partial`. May pick a hook and write Topics. Still no graphics unless forced. |
64
+ | **Complete seven dimensions** | Identity + Experience (≥2) + Values (≥3) + Persona/Do not say + `stories.md` ≥1 + `boundaries.md` + `expression.md` likes/dislikes ≥3 each | Open card `profile: complete`. Remaining gaps are draft reminders only — **not** a hard-stop on graphics. |
65
65
 
66
66
  Experience / Values / expression are **not** the hard gate. Missing `stories.md` / `expression.md` = partial. Missing `boundaries.md` file = hard-gate fail.
67
67
 
@@ -1,99 +0,0 @@
1
- # Needs (audience quotes)
2
-
3
- Not a fourth skill. If the engine `CLAUDE.md` already has **§ Needs**, follow that section **unless this file is newer** — then this file wins for Needs-only rules.
4
-
5
- Do **not** invent quotes. Do **not** scan the watchlist to mint needs. Do **not** create a slideshow.
6
-
7
- ## Triggers
8
-
9
- - 记需求 / 用户原话 / 评论导出
10
- - 扫需求选题
11
- - 扫关键词 / 用关键词扫需求 / 扫 K-xx(research only — see **Keyword scan** below)
12
- - capture audience quotes / user needs
13
- - 调研需求 / 需求落库 / 重新调研并落库
14
-
15
- ## Research axis (easysociable-builder default)
16
-
17
- Product teaches **Content Engines**; EasySociable is the **visual layer**. When researching or screening needs for this profile:
18
-
19
- | Layer | Means | Default |
20
- |-------|--------|---------|
21
- | **L1** | System / sustainability — what to say, what to publish next, memory, pipeline, consistency | **Prefer** |
22
- | **L2** | Judgment / review / approval — AI polished but empty; bottleneck moved to human check | **Prefer** |
23
- | **L3** | Visual / tool friction — Canva, Figma, “looks AI”, brand kit paste | Keep only if user asks; else do not promote as primary |
24
-
25
- Put `layer=L1|L2|L3` in **`## Our gloss` only** — never in the index `quote` cell.
26
-
27
- **Reject:** course/toolkit CTAs, product demos dressed as pains, watchlist viral titles as quotes, Agent-paraphrased “quotes”, wrong-ICP “idk what to post” with no system angle.
28
-
29
- ## Rules
30
-
31
- - Quote cell = **verbatim**. Gloss goes in `## Our gloss`, never in the index `quote` column.
32
- - Status is only `captured` | `promoted` | `retired`. **Never** `clustered`. Merge is not a new status.
33
- - Synonym merge: propose, wait for user yes, then keep the surviving `N-` as `captured`, `frequency += 1`, append a sighting. Retire a mistaken duplicate and note it on the surviving sighting. No hosted clustering.
34
- - Do not mark `promoted` without a `T-` whose `need_ids` contain this `N-`. `topic_ids` non-empty ≡ `promoted`.
35
- - Never write `N-` into topic `capture_id`.
36
- - Hard gate (graphics): once `needs/` exists, `needs/_index.md` needs ≥ **3** `N-` rows. First-session **target** is **5** (under 5 still passes the hard gate). Do not invent quotes to hit the number.
37
- - Quotes may include DMs / students. Keep local. Redact PII if used as published copy.
38
- - After Needs writes: rebuild workbench (`python3 workbench/build.py` or `easysociable engine build`).
39
-
40
- ## Delete vs retire
41
-
42
- - `retired` = soft discard while the user may still want the row visible.
43
- - If the user says **删除 / 删掉 retired / 可以直接删了**: **delete** the entry file(s) and remove the index row(s). Do not leave ghost `retired` rows. Rebuild workbench.
44
- - Do not delete `captured` or `promoted` without an explicit ask.
45
-
46
- ## Keyword generate (from Needs)
47
-
48
- When user asks to generate keywords from needs: follow engine **§ Keywords · Generate**.
49
- Prefer `track=listen` seeds from verbatim Needs; propose in chat; write only on confirm with `seed_from=need:N-…`.
50
- Optional: derive `search` (SEO) or `ask` (GEO question) pairs — not for default social scan.
51
-
52
- ## Keyword / handle scan → Hits → route
53
-
54
- Load `profiles/<id>/keywords.md` (and/or `handles.md`).
55
- Default scan: up to **5** rows with **`track=listen` + `status=active`** (or named `K-xx` / `@handle`). Prefer L1/L2 `pain`/`question`.
56
-
57
- Meaningful hits → write `hits/` (`H-…`, `status=triage`, `keyword_id`, heat when known) + chat cards.
58
- **Needs / library only after route confirm** (engine **§ Hits**). Author posts are not Needs; comments may be. Structure/foil → library via Capture + ingest approval.
59
-
60
- On **X**: `x_*` first. Other platforms only with a working host backend; else ask for paste. Hits are never Topic inputs. Do not default-scan `search`/`ask` rows into Hits.
61
-
62
- ## Ingest paths
63
-
64
- 1. Pasted quote — 「记需求:……」 / “capture audience quotes: …”
65
- 2. Comment / DM export or screenshot — extract quotes; one `N-` each; confirm with the user when unsure.
66
- 3. URL / thread — fetch with host research tools; store the **commenter's** words, not the author's hook. On **X**: `x_*` first, then agent-reach if needed.
67
- 4. After a consult — 「刚才那通咨询记需求」.
68
- 5. Keyword / research pass — screen for L1/L2; **confirm** then write `N-` for verbatim hits; update `_index.md` research note briefly.
69
-
70
- Forbidden: Agent-rewritten sentences as quote; watchlist/keyword viral titles as need; FAQ templates with no original quote; silent batch write from a scan.
71
-
72
- ## Write
73
-
74
- 1. New `needs/entries/N-YYYYMMDD-XX.md` from `needs/_template.md`
75
- 2. New row at the top of `needs/_index.md`
76
- 3. Rebuild workbench
77
- 4. Chat card:
78
-
79
- ```text
80
- ✅ Need N-YYYYMMDD-XX
81
- 【Quote】 …
82
- 【Source】 comment | dm | consult | faq | student | other
83
- 【Layer】 L1 | L2 | L3
84
- 【Frequency】 1
85
- 【Stored】 needs/_index + needs/entries/N-….md
86
- 【Merge】 new | merged into N-… (frequency now k, status still captured)
87
- ```
88
-
89
- ## 扫需求选题
90
-
91
- Input set: `needs/_index.md` rows with `status=captured` (`topic_ids` empty). Max **5** `produce`. Prefer L1/L2 glosses for this profile unless the user asks otherwise.
92
-
93
- Then **§ Topics**: Input gate Need ID `N-…`; `source_type=need`; `need_ids` lists the `N-` (never in `capture_id`); default `scout_label=demand`. **Before any `produce` write, ask the user to choose `generation_mode`** (six modes; recommend `demand` when Need-led). Still run hard filters and that mode’s required-input gate.
94
-
95
- When `produce` creates a `T-` from an `N-`: update `needs/_index.md` + the entry to `status=promoted` and `topic_ids` containing that `T-`. Discard / library: leave `captured` or `retired` — do not mark `promoted` without a T-.
96
-
97
- Audience exception (first activation): `source_type=need` **and** `need_ids` non-empty → matching at least one need gloss counts as one strong audience check; do **not** require a full ICP from `audience.md` / `pillars.md`. `ready` still needs `opp_score ≥ 7.5` **and** `audience ≥ 6`.
98
-
99
- Prefer scanning needs before inbox. Inbox is structure / competitor context.