Visitar URL original
Merge a Gate-Met Feature Pull Request Through pr_review.py and Own the Kit's autoMode Entries by ptr727 · Pull Request #3704 · ptr727/ProjectTemplate · GitHub
Skip to content

Merge a Gate-Met Feature Pull Request Through pr_review.py and Own the Kit's autoMode Entries - #3704

Merged
ptr727 merged 29 commits into
developfrom
feature/pr-review-merge
Oct 31, 2026
Merged

ptr727 merged 29 commits into
developfrom
feature/pr-review-merge

Conversation

@ptr727

@ptr727 ptr727 commented Oct 31, 2026 •

Copy link
Copy Markdown
Owner

Why

Agents driving work under drive-pr, backlog-burndown, and unattended-handoff reach a feature pull request whose gate is met. Then Claude Code's auto-mode classifier denies the hand-typed gh pr merge --squash as "Merge Without Review". This happens most often inside a subagent, which sees neither the review nor the maintainer's go-ahead. The agent then hands the maintainer a command, sometimes while a prompt is open and the command cannot run.

pr_review.py cleanup already shows the fix pattern. It runs its checks in code under the installer's pr_review.py allow rule, and auto mode completes it. This change gives the develop merge the same shape. Authorization to merge stays with the skills. The code guarantees that the merge is into develop, at the gated head, inside the registry scope, and with the Merge Gate's mechanically readable items met. A develop -> main promotion merge is unchanged and stays the maintainer's.

What Changes

  • pr_review.py merge NUMBER --repo OWNER/NAME [--cleanup --checkout DIR] (new scripts/pr_merge.py) merges only when all of these hold:
    • wait's gate exits 0, with no review request.
    • A fresh read of the digest's field tuples shows coverage, zero open threads, every no-thread count zero, and mergeStateStatus CLEAN. A missing or unreadable count fails closed.
    • The base is develop, the head is neither a fork nor a permanent or protected branch, and the target is inside the registry scope.
    • The merge is pinned with --match-head-commit and confirmed by reading it back. A refused merge (exit 1) is told apart from an unconfirmed one (exit 2).
    • It shares the target query and reader with pr_cleanup.py.
  • Skills.
    • drive-pr step 4, backlog-burndown, and unattended-handoff route develop merges through merge.
    • Clearable refusals go back to the review loop.
    • MERGE_NOT_CONFIRMED is read back before anything is reported.
    • A harness refusal of the call itself follows the refused-write rule.
  • GOVERNANCE "Repository Boundaries and Write Safety". The refused-write rule now names a gate-checked subcommand the maintainer's installer allows as a route sanctioned in advance. It is never reached for after a hand-typed form of the same write was refused.
  • Host-safety installer (Claude Code).
    • The kit now owns tagged ([agent-safety] ) entries in settings.json autoMode.
    • It never removes, reorders, or rewrites an untagged entry, so each host's own rules survive.
    • It keeps $defaults in any list it creates, and its entries join the stamp digest so --report shows them stale.
    • Until now autoMode was unmanaged. Claude Code reads it only from user or managed settings, so one repository's content had drifted in host-wide.

Local Review Findings and Their Outcomes

Each push carried a recorded local strict pass, with up to two edit rounds per push. Every finding those passes raised was either fixed in a later commit on this branch or has one of the outcomes below.

  • Deferred to Have pr_review.py merge Print Its Own Next Step Instead of Skills Listing Every State #3724 (merge prints its own next step, so the skills stop listing status lines): a CLOSED read-back route, a merge landing during the gate's own read, step 3 against step 4 on reporting a peer merge, and the BEHIND/DIRTY/UNKNOWN clearing routes.
  • Deferred to Let pr_review.py merge Read an Acknowledgment Record for Answered Earlier-Round Findings #3718 (an acknowledgment record): merge stays strict on answered earlier-round findings and noted output, per the maintainer's decision.
  • Deferred, design reuse: ready() repeats cleanup_check's refusal list. auto_mode_misshape and report()'s autoMode walk could share main()'s shape table and tagged_auto_mode. read_settings sits beside registration_problems. The --repo parse is a third copy, and the other two copies predate this branch.
  • Declined: a __main__ guard in pr_merge.py, since test_cli_usage then requires a full entry point and the module is reached only through pr_review.py merge. The existing allow rule approving merge before the installer re-runs, since the maintainer installed it, merging is the maintainer's act, and --report reads stale until the re-run. The non-string guard in tagged(), which an earlier round asked for. The attested pass's own finding count, which is a PR-body finding the driver already disposes of.
  • Open premise, settled by this PR's own merge: whether auto mode keeps the Bash(uv run --no-project --script scripts/pr_review.py:*) allow rule. This pull request is merged with pr_review.py merge, which is the live test.

