Commit Graph

102 Commits

Author SHA1 Message Date
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
wangjia 59ce391ecc feat(models+gate): 模型按项目可配置(默认 opus-4.8) + diff 声明外文件硬闸
① 模型可配置(项目维度,默认 opus-4.8)
- 新增 projects.models(JSON,按角色 executor/planner/reviewer/conflict
  覆盖,值可为字符串=全复杂度统一 或 {easy,medium,hard} 分档)
- models.ts 重构 resolveModel:优先级 项目级 models > 旧 project.model
  (仅 executor/planner) > env > 默认 DEFAULT_MODEL(opus-4.8)
- 取消内置 fable/sonnet 分档默认:所有角色默认 opus-4.8(彻底回避 fable-5
  不可用问题,需要时项目级显式配置即可);回退链改 opus→sonnet→fable
- API PATCH /projects 透传 models;sanitizeModels 落库校验

② diff 声明外文件闸(task.scopeFiles)
- 新增 tasks.scope_files(JSON glob/路径数组)
- checks.ts: globToRegExp/matchesAnyGlob + scopeFileGate(改动文件越界=硬闸,
  空声明跳过,git 出错不拦截);pipeline runApproveGates 接入
- planner 拆解新增每子任务 files 字段:prompt 要求 + parseDecompose 解析 +
  ingest 落 scopeFiles,自动填充声明范围
- executor prompt 注入「声明文件范围约束」,让 agent 知边界(gate 才公平)

迁移:projects.models / tasks.scope_files 走 ensureColumn 幂等迁移(旧库补列)
测试:models 默认/配置/优先级、scope glob/gate、planner files 解析、
      store 持久化往返、迁移补列 —— 237 通过

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 07:06:32 +08:00
wangjia 4c09186f36 fix(ingest): autoApproveExec 传错 id 致自动合并不触发(线上实测捕获)
condition 误把 taskId 传给 autoApproveExecOn(projectId) → getProject(taskId)=null
→ 永远 false,自动合并从不触发(任务卡 exec_review)。
重构为 shouldAutoApproveExec(store, task, codeV, secV),内部读 task.projectId 自取项目,
杜绝传错 id;补单测覆盖。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 23:51:07 +08:00
wangjia a9c51021aa fix(models): isModelError 识别「issue with the selected model」→ 触发回退链
线上实测:reviewer 用 fable-5 报「There's an issue with the selected model
(claude-fable-5)」(该档未对当前账号开通),但 isModelError 未命中此措辞 → 不回退 →
复审失败(verdict=null)。补正则后 fable-5 不可用会自动回退 opus 重试,复审正常。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 23:44:48 +08:00
wangjia 1bf3fecf42 fix(store): 补 checks/auto_approve_* 列的 ensureColumn 迁移(旧 DB 缺列 bug)
线上实测复现:既有 DB 的 projects 表早于这三列创建,schema.sql 的
CREATE TABLE IF NOT EXISTS 对已存在表是 no-op,故必须靠 ensureColumn 补列,
否则 createProject 的 INSERT 引用不存在的列报错「table projects has no column named checks」。
上个会话加列时漏了迁移,:memory: 测试走全新建表没暴露。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 23:41:10 +08:00
wangjia 1f318c2667 feat(agent): ② exec 自动放行(autoApproveExec)+ 抽出共享合并流程
- 新增 exec-merge.acceptAndMerge:封装 exec_review 通过并合并的完整流程
  (merge→冲突建补救任务/成功 decide+收口+回收),API decide 与 ingest 复用同一逻辑
- server.ts decide 改调 acceptAndMerge(去重 ~40 行内联逻辑)
- ingest result:auto-approved + autoApproveExec + 双复审 approve → fire-and-forget
  自动合并(git 异步不阻塞 tick);冲突则补救任务 + 留 exec_review 人审
- 测试:acceptAndMerge 可合并→done、冲突→补救+留审核闸(真实 git repo)

至此 plan ① ② ③ 三类优化 + 通用规则 + L1-L4 记忆注入代码侧全部落地

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:58:37 +08:00
wangjia 2d127698d1 feat(agent): ② approve 前硬闸——分项检查(lint/typecheck/build) + diff 体量闸
- checks.ts:runChecks 按 lint→typecheck→build 逐项跑(worktree 内,各 10min,
  任一非0=硬失败报哪项挂);parseChecks 解析 project.checks JSON
- diffSizeGate:git diff --numstat 统计文件数+增删行数,超阈值=硬失败(提示拆解);
  阈值 env 可配 MAESTRO_DIFF_MAX_FILES/LINES(默认 60/3000,0=不限);git 出错不拦截
- pipeline:verify 后插 checks+diff 闸,任一失败 emit failed 不进复审;
  conflict 管线只跑 checks(diff 含整条原分支,体量闸会误伤)
- 注:diff「声明外文件」闸未做——task 无声明文件范围字段

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:53:56 +08:00
wangjia ceb4f9e9d2 chore: gitignore todo/ 与 design/maestro-ds/
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:33:34 +08:00
wangjia eef59830d6 chore: 不跟踪 todo/ 与 design/maestro-ds/(误入 git add -A,应保持未跟踪)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:33:25 +08:00
wangjia 74be3ecec1 feat(agent): L3 记忆注入——子任务带父任务拆解意图 + 兄弟状态
- types.TaskContext + Task.context(daemon 装配、不持久化)
- store.taskContextOf(taskId):父 plan + 同层兄弟概览(标题/状态/复杂度,排除自身)
- orchestrator.claimOne:executor 子任务填充 context 下发(planner 跑在父任务上不需要)
- runner.buildPrompt 注入「## 拆解背景」段(顺序:规范→背景→任务内容)
- 仅 DB 读,不做 git/RAG 检索(成本控制)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:32:21 +08:00
wangjia fe7923a618 feat(agent): L2/L4 记忆注入——项目规范 + 全局规范文件喂进 4 处 prompt
- L2 projects.agent_rules 列(schema+迁移+类型+mapper+patchProject+API 透传)
- L4 protocol.readGlobalAgentRules():worker 直接读 <data>/agent-global.md(非DB,
  不读用户 ~/.claude/CLAUDE.md,避免个人习惯与受控执行冲突)
- runner.rulesHeaderLines 注入 executor/planner/conflict;reviewer 同注入
- 顺序:全局规范(L4)→项目规范(L2)→任务内容→上次失败(L1)→执行约束

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:29:29 +08:00
wangjia ff2d7c22e7 feat(agent): 模型档位升 fable-5(复审/hard拆解/解冲突)+ 回退链 fable 置首
按 plan ①②③④ 定稿(用户确认):
- reviewer 三档统一 fable-5(不被 project.model 降档,保复审严格度)
- planner hard 拆解 opus→fable-5(最烧脑用最强档);medium=opus/easy=sonnet 不变
- conflict 固定 fable-5(解冲突恒用最强档)
- MODEL_FALLBACK_CHAIN: [fable-5, opus-4-8, sonnet-4-6](fable 置链首)
- executor 档不变(per plan ②);CLAUDE.md 档位表同步更正

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:24:30 +08:00
wangjia 73f80d27c9 feat(agent): 接通 plan 自动放行(autoApprovePlan)+ 项目配置可写
之前 auto_approve_plan/auto_approve_exec/checks 列与 Project 类型已存在,但
PatchProjectInput 不含它们 → 无法启用(dead config)。本次接通:
- PatchProjectInput + patchProject 支持 autoApprovePlan/autoApproveExec/checks
- API PATCH /projects 透传三字段
- ingest decompose-result:auto-approved + autoApprovePlan + 全 easy + 子任务≤5
  → store.decide(accept) 跳过 plan_review 直达 decomposed(默认关)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:13:18 +08:00
wangjia ecea1ae9b6 feat(agent): L1 记忆注入——重试任务带上次失败原因喂回 prompt
- store.lastRunErrorOf(taskId):取最近一次失败 run 的 error(任意 kind)
- orchestrator.claimOne:写 job.json 时填充 task.lastRunError 下发 worker
- runner 三处 prompt(executor/planner/conflict)注入「## 上次失败原因」段(截断 2000 字符)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 22:09:06 +08:00
wangjia 7a6c826610 feat(app): 任务生命周期操作 UI(编辑/取消/重投/删除 + 复杂度落库)
补齐前端缺失的任务管理闭环(均接现有后端端点,无需后端改动):

- api.js:patchTask / cancelTask / requeueTask / deleteTask
- app.jsx:taskOps{patch,cancel,requeue,del},统一带刷新 + toast
- TaskDetail 操作工具条:✎编辑 / ⌨接管 / ↻重投 / ⊘取消 / 🗑删除(删除带确认;
  重投/取消按状态显隐)
- 编辑表单:标题 + 优先级 + 依赖(点选其他任务)→ PATCH /tasks/:id
- 修复:行内复杂度选择器(CplxPicker)从「仅本地 state」改为真正 PATCH 落库

验证:build 通过;建临时任务实测——工具条/编辑表单渲染 0 错误、DELETE 成功
(deleted:1)、PATCH 在途守卫正确拒绝;测试残留已清理。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:26:29 +08:00
wangjia 638f2f64f0 feat: 人工接管任务(takeover)+ 任务详情展示附件
B-③ takeover(⑧ ★ POST /api/tasks/:id/takeover):

后端:
- POST /api/tasks/:id/takeover:准备(或复用 result.worktree)任务 worktree,
  返回 {taskId, worktree, branch, console}——console 为用户在自己终端起交互式
  claude 的命令(daemon 无 TTY,不在进程内起交互会话);在途 run 时拒绝

前端:
- api.takeover;TakeoverModal(展示命令 + 一键复制 + 分支提示)
- TaskDetail 加「⌨ 人工接管」按钮(onTakeover 经 TaskSection→TaskRow 线程下来)
- 顺带:TaskDetail 展示任务附件(📎 文件名,读 task._raw.attachments)

验证:typecheck 干净;206 测试通过;前端 build + dev 渲染 0 错误。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:06:35 +08:00
wangjia a688b6977e feat: agent 实时输出流(SSE)
B-② SSE 实时流(⑧ ★ GET /api/tasks/:id/stream):

后端:
- GET /api/tasks/:id/stream:SSE 跟随任务最近一条 run 的 transcript 文件,
  新写入的 agent 消息逐行推送(活跃 run=实时;已结束=回放后 end);
  500ms 轮询 tail(按 offset 增量读),run 转非 started 即结束流,客户端断开即停

前端:
- StreamModal(EventSource 消费 SSE,summarizeMessage 把 SDK 消息→可读行:
  助手文本/⚙工具调用/■终态/·maestro 元事件,自动滚动到底)
- AgentSection agent 行可点击 → 打开实时流模态;adaptActiveAgents 带出 taskId

验证:typecheck 干净;前端 build 通过;dev 渲染 0 console 错误。
(实时效果需有运行中的 agent;端到端随 daemon 重启验证。)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 17:01:58 +08:00
wangjia 9b17d3e24f feat: 任务附件上传(图片/文件随任务提交)
B-① 附件上传(⑧ ★ POST /api/tasks/:id/attachments):

后端:
- 加 @fastify/multipart;schema/db.ts tasks.attachments 列(幂等迁移)
- types.Attachment{name,type,path} + Task.attachments;mappers 映射
- store.addAttachments(追加元数据 + 广播 task.updated)
- POST /api/tasks/:id/attachments:multipart files[](单文件≤25MB/单次≤10),
  落盘 <data>/tasks/<id>/attachments/,文件名消毒,返回全部附件

前端:
- api.uploadAttachments(FormData multipart)
- 新建任务表单加文件选择 + 已选列表;创建任务后自动上传附件

验证:typecheck 干净;206 测试通过;前端 build 通过。
(端到端需重启 daemon 加载新端点——与后续 SSE/takeover 一并重启。)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 16:58:14 +08:00
wangjia 6c9b05e575 feat: 项目级成本预算系统(按模型×token 精确计费 + 超额自动暂停)
精确到项目级的成本/预算护栏,成本按「模型 × token 用量」折算(⑧ ★ 新特性)。

