149 Commits

Author SHA1 Message Date
maestro 7f014ba246 merge: maestro/tsk_JKAzHuXvSw7h [tsk_JKAzHuXvSw7h] 2026-06-30 09:22:42 +08:00
wangjia d0aa53c79d fix(usage): 修按天分桶时区错位 + 区分账号额度/maestro用量口径 + 成本说明文档 (tsk_JKAzHuXvSw7h)
全局面板「用量」数据问题修复与澄清:

1. 时区分桶根因(store.ts):按天/周/月分桶与今天/本月窗口起点原全用 UTC,
   UTC+8 用户本地 00:00–08:00 的 run 被算进前一天、当天窗口晚 8h → 柱状图偏移
   一天、当天偏小。新增 localDay/localMonth,periodStartISO/weekStartLabel/
   usageDetail 改用 daemon 本地时区(SQL 比绝对时刻仍正确)。

2. UI 口径区分(design/ui_kits/console):额度条标注账号级含交互会话,AGENT 卡/
   详情弹框标注仅统计 maestro 任务执行,$ 加 API 列表价估算非实际扣费提示并以 ≈
   前缀,模型列加近似角标。新增 4 个 i18n key×5 语言。

3. 文档:新增 docs/usage-cost-explained.html(两数据源/为何对不上/cost 公式/
   单价表/本地时区分桶/已知近似),登记进 docs/index.html 知识库调研。

4. 测试:budget.test.ts 新增 UTC+8 跨日分桶用例。typecheck + 268 测试全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:18:36 +08:00
maestro ea3ad710ff merge: maestro/tsk_BJLguXuWkyq4 [tsk_BJLguXuWkyq4] 2026-06-30 09:13:27 +08:00
maestro 02371b3f89 merge: maestro/tsk_EmZ6vjtVbrOk [tsk_EmZ6vjtVbrOk] 2026-06-30 09:08:52 +08:00
wangjia 42f9788b0a feat(executor): 人工驳回意见喂回返工 agent prompt (tsk_BJLguXuWkyq4)
照搬现有 L1「上次失败原因」链路,新增平行的「人工驳回意见」注入链路:

- store.lastRejectReasonOf(taskId, gate?):从 approvals 取最近一次 reject reason,
  支持按闸过滤(exec/spec/plan),无 reject 返回 null
- orchestrator.claimOne:按返工角色对应闸装配 task.lastRejectReason 下发 job
  (executor→exec / planner-spec→spec / planner-decompose→plan)
- runner.lastRejectLines + buildPrompt/buildPlannerPrompt 拼接驳回段
  (紧接失败段之后,2000 字截断);buildConflictPrompt 不注入
- types.Task 新增 lastRejectReason 临时装配字段(仅注入 prompt,不持久化)
- test/memory-inject.test.ts:覆盖 store gate 过滤、三处注入、截断、边界、顺序

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:08:26 +08:00
wangjia 0c1f630dca 前端:任务详情展示审批/驳回记录 + 任务行 ID 不被长标题挤掉 + i18n 五语 (tsk_EmZ6vjtVbrOk)
- TaskDetail 渲染 _raw.approvals:闸名·通过/驳回 + 审批人 + 时间,
  驳回用红色边框+红底高亮块突出 reason(t.rejectReason 标签),
  通过用绿色、reason 走低调 ↳ 行;无审批记录不渲染该分区。
- 安全:reason/actor/gate 全部走 React 文本节点(默认转义),
  不经 MaestroRichDoc/innerHTML,避免同源存储型 XSS。
- TaskRow:taskid 拆为独立 flex:none span,title 加 minWidth:0,
  长标题省略号截断时 id 完整不被挤掉;ArchiveRow 同步处理保持一致。