Verification

  • tests/: test_pr_merge test_pr_review test_pr_review_size test_pr_cleanup test_cli_usage test_build_dist pass, 790 tests.
  • host-setup/agent-safety/claude/test_install.py passes, 182 tests.
  • ruff 0.17.3 format and check, mypy, build_dist.py --check, and the prose gate (--allow-comments, the comments label) all pass.
  • Not exercised live yet: merge against a real pull request, and a classifier run with the new autoMode entries. Both follow the release and the installer run.

🤖 Generated with Claude Code

ptr727 and others added 4 commits October 31, 2026 08:28
…e Kit's autoMode Entries

Add `pr_review.py merge`, which squash-merges a pull request into develop only
after `wait`'s Merge Gate reads met, pins the merge to the gated head, and
confirms it by reading it back. It refuses a main base, a fork head, a draft,
and a target outside the checkout's owner. It runs under the allow rule
`cleanup` already uses, so auto mode no longer classifies a reviewed develop
merge as unreviewed. drive-pr, backlog-burndown, and unattended-handoff route
their develop merges through it. Promotion merges are unchanged.

The Claude Code host-safety installer now owns tagged entries in
settings.json autoMode. It replaces its own entries, never touches an untagged
one, keeps $defaults in any list it creates, and reports staleness through
the stamp digest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rite Rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Review Findings

- merge reads coverage, unresolved threads, the digest's no-thread finding
  counts, and a CLEAN merge state off a fresh read after wait exits 0, and
  refuses with one status line per unmet item. The findings a pull request
  body lists stay the driver's to dispose of, and every overclaim now says so.
- merge checks the write scope cleanup checks, so --cleanup cannot refuse on
  scope after a landed merge.
- merge refuses a permanent or protected head branch through the checks
  cleanup uses, so a main -> develop pull request is never squashed.
- A merge gh refused that reads back open exits 1. Only a call that timed out
  or never ran, or an unsettled read back, exits 2.
- unattended-handoff parks only on a merge exit with no status=MERGED line,
  and drive-pr and unattended-handoff route a harness refusal of the merge
  call through the refused-write rule.
- The autoMode rules and the kit README describe what merge and cleanup
  check rather than claiming they enforce the review gate.
- pr_merge reuses cleanup_read, CleanupUnread, in_repository, and the settle
  delays from pr_cleanup.
- The installer keeps a non-string autoMode entry untouched as untagged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Back to the Loop

merge now reads the digest's built header fields instead of its printed line, so a count field
that is missing or holds no number refuses as COUNT_UNREAD rather than reading as zero. merge and
cleanup share one pull request target read.

drive-pr and unattended-handoff send an unresolved thread or a pending gate back to the review
loop. They read the state back after an unconfirmed merge, and report or park an
UNTHREADED_FINDINGS refusal once each finding has an outcome.

The kit keeps a list left as a bare $defaults, and the refused-write rule's new sentences no
longer contradict each other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ptr727 ptr727 added the comments Permits the comment lines the pull request adds or edits, which the prose gate otherwise refuses label Oct 31, 2026
Copilot AI lite review requested due to automatic review settings October 31, 2026 16:35
@ptr727 ptr727 added the comments Permits the comment lines the pull request adds or edits, which the prose gate otherwise refuses label Oct 31, 2026
@coderabbitai

coderabbitai Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Important

  • Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head 6fa2f97256a55212805b3ab9a6450d59f031e31d, the content this pull request carries at that commit against develop, and it recorded 10 findings.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Active critical and moderate findings remain in merge-gate handling, including unsafe acceptance of pending or unreadable review state, missed branch-protection changes, and failure to retry transient merge conditions.

11 open issues
What changed in this PR

