Files
Jyotisha/docs/tasks/PROGRESS-consult-smalltalk-fastpath-20260920.md
T
jesse-uxandClaude Code 539d4daee4
Independent Staging Quality Gate / validate (push) Successful in 9m35s
Independent Staging Quality Gate / publish (push) Successful in 3m52s
feat(consult): add free model-classified smalltalk fast path
Keep full consultation tool contracts unchanged. Persist short replies and refund the original reservation atomically while recording actual model usage. Verify Linux frontend 3566/3566, database 40/40, Static home and gzip +0.0493%.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-09-20 12:58:34 +08:00

99 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PROGRESS · 普通对话寒暄快速通道 · 2026-09-20
## 状态与边界
本地实现和主会话独立审查完成;审查发现的 SDK 原文日志与无效输出 usage 丢失两项已修复并复验。**Linux 前端全量、标准 DB、tsc/lint、完整构建与 Static/gzip 均通过**;真人模型/余额/刷新验收仍缺受控登录态,不宣称已交付线上。分支 `codex/consult-smalltalk-fastpath-20260920`,实际基线 **fcad06372**,不是任务书成文时的 09b41009。用户授权补验后提交并推 staging;当前记录写于提交前,门禁/部署待核验。未 stash,未改 workflow/main/DNS,未读凭据、未打真实模型;所有改动只在授权工作树。
## 实现清单
| 范围 | 实现 |
| --- | --- |
| 分类 | consultation-smalltalk.ts:同一 selectedModel,裸 Agent 无 Skill/tools/memory,maxSteps=1、maxRetries=0、96 输出 token、thinking disabled;本轮可见问题 + 最后完整相邻问答 role/text + 称呼;strict union,≤20 字回复形状;3 秒 Promise.race + abort,任何不确定/错误回 consult |
| 路由 | resolveConsultationQuestion 与预留/问题落盘之后、主 Agent/标题/摘要之前分流;仅 entrypoint undefined;三个特殊入口保持原链(旧校正入口仍拒绝);寒暄不启动标题/摘要模型 |
| 流 | 沿用实际 application/x-ndjson,不另造 SSE 协议;先成功持久化/退款再 answer.delta + run.completed(responseKind=smalltalk),无 activity/receipt;失败只 run.failed,不能声称成功;断连不打断服务端结算 |
| SQL | 仅新增 complete_consultation_free 函数,无表变更;沿用 advisory lock/owner/session/status 校验;complete_usage 写真实成本;按 reservation.credit_amount 退款并记交易;request completed、reservation released,释放订阅 quota;同回复重试成功不退款,不同回复冲突、取消拒绝、收费完成不可退 |
| 权限 | 仅 service_role grant,无 admin_runtime 新 grant,撤销 PUBLIC/anon/authenticated;服务端 createAdminSupabaseClient 使用 service role,客户端 RPC 是 authenticated,responseKind 自报不产生免费权力 |
| UI | responseKind 从流/header→hook→StreamingReply/ChatMessage→transcript/row→cloud read 贯穿,刷新不重建虚构步骤;寒暄隐藏思考/活动/技法;未有真实活动时不造分类思考;Home 只新增一行 prop,0 新 useState/useRef |
| 语气 | 豁免移到共享 productConversationVoice,三模式均含;领域咨询原开场骨架不改,Skill 版本不变 |
| 观测 | classifier 独立封闭机器码、耗时/tokens/按模型价格估算 cost;成功咨询账本合并分类 usage,寒暄记其真实 usage;缓存 normalized usage 合并不丢失;无问题/姓名/出生资料/输出原文日志 |
## 保持的安全合同与产品边界
- BUG-922/923/937/938 及相关历史已检索阅读;最大号 975,本轮新增 976/977。没有修改 index.ts every turn 两句、consultationNatalPrepareStep/WindowPrepareStep、contractReady 或原 stream-agent-response;两处 requireTool:true 保持。
- **预留仍在分类前**。零余额无有效订阅用户仍受前端守卫/服务端 402 限制;没有擅自改计费入口为匿名无限免费模型代理。profile/mode/session 校验也保持。
- 历史可见正文可能含此前解读,任务允许这一对历史;只作为用户语义数据,不是工具/系统星盘证据,提示词禁止复述盘上主张。未声称能力剥夺可数学保证模型零幻觉。
- 订阅无 credit debit 时不加点;reservation released 不再计入 reserved/completed quota,ledger 仍有实际成本。定向覆盖无点数来源分支;真实订阅授权链见真人清单。
- 供应商忽略 abort 时最多等待约 3 秒;晚 usage 用 late_usage 观测,不追写已完成/释放 reservation,避免改变状态和重复账务。供应商错误/超时未返回 usage 为 unknown,不伪报真实零成本;价格字段计算是既有模型价格估算,不是供应商账单对账。
- 误判成本按任务书:咨询误判成寒暄会收到一句短回应,需要再问一次;产品接受它比整轮合同失败轻。漏判仍按原咨询处理,宁可多算一次,不用关键词/正则/长度补分类。假模型测试只证明传输/路由/严格解析,不证明真实语义准确率或延迟 P50。
## 验收
日志保存在本树 `artifacts/smalltalk/`,都是本地执行产物,不应整目录提交(含临时迁移副本与虚构 DB fixture 日志)。
| 检查 | 未改基线 | 最终候选 | 结论 |
| --- | --- | --- | --- |
| tsc --noEmit | 0 error | 0 error | 通过 |
| npm run lint | 0 error / 120 warning | 0 error / 120 warning | 无新增 warning,不顺修旧 warning |
| npm test | 3486 tests,3409 pass / 77 fail | 3522 tests,3444 pass / 78 fail(最终 `npm test -- --test-concurrency=2`) | 既有 77 个失败名称逐项相同;新增 1 个新 DB 测试被同一迁移镜像问题阻塞,不称全绿 |
| 标准 npm run test:db | 39 tests,11 pass / 28 fail | 40 tests,11 pass / 29 fail | 原 28 个失败名称逐项相同,新增 RPC 测试在迁移阶段被同一 duplicate filename 阻塞 |
| 新功能/适配合同定向 | 无新增用例 | 主会话独立 59/59 | 真实 SDK + 假模型合法/非法/供应商错误、隐私和成本、UI SSR、voice、billing/title/audit 合同 |
| 旧边界相关联合定向 | 基线同类 EPERM | 65 tests,64 pass / 1 fail | 唯一 general runtime Skill symlink EPERM;BUG-922/923 静态合同通过 |
| 新 RPC 隔离 PostgreSQL 17 | 无新增 RPC | 执行方 1/1,主会话独立复跑 1/1 | 主会话逐文件确认临时迁移集 154 个 SQL 与仓库原文一致,真实 SQL、真实并发连接 |
| Next build | 编译成功后页面收集因 Skill alias EPERM 失败 | 主会话最终编译成功(7.6s),收集 `/api/birth-time-guide` 时同类 symlink EPERM | 未通过,不改 loader 绕过 |
| `/` Static / 首屏 gzip | 无完整产物 | 无完整产物 | **blocked;没有 ±2% 证据** |
| pre_work_check | remote verified;focused 23 pass / 1 fail | 未变更 Python | 缺 .workbuddy 镜像断言;不造目录 |
### 定向数据库证据
标准命令扫描两迁移目录时遇到 Windows 检出的 Git symlink 普通文本,报 `duplicate migration filename: 20260814025000_personal_report_document_v2.sql`。未改 runner/旧迁移/既有断言。将两目录真正 SQL 文件逐字节复制到本树 artifacts 临时目录,跳过仅含相对路径的镜像占位文本,重复真实文件必须内容一致,共 154 个 SQL;用已有 MIGRATIONS_DIRECTORY 参数运行同一新 DB 测试。
覆盖:service_role 可调用,anon/authenticated/app_runtime 不可;精确退 3 点不是写死 1;同请求重试仅一次退款/一条回复;不同回复冲突;他人 user/session 拒绝;取消后拒绝;普通已完成收费咨询拒退;23 input / 7 output / 91 microusd 实际入账;负 token 触发事务回滚后重试成功;无点数来源不加点且释放计数;两个 PostgreSQL 连接并发 free/cancel,余额守恒且只有一个 refund。并发测试不是生产订阅链或 staging 验收替代。
### 断言调整三栏
| 原值 | 新值 | 原因 |
| --- | --- | --- |
| usagePayload await usage | await mergeUsage([usage, classificationUsage]) | 必须等待并计入分类成本,不弱化完成时机 |
| 标题测试切片截止 usageStartedAt | 截止 usagePayload | 计时前移到分类前;原 expectedTitle/所有权/CAS 断言保留 |
| auditRows 直接 receipt.techniqueAuditTable(两测试) | smalltalk ? undefined : 原字段 | 寒暄不得显示技法;咨询字段不变 |
| completed.receipt 隐式必有 | assert.ok(receipt) 后相同 domains 深比较 | 新协议允许寒暄无 receipt,旧咨询仍显式必须有 |
一次编辑脚本在 Windows 写入 CRLF 导致源码逐字合同额外失败,已恢复被改文件原 LF,不修改业务或放松相关断言来掩盖。新 SQL 测试在标准命令中也被同一个既有 duplicate migration 阻断,会比基线多一个环境失败,不能宣称失败总数完全不变。
## 主会话独立审查与最终证据
- SQL、RPC 角色、迁移打包/加载静态复核未发现确认缺陷;真实数据库独立回归通过,不等于标准整套 DB 通过。
- 修复审查发现:Mastra 默认 strict 校验会把非法模型输出附入 SDK 日志,同时在读取 usage 前抛错。现对独立分类 Agent 与结构化输出处理器使用 `noopLogger`,结构化生成采用保留结果的 `errorStrategy: warn`;外层原有 strict schema 仍是唯一接纳门。真实 SDK 内存假模型覆盖合法输出、非法 schema、坏 JSON、供应商异常;验证一次调用、无工具、96 token cap、原文不进 console/stdout/stderr、非法输出仍保留 23/7 tokens。
- 最终证据:`review-final-targeted.log`(59/59)、`review-final-full-concurrency2.log`(3522/3444/78)、`review-final-failure-comparison.json`(全量与 DB 逐项名单)、`review-final-tsc.log`(0)、`review-final-lint.log`(0 error/120 warnings)、`review-final-db-targeted.log`(1/1)、`review-final-build.log`(EPERM)。
- 原默认并发多次出现内存分配失败,导致部分测试未完整收集;这些失败日志保留,不用作最终测试总数。中途构建还出现 `.next` rmdir UNKNOWN;最终单独复跑重新到达编译成功后 Skill symlink EPERM。未改业务、断言或依赖去迎合环境。
- 执行与审查子代理最后因服务端 API 403 insufficient balance 中断;主会话接手完成上述复验与记录,未将中断代理的待完成工作冒充结果。
- 本轮执行期间远端引用前进至 `5049e784`,相对基线仅新增另一份任务书及索引。未在脏工作树拉取;未来提交/推送前必须重新 fetch、核对 BUG 编号和整合任务索引,不能直接覆盖他人文档。
## Linux 隔离补验(用户授权继续,2026-09-20)
- 主机 Docker Desktop:4 CPU / 8 GB;使用本轮专属 runner、DinD 和 named volume,不挂宿主 Docker socket,不访问其他会话容器或凭据。Node `22-bookworm`(拉取 digest `sha256:dd5847a04b0deee391fa145f1f4c6d214196668b6bcc7988ebed67249f226844`),容器内按未修改的 package-lock 执行 `npm ci`;两侧依赖副本相同,不复用 Windows node_modules。
- 基线从根目录 `git archive fcad06372`;候选为相同 archive + 33 个本轮变更文件。8 个 Git symlink 均保真,overlay 全部逐字节匹配工作树,输入哈希清单 `artifacts/smalltalk/linux-input-manifest.json`。为 Git 文件跟踪合同建立仅容器内使用的临时 Git 快照,非发布提交。
- runner 与专属 DinD 共享网络命名空间和 `/work` volume;`DOCKER_HOST` 仅 loopback,无发布端口,`TMPDIR=/work/tmp`,fixture 上限 1;真实 PostgreSQL 17、标准双迁移目录,无 MIGRATIONS_DIRECTORY 绕行。
| 检查 | Linux 基线 | Linux 候选 | 结论 |
| --- | --- | --- | --- |
| tsc | 0 error | 0 error | 通过 |
| lint | 0 error / 120 warnings | 0 error / 120 warnings | 无新增 |
| 首轮全量 | 3530 / 3527 pass / 3 fail | 3566 / 3563 pass / 3 fail | 失败名称逐项相同:缺 python3-yaml 一项、rsync 两项;原日志保留 |
| 补齐系统依赖后最终全量 | **3530/3530,0 fail/skip** | **3566/3566,0 fail/skip** | 新增 36 项,0 新红;`npm test -- --test-concurrency=2` |
| 标准 test:db | 39/39 | 40/40 | 通过,新增免费结算真实库回归包含在内 |
| npm run build | 退出 0,`○ /` | 退出 0,`○ /` | 首页 Static 不变 |
| 首页 JS gzip | 621,299 B / 25 文件 | 621,605 B / 25 文件 | +306 B / +0.0493%,在 ±2% 内 |
- gzip 口径:各自全新 `.next` 的 `.next/server/app/index.html` 中去重 `/_next/static/**.js` 引用,每文件 gzip level 9 后求和;不混入其他路由、旧 hash chunk 或 CSS。复算脚本与逐文件清单在本地 artifacts,不整目录提交。
- 日志:`artifacts/smalltalk/linux-logs/{base,proposed}-{tsc,lint,test,db,build}.log` 与 `*-gzip.json`。脚本末尾退出 0 不能代表全部测试成功,逐项结果按表中原始日志记录。
- Gitea REST Actions API 未认证为 401;公开 `/root/Jyotisha/actions` 网页可读,可在不读取凭据的前提下核对门禁。推送前 staging health 为 `12fdaed90b81014378fe5eaa9231e50d2b838a37`,不是本轮部署证据。
- 远端期间另有校正研究提交 `932f2fff`(BUG-978~980),本轮编号无冲突。提交后只整合本分支,保留双方共享文档;不操作他人工作树、不 stash、不提升 main。
## 剩余未做 / 交接
1. 独立代码审查与 Linux 平台验收已完成;最终日志 `linux-logs/{base,proposed}-test-final.log`,机器对照 `final-test-comparison.json`。隐私扫描 `commercial_privacy_artifact_scan.py --json` 为 pass、0 finding(3188 文件)。
2. 提交后整合最新 `origin/staging`、快进推送、核对远端 SHA 与 Gitea 门禁/自动迁移/部署。远端至 `03cba478` 额外两提交仅跨午夜任务书与索引,需保留并行工作。
3. 受控 staging 账号三模式真实模型语义、延迟、零点/订阅、取消/断线/刷新与余额走查,清单 `docs/testing/consult-smalltalk-fastpath-20260920.md`。
4. BUG-976/977 不提前标 resolved。没有获得真实模型 P50,不按猜测降低 3 秒上限。