From 61cac91f9a74b21a61f07f85829157e0790042a9 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 12 Aug 2026 20:08:26 +0000 Subject: [PATCH 1/3] ci: real paths for release-ci, putitoutthere-config-check and changelog-check The last three placeholders, restored with real globs. Placeholder count is now zero: every PR trigger disabled by the baseline layer is re-enabled. release-precheck.yml becomes release-ci.yml. Its paths are the union of every [[package]] globs entry in putitoutthere.toml plus the config itself; the plan job change-detects against those same globs, so per-package subdivision happens inside the run (a python-only PR plans only dirsql-py). putitoutthere build.yml exposes no package filter and the release cascade is cross-package by design, so this stays one workflow rather than splitting per package. Fragment and attestation dirs are excluded: they ship in no artifact. The plugin's README stays in scope -- hatchling embeds it as the PyPI long-description, so it is a build input -- and the plugin is named explicitly rather than plugins/*. release-config-check.yml becomes putitoutthere-config-check.yml, named for the tool whose config it validates, triggering only on putitoutthere.toml. changelog-check.yml keeps its name and gains packages/** paths. Not decomposed per package: the gate already reasons per package internally (changed_packages / code_touched), runs once, and reports one check. plugins/ is deliberately absent -- the gate's matchers are hardcoded to packages//, so it cannot see plugin fragments and running it on a plugin change is a vacuous pass; plugin changelog enforcement is a gate gap tracked in its own issue. skip-changelog: CI configuration only, no packages/** change Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01GECJQGPKgycnh4hrhzrDYP --- .github/workflows/changelog-check.yml | 16 +++++++++- ...eck.yml => putitoutthere-config-check.yml} | 4 +-- .../{release-precheck.yml => release-ci.yml} | 30 +++++++++++++++++-- 3 files changed, 45 insertions(+), 5 deletions(-) rename .github/workflows/{release-config-check.yml => putitoutthere-config-check.yml} (93%) rename .github/workflows/{release-precheck.yml => release-ci.yml} (76%) diff --git a/.github/workflows/changelog-check.yml b/.github/workflows/changelog-check.yml index 9e91dc5ff..27114c598 100644 --- a/.github/workflows/changelog-check.yml +++ b/.github/workflows/changelog-check.yml @@ -3,11 +3,25 @@ name: Changelog Check env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true +# The gate itself decides per package whether a fragment is required +# (changed_packages / code_touched in internals/checks); these paths only +# decide whether the decision is worth a runner. packages/** covers both the +# code that demands a fragment and the fragment dirs that satisfy it, so the +# near-miss diagnostics (malformed fragment names) still run on +# fragment-only PRs. +# +# plugins/ is deliberately absent: the gate's matchers are hardcoded to +# packages//, so it cannot see plugin fragments -- running it on a +# plugin change is a vacuous pass. Plugin changelog enforcement is a gate +# gap, tracked in its own issue. on: pull_request: branches: [main] paths: - - '.github/CI-DISABLED-PLACEHOLDER' + - 'packages/**' + # Attestations are filtered out of the gate's code_touched, so they + # cannot alter its verdict. + - '!packages/*/e2e-attestations/**' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/release-config-check.yml b/.github/workflows/putitoutthere-config-check.yml similarity index 93% rename from .github/workflows/release-config-check.yml rename to .github/workflows/putitoutthere-config-check.yml index 4a7569162..18e607a81 100644 --- a/.github/workflows/release-config-check.yml +++ b/.github/workflows/putitoutthere-config-check.yml @@ -1,4 +1,4 @@ -name: Release Config Check +name: putitoutthere Config Check # Fast PR-time config sanity gate. Runs putitoutthere's `check` reusable # workflow, which parses `putitoutthere.toml`, validates the schema, checks @@ -16,7 +16,7 @@ on: pull_request: branches: [main] paths: - - '.github/CI-DISABLED-PLACEHOLDER' + - 'putitoutthere.toml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/release-precheck.yml b/.github/workflows/release-ci.yml similarity index 76% rename from .github/workflows/release-precheck.yml rename to .github/workflows/release-ci.yml index 8c51422d0..d6a195a9b 100644 --- a/.github/workflows/release-precheck.yml +++ b/.github/workflows/release-ci.yml @@ -1,4 +1,4 @@ -name: Release Precheck +name: Release CI # PR-time gate that runs putitoutthere's plan + build matrix using the # same `_matrix.yml` reusable workflow that drives the release path. @@ -14,11 +14,37 @@ name: Release Precheck # Pin to `@v0` deliberately: matches what `release.yml` calls so the # precheck stays in lockstep with the real release matrix. +# Paths are the union of every [[package]] globs entry in putitoutthere.toml +# plus the config itself: the plan job change-detects against those same +# globs, so per-package subdivision happens inside the run (a python-only PR +# plans only dirsql-py). putitoutthere's build.yml exposes no package filter, +# and the release cascade (rust -> py -> npm) is cross-package by design, so +# this stays one workflow rather than splitting per package. on: pull_request: branches: [main] paths: - - '.github/CI-DISABLED-PLACEHOLDER' + - 'packages/rust/**' + - 'packages/python/**' + - '!packages/python/changelog.d/**' + - '!packages/python/migrations.d/**' + - '!packages/python/e2e-attestations/**' + - 'packages/ts/**' + - '!packages/ts/changelog.d/**' + - '!packages/ts/migrations.d/**' + - '!packages/ts/e2e-attestations/**' + # putitoutthere's plugin globs are plugins/dirsql-plugin-embeddings/**; + # README stays in scope here (hatchling embeds it as the PyPI + # long-description, so it is a build input), fragments and receipts + # do not ship. + - 'plugins/dirsql-plugin-embeddings/**' + - '!plugins/dirsql-plugin-embeddings/changelog.d/**' + - '!plugins/dirsql-plugin-embeddings/migrations.d/**' + - '!plugins/dirsql-plugin-embeddings/e2e-attestations/**' + - '!plugins/dirsql-plugin-embeddings/tests/**' + - 'Cargo.toml' + - 'Cargo.lock' + - 'putitoutthere.toml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} From c5453378730b7095bea5b0821f872ebbe89d9739 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Aug 2026 13:44:54 +0000 Subject: [PATCH 2/3] ci: rust fragment excludes for release-ci; run changelog-check on any base Rust fragments stop shipping in the crate (Cargo.toml exclude, landing separately), so they cannot alter release-ci's verdict. changelog-check's gate is diff-scoped via base.sha, so the branches filter only hid it from stacked PRs. skip-changelog: CI configuration only --- .github/workflows/changelog-check.yml | 1 - .github/workflows/release-ci.yml | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/changelog-check.yml b/.github/workflows/changelog-check.yml index 27114c598..33e18b300 100644 --- a/.github/workflows/changelog-check.yml +++ b/.github/workflows/changelog-check.yml @@ -16,7 +16,6 @@ env: # gap, tracked in its own issue. on: pull_request: - branches: [main] paths: - 'packages/**' # Attestations are filtered out of the gate's code_touched, so they diff --git a/.github/workflows/release-ci.yml b/.github/workflows/release-ci.yml index d6a195a9b..3b1fefd10 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/release-ci.yml @@ -25,6 +25,8 @@ on: branches: [main] paths: - 'packages/rust/**' + - '!packages/rust/changelog.d/**' + - '!packages/rust/migrations.d/**' - 'packages/python/**' - '!packages/python/changelog.d/**' - '!packages/python/migrations.d/**' From bfc6132f27d480ab93d9a5a76fb922ef594cc010 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 14 Aug 2026 15:29:34 +0000 Subject: [PATCH 3/3] ci: trigger release-ci.yml,putitoutthere-config-check.yml,changelog-check.yml on edits to their own files The pull_request self-path was omitted while this stack was being probed, so definition layers reported zero checks and the probe PRs measured cleanly. The probes are read and closed, and the YAML layers were always separate PRs from them, so the suppression has no remaining purpose -- it only leaves CI-config-only PRs with no checks at all, which merge vacuously green under the post-#881 Mergify gate. skip-changelog: CI configuration only --- .github/workflows/changelog-check.yml | 1 + .github/workflows/putitoutthere-config-check.yml | 1 + .github/workflows/release-ci.yml | 1 + 3 files changed, 3 insertions(+) diff --git a/.github/workflows/changelog-check.yml b/.github/workflows/changelog-check.yml index 33e18b300..d0aea6da5 100644 --- a/.github/workflows/changelog-check.yml +++ b/.github/workflows/changelog-check.yml @@ -21,6 +21,7 @@ on: # Attestations are filtered out of the gate's code_touched, so they # cannot alter its verdict. - '!packages/*/e2e-attestations/**' + - '.github/workflows/changelog-check.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/putitoutthere-config-check.yml b/.github/workflows/putitoutthere-config-check.yml index 18e607a81..263d77906 100644 --- a/.github/workflows/putitoutthere-config-check.yml +++ b/.github/workflows/putitoutthere-config-check.yml @@ -17,6 +17,7 @@ on: branches: [main] paths: - 'putitoutthere.toml' + - '.github/workflows/putitoutthere-config-check.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/release-ci.yml b/.github/workflows/release-ci.yml index 3b1fefd10..e59416e73 100644 --- a/.github/workflows/release-ci.yml +++ b/.github/workflows/release-ci.yml @@ -47,6 +47,7 @@ on: - 'Cargo.toml' - 'Cargo.lock' - 'putitoutthere.toml' + - '.github/workflows/release-ci.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }}