把消费问题转化为可审查、可验证、可恢复的个人决策。
Requirement · Claim/Evidence · Decision · Persistent Task · Safe Recovery · Category Package · Gold Gate
ChoiceMind 是面向单个消费者的智能消费决策 Agent。它把需求、候选方案、可定位证据、约束、风险和未决信息组织成可审查的 Decision;目标不是生成商品榜单,也不代替用户下单。
P0:合同、边界、安全、持久化、恢复和可验证底座已完成。 P0-01 至 P0-12 均已完成产品验收、代码合并和 Issue 关闭。项目当前停止在 P0/P1 决策边界,P1 尚未启动;该状态不代表 V1.0 完成、生产认证或正式发布。
本仓库公开代码与工程配置;内部 ADR、规格书、验收证据和 handoff 按仓库策略保留在本地,不随公开仓库发布。
- 版本化 Requirement、Candidate、Claim、Evidence、Decision、RunEvent 与错误合同,以及失败关闭的 Decision Basis 校验。
- Web、API、Orchestrator、Data Worker 四服务健康链和确定性合成决策纵向。
- ChoiceMind 持有业务语义,CoreMind 通过薄 Runtime Adapter 接入;精确候选的隔离兼容门禁已完成产品验收。
- Postgres/pgvector 权威任务状态、同事务 Outbox、Redis Streams Publisher、租约 Worker、幂等完成和故障恢复。
- P0-04 根级工程验证、真实 Postgres/Redis 集成与 Compose 故障验收通过;Issue #4 已完成产品验收并关闭。
- Postgres 持久化公开 RunEvent 与单调游标;Redis 只发送实时通知,通知不可用时 SSE 仍从 Postgres 轮询恢复。
- Web 支持按
Last-Event-ID补发、重复事件去重和乱序排序;刷新、断线与 API 短暂不可用后可恢复权威任务状态和已有事件。 - P0-05 根级工程验证、真实八服务 Compose 与 Chrome 产品验收通过;PR #33 已合并。
- API 从受信任服务端配置派生 Principal,任务与 RunEvent 按 User 所有权过滤;
USER、ADMIN与SUPERADMIN角色均不能据角色本身读取其他 User 的私有对象。 - CredentialVault 为每条 Secret 生成独立数据密钥并使用信封加密,主密钥不进入数据库密文;Secret 无法序列化或从受控使用回调逸出,凭据访问先写审计再释放明文。
- RiskPolicy 区分
ALLOW、DENY与REQUIRE_CONFIRMATION;CoreMind Provider 调用缺少绑定用户与操作的确认或 EgressGuard 时失败关闭,获准调用只留下不含正文、响应或 Secret 的最小 EgressRecord。 - P0-06 根级验证、真实 Postgres/Redis、Compose 隔离与故障矩阵、独立双轴复审和产品验收通过;PR #35 已合并,Issue #6 已关闭。
- RuntimeSnapshot、EffectReceipt、Checkpoint 和恢复许可共同约束暂停、恢复、取消与副作用结果复用;started/unknown 副作用保持人工核验或拒绝自动恢复。Issue #17 与 Issue #9 已关闭。
- Qwen、Embedding、Reranker、PaddleOCR-VL 与 MinerU 的统一版本化合同和固定样本 smoke 已通过产品验收;PR #39 已合并。
- 受控公开网页可经 Egress/SSRF/MIME/大小门禁、本地 HTML parser、内容寻址对象、pgvector 与本地 Reranker 形成可定位 Evidence;PR #40 已合并,Issue #11 已关闭。
这些是当前代码与验收范围内的证据,不等于真实消费数据质量、完整 Provider 认证、生产安全或发布资格。
Web(仅转发服务端持有的身份)
→ API(Principal / User 所有权 / Audit Record)
→ Postgres / pgvector(权威状态)
→ Transactional Outbox
→ Redis Streams(可重建传输)
→ Orchestrator Worker
→ AgentRuntimePort / CoreMind Adapter
→ RiskPolicy / EgressGuard
→ Provider(尚未完成真实认证)
Redis 只承担可恢复的传输职责,不能覆盖 Postgres 权威事实;Provider 与 Runtime 输出均视为不可信输入,必须经过 ChoiceMind 合同校验。
Postgres(权威任务状态与持久 RunEvent)
→ Redis 实时通知(非权威,可降级)
→ API SSE(Last-Event-ID 补发)
→ Web 刷新与断线恢复
| 切片 | 状态 | 公开结果 |
|---|---|---|
| P0-01 / P0-02 / P0-03 | 已完成 | 领域边界、四服务基线、首个合成 Decision 纵向 |
| P0-07A | 已完成 | 最小 Runtime Adapter、候选兼容门禁、本地合成模型冒烟 |
| P0-04 | 已完成 | 持久任务、同事务 Outbox、Redis Streams、幂等 Worker |
| P0-05 | 已完成 | 持久 RunEvent、单调游标、SSE Last-Event-ID 回放与 Web 恢复 |
| P0-06 | 已完成 | 服务端身份与 User 隔离、CredentialVault、RiskPolicy、EgressRecord 与审计路径 |
| P0-07B / P0-09 | 已完成 | Runtime 事件、快照、收据、恢复许可与副作用安全 |
| P0-10 | 已完成 | 五个本地模型/解析服务的版本化合同与真实固定样本 smoke |
| P0-11 | 已完成 | 受控公开来源、本地 HTML 解析、对象引用、可定位 Evidence 与本地检索 |
| P0-12 | 已完成 | 合成 Category Package、core 零差异、统一 Gold Gate、EvaluationReport、证据索引与固定六服务 smoke;PR #41 已合并 |
每个 Phase 切片只有在工程证据、独立审查、产品验收、代码合并和 Issue 证据同步分别完成后,才能标记为“已完成”。Phase 完成时必须同步更新本表、上方状态说明、已验证能力、必要的社区文档和 GitHub About;详细清单见贡献指南。
- Node.js
22.22.1 - pnpm
11.21.0 - Python
3.14.6 - uv
0.11.19 - Docker(运行 Linux Compose 或真实 Postgres/Redis 集成时需要)
corepack pnpm install --frozen-lockfile
uv sync --frozen --project services/data-worker --group dev
corepack pnpm --filter @choicemind/web exec playwright install chromium
corepack pnpm devWindows 本地开发也可以在仓库根目录双击 start_all.bat,或在 CMD/Windows Terminal 中执行:
start_all.bat脚本会检查仓库声明的 Node.js/pnpm 版本、uv、Docker Engine/Compose、已安装依赖和固定端口,然后启动 PostgreSQL、Redis 以及现有 pnpm dev 全部应用服务。所有应用日志保留在同一窗口并带服务名前缀;修改 Web 源码后由 Next.js 开发服务器热更新。按 Ctrl+C 会终止脚本创建的应用进程树并停止本次基础容器,PostgreSQL 与 Redis 命名数据卷不会删除。
本地数据库密码首次启动时随机生成,只保存在当前 Windows 用户的 %LOCALAPPDATA%\ChoiceMind\development,不会写入仓库或输出到终端。首次打开前端后,按照页面提示创建第一个 SUPERADMIN;后续账号与登录状态持久保存在本地 PostgreSQL。依赖或端口不满足时,脚本会用中文指出具体修复动作并返回失败。只做启动前检查而不启动服务,可执行 start_all.bat --preflight-only。
启动后可访问:
- Web 对话决策工作台:http://127.0.0.1:3000
- P0 合成决策开发验证页:http://127.0.0.1:3000/dev/synthetic-decision
- API 健康汇总:http://127.0.0.1:3100/api/v1/system/health
- Web、API、Orchestrator、Data Worker 的存活端点分别位于
3000、3100、3200、3300端口的/health/live
首页使用真实本地账号、Conversation、消息和 Requirement Revision;刷新或重启后从 PostgreSQL 恢复。研究来源、Provider 与最终 Decision 仍由后续 P1 纵向接入,当前首页不会用合成商品结果冒充真实研究。固定合成需求与证据仅保留在开发验证页,不访问真实商品、价格或用户凭据。
Evidence ingestion 入口不改变现有 synthetic Decision Runtime。链路为:精确批准的 HTTPS URL → SSRF/DNS/MIME/大小/Egress 门禁 → SHA-256 内容寻址对象存储 → data-worker 本地 HTML 解析 → 可定位 Public Web Evidence → 本地 Embedding → pgvector → 本地 Reranker。Postgres 只保存来源、locator、哈希、对象引用和向量元数据,不保存网页原始正文。
仓库内固定 HTML 快照用于离线测试。P0-11 已对获批的 https://example.com/ 完成一次真实闭环并通过产品验收;再次访问或更换来源仍必须明确目标 URL 并单独取得授权,历史验收不自动授权新的外传。
$env:CHOICEMIND_DATABASE_URL = "postgresql://..."
$env:CHOICEMIND_EVIDENCE_SOURCE_URL = "https://已批准的精确地址/"
fnm exec --using=22.22.1 -- pnpm.cmd --filter @choicemind/evidence-ingestion smokeCompose 按需入口使用 evidence-smoke profile,默认不会随基础服务启动:
docker compose --profile evidence-smoke -f deploy/compose/compose.yaml run --rm evidence-smoke冒烟报告只输出状态、ID、URL、哈希、parser 版本和检索结果,不输出网页正文或凭据。对象文件保存在独立 evidence-objects 卷中。
统一入口使用合成折叠露营桌 Category Package 经过现有 DecisionTaskExecutor 生成合法 Decision,并把合同正反例、失败语义、用户隔离、秘密脱敏、事件重放/恢复、core 零差异及当前六服务合同结果汇总为机器可读 evaluation-report.json 与 evidence-index.json。任一阻断门禁失败时整体返回 P0_FAILED。
$env:CHOICEMIND_LOCAL_SMOKE_REPORT_PATH = ".artifacts/p0-12-local-services-smoke.json"
fnm exec --using=22.22.1 -- pnpm.cmd smoke:local-services
fnm exec --using=22.22.1 -- pnpm.cmd p0:gold `
--local-service-report ".artifacts/p0-12-local-services-smoke.json"当前六项为 Qwen 模型、Embedding、Reranker、PaddleOCR-VL、MinerU 和 ChoiceMind HTML parser。2026-08-26 已在获批范围内各执行一次固定合成样本 smoke,六项均通过;随后统一 Gold Gate 返回 P0_PASSED 且无阻断项,Issue #12 已完成产品验收并通过 PR #41 合入。该结果不等于生产能力认证、V1.0 完成或正式发布。再次运行真实 smoke 仍必须单独确认精确端点;旧五服务报告会被明确拒绝。
fnm exec --using=22.22.1 -- pnpm.cmd verify该命令覆盖 lint、typecheck、测试、UTF-8 检查和构建。单项通过不能替代真实依赖验收、产品验收或生产认证。
docker compose -f deploy/compose/compose.yaml config --quiet
docker compose -f deploy/compose/compose.yaml up --buildCompose 用于开发与故障恢复验证,不代表生产部署已经完成。
- 提交 Issue 或 PR 前请阅读贡献指南与社区行为准则。
- 安全问题不要公开披露,请按安全策略私下报告。
- 项目采用 MIT License。