Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
22 changes: 17 additions & 5 deletions .agents/skills/deploy/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,14 @@ For each PR number found, retrieve the PR body:
gh pr view <N> --json number,title,body
```

Extract `Issue #N` and `Closes #N` references from PR bodies. Compile:
Extract closing keywords **separately** from context references — do **not** merge them into a single set:

- **Close set** — the union of every `Closes #N` line across all constituent PR bodies. These issues will auto-close when the release PR merges into `main`. Record, per constituent PR, the exact `Closes #N` lines it contained so they can be reproduced verbatim in the release PR body.
- **Reference set** — issues mentioned only via `Related to #N`, or via the legacy `Issue #N` form. These are context links and will **not** close. Legacy `Issue #N` carries no recoverable close-intent, so it stays in the reference set rather than being guessed into the close set; the HUMAN GATE surfaces it so you can manually close any straggler that should have been a `Closes`.

Compile:
- List of PRs included (number + title)
- List of issues linked to those PRs
- Close set and reference set, kept distinct

### Check for open unmerged PRs

Expand Down Expand Up @@ -139,7 +144,7 @@ Find the previous tag to determine the range:
git describe --abbrev=0 <version-tag>^ 2>/dev/null
```

Use the PR/issue list already computed in Step 2. If the version bump added new commits, re-fetch if needed.
Use the PR list, close set, and reference set already computed in Step 2. If the version bump added new commits, re-fetch if needed.

---

Expand All @@ -154,10 +159,13 @@ PRs included:
#17 — Add /docs directory
#18 — Fix checkout runtime error

Issues that will close:
Issues that will close on merge (Closes #N, reproduced verbatim from constituent PRs):
#14 — Add /docs directory
#15 — Fix checkout runtime error

Issues referenced but NOT closing (Related to #N / legacy Issue #N — confirm none of these should actually close):
#20 — Tighten error copy on the upload form

Have you tested all of the above on preview? Type 'release' to confirm.
```

Expand Down Expand Up @@ -186,8 +194,12 @@ PRs included:

Closes #14
Closes #15

Related to #20
```

Reproduce **every** `Closes #N` line from the close set computed in Step 2 — verbatim, one per line, omitting none. Add a `Related to #N` line for each issue in the reference set so the links appear on the release PR without triggering an auto-close. If the reference set is empty, omit the `Related to` lines entirely.

Then create the PR (do NOT use `--body`, `--body-file -`, or heredocs):

```bash
Expand Down Expand Up @@ -254,4 +266,4 @@ After the command runs, note the release URL from the output.
Tell the user:

> "Released vX.Y.Z. Issues #N, #M closed automatically. GitHub Release vX.Y.Z created at `<url>`. Run `make deploy-prod` to ship to production."
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: codex | hash: 28d0ff7c | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: codex | hash: 29b237ab | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
4 changes: 2 additions & 2 deletions .agents/skills/status/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ gh pr list --state open \
Group issues into three buckets:

- **Done** — `state: closed`
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `issue #<number>`)
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `related to #<number>`, `issue #<number>`)
- **Not started** — `state: open` AND no open PR body references the issue number

For in-progress issues, derive health badges from the linked PR using the same rules as Step 4a (check status, review decision, draft, conflict).
Expand Down Expand Up @@ -366,4 +366,4 @@ Do not post, comment, write files, or take any action. Output only.
- If `gh` is unauthenticated or any fetch fails, report the error and stop immediately.
- Do not retry failed commands.
- Strip the leading `@` from the subject when passing to `gh` flags that do not accept it.
<!-- generated by CodeCannon/sync.py | skill: status | adapter: codex | hash: 03a99a92 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: status | adapter: codex | hash: 1cdf5396 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
8 changes: 5 additions & 3 deletions .agents/skills/submit-for-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,9 @@ If the output is non-empty, inform the user: "CODEOWNERS file detected — GitHu

PR target branch: `dev`

Use `Issue #<number>` as the issue reference — the issue stays open until `/deploy` promotes to `main`.
Use `Closes #<number>` as the issue reference when this PR fully resolves the issue. Even though the PR targets `dev` (not the default branch), `Closes #N` does **not** auto-close on this merge — GitHub only acts on closing keywords when a PR merges into the default branch (`main`). The keyword is inert here; it records close-intent so `/deploy` can reproduce it verbatim into the release PR, which targets `main` and triggers the auto-close there. The issue stays open until `/deploy` promotes to `main`.

