动作规则登记表:social-media-organic-tool(post)
层③(动作规则/调试)的落地文档 —— 两层结构(2026-07-14 修订)。 层③劈两层(Anderson 原话:"系统里每个动作都需要有规范,那么这个规范就需要我人为的去确认;当然有一些大的需要旋钮调试"): - 表A「全动作规范清单」 = 系统里每一个动作(不分大小,连登录/下载/CRUD/状态机都算)逐条登记:干嘛/入/出/守什么规矩/默认的度。给 Anderson 逐条看、逐条签字用,不是每条都要能调。 - 表B「旋钮子集」 = 从表A 里挑出"度错了就毁价值"的动作(R1–Rn),给可调旋钮 + 试验台 + 落库版本回退。 判据(旋钮 vs 只规范,一句话):「把这个值改错,程序会崩吗?」 - 崩 / 报错 / 对错二元(登录、下载、状态机、CRUD、参数化查询)→ 逻辑,错了是 bug 不是度 → 只规范,不配旋钮。 - 不崩,但结果悄悄变差/变好(LLM 提示词、爆款阈值、排期时段、排序权重、筛选条件)→ 度 → 配旋钮 + 试验台。 - 再加一问:「会想拿真样本反复试它吗?」会→旋钮;一次定死就对→只规范。 - 陷阱:已经是用户每次请求能传的输入(配图尺寸、检索天数)= 已可调,别再配旋钮(过度工程)。 铁律:表B 旋钮规则绝不硬编码,必须外置进action_rules表 + 有试验台 + 可回退。 产出方:solution-architect(初稿)。签字:Anderson(表A 逐条)。落库/试验台实现:backend + frontend engineer。验收:qa-engineer + GM。 数据模型 / 迁移 / 层⑤劈分见ARCHITECTURE-RULES-LAYER.md;3 接口见API-CONTRACT-RULES.md。
表A —— 全动作规范清单(Anderson 逐条签字)
枚举方法:遍历backend/src/application/use_cases/下全部 16 个 use_case 文件 +backend/src/domain/下全部 domain 动作,逐个动作登记,不靠 grep"度"(第一版只扫 LLM 提示词,漏了schedule_algorithm.py写死的_WORK_DAYS=5/_DEFAULT_HOUR=9发布排期时段 —— 这正是必须枚举全动作的原因)。 分类列判据:只规范= 逻辑/CRUD/状态机,改错会崩或对错二元;🎛旋钮= 度错悄悄毁价值、想拿真样本反复试;🟡候选= 拿不准,签字时 Anderson 拍板。
| 动作ID | 动作名 | 代码位置(file:line) | 干嘛 | 输入 | 输出 | 守什么规矩 | 默认的"度" | 分类 |
|---|---|---|---|---|---|---|---|---|
| A01 | 注册 | auth_use_case.py:18 register_user | 建用户 | username/password | user dict | 用户名唯一;密码 bcrypt hash | 无度(对错二元) | 只规范 |
| A02 | 登录 | auth_use_case.py:32 login_user | 校验签发 JWT | username/password | access+refresh token | 凭证错即 AuthError;不泄露哪项错 | 无度 | 只规范 |
| A03 | 刷新令牌 | auth_use_case.py:52 refresh_access_token | 换新 access token | refresh_token | access token | type 必须=refresh | 无度 | 只规范 |
| A04 | 上传产品图 | material_use_case.py:16 upload_image | 存图 | file/content_type | url | MIME∈{jpeg,png,webp};≤10MB | 阈值=安全护栏(拒非法),非业务度 | 只规范 |
| A05 | 建素材 | material_use_case.py:31 create_material | 落库素材 | 产品名/卖点/品类/图/doc_text | material dict | 纯 CRUD | 无度 | 只规范 |
| A06 | 读/删/列素材 | material_use_case.py:60/80/92 | CRUD | id/user_id/分页 | material(s) | 归属校验;NotFound | 无度(分页是请求参数) | 只规范 |
| A07 | 上传文档解析 | document_upload_use_case.py:106 upload_document | 存文件+抽文本 | filename/bytes | text+char_count | ≤20MB;白名单扩展;magic bytes 校验;失败删孤儿文件 | 阈值/白名单=安全护栏,非度 | 只规范 |
| A08 | 翻译改写 | translation_use_case.py:81 translate_material | LLM 把素材写成地道社媒帖 | material/platform/lang | translated_text | 非直译;扩写+钩子+卖点+CTA;emoji/hashtag | _TRANSLATE_SYSTEM 提示词 + _PLATFORM_STYLE 各平台风格 + 改写幅度;max_tokens=1500 | 🎛旋钮 → R3 |
| A09 | 翻译 approve/reject | translation_use_case.py:201/213 | HITL 状态机 | translation_id/reason | 状态 | 状态机合法迁移;原子 claim 防重复付费 | 无度(状态机对错二元) | 只规范 |
| A10 | 列翻译 | translation_use_case.py:270 list_translations | 分页查 | material_id/分页 | translations | CRUD | 无度 | 只规范 |
| A11 | 搜索方向生成 | discovery_use_case.py:41 get_search_directions | LLM 给找爆款的方向/关键词 | material_id | directions[] | 3–5 方向;锚商业/评测意图;避裸词/NSFW | _DIRECTIONS_SYSTEM 提示词 + 方向数 + 意图锚 + max_tokens=1000 | 🎛旋钮 → R1 |
| A12 | 搜索抓取(执行) | discovery_use_case.py:110 search_trending | 调 anysearch 抓帖 | keywords/platform/max_results | posts[] | 委托 adapter;空结果给提示 | 度在 adapter 层(见 A18/R6) | 只规范(度归 R6) |
| A13 | 帖子打标(爆款判定) | discovery_use_case.py:142 tag_posts | LLM 判 format/爆款钩子/相关度 | posts[] | tagged[] | 输出 format/category/hook/engagement/relevance | _TAG_SYSTEM 提示词 + 爆款钩子词表 + 相关度严格度;max_tokens=500 | 🎛旋钮 → R2 |
| A14 | 选帖入库 | discovery_use_case.py:201 select_posts | 用户多选后 bulk_insert | selected[] | trending_post_ids | 跨阶段落库(非内存) | 无度(纯持久化) | 只规范 |
| A15 | 逆向模板 | template_use_case.py:24 reverse_template / domain/template/models.py:36 REVERSE_SYSTEM_PROMPT | LLM 把爆款拆成可复用模板 | trending_post_id | template dict | 拆 hook/body/cta + 占位符变量 | REVERSE_SYSTEM_PROMPT 提示词 + 抽象粒度 + 变量数(1-4 body/≥2 var);max_tokens=1500 | 🎛旋钮 → R5 |
| A16 | 读/列模板 | template_use_case.py:88/98 | CRUD | id/platform/分页 | template(s) | CRUD | 无度 | 只规范 |
| A17 | 成片文案 | generate_use_case.py:35 generate_post / models.py:70 build_generate_prompt | LLM 套模板+产品生成成品文案 | material/template/platform | caption+image_prompt | 专业社媒文案 | _GENERATE_SYSTEM 提示词 + 语气/长度;max_tokens=500 | 🎛旋钮 → R4 |
| A18 | 成品 approve/reject | generate_use_case.py:149/161 | HITL 状态机(reject→重生成,3 次 stuck 告警) | post_id/reason | 状态 | max_retries=3(重试次数=对错逻辑,非度);状态机合法迁移 | 无度(重试上限是护栏) | 只规范 |
| A19 | 列成品 | generate_use_case.py:221 list_posts | 分页查 | status/platform/分页 | posts | CRUD | 无度 | 只规范 |
| A20 | 搜索抓取/过滤/排序 | anysearch_swipe_adapter.py:60/53/76/70/217 | 每词搜几条/搜几词/什么域名算社媒/什么排前/默认社媒类型 | keywords/platform | RawPost[] | 只留海外社媒域名;rank heuristic 打分 | _MAX_KEYWORDS=5/_MAX_RESULTS_CAP=10/12 域名名单/(10-rank)*10 排序/_DEFAULT_SOCIAL_TYPE="x_top" | 🎛旋钮 → R6 |
| A21 | 内容库检索 | library_use_case.py:13 search_library / domain/library/models.py:32 QueryFilter | 多维筛选查库 | min_engagement/date_range_days/per_page/sort_by | posts | per_page≤100;sort_by 枚举 | 陷阱:全是用户每请求可传的输入(已可调) | 只规范(陷阱) |
| A22 | 读单条库帖 | library_use_case.py:47 get_library_post | 按 id 查 | post_id | post | NotFound | 无度 | 只规范 |
| A23 | 配图生成 | image_gen_use_case.py:20 GenerateImageUseCase | 调 Seedream 出图 | post_id/prompt/size | image_url | size∈{512/768/1024};日成本上限 | 陷阱:size 是用户每请求可传的入参(已可调);成本上限=.env 护栏 | 只规范(陷阱) |
| A24 | 发布排期时段 | domain/plan/schedule_algorithm.py:17 _WORK_DAYS=5 / :18 _DEFAULT_HOUR=9 | 把一周帖子排进工作日/时段 | platforms/counts/图文视频比 | SlotSpec[] | ratio 必须 sum=1(逻辑校验) | 排哪几天(周一~五)/几点(09:00 UTC)是写死常量 = 真度 | 🎛旋钮 → R7 |
| A25 | 生成周计划(编排) | plan_use_case.py:23 GenerateWeekPlanUseCase | 落库 plan + 调排期算法 | week_start/platforms/... | plan+items | week_start 必须周一(逻辑校验) | 度在 A24 排期算法 | 只规范(度归 R7) |
| A26 | 改计划槽位/日历/看板 | plan_use_case.py:113/154 output_use_case.py:17 | 拖期/挂模板/分组展示 | plan_item 字段 | items/events | published 槽不可改(状态机) | 无度 | 只规范 |
| A27 | 提交/重试/列发布任务 | publish_use_case.py:22/170/195 | 定时发布 + 重试队列 + 状态机 | post_id/platform/scheduled_at | job | 必须 approved 才发;live 缺凭证回落 dryrun;retry backoff | 重试次数/backoff=.env 护栏,非度 | 只规范 |
| A28 | 下载单条/批量 ZIP | download_use_case.py:14/38 | 打包成品下载 | post_id(s) | zip bytes | 批量≤100(护栏) | 无度 | 只规范 |
| A29 | 用量统计 | download_use_case.py:68 get_today_usage | 查当日调用/成本 | user_id | 统计 dict | 只读 | 无度 | 只规范 |
| A30 | AI 助手问答 | assistant_use_case.py:53 AskAssistantUseCase / :38 _SYSTEM_TEMPLATE | in-app 帮助,DeepSeek 现答 | question/page/history | answer | 页面知识注入;history≤12;question≤500;日成本门 | 人设+页面知识是静态帮助文案,输出不进生产内容、不毁价值 | 只规范(Anderson 已拍板不升旋钮) |
| A31 | UI 标注 upsert/查询/截图 | annotation_use_case.py:25 AnnotationUseCase | 存/查界面问题标注 | 标注 items | records | 批量≤1000(护栏) | 无度 | 只规范 |
表A 里两条需 Anderson 签字时拍板的 🟡/边界项
- A30 AI 助手(
_SYSTEM_TEMPLATE+_PAGE_KNOWLEDGE):Anderson 已拍板 = 只规范,不升旋钮。它是固定人设 + 静态 page→知识 映射的帮助文案,输出不进入生产内容(不影响素材/爆款/成品价值),"度"错了顶多帮助话生硬,不"毁价值"。改文案走既有"后端下发 tour/page 文案"轻通道(COMPONENT-BACKEND §2/§3),不进action_rules。 - A04/A07/A23 的尺寸/大小/MIME 白名单:是安全护栏(拒非法输入,改错会崩/放行坏文件),非业务度 → 只规范,留代码常量/
.env,不进action_rules。 - A21/A23 的检索天数、配图尺寸:陷阱——已是用户每请求可传的入参(前端表单已能改),再做旋钮=过度工程 → 只规范。
表B —— 旋钮子集(度错毁价值,配 action_rules + 试验台)
从表A 分类为 🎛旋钮 的动作挑出,共 7 条(R1–R7)。每条映射到action_rules表的一行(rule_id+config JSON,带version/status可回退)。提示词/阈值/名单一律进库,代码里只留灾难回落_DEFAULTS(见ARCHITECTURE-RULES-LAYER.md §3)。
| 规则ID | 来自表A | 挂在哪个动作(代码位置) | 度是什么(可调项) | 初值(高手蒸馏默认) | 存哪 | 验证状态 |
|---|---|---|---|---|---|---|
| R1 | A11 | 搜索方向生成 · discovery_use_case.py:19 _DIRECTIONS_SYSTEM | 营销方向性 / 覆盖面 / 方向数 / max_tokens | 3–5 个方向;锚定商业+评测意图;避免裸词/NSFW;max_tokens=1000 | action_rules rule_id=R1 (config JSON) | 🔴 理论 |
| R2 | A13 | 帖子打标 · discovery_use_case.py:33 _TAG_SYSTEM | 什么算爆款钩子 / 相关度严格度 | 输出 format/category/hook_type/engagement_level/relevance_score;max_tokens=500 | action_rules R2 | 🔴 理论 |
| R3 | A08 | 翻译改写 · translation_use_case.py:40 _TRANSLATE_SYSTEM | 平台风格 / 改写幅度(保守↔大改) | 非直译;扩写+钩子+卖点+CTA;加 emoji/3-6 hashtag;max_tokens=1500 | action_rules R3 | 🔴 理论 |
| R4 | A17 | 成片文案 · generate_use_case.py:28 _GENERATE_SYSTEM | 文案语气 / 长度 | 专业社媒文案;输出 caption+image_prompt;max_tokens=500 | action_rules R4 | 🔴 理论 |
| R5 | A15 | 逆向模板 · domain/template/models.py:36 REVERSE_SYSTEM_PROMPT | 模板抽象粒度(hook/body/cta + 变量) | 拆成 template_structure + variables 占位符 | action_rules R5 | 🔴 理论 |
| R6 | A20 | 搜索抓取/过滤/排序 · anysearch_swipe_adapter.py | 每词搜几条 / 搜几个词 / 什么域名算社媒 / 什么排前面 / 默认社媒类型 | max_keywords=5;max_results_cap=10;12 个社媒域名名单;rank 分=(10-rank)*10;default_social_type=x_top | action_rules R6 | 🔴 理论 |
| R7 | A24 | 发布排期时段 · domain/plan/schedule_algorithm.py:17 _WORK_DAYS=5 / :18 _DEFAULT_HOUR=9 | 排哪几天 / 几点发 / 同日多帖如何错峰 | 周一~周五(5 天);默认 09:00 UTC;同日多帖逐小时后延 | action_rules R7 | 🔴 理论 |
验证三态(硬要求):
- 🔴 理论 — 只有高手蒸馏/拍脑袋的默认值,没在真项目跑过。所有规则默认从这里起步。
- 🟡 在项目试过 — 拿真实样本喂进试验台跑过,有输出可评,还没定论。
- 🟢 跑通/证伪 — 试验台反复调过,确认这个度对本项目跑通(采纳)或证伪(换值)。
R1–R7 全部 🔴 理论起步。度是 Anderson 拿真样本在试验台试出来的,架构师只给合理初值,不替他定死。
表B 详表(每条旋钮)
R1 — 搜索方向生成
- 挂在动作:
discovery_use_case.py:70get_search_directions里的llm.complete(system=_DIRECTIONS_SYSTEM.format(...))/ APIPOST /api/discovery/directions - 为什么要规则化:方向推得太泛 → 搜出来全是 meme/无关内容;太窄 → 漏掉真爆款。营销方向性的度错了,整条找爆款链从源头就歪。
- 可调项(旋钮):
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
direction_count_min | int | 3 | 至少给几个方向 |
direction_count_max | int | 5 | 至多给几个方向 |
anchor_intent | enum | commercial_review | 锚定意图:商业/评测/纯泛化 |
avoid_nsfw | bool | true | 是否强制回避 meme/NSFW |
max_tokens | int | 1000 | 单次上限(经 clamp 受 .env 全局夹住) |
- 提示词模板(外置,禁止硬编码):存
action_rules.R1.config.prompt_template,当前值 = 现_DIRECTIONS_SYSTEM原文,含{platform}占位符。 - 存储:
action_rules,PKid,值列config JSON,带version+status+updated_by+updated_at。 - 调试入口:试验台
/settings/rules/R1→ 喂一个真实产品素材,看它给的 3–5 个方向准不准。 - 当前验证状态:🔴 理论 → 待 Anderson 拿自己的产品跑第一轮。
R2 — 帖子打标(爆款判定)
- 挂在动作:
discovery_use_case.py:168tag_posts里llm.complete(system=_TAG_SYSTEM)/ APIPOST /api/discovery/tag - 为什么要规则化:"什么算爆款钩子""相关度多少算相关"直接决定哪些帖子进内容库。判太松 → 库里全是噪音;判太严 → 好素材被漏。
- 可调项:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
hook_taxonomy | list | [开篇悬念,痛点,对比,福利,故事] | 钩子类型词表 |
relevance_strictness | enum | medium | 相关度严格度:loose/medium/strict |
engagement_levels | list | [高,中,低] | 热度分档 |
max_tokens | int | 500 | 单次上限 |
- 提示词模板:
action_rules.R2.config.prompt_template= 现_TAG_SYSTEM原文。 - 调试入口:
/settings/rules/R2→ 喂一批真帖子,看打标结果对不对。 - 验证状态:🔴 理论。
R3 — 翻译改写
- 挂在动作:
translation_use_case.py用_TRANSLATE_SYSTEM.format(platform_style=...)/ APIPOST /api/translations - 为什么要规则化:改写幅度太保守 → 像机翻不地道;太夸张 → 偏离产品事实、平台违规。平台风格 + 改写幅度是这步的命门。
- 可调项:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
rewrite_intensity | enum | enrich | 改写幅度:literal/faithful/enrich/bold |
platform_styles | map | 见 _PLATFORM_STYLE(x/reddit/facebook/tiktok/youtube) | 各平台风格描述,可逐平台调 |
emoji_hashtag | bool | true | 是否加 emoji + 3-6 hashtag |
max_tokens | int | 1500 | 单次上限 |
- 提示词模板:
action_rules.R3.config.prompt_template= 现_TRANSLATE_SYSTEM原文,含{platform_style}占位符。platform_stylesmap 也进 config(现为代码里的_PLATFORM_STYLE)。 - 调试入口:
/settings/rules/R3→ 喂一个素材,选平台,并排看"保守 vs 大改"两版改写。 - 验证状态:🔴 理论。
R4 — 成片文案
- 挂在动作:
generate_use_case.py:28 _GENERATE_SYSTEM里generate_post/ APIPOST /api/generate - 为什么要规则化:文案语气(专业↔活泼)和长度直接决定成品能不能直接发。语气跑偏 = 成品要人工重写。
- 可调项:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
tone | enum | professional | 语气:professional/casual/punchy/genz |
length_hint | enum | medium | 长度:short/medium/long |
max_tokens | int | 500 | 单次上限 |
- 提示词模板:
action_rules.R4.config.prompt_template= 现_GENERATE_SYSTEM原文。 - 调试入口:
/settings/rules/R4→ 喂模板+产品,看成片语气/长度合不合适。 - 验证状态:🔴 理论。
R5 — 逆向模板抽象
- 挂在动作:
template_use_case.py引用的domain/template/models.py:36 REVERSE_SYSTEM_PROMPT/ APIPOST /api/templates/reverse - 为什么要规则化:模板抽象太细 → 变量太多没法复用;太粗 → 套不出好内容。抽象粒度决定模板的可复用性。
- 可调项:
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
abstraction_level | enum | medium | 抽象粒度:coarse/medium/fine |
max_variables | int | 8 | 变量数上限 |
keep_structure | list | [hook,body,cta] | 保留哪些结构段 |
max_tokens | int | 1500 | 单次上限(现代码 clamp 1500) |
- 提示词模板:
action_rules.R5.config.prompt_template= 现REVERSE_SYSTEM_PROMPT原文。 - 调试入口:
/settings/rules/R5→ 喂一条真爆款,看逆出的模板变量粒度合不合适。 - 验证状态:🔴 理论。
R6 — 搜索抓取 / 过滤 / 排序(非 LLM 阈值规则)
- 挂在动作:
anysearch_swipe_adapter.py的search()/_fetch_phrase()/_is_social_host()/_hit_to_raw_post() - 为什么要规则化:每词搜几条、搜几个词、哪些域名算"社媒"、什么排前面、默认取哪种社媒榜——这些数字直接决定"找爆款"给你什么内容。名单漏了平台 = 好内容被丢;阈值太小 = 结果太少。
- 可调项(纯阈值/名单,无 prompt_template):
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
max_keywords | int | 5 | 扇出几个关键词各搜一次(现 _MAX_KEYWORDS) |
max_results_cap | int | 10 | 每次调用最多几条(现 _MAX_RESULTS_CAP,受 AnySearch 服务端硬顶约束) |
allowed_social_hosts | list | 12 域名(x/twitter/reddit/redd.it/instagram/linkedin/youtube/youtu.be/tiktok/facebook/fb/threads) | 什么域名算社媒(现 _ALLOWED_SOCIAL_HOSTS) |
default_social_type | enum | x_top | 平台未知时默认取哪种社媒榜(现 _DEFAULT_SOCIAL_TYPE) |
rank_score_base | int | 10 | 排序 heuristic 基数(现 (10-rank)*10 的 10) |
rank_score_mult | float | 10.0 | 排序 heuristic 乘数 |
- 存储:
action_rules.R6.config.knobs(config 无 prompt_template)。 - 调试入口:
/settings/rules/R6→ 喂一组关键词,dryrun 不花 LLM 钱,看用当前阈值/名单过滤+排序后留下哪些帖子、分数怎么算。 - 验证状态:🔴 理论。
- ⚠️ 注意:
max_results_cap受 AnySearch 服务端硬顶约束,调高超过服务端上限无效——这是外部约束,试验台可调但需在 UI 提示"服务端可能夹回"。
R7 — 发布排期时段(非 LLM 阈值规则,新增)
- 挂在动作:
domain/plan/schedule_algorithm.py:31 build_week_schedule/:60 _slots_for_platform,常量:17 _WORK_DAYS=5、:18 _DEFAULT_HOUR=9/ APIPOST /api/plans(经plan_use_case.py:23 GenerateWeekPlanUseCase) - 为什么要规则化:"排周几、几点发、同一天多帖怎么错峰"直接决定内容触达时机。这是第一版漏掉的真度 —— 它当初被工程师焊成两个模块级常量(
_WORK_DAYS=5/_DEFAULT_HOUR=9),改错不会崩(程序照排),但排到没人看的时段 = 内容白发,悄悄毁价值。Anderson 会想拿自己受众的活跃时段反复试。 - 可调项(纯阈值/时段,无 prompt_template):
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
work_days | list<int> | [0,1,2,3,4] | 排哪几天(周一=0~周日=6;现硬编码 _WORK_DAYS=5 即 Mon–Fri) |
default_hour_utc | int | 9 | 每天第一帖时间(UTC 整点;现 _DEFAULT_HOUR=9) |
same_day_stagger_hours | int | 1 | 同一天多帖逐帖后延几小时(现隐式 hour = _DEFAULT_HOUR + post_on_same_day) |
- 存储:
action_rules.R7.config.knobs(config 无 prompt_template)。 - 注意分工(层⑤劈分内的"度 vs 逻辑"再切):
_ALLOWED_PLATFORMS/_ALLOWED_CONTENT_TYPES/image_video_ratio 必须 sum=1这些是校验逻辑(改错会崩/对错二元),留代码常量,不进 R7 旋钮。R7 只收"排期时段"这三个真度。 - 调试入口:
/settings/rules/R7→ dryrun 不花钱:传一组 platforms/counts + 当前 R7 config,返回排出来的SlotSpec[](周几/几点),Anderson 看时段合不合自己受众活跃规律,并排对比改后新时段。 - 验证状态:🔴 理论。
3. 试验台(每条旋钮的调试闭环)
标准件真相源 docs/templates/test-bench.template.js + scripts/install-test-bench.sh。每条旋钮页 /settings/rules/<ruleId> 必须有:
- 喂样本 — 粘贴/上传真实输入(R1/R3/R4/R5:产品素材;R2:一批帖子;R6:一组关键词;R7:一组 platforms+counts)。
- 出结果 — 用当前 active 版本 config 跑一遍,展示输出。
- 评 — Anderson 看:太泛?太严?改写太夸张?名单漏平台?排期时段不对?(可打分/标注)。
- 调 — 直接改旋钮 / 改 prompt_template(不改代码、不重部署),再跑,并排对比新旧输出。
- 存版本 — 满意就"存为当前生效版本",
version自增进历史,旧 active 归档,可回退。
治病点:现有工具"不好用"的根因 = 这 7 处度被写死且写不对、无调节入口。试验台就是把它们变成能试、能对比、能回退的旋钮。 花钱红线:R1–R5 dryrun 触发真 LLM 调用 = 花钱,复用llm_guard(日成本/输入长度/max_tokens 三门)+ limiter + 每 tenant 每日 dryrun 上限;R6/R7 是纯阈值 dryrun,不花 LLM 钱(仍限流防刷)。详见API-CONTRACT-RULES.md。
4. 层⑤对照(规则 = 设置 = 数据库一行)
| 业务规则参数(表B R1–R7) | 环境变量(ARCHITECTURE §6 / .env) | |
|---|---|---|
| 例子 | 方向数/爆款严格度/改写幅度/文案语气/模板粒度/社媒域名名单/每词搜几条/排周几几点发 | DEEPSEEK_API_KEY/ANYSEARCH_API_KEY/QWEN_API_KEY/DATABASE_URL/REDIS_URL |
| 全局护栏(仍留 .env) | — | LLM_DAILY_COST_CAP_USD/LLM_MAX_TOKENS_PER_CALL/LLM_MAX_INPUT_CHARS/IMAGE_DAILY_COST_CAP_USD |
| 存哪 | action_rules 表 + 试验台可调 | .env(密钥永不入库/不回显) |
| 谁能调 | 有权限的运营/Anderson,运行时改 | 部署时定,改需重启 |
| 变更影响 | 改度不改代码不重部署 | 改基建,通常要重部署 |
刀切:R1–R7 旋钮 + 5 个提示词模板(R1/R2/R3/R4/R5)→ 进库 + 试验台。密钥/连接/花钱护栏 → 留 .env。两者不得混(见 ARCHITECTURE-RULES-LAYER.md §4)。 不进库的(留代码/.env):安全护栏(文件大小/MIME/magic bytes/批量上限/重试次数)、校验逻辑(week_start 必周一/ratio sum=1/枚举校验)、用户每请求可传的入参(配图 size/检索天数/分页)——这些不是"度",是逻辑或已可调。
5. 权限 + 状态
- 谁能改规则:
action_rules.updated_by服务端从登录态盖章(不信前端);带tenant_id(当前单租户恒"default",云端多租户时按租户过滤 + 非授权角色只读不能存版本)。"规则谁能调"本身是一条权限规则。 - 规则版本状态机:
draft→testing→active→archived(回退时把旧版本改回 active、当前 active 归档)。落在action_rules.status+version。同一 (rule_id, tenant_id) 只能一行 active,事务保证。
6. 与上一版(6 条)的差异
| 维度 | 上一版(v1) | 本版(v2 两层) |
|---|---|---|
| 结构 | 只有旋钮清单(6 条 R1–R6) | 表A 全动作规范清单(31 动作)+ 表B 旋钮子集(7 条) |
| 全动作覆盖 | ❌ 只扫 LLM 提示词,未枚举全动作 | ✅ 枚举全 16 use_case + domain 动作,含 CRUD/状态机/auth/下载 |
| R7 发布排期 | ❌ 漏了(_WORK_DAYS=5/_DEFAULT_HOUR=9 写死没登记) | ✅ 新增 R7,来自表A A24 |
| Anderson 签字 | 无签字项 | 表A 逐条签字;A30 助手 + 陷阱项标注供拍板 |
| 陷阱标注 | 无 | ✅ 显式标 A21 检索天数 / A23 配图尺寸 = 用户可传入参,不配旋钮 |
本次引用的 skills:cost-aware-llm-pipeline、context-budget、logic-first-ui、prompt-optimizer、database-migrations、architecture-decision-records、python-patterns