This pull request adds a gate-checked feature-PR merge path through pr_review.py and extends the Claude Code installer to manage tagged autoMode entries while preserving host-owned settings.

Changes:

  • Adds scoped, pinned, gate-validated merges with read-back confirmation and optional cleanup.
  • Updates review digest plumbing, cleanup integration, governance, documentation, and merge-related skills.
  • Adds managed Claude Code autoMode entries with $defaults preservation, reporting, and digest tracking.
  • Adds focused merge, installer, and workflow tests.
File Description
tests/​test_pr_review.py Tests gate waits, merge parsing, forwarding, and scope handling.
tests/​test_pr_review_size.py Adds the merge module size budget.
tests/​test_pr_merge.py Tests merge validation, gate checks, refusals, confirmation, cleanup, and arguments.
scripts/​README.md Documents the merge command and its contract.
scripts/​pr_review.py Adds merge forwarding, command parsing, flag ownership, and digest plumbing.
scripts/​pr_review_digest.py Exposes structured digest fields and no-thread counts.
scripts/​pr_merge.py Implements scoped, gate-checked, pinned feature-PR merges and confirmation.
scripts/​pr_cleanup.py Shares pull-request target reads, branch checks, and scope handling.
host-setup/​agent-safety/​claude/​test_install.py Tests managed autoMode ownership, preservation, reporting, and malformed settings.
host-setup/​agent-safety/​claude/​README.md Documents managed permissions and autoMode behavior.
host-setup/​agent-safety/​claude/​install.py Installs, reports, preserves, and fingerprints tagged autoMode entries.
GOVERNANCE.md Defines the sanctioned gate-checked merge route and refused-write behavior.
.github/​skills/​unattended-handoff/​SKILL.md Updates unattended merge handling, recovery, and parking guidance.
.github/​skills/​drive-pr/​SKILL.md Routes feature merges through the new merge command.
.github/​skills/​backlog-burndown/​SKILL.md Clarifies worker merge and cleanup behavior.
.claude-plugin/​fleet-skills/​skills/​unattended-handoff/​SKILL.md Generated unattended-handoff skill distribution.
.claude-plugin/​fleet-skills/​skills/​drive-pr/​SKILL.md Generated drive-pr skill distribution.
.claude-plugin/​fleet-skills/​skills/​backlog-burndown/​SKILL.md Generated backlog-burndown skill distribution.
.claude-plugin/​fleet-skills/​.source-digests/​unattended-handoff Updates the generated unattended-handoff source digest.
.claude-plugin/​fleet-skills/​.source-digests/​drive-pr Updates the generated drive-pr source digest.
.claude-plugin/​fleet-skills/​.source-digests/​backlog-burndown Updates the generated backlog-burndown source digest.
.agents/​skills/​unattended-handoff/​SKILL.md Updates canonical unattended merge handling guidance.
.agents/​skills/​drive-pr/​SKILL.md Updates canonical feature-PR merge guidance.
.agents/​skills/​backlog-burndown/​SKILL.md Updates canonical backlog worker and cleanup guidance.

Review effort: Lite

Comment thread .agents/skills/drive-pr/SKILL.md Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_merge.py Resolved
Comment thread scripts/pr_review.py Resolved
…merge

# Conflicts:
#	.claude-plugin/fleet-skills/.source-digests/drive-pr
#	scripts/pr_review_digest.py
ptr727 and others added 3 commits October 31, 2026 10:00
…elop Merge

`merge` now refuses a held or noted reviewer output, a pending review
request, a count built as None where its source is present, and a count
a cut reviews window leaves a floor. A moved head is reported before any
unmet item, including a merge `gh` refused on a moved head. The pre-gate
branch rule read is gone, since only permanent branches carry rulesets.
drive-pr and unattended-handoff name the states a driver clears.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Fix

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s Re-Review

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ptr727 added a commit that referenced this pull request Oct 31, 2026
…ishes (#3707)

When PyYAML is not importable, the repo gate's `composite-actions` check
resolves an interpreter through `uvx --with pyyaml python` and then runs
its reader on that interpreter. Under `UV_NO_CACHE` or uv's `no-cache =
true`, uv deletes that environment when uvx exits, so the launch failed
with a bare "No such file or directory: '<temp path>'".

Design: name the cause and the remedy in the existing single host
finding, rather than falling back to running the reader inside `uvx` per
file. The naming is a few lines and adds no second read path. A per-file
fallback would add a path that re-resolves the environment for every
action file and is only reachable on this host shape. The finding now
reads: "the interpreter uvx provided could not start: [Errno 2] ...:
'/gone', because uv deletes the environment when uvx exits under
UV_NO_CACHE or uv's no-cache = true (unset UV_NO_CACHE, turn off uv's
no-cache setting, or make PyYAML importable), so no run body was
shellchecked". Only `FileNotFoundError` gets the explanation (it is also
what Windows reports as WinError 2); other start failures keep the plain
message. The `load_action` docstring notes the exception.
`scripts/repo_gate.py` is a runpy wrapper, so only the action file
changed.

Tests pin the full rendered sentence with a stubbed `subprocess.run`,
and a PermissionError case that must not blame the uv cache.

Closes on promotion: #2358

Remaining findings:
- #3705: `scripts/README.md` lines 3 and 127 still promise that `uvx`
alone suffices; held by open PR #3704, filed for follow-up.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head dfe41a1de6a3f7630b1b25f9dd69900829329fea, the content this pull request carries at that commit against develop, and it recorded 5 findings.

@codecov

codecov Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.46154% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.31%. Comparing base (b30ce55) to head (ebee952).
⚠️ Report is 8 commits behind head on develop.

Files with missing lines Patch % Lines
scripts/pr_merge.py 98.69% 2 Missing ⚠️
scripts/pr_cleanup.py 95.45% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #3704      +/-   ##
===========================================
+ Coverage    82.02%   82.31%   +0.29%     
===========================================
  Files           27       28       +1     
  Lines         9273     9437     +164     
===========================================
+ Hits          7606     7768     +162     
- Misses        1667     1669       +2     
Flag Coverage Δ
python-3.13 82.31% <98.46%> (+0.29%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

ptr727 and others added 2 commits October 31, 2026 10:42
…cal Pass in the Merge Step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…read and Qodo Routes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, and Reuse MERGE_UNGATED

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head 55ff034d69c8292bb12db232a07f34ee44b37206, the content this pull request carries at that commit against develop, and it recorded 5 findings.

ptr727 added a commit that referenced this pull request Oct 31, 2026
Fixes a finding raised on promotion #3715, against the change #3709
made.

## What was wrong

`_launch` in `host-setup/agent-safety/claude/gh-write-guard.py` read
past an `env` launcher without applying it. Constructed scratch
repositories reproduced each shape, two checkouts whose origins name
different owners, one with a pull-request rule on `main`:

- `env -C <dir>`, `env --chdir=<dir>`, and `env --chdir <dir>` left the
push judged in the caller's repository. So `env --chdir=/srv/other
GIT_DIR=.git git push origin main` read the wrong remote and allowed.
- `GIT_DIR=<mine>/.git env -i git -C <other> push origin main` and the
same with `env -u GIT_DIR` read the cleared `GIT_DIR`, so the check
again ran against the wrong repository.
- `env -S '<command>'` and `env -S'<command>'` were never read at all,
so every requirement missed the command, including requirements 1, 3,
and 6.

## What changed

- `_launch` now returns a `_Launch` carrying what an `env` changes.
`-C`/`--chdir` moves the directory the command runs in, composed before
a git `-C`. A run-time directory leaves it undetermined, which fails
closed for `main`, `master`, and `develop` under requirement 4, as #3709
treats an unresolved `GIT_DIR`. `-i`/`-` and `-u`/`--unset` clear what
the command inherits, and `-S`/`--split-string` is split into the words
it runs. A short cluster such as `-iC dir`, an unambiguous long prefix,
and the value-taking `-a` and `-P` read the way `env` reads them.
- `_read` applies those to each command's environment, its own
assignments, and its directory, and passes the moved directory into an
`sh -c` body.
- Self-test cases cover each shape, against the real two-owner checkouts
for requirement 4's repository and branch, and against the fixtures for
requirements 3 and 6.
- A push naming no refspec now resolves an absolute `git -C` from an
unnamed directory, after a `cd "$X"` or an `env -C "$D"`, as the push's
remote already did. Raised in review here, and it was already reachable
through `cd "$X"`.
- `host-setup/agent-safety/README.md` states how an `env` is read, and
that an `env -C` moves the directory requirement 6 tests.

## Local strict review

Three recorded passes at the `frontier` tier, the last over the final
content with no findings. The first pass's findings on an `env -S`
comment, a repeated `-C`, and long-option prefix matching are fixed
here, and the second pass's README wording finding is fixed here too.

Two more recorded passes covered the review fix on the second push. The
first of them caught a signature change that broke `test_install.py`,
which is held by #3704, so the signature was restored.

### Pre-existing findings, filed

- `host-setup/agent-safety/claude/gh-write-guard.py` `_push_targets`,
`pre-existing`: an all-letter word after `-o` is read as a flag cluster,
so `git push -ofoo origin develop` is misread. Filed as #3720.

### Deferred

- `host-setup/agent-safety/claude/gh-write-guard.py`
`_bare_push_branch`, `introduced`, design: its `leading_cd` and `moved`
parameters are now reached only from `test_install.py`. Removing them
needs that file, so it is filed as #3723.

### Dropped findings

- `host-setup/agent-safety/claude/gh-write-guard.py` `_env_option`,
`_skips_hooks`, `_push_targets`, consolidation: one shared short-option
cluster reader. The other two are untouched code with different value
letters, so merging them is a change of its own.
- `scripts/docker_lint.py` `shell_shebang_interpreter`, consolidation:
it also walks `env` options. Declined because the hook installs as one
standalone file and cannot import it.

Closes on promotion: #3716

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
ptr727 and others added 2 commits October 31, 2026 11:14
Replace the per-status-line lists in drive-pr step 4 and unattended-handoff step 5
with one rule: do what the status line names, run merge once more, and report or
park when the same line returns on the same head.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head c08b1240d28eb5a80ba02196bc5db258431deca1, the content this pull request carries at that commit against develop, and it recorded 9 findings.

…Call, and Cut the Merge Routes to One Rerun

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ptr727 and others added 15 commits October 31, 2026 11:44
…ring and Landed-Line Count

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e-Control Trust Rule

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Exits Under Cleanup

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Sanction Only the Call's Shape

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ave Authorization to CLAUDE.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Cannot Clear, and Test the Attested Path

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st the Merge Read-Back Retry

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… a Merge

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he Gate's Repeating Exit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…te It to Cleanup

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… Gate's Exit 41

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… README's Exit 1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the Merge Step

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n the Kit's autoMode Docs

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head ebee9526f3eb390a690a1e31d50ff67d26e04b6a, the content this pull request carries at that commit against develop, and it recorded 2 findings.

@ptr727
ptr727 merged commit 9d89a38 into develop Oct 31, 2026
13 checks passed
@ptr727
ptr727 deleted the feature/pr-review-merge branch October 31, 2026 21:58
ptr727 added a commit that referenced this pull request Nov 1, 2026
…nd Add a backlog-burndown Away Mode (#3736)

Promotes the changes merged into `develop` since promotion #3715 to
`main`.

- [#3704](#3704):
squash-merges a gate-met feature pull request through `pr_review.py
merge`, and the host-safety kit now owns its `autoMode` entries.
- [#3735](#3735) adds an
away mode to `backlog-burndown`:
- Parallel file-claimed rounds with no maintainer present, run by a lean
orchestrator.
- A group meeting a question parks behind a `decision` issue instead of
asking.
- Merges go only as far as the `develop`, `main` or `release` scope
named at invocation.
  - The end report names each held-back issue's real reason.

It also adds the attended `decision-triage` skill, which researches and
asks every open question at once, and retires `unattended-handoff`.
- [#3737](#3737) reads a
pull request that reads back closed after `pr_review.py merge`'s merge
call as a refusal that merged nothing, rather than as an unconfirmed
merge. It answers this promotion's first review round.

After the release, the host-safety installer re-run that #3704 needs is
still the maintainer's, per its handoff #3734. That handoff's step 3
names an `unattended-handoff` worker. That skill is retired here, so the
verification runs from a `backlog-burndown` worker instead.

Fixes #3375

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comments Permits the comment lines the pull request adds or edits, which the prose gate otherwise refuses

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants