diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 3e8eebd..bc3b9a5 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -60,8 +60,9 @@ To-dos are the open `todo` issues on this repo since 2026-10-01 (#61–#64 carry ## Recommended next steps -1. **Make `bonsai-link` a required check per repo** — the wave has installed it everywhere `claude.yml` - is; the context is the job id `bonsai-link` (kit README). First, because step 2 waits. +1. ~~Make `bonsai-link` a required check per repo~~ — dropped (Maria, 2026-10-01): the check skips + PRs with no Bonsai mention, since most human PRs have no ticket and a red X read as a failing + build; a required check that passes when skipped would enforce nothing. The wave also installs `claude-standards.md` beside `claude.yml` since 2026-10-01; the `@.github/claude-standards.md` import is a `todo` issue in each repo that lacks it. driver-agents joins the fleet as an implementer target (driver-agents #50, Maria 2026-10-01); the diff --git a/docs/claude-yml-wave-plan.md b/docs/claude-yml-wave-plan.md index 8349162..99e051b 100644 --- a/docs/claude-yml-wave-plan.md +++ b/docs/claude-yml-wave-plan.md @@ -59,4 +59,5 @@ PRs as it refuses outsiders. Cost: no `@claude` on a contributor's fork PR. and the "Mint the store token as a log mask" step must pass. Never print the token cache to prove the mask: if the mask did not register, that writes the live token into the log. 7. Run one real ticket through with the transcript on (`show_full_output`) and read it before calling - the wave done. Then make `bonsai-link` a required check per repo. + the wave done. ~~Then make `bonsai-link` a required check per repo~~ — dropped 2026-10-01; the check + now skips PRs with no Bonsai mention (grey, not red). diff --git a/templates/github/README.md b/templates/github/README.md index 7bcb4fd..dfb924a 100644 --- a/templates/github/README.md +++ b/templates/github/README.md @@ -9,7 +9,7 @@ workflow here touches it. | File | Goes to | Does | |---|---|---| -| `pr-bonsai-link.yml` | `.github/workflows/pr-bonsai-link.yml` — wherever `claude.yml` is | Fails a PR whose body names no Bonsai task: an `app.hellobonsai.com/tasks/` URL, or a `Bonsai task: none` line. Dependabot PRs are exempt. Check-run context is the job id, **`bonsai-link`**; make it required per repo only once the wave has installed it. | +| `pr-bonsai-link.yml` | `.github/workflows/pr-bonsai-link.yml` — wherever `claude.yml` is | Checks the Bonsai link in a PR body: a PR with no Bonsai mention is skipped (grey, never red — most human PRs have no ticket), one that mentions a link must carry an `app.hellobonsai.com/tasks/` URL. Check-run context is the job id, **`bonsai-link`**. | | `pull_request_template.md` | `.github/pull_request_template.md` | Gives human PRs the `Bonsai task: \| none` line `bonsai-link` checks for, and prompts them to **link the Bonsai issue** (`Closes #N`) so the dispatcher can resolve the task. AI PRs write both themselves. | | `claude-standards.md` | `.github/claude-standards.md` — wherever `claude.yml` is | The house commit-message and code-comment standard. The repo's `CLAUDE.md` imports it with `@.github/claude-standards.md` (replacing any pasted copy), so local sessions load it (CI loading is unconfirmed — `../../docs/HANDOFF.md`). Lint-only repos are wave targets through it. | | `shopify-tool-smoke.yml` | `.github/workflows/` — **STORE REPOS ONLY** | Manual (`workflow_dispatch`) diagnostic for the Shopify admin tool: secrets → `driver-agents` clone at the pin → token mint → Admin API, read-only. Fails **loudly** where `claude.yml` degrades — that's the point. Skip it in repos with no store. | diff --git a/templates/github/pr-bonsai-link.yml b/templates/github/pr-bonsai-link.yml index 241ef2f..dc0621e 100644 --- a/templates/github/pr-bonsai-link.yml +++ b/templates/github/pr-bonsai-link.yml @@ -1,7 +1,7 @@ name: Bonsai task link -# Fails a PR whose body names no Bonsai task: an app.hellobonsai.com task URL, or a -# `Bonsai task: none` line. Dependabot PRs are exempt. +# Checks the Bonsai task link in a PR body: a PR that mentions no Bonsai link at all is skipped +# (grey, never red — most human PRs have no ticket), one that carries a link must carry a task URL. on: pull_request: @@ -13,8 +13,9 @@ permissions: {} jobs: bonsai-link: - # A skipped job satisfies a required check, which is what the exemption needs. - if: github.event.pull_request.user.login != 'dependabot[bot]' + # Skipped is the neutral outcome: no Bonsai mention, nothing to check. The regex below is the + # precise test; this is only the coarse gate that keeps the job grey instead of red. + if: contains(github.event.pull_request.body, 'hellobonsai.com') runs-on: ubuntu-latest timeout-minutes: 5 steps: @@ -29,5 +30,5 @@ jobs: if grep -qiE "$url|$none" <<<"$BODY"; then echo "Bonsai task named"; exit 0 fi - echo "::error::Name the Bonsai task in the PR body: a line reading 'Bonsai task: ', or 'Bonsai task: none' when there is no task." + echo "::error::The Bonsai link in the PR body is not a task URL. Use the task's app.hellobonsai.com/tasks/ URL (or its board link with ?task=)." exit 1