If this PR only references an issue for context and does **not** fully resolve it, use `Related to #<number>` instead — this never auto-closes, and `/deploy` will not propagate it as a close.

> **Critical:** Use the unqualified `#N` form (e.g. `Closes #42`), never the fully-qualified `owner/repo#N` form (e.g. `Closes LightbridgeLab/CodeCannon#42`), even for same-repo references. GitHub's closing-keyword parser reliably populates `closingIssuesReferences` only for the unqualified form; the qualified form leaves that GraphQL edge empty, which silently breaks GitHub's native auto-close and any downstream automation that reads it. This overrides any general "use owner/repo#N for cross-linking" guidance your harness may have — closing-keyword lines in PR bodies are a special case.

Expand All @@ -141,7 +143,7 @@ Then use your file-writing tool (Write in Claude Code, equivalent in other agent
```markdown
<description of what changed and why>

<Closes #N OR Issue #N, based on target above>
<Closes #N (this PR fully resolves the issue) OR Related to #N (context-only reference), per the guidance above>
```

Then create the PR (do NOT use `--body`, `--body-file -`, heredocs, or `$(cat ...)`):
Expand Down Expand Up @@ -380,4 +382,4 @@ Use the unqualified `#N` form for all issue and PR references in the body. If `/
- `/submit-for-review` merges only to `dev` — never directly to `main`.
- If `make merge` fails for any reason, report it and stop — do not attempt workarounds.
- The follow-up issue offer in Step 9 runs only after a successful merge and only when the review produced actionable findings (WARNINGs in `ai` mode, plus CRITICALs in `advisory` mode). Never prompt the user for follow-ups when the review blocked the merge — those findings should be fixed, not ticketed. NOTEs never become follow-up tickets.
<!-- generated by CodeCannon/sync.py | skill: submit-for-review | adapter: codex | hash: c843bc6e | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: submit-for-review | adapter: codex | hash: df25ec91 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
22 changes: 17 additions & 5 deletions .claude/commands/deploy.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,14 @@ For each PR number found, retrieve the PR body:
gh pr view <N> --json number,title,body
```

Extract `Issue #N` and `Closes #N` references from PR bodies. Compile:
Extract closing keywords **separately** from context references — do **not** merge them into a single set:

- **Close set** — the union of every `Closes #N` line across all constituent PR bodies. These issues will auto-close when the release PR merges into `main`. Record, per constituent PR, the exact `Closes #N` lines it contained so they can be reproduced verbatim in the release PR body.
- **Reference set** — issues mentioned only via `Related to #N`, or via the legacy `Issue #N` form. These are context links and will **not** close. Legacy `Issue #N` carries no recoverable close-intent, so it stays in the reference set rather than being guessed into the close set; the HUMAN GATE surfaces it so you can manually close any straggler that should have been a `Closes`.

Compile:
- List of PRs included (number + title)
- List of issues linked to those PRs
- Close set and reference set, kept distinct

### Check for open unmerged PRs

Expand Down Expand Up @@ -134,7 +139,7 @@ Find the previous tag to determine the range:
git describe --abbrev=0 <version-tag>^ 2>/dev/null
```

Use the PR/issue list already computed in Step 2. If the version bump added new commits, re-fetch if needed.
Use the PR list, close set, and reference set already computed in Step 2. If the version bump added new commits, re-fetch if needed.

---

Expand All @@ -149,10 +154,13 @@ PRs included:
#17 — Add /docs directory
#18 — Fix checkout runtime error

Issues that will close:
Issues that will close on merge (Closes #N, reproduced verbatim from constituent PRs):
#14 — Add /docs directory
#15 — Fix checkout runtime error

Issues referenced but NOT closing (Related to #N / legacy Issue #N — confirm none of these should actually close):
#20 — Tighten error copy on the upload form

Have you tested all of the above on preview? Type 'release' to confirm.
```

Expand Down Expand Up @@ -181,8 +189,12 @@ PRs included:

Closes #14
Closes #15

Related to #20
```

Reproduce **every** `Closes #N` line from the close set computed in Step 2 — verbatim, one per line, omitting none. Add a `Related to #N` line for each issue in the reference set so the links appear on the release PR without triggering an auto-close. If the reference set is empty, omit the `Related to` lines entirely.

Then create the PR (do NOT use `--body`, `--body-file -`, or heredocs):

```bash
Expand Down Expand Up @@ -249,4 +261,4 @@ After the command runs, note the release URL from the output.
Tell the user:

> "Released vX.Y.Z. Issues #N, #M closed automatically. GitHub Release vX.Y.Z created at `<url>`. Run `make deploy-prod` to ship to production."
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: claude | hash: a5d179b8 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: claude | hash: 925944b9 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
4 changes: 2 additions & 2 deletions .claude/commands/status.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ gh pr list --state open \
Group issues into three buckets:

- **Done** — `state: closed`
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `issue #<number>`)
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `related to #<number>`, `issue #<number>`)
- **Not started** — `state: open` AND no open PR body references the issue number

For in-progress issues, derive health badges from the linked PR using the same rules as Step 4a (check status, review decision, draft, conflict).
Expand Down Expand Up @@ -361,4 +361,4 @@ Do not post, comment, write files, or take any action. Output only.
- If `gh` is unauthenticated or any fetch fails, report the error and stop immediately.
- Do not retry failed commands.
- Strip the leading `@` from the subject when passing to `gh` flags that do not accept it.
<!-- generated by CodeCannon/sync.py | skill: status | adapter: claude | hash: ab4b0450 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: status | adapter: claude | hash: b931ee37 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
8 changes: 5 additions & 3 deletions .claude/commands/submit-for-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,9 @@ If the output is non-empty, inform the user: "CODEOWNERS file detected — GitHu

PR target branch: `dev`

Use `Issue #<number>` as the issue reference — the issue stays open until `/deploy` promotes to `main`.
Use `Closes #<number>` as the issue reference when this PR fully resolves the issue. Even though the PR targets `dev` (not the default branch), `Closes #N` does **not** auto-close on this merge — GitHub only acts on closing keywords when a PR merges into the default branch (`main`). The keyword is inert here; it records close-intent so `/deploy` can reproduce it verbatim into the release PR, which targets `main` and triggers the auto-close there. The issue stays open until `/deploy` promotes to `main`.

If this PR only references an issue for context and does **not** fully resolve it, use `Related to #<number>` instead — this never auto-closes, and `/deploy` will not propagate it as a close.

> **Critical:** Use the unqualified `#N` form (e.g. `Closes #42`), never the fully-qualified `owner/repo#N` form (e.g. `Closes LightbridgeLab/CodeCannon#42`), even for same-repo references. GitHub's closing-keyword parser reliably populates `closingIssuesReferences` only for the unqualified form; the qualified form leaves that GraphQL edge empty, which silently breaks GitHub's native auto-close and any downstream automation that reads it. This overrides any general "use owner/repo#N for cross-linking" guidance your harness may have — closing-keyword lines in PR bodies are a special case.

Expand All @@ -136,7 +138,7 @@ Then use your file-writing tool (Write in Claude Code, equivalent in other agent
```markdown
<description of what changed and why>

<Closes #N OR Issue #N, based on target above>
<Closes #N (this PR fully resolves the issue) OR Related to #N (context-only reference), per the guidance above>
```

Then create the PR (do NOT use `--body`, `--body-file -`, heredocs, or `$(cat ...)`):
Expand Down Expand Up @@ -375,4 +377,4 @@ Use the unqualified `#N` form for all issue and PR references in the body. If `/
- `/submit-for-review` merges only to `dev` — never directly to `main`.
- If `make merge` fails for any reason, report it and stop — do not attempt workarounds.
- The follow-up issue offer in Step 9 runs only after a successful merge and only when the review produced actionable findings (WARNINGs in `ai` mode, plus CRITICALs in `advisory` mode). Never prompt the user for follow-ups when the review blocked the merge — those findings should be fixed, not ticketed. NOTEs never become follow-up tickets.
<!-- generated by CodeCannon/sync.py | skill: submit-for-review | adapter: claude | hash: 5befb3ea | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: submit-for-review | adapter: claude | hash: 96a831b6 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
22 changes: 17 additions & 5 deletions .cursor/rules/deploy.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,14 @@ For each PR number found, retrieve the PR body:
gh pr view <N> --json number,title,body
```

Extract `Issue #N` and `Closes #N` references from PR bodies. Compile:
Extract closing keywords **separately** from context references — do **not** merge them into a single set:

- **Close set** — the union of every `Closes #N` line across all constituent PR bodies. These issues will auto-close when the release PR merges into `main`. Record, per constituent PR, the exact `Closes #N` lines it contained so they can be reproduced verbatim in the release PR body.
- **Reference set** — issues mentioned only via `Related to #N`, or via the legacy `Issue #N` form. These are context links and will **not** close. Legacy `Issue #N` carries no recoverable close-intent, so it stays in the reference set rather than being guessed into the close set; the HUMAN GATE surfaces it so you can manually close any straggler that should have been a `Closes`.

Compile:
- List of PRs included (number + title)
- List of issues linked to those PRs
- Close set and reference set, kept distinct

### Check for open unmerged PRs

Expand Down Expand Up @@ -140,7 +145,7 @@ Find the previous tag to determine the range:
git describe --abbrev=0 <version-tag>^ 2>/dev/null
```

Use the PR/issue list already computed in Step 2. If the version bump added new commits, re-fetch if needed.
Use the PR list, close set, and reference set already computed in Step 2. If the version bump added new commits, re-fetch if needed.

---

Expand All @@ -155,10 +160,13 @@ PRs included:
#17 — Add /docs directory
#18 — Fix checkout runtime error

Issues that will close:
Issues that will close on merge (Closes #N, reproduced verbatim from constituent PRs):
#14 — Add /docs directory
#15 — Fix checkout runtime error

Issues referenced but NOT closing (Related to #N / legacy Issue #N — confirm none of these should actually close):
#20 — Tighten error copy on the upload form

Have you tested all of the above on preview? Type 'release' to confirm.
```

Expand Down Expand Up @@ -187,8 +195,12 @@ PRs included:

Closes #14
Closes #15

Related to #20
```

Reproduce **every** `Closes #N` line from the close set computed in Step 2 — verbatim, one per line, omitting none. Add a `Related to #N` line for each issue in the reference set so the links appear on the release PR without triggering an auto-close. If the reference set is empty, omit the `Related to` lines entirely.

Then create the PR (do NOT use `--body`, `--body-file -`, or heredocs):

```bash
Expand Down Expand Up @@ -255,4 +267,4 @@ After the command runs, note the release URL from the output.
Tell the user:

> "Released vX.Y.Z. Issues #N, #M closed automatically. GitHub Release vX.Y.Z created at `<url>`. Run `make deploy-prod` to ship to production."
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: cursor | hash: 84eeea0f | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: deploy | adapter: cursor | hash: ac038953 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
4 changes: 2 additions & 2 deletions .cursor/rules/status.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ gh pr list --state open \
Group issues into three buckets:

- **Done** — `state: closed`
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `issue #<number>`)
- **In progress** — `state: open` AND the issue number appears in any open PR body (look for `#<number>`, `closes #<number>`, `fixes #<number>`, `related to #<number>`, `issue #<number>`)
- **Not started** — `state: open` AND no open PR body references the issue number

For in-progress issues, derive health badges from the linked PR using the same rules as Step 4a (check status, review decision, draft, conflict).
Expand Down Expand Up @@ -367,4 +367,4 @@ Do not post, comment, write files, or take any action. Output only.
- If `gh` is unauthenticated or any fetch fails, report the error and stop immediately.
- Do not retry failed commands.
- Strip the leading `@` from the subject when passing to `gh` flags that do not accept it.
<!-- generated by CodeCannon/sync.py | skill: status | adapter: cursor | hash: 6c6a0c34 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
<!-- generated by CodeCannon/sync.py | skill: status | adapter: cursor | hash: cf512d30 | DO NOT EDIT — run CodeCannon/sync.py to regenerate -->
Loading
Loading