定价(单源):
- src/model/pricing.ts:MODEL_PRICES(opus/sonnet/haiku,USD/1M token,分
  input/output/cacheRead/cacheWrite)+ computeCost/addUsage,前缀容错、未知模型记 0

token 捕获链(worker → daemon):
- cc.ts:从 SDK result 消息抓 usage,跨 resume/回退累计;CCResult.usage
- runner/reviewer:结果对象带 usage + modelUsed
- protocol.ts:新增 'usage' outbox 记录;pipeline 每次 CC(executor/复审/planner/
  conflict)后 emit usage(worker 侧写文件,不碰 DB)
- ingest.ts:'usage' → store.setRunUsage(累加、按模型折算)→ enforceBudget

存储 + 护栏:
- schema/db.ts:runs.usage/cost_usd、projects.budget_usd/budget_period(幂等迁移)
- store.ts:setRunUsage(累加)、projectSpend、costSummary(按项目/模型/总计)、
  enforceBudget(超额 → 置 paused + 广播 budget.exceeded)
- 编排器天然停领:orchestrator 既有「跳过 paused 项目」即生效,无需改

API:
- GET /api/usage:并入成本明细 {session,weekly,cost:{period,total,byProject,byModel}},?period/?project
- GET /api/health:{ok,db,inflight,at}
- PATCH /api/projects:支持 budgetUsd/budgetPeriod

前端:
- adapt.js:agentSummary 用真实成本/token;adaptProject 透传预算字段
- app.jsx:budget.exceeded → 告警 toast
- ConfigPanel:预算 $ + 周期(day|month)受控输入

验证:typecheck 干净;206 测试通过(含新增 budget.test.ts 4 例:定价折算/累加/
costSummary/enforceBudget);前端 build + 截图确认预算输入渲染、0 错误。
注:生效需合并后重启 daemon(迁移幂等加列、向后兼容旧库)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 15:29:44 +08:00
wangjia 0a1f500c12 feat(app+ds): 阶段2 接前端写操作——任务创建/配置保存/新建项目
让原型里的视觉 mock 表单变为真正可写(附加式、向后兼容原型 index.html):

design/ui_kits/console(surface 功能化,DS 组件本就支持 onChange):
- NewTaskPanel:表单受控(title/complexity/priority/parentId),onCreate 出参;
  父任务下拉扁平化含子任务
- TaskSection:暴露 onCreate prop(无则回退原 toast)
- ConfigPanel:受控(concurrency/autonomy/logo/verifyCmd/model),onSave 出参

app/:
- api.js:加 createProject
- app.jsx:createTask→POST /tasks、saveConfig→PATCH /projects、createProject→
  POST /projects;新增 NewProjectModal(design 无现成 surface,用 DS 组件就地拼装,
  zh/en 标签自含);接 Sidebar 新建项目入口

验证:dev + 生产构建双通过;Playwright 实测新建项目模态打开、受控输入捕获值
(["demo-app",".../demo-app","main"])、0 console 错误。写端点契约逐字段比对
server.ts(PATCH camelCase / POST tasks {title,complexity(auto),priority,parentId,deps})。
活写测试从略:maestro 为 auto-approved,建真实任务会触发 agent。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 14:44:46 +08:00
wangjia d6ae4dbe13 feat(app): 阶段2 接真实数据——REST + WS 直连本地 daemon
前端从 mock 切换到真实数据源(按 ⑧ 前端 API 契约,复用现有 :4517 daemon API):

- src/api.js:REST 封装 + WS 单向订阅(断线指数退避重连)
- src/adapt.js:纯映射层,把 API 的 camelCase 行映射成各 surface 期望形状
  (扁平任务→children 树、priority 整数→P0/1/2、complexity→cplx、终态→归档卡)
- src/app.jsx:改为 useEffect 拉取 + WS 增量刷新;decide/sync 走真实 POST;
  审批闸收紧到 plan/spec/exec_review 三态(needs_attention 仍在任务树可见)
- vite.config.js:加 /api + /ws 反代到 :4517;去掉 jsxInject(surface 走全局
  React,避免生产构建 rollup 从 design/ 解析 react 失败)
- main.jsx:移除 data.js mock 导入

验证:dev + 生产构建双通过;真实数据渲染(4 项目/审批闸带 diff/真实配额),
WS 已连接,0 console 错误。token/成本类(agentSummary)属 ⑧ ★ 新 /api/usage
(预算特性),暂留空待补。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 14:29:19 +08:00
wangjia 1fcd811c12 docs: maestro 后端重构 Phase1 设计文档(schedule_status × work_type)
8 章设计文档 HTML(架构决策/状态设计/DB Schema/记忆注入/Agent 规格/
运维护栏/安全沙箱/前端 API 契约),全图深色内联 SVG,附 docs/index.html 索引。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 13:52:53 +08:00
wangjia 0a896439d1 feat(app): React 18 + Vite 前端,像素级复刻 Maestro 设计系统 console
复用 design/ 设计系统作单一真相源(token + _ds_bundle.js + 6 个 surface
源文件不改),只移植 App 入口。整屏 console 与原型截图 diff 0.023%(≤0.5% 阈)。

- vite.config.js:经典 JSX + 注入 React,alias @ds → ../design
- src/globals.js:先注入 window.React,供预编译 bundle 使用
- src/main.jsx:按序加载 tokens → bundle → mock/i18n → 6 surface → App
- src/app.jsx:移植自原型 App(),三栏可拖拽 grid
- src/ambience.css:扫描线 + 暗角 phosphor 氛围层

下一步:mock data.js/i18n.js 换成真实 REST + WebSocket(按 ⑧ 前端 API 契约)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 13:50:22 +08:00
wangjia a5a3c967ce fix: 全量替换 claude-fable-5 → claude-opus-4-8(模型不可用)
- models.ts: 所有档位默认值、回退链、conflict 固定值全部换为 opus-4-8
- 回退链从三项缩为两项 [opus-4-8, sonnet-4-6](删除重复项)
- metrics.ts: 额度权重 opus-4-8 升为 1.0(现为最高档)
- 测试同步更新

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 15:14:09 +08:00
wangjia 433b2dc232 feat(web+store): needs_attention 任务显示在审核区,附失败原因
- pendingApprovals 扩展到包含 needs_attention,subquery 取最近 executor 失败 error
- Task 类型增加 lastRunError 字段,mappers 映射
- 审核区(renderGates)将 needs_attention 渲染为独立橙色卡片,
  展示「需人工确认」标签 + 具体失败原因 + 重新排队/取消按钮
- i18n zh/en 补充 attnLabel/attnReason/attnRequeue/attnCancel/toastRequeued

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 14:46:21 +08:00
wangjia 4a2b4e1094 feat: launch.sh — start/stop/restart 服务管理脚本
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 14:33:14 +08:00
wangjia 36e8f736e6 fix(web): renderPreview 中 task 变量遮蔽全局 t() 翻译函数导致预览点击无效
将 renderPreview 内 const t = tasks.find() 改名为 task,
避免局部变量 t(任务对象)遮蔽全局翻译函数 t(),
使预览面板渲染时抛 't is not a function' 导致面板无法打开。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 14:23:56 +08:00
wangjia 027a9cb2d6 fix(tests): 修复三类优化实现后的测试适配
- pipeline.test.ts:PipelineDeps 增加 syncMain 可注入接口(默认用真 git),
  测试 mockDeps 加 syncMain=no-op + runConflict,消除 fake-worktree 上真 git 调用失败
- models.test.ts:reviewer 三档默认 fable-5、project.model 不覆盖复审/conflict、
  MODEL_FALLBACK_CHAIN 三项链;pickFallbackModel 改为取链上下一档(循环)而非首个不等项
- ingest.test.ts:verdict=reject 硬闸测试改为断言未进 exec_review

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 14:05:22 +08:00
wangjia f8900de2f7 feat(daemon+store+api): verdict硬闸+执行期锁+conflict优先+schema
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 12:27:48 +08:00
wangjia ae9ff7a469 feat(pipeline): 并行复审+sync-main+conflict-pipeline
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 12:23:57 +08:00
wangjia 76d11a8307 feat(runner): planner prompt扩展+conflict agent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 12:20:26 +08:00
wangjia fa19ff6de1 feat(models/protocol/types): 模型档位优化+协议扩展
- models.ts: 回退链加 fable-5 首位;planner 按复杂度分化(sonnet/opus/fable);reviewer 全升 fable-5;加 conflict 角色,reviewer/conflict 不受 project.model 覆盖
- protocol.ts: RunKind 加 conflict;DecomposeResult.subtasks 扩展 priority/deps 字段;OutboxRecord decompose-result 同步对齐
- types.ts: Project 加 autoApprovePlan / autoApproveExec / checks 可选字段

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 12:18:02 +08:00
wangjia 90d963312f fix(web): renderNode 内 t 被 task 参数遮蔽导致 t is not a function
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 00:57:57 +08:00
wangjia 33513757a3 fix(web): renderNode 内 t 被 task 参数遮蔽导致 t is not a function
renderNode=(t)=> 里 t 是任务对象,line 1418 的 t('depsWait') 调用
全局 i18n 函数时 t 已被遮蔽。在 renderNode 前保存 const i18n=t,
内部改用 i18n(),消除 "t is not a function" 错误。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 00:57:52 +08:00
wangjia 989f017308 docs: add CLAUDE.md with architecture and dev commands
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 00:34:36 +08:00
wangjia 930db2d921 docs: add CLAUDE.md with architecture and dev commands
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-14 00:33:31 +08:00
wangjia 3ba66b82d5 feat(web): i18n 补全静态 HTML data-i18n 标签 + 样式 [tsk_6-VbN2XHWT4s]
为侧栏/区段/弹窗等静态 HTML 补 data-i18n 属性(36 个 key,均已在 app.js 的 I18N 表定义)+ style.css 配套,与上一提交的 app.js i18n(t()+I18N 表)共同构成完整 zh/en 双语。index.html 结尾完整、key 全部匹配。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 23:58:41 +08:00
wangjia 8553939367 feat(web): 看板 zh/en 双语 i18n [tsk_6-VbN2XHWT4s]
采用 main 工作树中已完成的完整 i18n 实现(293 个 t() 调用、188 处 I18N、全 UI 接入),此前一直未提交进任何分支。原 i18n 任务 B4 多次因环境(worker 崩/TLS 证书/abort)失败被 requeue 重做,改为直接采用这份现成成果,B4 收口。board 此前已在此版本上运行。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 23:54:36 +08:00
wangjia a8f75cf10a fix(store): reconcileInterrupted 跳过已终态任务,避免 cancelled→failed 让 daemon 启动崩溃
执行中的任务被 cancel 后仍挂 started run;daemon 重启时 reconcileInterrupted 对它调 failTaskAttempt → transition(cancelled→failed) 非法 → 启动抛错退出(整个 daemon 起不来)。修:终态(cancelled/done)任务只 finishRun 收尾,不再 fail*Attempt。含回归测试(202 全绿)。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 23:27:53 +08:00
wangjia d1862efb4b merge: planner runs — 编排器自动拆解 hard / 自动写方案 medium [planner; tsk_1dkswD5Ub7gT]
部署 planner 功能(此前实现在 planner 分支、测试绿,未合):编排器把 analyzing/speccing 也当可执行,派 planner run 自动拆解(hard→子任务+plan_review)/写方案(medium→spec+spec_review);in-flight 从 status 泛化为'有 started run';reap 区分 executor/planner。与 main 干净合并,typecheck + 201 测试全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 23:10:12 +08:00
wangjia 645d36323e merge: worker 池化 + SDK resume 抗抖动 [tsk_74Acz1Nh4K1J]
手工正确合并(破除补救死循环):带上 src/executor/cc.ts 池化 + SDK resume + test/cc.test.ts(typecheck + 189 测试全绿)。DESIGN.md 冲突取 main 新版(多进程 re-adopt / worker 不碰 DB 描述),保留 246 行 SDK-resume 新增条目,丢弃分支过时描述。

