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

13 KiB
Raw Blame History

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 秒上限。