Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

Devlog

Galley 开发日志:记录设计与工程决策的"为什么",以及考虑过但被否的方案。

补充于 PRD(产品定义)、DESIGN.md(设计规则)、CLAUDE.md(项目宪法)—— devlog 提供历史叙事和 decision provenance。git log 太短只说"是什么",PRD 太静态只说"现在是什么",devlog 才记录"我们怎么走到这里的"。

时间线

日期 主题 摘要
2026-05-07 Stage 1 Bridge POC 完成 IPC 协议 v0.1 落地 + WorkbenchHandler 双轨制 + 主入口 + 5 项 e2e 全过
2026-05-07 设计方向转向 Notion + Claude 从 dark/Linear 风转向 light/文档对话工作台;9 块设计基础对齐
2026-05-08 首次体验三连 + LLM 切换 Onboarding wizard / Empty state hero composer / Health Check Card 设计;LLM 切换工程层完成(IPC + bridge + 测试)
2026-05-08 设计三连收尾 + file_patch diff + Error hint Error Card / Command Palette / Settings 设计 + file_patch diff 视图加入 V0.1 + ErrorEvent 四字段扩展(IPC + bridge + 测试)+ DESIGN.md v0.2 完整版定稿
2026-05-08 Stage 2 桌面端骨架完成 Tauri v2 + React 19 + Tailwind v4 + Zustand + SQLite + Python bridge IPC 端到端串通;11 个子任务(#1-#10b)一气呵成;@pierre/diffs reversal;conversation source-of-truth 优先级
2026-05-09 Project 模型 · coding agent 用户的归类容器 Project = 纯归类抽屉(不绑 instructions / 不改变 GA 内核体验);schema 加 pinned + lastActivityAt;DESIGN.md sidebar Project Section Spec A-G + Project View 二级页面;migration 策略首次明确(V0.1 release 前直改 001)
2026-05-09 YOLO Mode · 审批是出口而非围栏 PRD §6.1 #4 重新表述(审批是出口)+ §11.5 加 YOLO Mode;命名 / TopBar persistent indicator / activation modal 文案 / bridge needs_approval 优先级;IPC set_yolo_mode 命令;prefs API 通用化;5 个新 bridge test 全过
2026-05-09 Stage 3 #1 端到端真跑 + 一波 dogfood UX polish 16 个 commits 把端到端真跑打通 + dogfood polish + 提前做 V0.2 范围(Markdown + Shiki / Message actions / 流式生成 + sticky-bottom);spawn capability fix / drag region / 7 个跑通过程暴露的 bug;SoftHr 4 轮迭代后干脆删;V0.1 七件事剩 #2 + #5
2026-05-11 Stage 3 multi-session:N-active + useShallow 踩坑 + LRU 5 tool_events 审批审计持久化(v0.1 scope)+ N-active 多进程并存架构(1-active 被用户一票否决)+ useShallow 反模式踩坑(React 19 strict mode getSnapshot 死循环→app 空白;改 store-side enrichment 修复)+ LRU 5 资源策略拍板(待 Task 3 配套)+ launcher 调研给 Task 3 留 set_state 协议参考;撤回沉淀 Skill chip(违反 GA non-invasive 哲学)
2026-05-11 Stage 3 V0.1 收尾 + dogfood 7 轮 UX 打磨 14 个 commits 把 V0.1 七件事代码层做齐:Multi-session polish 4 项 / Session Restore(user message turn_index = turnCount+1 + ready 触发 replayHistoryToBridge)/ LRU 5 alive + active 保护 / Settings path picker(Python 字段诚实改只读)/ Onboarding fs.exists 5 项 health check / macOS bundle bridge/ 作 Tauri resource;然后第一次跑 dev 真实体验,7 轮 dogfood 反馈:composer auto-grow / LLM 内联 Popover / 右键 Archive + toast / lazy New Chat + 清「新对话」累积 / 软化 thinking placeholder + strip GA LLM Running marker / 「第 N 轮」→「第 N 步」/ Sidebar 三状态 unread / 修复 turn summary 静默丢失
2026-05-12 Stage 3 dogfood polish marathon + turn_index 双层语义拆分 17 个 commits 第二轮 dogfood 收尾。关键 critical fix: GA 每条 user_message 的 agent_runner_loop 都从 turn=1 重置 → SQLite ON CONFLICT 静默覆盖老 assistant row → conversation 错乱。修法拆 turn_index 双层语义(DB absolute / UI per-message GA 原生)+ rowsToTurns 反推 base,零 migration。其它 polish: LRU 加 agentRunning 保护 / streaming 三件套(typing dots + cursor + fake typewriter)/ Archive 系统完整化(双层 destructive confirm)/ Tool callout 哲学讨论后统一 inline pill / Sidebar 三态 subline(运行 正在工作 · 第 N 步 + 完成 已完成 · summary)/ AgentTurn.summary v3 migration / LLM list 持久化到 prefs cold-start / LLM picker footer hint「修改 mykey.py 后重启 Workbench 生效」/ Copy/Save 中间冒出三层 null 防御
2026-05-13 Sidebar IA 重塑 · FTS5 全文搜索 · Inspector 退役 · Projects V0.1 · GA baseline cf65515 一 session 跨 8 个主题:Sidebar Earlier 桶折叠 + EarlierDialog(月分组 + 多选 bulk archive)+ SQLite FTS5 全文搜索(migration 004,trigram tokenizer,CommandPalette 内 "在对话内容中" 分区)/ Inspector 整面退役(第一性原理:每 tab 都重复其它地方信息,回收 14-30% 横向空间)/ AppShell overflow-hidden 修复(Composer 被推上去 bug)/ MessageActions icon-only + Radix Tooltip(100ms 即时反馈)/ Multi-select bulk in EarlierDialog & ArchivedDialog(Gmail-style Select toggle)/ GA Baseline 6a3eecc → cf65515 升级(92 commits,逐项审计零 breaking change)/ Projects V0.1 完整实现(5 个 phase:数据层 + 创建 dialog + sidebar 渲染 + 分配/filter + CWD 绑定 + edit/delete + 审批入口恢复 + ProjectsDialog + 右键 Delete 红色 destructive + filter banner 显示 rootPath);多个 IA 大决策:拒绝双侧边栏 / Settings 不装 session 级 cwd / Recent decisions 在 Settings 里抽象层错位整段删除
2026-05-13 Scroll-on-completion 方案 E 暂存 长任务出最终答案后自动 scroll 到底部 → 用户要手动往上找答案开头。讨论 A-E 共 5 个方案:默认 read mode 被否(长任务期间分辨不出 GA 完成没)→ 落到方案 E(默认 read + run_complete smooth scroll 到 [data-role="final-answer"] wrapper)。暂不实施,等 beta/公测验证痛点频度。entry 含完整 implementation outline 5 步,revisit 时直接照做。
2026-05-13 Project 绑定文件夹 hint 文案 + cwd live-sync 暂存 Create/Edit dialog 项目文件夹 hint 漏满架构术语(cwd / GA 子进程 / rootPath / bridge)→ 重写成基于「工作区」概念的中文白话。Create: 「项目里的对话以此文件夹为工作区」;Edit: 「修改后已有对话需重启 Workbench 后生效」。关键 reframing:hint 应解释反直觉的部分,不浪费字解释 default behavior。讨论过加「重启此对话」右键菜单 / 自动 respawn / toast 提示,全否(要么术语泄漏要么毁用户工作)。Future path: IPC set_cwd + bridge os.chdir 实现 live-sync 而非重启 app;约 200-300 行工程,等 beta/公测有真实痛点再启动。
2026-05-13 GA Baseline 升级 cf65515 → 6bb3104 写完 Baseline Upgrade Workflow 当天就实跑首次:upstream 5 个 commits(4 个 tui/docs + 1 个 feat: dynamic tool_result maxlen),最后那个 commit 3205f4a 把 BaseHandler.dispatch 签名加了 tool_num=1 参数 = breaking change。桥接层 WorkbenchHandler.dispatchtool_num 透传 super 适配。80/80 tests pass,mypy strict + ruff clean。流程本身没漏没冗余,四个接口表面 checklist 在这次正好命中 dispatch 变化。也暴露一个 TODO:现有 dispatch 测试只用默认参数调,没测显式传 tool_num 的 case,应补一条 fail-fast 保护。
2026-05-13 Baseline regression · 改用 feature detection 适配 上一条 baseline 升级 ship 当天就翻车:硬绑新 GA 签名的 WorkbenchHandler.dispatch 在用户的旧 GA(d2840ae,breaking change 之前)上炸 TypeError,整个 agent loop 死掉,desktop 卡「思考中」永远清不掉。改用 inspect.signature 做 feature detection(运行时探测 BaseHandler.dispatch 是否支持 tool_num),新旧 GA 双向兼容。关键 methodology 沉淀进 CLAUDE.md Baseline Upgrade Workflow:(a) 接口适配优先用 inspect-based feature detection 而不是硬绑签名;(b) 跑测试矩阵必须新旧 GA 两端都过,单跑一端不算数。
2026-05-13 LLM warmup bridge · 启动时自动刷新模型列表 Bug:改 mykey.py 加新模型后重启 Workbench,New Chat 看不到新模型;进任意已有 session 才会触发。根因:bridge lazy spawn,冷启动没任何 bridge 跑 → state.llms 永远是 prefs 旧缓存。讨论 A-D 共 4 个方案,落到 A(启动后台跑一次性 warmup bridge 拿 list_llms(),shutdown)。hydrateFromDB 末尾 + setGAConfig 内重置 flag 后双触发;用 _warmupComplete 字段 dedupe;race-condition 用 pendingShutdown flag 处理;15s timeout 兜底。复用现有 bridge spawn 基础设施不引入新 Python 入口。
2026-05-13 V0.2 增量 · /btw 侧问 · /branch 分支 · /rewind 悔棋 GA upstream tuiapp_v2.py 启发的三个新交互原语,提案进 V0.2。/btw:用 worker thread + backend.raw_ask 跑独立 sub-agent 不动主 history,新增 IPC side_question / side_question_response,UI 黄色侧边条气泡 + 不计入 Turn 编号 + replayHistoryToBridge 跳过持久化。/branch:零新 IPC,复用 spawn + load_history(接受现有 lossy adapter),sidebar 右键 + 新 session 顶部"分支自 #X" system message。/rewind <n>:新增 IPC rewind / rewound,bridge 端 history[:] = history[:cut] truncate,desktop 非破坏性 marker(migration 005 加 rewound column)。Rejected:monkey-patch / desktop-only fake rewind / destructive SQL delete / in-process branch / ChoiceList for LLM(我们 LLMPill 更好)。Open:/btw 多轮?ChoiceList 是否给 ask_user 用(V0.1 漏渲染)?Edit Message 与 /rewind 共享语义?load_history adapter 富化是否前置?
2026-05-13 Galley 重命名 + 多项 V0.1 功能马拉松 超长 session 一次性把多件事推完:(1) ask_user UI 实施(AskUserBubble 黄色气泡 + 候选 chips + Sidebar 第四态 "⏸ 等你回复" + 抑制 ask_user tool callout);(2) Composer 大段粘贴折叠(>10 行触发 [Pasted text #N +M lines] 占位符);(3) 折叠完成 turn / Sidebar 折叠 / TopBar Search 全部 park 或删除(cargo cult 警觉);(4) Conversation 宽度 toggle(紧凑 760 / 宽松 1200,全局 prefs,TopBar pill 跟 YOLO 同视觉族);(5) Sidebar header 重塑:GALLEY semibold uppercase + 右对齐 ● GA 就绪 真信号化(之前 Runtime · healthy 是装饰品,重写为 ready/unconfigured 二态,未配置可点跳 Settings → Runtime);(6) 品牌重命名 GA Workbench → Galley:14 个文件,origin story "Galley started as a workbench for GenericAgent. The first two letters of our name are a quiet bow to where we came from.";(7) Tauri identifier 改动副作用事故 + 教训写进 CLAUDE.md(公开 release 前要 Rust 自动迁移);(8) CLAUDE.md 项目宪法重写:"不读写" → "不修改 + 读取分级"——只读 GA 内部文件允许(标 coupling 点 + baseline 升级审计);(9) Reinject Tools 实施(IPC + bridge handler + ⋯ 菜单);(10) Desktop Pet 实施(subprocess spawn + sticky-B + turn_end hook + ⋯ 菜单);(11) TopBar overflow menu 从右 cluster 移到 title 旁边,session-scoped(无 active session 时隐藏);(12) 手动 session rename(右键 ✏️ + inline edit input + Enter/Esc/blur);(13) 空闲自主行动 + AI rename C 都设计了但 defer 到 V0.2。
2026-05-13 V0.2 增量 · AI Session Rename (user-triggered) 手动 rename 之外的 LLM 增援。Option B(auto-trigger)否决 → Option C(user-triggered)保留。设计:⋯ 菜单加 ✨ AI 重命名,调当前 session active LLM 通过 backend.raw_ask(复用 /btw 同款 deepcopy + 不写 history 模式)出 8-12 字中文标题。Prompt 显式禁止 meta 措辞 + 强调名词短语。IPC: rename_via_llm / session_renamed。~110 LOC(比手动 rename 还少,复用基础设施)。Open:prompt 是否预先 dogfood?要不要 5 秒撤销 toast?上下文取多少轮?
2026-05-13 V0.2 增量 · 空闲自主行动 (Idle Autonomy) GA 官方 "30 分钟无活动自动注入 [AUTO]🤖 prompt" 在 Galley 的适配设计。决策:全局 toggle(不是 per-session)位置在 Sidebar Quick Actions / 自动跟随 active session / 必须 YOLO mode 才允许(safety gate)/ 单次硬限 30 step / 阈值 15min-4hr 可调 / macOS 系统通知 + Sidebar 🤖 indicator + 自主消息视觉变体。新 IPC: enable_idle_autonomy / disable_idle_autonomy / idle_autonomy_fired。~250 LOC。哲学定位:审批是出口不是围栏的延伸——给"信任 agent 自主跑"的用户一条透明 explicit 可控路径。Open:bridge 端 idle monitor 多 bridge 还是单 global?wall clock vs monotonic 时钟?初次激活要不要 confirm modal?
2026-05-13 UI 文案 i18n + brand 一致性 sweep + TopBar 标题菜单重构 + repo 重命名 从「标题旁的 ⋯ 看起来像省略号」一个 UX 小坑出发,连出 10 个连贯决策:(1) TopBar 标题块变 dropdown trigger(caret-down)消歧 + 收编 session rename 入口;(2) i18n Plan B 框架(section header / brand 锚点保留英文、body / 菜单 / hint 全中文、代码 identifier 不动);(3) session → 对话 / project body → 项目;(4) ApprovalForm 4 按钮 + 4 pill 全中文 + 「白名单」框架对齐(按钮 verb 和 pill verb 同源消除认知卡顿);(5)「已通知 AI」否决「Galley / agent」(Galley 是 UI 壳不是收件方);(6) Workbench → Galley brand 11 处 user-facing 漏网全收;(7) GA vs GenericAgent 分场景规则(长文展开 / 紧凑缩写);(8) GitHub repo 重命名 genericagent-workbench → galley 连带 README + CLAUDE.md + SettingsAbout 3 URL + local remote。Rejected:换图标治标 / Pin 保留英文(「短 / 都懂」滑坡)/ 句子里保留 Project(混合语言最伤)/ repo 名 galley-workbench 二元品牌。Open:ApprovalForm icon 跟新 copy 框架对应不上 / SettingsAbout 还有 Links / Also by SubLabel 英文 / Re-run health check + Back 按钮还是英文。
2026-05-14 Project = 纯分组 · 回收 rootPath/CWD 绑定(GA memory/ 静默降级修复) 讨论「闲时自主行动」时顺着 GA 请阅读自动化sop 这条线发现一个潜伏的静默 bug:bridge spawn 时 os.chdir(project.rootPath) 让 GA 在「project 设了 rootPath」的 session 下读不到自己的 ./memory/...——memory_management_sop 静默 fallback 到 "Not found. Do not update memory.",整个 memory 系统失灵但不报错。修复 = 回收 cwd 绑定:Project V0.1 从「分组 + cwd 绑定」改为「纯分组」,IDE 范式撤回 GA 范式(agent 自己评估、积累记忆、任意 cwd 工作)。方案 3 落地:保留 DB column / 类型字段 / read-write helper(forward compat),但 useAppStore.spawnBridge 那一行 cwd: project?.rootPathcwd: undefined,UI 入口全隐藏(Create/Edit dialog 项目文件夹字段移除、Sidebar 项目卡 icon 不再按 rootPath 区分、filter banner 第二行 mono path 移除、ProjectsDialog path 行移除);死掉的 toast「下次启动该 session 时会用 X 的目录」一并清。Rejected:方案 1 UI-only 隐藏(依赖关系脆)/ 方案 2 drop column(不可逆,legacy 数据有价值)/ bridge monkey-patch 双 cwd(违反非侵入宪法)/ 给 GA 注入 system prompt 让 agent 自己 cd(不解决 ga.py 硬编码 ./memory/...)。Future path: IPC set_cwd 真正 live-sync 实现(2026-05-13 deferred entry 已有完整方案),等真实痛点信号再启动。同时确认:闲时自主功能本身按上一轮结论 defer 到 V0.2(YOLO 已就绪不再是 blocker,但 demand 信号未到)。
2026-05-14 Conversation polish marathon: streaming, /btw, Desktop Pet UX, fence filter 同一天后半段一连 18 个 commits 把对话区做了全面打磨。视觉:user message 升级为 apricot 实色 callout(长对话回找提问的主视觉锚)+ ThinkingSummary 脱离 brand 色系到中性 surface + InlineToolPill 去 CheckCircle + AskUserBubble 规格对齐 user-msg。置顶 placeholder 重塑:「第 N 步 · 思考中···」从大 callout 块(~50px)降到 TurnMarker thinking 态单行(~16px),等待 ≥5s 自动显示 elapsed counter(5-59s · 23 秒 / 60s+ · 已 1 分 23 秒,每步独立计时)+ 全产品收掉 💭 emoji 例外。导航:⌥↑/⌥↓ 跳到上/下一条 user-msg + Settings → Shortcuts 同步。流式输出启用(核心改动):agent.verbose = True 翻开 GA 的 per-token LLM streaming,代价是要 strip 一堆 verbose 装饰(🛠️ Tool: ... 📥 args: block / 5-backtick fences / 当前阶段: prompt-induced preamble),全部加 cleanPartialContent 处理。性能修复:发现 verbose 副作用——工具 stdout 全程过线导致体验慢、UI 卡,新加 bridge _FenceFilter 状态机在 IPC 之前丢掉 fence 内 chunk(98/98 bridge tests + 7 fence test 全过)。/btw side-question 完整实现:bridge 用 handle_frontend_command sync 路径在 worker 线程跑(避开 agent.run() task queue 阻塞),新 IPC SystemMessageEvent、SystemTurn 类型、SystemMessageBubble 组件(黄色 AskUserBubble 同色家族)、Composer /btw prefix detection 让 stopMode 下也能发出去;exchange transient 不持久化(V0.2 候选)。Desktop Pet UX 重塑:sidebar Cat badge 显示 pet 附着位置 + menu label 二态化(active session 「关闭」/ 其它「桌面宠物」)+ 隐式迁移机制(store pendingPetMigrationTo 字段,detach→attach 串联避免端口竞争)。Follow-bottom 修复:sticky-bottom useLayoutEffect deps 扩到包含 turns.length / pendingApprovals.length / pendingAskUser,多步 run 每个 step 完成自动滚到底。小修:菜单「归入项目」→「加入项目」+ tool dispatch marker strip 兜底 + Composer stopMode 让 /btw 通过 + thinking placeholder 不再被 currentTurnIndex==null 拦住。Rejected: 始终显示秒数(机械)/ /btw install 路径(队列阻塞)/ stdout 当 prose collapsible(过度设计)/ persist /btw(V0.1 范围外)。Open: /rewind 4-commit 计划已设计未实施 / /btw 是否要持久化 / sys_prompt 自定义后 PHASE_PREAMBLE 精确匹配会漏。
2026-05-15 Release CI · Mac menubar · icon 4 轮迭代 · README screenshots Y plan / A items 落地后下午-晚间一气补齐发版能力 + UI 收尾,14 个 commits。Release CIrelease.yml tag-driven + workflow_dispatch 双触发 / 三平台 matrix macos-14 + macos-13 + windows-latest / pre-build typecheck+lint+cargo check gate / ubuntu-latest 收集 artifact + 创建 draft Release;check.yml PR + main push 同样三平台 gates 不 build artifact;docs/release-workflow.md 含 dry-run 路径 + 故障排查 + Intel runner deprecation 三 fallback)。Mac menubar 全套 6 submenu(Galley / File / Edit / View / Window / Help),Find + Toggle Sidebar 灰禁占位 V0.2 wiring;About 用 Tauri PredefinedMenuItem::about 弹原生 dialog 利用新 icon + version metadata。App icon 4 轮迭代 最终 JC 手调 1024 RGBA + squircle 烤进 alpha + 832/1024 Apple safe area。关键发现:macOS Big Sur+ 不自动 mask 第三方 icon,必须把 squircle 烤进 alpha 通道(Apple HIG 改了,Tauri T 占位符之所以是方角就是这原因)。CI 实测抓 3 个 Win-only bug:(a) pnpm version 没指定(packageManager 字段 fallback path 跟我们 desktop/package.json 位置错位)(b) core:window:allow-internal-on-* event permission 是虚构名 → 实际 event listening 走 core:event:default 已被 core:default 包含 (c) window-shadows-v2::set_shadows API 签名我又猜错——参数是 &mut App 不是 &WebviewWindow,返回 () 不是 Result。证实 #[cfg(target_os = "windows")] 代码 Mac 本地 cargo check 永远剔除,CI 是 must-have,每次改 Win 代码 push 前预算 1-2 轮 CI bounce。README 6 张 screenshots 临时 patch demo.ts + useAppStore.tshydrateFromDB(内存覆盖 sessions,不 touch SQLite),截图后 revert,落 docs/screenshots/screenshot_0[1-6].pngSSH remote 替代 OAuth PAT workflow scope(默认 Claude Code git token 不能 push .github/workflows/),配 ~/.ssh/config + id_rsa.pem 一劳永逸。JC 偏好 split arm64 + x64 Mac dmg(非 universal binary),管理两个文件换更小下载 + 用户视角清晰。Rejected: universal binary / Mac→Win cross-compile(Tauri 社区明确不支持) / v0.1.99-test 测试 tag(污染历史,workflow_dispatch 干净)/ ImageMagick 切多尺寸(Tauri CLI pnpm tauri icon 全包)/ icon v3-v4 再 AI 重生(JC 手调比 AI 快)。Open: macos-13 Intel runner 排队 (有时 6+ 分钟) 长期需要 fallback (drop / 本地 / 跨编译) / Win 11 圆角 / resize handle / Maximize 8px 溢出 / Snap Layouts 都留 Y6 Win 机 smoke / 6 张 screenshots 怎么进 README(next session)/ _kaku_wrapped_ssh zsh wrapper 错位待 cleanup。Next: dry-run release via workflow_dispatch (1 click) / Y6 Win 机 smoke / README 整合。
2026-05-15 Windows 发版 prep · Y 计划自绘 chrome + A 阶段杂项 Win/Mac dual-release 准备一整轮。窗口 chrome 选 Y(fully custom):JC 为 Galley「精致工作台」定位选自绘 chrome 而不是回退原生 Win 标题栏。Y 5 substep 全 landed(独立 commit + Mac 验证 + 三层 Mac 安全门):Rust setup hook 关装饰 + window-shadows-v2 阴影(target-specific Cargo dep,Mac 二进制零 Win 代码)/ lib/platform.ts UA-sniff isMac+isWindows / TopBar OS-conditional layout / WindowControls.tsx 三按钮 + Win-scoped capability platforms: ["windows"] / 双击 toggleMaximize(isWindowActionTarget walk-up DOM 排除按钮)/ onFocusChanged 失焦 desaturate。Snap Layouts 跳过(要写 WM_NCHITTEST Rust 等真痛点再说)。A 阶段杂项:A1 NSIS bundle target + currentUser installMode / A2 Python OS-aware(python3 Mac, python Win)/ A4 formatShortcut("Mod+K") helper + 6 site 迁移(Mac 字符串 byte-identical)/ A5 docs/windows-build-checklist.md(25 项 smoke checkbox + 已知坑)/ A7 EXAMPLE_GA_PATH 常量(Mac ~/Documents/... 不变,Win C:\Users\你的名字\...),3 个 site 迁移。A3 复盘后是 no-op(onboarding-tutorials.ts 早就把 mkdir/md 双版本写进去了)。Rejected: 方案 X 回退原生 chrome / @tauri-apps/plugin-os(三件套过重,UA 同步等价)/ literal Win 11 #c42b1c 红色(脱离 token)/ 自绘 restore icon(CopySimple 先用着)/ %USERPROFILE% 路径示例(不展开)/ demo.ts fixture OS-aware(被 prefs 覆盖触发不到)。Open: Win 11 圆角是否自动应用 / resize handle 抓握宽度 / Maximize 8px 溢出 / onResized 全路径覆盖 / Win+Arrow 跟我们 toggleMaximize 是否冲突——全部留给 Y6 Win 机 smoke test。Next: 借 Win 机器跑 25 项 checkbox + 出 .exe 验证;中期 GitHub Actions matrix CI 替代「借机器」流程。
2026-05-15 Vision pivot · workbench → local agent team orchestrator (dual-native) 8 轮 brainstorm 产物:产品定位从「GA 的本地桌面工作台」reframe 为「本地 agent team orchestrator,dual-native for human and agent」。Galley CLI 一等公民 + Supervisor Agent 概念 + localhost-only 架构原则 + agent-api 公开契约 + Galley Core 权威层迁 Rust(路径 B 重构,10-12 周)。术语表(Supervisor / session team / Galley Core / runner/)+ CLI 命令 surface + 发包策略(sidecar + discovery file)+ 6 条 agent-first 输出规则 + 路线图 v0.2 Windows → v0.5 全套重构(同日 push back 后从 v1.0 改为 v0.5,详 devlog §D12.1)。Rejected: CEO mode 命名 / MCP 主路径 / approval routing 当核心 / 路径 A 中继 / long-lived branch / 远程 auth / 存 supervisor 对话。Next: PRD v0.3 草稿 + bridge-owner prototype spec 同时落地,待 JC review 升格。
2026-05-15 v0.1 prod-build dogfood fixes(Onboarding routing · Python probe · bridge stderr · Settings revisit) 第一次跑 pnpm tauri build 出 .dmg 真启动,30 秒内暴露 4 个独立 bug:无 Onboarding(fresh 用户 never reaches it,缺 setScreen("onboarding") 路由)/ LLM 列表是 demo fixture / 发消息无反应(DEMO_GA_CONFIG.python=python3 在 launchd PATH 下解析到 macOS 自带 3.9.6 无 GA deps,bridge import 即崩静默死掉)/ Re-run Health Check 是 console.info 占位符。修复:(a) hydrateFromDB 检测无 ga_config pref → setScreen("onboarding");(b) 新 lib/python-probe.ts 预注册 10 个候选 Python 路径(Tauri capability cmd 不支持 regex validator,只能枚举),运行时 spawn sys.path.insert(0,gaPath); import agentmain 逐个验证,第一个 ok 胜出存入 gaConfig.python;(c) bridge stderr 加 per-session 滚动 buffer,abnormal close 弹 toast 显示最后 3 行(含 spawn-error 路径);(d) Onboarding 双层 drag region(外层 data-tauri-drag-region + 内层 ="false" 让文本可选 + 按钮可点);(e) Settings → Health Check 选 Option A 重构(按钮接 Onboarding StepHealth revisit 模式跳过 Welcome/Attach,Back→「取消」+ 进入→「返回 Settings」+ 恢复 screen + 重开 Settings dialog)。关键 mid-execution 修正:初版 probe 用 import anthropic, openai,实测 JC 机器所有 Python 都 fail——查 GA llmcore.py:1 发现 GA 用裸 requests 直接调 LLM endpoint,根本不引入 anthropic / openai SDK,改成 import agentmain 校验真实 import chain。删旧死代码rerunPythonProbe store action / RuntimeInfo.healthChecks 字段 + demo fixture(之前那张静态表永远显示 5 项 success,本质在撒谎)。Rejected: Rust-side custom spawn 命令(解决任意 Python 路径,~200 行 Rust,推 V0.2/B refactor)/ bundle Python sidecar(+50-100MB)/ Settings 内联复刻 cascade(双份维护陷阱,本 session 就重现了 divergence)/ stderr 全量 toast(spam)/ revisit 走 Welcome(重)。Open: conda/pyenv/asdf/uv 用户的 Python 不在预注册名单(V0.2 Rust spawn 解决)/ Probe 不自动 TTL(venv 后期坏掉只能用户手工 Re-run)/ python-missing-anthropic tutorial id 现在 misleading 但重命名属 cosmetic deferred。
2026-05-15 GA Baseline 升级 6bb3104 → fc6b5ad(零接口表面变化) v0.1 release-readiness 同一 session 顺手把 baseline 升到 upstream/main HEAD。13 个 commits 全审完:agent_loop.py / agentmain.py 0 行;ga.py 4 行(仅 maxlen 阈值 20000→15000 / 150→100);llmcore.py 54 行(trim_messages_history 签名 (history, context_win)(history, sess)只在 GA 内部调用 + compress_history_tagsinterval=5 默认参 + BaseSession 按模型选 default context_win)。bridge 零代码变更——只读 agent.llmclient.backend.history 列表语义保持。测试矩阵:bridge/tests/ 106/106 在 fc6b5ad(新)+ 6bb3104(旧)两端都通过。JC 本地 GA main 同步 fast-forward 到 fc6b5ad 保持 Settings 「GenericAgent 版本」卡片 已对齐 baseline
2026-05-15 v0.1 ship · CI Intel queue fallback · tiered release pattern · macOS terminology Galley v0.1 公开发布——macOS RC + Windows Alpha 两个独立 release(dual-tier strategy)。dry-run CI 验完 push v0.1.0-rc.1 tag → macos-13 Intel runner queue 卡死 → manual fallback:取消 stuck CI + 下 macos-14 aarch64 artifact + 本地 build x64 + gh release create --draft。Win 走 v0.1.0-alpha.1 tag 同样手动。GitHub API 不允许 prerelease 标 Latest → Mac RC 摘 prerelease flag 换取 sidebar widget visibility(title "(Release Candidate)" 文字 + notes 保留 tier 信号)。macOS vs Mac 用词约定:macOS = OS / Mac = 设备,按 Apple 惯例。配套 SOP 更新 release-workflow.md 加 4 新 section(Tiered release / Manual fallback / Latest+prerelease 限制 / Announcement templates)+ CLAUDE.md 加 Platform terminology section。Rejected: 等 Intel queue 到底 / 单一 release 包 3 平台 / 保留 prerelease 接受 sidebar 空 / 通告 template 入库(每次内容不同,只入结构)。Open: 何时第一个非 prerelease release(看反馈 2-4 周)/ Intel runner 真下线后用方案 C 跨编译 / code signing v0.6+ 触发节点(100+ downloads + 多非 JC 反馈者)。
2026-05-15 v0.1.0-alpha.2 Windows attach hotfix(fs:scope · mixed-separator joinPath · Settings GA Path editable) Win Alpha 用户群两个独立的 attach-time bug 在同日先后报上来,挂在「mac dogfooders 凑巧都把 GA 装 ~/Documents/」这个 alignment 上一起暴露:(a) GA 在 Documents 下的用户——picker 路径合法但「错误路径」红字,手动加 \ 才过,根因 joinPath 硬编码 / 拼出混合分隔符 C:\Users\foo\GA/agentmain.py,Tauri plugin-fs 处理不一致;(b) GA 在 D:\projects_2026\GenericAgent 的用户——Health Check 第一行就 fail,根因 tauri-plugin-fsfs:scope 默认只放行 $HOME/$DOCUMENT/$DESKTOP/$DOWNLOAD 四个 glob,D 盘根本不在 scope 内 → throw → catch 当 not-found。修法:(a) joinPath async 化走 @tauri-apps/api/path.join + resolvePath 新增 normalize 步把 ~-expand 后的路径过一遍 path.normalize;(b) src-tauri 加一行 Rust Tauri command path_exists 绕开整个 plugin-fs,JS 端 fsExistsinvoke("path_exists",...)附带:Settings → Runtime GA Path field 改可手动输入(不只 picker),300ms debounce validateGAPath + Enter/blur commit + Esc revert + picker onMouseDown.preventDefault() 防 blur-commit 抢跑。CI matrix 永久 drop macos-13:JC Intel Mac 自 build 兜底;macos-13 GitHub deprecation 提前撤;alpha.2 起 CI 出 2 artifact(aarch64.dmg + x64-setup.exe)。Rejected: 「.windows-patch」tag 后缀只发 Win 包(Mac 用户 GA 在 ~/Documents 之外也受影响)/ fs:scope 全开 **(Tauri Windows glob 跨 drive 行为未文档化 + 打开未来 plugin-fs read/write 全面)/ 单次 skip Mac Intel 不改文档(alpha.3 还要 revert)/ defer Settings editable 到 alpha.3(已 typecheck 干净)。Open: MessageActions writeTextFile 仍走 plugin-fs + fs:scope(picker-gated 但 D:\ 保存仍会静默 fail)/ python-probe 不识别 conda/pyenv/uv/asdf(V0.2 Rust spawn 解决)/ 无自动测试覆盖 fs:scope hole 这类 regression。Next: 6 个 commit + tag v0.1.0-alpha.2 + push(CI ~15-20 min)+ Mac arm64 + Win 借机器 smoke test + tiered release notes publish。
2026-05-15 Onboarding & empty-state polish · YOLO default · button system · v0.1 Mac-only 决策 两个 commits(72ce4d3 + 143f44c)覆盖 8 大件。Conversation 步骤渲染(commit 1):TurnMarker 整行可点击 + 条件 chevron 展开 DetailPanel(thinking + 前言并入),新 TurnTicker 在 streaming 中显示前言最新段 line-clamp-3,InlineToolPill 双区(左 icon + 中文名 + arg preview,右 mono GA name + chevron)。数据层:migration 005 加 messages.preamble + extractPreamble 反向抽取(strip 所有结构 tag 取剩余 prose),isFinalTurn 防护避免 final answer 双渲染。Onboarding 教程系统:5 个手写 fix-it 片段(download-ga / wrong-directory / mykey-setup / assets-missing / memory-info)+ TutorialModal Radix Dialog + HealthCheckCard 把 actions 扩到 warning state + StepHealth 加「重新检查」按钮 + StepAttach 失败时显示 tutorial 按钮 + 「Attach」全部改成「接入」。Welcome 双卡片入口:删 3 条 bullet + footer + 「开始」按钮,加两个 ModeCard(Mode 1 灰禁「敬请期待」/ Mode 2 active「Galley 不会修改你的 GenericAgent」),副标题去句号。Empty State 重塑:删大标题「你想做什么?」+ placeholder 升「今天交代什么?」承担邀请、4 个 chip 按钮降级成 prose 提示(italic serif 12.5px ink-muted 居中,无 border / bg / icon,hover 只变色)、新 prompt 跨 4 个任务形态。LLM display name heuristic:bridge _simplify_llm_name(raw, model)name != model → 原样返回 规则,用户 mykey.py 显式 name 字段终于被尊重;新 _safe_get_model defensive helper(MixinSession 没 .model / BADCONFIG dict);+8 测试 → 106/106。YOLO 默认 ON + 首次声明 modal:v0.1 GA 重度用户默认开 YOLO,但首次进 MainView 弹阻塞 modal 强制 acknowledge;ESC/overlay/X 全禁,只能点「改回审批模式」或「知道了」;yoloIntroSeen pref 只对真新用户翻 false(现有 dogfood 用户跳过避免「title 说默认 ON 但实际 OFF」尴尬)。按钮系统:Audit 出 4 个系统问题(primary 颜色二分裂 / 尺寸 3 种 / secondary 文字色 3 种 / disabled 行为乱),新 components/ui/button.tsx 5 variant × 3 size,primary canonical color 选 bg-ink(克制,非 brand-strong 杏色),轻量迁移 4 个最显眼 site(CreateProject / EditProject / Sidebar 空 project CTA / YoloIntroDialog)。v0.1 Mac-only 决策 + Windows v0.2 计划:Mac-only 释放避免「未测平台仓促发」风险;v0.2 通过 GitHub Actions CI build NSIS .exe(不 cross-compile,不 VM 长期维护);Mac-side prep work 6 项(NSIS bundle / Python OS-aware default / OS-conditional 教程命令 / 键盘 mod-key 抽象 / joinPath / Windows checklist)推到下次 session,必须 Mac-backward-compatible。Rejected: 自动展开当前步 / <thinking> 单独 callout / 第一性原理删 4 chip / Onboarding 加 YOLO 偏好步 / YOLO banner / 按钮全代码库迁移(B 重型)/ Primary 用 brand-strong / chip prefill 模板 / joinPath 改 Tauri path API(强行换)/ 借 Windows 通宵 build。Open: Windows prep 何时启动 / 键盘快捷键 audit 精细度 / OS detection runtime vs Tauri async / CI workflow 落地时机 / destructive-soft 推广面 / PRD §11.5 YOLO 默认值更新待补。
2026-05-18 Bridge-owner prototype · 17/17 PASS · GO for B1 单一 session 把原计划 2-3 天 throwaway prototype 全部 17 项 checklist 推完,GO for B1。Lifecycle (L1-L5) 全过 — spawn ready 430ms · 3并发 341ms(比单 spawn 快,Python startup 共享 cache)· external kill -9 检测 3.48ms · panic+unwind drop SIGKILL 干净;Stdin command (C1-C3) — set_llm RTT 1.7ms · 5 fire-drain 无死锁;Stdout subscriber (S1-S4) — 双订阅(broadcast + UnixListener)内容一致 · S3 100 events 4548/s · S4 subscriber disconnect 互不影响;Stress (X1-X2) — 10k events sustained 4498/s linear scaling no OOM;Performance (P1-P3) Approach B(Rust 单边量化,TS 严格对比推 B1 dogfood)— RTT p99 614µs · 4684/s · 300s 内存 +0.4 MB,t+111s 后 RSS plateau 3+ 分钟 是 zero-leak 最强信号(spec 阈值 50 MB,实测 0.4 MB,125 倍 cushion)。设计 call:独立 tokio binary(spec 自相矛盾,broadcast + lifecycle 才是假说,Tauri emit 是 commodity)。Open: graceful shutdown 慢(~2.5s/bridge)记进 B2 设计 TODO。新增 invariant I11:Cargo panic = "unwind" 必须保留(L5 PASS 的前提)。BridgeProcess (registry.rs 145 行) 是 B1 runner_manager 模块的 source pattern,pre-subscribed receiver 是 load-bearing 实现细节。4 commits: 8d4769c scaffold · c22e6c1 L5+C+S+X · 79e1f0a P+verdict · 8fb66ba 300s plateau。
2026-05-18 B1 Rust core 骨架 + CLI 只读 · 完成 单一 session 把 B1 全 7 个 milestone 推完。M1 目录重组 (4ee23e3) 178 文件 161 git-rename 检测 / desktop/src-tauri→core, desktop→gui, bridge→runner, 新 cli/。CI 热修 (ff878b1) 修 pre-existing Check workflow python-bundle 路径验证失败(v0.1.1 起)。M2 Cargo workspace + crate desktopgalley-core + GalleyApi trait 6 read methods + 全套数据类型 (d79558a)。M3 sqlx 0.8 SQLite reads(复用 tauri-plugin-sql 的同版本,零新 transitive)+ 12 in-memory tests + 第一个 Tauri command list_sessions (9f6b369)。M4 galley CLI binary(6 subcommands · NDJSON · 错误 JSON on stdout · exit code 0/1/2/3/4 · GALLEY_DB_PATH 覆盖)+ 6 integration tests (e3f11a1)。M5 docs/agent-api.md 公开契约 draft(stability promise · exit code 表 · 6 commands field tables · error envelope · B2+ planned commands)(3e29dbc)。M6 GUI loadSessions 迁到 Rust core 路径 (80feb4c) — JC dogfood OK,建立 B2/B3 用的 10 步 migration template + 4 retrospective notes(Brief vs Full / Option 语义 / Tauri arg shape / stale-runtime tolerance)。M7 11/12 A acceptance 过 + 1 deferred(--pretty 推到 B4 polish)+ A11 perf gate 全 < 100ms(10-run avg 60-89ms)。5 个 O resolved:O1 workspace 在 core/ · O2 driver = sqlx · O3 error 走 stdout · O4 health 部分实现 · O5 GUI 模板 = loadSessions。3 新 O:O7 schemars 时机 · O8 invariants.md §I4 ↔ playbook T1.15 文档矛盾 · runner-manager runtime status 问题。Rejected: 3-commit M1 / 仓库顶 virtual workspace / rusqlite / schemars 在 M2 / thiserror / --pretty / help --as-agent / pnpm tauri build 在本 session。下一步 B2 (runner ownership 迁 Rust),B1 比 PRD 估的 3 周快 ~21× 完成。

格式约定

每个 entry 6 段:

  • Date / Status / Related — 元信息(含 PRD/DESIGN/commit 引用)
  • Context — 这次讨论或工作的背景
  • Decisions — 对齐的具体结论,列表化、可索引
  • Rejected alternatives — 考虑过但没选的方案 + 理由(最有价值的部分)
  • Open questions — 留待后续的问题
  • Next — 这次工作的下一步

触发时机

主动写 devlog 的三种场合:

  1. 每次 work session 结束("今天先到这里")
  2. 重大设计/架构决策对齐后(不一定等 session 结束)
  3. 阶段切换(如 Stage 1 → Stage 2,写一份阶段总结)

写作责任

  • Claude 主写:每次决策对齐后主动提议落 devlog
  • 作者 review:可以 inline 调整,Claude 根据反馈改
  • 不重复信息:devlog 不复述 PRD / DESIGN.md / CLAUDE.md 已有的内容,只记叙事 + decision provenance

文件命名

YYYY-MM-DD-topic-in-kebab-case.md,一天可以多个 entry(按主题分)。