feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(runtime): isolate implementation operators in Git worktrees - #1570

Merged
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor
Jul 28, 2026
Merged

feat(runtime): isolate implementation operators in Git worktrees#1570
likun666661 merged 3 commits into
mainfrom
agent/worktree-child-executor

Conversation

@likun666661

Copy link
Copy Markdown
Member

Summary

Follow-up to #1341: make code-changing child operators usable without teaching the graph scheduler about Git.

  • add a host-owned SubagentWorktreeExecutor capability and a strict, immutable workspace binding on linked child Sessions;
  • provision deterministic per-child Git branches and worktree paths, including same-lease retry/restart adoption;
  • persist the binding in SQLite Session metadata and restore it through Session summaries;
  • enable the implementation catalog profile only when the host supplies the executor, across Graph, agent_spawn, and Swarm paths;
  • wire the real executor into Desktop and expose Write/Edit/Bash only through the implementation profile's existing catalog policy;
  • retain terminal child worktrees so Session resume, follow-up, inspection, and patch handoff keep the exact filesystem state.

Two Graph implementation operators now receive distinct worktrees and can edit concurrently. Allocation for one Git common directory is serialized to avoid .git/config lock races; Agent execution remains concurrent.

Safety and boundaries

  • The Graph scheduler remains Git-agnostic. Workspace isolation is a host capability consumed during child Session materialization.
  • Fresh allocation fails closed for non-Git projects and dirty source worktrees, rather than silently omitting uncommitted parent state.
  • Lease, branch, path, common-dir, and base commit are validated on every resume/activation.
  • This slice does not merge child branches, delete retained worktrees, or add worktree UI. Those remain explicit lifecycle/product follow-ups.

Validation

  • npm run build
  • npm run lint -- --diagnostic-level=error
  • Core: 1,248 passed
  • Storage: 715 passed, 1 skipped
  • Runtime focused suites: 326 passed
  • Desktop: 2,953 passed
  • Headless isolated-tool suite: 54 passed
  • Real Git tests cover concurrent A/B isolation, parent cleanliness, retry/restart reuse, dirty-source rejection, and non-Git rejection.

Full Runtime/Headless sweeps also surfaced pre-existing environment-specific failures unrelated to this diff: one macOS executable-root assertion and two Python 3.9 Harbor adapter tests.

中文说明

这是 #1341 的后续能力:让会改代码的 Graph operator 真正拥有独立 worktree,同时不把 Git 逻辑塞进 graph scheduler。

  • 新增 host-owned SubagentWorktreeExecutor,并把不可变的 workspace binding 持久化到 child Session 的 SQLite metadata;
  • 每个 child 使用确定性的 branch/path/lease,同一次任务重试或进程重启后会复用原 worktree;
  • implementation profile 只有在 host 提供 executor 时才可用,Graph、agent_spawn、Swarm 统一走 SessionManager 的能力判断;
  • Desktop 已接入真实 Git executor,implementation child 可以使用 Write/Edit/Bash,而其它 profile 仍按 catalog allowlist 收窄;
  • child 结束后暂时保留 worktree,因此 Session 恢复、继续追问、观察和 patch handoff 都能看到同一份文件状态。

现在 Graph 中 A/B 两个 implementation operator 会得到不同的 worktree,可以并行改代码。同一 Git 仓库的“分配事务”会短暂串行,以避免 .git/config lock 冲突;Agent 的实际执行仍然并行。

安全边界:非 Git 项目直接失败;父 worktree 有未提交修改时也直接失败,避免 child 静默遗漏用户本地修改。本 PR 不负责自动 merge、自动清理 worktree 或新增 worktree UI。

@likun666661
likun666661 marked this pull request as ready for review July 28, 2026 13:40
@likun666661
likun666661 merged commit e4c6ddb into mainJul 28, 2026
3 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@likun666661