Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
23ef357
Exempt an Archived Repository From configure.sh's Checks (#1846)
ptr727 Sep 26, 2026
c6f8137
Fail the C# Unit Test Step When No Coverage Report Was Written (#1848)
ptr727 Sep 26, 2026
7e82bb2
Assert the Planted Registration Defects Are Reported (#1851)
ptr727 Sep 26, 2026
18ce3fa
Say the Archived-Exemption Region Makes No gh Call of Its Own (#1854)
ptr727 Sep 26, 2026
e659c81
Scope the End-to-End Docstring to an Archived Repository Given by Nam…
ptr727 Sep 26, 2026
eda453a
Pass --repo on Documented Handoff Commands and Guard Handoff Reads Ag…
ptr727 Sep 26, 2026
e9c8df0
Fall Back to the Default Search Path When PATH Is Unset (#1859)
ptr727 Sep 26, 2026
ccaf61c
Scope VerifyReferenceAotCompatibility to an AOT Publish in dotnet-cod…
ptr727 Sep 26, 2026
432987a
Establish the PATH Order tool_shadow_path Names (#1867)
ptr727 Sep 26, 2026
a2de9ff
Make the Installer's Dirty-Checkout Tests Independent of the Real Che…
ptr727 Sep 26, 2026
6e37b7a
Pin and Decode Git's Quoting in repo_gate.py's ls-files Read (#1873)
ptr727 Sep 26, 2026
a50dcc5
Fold Typographic Punctuation in pr_review.py reply --match (#1878)
ptr727 Sep 26, 2026
5d1a44a
Route configure.sh's ruleset_id() Through jqr (#1253) (#1883)
ptr727 Sep 26, 2026
ed8769f
State the Pin Comment as the Release Tag and Define $/ (#1885)
ptr727 Sep 26, 2026
22c6a8b
Distinguish ./ From $/ Resolution in the Pin Rule's Prose (#1888)
ptr727 Sep 26, 2026
b250ab8
Fall Back to the Default Search Path in the Archived End-to-End Test …
ptr727 Sep 26, 2026
6c89499
Drop the Issue Reference From repo-config's Archived-Exemption Note (…
ptr727 Sep 26, 2026
042b9b9
Describe IL3058 as a Missing IsAotCompatible Mark (#1895)
ptr727 Sep 26, 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
4 changes: 3 additions & 1 deletion .agents/skills/backlog-burndown/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ handoff chain `AGENTS.md` "Session Scope" defines, so it records work to do next
its own, and an open one is present by design for as long as that chain is in use. Counting it
inflates the number this run reports as the backlog by one for every lane in use, and a backlog
count this fleet reports wrong is a failure with its own history, so filter the label out of the
ranking and out of every count of the open backlog rather than out of the ranking alone.
ranking and out of every count of the open backlog rather than out of the ranking alone. A link
carrying `blocked` as well, as a parked lane does, is still a link, so this rule controls over the
`blocked` rule below and the link is neither ranked nor counted.

An issue carrying the `blocked` label is counted and is not ranked while its blocker stands. It
records real work this repository owes, which is why it stays in the count, and the label says the
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/dotnet-codestyle/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ parameterized tests. A test project on `xunit.v3` 4.0.0 or later is MTP-based, a

## Project configuration

.NET 10.0 target, AOT-compatible (`IsAotCompatible=true`, `VerifyReferenceAotCompatibility=true`),
.NET 10.0 target, AOT-compatible (`IsAotCompatible=true`, with `VerifyReferenceAotCompatibility=true` only under the `PublishAot` condition),
SourceLink, embedded untracked sources, `InternalsVisibleTo` for test/benchmark access. See
`references/project-config.md` for the full property list.

Expand Down
10 changes: 8 additions & 2 deletions .agents/skills/dotnet-codestyle/references/project-config.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
# .NET Project Configuration

1. **Target framework**: .NET 10.0 (`<TargetFramework>net10.0</TargetFramework>`).
2. **AOT compatibility**: `<IsAotCompatible>true</IsAotCompatible>`,
`<VerifyReferenceAotCompatibility>true</VerifyReferenceAotCompatibility>`.
2. **AOT compatibility**: `<IsAotCompatible>true</IsAotCompatible>` unconditionally, and
`<VerifyReferenceAotCompatibility>true</VerifyReferenceAotCompatibility>` only in a
`<PropertyGroup Condition="'$(PublishAot)' == 'true'">`, placed in the `.csproj` after it sets
`PublishAot` or in `Directory.Build.targets`, never in `Directory.Build.props`, which is imported
before the project body and so never sees a `PublishAot` the `.csproj` sets. Reference
verification reports `IL3058` for every referenced assembly that lacks `IsAotCompatible` metadata
set to `true`, and `TreatWarningsAsErrors` turns that into a failed build on any such
dependency, so it runs only where an AOT publish needs it.
3. **Assembly information**: use semantic versioning, include SourceLink
(`<PublishRepositoryUrl>true</PublishRepositoryUrl>`), embed untracked sources
(`<EmbedUntrackedSources>true</EmbedUntrackedSources>`).
Expand Down
29 changes: 17 additions & 12 deletions .agents/skills/session-handoff/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,9 @@ section is the pointer to what to read rather than the answer, and `AGENTS.md` "
already says stale context is worse than absent. A handoff is context by construction, so this is
that rule applied to the one artifact built to outlive the session that wrote it.

Read the current link's comments too, with `gh issue view "<n>" --comments`, since `resume` prints
only the body, and a parking comment or a closing session's answers land in the comments.
Read the current link's comments too, with `gh issue view "<n>" --repo OWNER/NAME --comments`, since
`resume` prints only the body, and a parking comment or a closing session's answers land in the
comments.

Read the chain before re-attempting anything. `resume` prints the current body and indexes the
closed links behind it, and `chain --grep` searches the bodies it walks for a regular expression,
Expand All @@ -161,23 +162,27 @@ rather than `resume`.

Re-derive a count rather than copying one, and read it with an explicit page size. `gh issue list`
returns 30 rows unless told otherwise, and a truncated count reads exactly like a repository with
30 issues, which is worse than an absent count because it gets stated.
30 issues, which is worse than an absent count because it gets stated. The same holds at any page
size, so where a read returns as many rows as its limit, raise the limit and read again until it
returns fewer.

## The Attended Session

A maintainer resuming work says little, often only "resume the handoff", and that phrase stands for
the whole procedure below. Run every step without being reminded of any of them.

1. **Pick the link.** Where the maintainer names an issue, take it. Where none is named, read
`gh issue list --label handoff --state open --limit 100 --json number,title,labels,updatedAt`,
since `tracks` prints neither labels nor exact update times. Take a link carrying `blocked`
first, newest update first among them, since its blocker is a decision only the maintainer can
make and the maintainer is now present. Otherwise take the newest update among the rest. An
`auto-*` link not carrying `blocked` is skipped unless named, since an `unattended-handoff`
worker may hold it right now, and where one is named, confirm with the maintainer that no
unattended run is live before working it. Where every open link is skipped, say so and ask the
maintainer which to take. Say which link was picked in one line before anything else, so a wrong pick costs one reply
rather than a round.
`gh issue list --repo OWNER/NAME --label handoff --state open --limit 100 --json
number,title,labels,updatedAt`, since `tracks` prints neither labels nor exact update times.
Where it returns as many rows as the limit, the list may be truncated, so raise the limit and
read again until it returns fewer, rather than picking from a partial list. Take a link carrying
`blocked` first, newest update first among them, since its blocker is a decision only the
maintainer can make and the maintainer is now present. Otherwise take the newest update among the
rest. An `auto-*` link not carrying `blocked` is skipped unless named, since an
`unattended-handoff` worker may hold it right now, and where one is named, confirm with the
maintainer that no unattended run is live before working it. Where every open link is skipped,
say so and ask the maintainer which to take. Say which link was picked in one line before
anything else, so a wrong pick costs one reply rather than a round.
2. **Resume it** per "Resuming" above, comments included, re-deriving live state rather than
trusting the body.
3. **Ask what it is blocked on first.** Where the link carries `blocked`, the parking comment names
Expand Down
49 changes: 27 additions & 22 deletions .agents/skills/unattended-handoff/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,23 +150,24 @@ does not qualify, since skipping one costs nothing and a guess costs a revert an
lacks.
- **It reverses no settled decision** recorded in an issue, a handoff, or the rule text.
- **Nothing has worked it or is working it.** The track `auto-<issue>` has no link, open or closed,
which `handoff.py chain --track "auto-<issue>" --limit 1` answers with its refusal naming no
handoff on that track. Any other refusal from it is a `STOP` rather than a yes. No open pull
request names it, and no pull request whose squash commit is in `origin/main..origin/develop`
names it anywhere in its body, since a fix merged to develop leaves its issue open until it is
promoted, whoever merged it. No open handoff on any track names it in its next steps, and no
comment on it claims it for a `backlog-burndown` group, since both mark work that has no pull
request yet.
which `handoff.py chain --repo "<owner>/<repo>" --track "auto-<issue>" --limit 1` answers with its
refusal naming no handoff on that track. Any other refusal from it is a `STOP` rather than a yes.
No open pull request names it, and no pull request whose squash commit is in
`origin/main..origin/develop` names it anywhere in its body, since a fix merged to develop leaves
its issue open until it is promoted, whoever merged it. No open handoff on any track names it in
its next steps, and no comment on it claims it for a `backlog-burndown` group, since both mark
work that has no pull request yet.

## The Picker

1. **Check the promotion first** under `main` or `release`. Where an open `decision` issue names
the open develop -> main pull request, return `STOP` before picking anything, since every worker
this run dispatched would meet that same decision after merging its own work to develop.
2. **Read the open handoffs** with labels and update times, `gh issue list --label handoff --state
open --limit 100 --json number,title,labels,updatedAt`, since `handoff.py tracks` prints
neither. Reach `scripts/handoff.py` from a hub checkout, per `session-handoff` "Running the
Chain".
2. **Read the open handoffs** with labels and update times, `gh issue list --repo "<owner>/<repo>"
--label handoff --state open --limit 100 --json number,title,labels,updatedAt`, since `handoff.py
tracks` prints neither. Where it returns as many rows as the limit, the list may be truncated, so
raise the limit and read again until it returns fewer, rather than ranking a partial list. Reach
`scripts/handoff.py` from a hub checkout, per `session-handoff` "Running the Chain".
3. **Prefer an open `auto-*` handoff not carrying `blocked`**, oldest first. That is a lane an
earlier run parked and the maintainer has since unblocked, or one whose worker died, and a live
link is work already framed. Handoffs on any other track belong to the maintainer's attended
Expand All @@ -175,23 +176,27 @@ does not qualify, since skipping one costs nothing and a guess costs a revert an
the session handing the lane back removes the label, per `GOVERNANCE.md` "Durable Knowledge and
Self-Improvement".
4. **Otherwise pick from the backlog.** Rank the open issues by `backlog-burndown`'s "Ranking"
criteria, keep the auto-resolvable ones, and take the top one. Read the list with an explicit
page size, since `gh issue list` returns 30 rows unless told otherwise.
5. **Create its handoff** with `handoff.py new --track "auto-<issue>"`, `--dry-run` first. The body
carries the sections `session-handoff` "What Goes in the Body" names, with the next steps naming
the issue and what done looks like. That skill's rules on the body bind it.
criteria, keep the auto-resolvable ones, and take the top one. Read the list with `gh issue list
--repo "<owner>/<repo>" --state open` and an explicit `--limit`, since it returns 30 rows unless
told otherwise, and apply step 2's full-page check to it.
5. **Create its handoff** with `handoff.py new --repo "<owner>/<repo>" --track "auto-<issue>"`,
adding the `--title` and `--body-file` it also requires, as `session-handoff` "Running the Chain"
shows, and `--dry-run` first. The body carries the sections `session-handoff` "What Goes in the
Body" names, with the next steps naming the issue and what done looks like. That skill's rules on
the body bind it.
6. **Choose the worker's tier** by `backlog-burndown`'s "Choosing the Worker's Model Tier".
7. **Reply with one line.** A picker writes nothing but the handoff it creates, and returns `STOP`
where a read it needs cannot run.

## The Worker

1. **Resume the handoff** with `handoff.py resume --track "<track>"`, then read its comments with
`gh issue view "<n>" --comments`, since `resume` prints only the body and a parked lane's state
is in its parking comment. A lane handed back by an attended session has a closed predecessor
holding that comment, so read the predecessor's comments too. Where either names a decision
issue, read the answer recorded there and follow it, since it is what unblocked the lane.
Re-derive live state rather than trusting any of them, per `session-handoff` "Resuming".
1. **Resume the handoff** with `handoff.py resume --repo "<owner>/<repo>" --track "<track>"`, then
read its comments with `gh issue view "<n>" --repo "<owner>/<repo>" --comments`, since `resume`
prints only the body and a parked lane's state is in its parking comment. A lane handed back by
an attended session has a closed predecessor holding that comment, so read the predecessor's
comments too. Where either names a decision issue, read the answer recorded there and follow it,
since it is what unblocked the lane. Re-derive live state rather than trusting any of them, per
`session-handoff` "Resuming".
2. **Isolate** in a worktree of its own, per `repo-worktree`, on the branch the handoff names or on
`feature/<track>`.
3. **Fix and drive.** Run `local-strict-review` before every push, and drive the pull request with
Expand Down
Loading
Loading