Visitar URL original
Promote Develop: Read state= in drive-pr, Fetch the Prose Gate From One Revision, and Place Copilot's Outstanding Findings by ptr727 · Pull Request #3703 · ptr727/ProjectTemplate · GitHub
Skip to content

Promote Develop: Read state= in drive-pr, Fetch the Prose Gate From One Revision, and Place Copilot's Outstanding Findings - #3703

Merged
ptr727 merged 3 commits into
mainfrom
develop
Oct 31, 2026
Merged

ptr727 merged 3 commits into
mainfrom
develop

Conversation

@ptr727

@ptr727 ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner

Promotes the changes merged into develop since promotion #3693 to main, the second round of a backlog burndown.

  • #3698 Has drive-pr read state= in every digest wait or status prints. On a feature pull request a peer merged, the drive skips the merge and goes on to the post-merge path. On a promotion it reports the merge as the drive's end state. state=CLOSED is a stop. state= decides over any exit code on such a pull request. scripts/README.md documents the state=, merged_at=, merge_commit= and closed_at= fields.
  • #3696 Has hub_fetch_run.py read the prose gate's companion and script twice from main when no hub commit resolves, refusing with "the gate did not run" when the reads differ, so a hub push between the two requests cannot pair revisions. A resolved commit is still fetched once.
  • #3702 Places a Copilot overview's Outstanding findings: or Unresolved review findings: list and prints each item under FINDINGS WITH NO THREAD, marked by whether a current thread sits at its code-span path:line. A findings label with no readable list holds as an unplaced part. A changed file with no changed line, added, modified or deleted, is left out of the table match while a file with changed lines remains, so a table omitting only binary files reads as covering.

Remaining for the maintainer, from #3702: an empty file, a mode-only change, and a text file .gitattributes marks binary or -diff read 0/0 like a binary file, so a Copilot table leaving one out still reads as covering. That is the trade #3489 asked for.

Deferred review findings: #3697 (open findings on a peer-merged feature pull request get no outcome before cleanup in drive-pr) and #3700 (the three documents describing hub_fetch_run.py's fallback without its new refusal).

Fixes #3688
Fixes #3533
Fixes #3672
Fixes #3489
Fixes #3701

🤖 Generated with Claude Code

ptr727 and others added 3 commits October 31, 2026 08:43
….py's state= Fields (#3698)

Makes drive-pr read `state=` in every digest `wait` or `status` prints.
A merged feature PR continues to step 4's post-merge path, a merged
promotion PR is reported as merged, and a closed PR is a stop. Documents
the `state=`, `merged_at=`, `merge_commit=`, and `closed_at=` fields and
`wait`'s handling of a PR no longer open in scripts/README.md.

Remaining findings: open findings on a peer-merged feature PR get no
stated outcome before cleanup. Filed as #3697.

