Skip to content

ci: fix dev-publish versioning, add pre-merge semver-label check, dedupe CodeQL, cut dev-image refs#582

Merged
claude-dataviking merged 1 commit into
mainfrom
ci/release-pipeline-fixes
Jul 18, 2026
Merged

ci: fix dev-publish versioning, add pre-merge semver-label check, dedupe CodeQL, cut dev-image refs#582
claude-dataviking merged 1 commit into
mainfrom
ci/release-pipeline-fixes

Conversation

@claude-dataviking

Copy link
Copy Markdown
Contributor

Why

The release pipeline has been silently stalled since v1.5.7 (Jun 5): zero releases despite 23 merges. Two independent failures, both red on every single merge:

  1. Auto Semver Tag fails 23/23 — merged PRs stopped carrying semver:* labels, and the post-merge workflow fails loud on a missing label. By the time it goes red, the merge has already shipped; nobody circled back.
  2. Publish Dev to TestPyPI fails 23/23 — the "Generate dev version" step greps/seds version = "..." in pyproject.toml, but the project moved to dynamic = ["version"] reading src/synth_panel/__version__.py. The sed silently no-ops, every push rebuilds the identical 1.5.7 wheel, and TestPyPI rejects the re-upload (400 File already exists).

Separately, the org is retiring its dev-container images (ghcr.io/dataviking-tech/ai-dev-base), so all refs must go, and CodeQL was scanning every change twice (PR + push-to-main).

What

  • publish-test.yml: read the base version from src/synth_panel/__version__.py, assert it is non-empty, write {base}.dev{run_number} back to the version file (the source pyproject.toml actually reads). Post-build tripwire: fail loud if dist/ contains no .dev-suffixed artifact, so a future version-source move can never silently no-op again.
  • semver-label.yml (new): pre-merge Semver Label check on pull_request [opened, reopened, synchronize, labeled, unlabeled] — fails unless exactly one of semver:patch|minor|major|skip is present (labels read from the event payload via toJSON + jq). Moves the auto-tag failure from post-merge (too late) to the PR (one click to fix). Will be wired as a required check separately.
  • codeql.yml: drop the push: branches: [main] trigger; keep PR trigger + weekly cron. Every change reaches main via PR, so the push scan was a pure duplicate.
  • Dev-image refs cut: delete .devcontainer/ (image ghcr.io/dataviking-tech/ai-dev-base:edge), drop devcontainer mentions from the Dockerfile header comment, .gitignore, .dockerignore, and docs/agent-integration-landscape.md. The published runtime image already builds FROM python:3.12-slimno rebase needed. README.md contains no devcontainer/dev-image references (its ghcr.io mentions are the published synthpanel image itself). CHANGELOG history untouched.
  • auto-tag.yml deliberately untouched (separate fix landing in dataviking-infra).

Verification

  • All three workflows YAML-parse; triggers verified.
  • Version-generation logic simulated locally: BASE=1.5.7 extracted, 1.5.7.dev999 written back, resolved by the same attr path setuptools uses.
  • Semver-label logic tested against all six cases: no label / non-semver only / single valid / valid among others / multiple semver / unrecognized semver:* — correct pass/fail on each.
  • grep -ri 'devcontainer|ai-dev-base' clean outside CHANGELOG.

This PR carries semver:skip: CI/docs only, nothing in the published package changes, and the un-stall release (re-running PR #581's auto-tag with semver:minor) follows once this merges.

🤖 Generated with Claude Code

…upe CodeQL, cut dev-image refs

Four release-pipeline fixes:

- publish-test.yml: the "Generate dev version" step still grepped/sed'd
  a static `version = "..."` in pyproject.toml, but the project moved to
  `dynamic = ["version"]` reading src/synth_panel/__version__.py. The sed
  silently no-oped, every push rebuilt the identical 1.5.7 wheel, and
  TestPyPI rejected it (400 File already exists) — 23 consecutive red
  runs. Now reads/writes the version file directly, asserts the base
  version is non-empty, and adds a post-build tripwire that fails loud
  if dist/ contains no .dev-suffixed artifact.

- semver-label.yml (new): pre-merge "Semver Label" check that fails
  unless the PR carries exactly one of semver:patch|minor|major|skip.
  The post-merge Auto Semver Tag workflow fails loud on a missing label,
  but only after merge — every merge since v1.5.7 shipped unlabeled and
  no release was cut. This surfaces the requirement while it is still a
  one-click fix. (Wired as a required check separately.)

- codeql.yml: drop the push-to-main trigger; every change reaches main
  via PR so each change was scanned twice. PR trigger + weekly cron stay.

- Cut retiring dev-image refs: delete .devcontainer/ (based on
  ghcr.io/dataviking-tech/ai-dev-base, which the org is retiring), drop
  the stale devcontainer mentions from Dockerfile comments, .gitignore,
  .dockerignore, and docs/agent-integration-landscape.md. The published
  runtime image already builds FROM python:3.12-slim — no rebase needed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying synthpanel with  Cloudflare Pages  Cloudflare Pages

Latest commit: 2bd35fa
Status: ✅  Deploy successful!
Preview URL: https://bdb8295a.synthpanel.pages.dev
Branch Preview URL: https://ci-release-pipeline-fixes.synthpanel.pages.dev

View logs

@claude-dataviking claude-dataviking added the semver:skip Skip version bump on merge label Jul 18, 2026
@claude-dataviking
claude-dataviking enabled auto-merge (squash) July 18, 2026 18:02
@claude-dataviking
claude-dataviking merged commit cc7204b into main Jul 18, 2026
22 of 23 checks passed
@claude-dataviking
claude-dataviking deleted the ci/release-pipeline-fixes branch July 18, 2026 18:11
claude-dataviking added a commit that referenced this pull request Jul 18, 2026
#583)

PR #581 merged without a semver label, so its Auto Semver Tag run failed
(as designed). The recovery rerun — after labeling semver:minor — got as
far as pushing the bump commit, but the rerun replays the original event
payload: its checkout pinned main at PR #581's merge, and main has since
advanced (PR #582), so the push was rejected non-fast-forward. Reruns
always replay the same stale SHA, so that path cannot succeed anymore.

This PR takes auto-tag.yml's documented escape hatch instead: pre-bump
every version artifact to 1.6.0 in the PR itself. On merge, the
auto-tag run finds the artifacts already at the new version, skips the
release-bot push, and proceeds straight to tag + GitHub Release +
publish dispatch.

Rendered via the same scripts auto-tag runs (render_site.py,
render_site_markdown.py, render_server_card.py). Also picks up
server.json, which render_server_card.py rewrites but auto-tag's
git-add list does not stage.

Co-authored-by: njord <njord@njords-Mac-mini.localdomain>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

semver:skip Skip version bump on merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant