diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 684b6ab6..4376158a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -17,11 +17,11 @@ Label every claim. - **live-run-proven:** exact binary path + the version that binary printed (`blender --version`). Headless harness only. Live MCP does not count. - **inspection-only:** read the skill / diff / RNA docs; no process ran. -`blender-smoke.yml` has no `push` trigger. Post-merge smoke evidence is the PR-head 5.2 + 4.5 jobs (state the versions from those logs). Apply `needs-5.1` when 5.1 must be CI-proven on the PR; default matrix does not include it. +Merge evidence is the PR-head 5.2 + 4.5 smoke jobs (state the versions from those logs). Smoke also re-runs on the push to `main`; the release gate uses that run only for direct pushes. Apply `needs-5.1` when 5.1 must be CI-proven on the PR; default matrix does not include it. ## Release-owned fields — do not hand-edit -`VERSION`, `CHANGELOG.md`, CLAUDE.md `**Version:**`, ROADMAP.md `**Current:**`, `.cursor-plugin/plugin.json` `"version"`. The release pipeline rewrites those. Do not bump `standards-version` unless the fleet stamp actually moved. +`VERSION`, `CHANGELOG.md`, CLAUDE.md `**Version:**`, ROADMAP.md `**Current:**`, and `"version"` in `.cursor-plugin/plugin.json`, `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`. The release pipeline rewrites those. Do not bump `standards-version` unless the fleet stamp actually moved. ## Checklist diff --git a/AGENTS.md b/AGENTS.md index 3a6ce044..5ff2e4eb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -76,12 +76,14 @@ Blender-Developer-Tools/ - **Squash-merge with branch deletion is the standard.** The PR becomes one commit on `main`; delete the remote feature branch after merge, then fast-forward local `main`. -- **Smoke jobs do not re-run on the merge SHA.** `blender-smoke.yml` triggers - on `pull_request` (plus a weekly schedule and manual dispatch) — there is no - `push` trigger. The correct post-merge evidence for example changes is: - both Blender smoke jobs (5.2 LTS and 4.5 LTS) passed on the PR head SHA that - became the sole squash-merged commit, with the actual binary versions - confirmed in the job logs. +- **Smoke runs on the PR head and again on `main`.** `blender-smoke.yml` + triggers on `pull_request`, on `push` to `main` (both with the same + `paths-ignore`: `**.md`, `docs/**`, `assets/**`), weekly, and on manual + dispatch. The merge evidence for example changes is still both Blender smoke + jobs (5.2 LTS and 4.5 LTS) passing on the PR head SHA that became the sole + squash-merged commit, with the actual binary versions confirmed in the job + logs. The push run is what `release-gate.sh` waits for on a direct push to + `main`; for a PR merge the gate reads the PR's own checks. - **Post-merge, verify green on `main`:** Release (`release.yml`), Validate (`validate.yml`), Ecosystem drift check (`drift-check.yml`), and Deploy GitHub Pages (`pages.yml`; paths-filtered, so it does not trigger for every @@ -92,7 +94,8 @@ Blender-Developer-Tools/ unresolved — wait before merging. - **Release-owned fields are never hand-edited:** `VERSION`, `CHANGELOG.md`, the CLAUDE.md `**Version:**` line, the ROADMAP.md `**Current:**` line, and - the manifest `"version"` in `.cursor-plugin/plugin.json`. Generated gallery + the manifest `"version"` in `.cursor-plugin/plugin.json`, + `.claude-plugin/plugin.json` and `.claude-plugin/marketplace.json`. Generated gallery pages under `docs/gallery/` are regenerated via `scripts/build_gallery.py`, never hand-edited. - **Evidence over assertion:** PR bodies must label what was proven by live @@ -170,8 +173,9 @@ way, and a one-paragraph rationale. 30 to 80 lines is the right size. 5.2 LTS and 4.5 LTS for every PR. 5.1 is weekly cron, the opt-in `needs-5.1` PR label (`pull_request` types include `labeled`), or `workflow_dispatch` with a `series` input. Auto-label does not apply - `needs-5.1`. Contributor-facing notes for the smoke lever, the deliberate - lack of a `push` trigger, Pages path filters, and the three-role exit-code + `needs-5.1`. It also runs on `push` to `main` (same `paths-ignore`), which + is what the release gate waits for on a direct push. Contributor-facing + notes for the smoke lever, Pages path filters, and the three-role exit-code convention live in CONTRIBUTING.md. Examples run through `tests/smoke/run_example.py` (catalog: `tests/smoke/catalog.json`). SKIP is exit 77 plus a `SMOKE_SKIP:` reason, and only when `--min-version` @@ -179,14 +183,20 @@ way, and a one-paragraph rationale. 30 to 80 lines is the right size. Post-exit sidecars are opt-in (`--expect-sidecar`). A leg with zero PASSes is red. A new example is not shipped until it has a catalog row. - `drift-check.yml` consumes `Developer-Tools-Directory/.github/actions/ - drift-check@v1.15` to enforce ecosystem standards-version markers. -- `release.yml` auto-bumps the version, tags, force-updates floating tags - `v0` and `v0.1`, and runs `release-doc-sync@v1` to rewrite CHANGELOG.md, - CLAUDE.md `**Version:**`, and ROADMAP.md `**Current:**`. It also rewrites - the `"version"` line in `.cursor-plugin/plugin.json` so the manifest tracks - each release. Triggered on push to `main` for content-changing paths only. -- `label-sync.yml` self-heals labels via `gh label create --force` per - label, then applies them to the PR. + drift-check`, pinned by SHA (the pin's comment names the tag), to enforce + ecosystem standards-version markers. +- `release.yml` runs on every push to `main` (no path filter). It releases + only when a commit subject in range is `feat:`/`fix:`/breaking, and only + after `.github/scripts/release-gate.sh` sees green CI for the SHA. It then + bumps the version, tags `vX.Y.Z`, force-updates the floating tags + `v` and `v.` (currently `v0` and `v0.143`), runs + `release-doc-sync` to rewrite CHANGELOG.md, CLAUDE.md `**Version:**`, and + ROADMAP.md `**Current:**`, rewrites the `"version"` in + `.cursor-plugin/plugin.json`, `.claude-plugin/plugin.json` and + `.claude-plugin/marketplace.json`, and force-pushes the slim plugin build + to the `plugin-dist` branch. +- `label-sync.yml` creates any missing label and applies path-based labels + to same-repo PRs. - `pages.yml` builds the landing page from the **locally vendored** template at `scripts/site/` (originally scaffolded from Developer-Tools-Directory's site-template, now owned by this repo — the fleet template only scaffolds diff --git a/CLAUDE.md b/CLAUDE.md index db45ad1c..eb5471ec 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -241,7 +241,7 @@ The AI consumes content via: ## Release Hygiene -The release pipeline is automated via `release.yml` on push to `main` for content-changing paths. The `release-doc-sync@v1` step rewrites CHANGELOG.md, this CLAUDE.md `**Version:**` line, and ROADMAP.md `**Current:**` line on each release. Never hand-edit those lines, the action owns them. +The release pipeline is automated via `release.yml` on every push to `main`; it releases only for `feat:`/`fix:`/breaking commit subjects and only after `release-gate.sh` sees green CI. The `release-doc-sync@v1` step rewrites CHANGELOG.md, this CLAUDE.md `**Version:**` line, and ROADMAP.md `**Current:**` line on each release. Never hand-edit those lines, the action owns them. When adding content to a future version: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 979fbe8c..6206c965 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -148,10 +148,11 @@ Default PR smoke is Blender 5.2 and 4.5 (`.github/workflows/blender-smoke.yml`). pick the branch and the `series` input. - Monday 07:00 UTC cron still runs 5.2, 5.1, and 4.5. Do not treat cron as PR evidence. -- **There is deliberately no `push` trigger on `blender-smoke.yml`.** - Squash-merging a green PR makes `main` identical to the content already - smoke-tested, so a push job would re-prove the same tree at double the - CI cost. Absence of post-merge smoke is not a coverage gap. +- **`blender-smoke.yml` also runs on `push` to `main`**, with the same + `paths-ignore` as pull requests. It exists so a direct push to `main` is + smoke-tested before `release.yml` releases it: the release gate waits for + that run. For a merged PR the gate reads the PR's own checks, so the PR-head + 5.2 and 4.5 jobs remain the merge evidence. - **`pages.yml` is path-filtered.** A workflow-or-docs-only merge does not deploy Pages. Observed on `13ea521` (`ci:` #137): Validate, drift-check, and Release ran; Pages did not. Intentional, not a failed job. diff --git a/showcase/README.md b/showcase/README.md index a9195e5f..1e1e5cf3 100644 --- a/showcase/README.md +++ b/showcase/README.md @@ -798,5 +798,6 @@ contact patch on the ground). ## Smoke `tests/smoke/catalog.json` takes opaque script paths. A showcase row is -enough; `blender-smoke.yml` has no path filter and runs the whole catalog -on every PR. Measure wall-clock before adding the next piece. +enough; `blender-smoke.yml` runs the whole catalog on every PR and every +push to `main` that touches a file outside its `paths-ignore` (`**.md`, +`docs/**`, `assets/**`). Measure wall-clock before adding the next piece.