Closes on promotion: #3688

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…in hub_fetch_run.py (#3696)

## Summary

When `resolve_main_commit()` cannot resolve a SHA, `hub_fetch_run.py`
fetched the prose gate's companion and the script from moving `main` as
separate raw URLs, so a push between the requests could pair revisions.
In that case the helper now fetches the companion and script sequence
twice and refuses (exit 1, "the gate did not run") when any file differs
between the two reads. A resolved commit is still fetched once.

## Why this design

The raw-only hosts that reach the unresolved path have no API, git, or
archive route, so a single immutable fetch is unavailable there.
Refusing outright would break the documented raw-only fallback. A
bracketed double read needs no new endpoint, stays standard-library
only, and turns a push landing mid-run into a loud refusal that names
the re-run.

Residual limit, found in review and deliberately stated:
raw.githubusercontent.com caches each URL separately at its CDN, so
right after a push the two URLs can serve different revisions
consistently, and the bracket cannot see that. The docstring claims only
the mid-run push case. Closing the CDN case needs an immutable fetch (an
archive, or a version stamp shared by script and data), which is a
larger design change than this issue's snippet-only scope.

Docs in GOVERNANCE.md and the husky/pre-commit READMEs describe the
unresolved fallback as still running the gate; they do not mention the
new refusal. They were out of this change's file claim and are reported
for a follow-up.

Closes on promotion: #3533

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…t Only Lineless Files as Covering (#3702)

## Summary

- **#3672, a Copilot findings list it noted rather than placed.**
- `scripts/reviewers/copilot.json` gains the `outstanding findings:` and
`unresolved review findings:` spellings under `labels` and
`finding_lists`. This is a vocabulary change with no new code branch.
- The reader now reads numbered findings lists as well as bulleted ones.
Each item keeps its text and the `path:line` ranges its code spans name.
- A span counts only where its path is a changed file or a thread's
path, so `node:20` is not read as a line.
- FINDINGS WITH NO THREAD prints every item with a mark: `[thread at its
line]`, `[no thread at its line]`, `[outdated thread on its path]`,
`[thread page cut, unknown]`, or `[no path:line code span]`.
- An item whose span no thread sits on now counts toward that block's
number, even where the open count and the linked entries balance.
- **#3489, a file table leaving out only binary files.**
- The changed-file query now reads `additions`, `deletions`, and
`changeType`.
- A file added, modified, or deleted with no added or deleted line may
go unnamed in the table, which then reads `coverage=table`. A rename, a
copy, a type change, and a file missing a count are never left out.
- Nothing is left out unless a file with an added or deleted line
remains. The reason line says how many files were left out.
- **#3701, a current file-level thread read as outdated.** Copilot's
first round raised it on this branch. `Q_FULL` now reads each thread's
`isOutdated` flag, so a null `line` no longer stands for outdated. A
file-level thread marks no item, and the item stays counted.
- `scripts/pr_review.py --help` and `scripts/README.md` describe these
changes.

## How a Binary File Is Known

GitHub reports `additions=0` and `deletions=0` for a binary file. Its
changed-file list carries no binary flag, and neither the GraphQL nor
the REST shape adds one.

A constructed case: a pull request changes `docs/a.md` (3 added lines)
and adds `static/b.png` (0/0). Copilot's table names `docs/a.md` alone.
The digest now reads `coverage=table` with the reason "names exactly the
1 changed file(s), 1 more with no changed line left out". Before this
change it read `coverage=none`.

Two alternatives were not taken. Guessing from the extension misses an
unusual binary and wrongly excuses a text file with a binary-looking
name. Reading `.gitattributes` would mean a content fetch per pull
request.

## New Exit Path

A findings-list label followed by no list the reader can read now leaves
a note rather than being placed silently. An example is `Unresolved
findings:` followed by `None.`. At the top level of a body, that note is
also an unplaced part, so `status` exits `50` until its fingerprint is
acknowledged with `comment --fingerprint`. Inside a collapsed section it
is a note only.

## Remaining Findings

- **The maintainer's call on the #3489 trade.** An empty file, a
mode-only change such as dropping an executable bit, and a text file
that `.gitattributes` marks `binary` or `-diff` all read as 0/0.
GitHub's file list does not tell them apart from a binary file. Each one
therefore may go unnamed in a Copilot table, and the table still reads
`coverage=table`. No reviewer or diff showed the `.gitattributes` case.
The README names this residual. Whether excusing these is acceptable is
open.

## Local Review Findings

Four local strict-review passes ran. The first two raised findings that
were fixed on this branch. The third raised the #3701 finding, which is
fixed here after Copilot raised it too. The fourth, on the fix, raised
none.

Closes on promotion: #3672, #3489, #3701

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Copilot AI lite review requested due to automatic review settings October 31, 2026 16:30
@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

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.

🔵 Needs a closer look

Maintainer input is still required to resolve the deliberate #3489 lineless-file coverage tradeoff and #3700 fallback documentation mismatch.

No open issues 🎉

What changed in this PR

This pull request promotes the latest develop changes to main, improving pull-request state handling, hub fallback consistency, and Copilot findings coverage.

Changes:

  • Adds state= handling and documentation for merged and closed pull requests.
  • Refuses inconsistent companion/script revisions during unresolved hub fallback reads.
  • Parses Copilot outstanding findings, reports thread placement, and handles eligible lineless changed files in coverage tables.
  • Review notes remain for nested finding-span handling, pathless findings counting, and clarification of the fallback refusal path.

This pull request requires changes.

File Summary
tests/​test_pr_review.py Adds coverage for lineless files and Copilot findings output.
tests/​test_pr_review_copilot.py Tests findings-list parsing, thread matching, and lineless-file classification.
tests/​test_hub_fetch_run.py Tests fallback double-fetch refusal and pinned-fetch behavior.
scripts/​reviewers/​copilot.json Adds Copilot outstanding-findings vocabulary.
scripts/​README.md Documents PR state fields, lineless-file coverage, and findings-list output.
scripts/​pr_review.py Extends GraphQL queries for thread and changed-file metadata.
scripts/​pr_review_rounds.py Accounts for eligible lineless files when matching file tables.
scripts/​pr_review_digest.py Prints and counts findings-list items without matching threads.
scripts/​pr_review_copilot.py Parses findings-list items and code spans, matches threads, and identifies eligible omitted files; nested spans and pathless findings require correction.
catalog/​snippets/​hub_fetch_run.py Double-reads unresolved hub fallback content and refuses mixed revisions; the refusal path needs clearer documentation.
.github/​skills/​drive-pr/​SKILL.md Updates drive-pr state-handling instructions.
.claude-plugin/​fleet-skills/​skills/​drive-pr/​SKILL.md Carries the generated Claude skill update.
.claude-plugin/​fleet-skills/​.source-digests/​drive-pr Updates the generated skill source digest.
.agents/​skills/​drive-pr/​SKILL.md Updates the canonical drive-pr skill instructions.

Review effort: Lite

@ptr727

ptr727 commented Oct 31, 2026

Copy link
Copy Markdown
Owner Author

Answering the round's needs a closer look headline on b30ce55, which counts no finding and names two items:

@codecov

codecov Bot commented Oct 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.02%. Comparing base (431ffaf) to head (b30ce55).
⚠️ Report is 453 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3703      +/-   ##
==========================================
+ Coverage   81.91%   82.02%   +0.10%     
==========================================
  Files          27       27              
  Lines        9224     9273      +49     
==========================================
+ Hits         7556     7606      +50     
+ Misses       1668     1667       -1     
Flag Coverage Δ
python-3.13 82.02% <100.00%> (+0.10%) ⬆️

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
ptr727 merged commit 48ea7d6 into main Oct 31, 2026
14 checks passed
ptr727 added a commit that referenced this pull request Oct 31, 2026
…d Unread Moves Whole, and Name uv's No-Cache Setting (#3715)

Promotes the changes merged into `develop` since promotion #3703 to
`main`, the third round of a backlog burndown.

- [#3709](#3709) Reads a
push's remote, and the branch of a push with no refspec, in the
repository git actually uses in the write guard's owner check
(requirement 4). Before, `--git-dir` and a `GIT_DIR` on the push were
ignored, so a constructed `git --git-dir=<other>/.git push origin
develop` was checked against the working directory's repository rules
and allowed. A shape whose repository the guard cannot determine (an
earlier `GIT_DIR`, a `-c` or `--config-env` override of a `remote.` or
`url.` key, any `GIT_CONFIG*` variable, an unresolvable `--git-dir`) now
blocks `main`, `master` and `develop`. The self-test covers each shape
and `host-setup/agent-safety/README.md` states the requirement.
- [#3712](#3712) Reads a
file moved out of a source some rule never read in full for that rule in
the prose gate: a narrowed directory scope, a `home_path_exempt` file,
instruction text for `issue-ref`, and a move that changes the file's
lexer. Skips YAML block scalars when reading a Compose file's volume
entries.
- [#3707](#3707) Names
uv's no-cache setting, and its remedies, when the repo gate's resolved
PyYAML interpreter is gone at launch, rather than reporting a bare
missing-file error.
- [#3708](#3708) Moves the
section-name lookup key into one `section_key()` in
`spec/fidelity_text.py`, used by the carry, the audit, the skill build
and the review ledger, with no behavior change.

- [#3722](#3722) Applies
`env`'s directory and environment options to the command the write guard
judges, answering this promotion's first review round: `env
-C`/`--chdir` move the repository a relative `GIT_DIR` and the remote
resolve in, `env -i`/`-u` clear a `GIT_DIR` that no longer steers the
check, and `env -S` is read rather than skipped. A run-time directory
reads as undetermined, which blocks `main`, `master` and `develop`.
- [#3721](#3721) Finds a
Compose block-scalar opener through the YAML lexer the gate already uses
rather than a hand-written pattern, so a key holding `#`, quoted or not,
opens the opaque region. Also answers this promotion's first review
round.

- [#3727](#3727) Reads an
`env` option the write guard does not recognize, such as GNU `env`'s
`--ch` abbreviation of `--chdir`, as leaving the push's repository
undetermined, so `main`, `master` and `develop` fail closed, answering
this promotion's second review round. A feature-branch push is never
newly blocked.

- [#3731](#3731) Removes
the fallback #3727 kept for a push naming no refspec behind an
unrecognized `env` option, answering this promotion's third review
round. Such a push resolves its branch only through an absolute
`--git-dir`, git's own `-C`, or a `cd` in a wrapper body, and is
otherwise read as writing every protected default, so it fails closed
even from a feature branch.

Deferred review findings: #3705 (`scripts/README.md`'s uvx promise),
#3706 (`validate.py`'s exact section-name match), #3710 (whether
`section_key` should casefold), #3711 (Compose-name and directory moves
in the prose gate), #3713 (the review reader's `open review findings:`
spelling), #3714 (an edited shebang that changes a file's lexer), #3720
(the write guard's reading of `git push -o<value>`), #3723 (unused
`_bare_push_branch` parameters), #3729 (a bare push after a branch
switch earlier in the same command), #3732 (the review reader's `Review
findings remain:` spelling).

For the maintainer: #3730 asks whether every bare push whose repository
the guard cannot determine should fail closed, as #3731 now does behind
an unrecognized `env` option.

Fixes #3695
Fixes #3684
Fixes #3694
Fixes #2358
Fixes #3686
Fixes #3716
Fixes #3717
Fixes #3725
Fixes #3728

🤖 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

None yet

Projects

None yet

2 participants