docs: integrate Bash tool bridge fix

This commit is contained in:
inman
2026-09-02 12:11:04 +08:00
parent 55bf80e88e
commit 774beee508
5 changed files with 88 additions and 86 deletions

View File

@@ -4,6 +4,15 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
## Integrated Through
- Bash tool-bridge source `49112b6` from task
`20260902-fix-bash-tool-bridge-9c4e7a12` is integrated through merge
`55bf80e` by task `20260902-integrate-bash-tool-bridge-e81a5c6d`.
Pi's prepare-all behavior can no longer deadlock two tools against Makelore's
same-project write lease before either tool starts: built-in `bash`, `edit`,
and `write`, plus dynamically declared product tools that acquire that lease,
execute sequentially within an assistant tool batch. Read-only batches retain
parallel execution, and Bash command timeout remains authoritative once its
child process starts.
- Coding terminal-settlement source `f1fd13a` from task
`20260901-fix-session-settlement-a47d2e91` is integrated through merge
`e76a1e1` by task `20260902-integrate-session-settlement-6e41c8b2`.
@@ -243,7 +252,7 @@ Makelore 在会话恢复、登录和刷新后由 Electron Main 请求 Works `/ap
AI 学习现在是已启用的运营精选项目目录,并继续受登录和 `module_access.learning` 控制。Renderer 通过 Main-owned Host API 获取分页项目卡片和 README 详情Markdown 支持 GFM、禁用原始 HTML。服务端发布时只校验图片 URL 为无凭据、默认端口、无 fragment 且当前 DNS 结果全部为公网地址的 HTTPS URL保留地址而不下载、识别格式、转码或镜像客户端仅为 README 图片节点启用直连,因此 SVG 和 Electron 支持的其他格式可直接显示单图失败不阻断详情。封面和历史发布媒体继续走受控路径。详情页的下载按钮打开系统保存对话框Main 将 ZIP 流式写入临时文件,只允许最多五跳同 Works origin 重定向,不校验 `Content-Length``archiveBytes`、实际流字节数或客户端大小上限,校验 SHA-256 和 ZIP 签名后原子保存Renderer 只接收 `saved``cancelled`。课程生成、进度、本地课程库、OpenMAIC player、Agent、ASR、课堂 runtime、Learning IPC 和 player artifact 打包已删除且没有兼容读取路径;历史课程数据保留但不再读取。服务端和客户端源码契约已完成,不代表生产部署或真实账号安装包联调已经完成。
AI 编程已经硬切到精确 pin 的 Pi `0.84.2`,不存在 OpenCode fallback 或双 runtime。project、Agent 与 Conversation 只在 `.makelore/project.json``.makelore/conversations.json` 使用本地 schema v2当前客户端不从 `.niancode``.opencode` 读取、迁移或删除项目元数据。Electron Main 按需启动一个长驻父 Agent Server每条 active/warm Conversation 在其中拥有独立 Runtime/Session/channel、credential store、extension context、generation/seq、Snapshot/Patch、model/thinking、队列、interaction 与错误状态Composer 在 lazy prepare 期间仍可编辑。Renderer 只通过 `/api/coding/*` 和 Snapshot-first/`patch-batch` SSE 消费产品中立合同gap/reconnect 只恢复目标 Conversationaccepted/uncertain mutation 不自动重放。Session hydration 沿完整 active branch 投影可见历史Pi compaction 只改变模型上下文并保持 summary 私有Renderer 首次挂载最近 120 个节点,向上滚动时按 100 个节点追加更早内容并补偿新增高度以保持阅读锚点。折叠的 thinking、助手过程说明与工具输出固定展示第一条可见内容和首个非空行横向偏移保持为零展开后仍显示完整内容。未解析 Conversation 第一次选模先 validate 并持久化 resolved metadata再 prepare同账号模型切换使用 target `set_model`跨账号只重建目标逻辑线程。top-level 逻辑 turn 并发为 4warm idle logical-thread LRU 为 8independent child 进程并发为 4 并使用 FIFO 进程预算 8coding child 与 parent 共用项目 write lease。prompt/compact confirmation timeout 后仍保留 run/Agent-Server-or-child-process/background ownership迟到 success/failure/exit/abort 单调且 exactly-once 收敛,页面隐藏不会停止 active/uncertain run。线程级替换只使目标 generation 失效;整个 Agent Server 退出会统一使所有旧 channel 失效,但 Main/Renderer 存活且下次恢复只重启一个 Server。Pi `0.84.2` 手动 compact 不发 `agent_settled`,由 correlated compact RPC 结果终结。父 Provider credential 只进入选中逻辑线程的内存 credential storechild 凭据只进入该短命进程;确定性的 Works user-context 缺失会失效 gateway credential、fail fast、不重放并投影固定 Provider-auth 错误,不归类为 Pi crash。精确的 `403 token_point_balance_exhausted` / `词元点数余额不足` 上游响应会在 Main 内归类为不可重试的配额耗尽Renderer 只收到稳定 `CODING_PROVIDER_QUOTA_EXHAUSTED` 与安全中文提示;重开会话仍保留该提示,不暴露上游 request id 或原始错误正文。真实 Provider 验证仍为用户明确接受的未验证风险macOS x64/arm64 与 native non-WSL Linux 也未通过平台发布门禁。
AI 编程已经硬切到精确 pin 的 Pi `0.84.2`,不存在 OpenCode fallback 或双 runtime。project、Agent 与 Conversation 只在 `.makelore/project.json``.makelore/conversations.json` 使用本地 schema v2当前客户端不从 `.niancode``.opencode` 读取、迁移或删除项目元数据。Electron Main 按需启动一个长驻父 Agent Server每条 active/warm Conversation 在其中拥有独立 Runtime/Session/channel、credential store、extension context、generation/seq、Snapshot/Patch、model/thinking、队列、interaction 与错误状态Composer 在 lazy prepare 期间仍可编辑。Renderer 只通过 `/api/coding/*` 和 Snapshot-first/`patch-batch` SSE 消费产品中立合同gap/reconnect 只恢复目标 Conversationaccepted/uncertain mutation 不自动重放。Session hydration 沿完整 active branch 投影可见历史Pi compaction 只改变模型上下文并保持 summary 私有Renderer 首次挂载最近 120 个节点,向上滚动时按 100 个节点追加更早内容并补偿新增高度以保持阅读锚点。折叠的 thinking、助手过程说明与工具输出固定展示第一条可见内容和首个非空行横向偏移保持为零展开后仍显示完整内容。未解析 Conversation 第一次选模先 validate 并持久化 resolved metadata再 prepare同账号模型切换使用 target `set_model`跨账号只重建目标逻辑线程。top-level 逻辑 turn 并发为 4warm idle logical-thread LRU 为 8independent child 进程并发为 4 并使用 FIFO 进程预算 8coding child 与 parent 共用项目 write lease。同一助手工具批次内,内置 `bash`/`edit`/`write` 与声明需要该 write lease 的动态产品工具按顺序执行,避免 Pi 在批量 prepare 阶段形成租约自锁;纯只读工具批次仍可并行。prompt/compact confirmation timeout 后仍保留 run/Agent-Server-or-child-process/background ownership迟到 success/failure/exit/abort 单调且 exactly-once 收敛,页面隐藏不会停止 active/uncertain run。线程级替换只使目标 generation 失效;整个 Agent Server 退出会统一使所有旧 channel 失效,但 Main/Renderer 存活且下次恢复只重启一个 Server。Pi `0.84.2` 手动 compact 不发 `agent_settled`,由 correlated compact RPC 结果终结。父 Provider credential 只进入选中逻辑线程的内存 credential storechild 凭据只进入该短命进程;确定性的 Works user-context 缺失会失效 gateway credential、fail fast、不重放并投影固定 Provider-auth 错误,不归类为 Pi crash。精确的 `403 token_point_balance_exhausted` / `词元点数余额不足` 上游响应会在 Main 内归类为不可重试的配额耗尽Renderer 只收到稳定 `CODING_PROVIDER_QUOTA_EXHAUSTED` 与安全中文提示;重开会话仍保留该提示,不暴露上游 request id 或原始错误正文。真实 Provider 验证仍为用户明确接受的未验证风险macOS x64/arm64 与 native non-WSL Linux 也未通过平台发布门禁。
Updater 仍由 Electron Main 选择目标 feed、记录原始诊断并保持失败语义。正式稳定源缺少对应平台 manifest 时设置页只显示一条简洁中文提示并允许重试不把缺包误报为已是最新版也不向普通界面暴露堆栈、URL、路径或错误码签名产物发布和真实升级安装仍属于外部 Release Gate。
@@ -251,6 +260,12 @@ Robot 绑定设备默认先显示“引导配网 / 已有激活码”路径选
## Recently Completed
- 2026-09-02: Integrated the Pi write-leased tool-batch correction. Multiple
Bash/edit/write or lease-requiring product tools emitted by one assistant
response now execute sequentially instead of waiting on a lease before any
command can start; read-only batches remain parallel. A real Agent Server
regression covers two Bash calls, a command-level timeout, and rejection of
the former HTTP-idle-timeout `fetch failed` path.
- 2026-09-02: Integrated bounded recovery for a missing Pi prompt settlement.
A final persisted assistant response can no longer leave the Composer permanently
processing merely because `agent_settled` was lost: Main waits for the normal

View File

@@ -1,84 +0,0 @@
# Task: Fix Bash tool execution bridge
## Identity
- Task ID: 20260902-fix-bash-tool-bridge-9c4e7a12
- Mode: Feature
- Branch: codex/20260902-fix-bash-tool-bridge-9c4e7a12-fix-bash-tool-bridge
- Worktree: /Users/inmanx/Documents/makelore-fix-bash-tool-bridge-9c4e7a12
- Base commit: 6073bd6f4ce269b067b13e1eed0371b38dc2c054
- Owner: codex
- Status: Completed
## Scope
- Reproduce and fix the Makelore-managed Pi tool-batch deadlock that delays
parallel Bash calls until the five-minute HTTP idle timeout.
- Preserve project-scoped write-lease isolation while making Bash/edit/write
tools execute sequentially inside one assistant tool batch.
- Add real Agent Server coverage for two Bash calls, including a command-level
timeout, and verify the same resource path used by packaged builds.
## Intent And Constraints
- Keep Pi `0.84.2` as the sole runtime and keep Renderer isolated from Pi wire.
- Do not replay an accepted mutation or weaken the cross-Conversation/project
write lease; only remove the same-batch pre-execution self-deadlock.
- Retain parallel execution for batches containing only read-only tools where
Pi supports it.
- Treat packaging as a verification path, not as a substitute for the source
correction.
## Outcome
- Reproduced the stall with the real Pi Agent Server process. Pi `0.84.2`
prepares every tool in a parallel batch before it executes any of them, while
Makelore acquires the project write lease in `tool_call` and releases it in
`tool_result`. Two Bash calls in one assistant response therefore self-deadlocked:
the first held the lease without starting and the second waited for that lease.
- Confirmed that the apparent five-minute Bash hang came from the Agent Server
HTTP idle timeout around the managed-extension request, not from a missing
shell dependency or the Bash command timeout. Packaging alone would retain the
same behavior because it ships this Agent Server resource and extension bundle.
- Marked built-in `bash`, `edit`, and `write` tools as sequential whenever an
Agent thread is rebound. Marked dynamically declared product tools that require
the same project write lease as sequential in the generated Makelore extension.
Read-only tool batches keep Pi's parallel behavior.
- Advanced the managed extension artifact from v4 to v5 and synchronized the
release proof and worker-opening expectations.
- Added a real-process regression that emits two Bash calls in one assistant
response. The first exercises its explicit command timeout and the second must
still run successfully without waiting for the HTTP idle timeout.
## Verification
- Pre-fix regression: the new real-process test failed with the second Bash result
equal to `fetch failed`, reproducing the production failure under a 250 ms HTTP
idle timeout.
- Focused regression: `pnpm exec vitest run
tests/unit/pi-agent-server-process-real.test.ts
tests/unit/pi-extension-bundle.test.ts
tests/unit/pi-managed-worker-opener.test.ts --maxWorkers=2` passed 3 files and
9 tests.
- `pnpm run typecheck` passed.
- `pnpm test` passed 213 files and 1,733 tests; 3 tests were skipped.
- `pnpm run lint:check` passed with 0 errors and 5 existing warnings in
`src/pages/Home/index.tsx` and `src/pages/Makelore/index.tsx`.
- `pnpm run build:vite` passed for Renderer, Electron Main, Preload, and the
release utility worker, proving the fixed Agent Server resource is included by
the production build path.
- `git diff --check` passed.
## Follow-ups
- Integrate this feature branch into local `main`, update the canonical current
state/README, restart Makelore, and use the real-process regression as the
non-destructive smoke check instead of replaying the user's accepted turn.
## Promotion Candidates
- Promote the write-lease batch rule to README/current state: write-leased Pi
tools are serialized within one assistant batch, while read-only tools may
remain parallel.
- Record the full-suite, production-build, and real-process regression results in
the evidence index during integration.

View File

@@ -0,0 +1,70 @@
# Task: Integrate Bash tool bridge fix
## Identity
- Task ID: 20260902-integrate-bash-tool-bridge-e81a5c6d
- Mode: Integration
- Branch: main
- Worktree: /Users/inmanx/Documents/makelore
- Base commit: 6073bd6f4ce269b067b13e1eed0371b38dc2c054
- Owner: codex
- Status: Completed
## Scope
- Merge completed feature task `20260902-fix-bash-tool-bridge-9c4e7a12`
(`49112b6`) into local `main`.
- Reconcile the write-leased Pi tool-batch rule with README, canonical current
state, and the evidence index.
- Re-run focused real-process coverage, typecheck, and the production Vite build
on the integrated tree, then restart the local Makelore platform.
## Intent And Constraints
- Preserve the feature task's bounded semantics: only tools that acquire the
project write lease are serialized; read-only Pi tool batches remain parallel.
- Do not replay or mutate the user's accepted, currently stuck Conversation as a
smoke test. Use the disposable real-process regression instead.
- Merge only to local `main`; do not push, package, deploy, or alter unrelated
user changes.
- Treat production build success as proof that packaging consumes the fixed
resources, not as permission to claim an installer artifact was produced.
## Outcome
- Merged source commit `49112b6` into local `main` as merge commit `55bf80e`.
- Integrated the bounded Pi tool-batch correction: built-in `bash`, `edit`, and
`write`, plus dynamic product tools that acquire the project write lease, are
sequential within one assistant response. Read-only batches retain parallel
execution.
- Updated README, canonical current state, and the evidence index with the exact
failure mechanism and verification boundary. A production build was verified;
no installer was created, pushed, deployed, or published.
- Stopped the old development process cleanly so its already-open Agent Server
could not keep serving the pre-fix resource. The platform restart is the final
operational handoff after the integration commit.
## Verification
- Source branch: the pre-fix real-process regression reproduced the second Bash
result as `fetch failed` under a 250 ms managed-extension HTTP idle timeout.
- Source branch: 3 focused files / 9 tests, 213 full files / 1,733 tests with 3
skipped, typecheck, lint with 0 errors / 5 existing warnings, and the full
Renderer/Main/Preload/utility Vite production build passed.
- Integrated `main`: the 3 focused Pi process/extension/worker files passed all
9 tests, `pnpm run typecheck` passed, and `pnpm run build:vite` passed for all
four production targets.
- The regression verifies that a timed-out first Bash does not block the second
Bash, the second returns `SECOND_OK`, and neither result contains `fetch failed`.
## Follow-ups
- A signed installer is unnecessary to correct this source-level deadlock. Build
an installer only when release validation or distribution is requested; the
normal packaged resource path already consumes the corrected Agent Server and
v5 extension bundle.
## Promotion Candidates
- None; the relevant runtime contract and evidence were promoted during this
integration task.

View File

@@ -4,6 +4,7 @@ Use this index for searchable, traceable evidence records.
| Date | Topic | Status | Source | Detail |
|---|---|---|---|---|
| 2026-09-02 | Makelore Code Pi write-leased tool-batch deadlock fix | Integrated locally; source and production-build verification passed; no installer produced | Source `49112b6`, merge `55bf80e`, source task `20260902-fix-bash-tool-bridge-9c4e7a12`, integration task `20260902-integrate-bash-tool-bridge-e81a5c6d` | Live evidence showed every assistant response emitting two Bash calls; Pi prepared both hooks before execution, so the first acquired the project write lease and the second waited before the first could run or release it. The five-minute delay was the managed-extension HTTP idle timeout, not a missing dependency. Built-in `bash`/`edit`/`write` and dynamically declared lease-requiring tools are now sequential within a batch while read-only batches remain parallel. The pre-fix real-process regression reproduced `fetch failed`; the source passed 3 focused files / 9 tests, 213 full files / 1,733 tests with 3 skipped, typecheck, lint with 0 errors / 5 existing warnings, and the Renderer/Main/Preload/utility production build. |
| 2026-09-02 | Makelore Code missing terminal-settlement recovery | Integrated locally; live pre-fix stall diagnosed and automated regression coverage passed | Source `f1fd13a`, merge `e76a1e1`, source task `20260901-fix-session-settlement-a47d2e91`, integration task `20260902-integrate-session-settlement-6e41c8b2` | Live evidence showed Pi had persisted its final assistant response while Main retained run ownership because no effective `agent_settled` arrived. The fix preserves normal settlement authority and no-replay semantics, reports post-accept prompt rejection, and after a bounded grace period probes only the target thread: exact idle evidence hydrates and settles once; contradictory state fails that target explicitly. The source passed 68 focused tests, 1,732 full tests / 3 skipped, typecheck, lint, and Vite build; the integrated tree repeated focused runtime/process tests, typecheck, and Vite build. |
| 2026-08-30 | MakeLore AI Design Living Form V2 hard cutover | Integrated locally with matching server source; production data cutover and Provider activation pending | Client source `b0b5a602b501308a23eb27e2f51a5169b9e46b1e`, server source `b5351d54f595ce8eb873593e462e4a556bea0b05`, integration task `20260830-integrate-marketplace-design-client-main-9d5f3b82`, ADR-007 | Replaces nested V1 Conversations, Briefs, editable provider Prompt, mutable Quote PATCH, and local semantic fallback with one current Direction, one Living Form/Specification authority, stable operations, immutable Quote confirmation, and Main-owned V2 transport. Client source passed typecheck, lint with zero errors, 1,425 unit tests, Vite/Electron build, and 2 Electron E2E tests. Server source passed 2,626 tests / 31 skipped under UTF-8 mode. No production database cutover, real paid Provider request, deployment, or publication occurred. |
| 2026-08-30 | MakeLore curated Plugin Marketplace Release A | Integrated locally; XMA-01 live acceptance PASS; production trust activation HOLD | Source `40df677a31ff7651f962151eb84b925987781c03`, source task `20260828-plugin-marketplace-client-5f8b3d72`, integration task `20260830-integrate-plugin-marketplace-client-6e3b9d82` | R7 Standards/Spec passed with zero findings. XMA-01 passed 12/12 using real PostgreSQL, signed-in packaged MakeLore, Operations-published temporary-key packages, A/B account isolation, immutable install/update/freeze/rollback, project/Agent/Pi materialization, lifecycle invalidation, pricing-only ETag change, Data Service 10 tools/14 operations and zero Token Point transactions. Final Windows installer was 208,235,670 bytes with SHA-256 `738A2F6573C502281787F418EA666C6E62C287CA0EC13C6EB22369DAB0B3FFFA`. The official Ed25519 public key was not supplied, so the production trust store correctly remains fail closed; no deployment or production publication occurred. |

View File

@@ -16,7 +16,7 @@ Makelore 是一个面向软件、视觉创作、互动学习与智能机器人
## 当前产品状态
- 桌面技术栈Electron、React 19、Vite、TypeScript、Zustand、Tailwind CSS。
- AI 编程核心对话运行时Electron Main 按需启动一个长驻 Pi Agent Server同一进程内为每条 Conversation 建立独立的 Runtime、Session、凭证视图、扩展上下文和 JSONL 通道,同时复用 Pi 模块与进程启动成本Server 异常退出时所有旧通道统一失效,下一次恢复只重启一个 Server。Renderer 不直接启动或调用 Pi也不读取其 wire 类型。项目与 Conversation 元数据先从本地读取,选中对话后才按需准备对应逻辑线程;输入框不等待运行时准备完成。子 Agent 仍使用独立的短生命周期进程以保留并发配额、故障和写入边界macOS 上两类后台进程都使用 Electron 自带的 Helper不在 Dock 中创建额外应用图标。
- AI 编程核心对话运行时Electron Main 按需启动一个长驻 Pi Agent Server同一进程内为每条 Conversation 建立独立的 Runtime、Session、凭证视图、扩展上下文和 JSONL 通道,同时复用 Pi 模块与进程启动成本Server 异常退出时所有旧通道统一失效,下一次恢复只重启一个 Server。Renderer 不直接启动或调用 Pi也不读取其 wire 类型。项目与 Conversation 元数据先从本地读取,选中对话后才按需准备对应逻辑线程;输入框不等待运行时准备完成。同一助手工具批次中,会取得项目写租约的 `bash``edit``write` 与动态产品工具按顺序执行,避免批次在命令启动前自锁;纯只读工具仍可并行。子 Agent 仍使用独立的短生命周期进程以保留并发配额、故障和写入边界macOS 上两类后台进程都使用 Electron 自带的 Helper不在 Dock 中创建额外应用图标。
- AI 编程历史与配额反馈Pi 上下文压缩不删除用户可见的 active-branch 历史,压缩摘要保持 Main-privateRenderer 首次渲染最近 120 个节点,向上滚动时按 100 个节点追加更早内容并保持阅读位置。Main 精确识别 `token_point_balance_exhausted` / `词元点数余额不足`,只向 Renderer 投影不可重试的稳定配额错误和安全中文提示,重开会话后仍可见且不暴露上游原始错误或 request id。
- 桌面性能策略:应用窗口使用不透明浅色表面并默认保留硬件合成;仅在显式安全模式或短时间内重复 GPU 进程崩溃时启用软件渲染,并把故障原因保存在用户数据目录。启动关键路径只创建本地应用壳,认证、代理、同步、更新和遥测在首帧后延迟初始化;开发版可通过 `app:performance` 快照观察 GPU、进程、WebContents、事件循环与 Renderer Long Task 聚合指标。
- 后台生命周期Main 统一维护模块活动状态与任务租约。隐藏窗口、离开模块和关闭开发浏览器会释放非必要连接生成、Code 执行、下载与发布构建持有租约并在完成后释放。已写入 Pi 的 prompt 或上下文整理即使确认超过 10 秒,也会继续持有运行所有权与后台租约,直到迟到响应、权威事件、明确失败或用户清理使其收敛;此时同一 Conversation 不接受重叠 mutation其他 Conversation 不受影响。各模块的后台连接、轮询和子进程必须通过同一生命周期入口登记。