Repository navigation
Description
Problem Statement
用户希望围绕本人绑定的练习提交获得有依据、可核对的分析。现有 Agent 已具备上下文重新读取、只读模型工具循环、引用核验、独立 judge、预算和运行隔离,但题目与评论的运行时投影缺少完整来源信息,普通在线检索仍使用固定合成语料。用户难以判断结论究竟来自提交事实、题目、评论还是通用材料,也无法完整看到资料读取、分析和核验阶段。
本规格基于三方只读规划及关键源码核对;这里的现状是规划基线,不代表已完成产品运行验收。实现前需重新确认当前源码。首个实现批次仅交付 P1。
Solution
增强证据编排,沿用现有 Agent 内核。用户选择的题目、评论和既有模式下逐轮授权的源码,成为具有来源、范围和本轮读取标识的请求期资料;回答只引用本轮实际取得且通过核验的片段。系统区分事实、判断、假设和下一步,并显示实际执行阶段。
按 P1 真实证据接线、P2 分析契约、P3 真实阶段展示、P4 联合验收发布推进。保留当前答案协议、SQLite 结构、身份授权、预算、取消隔离和确定性保存流程。
User Stories
- 作为练习用户,我希望分析绑定本人合格提交,以便避免串用他人的提交或比赛上下文。
- 作为练习用户,我希望所选题目在分析时重新读取并核对归属,以便回答使用正确材料。
- 作为练习用户,我希望所选题解评论与论坛评论分别标识,以便理解它们的来源与适用范围。
- 作为练习用户,我希望评论只被用来说明评论提出了什么,以便不会把他人的观点误当作我的代码事实。
- 作为练习用户,我希望每轮自行决定是否按已有模式授权源码外发,以便保持对源码使用的控制。
- 作为练习用户,我希望没有源码时系统不诊断具体实现缺陷,以便避免误导。
- 作为练习用户,我希望引用能对应本轮实际取得的片段,以便核对回答依据。
- 作为练习用户,我希望资料被截断时得到明确说明,以便了解分析范围。
- 作为练习用户,我希望资料不可访问或已经失效时在分析前看到失败,以便不为无效分析消耗模型额度。
- 作为练习用户,我希望无命中时系统明确说明材料不足,同时仍能解释已知状态或给出一般建议。
- 作为练习用户,我希望系统不把合成测试资料当作真实分析依据,以便信任引用的来源。
- 作为练习用户,我希望事实、判断、假设和下一步容易区分,以便知道哪些结论仍需验证。
- 作为练习用户,我希望核验失败保持可见,以便不会把删减后的回答误认为完整成功。
- 作为练习用户,我希望看到实际的读取、分析和核验进度,以便知道当前正在做什么。
- 作为练习用户,我希望取消、重试和重连不串轮,以便旧运行结果不会覆盖当前会话。
- 作为练习用户,我希望刷新后仍能读取历史回答,同时旧历史缺少新增阶段信息时也能正常显示。
- 作为练习用户,我希望源码正文不进入可见回答、历史、事件或检查点,以便保护私有实现。
- 作为练习用户,我希望确认学习计划与保存计划保持独立,以便只有明确保存才产生业务写入。
- 作为运营者,我希望模型用量未知或预算超限时系统拒绝放行,以便账目与实际执行保持一致。
- 作为运营者,我希望升级可逐批验收和回滚,以便出现安全或兼容问题时暂停分析而不丢失数据。
Implementation Decisions
保持的边界
- Agent 继续是独立 Python 服务,通过现有 Auth/App HTTP 契约工作,不连接业务数据库。
- 保留一个有界只读模型工具循环及现有引用 judge,不新增模型可控写工具。
- 保留本人、普通练习、已知终态提交资格检查;不扩大已有源码授权模式。
- 确认不等于保存;保存结果未知时沿用原幂等键恢复。
- 保留现有管理员开关、模型预算 purpose、用量核验和运行隔离。
- 抓取正文只在请求内存存在;不新增数据库表或分析 JSON 列。
P1:请求期资料与检索
- 每项文本资料保留种类、已验证对象标识、本轮读取标识、访问范围、信任标记、位置、截断标记和有界正文。
- 文本统一视为 untrusted-data;访问校验通过不等于内容可信。评论不并入可信提交事实。
- 提交事实只保留现有必要字段,不顺带加入测试输入、输出、预期值或错误详情等信息。
- 不假设上游存在 updatedAt、作者或版本接口。没有可靠上游版本时以本轮 runId 标识快照,不宣称它是上游历史版本。
- 一轮使用取得的快照,下一轮重新读取。读取校验不是持续授权保证;不承诺模型调用途中能够感知上游权限撤销。
- 保留题目最多 8,000 字并标记截断、两类评论合计最多三条且每条超过 2,000 字拒绝的现有语义;源码保留原有上限和逐轮同意机制。
- 题目与评论按确定性范围形成片段,片段目标上限沿用现有 1,200 字。长单行必须有界,每片身份唯一且能定位回本轮原始范围。
- 复用现有资料文档、关键词检索及引用结构;查询最多返回三条命中,答案最多三条引用。不重复把全部正文与全部片段塞进提示词。
- 服务端 retrieved 只记录实际交给模型的命中;引用继续检查同轮命中、来源完整性及 supports/derivable。
- 普通在线产品路径不回落合成语料;测试可以显式注入合成资料。P1 不自动接入仓库文档或外部资料库。
- 无命中时允许解释已知提交状态和给一般建议,但不伪造引用或断言具体实现缺陷。
- 评论可支持“该评论提出某建议”的归因,不能支持“该提交存在某缺陷”的实现判断。judge 的可信事实与评论文本分开;仅含“评论”关键词不是充分核验。
- 来源位置由服务端生成,模型提供的 URL 不直接成为可点击导航。
P2:答案与核验
- 保留严格的 text/citations 答案协议,沿用 citation.claim 建立结论和依据的关系;不新增公开 claims 数组或 envelope v2。
- 在正文按需要表达已知事实、分析判断、待验证假设和下一步,不强制每次出现四个标题,不为一般建议伪造引用。
- 没有源码时不把“可能”作为绕过具体实现诊断限制的方式。
- 核验失败仍是可见失败,不静默删除失败主张后报告成功,不自动重复模型调用掩盖失败。
P3:真实阶段与兼容
- 在实际执行边界发出阶段开始/结束事件,阶段限定为 evidence、analysis、verification;保留具体模型和工具事件。
- 阶段 detail 仅包含阶段枚举、结果和安全原因码;runId、seq、时间沿用现有事件封装。
- 不放正文、claim、提示词、源码、来源路径、模型自由文本或私有推理,不显示推测完成百分比。
- 桌面端复用现有 Trace、安全 Markdown、取消入口和错误分类;保留中英文文案。
- 重连使用既有 after 游标,事件重放幂等;旧运行或取消后的迟到事件不能覆盖新状态。
- 旧历史缺少阶段事件仍可读取;新事件保持客户端兼容,不新增存储状态机或迁移。
Testing Decisions
以现有认证 HTTP 分析入口为主要测试接缝:注入可控模型与上游响应,观察响应、实际模型调用次数、事件和持久化结果。前端在既有会话状态与工作区组件边界验证,不测试内部函数排列。低层检索测试只补分片和定位等 HTTP 入口难以精确覆盖的边界。
复用现有 Agent 服务、检索、引用、注入防护、安全和会话事件测试,以及 Console API、会话状态和工作区测试。每批从受影响检查开始,不另建烟测框架。
| 验收组 | 可观察的通过条件 |
|---|---|
| 身份和资格 | 他人、比赛中、非终态或不可访问资料不能进入分析;适用拒绝路径模型调用为零 |
| 资料绑定 | 所选资料重新读取并验证归属;超限、失效和异题行为明确 |
| 分片 | 长单行有界,分片标识与范围准确,截断可见,检索排序与零命中稳定 |
| 引用 | 旧轮引用、伪造来源及越界片段被拒绝;无合成回落;评论只支持内容归因 |
| 注入 | 恶意题面/评论不改变系统指令、工具范围、源码授权或核验标准 |
| 私密信息 | 源码正文不进入可见回答、历史、事件或检查点;阶段事件无私有载荷 |
| 运行隔离 | 并发、取消、重试、删除及重连不串轮,重放幂等 |
| 预算 | 超限与用量未知不视为成功,不重复计费;取消不伪称撤回已发生用量 |
| 保存 | 确认不触发保存;unknown 使用原幂等键恢复 |
| 客户端兼容 | 新旧事件与旧历史均可读取,原有错误分类和取消入口保留 |
P1 优先执行受影响 Agent 测试;P3 加 Console 相关测试、类型检查和适用 lint。所有实现批次审查差异和空白问题,同步受影响核心文档;文档变动影响语料版本时同步绑定。
P4 真实模型验收使用明确授权的测试资料、目标环境和预算:AC、WA 各覆盖“题目加评论”“仅题目”“无选材”;已有授权源码模式另测,不借此扩大普通模式能力。每例核对回答语义、引用、用量和失败原因。completed 不是质量通过;安全拒绝也不冒充功能成功。首次结果建立基线,不预设成本、通过率或延迟收益。
Out of Scope
- 四套 Agent 服务/循环/存储、嵌套委派、多 Agent 并行。
- 向量数据库、通用代码沙箱、外部知识库、自动引入仓库文档。
- 新的源码授权能力、业务数据库直连、模型可控写工具。
- claims 关系图、新答案协议、额外分析存储列、多套模式开关。
- 移动端改造、私有推理展示、虚构进度或置信度分数。
- 执行本规格、部署产品或把规划状态标成已验收。
Further Notes
任务与依赖
| 任务 | 交付内容 | 真正阻塞项 | 退出条件 |
|---|---|---|---|
| T1 请求期证据投影 | 保留资料来源、范围、快照与信任语义 | 无 | 权限/资格/限额在分发前检查;正文仅请求期存在 |
| T2 本轮实际检索 | 将 T1 资料接入现有检索与引用链,去除在线合成依赖 | T1 | 引用只来自本轮实际命中;零命中不补造;评论不升格为源码事实 |
| T3 P1 回归与文档 | 完成首批端到端边界证明和契约说明 | T2 | 授权、拒绝、分片、恶意评论、旧轮引用和源码泄漏回归通过 |
| T4 分析契约 | 区分事实、判断、假设、下一步,保留答案协议 | P1 验收 | 无源码不诊断实现;核验失败可见;预算和 judge 不削弱 |
| T5 服务端阶段事件 | 发出真实读取、分析和核验阶段 | 阶段契约及 P1 流水线 | 白名单载荷,异常/取消无假成功,运行隔离不变 |
| T6 桌面阶段展示 | 在既有 Trace 中呈现实际阶段 | T5 契约 | 重连、重复、旧 run、迟到事件和旧历史兼容 |
| T7 产品入口验收 | 联合回归、有预算真实模型验收与发布决策 | T3、T4、T6 | 功能、语义、安全、预算与恢复均有相应证据 |
四个交付批次
- P1:T1–T3 为首个可独立合并、完整回滚的 PR,不单独交付暂时失效的中间接线。
- P2:T4;P1 通过后合并。
- P3:T5–T6;阶段契约稳定后可与 P2 部分实现并行。
- P4:T7;无代码问题时不创建空 PR,必要修复单独交付。
上线与回滚
发现未验证引用被放行、源码或阶段载荷泄漏、用量未知仍成功、跨轮污染时,使用既有管理员开关暂停分析。各批整体回滚到上一应用版本,保留 SQLite、历史、幂等记录与预算账本,不删除数据、不重置账目。
决策与执行状态
P1(T1–T3)已通过 PR #347 合并,合并提交 dba541f;本地 1,214 项 Agent 测试和当前 head CI 通过,Sol 与远端评审发现均已解决。P2 已通过 PR #348 合并,合并提交 360f8a9;1,214 项 Agent 测试、独立评审及当前 head CI 通过,未变更答案协议或存储。P3 已通过 PR #349 合并,合并提交 6733cec;1,214 项 Agent 测试、863 项 Console 测试、两轮独立评审及当前 head CI 通过。CI 的干净安装与真实业务生命周期检查通过,但不等于真实模型验收。P4 已通过下述限定场景验收,修复经 PR #351 合并;允许现有授权范围内的 opt-in 代码交付,未执行生产部署或扩大启用。ready-for-agent 为原规划标签,不代表生产发布授权。
规划由 Claude Code 通道、Codex 和 DSH 协同形成并经主流程核对。执行元数据表明 Claude Code 通道请求 Sonnet 5.5,实际运行 DeepSeek,因此不能将其表述为三个不同模型的独立结论。这是执行限制,不影响上述约束需要逐条验证。
P4 初始验收(失败基线,保留记录)
已使用本地真实 Auth/App/Submission/Judge、专用测试账号及现有手动预算,取得 AC/WA 两类真实提交,执行各自无选材、仅题面、题面加评论六个场景,并额外执行逐轮授权源码场景。保留了初始失败及修正后的独立记录,没有把重试结果替换成初始成功。
最近六场中 3 场服务端 completed,但只有 AC 无选材回答完成了用户任务;两场题面加评论仅承诺将检索,没有实际工具调用或分析,不能算功能通过。其余三场被边界核验拒绝;额外授权源码场景也未通过。首次还观察到引用 text 为空的协议错误,解析器保持拒绝。P4 功能与回答质量尚不达标,发布判断为不放行,保持现有默认关闭及管理员开关。 剩余工作是定位真实模型未执行检索、空引用或仅输出行动承诺的决策/协议问题,再以同一六场景与源码场景复验;不能通过放宽引用、诊断或预算门禁解决。
已定位一处可独立修复的边界误拦:合法本轮选材引用不能与源码限制说明并存。修复仅允许服务器本轮授权的题面/评论继续走原完整性和独立 judge,旧轮、源码及其他语料仍拒绝;同时明确要求调用 search_evidence,目录本身不是引用依据。离线 Agent 1,221 项通过,修复已通过 PR #350 合并,合并提交 e1ef517;独立评审与当前 head CI 均通过。该补丁不代表 P4 实模质量验收通过。
本次新增 14 次有回执调用,按现有费率记账 7,194 micro-USD(不是平台账单确认);guard 与账本一致,无未知或未结算用量。未重置、增额或新建预算周期。测试开关已恢复原值,测试服务端口已核对关闭,原先运行的 MeiliSearch 保留,未部署生产。
P4 最终验收与交付
修复已通过 PR #351 合并,合并提交 11fe29371ecfdba874a73fa2766aa83eafa946f3;已核对最终 head 84f2c1270aea3a01c0938680360d0c4892b576d3 的必需 CI 通过、自动评审完成且无未解决发现,分支与 main 同步。当前提交本地完整 Agent 套件 1,237 passed;文档契约与空白检查通过。前三轮独立评审最终 APPROVE,并独立运行 301 项相关测试;后续 bot 指出的未来判定误拦已另行复现、修复并通过 15 项定向回归及完整套件。
真实验收经正式 runtime.py、本地 Auth/App/Submission/Judge、DeepSeek 和 Console /api 入口执行,未使用诊断替代运行时。所需七场景加一个混合来源场景均 HTTP 200、completed,且逐篇核对回答内容:
| 场景 | 场数 | 每场实际读取/检索 | 每场引用 |
|---|---|---|---|
| AC/WA × 无选材 | 2 | 无证据工具;说明已知状态、证据限制和可执行下一步 | 0 |
| AC/WA × 仅题面 | 2 | search_evidence 1 次 | 1 |
| AC/WA × 题面加评论 | 2 | search_evidence 2 次 | 2 |
| WA × 逐轮授权源码 | 1 | get_submission_source 1 次 | 1 |
| WA × 授权源码加评论 | 1 | 源码读取 1 次、检索 1 次 | 2 |
八篇回答均完成当前分析任务;有材料时实际检索并引用本轮证据,无材料时保留合理的空引用并明确限制。评论仅支持归因,源码实现判断须有授权源码依据。真实 judge 正反探针覆盖证据限制说明、无源码因果诊断、只承诺行动、合法任意顺序建议以及违背题面保证的建议;不以 completed 状态代替语义验收。
证据覆盖限制: 八场实模运行之后进一步收窄了无引用因果诊断的 review 资格,并修复假设未来判定的状态误拦。保存的无引用答案经新资格谓词确定性 replay 均保持原核验路径;最终回归覆盖新增硬拒绝和状态条件。没有声称在这些最后修改后又执行一轮付费模型矩阵,也没有将既有实测宣称为对所有输入的可靠性证明。
累计账本 500 次尝试,已记录实际成本 396,961 micro-USD(约 $0.397,非供应商账单确认),500 条 guard 回执与账本对齐;unknown/unsettled/pending 均为零。未重置预算、增额或新增周期。早期失败及题面保证冲突的回答保留为失败记录,无自动生成重试掩盖结果。
本地证据位于任务工作树 ignored .local/p4-execution/:matrix.json、acceptance.json、hard-guard-replay.json、budget-after.json、agent-tests-followup.log,以及各正反 probe 记录。测试服务已停止,专用 PM2 应用清空,测试开关恢复原值;保留原运行的 MeiliSearch、历史和预算账本。
发布判断: P4 在上述限定资料与场景内验收通过,代码交付完成。允许沿用现有授权和管理员开关进行 opt-in 使用;本任务未部署生产、未扩大默认启用范围。模型语义判断仍有局限。若发现未验证引用、源码泄漏、未知用量放行或跨轮污染,使用既有管理员开关暂停,并回滚上一应用版本;保留 SQLite、历史、幂等记录与预算账本,不删除数据或重置账目。
完成清单
- P1:本轮实际资料接线、无合成回落、来源和权限边界通过验收
- P2:分析契约与引用语义通过验收
- P3:真实阶段事件及桌面兼容通过验收
- P4:产品入口联合验收、预算证据、发布与回滚决策完成(限定场景,未部署生产)
Activity
feat: ground agent conversations in selected evidence (#347)