Repository navigation
Conversation
A decomposed child with workspace_kind=worktree and no explicit path got workspace_path=NULL. Dispatch then tried to anchor it on the board's default_workdir and, when the board had none, failed the spawn with 'no default_workdir set' — twice, tripping the failure-limit circuit breaker (live: t_ab2a7ce8, t_2dd0f5b7, 2026-09-02). The root of a decomposed callback graph is usually itself a dispatcher-materialized worktree <repo>/.worktrees/<root-id>, so the repo is recoverable from the root row: when the root path is a linked worktree checkout, stamp each pathless worktree child with the root's git common-dir parent (the main repo) as its explicit anchor. Children still get per-task worktrees (never the root's literal checkout), so sibling isolation is unchanged; a repo that can't be recovered keeps the anchorless row and the board-default dispatch path; scratch roots are untouched. Regression tests cover anchor inheritance + end-to-end child spawn resolution with no board default_workdir, the unrecoverable-root fallback, and scratch-root non-leakage.
Author
|
Review requested: this PR is ready for maintainer review. Scope: hermes_cli/kanban_db.py decompose_triage_task worktree-anchor inheritance + 3 regression tests in tests/hermes_cli/test_kanban_worktree_isolation.py. Verification: scripts/run_tests.sh over the kanban decompose/worktree/db/tools scope (108 passed, 0 failed), ruff clean. @NousResearch/maintainers please review — note the fork-review permission limitation prevented a formal reviewRequests entry (403 on RequestReviewsByLogin); this comment is the explicit review request. Do not merge on my behalf. |
2 of 3 tasks
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The auto-decomposer (
decompose_triage_task) deliberately leftworkspace_pathNULL onworktree-kind children so dispatch would materialize a fresh<repo>/.worktrees/<child-id>per sibling (sibling-isolation fix, #67567 lineage). But dispatch's fallback for an anchorless worktree task is the board'sdefault_workdir— and when the board has none,_resolve_worktree_workspaceraises:Live manifestation (2026-09-02, engineering board): the auto-decomposition of t_47766623 produced reviewer/QA children with
workspace_kind=worktree, workspace_path=NULL; both failed to spawn twice and hit the failure-limit circuit breaker (gave_up), blocking the whole downstream callback graph.Fix
The decomposition root is usually itself a dispatcher-materialized worktree
<repo>/.worktrees/<root-id>, so the repo is recoverable from the root row.decompose_triage_tasknow:worktreewith a path, resolves the root's repo anchor:<repo>/.git→<repo>);workspace_pathanchor. Dispatch still materializes a distinct<repo>/.worktrees/<child-id>+wt/<child-id>per child, so per-sibling isolation is unchanged (the anchor is the repo, never the root's literal checkout).Tests
New regression coverage in
tests/hermes_cli/test_kanban_worktree_isolation.py:_resolve_worktree_workspacewith no board default_workdir — the exact previously-failing condition;scripts/run_tests.shover the decompose/worktree/kanban-db/tools scope: 108 passed, 0 failed. ruff clean.