mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-09 18:28:15 +01:00
* Add a check that keeps tracker codes and internal jargon out of PR titles and branch names gstack-plain-title checks the readable front of a title, branch name, PR opening or changelog entry against the repository's .gstack/plain-titles.json; one trailing issue code stays allowed. A Plain title workflow runs it on every new pull request, and /ship's push refuses a never-pushed branch whose name fails it. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Move the PR body's machine-read lines into a closing Agent notes section The ship receipt, its runs block and the Plan line now live in one collapsed section at the end of the body, and every reader looks there first while still accepting the old receipt-at-top layout. gstack-post refuses to post a title the plain-title check refuses, and land uses the checked PR title as main's commit title. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Teach /ship to write plain titles, PR openings, commit messages and changelog entries The README now lists what gstack is for, so a PR opening can name the goal it serves. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Keep tests, size budgets and generated files in step with plain titles and Agent notes Copy lists that install result-code modules now include the plain-title codes, the ship goldens and size ledger are refreshed, the new workflow is classified, and the pinned prose tests read the new title and body layout. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Record the test-profile list change as non-behavioral for the shared test harness Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Keep text people add below the PR notes, and fix three smaller review findings The notes section now ends at its own closing tag, so a collapsible added after it survives the next post. The opening check splits the body the same way the notes reader does. Wave PR titles no longer name the area, which the plain-title check could refuse. The Capy line in the PR-body steps now puts Approvals in the notes. Review-Finding: p1/specialist-batched#1 reader=testing Review-Finding: p1/red-team#1 reader=red-team Review-Finding: p1/red-team#2 reader=red-team Review-Finding: p1/red-team#3 reader=red-team Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Mask credentials in refused-title lines and keep older PRs' plan lines readable A refused title's printed match is masked by the secret scanner first. The Plan line reader falls back to the whole body when the Agent notes section has none, so a body written before this change keeps its plan when its first receipt lands. The notes section also ends at its own closing tag when its opener is split or marked open, or when a collapsible inside it is left unclosed. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Print a fixed placeholder when a credential in a refused title cannot be masked Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Keep a plain-title policy edit from scheduling every paid eval Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Record the paid-eval list change as non-behavioral for the shared test harness Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * Recheck the PR title on every edit so a base change cannot turn a refused title green Review-Finding: s11/targeted#1 reader=targeted Review-Finding: s11/adversarial-native#1 reader=adversarial-native Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> --------- Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
48 lines
4.1 KiB
Markdown
48 lines
4.1 KiB
Markdown
<!-- AUTO-GENERATED from capy-pr.md.tmpl — do not edit directly -->
|
|
<!-- Regenerate: bun run gen:skill-docs -->
|
|
## Step 19-C: Capy PR body (What changed, Why, Blast radius, Approvals)
|
|
|
|
Read only when Step 19 printed `CAPY_PR: on`. Under Capy a person decides the merge from the PR and
|
|
the READY report, through a Captain, so the body shows what changed in pictures, why, and who
|
|
approved what. Guide: `captain.md` beside the Capy `gstack` skill's SKILL.md.
|
|
|
|
**Order.** The plain opening sentences come first, then `## What changed`, `## Why` and `## Blast radius`,
|
|
then the standard sections below. `## Approvals` goes inside the closing Agent notes section, where
|
|
`gstack-ship-receipt write` also puts the receipt. Keep `## Summary` to commit themes; do not repeat the captions.
|
|
|
|
1. **Pick the evidence:** one to three before/after pairs, highest-signal first. The first is the
|
|
key image.
|
|
- UI change: screenshot the changed screen at the base and on this branch with the browse
|
|
flow, or your host's browser, at the same size.
|
|
- Skill or prompt change: `~/.claude/skills/gstack/bin/gstack-pr-shots --path <template or SKILL.md> --heading "<changed section>" --caption "<what changed and why>"`.
|
|
- CLI change: save the output of a command this ship already runs, at the base and on this
|
|
branch, to files inside the repository (`.gstack/tmp/before.txt`, `.gstack/tmp/after.txt`), then
|
|
`~/.claude/skills/gstack/bin/gstack-pr-shots --before <file> --after <file> --kind terminal --caption "<…>"`.
|
|
Never run a command with side effects just to make a picture.
|
|
- No visible surface: picture the source section or test output that best shows the change.
|
|
`gstack-pr-shots` refuses inputs that match the secret scanner (`PR_SHOTS_INPUT_REFUSED`). Remove
|
|
the secret from the capture; never work around the refusal.
|
|
2. **Read `SHOT_PNG:`.** A path: use it. `unavailable (…)`: screenshot the printed `shot.html` with your
|
|
own browser at 880 px wide and use that PNG. `failed (…)`: use the text version only.
|
|
3. **Upload.** Only for a public repository (`gh repo view --json visibility -q .visibility` prints
|
|
`PUBLIC`). A private repository gets the text version, unless the person approved images for it
|
|
(record that with `gstack-approvals add`). Upload each PNG with Capy's PR asset tool
|
|
(`tools.pr.uploadAsset`). Embed exactly the URL it returns, with the caption as alt text:
|
|
`` (a returned bare video URL stays on its own line). If an upload fails,
|
|
retry once, and only for a transient error. Otherwise use the text version and write
|
|
`image upload failed: <reason>` under the caption. Never block publication on an image.
|
|
4. **Under every image:** a one-line caption saying what changed and why, then the contents of the
|
|
printed `text.md` (a collapsed text before/after, for readers who cannot see the image and for search).
|
|
5. **`## Why`:** two or three sentences. The first states the problem in the person's words (the issue,
|
|
the failed run, or their request, quoted); the rest say what changes for them. No inventory: BAD "Adds
|
|
a lint and a CI step." GOOD "'The review loop is too overzealous.' Pass 2 now reads only pass 1's range."
|
|
6. **`## Blast radius`:** the body template's item, written once, here: what else the change touches and
|
|
the one fact that makes that safe, with the evidence-ladder rung it reached (file:line read, walked failure path, script ran, repro).
|
|
7. **`## Approvals`** (inside Agent notes): the output of `~/.claude/skills/gstack/bin/gstack-approvals render --plan "<the brief's Plan line>"`, verbatim. It
|
|
escapes its cells, and the receipt never reads it as an approval citation. A public repo (or unknown
|
|
visibility) gets only `Approved: yes|no (record <id>)` and `Plan: approved (record r-<id>)`; never pass `--full` for a PR body. If render
|
|
refuses with a `PLAN_*` code, it printed nothing: run the fix it names and render again. On
|
|
`APPROVAL_RECORD_UNAVAILABLE` keep its text and say so in the READY report. Never type rows by hand.
|
|
8. **READY report:** attach the key image's PNG to the report you send (Capy's message
|
|
attachments) and give its uploaded URL, so the Captain can show it inline.
|