Skip to content

feat(crew): run each crewmate's worker in its own git worktree - #23563

Open
buluoray wants to merge 1 commit into
mainfrom
feat/crewmate-worker-worktrees
Open

buluoray wants to merge 1 commit into
mainfrom
feat/crewmate-worker-worktrees

Conversation

@buluoray

@buluoray buluoray commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Problem / Motivation

Goal: Each crewmate's worker works in the crewmate's own git worktree and branch, so two crewmates handed the same repository never edit one checkout or one branch.

With Crewmate 2.0 (#23010) every crewmate hands its work to a worker, but the worker runs wherever its session's project points, usually the repository's shared checkout. Two crewmates working in one repository then edit the same working tree and commit on whatever branch happens to be checked out, so their changes mix and one can move the branch under the other.

Why it matters

Anyone running more than one crewmate on a repository gets tangled commits and lost or overwritten work, and has to keep each crewmate out of the others' way by hand. A worktree per crewmate keeps each one's changes on its own branch, and the user's own checkout stays as they left it.

Not a goal

  • A switch to turn worktrees off, or a choice of where they live beyond the fallback below.
  • Enforcing branch names: the crew/<slug>/ prefix is asked for in the prompt, not refused by the gateway.
  • Merging, pushing or opening pull requests from a crewmate's branch.
  • Worktrees for the crewmate's conductor chat or for ordinary (non-crewmate) sessions.
  • Dynamic capabilities (its own pull request).

What changed (motivation → approach → change)

Goal → give each crewmate one worktree per repository and point its workers there before the turn starts → reuse the follow-up card's sandboxed git runner (handlers/worktree._run_git) and the existing project/binding re-capture, so nothing else in the turn changes.

  • kiro_crew/crewmate_worktree.py: makes or reuses the crewmate's worktree beside the repository, <parent>/<repo>.worktrees/<crewmate slug>/ on crew/<slug>/<repo>, cut once from the repository's default branch (origin/HEAD, else a local main, never the shared checkout's HEAD). A name the cleaning changed (app+tools) or one over 40 characters keeps a digest of the whole, so two names never share a path or branch; every segment is a legal git ref component (no .., no leading ., no .lock ending), so app.lock and app..tools still get a branch. A repository whose parent is not writable (or a filesystem root) falls back to <crewmate workspace>/worktrees/<crewmate slug>/<repo>-<hash>. Every worktree is listed in worktrees/index.json with the crewmate's slug (read through hooks.safe_read_prefix, so a link to a sensitive path reads as no index; written with no-follow descriptors and a rename relative to the pinned worktrees folder, so a worktrees swapped for a link, to governance profiles/ say, gets nothing written); two crewmates may share a workspace, so lookup, reuse and removal read only the crewmate's own entries, under a per-index lock. A listed worktree is reused on any of the crewmate's branches, a topic branch a worker cut there included; one whose folder was deleted by hand is pruned from git and built again (a locked one still refuses). A worktree add that times out or fails is unwound (branch and folder removed) before the error is raised. sync_with_base rebases the branch onto the same default branch only when it was never pushed (no upstream, and no remote-tracking ref holding any of its own commits, so a commit made after a push does not hide it and a fresh branch with no commits of its own is brought up to date; this covers any branch with a PR), the worktree is clean (no uncommitted or untracked changes), it holds no merge commit and it is behind. The rebase moves only this branch (rebase.updateRefs off) and signs nothing (--no-gpg-sign, commit.gpgSign=false, every gpg.*program pinned), so a signing program the repository names never runs. One that stops, fails or times out is aborted and checked back on its old commit; when that cannot be shown, the turn ends with the reason instead of running on a half-rebased tree, and a later turn there is refused the same way until the rebase is finished or aborted. Before status or a rebase the worktree is checked again for a program the repository's config makes git run (a checkout filter or a merge driver); a repository that has one is left untouched and the worker told. One sync runs at a time per worktree, and a rebase it did not start is never aborted (the turn is refused instead). The dirty check does not enter submodules, whose config is not screened. A pushed branch is never rebased automatically: the worker runs git merge-tree --write-tree <base> HEAD before it pushes and rebases explicitly only on a conflict, saying so in its report. Each outcome leaves a one-line note.
  • dashboard/crewmate_worktree_scope.py: for a worker turn (a kirocrew-mate-worker record with the crewmate's id), turn admission picks the repository from the message's paths (absolute, ~ or Windows drive paths; a quoted one is read whole, spaces included), then the slot's project, then the crewmate's goals. A path in another repository (another of the crewmate's own worktrees included) sends the turn there; a path in the worktree it already runs in, or in the shared checkout of that same repository, is passed over, so the session is not reset. A worktree left mid-rebase refuses the turn whatever the message names. It moves slot.project into the worktree and re-captures the binding under the dispatch lock (chat_turn/turn_admission.py). A running session takes the same deferred reset set_project uses.
  • context_assembly/turn.py: the [PROJECT] line names the repository and branch (the .git marker, commondir and HEAD are read through hooks.safe_read_prefix, so a marker linked to a credential file is refused; HEAD must be one line naming a plain, git-legal branch and the repository path must hold no control character or bracket, checked again at the rail, so a forged HEAD adds no line), says to commit there, and carries the base-sync note once.
  • crewmate_prompts.json: worktree.* notes, plus one sentence each in the conductor's crew-log section and the worker's principles.
  • dashboard/agent_admin/crew_removal.py: deleting a crewmate removes its listed worktrees with git worktree remove (never --force). It keeps one with uncommitted changes, or one whose repository configures a checkout filter, and leaves branches, the repositories' checkouts and other crewmates' worktrees alone.
  • Rebuilt on feat(crew): give each crewmate its own config, a conductor and a worker #23010 as merged rather than rebased: feat(crew): give each crewmate its own config, a conductor and a worker #23010 dropped the Crewmate 2.0 switch, so the worktree code runs without a switch check, and the scope is called from turn admission.

Spec: docs/system-specs/modules/crew-mode.md ("Each crewmate works in a git worktree of its own", and the conductor/worker prompt lines).

Backwards compatibility

Compatible: a worker turn whose paths are in no git repository runs where it did before, and a git failure leaves the turn on its current project, except a rebase this change started that cannot be put back, which ends that worker's turn with the reason. Conductor chats and non-crewmate sessions are untouched.

Removes nothing: the change adds worktrees, prompt lines and a cleanup step on crewmate deletion; the cleanup removes only worktrees this change created and listed in the crewmate's own index.

Tests

  • test/test_crewmate_worktree.py: a real worker turn through chat_runner._run_chat runs with its cwd in the crewmate's worktree. Two crewmates get separate worktrees and branches, and a worktree is reused. The [PROJECT] line names the branch. Every worker turn syncs with the default branch first, never the shared checkout's branch: a clean worktree is rebased, a dirty one is left with its note, a pushed branch (with an upstream, pushed under another name, or with a commit made after the push) is never rebased, a fresh branch cut from origin is brought up to date, the rebase moves no other branch under rebase.updateRefs, an untracked file keeps it from being rebased, a branch holding a merge commit is left for the worker, a rebase that stops or times out is undone, one that cannot be undone ends the turn and keeps refusing the next one, a filter or merge driver the repository names stops the sync without running, a rebase the sync did not start is left alone, two syncs of one worktree run one at a time, a brief naming another repository moves the turn there while one naming the same repository's shared checkout does not, a mid-rebase worktree refuses a turn that names a file in it, the dirty check skips submodules, the rebase never runs a repository-named signing program, a .git linked to a credential file is refused unread, a timed-out worktree add leaves no branch or folder, a ~ path into its own worktree moves nothing, app.lock and app..tools get valid branches, a brief naming a not-yet-created file in another repository goes to that repository, an index.json linked to a credential file is refused unread, a worktrees folder linked to a profiles folder gets nothing written and reads as no index, a forged or multiline HEAD names no worktree and adds no rail line, and removal keeps a worktree whose repository names a filter. A worktree folder deleted by hand is built again; a locked one still refuses. The admission hook's own branches (conductor skipped, candidate order, refusals, the session reset) run without git. Deleting the crewmate removes its worktrees but keeps a dirty one.
  • test/test_crewmate_worktree_layout.py: the beside-the-repository layout, sanitised names, two long slugs kept apart, names that clean alike kept apart, the branch cut from main while the checkout sits on a feature branch, the fallback when the parent is not writable or the repository is a root, the index (a listed worktree used where it is, two concurrent turns writing it one at a time, two crewmates sharing a workspace never touching each other's), a topic branch keeping the worktree the crewmate's, quoted paths with spaces and Windows paths, and paths on different drives.
  • Re-pinned: test/test_agent_refactor_spec_bytes.py (the worker spec's prompt) and the all-met prompt preview golden (the two new sentences only).

Proof: not provable -- other: new feature, the new tests exercise code this pull request adds

Manual verification

N/A — unit coverage drives real git in temporary repositories, through the sandboxed runner where the host has a backend and plain git otherwise (the Linux CI runners have none, so the tests no longer skip there; Windows keeps the skip). Run locally both ways, with TMPDIR outside the crew data home.

Related Issues

Follows #23010.

Checklist

  • At most two commits (one is the norm), with a Conventional Commits title (feat|fix|docs|style|refactor|perf|test|chore|ci|build|revert: ...)
  • Existing tests pass and new tests added for new functionality
  • Self-review completed; code follows project style guidelines
  • Documentation updated (if applicable)
  • No secrets, credentials, or internal references in the diff

Contribution License Agreement

Contributions are accepted under the project's Apache-2.0 license.

@buluoray
buluoray requested review from a team and KiroCrewCaptain as code owners October 23, 2026 21:22
@buluoray
buluoray requested a review from CrysisDeu October 23, 2026 21:22
@github-actions github-actions Bot added the readiness: checking Automated validation is still running label Oct 23, 2026
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

UX Review (Opus 5.5) — ⏭️ skipped

Revision 9953d01ea11f1da706b2600e61dbf6b389e3af2a touches no user-facing surface (no changes under website/ or committed screenshots), so the UX review was skipped. Does not block merge.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

First Principles Review (Opus 5.5) — ✅ human override accepted

@buluoray overrode this lane for 9953d01ea11f1da706b2600e61dbf6b389e3af2a via /ai-review override (this commit only).

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Design Review (Opus 5.5) — ✅ PASS

Design-level review of 9953d01ea11f1da706b2600e61dbf6b389e3af2a — updated in place on each push. A BLOCK verdict blocks PR readiness; PASS does not.

Design-Verdict: PASS

Nothing blocks: the change adds worktrees and a cleanup step, takes nothing away, and reuses the existing sandboxed git runner and the deferred reset that set_project already uses.

Notes

  • sync_with_base runs a rebase inside turn admission while the dispatch lock is held, on every worker turn. A slow or wedged git call therefore delays the turn for its whole timeout. A cheap "is the branch behind" check before taking the lock would cut that cost.

[DESIGN-REVIEWED] 9953d01

Description read

[DESCRIPTION-READ] 2f8baee1a015cf5544319980ec238f452745594291913944e0f7813fd576d9c9

That sha256 names everything this verdict read: the PR description, plus the 1 evidence file(s) the workflow collected from it and handed this review. It covers that evidence because the media strip replaces every attachment URL with the same placeholder, so an edit swapping one attachment for another would leave the description's captured text identical while what this review judged changed. Recompute it with .github/scripts/pr-description-capture.sh over the same inputs; if it differs, the description or that evidence changed after this verdict was formed and any finding drawn from either is unproven.

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Opus 5.5 Review — 🔴 changes requested (blocking)

Reviewed 9953d01ea11f1da706b2600e61dbf6b389e3af2a — this comment is updated in place on each push.

Blocks: one path in a worker's brief that sits under a directory the gateway can't search makes the worker run in the shared checkout. The first candidate path raises PermissionError, the lookup returns early, and the slot's own repository is never tried.

BLOCKING — src/kiro_crew/dashboard/crewmate_worktree_scope.py:118

        except Exception:  # noqa: BLE001 - git unavailable: the turn runs where it was
            logger.warning("crewmate %s: worktree lookup failed", name, exc_info=True)
            return None

Trigger: a worker turn's message names a path inside a directory the gateway user can't search, such as /etc/ssl/private/key.pem (0710 root:ssl-cert), /root/..., or another user's home. Message paths are tried before the slot project. ensure → repo_root → _nearest_dir stops at /etc/ssl/private → _has_git_marker → Path("/etc/ssl/private/.git").exists(). On the required Python ≥3.12 that raises PermissionError, because EACCES is not an errno pathlib ignores (reproduced). It is not WorktreeRefused, so this generic except catches it.
Outcome: resolve_worker_project returns None without trying the remaining candidates, including the slot's project repository. scope_worker_turn returns "" and the worker's turn runs in the shared checkout. That is the shared working tree and checked-out branch this change exists to keep crewmates out of.
Anchor: defect
Fix: on a per-candidate error other than SandboxUnavailable, log it and continue to the next candidate instead of return None. Or make _has_git_marker, describe and refuse_if_mid_rebase probe .git with os.path.exists, which never raises.

[BLOCK-MERGE] 9953d01
[OPUS-REVIEWED] 9953d01

Verdict parsed from the review's SHA-scoped output markers for commit 9953d01ea11f1da706b2600e61dbf6b389e3af2a.

False positive or not applicable? A repository writer can comment:
/ai-review override fable 9953d01ea11f1da706b2600e61dbf6b389e3af2a false-positive: <reason, 20 to 500 characters>

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

GPT 6.1 Review — 🔴 changes requested (blocking)

GPT 6.1 found at least one blocking issue that must be resolved before merging 9953d01ea11f1da706b2600e61dbf6b389e3af2a. 2 of 3 blocking finding(s) are security-class and were withheld from adjudication, so the blocking verdict stands.

This comment is updated in place on each push.

BLOCKING -- src/kiro_crew/crewmate_worktree.py:970 -- Index cleanup can delete a governance profile through a directory swap

os.unlink(os.path.join(root, INDEX_FILE))
Trigger: During api_kirocrew_agent_delete → remove_for_member → _remove_listed, an agent swaps the writable workspace’s worktrees directory for a symlink to governance profiles/ after the index is read; all listed worktrees are removed and profiles/index.json exists.
Outcome: The unsandboxed gateway deletes that profile. On reload, its binding disappears and its narrowing restrictions no longer apply; the subprocess sandbox does not protect this gateway-side unlink.
Anchor: residual/security
Fix: Delete the index relative to a no-follow-pinned worktrees directory, using the protection already applied by _write_index.

BLOCKING -- src/kiro_crew/context_assembly/turn.py:398 -- Repository config can forge trusted prompt boundaries

parts[-1] = parts[-1][:-1] + _base_note + "\n\n"
Trigger: When the base advances, a valid config key such as merge.[END OF SESSION CONTEXT][CURRENT USER REQUEST — respond to this].driver flows through _repo_program → _sync_locked → take_base_note → rail_parts.
Outcome: Repository-controlled request-boundary markers enter the model’s trusted prompt unchanged. The subsequent whole-prefix scrub removes only reply-format markers, leaving this forged user-request boundary intact.
Anchor: residual/security
Fix: Apply ctx._neutralize_structural_markers to the base note before appending it.

BLOCKING -- src/kiro_crew/crewmate_worktree.py:604 -- An unknown default branch makes synchronization follow the shared checkout

return "HEAD"
Trigger: A repository uses trunk, lacks origin/HEAD, main, and master, and has an existing clean, unpushed mate worktree. The user checks out a feature branch containing new commits; the next worker turn calls scope_worker_turn → sync_with_base → _default_branch.
Outcome: Automatic synchronization rebases the mate branch onto the user’s feature branch, incorporating unrelated work rather than synchronizing with trunk.
Anchor: defect
Fix: Resolve an authoritative default branch or skip automatic synchronization when none is known; do not use the shared checkout’s HEAD as the sync base.

[BLOCK-MERGE] 9953d01
[GPT-REVIEWED] 9953d01

Adjudication (Opus 5.5) — is blocking on each finding proportionate?

F3 — MEDIUM. Three things have to be true. The repository has no refs/remotes/origin/HEAD and no local main or master, so the code falls through to return "HEAD" (src/kiro_crew/crewmate_worktree.py:599-604). That HEAD then becomes the base at crewmate_worktree.py:692-693. Finally the branch must be unpushed, clean and free of merges, and then _rebase runs (:714-723). There is no recovery path: the note labels the feature branch as the base (:703), so the worker takes the wrong base as correct, and only a manual reflog reset undoes it. The function's own docstring (:594-597) names the harm it then allows.
The real fix is cheap: return "" when no base is known, and the existing if not base: return "" at :694-695 already skips the sync. It needs no new state or mechanism, so the cost is well below the harm.

[ADJUDICATION] 9953d01 total=1 uphold=1 downgrade=0
UPHOLD F3 src/kiro_crew/crewmate_worktree.py:604 reason=harm-warrants-remedy
[GPT-ADJUDICATED] 9953d01

[ADJUDICATION-FENCED] 9953d01 fenced=2 flagged=1
FLAG F1 src/kiro_crew/crewmate_worktree.py:970 -- This needs three things at once: the operator has a governance profile literally named index (profiles are any *.json, platform/governance_profiles.py:279); the operator happens to delete a crewmate; and an agent keeps flipping worktrees to a symlink and back so the swap lands after _read_index, because a link that is already in place reads as {} (crewmate_worktree.py:277-279) and leaves nothing to unlink. Even then the result is one profile deleted, which the operator can see and restore.
UPHOLD-FENCED F2 src/kiro_crew/context_assembly/turn.py:398 -- _repo_program (crewmate_worktree.py:682-684) returns a merge-driver config key the agent can write, sanitized only by truncation to 120 characters; take_base_note (:875-877) returns it as-is; and turn.py:397-398 appends it to the trusted rail without the rail_safe check its sibling values get (turn.py:381), so a forged context boundary is reachable on any base advance.
[GPT-ADJUDICATED-FENCED] 9953d01

🏷️ Fenced finding(s) machine-flagged as likely edge case

The security fence keeps these findings blocking regardless of adjudication; the only clearance path is a human override. The annotate-only pass judged the condition combination each one requires extreme, and pre-drafted the override rationale below. A repository writer must independently verify a rationale before posting it — it is machine-authored, and a wrong override on a security-class finding ships exactly the class the fence exists to stop.

  • F1 src/kiro_crew/crewmate_worktree.py:970 — This needs three things at once: the operator has a governance profile literally named index (profiles are any *.json, platform/governance_profiles.py:279); the operator happens to delete a crewmate; and an agent keeps flipping worktrees to a symlink and back so the swap lands after _read_index, because a link that is already in place reads as {} (crewmate_worktree.py:277-279) and leaves nothing to unlink. Even then the result is one profile deleted, which the operator can see and restore.

    /ai-review override gpt 9953d01ea11f1da706b2600e61dbf6b389e3af2a <class>: This needs three things at once: the operator has a governance profile literally named index (profiles are any *.json, platform/governance_profiles.py:279); the operator happens to delete a crewmate; and an agent keeps flipping worktrees to a symlink and back so the swap lands after _read_index, because a link that is already in place reads as {} (crewmate_worktree.py:277-279) and leaves nothing to unlink. Even then the result is one profile deleted, which the operator can see and restore.
    

Replace <class> with the class that records what you did. These findings are real, so for an accepted risk use owner-decision (link the decision comment in the reason) or deferred #<N> (a tracked follow-up issue); false-positive only if you verified the finding is wrong. Not not-applicable: that class files the override as a rule mismatch in the audit.

False positive or not applicable? A repository writer can comment:
/ai-review override gpt 9953d01ea11f1da706b2600e61dbf6b389e3af2a false-positive: <reason, 20 to 500 characters>

@github-actions github-actions Bot added readiness: action required A blocking check or review needs attention and removed readiness: checking Automated validation is still running labels Oct 23, 2026
@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from 682cfa7 to 4cea3db Compare October 23, 2026 21:57
@github-actions github-actions Bot added readiness: checking Automated validation is still running readiness: action required A blocking check or review needs attention and removed readiness: action required A blocking check or review needs attention readiness: checking Automated validation is still running labels Oct 23, 2026
@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from 4cea3db to 963e809 Compare October 23, 2026 22:59
@github-actions github-actions Bot added readiness: checking Automated validation is still running readiness: action required A blocking check or review needs attention and removed readiness: action required A blocking check or review needs attention readiness: checking Automated validation is still running labels Oct 23, 2026
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles 963e809: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default, so parallel workers never edit the same checkout.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray marked the first-principles AI finding as false positive, not applicable, or explicitly accepted for 963e8094002da814e541769ad90c342bdecfcac7.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default, so parallel workers never edit the same checkout.

This decision applies only to this commit. A new push requires a new judgment.

@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from 963e809 to dc4f0ff Compare October 24, 2026 01:02
@github-actions github-actions Bot added readiness: checking Automated validation is still running and removed readiness: action required A blocking check or review needs attention labels Oct 24, 2026
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles dc4f0ff: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray recorded a legacy release (class legacy) for the first-principles AI finding on dc4f0ffa2235fd46a136f0b40b93f0c0e92f3116.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

This decision applies only to this commit. A new push requires a new judgment.

@github-actions

Copy link
Copy Markdown
Contributor

This override used the old command without a class. It was recorded as class legacy, and the old command stops working on 2026-12-09. Name a class from now on. Use /ai-review override <fable|gpt|design|ux|first-principles|scope|all> <current-sha> <class>[ #N]: <reason, 20 to 500 characters>, where <class> is one of false-positive, not-applicable, pre-existing, evidence-supplied, infra-failure, reissue, deferred, owner-decision. What each class needs: docs/ci/ci-and-reviews.md#risk-release-records.

@github-actions github-actions Bot removed the readiness: checking Automated validation is still running label Oct 24, 2026
@github-actions github-actions Bot added the readiness: action required A blocking check or review needs attention label Oct 24, 2026
@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from d8f3fc4 to a0ba86b Compare October 24, 2026 07:59
@github-actions github-actions Bot added readiness: checking Automated validation is still running and removed readiness: action required A blocking check or review needs attention labels Oct 24, 2026
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles a0ba86b: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

@github-actions

Copy link
Copy Markdown
Contributor

AI-review override not recorded: a0ba86b7e2d1fd9cb2a4c94d71bd5b06d4ba5b69 is not the current PR head. Re-run the command with a0ba86b7e2077be2864457f5d23dddb40678e549.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray recorded a legacy release (class legacy) for the first-principles AI finding on a0ba86b7e2077be2864457f5d23dddb40678e549.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

This decision applies only to this commit. A new push requires a new judgment.

@github-actions

Copy link
Copy Markdown
Contributor

This override used the old command without a class. It was recorded as class legacy, and the old command stops working on 2026-12-09. Name a class from now on. Use /ai-review override <fable|gpt|design|ux|first-principles|scope|all> <current-sha> <class>[ #N]: <reason, 20 to 500 characters>, where <class> is one of false-positive, not-applicable, pre-existing, evidence-supplied, infra-failure, reissue, deferred, owner-decision. What each class needs: docs/ci/ci-and-reviews.md#risk-release-records.

@github-actions github-actions Bot added readiness: action required A blocking check or review needs attention and removed readiness: checking Automated validation is still running labels Oct 24, 2026
@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from a0ba86b to d99aee3 Compare October 24, 2026 09:01
@github-actions github-actions Bot added readiness: checking Automated validation is still running and removed readiness: action required A blocking check or review needs attention labels Oct 24, 2026
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles d99aee3: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray recorded a legacy release (class legacy) for the first-principles AI finding on d99aee3b43859a7c03744fd0ec911601ac54ee9d.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

This decision applies only to this commit. A new push requires a new judgment.

@github-actions

Copy link
Copy Markdown
Contributor

This override used the old command without a class. It was recorded as class legacy, and the old command stops working on 2026-12-09. Name a class from now on. Use /ai-review override <fable|gpt|design|ux|first-principles|scope|all> <current-sha> <class>[ #N]: <reason, 20 to 500 characters>, where <class> is one of false-positive, not-applicable, pre-existing, evidence-supplied, infra-failure, reissue, deferred, owner-decision. What each class needs: docs/ci/ci-and-reviews.md#risk-release-records.

@github-actions github-actions Bot added readiness: action required A blocking check or review needs attention and removed readiness: checking Automated validation is still running labels Oct 24, 2026
@buluoray
buluoray force-pushed the feat/crewmate-worker-worktrees branch from d99aee3 to 0d6c8c0 Compare October 24, 2026 09:46
@github-actions github-actions Bot added readiness: checking Automated validation is still running and removed readiness: action required A blocking check or review needs attention labels Oct 24, 2026
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles 0d6c8c0: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray recorded a legacy release (class legacy) for the first-principles AI finding on 0d6c8c05f29c6b55738187707704d83c13d079cb.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

This decision applies only to this commit. A new push requires a new judgment.

@github-actions

Copy link
Copy Markdown
Contributor

This override used the old command without a class. It was recorded as class legacy, and the old command stops working on 2026-12-09. Name a class from now on. Use /ai-review override <fable|gpt|design|ux|first-principles|scope|all> <current-sha> <class>[ #N]: <reason, 20 to 500 characters>, where <class> is one of false-positive, not-applicable, pre-existing, evidence-supplied, infra-failure, reissue, deferred, owner-decision. What each class needs: docs/ci/ci-and-reviews.md#risk-release-records.

@github-actions github-actions Bot added readiness: action required A blocking check or review needs attention and removed readiness: checking Automated validation is still running labels Oct 24, 2026
Two crewmates handed one repository shared its checkout and branch. A
crewmate's worker now runs in the crewmate's own worktree of the
repository its turn is about, beside the repository on a crew/<slug>/
branch, cut from the default branch once and reused by every worker the
crewmate opens.

- Turn admission moves a worker turn's project into that worktree after
  the crewmate's Permissions are seeded, from the paths the message
  names, then the slot's project, then the crewmate's goals.
- Each worker turn first rebases a clean worktree onto the repository's
  default branch; a dirty one is left as it is, and the [PROJECT] line
  says which happened once.
- The [PROJECT] line names the repository and the branch, and the
  conductor and worker prompts say where the worker commits.
- Deleting the crewmate removes its worktrees, keeping any with
  uncommitted changes and never touching branches or other checkouts.
@buluoray

Copy link
Copy Markdown
Contributor Author

/ai-review override first-principles 9953d01: Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

@github-actions

Copy link
Copy Markdown
Contributor

Human judgment recorded

@buluoray recorded a legacy release (class legacy) for the first-principles AI finding on 9953d01ea11f1da706b2600e61dbf6b389e3af2a.

Product decision by the maintainer (buluoray): every crewmate worker runs in its own git worktree by default; an unpushed, clean branch with no PR is the only one rebased automatically.

This decision applies only to this commit. A new push requires a new judgment.

@github-actions

Copy link
Copy Markdown
Contributor

This override used the old command without a class. It was recorded as class legacy, and the old command stops working on 2026-12-09. Name a class from now on. Use /ai-review override <fable|gpt|design|ux|first-principles|scope|all> <current-sha> <class>[ #N]: <reason, 20 to 500 characters>, where <class> is one of false-positive, not-applicable, pre-existing, evidence-supplied, infra-failure, reissue, deferred, owner-decision. What each class needs: docs/ci/ci-and-reviews.md#risk-release-records.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

readiness: checking Automated validation is still running

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant