内容主权在源文件
site 内容与 catalog 负责公开内容;员工数据已用 PostgreSQL,访客和旧任务仍在 SQLite。
组织架构 × 产品线 × 模块依赖 × 数据责任 × 处理流水线。基于当前源码分析,将已实现的执行路径与未来演进清楚分开。
Health4All 的核心是个人技术内容的生产、呈现与受控运营。下面的产品线是按用户价值归纳,并非源码里已经存在五个独立微服务。
site 内容与 catalog 负责公开内容;员工数据已用 PostgreSQL,访客和旧任务仍在 SQLite。
四角色 + 明确工具分派 + 云端模型解释;采用按需 CLI,不是四个常驻自治服务。
已有真实发布和反馈闭环,但统一版本域、跨阶段任务一致性与集中预算仍需演进。
projects / writing / research 是内容归属;制作、设计、发布、员工与访客服务才是功能边界。
服务对象:作者 / 运营者
服务对象:作者 / 读者
服务对象:管理员
服务对象:本人 / 内容团队
服务对象:访问者 / 运营者
这是逻辑关系图:连线表示调用或产物流转,不代表所有模块彼此直接 import。模块的真实 Python 依赖在证据区另列。
切换下方流水线,点击步骤查看实现、产物与失败分支。流程演示只用于解释,不会调用系统或执行发布。
项目采用自建轻量角色框架,没有发现 LangGraph / AutoGen 等第三方多 Agent 编排框架的运行依赖。角色权限主要由应用层和工具入口限制。
| 角色 | 工作内容 | 真实执行方式 | 边界 |
|---|---|---|---|
| 网站运维 | 巡检 / 明确发布 / 员工备份 | 执行由本机后台的受控分派完成,云端解释工具回执 | 不提供通用 shell;回退目前为既有运维链路和协作能力 |
| 内容设计 | 美化当前页 / 设计讨论 | 命令匹配后调用整站预览,不是只重算一个段落 | 当前命令会重新生成整站预览;复杂自由语句未必触发工具 |
| 知识研究 | 两类官方 RSS + 有来源选题 | 通常本机采集,再给云端模型;每源硬时限 18 秒 | 非全网搜索、非持续热点监控,不自动生成并发布文章 |
| 站内客服 | 公开证据 + 阅读路线 | 员工内的私有会话;与公网 assistant 服务分离 | 公网助手没有员工记忆和运营权限 |
“记住”是角色内,“全体记住”是共享;当前仅关键词相关性排序,不是向量语义数据库。
候选记忆最多读取 30 条,注入最多 8 条;最近会话注入 6 条,每条截断。共享记忆排序优先于相似度。
当前架构是有意分域、尚未完全整合的混合存储。模型服务只处理输入上下文,不是内容主库或任务权威。
| 领域 | 对象 | 介质 | 含义 / 生命周期 |
|---|---|---|---|
| 公开内容权威 | site 源文件 + catalog | 本地文件 | 原稿、栏目、既有 URL;员工 PG 不是这些数据的统一主库。 |
| 发布设计状态 | 私有 job/document JSON、HTML 快照 | 本地文件 | 来源与设计哈希、处理事件、选择;需保留本机环境才能完整重放。 |
| 起草任务 / 额度 | tasks / budget | SQLite | 预算按运行状态目录分开,不能推导成一个全局财务预算。 |
| 访客记录 | interactions + 图片 + 日报 | SQLite / 私有文件 | 原始记录与关联图片保留 90 天,日报不成为可执行指令。 |
| 员工协作 | sessions / messages / tasks / memories | PostgreSQL | 独立业务库,按需 psql 调用;本机测试可回退 SQLite。 |
| 已发布快照 | 静态站 + 公开索引 + 版本 manifest | 不可变文件 | 读者不直接读取员工库;网站回退不回滚业务数据。 |
| 员工备份 | 单业务库归档 + 检查结果 | 私有备份文件 | 每日云端保留 30 天;异机副本由显式备份命令取回,不是每日自动异机同步。 |
发布、模型、数据库和 UI 状态的成功条件不同,不能用一条“任务完成”概括所有结果。
访客只有公开索引、问答和反馈;员工/文章后台只在本机开放,并通过 SSH 访问私有操作。
输入脚本被清理;已知图表纯数据解析。模型只在允许的工具回执范围内解释。
发布要求来源/快照哈希、构建检查、备份、HTTP 与文件哈希;数据库备份恢复是另一条链。
| 运行节奏 | 执行内容 | 不能误解为 |
|---|---|---|
| 内容作业每 5 分钟 | 日报 + 最多十个可信输入起草 | 每五分钟自动发稿 |
| 健康巡检每 5 分钟 | 页面 / 索引 / 磁盘状态 | 已经接入站外通知 |
| 员工备份每日北京时间 03:10 | 单库 dump 与归档校验 | 每日自动异机副本与持续 PITR |
| 模型调用边界 | 访客/起草/日报一侧默认 50 次/UTC 日;员工侧默认 20 次/日 | 润色/翻译也被统一计入这一额度,或已实现金额预算 |
以下为本次源码审阅结论,不是生产压测结果,也不自动证明已发生数据丢失。优先级表示建议处理顺序。
console 先 begin→执行工具→run;employees 的原子 claim 发生在 run 中。进程在工具成功后、回执入库前退出,任务与实际世界可能不一致。
建议 采用可恢复 tool_attempt、幂等业务键、回执日志与重放检查;明确至少一次语义。
依据:console / employees失败 receipt 仍可进入模型解释并将任务记 completed;前端通过 receipt.status 单独提示。统一审计和指标若只看任务状态会高估成功率。
建议 拆分 orchestration_status / tool_status / model_status / publication_status。
依据:employees / employees.js访客与员工使用不同状态目录的预算库;润色与翻译直接调用模型,并未共用 reserve_model_call。
建议 统一模型网关、按任务与用途记账;在构建前预估并限制翻译/润色成本。
依据:assistant / editorial_copy / translate_siteworker 先直接调用 analyze_daily,再处理 inbox;该调用异常可令本轮起草队列不执行。
建议 拆分两个作业,或隔离异常与记录独立回执。
依据:workercatalog、Markdown front matter、设计 JSON 和员工任务关联主要靠应用约定;PG schema 当前没有数据库外键关系。
建议 先引入统一 ContentVersion / RenderSnapshot 契约和迁移层,不直接全量搬库。
依据:publication / content / employees员工数据库每次查询启动 psql;10 分钟过期状态只在初始化时刷新,无持续心跳或租约延长。
建议 引入参数化驱动、短事务、显式租约/心跳、持久协调器;按负载再决定消息中间件。
依据:employeesgallery 样式累计覆盖原博客/展览规则;旧 a/b/c、generation 相关代码仍保留,但当前仅产生单方案。
建议 提炼设计 token 与组件层,清理失效分支,增加页面类型的视觉回归。
依据:gallery.css / designs / site_review静态站回退保留业务数据库;员工每日同机备份,电脑离线时没有新的本机副本。
建议 明确 RPO/RTO、独立异机备份计划和全链恢复演练,避免只演练单库恢复。
依据:employee_backup / install_release下列为建议路线;未纳入“已经上线”的能力清单。
先定义内容版本、设计快照、工具执行、审核与发布回执 ID;补足跨阶段故障恢复。
模型调用账本、独立日报作业、任务心跳、错误分类和真正的站外告警;建立恢复目标。
审核后的热点→草稿→设计交接、对象存储与检索评测。跨机器编排、向量库、全量 PG 迁移依据负载决定。
扫描仅做 AST 静态解析,没有 import 或执行项目模块,没有读取凭据、业务对话或生产数据库。本报告没有进行新的线上部署验收。
| 模块 | 职责 | 实现解释 | 领域 |
|---|---|---|---|
console.py | 交互与调度入口 | 本机文件夹发布、CRUD、员工窗口与预览 API。Host/Origin 检查;线程分派受控工具;最多两个本机员工任务。 | 控制平面 |
intake.py | 材料归一化 | 主文件发现、HTML/Markdown 清理、来源/图片指纹、栏目判断、已有 URL 识别。PDF 在此是参考附件,不直接作为主稿。 | 内容制作 |
content.py | 证据与草稿 | 五种 pipeline 的统一任务模型,PDF 物理页码证据、权利检查、模型起草及审核入库。 | 内容制作 |
publication.py | 快照与发布事务 | 来源/设计哈希校验、选择当前单方案、修改本地源、调用部署、失败恢复源文件。 | 发布核心 |
site_review.py | 整站预览 | 构建临时站点,再按目录生成单一自适应预览;旧样式 URL 仅兼容。 | 内容制作 |
site_builder.py | 全站组装 | 汇合 catalog 与已公开 Hugo 文章,生成首页/栏目/正文,检查设计覆盖和栏目入口,移除撤稿链接。 | 体验引擎 |
semantic_design.py | 语义排版 | 规则判断五种文章类型,识别观点/风险/定义/证据/步骤;明确单系列数值表可视化,保护原表。 | 体验引擎 |
editorial_copy.py | 表达润色 | 摘要与适合的纯文本段落,每篇最多七段;数值、标识、限定语与长度检查;原文对照与缓存。 | 体验引擎 |
gallery_design.py | 内容发现版式 | 栏目与首页作品编排、原创装饰性 SVG 图版、搜索和分类控件;不是数据图生成器。 | 体验引擎 |
translate_site.py | 构建期英语 | 缓存模型译文,覆盖正文和控件;发布只输出当前仍引用的词条,避免撤稿译文残留。 | 体验引擎 |
deploy.py | 本地发布执行器 | Hugo→全站组装→翻译→断链/敏感信息检查→公开索引→版本包→受控远端安装。 | 发布核心 |
install_release.py | 远端版本切换 | 备份配置/旧指针,生产锁、不可变目录、服务切换、HTTP/哈希验收,失败恢复;不回滚业务数据库数据。 | 发布核心 |
employees.py | 角色与记忆运行时 | 四个角色、持久任务、原子领取、历史与作用域记忆;模型围绕工具回执解释,不是通用 shell Agent。 | 员工协作 |
employees_remote.py | 员工通信桥 | 本机后台经 SSH 调用受限云端 CLI;备份工具可取回本机副本。无公开员工 RPC。 | 员工协作 |
assistant.py | 访客阅读服务 | 公开索引、中文双字/英文词检索、单轮模型解读、引用、限流与降级;无发布能力。 | 访客服务 |
visitor_data.py | 反馈与日报 | 对话、建议、BUG/截图私密保存;前一完整 UTC 日汇总,90 天清理,日报仅待审核。 | 访客服务 |
article_admin.py | 文章管理 | 现有文章查看/编辑/删除与新增,版本摘要检查、防覆盖、私有备份及预演后执行部署。 | 控制平面 |
worker.py | 定时内容作业 | 每次先做日报,再处理最多十个可信 inbox 作业;产生待审核草稿,不直接上线。 | 运行保障 |
employee_backup.py | 员工库备份 | 单业务库 dump、归档校验、可选临时库恢复演练、30 天保留;每日调度仅在云端备份。 | 运行保障 |
health.py | 网站巡检 | HTTP/索引/磁盘状态,落私有健康记录;定时触发不等于站外告警。 | 运行保障 |
| 相对项目路径 | 行数 | SHA-256 前 12 位 | 顶层函数 / 类起始行 |
|---|---|---|---|
runtime/admin_remote.py | 33 | 2ea3259afc33 | invoke:9, feedback:21, status:25, image:31 |
runtime/article_admin.py | 169 | 7be12e340004 | catalog:20, editable:26, resolve:30, read:38, listing:75, perform:83 |
runtime/assistant.py | 214 | 43faa03de19e | Text:28, build_index:44, tokens:70, retrieve:78, reserve_model_call:92, answer:106, handler:128, main:200 |
runtime/blog_designs.py | 85 | a72819e4dc4c | sidebar:22, shell:32, article:47, cards:64, home:76, section_page:81 |
runtime/common.py | 39 | 7c4416226759 | state_dir:10, generate:18 |
runtime/console.py | 251 | 299b46079f6f | handler:29, main:232 |
runtime/content.py | 187 | 8f02cf4bb473 | database:20, check_slug:33, extract:38, checks:53, create:65, approve:112, import_task:136, main:162 |
runtime/deploy.py | 149 | a676e5331a53 | read_env:24, connect:33, main:47 |
runtime/designs.py | 151 | e0a69f5b3f7e | skill_text:24, design_plan:34, frame:79, home:84, section_page:99, render:112, build_candidates:133 |
runtime/editorial_copy.py | 92 | 515e3ae215c4 | cache_path:12, load:15, key:19, invariant:22, valid:28, candidates:34, ensure:45, apply:78 |
runtime/employee_backup.py | 42 | a7dd1f8d946f | run:11, main:14 |
runtime/employee_install.py | 24 | 9dd306444594 | setup:7 |
runtime/employees.py | 198 | f3f85c9f53b7 | now:26, literal:27, Store:30, public_evidence:74, headlines:82, inspect_site:98, begin_task:110, run_task:126, rpc:165, main:186 |
runtime/employees_remote.py | 39 | a7fcf8f9efe0 | invoke:9, backup:23 |
runtime/gallery_design.py | 60 | 78c0a9ef7692 | artwork:14, directory:34 |
runtime/health.py | 29 | cd0fa0ccf59f | main:9 |
runtime/install_release.py | 184 | eeab2358f010 | run:15, switch:19, fetch:27, install:33, restore:145 |
runtime/intake.py | 252 | d04b1c8caee0 | fingerprint:41, discover:45, safe_file:59, markdown_body:68, normalize:75, inspect_folder:198 |
runtime/publication.py | 233 | d2f252307916 | jobs_root:21, job_dir:25, load:32, save:36, event:44, register:50, register_document:54, unchanged:73, prepare:87, select:107, stage:124, publish:198, list_jobs:231 |
runtime/report_charts.py | 104 | 71dcd9bfb9d4 | literal_array:8, number:32, text:38, chart:42, bars:49, recover:65 |
runtime/resource_cleanup.py | 80 | c33c09d80972 | command:13, main:18 |
runtime/semantic_design.py | 117 | 6e20a7193d5a | quantitative:16, analyze:39, compose:53 |
runtime/site_builder.py | 127 | 4b87ae53ccac | section_for:14, output_path:20, catalog_rows:24, enhance:44 |
runtime/site_review.py | 147 | 470129e8bbea | registry:22, write_registry:27, prepare:32, resolve:111, render_preview:121, wrapper:144 |
runtime/translate_site.py | 97 | 4c75dcbf4f91 | text_nodes:19, translate:23, collect:42, ensure:66, main:90 |
runtime/validate_public.py | 31 | c325e1220713 | Links:9, validate:17 |
runtime/visitor_data.py | 112 | 2e5e81362d73 | database:17, redact:30, save:36, recent:71, mark:76, analyze_daily:83 |
runtime/worker.py | 42 | 0b464f286b16 | main:12 |
箭头语义为 import:调用方 → 被导入方。静态出现不代表每次运行都调用,也不覆盖 SSH、HTTP、子进程和文件读写关系。
| 导入方 | 被导入方 |
|---|---|
admin_remote.py | deploy.py |
article_admin.py | blog_designs.py |
article_admin.py | common.py |
article_admin.py | content.py |
article_admin.py | intake.py |
article_admin.py | publication.py |
article_admin.py | site_builder.py |
assistant.py | common.py |
assistant.py | visitor_data.py |
blog_designs.py | designs.py |
blog_designs.py | editorial_copy.py |
blog_designs.py | gallery_design.py |
blog_designs.py | semantic_design.py |
console.py | admin_remote.py |
console.py | article_admin.py |
console.py | common.py |
console.py | deploy.py |
console.py | employees.py |
console.py | employees_remote.py |
console.py | intake.py |
console.py | publication.py |
console.py | site_review.py |
content.py | assistant.py |
content.py | common.py |
deploy.py | assistant.py |
deploy.py | common.py |
deploy.py | content.py |
deploy.py | site_builder.py |
deploy.py | translate_site.py |
deploy.py | validate_public.py |
designs.py | assistant.py |
designs.py | blog_designs.py |
designs.py | common.py |
designs.py | editorial_copy.py |
designs.py | semantic_design.py |
editorial_copy.py | common.py |
editorial_copy.py | deploy.py |
employees.py | assistant.py |
employees.py | common.py |
employees.py | content.py |
employees_remote.py | common.py |
employees_remote.py | deploy.py |
gallery_design.py | blog_designs.py |
health.py | common.py |
install_release.py | employee_install.py |
intake.py | common.py |
intake.py | content.py |
intake.py | report_charts.py |
publication.py | common.py |
publication.py | designs.py |
publication.py | intake.py |
site_builder.py | blog_designs.py |
site_builder.py | common.py |
site_builder.py | editorial_copy.py |
site_builder.py | intake.py |
site_review.py | blog_designs.py |
site_review.py | common.py |
site_review.py | designs.py |
site_review.py | editorial_copy.py |
site_review.py | intake.py |
site_review.py | publication.py |
site_review.py | site_builder.py |
translate_site.py | common.py |
translate_site.py | deploy.py |
translate_site.py | site_builder.py |
visitor_data.py | assistant.py |
visitor_data.py | common.py |
worker.py | common.py |
worker.py | content.py |
worker.py | visitor_data.py |
补充依据:PRODUCT.md、README.md、docs/employee-workbench.md、docs/adaptive-design.md、deploy/*.timer、ops/state.md。历史记录中的 52 项测试 / 22 个浏览器用例属于此前交付证据,本次报告的自检单独记录,不将其当成新的功能测试。