Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ab0ac31
Let an Attested Local Pass Cover a Head Beside a Table-Less Copilot R…
ptr727 Oct 11, 2026
320c2e9
Page pr_review.py's Changed-File List Past 100 So a Large Promotion C…
ptr727 Oct 11, 2026
b8b32c3
Strip a List Item's Opening Label for Every Marker and Bold Spelling …
ptr727 Oct 11, 2026
db5a46f
Exempt a List Item's Label Separator from the Dash Rule for Every Mar…
ptr727 Oct 11, 2026
10da6b3
Pin the Prose Gate's Override Wiring by Structure (#2776)
ptr727 Oct 11, 2026
bae8827
Share the Bounded Step Reader Across the Test Harnesses (#2778)
ptr727 Oct 11, 2026
f65e325
Say What pr_review.py wait --min-rounds Counts and Name It at the Tim…
ptr727 Oct 11, 2026
adc6c0c
Let a Round on the Head Outrank pr_review.py wait's Repo-Wide Quota R…
ptr727 Oct 11, 2026
74189b1
Read a Carried Change Set Past the Compare Endpoint's 300-File Ceilin…
ptr727 Oct 11, 2026
16e20cd
Close the Remaining Blocked-Promotion Gaps in the Unattended Worker (…
ptr727 Oct 11, 2026
c8196f4
Let the Unattended Orchestrator Retry a Transient Dispatch Failure (#…
ptr727 Oct 11, 2026
ae86a02
Name a Python File the Prose Gate Cannot Parse in Its Scope Line (#2797)
ptr727 Oct 11, 2026
58c081c
Read a First-Line Comment After a Byte Order Mark as Leading in Every…
ptr727 Oct 11, 2026
e214c35
Name a File the Prose Gate Cannot Decode in Its Scope Line (#2802)
ptr727 Oct 11, 2026
cb4abd7
Read a Tool Name as a Prose Gate Directive Only Where It Opens the Co…
ptr727 Oct 11, 2026
0754530
Name Why a Windows Tool Install Failed and Print Docker's Status in U…
ptr727 Oct 11, 2026
c1d09a7
Judge the Prose in Front of a Trailing noqa or pylint Directive (#2814)
ptr727 Oct 11, 2026
c0a0eef
Read noqa and CSpell Directives in Any Letter Case (#2819)
ptr727 Oct 11, 2026
b3d7fec
Spend a Head Refusal a Later Genuine Round on That Head Answers (#2825)
ptr727 Oct 11, 2026
65c14a2
Read nopep8 in Any Letter Case in the Prose Gate (#2827)
ptr727 Oct 11, 2026
5bfd54c
Bind the Workspace-Edit Rule Only to an Agent Running Inside VS Code …
ptr727 Oct 11, 2026
f3a633b
Record HomeAssistant-Config's Incidental Python as a driftNote (#2813)
ptr727 Oct 11, 2026
3bb3c95
Require Every CLI Script to Answer Help and Refuse Unknown Arguments …
ptr727 Oct 11, 2026
4035555
Exempt nopep8 as a Leading Directive in the Prose Gate (#2833)
ptr727 Oct 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .agents/skills/agent-conduct/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ The checks that separate work actually done from work that merely reports succes
- **Editing CRLF files programmatically: `.` matches `\r` in a regex**, so a captured line keeps its carriage return and rejoining with `\r\n` yields `CRCRLF`. Prefer literal replacement over regex reassembly. In Python the *default* path is a text-mode rewrite, which has the mirror failure: `Path.read_text()` decodes through universal newlines and `write_text()` translates each `\n` back to `os.linesep`, so a read-edit-write round trip rewrites every line ending in the file to the host's own while the edit itself looks correct. Work in bytes, or open the file explicitly with `newline=''` on both the read and the write, since a read that preserves the endings still hands them to a write that translates them. Use `open()` rather than `Path.read_text()`, which accepts that argument only on Python 3.13 and newer and raises `TypeError` below it. The corruption is worth naming because it is invisible in a rendered diff.
- **Scope a check by what the project declares, not by the file that prompted it.** A check written while editing one file tends to cover that file's language and stop, and then reports success on every other surface the rule governs. Read the declared types, or the config that enumerates them, and cover each one, then assert a floor per surface so a table that narrows fails loudly instead of passing quietly. A rule about comments means every comment syntax the project ships, and a format that carries comments in practice counts even where its specification says otherwise.
- **Never write source text carrying backslash escapes through a shell construct that interprets them.** A `printf` format string, a `printf` argument consumed by `%b`, `echo -e`, POSIX `sh`'s builtin `echo`, and `$'...'` each consume the escape and write an invisible control character in its place, so a `\b` inside a regex becomes a backspace and the pattern silently matches nothing while every test still passes. A quoted heredoc, `<<"EOF"`, is not one of those constructs and writes every backslash literally. An unquoted `<<EOF` is one of them, because it collapses `\\` to `\`, so source carrying `"\\bword\\b"` reaches the file as `"\bword\b"` and the pattern compiles to a backspace. Use a file-editing tool for such text where one is available, and a quoted heredoc where the work has to happen in a shell. When a check inspects text for control characters, use `str.isprintable()` rather than a codepoint floor, since DEL and the Unicode format characters sit above 32 and are equally invisible in a diff. That test calls `\n` and `\t` unprintable too, so apply it to the tokens the text is made of, or exempt the whitespace it legitimately carries, rather than running it over whole lines.
- **Never edit a `.code-workspace` file that a VS Code window has loaded as its workspace.** A workspace file rewritten on disk can make VS Code reload that window, and a reload destroys the context of an agent session running in it, so the work in flight is lost with nothing to catch it, and the trigger is not fully characterized (an agent's edit has caused the reload where a human's identical edit did not). Surface the needed change for the maintainer to apply by hand. The test is whether any window has that file loaded, wherever the editing agent runs. A worktree's copy that no window has opened passes that test, and so does the workspace file of a checkout the maintainer opened as a folder rather than as a workspace. Where the agent cannot tell, it asks the maintainer, and once told that no window has the file loaded it edits the file directly rather than handing the edit off.
- **An agent running inside VS Code never edits a `.code-workspace` file that a VS Code window has loaded as its workspace.** A workspace file rewritten on disk can make VS Code reload that window, and a reload destroys the context of an agent session running in it, so the work in flight is lost with nothing to catch it, and the trigger is not fully characterized (an agent's edit has caused the reload where a human's identical edit did not). Such an agent surfaces the needed change for the maintainer to apply by hand. The rule binds a session hosted by VS Code, in its extension or its integrated terminal. An agent running in a standalone console is outside the rule and edits the file directly, even while a window has that file loaded. A file no window has loaded is outside it too. A worktree's copy no window has opened is one, as is the workspace file of a checkout opened as a folder. Where the agent cannot tell whether the rule binds it, it asks the maintainer. Once told that it does not, it edits the file directly rather than handing the edit off.
- **A green check is not evidence the work happened.** A skipped job and a passing job are indistinguishable in the aggregated required check. When a job exists to exercise something, confirm from its log that it ran and produced the output it promises.
- **A local clone is not the branch it names, it is whatever that clone last fetched.** Reading a checkout on disk answers what that clone last saw, so a finding taken from one carries a date nobody stated, and two failures of exactly that shape are on record from one session: a repository reported as still drifted on a file whose fix had already merged, and a repository reported as missing a file it carries because the checkout sat on an older branch. Read the live ref through the API where the claim will be acted on, or fetch immediately before reading, and name the ref and the commit in any finding a local read produced. A clone stays the right tool for anything needing history or a build, which an API read cannot give.
- **A checkout already sitting on disk is not yours to trust for being there.** A clone or worktree this session did not create, found while looking around a machine, may belong to another concurrent session's task, sit on a stale fetch or a branch nobody expects, or hold uncommitted edits nobody has reviewed, and none of that is visible from the directory listing that found it. Running `git status`, `git remote -v`, or `git branch --show-current` against it, or reading a file inside it, answers for whatever that checkout happens to hold at that moment, not for the repository, and the found checkout is not the "local clone" the bullet above means, since this session never fetched it and has no basis for trusting what it last saw. Clone the repository fresh into a location this session controls, or read the live state through the GitHub API, rather than adopting a pre-existing checkout as ground truth.
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/pr-review-conduct/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ visible comments, routinely still carries a finding nobody has answered. Treatin
thread, and a missing approval alike, and the response differs by cause.
2. A review is confirmed on the **current head SHA**. On a pull request into a branch other than the
default, a head after Copilot's first round can carry an attested local pass instead,
`review_on_head=local` in the digest, where the whole review history is in view and no round on
`coverage=local` in the digest, where the whole review history is in view and no round on
record states or appears to state partial coverage, and a pull request into the default branch, a
promotion among them, always carries a Copilot round on its head. A review is matched by commit
SHA rather than assumed from a green merge-state. A push makes checks go green *before* the
Expand Down
30 changes: 21 additions & 9 deletions .agents/skills/python-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@ description: >-
Governs Python code style for ptr727/ProjectTemplate fleet repos: the build-versus-lint-only
profile split, the uv/ruff/pyright/mypy/pytest toolchain, src layout, formatting and linting,
comment and docstring conventions, type hints, naming, imports, patterns to avoid, test
conventions, and versioning. Use this whenever writing, reviewing, or editing a .py file, a
pyproject.toml, or a uv.lock, whenever running or choosing a Python formatting, lint, type-check,
or test command, whenever deciding whether a Python subtree is a shippable project or a lint-only
scripts tree, whenever choosing pyright versus mypy for a repo's CI gate, or whenever writing or
reviewing a Python test. Triggers even when the task looks like a small local fix ("just add a
helper function", "silence this lint warning", "add a dependency") or verification step ("run
the tests"), because choosing pytest before reading the profile turns an intentional unittest
suite into a false missing-dependency diagnosis. Applies only to a repo's Python side, a repo
with no Python has no use for this Skill.
conventions, versioning, and the --help and unknown-argument rule for a script. Use this
whenever writing, reviewing, or editing a .py file, a pyproject.toml, or a uv.lock, whenever
running or choosing a Python formatting, lint, type-check, or test command, whenever deciding
whether a Python subtree is a shippable project or a lint-only scripts tree, whenever choosing
pyright versus mypy for a repo's CI gate, or whenever writing or reviewing a Python test.
Triggers even when the task looks like a small local fix ("just add a helper function", "silence
this lint warning", "add a dependency") or verification step ("run the tests"), because choosing
pytest before reading the profile turns an intentional unittest suite into a false
missing-dependency diagnosis. Applies only to a repo's Python side, a repo with no Python has no
use for this Skill.
---

# Python Codestyle
Expand Down Expand Up @@ -247,6 +248,17 @@ Before pushing or opening a PR:
- Markdown in this directory follows CODESTYLE.md's repo-wide Markdown and Spelling rules,
packaged as the `comment-and-doc-style` Skill.

## Command-Line Arguments

<!-- include: CODESTYLE.md > Command-Line Arguments -->

A command-line script is one a person or an agent runs by name. A hook its host runs, taking its input from that host rather than from a command line, is not one.

- **Every command-line script answers `--help` and `-h`** by printing its usage and exiting 0, changing nothing. An agent learns a script's interface by asking it, so a script that reads `--help` as an input acts in a way nobody predicted.
- **An argument the script does not recognize is refused**, with a non-zero exit before any read or write. An unrecognized first argument is never taken as a default mode or as a target.

<!-- /include -->

<!-- External -->

[docs-link]: https://docs.pytest.org/
Expand Down
32 changes: 22 additions & 10 deletions .agents/skills/shell-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,17 @@ description: >-
Governs Bash/shell script style for ptr727/ProjectTemplate fleet repos: when a bootstrap or
host-tool script may be shell instead of Python, the mandatory set -Eeuo pipefail header, the
pipefail-versus-early-reader pitfall, self-recursive command shims, self-locating scripts, the
shellcheck-plus-shfmt clean-compile, and the why-not-what comment rule. Use this whenever
writing, reviewing, or editing a shell script (a `.sh` file, or an extensionless bash/sh shebang
script), whenever deciding whether a new script should be Bash or Python, or whenever a pipeline
built from `curl`/`grep`/`jq`-style commands looks like it silently swallowed a failure, or
whenever a script or probe writes a wrapper or shim named after a command it also calls.
Triggers even when the task looks like a one-line tweak to an existing script, because a missing
`-e`/`pipefail`, or a reader piped straight from a producer that closes the pipe early, are each
invisible until the exact failure mode they guard against actually happens. Fleet-wide: a shell
script can appear in any repo (a bootstrap that installs the interpreter, a host tool that must
run before a toolchain exists), not only a repo whose primary language is shell.
shellcheck-plus-shfmt clean-compile, the --help and unknown-argument rule, and the why-not-what
comment rule. Use this whenever writing, reviewing, or editing a shell script (a `.sh` file, or
an extensionless bash/sh shebang script), whenever deciding whether a new script should be Bash
or Python, or whenever a pipeline built from `curl`/`grep`/`jq`-style commands looks like it
silently swallowed a failure, or whenever a script or probe writes a wrapper or shim named after
a command it also calls. Triggers even when the task looks like a one-line tweak to an existing
script, because a missing `-e`/`pipefail`, or a reader piped straight from a producer that
closes the pipe early, are each invisible until the exact failure mode they guard against
actually happens. Fleet-wide: a shell script can appear in any repo (a bootstrap that installs
the interpreter, a host tool that must run before a toolchain exists), not only a repo whose
primary language is shell.
---

# Shell Codestyle
Expand Down Expand Up @@ -75,3 +76,14 @@ depend on Python either. Everything else is Python, with a test under its own sc
- **Comments say why, never what.** The code states what it does. A comment restating it goes
stale silently, where a comment carrying a reason fails visibly when the reason stops being
true.

## Command-Line Arguments

<!-- include: CODESTYLE.md > Command-Line Arguments -->

A command-line script is one a person or an agent runs by name. A hook its host runs, taking its input from that host rather than from a command line, is not one.

- **Every command-line script answers `--help` and `-h`** by printing its usage and exiting 0, changing nothing. An agent learns a script's interface by asking it, so a script that reads `--help` as an input acts in a way nobody predicted.
- **An argument the script does not recognize is refused**, with a non-zero exit before any read or write. An unrecognized first argument is never taken as a default mode or as a target.

<!-- /include -->
Loading
Loading