- i18n:zh/en/es/ja/fr 五语新增 rejectReason 键。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 09:04:42 +08:00
maestro e115e065e6 merge: maestro/tsk_sp0DwZ2Kc319 [tsk_sp0DwZ2Kc319] 2026-06-30 08:56:35 +08:00
wangjia 5443ffa21c fix(console): 评审/归档卡片的 markdown 渲染成 HTML
内联评审闸卡片与归档详情此前把 agent 产出的 markdown(plan/spec/
operations)直接塞进 <pre> 当纯文本,满屏裸 ## / - / 反引号未渲染。
改为在 ui_kit 层用 window.MaestroRichDoc(marked + DOMPurify 净化)
渲染,与 TaskTree 既有写法一致;保留 280px 限高滚动与容器样式。

- GateSection.jsx: GateCard doc 改为 undefined,children 内对非
  attention 闸用 MaestroRichDoc 渲染 a.doc;删除未引用的 reportBox 死代码
- ArchiveSection.jsx: doc() 助手由 <pre> 改为 MaestroRichDoc 容器,
  SPEC/OPERATIONS 两块随之正确渲染
- 安全:两处均走 RichDoc 的 DOMPurify 净化,挡住 same-origin 存储型 XSS;
  不绕过 sanitize 直接注入 HTML。CDN 不可用时回退纯文本不崩
- 不改 GateCard.jsx(避免底层组件反向依赖 ui_kit 全局 + 触发 bundle 重编)
- DiffBody 的 <pre> 渲染 git diff(非 markdown)保持不动

类似但未改:console_mobile/MobileViews.jsx 为独立非在线 demo,其
index.html 未加载 RichDoc/marked/DOMPurify,修复需整套引入,超出本次范围。

tsk_sp0DwZ2Kc319

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 08:30:15 +08:00
maestro 382afe3322 merge: maestro/tsk_0u7OP3RFBAqr [tsk_0u7OP3RFBAqr] 2026-06-30 08:05:08 +08:00
wangjia a59588a0ce fix(console): 侧栏项目 agent 徽标改用 s.running,修复 planner/spec 阶段徽标缺失 (tsk_0u7OP3RFBAqr)
侧栏项目 agent 计数徽标原绑定 s.executing(仅统计任务恰处 executing 状态),
与「运行中」青点(s.running)及 tooltip『N agents running』语义不一致。
当 Hard(analyzing/planner) 或 Medium(speccing) 任务有在途 agent 时,s.executing=0
导致徽标缺失(如 maestro 项目)。改取 s.running(runs.status=started,覆盖各阶段)。

新增 test/adapt.test.ts 锁定该映射。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 08:02:22 +08:00
maestro ee9232e575 merge: maestro/tsk_sTHRFtFoHf-G [tsk_sTHRFtFoHf-G] 2026-06-30 07:45:44 +08:00
wangjia 8d3192e7cb app接线: 上传去重响应/已存附件删除/缩略图白名单对齐后端 (tsk_sTHRFtFoHf-G)
- createTask 消费后端去重后的权威 attachments 列表,按入库数报数并提示去重数
- 附件删除 toast 语义由 warn 调整为 ok(attDeleted 为成功语义)
- TaskDetail 缩略图 isImg 收敛到 KIT_ATT_SAFE_INLINE 硬白名单(png/jpeg/gif/webp),
  与后端 src/api/server.ts SAFE_INLINE 一字不差,svg/html 不走 <img src=服务端URL> inline,
  钉死同源存储型 XSS
- i18n 新增 attUploaded/attDeduped 两个带 {n} 占位的 key,覆盖 zh/en/es/ja/fr

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:42:46 +08:00
maestro 80f257171d merge: maestro/tsk_0VF1URfdoe3d [tsk_0VF1URfdoe3d] 2026-06-30 07:41:26 +08:00
wangjia 33bef7f5fc feat(console): 侧栏项目按优先级显示三类计数徽标
左侧项目状态新增数字提示,按优先级展示:
1. 需人工处理数(紫,attention)
2. agent 运行数(青,executing)
3. 被阻塞数(琥珀,blocked)
仅非零显示,固定「人工 > 运行 > 阻塞」排列;折叠态仍单状态点,
任一计数 > 0 时放大。后端 projectSummary 已就绪,仅透出 blocked
并渲染。i18n 五语言补齐 projAgentsTip / projBlockedTip。

tsk_0VF1URfdoe3d

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:34:47 +08:00
maestro db4e6e2fb4 merge: maestro/tsk_ia4uiOfk6ZdV [tsk_ia4uiOfk6ZdV] 2026-06-30 07:25:41 +08:00
maestro eac3575851 merge: maestro/tsk_fTul9G4eutVn [tsk_fTul9G4eutVn] 2026-06-30 07:25:39 +08:00
wangjia 64b8c912ef chore(console): 验证附件创建面板已上线 + 低风险加固(粘贴/拖拽体量上限 + render 副作用收敛)[tsk_ia4uiOfk6ZdV]
任务功能(统一 files 状态 / 缩略图预览 / 单项删除 / 客户端去重 / 5 语 i18n)
已于 65cd5ad、00e6bc7 实现并合并,后端同源存储型 XSS 防护已于 d9d3de2 落实,
逐条核对全部满足,故不重复实现。仅做两处低风险加固(范围限 design/ui_kits/console/**):

- NewTaskPanel.addFiles 增加单文件 25MB 软上限,超限跳过并内联提示,
  新增 i18n key attTooLarge(zh/en/es/ja/fr 五语齐备)
- 缩略图 objectURL 改为在 addFiles 中预生成(ensureThumb),render 仅读,
  消除 map 渲染期写 urlMapRef 的副作用,避免 React 严格模式下重复创建/泄漏

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:23:12 +08:00
wangjia f1ee537ab7 附件内容去重(hash):上传改为内容寻址 + store 按 hash 去重 [tsk_fTul9G4eutVn]
- types: Attachment 增 hash?/size? 可选字段(向后兼容,老数据零迁移)
- 上传端点 POST .../attachments 改为内容寻址:流式计算 sha256,写临时文件再
  按 <sha256>.<ext> 原子 rename;同 hash 已存在则丢弃临时文件(真去重);
  超限/异常清理临时文件不留垃圾。磁盘名仅由内容 hash 决定,杜绝撞名覆盖丢数据。
- store.addAttachments 去重键改为 hash ?? path(later-wins,老数据回退 path)。
- DELETE 端点补注释:附件按 task 隔离,无需跨任务 refcount。
- 安全保持并固化:GET inline 仅硬白名单图片,其余强制 attachment+octet-stream
  +nosniff+CSP sandbox;路径越界防护;hash 命名不含路径可控字符。
- 测试:新增同内容去重/不同内容同名各留一条/响应含 hash+size 等用例。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:22:15 +08:00
wangjia d9d3de26b8 fix(security): 附件 GET 端点防同源存储型 XSS——非白名单图片(svg/html等)强制下载+octet-stream+nosniff+CSP sandbox
maestro 双复审漏掉的真实 HIGH:上传文件与 API 同源,inline 渲染会在 console 源执行其脚本。只对 png/jpeg/gif/webp 允许 inline 预览,其余强制 attachment 下载并改 content-type 为 octet-stream,加 X-Content-Type-Options:nosniff + CSP sandbox 双重兜底。带 SVG 安全单测。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:59:34 +08:00
maestro f443b16649 merge: maestro/tsk_dbtI_ffTJll9 [tsk_dbtI_ffTJll9] 2026-06-30 01:53:41 +08:00
wangjia 00e6bc72e7 feat(console): 附件全链路接线(预览/下载/删除 + 已建任务交互)
- app/src/api.js: 新增 attachmentUrl(inline/下载 URL 构造)与 deleteAttachment 封装
- app/src/app.jsx: taskOps 增 delAttachment(删除→toast→局部刷新)
- design/ui_kits/console/TaskTree.jsx: TaskDetail 附件区从纯文本升级为画廊
  (图片缩略图点击新标签预览 + 下载按钮 + 确认删除),URL 内联零依赖、删除走 taskOps
- design/ui_kits/console/i18n.js: 新增 attSection/attDownload/attDeleteConfirm/
  attDeleted/attDeleteFailed(zh/en/es/ja/fr 五语齐全)

tsk_dbtI_ffTJll9

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:49:17 +08:00
maestro b51163ceed merge: maestro/tsk_tqxHX6NRQ3iA [tsk_tqxHX6NRQ3iA] 2026-06-30 01:40:59 +08:00
maestro 65cd5add5c maestro(tsk_tqxHX6NRQ3iA): 前端 NewTaskPanel:剪贴板粘贴图片 + 拖拽上传 + 统一 files 状态 + 缩略图预览 + 单个删除 + 客户端去重 + 5 语 i18n 2026-06-30 01:36:43 +08:00
maestro bf2f7d8155 merge: maestro/tsk_tttdU3VLCy50 [tsk_tttdU3VLCy50] 2026-06-30 01:33:43 +08:00
wangjia 2500e3e779 后端:附件读取/下载端点 + 删除端点 + addAttachments 落库去重 (tsk_tttdU3VLCy50)
- store.addAttachments:按 path 去重(later-wins),消除重传产生的悬空元数据
- store.removeAttachment:按磁盘文件名(basename(path))移除元数据,返回 removed
- GET /api/tasks/:id/attachments/:name:inline 预览,?download=1 触发下载(RFC5987 文件名)
- DELETE /api/tasks/:id/attachments/:name:先删元数据再尽力删磁盘文件
- 只服务元数据登记过的附件 + resolve/startsWith 前缀校验,杜绝目录穿越
- 新增 test/attachments.test.ts(去重/读取/下载/删除/穿越/丢失/端到端上传去重)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:29:42 +08:00
wangjia 3ffdf411fc docs(CLAUDE.md): 标明 app/+design 为在用 React 控制台、web/ 为遗留——纠正 planner 对前端目标的误判
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 01:01:24 +08:00
wangjia b48d4d8135 Merge branch 'main' into worktree-tidy-jumping-shell 2026-06-29 23:32:40 +08:00
wangjia 5c68bb9324 docs(task-rules): 新增任务执行规则参考 HTML + 登记 docs/index 知识库分类
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 23:32:30 +08:00
wangjia af690701bf feat(web): Markdown 渲染器 + 拆解轨迹 + 需你处理区 + 复审报告折叠卡片
- RichDoc(marked+DOMPurify+highlight.js CDN)统一渲染 gate spec/复审报告/任务树 SPEC;- Transcript 组件:拆解评审「拆解轨迹」懒加载 planner run transcript;- 「审批闸」改名「需你处理」并并入 needs_attention(requeue/接管/取消 + 完整复审报告,按代码/安全分段折叠卡片、标裁决徽章);- 子任务显 scopeFiles 文件范围 + frozen「待拆解确认」标。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 23:32:30 +08:00
wangjia 5a609a8675 feat(retry+decompose): 范围型驳回不重试 + 拆解 prompt 补 scope 铁律
- ingest:复审 reject 时若任务有 scopeFiles 且理由命中越界/范围外/声明范围等标记 → 判为范围型驳回,调 store.failScopeReject 直接转 needs_attention(清退避、不进重试链),因 executor 碰不了范围外文件、重试必然同样被驳回;- store.failScopeReject:补记 failed run 承载原因 + 直转 needs_attention(带单测);- runner 拆解 prompt:加「files 范围铁律」——覆盖全跨层足迹 / 后端能力别塞前端范围 / 宁空勿窄 / 全或空。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 23:32:10 +08:00
maestro 8b494e92aa merge: maestro/tsk_5dmtoHD_QVA3 [tsk_5dmtoHD_QVA3] 2026-06-29 19:57:46 +08:00
wangjia aca8f1b18b 后端文件名加固:无名/无扩展名粘贴 blob 按 mimetype 生成安全文件名+扩展名 (tsk_5dmtoHD_QVA3)
附件上传接口对剪贴板粘贴等「无名/无扩展名」的 blob 加固落盘命名:
- 新增 extFromMime / safeAttachmentName 纯函数(可单测、已导出)
- 占位名(blob/image/file 等)或空名 → 生成唯一 paste-<ts>-<seq>,
  扩展名优先按 mimetype 推断、其次保留原扩展名,避免多次粘贴同名覆盖
- 正常名缺扩展名 → 按 mimetype 补;路径穿越/非法字符净化,剥前导点
- name 字段在原名缺失时回退到生成名

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 19:54:58 +08:00
maestro 0569423b7d merge: maestro/tsk_erQHNYdn6i9g [tsk_erQHNYdn6i9g] 2026-06-29 19:15:36 +08:00
wangjia 7884182d2b feat: 编排器跨项目全局并发上限闸(tsk_erQHNYdn6i9g)
新增用户级设置项 globalConcurrency(settings 表,独立于新建项目默认值
来源 concurrency),缺省 0 = 不限,向后兼容无需 DB 迁移。

- store: UserSettings 加 globalConcurrency 字段 + 默认 0;新增
  globalInflightCount()(跨所有项目 started run 总数,与 inflightTaskIds 同口径)
- orchestrator.claimTick: 叠加全局闸,与 per-project 闸串联(都过才领);
  轮初查一次全局在途、轮内手动 ++,达上限即 return 跨所有项目停止领取
- api: PUT /api/settings 支持 globalConcurrency(空/null 归一为 0)
- web: 侧栏「全局设置」入口 + 模态,编辑/回显/校验(≥0 整数)
- test: 新增全局闸达上限跨项目阻止 / 未达上限正常领取 / 边界 / 轮初短路 用例

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 19:11:42 +08:00
wangjia 1c62059424 feat(web): 控制台 UI 批次——用量卡片精简+详情弹框、项目列表封顶 6、评审弹框增强、live 输出流、标题栏置顶
- 全局 AGENT 卡片精简为 2×2 概览(近 7 天窗口 + 真实运行数),删按项目列表,加「详情」弹框(按天/周/月柱状图 + 分项目下钻表);- 项目列表展开态封顶 6,多余折叠;- plan/exec 评审弹框:markdown 折叠卡片 + 点文件看 diff;- live 输出流提取 tool_use/tool_result;- Agent/审批闸/任务树/已归档标题栏滚动置顶。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 17:42:39 +08:00
wangjia 5198435ba0 feat(usage): 用量明细——/api/usage 加 week 窗口+runs 计数,新增 /api/usage/detail
costSummary 顶层补 runs 计数、period 扩 day|week|month;新增 usageDetail(day|week|month) 返回时间序列分桶 + 分项目下钻(token/花费/任务数/模型,model 维度沿用 usage JSON 近似口径)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 17:42:32 +08:00
wangjia dc7c3030a5 feat(api): 任务改动 diff 端点——GET /api/tasks/:id/diff 按文件切分
结果评审需要看每个文件的具体改动。新增端点跑 git diff defaultBranch...branch,
按 diff --git 切分成 [{path, diff}],供前端点击文件展开查看。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 12:11:03 +08:00
wangjia 8765e61498 feat(console): 任务树筛选/折叠/统一标题 + 侧栏全局Agent卡片/拖拽排序/全局设置弹框/记忆项目 + 状态点真实化
任务树:四维多选下拉筛选(状态/复杂度/优先级/执行者)、已选置顶、新建任务按钮移右上角(0任务也能建)。
四块主区(Agent/审批闸/任务树/归档)统一标题组件(图标+名称+数量徽标)+ 折叠按钮(localStorage 记忆)。
侧栏:全局 Agent 弹层改常驻卡片(项目默认3+折叠+按活跃排序)、顶部项目拖拽排序、全局设置移入用户菜单弹框(保存/取消,落库)、记忆当前项目。
adaptProject 用后端 summary 的 running/attention 判状态点颜色(青/琥珀/灰)+ 紫色关注数徽标;agent 标题不再越界;i18n 5 语言补全。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 11:30:32 +08:00
wangjia 43fa1f7dbb feat(ds): 表单输入/下拉文字改柔和灰——新增 --field-ink token 作单一真相源
输入/下拉文字此前用 --ink(近白)太刺眼且与正文耦合。新增 --field-ink token
(深 #a7b3a1 / 浅 #3c4838),Input/Select 组件引用之;改一个值即全改。
因项目无 DS 编译器,同步改 _ds_bundle.js(运行加载源)+ ambience.css 兜底,确保即时生效。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 11:30:17 +08:00
wangjia f0f8f80425 fix(api): 项目状态点严格化——running 只数真实活跃 run(status=started)
之前 running 按任务状态(executing/analyzing/speccing)计,导致被冻结/排队的子任务
也让点变青。改为只数真实在途 run(runs.status='started' JOIN 本项目任务),只有活 agent 才青。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 11:18:02 +08:00
wangjia 2460b3f46c feat(api): 项目任务状态摘要——侧栏状态点 + 需人工关注数
projectOut 此前不返 summary,前端拿到空 {} → 所有项目恒灰、无关注数。新增
store.projectSummary(projectId):running(executor+planner 在跑)/blocked/attention(待审批闸
+needs_attention)/executing/alive 计数,projectOut 带上。前端 adaptProject 用 running 判青点、
attention 进紫徽标。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 11:04:13 +08:00
wangjia 3780f1c064 fix(orchestrator): 拆解未批准前冻结子任务——父任务 plan_review/analyzing 期间子任务不可领取
修复 bug:auto-approved 项目里 planner 拆解后子任务立即被领取执行,而父任务还在
plan_review 等人审批,导致拆解若被驳回则子任务已白跑。claimable 加闸:子任务的父任务
处于 plan_review(待审拆解)或 analyzing(拆解中)时冻结,批准(decomposed)后放行。
仅冻结这两态,不影响 todo-sync 等其它带 parentId 的流程。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 10:57:24 +08:00
wangjia f5ea32a600 feat(settings): 用户级全局默认配置(per-user 落库 + 新建项目套默认)
新增 settings 表(user_id PK,data JSON,单本地用户 'local')+ store.getSettings/putSettings
(内置默认=核心策略子集)+ GET/PUT /api/settings 端点;POST /api/projects 创建时以用户
默认填充未显式传的字段(body 优先,自动放行/预算经 patchProject 套用)。前端弹框另提交。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 09:19:18 +08:00
wangjia a50e45baba feat(app): 事件流时间加上日期——HH:MM:SS → MM-DD HH:MM:SS(本地时区,仅事件流)
新增 DATETIME 格式化器用于 adaptEvent,agent 面板的 TIME 保持不动。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 05:44:26 +08:00
wangjia 2009627eda docs(规则12): 超时分层措辞对齐实际——agent跑共用 project.timeout_ms 可配,verify/复审/checks 为固定常量
核对发现「均可项目级配置」过度声明:实际仅 planner/executor/conflict 走可配的
project.timeout_ms(30min);verify(10min)/复审(15min)/分项checks(10min) 是硬编码
常量、无项目字段。改文档如实描述,不为无人调优的超时再加 3 个配置字段(YAGNI)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-28 23:15:34 +08:00
wangjia 04d9a0bf78 docs(③): 解冲突调度改「P0 最高优先级插队,不中断在途」——弃用真抢占
按用户决定(2026-06-25):解冲突补救任务以 P0 入队、rankByScore 即排队首、
名额空出时优先领取,但绝不 SIGTERM 在途 worker(维持 No-preemption 架构)。
代码本就如此(ensureMergeRemediationTask 建 P0 任务、orchestrator 无抢占逻辑),
本提交仅修正文档此前「优先抢占」的过度描述;附带修正 conflict 模型档过时表述
(已是项目可配置 + 默认 opus-4.8,非 fable-5)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 21:22:23 +08:00
wangjia ec4345a4ae docs(optimization-plan): ⑤状态机/⑥ER 改自包含 SVG + 补规则13边与新列
- ⑤ 状态机:mermaid → 内联 SVG(圆/椭圆节点,家族配色),含 executing→needs_attention 分歧重评估(规则13) 虚线边;移除 mermaid CDN script + initialize,文档全自包含
- ⑥ 数据库:补本轮已上线但漏登记的列 projects.models / projects.agent_rules / tasks.scope_files;新增「表关系 ER」内联 SVG(5 表主外键 + 基数)
- 规则13 状态条目标「 已实现」并补实现说明
- 两张 SVG 经 xmllint 校验 well-formed

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:35:36 +08:00
wangjia fa4ba3db28 feat(rule13): 执行前分歧重评估闸——main 撞声明范围→needs_attention 重评估
通用规则13的(B)半边:sync main 之前先跑 reevalScopeGate,
以 git diff HEAD...origin/main 取 main 自分支点以来改动的文件,
与任务 scopeFiles 求交集;非空即 emit needs-reeval →
daemon markReeval 直接转 needs_attention(不重试/不计失败/run收尾cancelled)。

- checks.ts: + reevalScopeGate / ReevalGateFn / ReevalGateResult
- pipeline.ts: createWorktree 后、syncMain 前插入重评估闸 + reevalGate 依赖注入
- protocol.ts: + needs-reeval OutboxRecord/Payload 事件
- ingest.ts: + case 'needs-reeval' → store.markReeval
- store.ts: + markReeval(executing→needs_attention,不进重试链)
- status.ts: executing 合法转移 + needs_attention
- 测试 +5:reevalScopeGate(命中/未命中/空/无前移/git错) · pipeline(命中emit/未命中续跑) · store.markReeval;全套 242 绿
- docs: optimization-plan.html 规则13 标  已实现

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 20:15:02 +08:00
wangjia 6bf2b3619c feat(web): 项目配置面板补全——checks/自动放行/agentRules/预算/角色模型编辑
此前 checks、autoApprovePlan/Exec、agentRules、budgetUsd、models 只能经 API 改,
看板无编辑口。现扩展项目「配置」面板:
- 分项检查:lint / typecheck / build 三命令(拼成 checks JSON,全空=null)
- 硬闸/自动放行:autoApprovePlan / autoApproveExec 两个勾选
- 角色模型:executor/planner/reviewer/conflict 四个输入(填模型 id 字符串,
  或 {"easy":..,"hard":..} JSON;留空=默认 opus-4.8;非法 JSON 提示报错)
- 项目 Agent 规范(agentRules)textarea
- 成本预算:budgetUsd + budgetPeriod(按天/月)
toggle-config 回填全部新字段;save-config 一并 PATCH。新增 zh/en i18n 标签 +
.cfg-subhead/.cfg-check 样式。web/ 静态、无需 rebuild。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 07:34:49 +08:00
wangjia e8fb2bc664 docs: 登记三类优化方案 HTML(含实现状态表)+ CLAUDE.md 模型档位更新
- docs/optimization-plan.html:纳入 worktree,顶部新增「★ 实现状态」章节
  (优化点→实现→提交对照,2026-06-25 全部上线,含 3 个线上实测 bug 修复)
- docs/index.html:登记 optimization-plan.html 到「设计方案」分类
- CLAUDE.md:模型档位表改为「按项目可配置 + 默认 opus-4.8」的解析优先级说明,
  回退链改 opus→sonnet→fable,注明 fable-5 不再是内置默认

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 07:08:19 +08:00