Visitar URL original
Add an Away Mode to backlog-burndown and Retire unattended-handoff by ptr727 · Pull Request #3735 · ptr727/ProjectTemplate · GitHub
Skip to content

Add an Away Mode to backlog-burndown and Retire unattended-handoff - #3735

Merged
ptr727 merged 9 commits into
developfrom
feature/burndown-away-mode
Nov 1, 2026
Merged

ptr727 merged 9 commits into
developfrom
feature/burndown-away-mode

Conversation

@ptr727

@ptr727 ptr727 commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Why

An unattended run often ended saying it needed the maintainer when nothing did. The picker had a single reply, NONE, for every kind of skip, and the run's final message routed that to the attended session as if a decision were waiting. Its exclusions stacked on each other: attended tracks, issues any handoff names, burndown claims, and an all-or-nothing "outcome determined" test. It also ran one worker per round. backlog-burndown, which works parallel file-claimed groups, proved more effective at running unattended.

What

  • backlog-burndown gains an away mode.
    • It keeps the same rounds and the same file claims.
    • A lean orchestrator holds only what a planner subagent and the workers return.
    • A group meeting a question parks behind a decision issue instead of asking. The park is recorded in its claim comment, and the decision is named on every pull request it blocks.
    • Merges go only as far as the develop, main or release scope named at invocation.
    • The end report names every held-back issue under the reason that actually holds it back, and counts only real questions as needing the maintainer.
    • It brings over the parts of the retired loop it still needs: the transient dispatch retry, the one-run-per-repository rule, the write-access comment filter, the blocked-promotion hold and the standing promotion grant.
    • Ranking now also holds back an issue already fixed on develop until a promotion closes it. This applies to attended runs as well.
  • New decision-triage skill (attended).
    • Classifiers sort the open issues into fixable alone, question, split, or held for another reason.
    • Researchers return a recommended answer per question, and each question is filed as a decision issue.
    • The whole queue is then put to the maintainer at once, and the answers are applied.
    • It owns the "Needs the Maintainer" test, which backlog-burndown carries as a generated include. It carries GOVERNANCE.md "Communicating with the User" as an include rather than paraphrasing it.
  • unattended-handoff is retired. References in AGENTS.md, session-handoff, merge-and-release, pr-review-conduct, local-strict-review and repo-config/README.md are swept. Open auto-* lanes an earlier loop left are picked up by the away mode.

Closes on promotion: #3375

Local review

All local-strict-review passes ran at the frontier tier, over the whole branch diff each time.

  • Before the first push, three passes raised 15, then 3, then 1 introduced findings. The first two rounds fixed theirs in 62e8ce6 and cb52db2.
  • The 1 left open at the first push was the promotion hold keyed on any claim release. It is fixed in 0990687.
  • The follow-up passes raised two more on that fix: a no-merge answer holding the promotion forever, and a dropped answer leaving its issue re-ranked. They are fixed in 706460d and 24603cc.
  • The pass on 24603cc raised nothing.
  • Copilot's round on cb52db2 opened 3 threads. One was already fixed. Two were real: outsider issue text steering an away run, and operational-model direct pushes missing from the fixed set. They are fixed in af29ce3.
  • Passes on that fix raised 4, then 1. They are fixed in 6f0dac6 and c42e20e. The pass on c42e20e raised nothing.

Open introduced findings

None.

Related open issues the retirement may overtake

None is closed here, since closing on judgment is the maintainer's call. Each targets the retired skill:

🤖 Generated with Claude Code

ptr727 and others added 3 commits October 31, 2026 21:04
The unattended loop's picker answered NONE for every kind of skip, so a
run that skipped lanes owned by attended handoffs reported that it needed
the maintainer when nothing did. It also worked one issue per round.

backlog-burndown's away mode runs the same parallel, file-claimed rounds
with a lean orchestrator, parks a group behind a decision issue instead of
asking, and merges only as far as the scope named at invocation. Its end
report names each held-back issue under the reason that actually holds it.

decision-triage finds every open question beforehand, researches a
recommended answer for each, files it as a decision issue, and asks the
maintainer the whole queue at once. It owns the needs-the-maintainer test,
which backlog-burndown carries as a generated include.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An away run reranked issues already fixed on develop, could not see an
answered decision holding a promotion, could not resume a parked group
whose worktree still held its branch, and let the orchestrator commit a
dead worker's tree. It also dropped the dispatch retry, the one-run rule,
and the write-access comment filter the retired loop carried.

Parking now records the park in the group's claim comment rather than
the blocked label, whose defined uses this did not fit, and names the
decision on every pull request it blocks. decision-triage carries
"Communicating with the User" as an include rather than paraphrasing it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A resumed group now records its claim release only once its pull request
merges, so the promotion hold lifts on the answer's work rather than on
the dispatch. decision-triage comments each decision on the pull requests
it blocks, so a skipped question still holds the promotion. The away run
no longer leans on an attended session following a rule it never loads.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings November 1, 2026 04:17
@ptr727

ptr727 commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

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

@coderabbitai

coderabbitai Bot commented Nov 1, 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 and others added 3 commits October 31, 2026 21:18
A claim is also released when a worker dies with a clean tree or a group
is abandoned, neither of which lands the answer's work. Holding the
promotion until the group's pull request merges to develop keeps such a
release from letting the promotion merge with the answer unapplied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An answer can drop a parked group's change rather than land it, which left
the hold waiting on a merge that never comes. The resumed worker records
that outcome in the claim comment, and the end report names a held
promotion with the decisions holding it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Releasing the claim alone left the issue open and unheld, so the next
planner ranked it again and filed the answered question afresh.

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

ptr727 commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

A recorded local strict-review pass covers head 24603ccf660427bcff0bdb9fa131fdae4ee728e6, the content this pull request carries at that commit against develop, and it recorded 0 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 moderate and critical findings remain in the backlog-burndown skill, including incomplete direct-push deduplication, untrusted issue-body handling, and promotion proceeding before the group pull request merges.

3 open issues
What changed in this PR

This pull request replaces the retired unattended-handoff workflow with an away mode in backlog-burndown, adds attended decision-triage, and refreshes the authored and generated skill distributions.

Changes:

  • Adds parallel away-mode backlog processing with decision parking, claims, reporting, and scoped promotion behavior.
  • Adds decision-triage for classifying, researching, and presenting maintainer decisions.
  • Retires unattended-handoff and updates documentation, plugin registration, generated skills, and source digests.

Unresolved findings remain concerning answered legacy lanes, direct-push detection, clean branches with unmerged commits, untrusted issue text, promotion gating, partial issue splitting, split-issue narrowing, and skipped decision queues. The findings include seven P1 comments, one P2 comment, and one critical-severity comment, with the supplied vote counts preserved at 1, 2, 1, 4, 3, 1, 1, and 1 respectively.

This pull request requires changes.

File Description
repo-config/​README.md Updates parked-handoff terminology.
AGENTS.md Routes unattended work to away mode and decision triage.
.github/​skills/​unattended-handoff/​SKILL.md Removes the retired generated skill.
.github/​skills/​session-handoff/​SKILL.md Updates handoff ownership references.
.github/​skills/​pr-review-conduct/​SKILL.md Updates promotion evidence handling.
.github/​skills/​merge-and-release/​SKILL.md Replaces the retired standing grant with away-mode authorization.
.github/​skills/​local-strict-review/​SKILL.md Removes the retired skill exception.
.github/​skills/​decision-triage/​SKILL.md Adds the generated decision-triage skill.
.github/​skills/​backlog-burndown/​SKILL.md Adds generated away-mode backlog processing and promotion behavior.
.claude-plugin/​fleet-skills/​skills/​unattended-handoff/​SKILL.md Removes the retired packaged skill.
.claude-plugin/​fleet-skills/​skills/​session-handoff/​SKILL.md Updates packaged handoff references.
.claude-plugin/​fleet-skills/​skills/​pr-review-conduct/​SKILL.md Updates packaged promotion evidence handling.
.claude-plugin/​fleet-skills/​skills/​merge-and-release/​SKILL.md Updates packaged away-mode authorization.
.claude-plugin/​fleet-skills/​skills/​local-strict-review/​SKILL.md Updates the packaged reviewer handback rule.
.claude-plugin/​fleet-skills/​skills/​decision-triage/​SKILL.md Adds the packaged decision-triage skill.
.claude-plugin/​fleet-skills/​skills/​backlog-burndown/​SKILL.md Adds packaged away-mode backlog behavior.
.claude-plugin/​fleet-skills/​.source-digests/​unattended-handoff Removes the retired skill digest.
.claude-plugin/​fleet-skills/​.source-digests/​session-handoff Refreshes the session-handoff digest.
.claude-plugin/​fleet-skills/​.source-digests/​pr-review-conduct Refreshes the review-conduct digest.
.claude-plugin/​fleet-skills/​.source-digests/​merge-and-release Refreshes the merge-and-release digest.
.claude-plugin/​fleet-skills/​.source-digests/​local-strict-review Refreshes the strict-review digest.
.claude-plugin/​fleet-skills/​.source-digests/​decision-triage Adds the decision-triage digest.
.claude-plugin/​fleet-skills/​.source-digests/​backlog-burndown Refreshes the backlog-burndown digest.
.claude-plugin/​fleet-skills/​.claude-plugin/​plugin.json Registers decision triage and removes unattended handoff.
.agents/​skills/​unattended-handoff/​SKILL.md Removes the canonical retired skill.
.agents/​skills/​session-handoff/​SKILL.md Updates canonical handoff references.
.agents/​skills/​pr-review-conduct/​SKILL.md Updates canonical promotion evidence handling.
.agents/​skills/​merge-and-release/​SKILL.md Updates canonical away-mode authorization.
.agents/​skills/​local-strict-review/​SKILL.md Removes the canonical retired-workflow exception.
.agents/​skills/​decision-triage/​SKILL.md Adds the canonical decision-triage skill.
.agents/​skills/​backlog-burndown/​SKILL.md Adds canonical away-mode orchestration and reporting.

Review effort: Lite

@codecov

codecov Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.31%. Comparing base (b38e084) to head (c42e20e).
⚠️ Report is 52 commits behind head on develop.

Additional details and impacted files
@@             Coverage Diff             @@
##           develop    #3735      +/-   ##
===========================================
+ Coverage    81.60%   82.31%   +0.70%     
===========================================
  Files           26       28       +2     
  Lines         9070     9437     +367     
===========================================
+ Hits          7402     7768     +366     
- Misses        1668     1669       +1     
Flag Coverage Δ
python-3.13 82.31% <ø> (+0.70%) ⬆️

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 3 commits October 31, 2026 21:45
An away run under main or release could carry an outsider's issue text
through to a merge, so issue and comment text is task data, and an issue
an outsider opened waits until a write-access account accepts it. The
already-fixed hold also reads direct-push commit messages, since an
operational repository lands fixes on develop without a pull request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The task-data rule covered the maintainer's own issues, which the trust
model treats as trusted, so it now covers text from accounts without
write access. Acceptance is a write-access comment stating what done
looks like, and the work follows that comment rather than a body its
author can still edit. An away run on an operational repository stops
at develop, since whether it promotes per round is the maintainer's call.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The planner holds such an issue back without filing a decision, so the
end report has to name it or it disappears from view.

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

ptr727 commented Nov 1, 2026

Copy link
Copy Markdown
Owner Author

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

@ptr727
ptr727 merged commit 06e45c4 into develop Nov 1, 2026
13 checks passed
@ptr727
ptr727 deleted the feature/burndown-away-mode branch November 1, 2026 05:00
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)
ptr727 added a commit to ptr727/ESPHome-NonRoot that referenced this pull request Nov 9, 2026
Re-vendor .github/skills from ProjectTemplate main at c175d557 through
carry.py apply. Every changed file matched a past hub revision, so
nothing local is overwritten. This adds decision-triage, which the hub
added to the baseline, and removes unattended-handoff, which the hub
retired into backlog-burndown's away mode (ptr727/ProjectTemplate#3735).

The AGENTS.md "Where the Rules Live" text that still names
unattended-handoff is re-vendored by the companion instruction-set
resync.

Audit run 2026-11-09T16:23:30Z | hub c175d557.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
ptr727 added a commit to ptr727/NxWitness that referenced this pull request Nov 9, 2026
## Summary

Part of a hub resync of this repository, per the hub's `RESYNC.md`
section 3 step 3 (verbatim re-vendors). It closes the `tree` and
`.markdownlint-cli2.jsonc` findings of audit run `2026-11-09T16:22:15Z |
hub c175d557`.

- Re-vendors `.github/skills/**` with `carry.py apply`. That refreshes
the stale skills, carries the new `decision-triage` skill, and prunes
`unattended-handoff`, which the hub retired in
ptr727/ProjectTemplate#3735.
- Re-vendors `.markdownlint-cli2.jsonc`, whose hub copy split its
comments into one sentence per line. The comment lines are the hub's
verbatim text, hence the `comments` label.

The tree is byte-identical to the hub's `.github/skills/` at `c175d557`.
The config is byte-identical to the hub's root copy.

## Merge Order

This lands together with two sibling resync pull requests, and all three
ride the same `develop -> main` promotion:

1. This pull request.
2. #667, the instruction-set resync. Its re-vendored `AGENTS.md` "Where
the Rules Live" routes to `decision-triage` and away mode, which only
this tree carries. In turn, this tree removes the `unattended-handoff`
skill the current `AGENTS.md` still names.
3. The intent-files resync (`chore/resync-intent-files`). Its
`.github/copilot-instructions.md` names `pr_review.py attest` and the
coverage reading this tree's `pr-review-conduct` relies on.

## Local Review

One recorded `local-strict-review` pass ran against this head. Its three
findings were all the cross-PR dependencies above, and the two sibling
pull requests resolve them.

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


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **New Features**
* Added a guided decision-triage workflow for reviewing open questions,
gathering context, and recording maintainer decisions.
* **Documentation**
* Updated guidance for repository setup, code and documentation
standards, audits, pull requests, releases, and CI to clarify procedures
and verification expectations.
  * Expanded handoff guidance for tracking work and resuming sessions.
* **Removals**
  * Removed the unattended handoff workflow guidance.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
ptr727 added a commit that referenced this pull request Nov 13, 2026
… and backlog-burndown (#4166)

Closes review gaps in four fleet skills, and gives the carried-table
bound its reason in `GOVERNANCE.md` and the Copilot instructions.

## Changes

- **`repo-worktree` "Preparing Git Hooks" (#3620 item 5).** The
pre-commit check is now one complete command: `test -x` and a `grep` for
the framework's own header, on the shared hook path. A non-framework
executable there no longer counts as the gate. It falls to the unchanged
next bullet: "A missing or wrong shared hook is reported to the
maintainer, not repaired from the worktree."
- **`drive-pr` (#3697).** A feature PR a peer merged mid-drive still
owes an outcome for each open finding. That covers unresolved threads
and every finding step 4 names, whether or not `merge` would refuse on
it, since `merge` never runs there. Step 3's `state=MERGED` path and
step 4's `next=cleanup` route both give those outcomes before `cleanup`
runs. A fix lands as a fresh feature -> develop pass.
- **`GOVERNANCE.md` "PR Review Etiquette", `pr-review-conduct` Merge
Gate item 2, and `.github/copilot-instructions.md` (#3620 item 3).**
Each gets two sentences on why the carried-table bound is the file set
rather than file recency, per the maintainer's answer on #3746.
- **`backlog-burndown` "The Promotion Boundary" step 5 (#3620 item 4).**
The displaced pull request waits until the next round dispatches, and
that round dispatches its fresh worker. That matches step 6 in an
attended run, and the away-mode promotion path, which has no freeze.
- Generated copies under `.github/skills/` and
`.claude-plugin/fleet-skills/` were regenerated with
`scripts/build_dist.py`.

## Item Dispositions

- **#3620 item 1** (`session-handoff` resume filter): already fixed. It
was consolidated into #4013 item 1 and landed in #4034. A comment now
counts as a round only by its whole archived shape.
- **#3620 item 2** (`unattended-handoff` picker): stale. That skill was
retired in #3735 and no longer exists.
- **#3620 item 3**: declined, as the maintainer decided on #3746. The
reason sentences it asked for are added above.
- **#3620 item 4**: it still stood on develop, since step 5's "then
dispatches" read as a dispatch during the freeze. Fixed above.
- **#3620 item 5**: it still stood on develop, since `test -x` accepted
any executable. Fixed above.
- **#3766**: already resolved on develop. `repo-worktree` "The Base
Branch" names "Creating a Worktree"'s return of the base clone to its
own working branch as the second exception. It applies where a
continuation finds the task branch checked out there. That landed in
#1685, so no edit was needed.
- **#3869**: parked behind decision #4167 and left out of this pull
request's closing line. A draft of #3869's own proposal was taken back
out of this branch. In it, the agent installs the hook in the base clone
on the maintainer's yes. Each local review round found a new cost in
that draft: chaining a foreign hook, a Husky.Net setting breaking other
worktrees, a hook failing on branches without the config, and a
dispatched worker either stalling its round or never reaching the
maintainer. The decision issue lays out the options.

## Verification

- `scripts/build_dist.py --check` reports the generated distributions
current. `spec/validate.py` passes.
- The prose gate and `repo_gate.py --check eol` are clean on every
commit.
- The hook check was run against a constructed repository. With no hook
it exits 1, with a foreign executable 1, and with a framework-header
hook 0. The header line was read from the pre-commit framework's own
hook template on this host.

Closes on promotion: #3620, #3697, #3766

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to 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.

2 participants