此前补救任务只啃了 DESIGN.md 冲突文件、没带 cc.ts 代码,导致真代码一直没落地、原任务卡 exec_review、每次重试又生新补救(xbtd6GpS4NYg→Yb8eFAX2VUxZ)的死循环,至此终结。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 20:32:10 +08:00
wangjia d1e256b960 merge: 合并失败补救完成后自动收口原任务 [tsk_BagzbKZNAHXV]
手工解决 src/api/server.ts 冲突(keep-both):main 的 cleanupTaskRunArtifacts(合并后回收 run 目录)与分支的 findMergeOriginTask/remediateOrigin(补救任务合并成功后自动把原任务标 done)互补,均保留;ensureMergeRemediationTask 调用补 conflictFiles。其余文件(store.ts/types.ts/merge.ts/web/test)自动合并。typecheck + 183 测试全绿。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 20:10:00 +08:00
maestro 3d73b0cd85 merge: maestro/tsk_xbtd6GpS4NYg [tsk_xbtd6GpS4NYg] 2026-06-13 20:01:05 +08:00
wangjia 8392944877 feat(planner): 编排器把 analyzing/speccing 也当可执行——派 planner run 自动拆解/写方案
修复"hard/medium 任务建后永远停在 analyzing/speccing"的缺口:编排器现在对 analyzing(hard)
派 planner-decompose、对 speccing(medium) 派 planner-spec(auto-approved 下;auto-easy 仍只执行 easy),
planner 只读跑 CC(无 worktree/无写)产出 → daemon 落库 + 自动提交到 plan_review/spec_review 闸(仍人审)。

- protocol: JobSpec.runKind + spec-result/decompose-result 两型 outbox + DecomposeResult
- runner: runPlanner(只读 Read/Glob/Grep 跑在 repo,opus 档)+ buildPlannerPrompt
- pipeline: runKind 分支 + parseDecompose(取末尾 fenced JSON,非法→failed)
- orchestrator: claimable 纳入 analyzing/speccing + 排除在途;并发/in-flight 从 countExecuting 泛化为
  inflightTaskIds(有 started run 的任务,executor+planner 通用);claimOne 按状态分 executor/planner
  (planner 不转状态);reap 泛化(死 planner→failPlanAttempt)
- ingest: ingestAll 覆盖所有 started run;spec-result→setSpec+spec_review;decompose-result→setPlan+建子任务+plan_review;
  failed 按 kind 分流(planner→failPlanAttempt 退避留态、超限→needs_attention)
- store: inflightTaskIds / liveRunsWithTask / failPlanAttempt;reconcile 泛化到所有 started run
- status: analyzing/speccing 加 →needs_attention(planner 失败超限升级)
- models: planner 角色(opus);status: RunKind 已含 planner
- 测试 +12(pipeline 5 / ingest 3 / orchestrator 4),194 全绿

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 16:59:30 +08:00
wangjia 724cebb653 merge: 合并冲突解决 —— worker 池化评估 + SDK resume 抗抖动 [tsk_xbtd6GpS4NYg]
将 maestro/tsk_74Acz1Nh4K1J 分支的 DESIGN.md 改动手动合并:
1. §19 分期状态:新增「🟡 worker 池化(已评估,暂缓)」说明
2. §20 风险与注意事项:新增「SDK 抖动 → resume 续跑」条目

保留了 HEAD 中已有的更详细版本的「自动执行安全」和「中断恢复(多进程 re-adopt)」条目。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-13 16:46:50 +08:00
maestro 0ed4f73106 merge: maestro/tsk_3uhHOGU0qzj0 [tsk_3uhHOGU0qzj0] 2026-06-13 15:51:39 +08:00
maestro dcf610f6fd merge: maestro/tsk_oTFzOMeAU20D [tsk_oTFzOMeAU20D] 2026-06-13 15:51:31 +08:00
maestro 4d5344ef63 merge: maestro/tsk_6uziW1Dg-ftQ [tsk_6uziW1Dg-ftQ] 2026-06-13 15:50:53 +08:00