Skip to content

Fix #4345 (2/4): patch-bump drifted bundled extension versions and sync the catalog - #4394

Merged
mnriem merged 8 commits into
github:mainfrom
CrazyBaran:fix/4345-version-bumps-catalog-sync
Sep 22, 2026
Merged

mnriem merged 8 commits into
github:mainfrom
CrazyBaran:fix/4345-version-bumps-catalog-sync

Conversation

@CrazyBaran

@CrazyBaran CrazyBaran commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Fixes the version-drift half of #4345: the bundled agent-context, git and assess extensions have carried 1.0.0 since they were created while their content kept changing, so specify extension update compared equal semvers and reported "Up to date" forever on already-installed copies — the shipped changes were never delivered.

Scope (part 2 of the split requested in review)

Following @mnriem's request to split the original #4351 into four parts, this PR carries part 2 — version/catalog bumps and bundle-pin updates, brought up to date with current main:

  • extensions/agent-context/extension.yml, extensions/git/extension.yml, extensions/assess/extension.yml1.0.1
  • extensions/catalog.json synced to the same versions — the catalog is what extension update compares against, and its preflight rejects a manifest whose version differs from the catalog's, so the two must move together
  • bundle pins follow the extensions: the first-party bundles/assess/bundle.yml (assess pin) and the four examples/bundles/*/bundle.yml (agent-context pin) → 1.0.1. BundleExtensionPrimitive enforces exact pins, and test_firstparty_bundle_catalog_consistency.py requires them to equal the shipped version. The assess bundle's own version stays 1.0.0: bundle manifests are fetched live and bundle update always re-resolves and refreshes components, so nothing version-gates that change.
  • bundler test fixtures now read the pinned version from the bundled manifest instead of hardcoding it (tests/bundler_helpers.py), so the next legitimate bump cannot silently break them; plus the git manifest version pin in its test

Why patch bumps

Per the review on this PR: bundled extensions are versioned independently of the CLI, and this change corrects a missed bump rather than cutting a feature release, so all three move by one patch step. The step size does not change what users receive — any version above 1.0.0 delivers the full current content of the extension.

Sequencing

The ordering constraint from the review is satisfied: #4351 (local bundled-update support) merged on Sep 1 and has shipped in every release from v1.0.6 through v1.0.9, so this PR can land whenever it is approved. Upgraded CLIs install the bumped extensions from their local package; CLIs older than v1.0.6 predate #4351 and will see the offered update fail with a download error until they upgrade — the trade-off accepted in the review sequence.

The version guard from #4395 (merged) passes against this branch: check_extension_version_bump.py origin/main HEAD → "all invariants hold".

The other parts

  1. Local bundled-update supportFix #4345 (1/4): install bundled extension updates from the local package #4351 ✅ merged, shipped in v1.0.6+
  2. CI version-bump guardFix #4345 (3/4): CI guard requiring version bumps on bundled extension changes #4395 ✅ merged
  3. Content-hash staleness detectionfeat/4345-content-staleness-detection, to be rebased onto main and opened as a PR

Refs #4345.

🤖 Generated with Claude Code

Jakub Baranowski and others added 2 commits September 1, 2026 19:33
…xt, git 1.1.0; assess 1.0.1)

The bundled agent-context and git extensions have carried version 1.0.0
since they were created while their content kept changing - including
fixes for failures that made them unusable on some platforms
(agent-context: 15 commits, +1,120/-169 across 7 of its 8 files;
git: 23 commits, +2,191/-567 across all 21 files). Because
`specify extension update` compares semver only, every installed copy
is reported "Up to date (v1.0.0)" forever and never receives those
fixes (github#4345).

Bump both manifests to 1.1.0 and sync extensions/catalog.json so
existing installs finally see an available update. assess also drifted
(one docs-only change to a shipped command file since its version was
set), so it gets a patch bump to 1.0.1; bug has no drift and stays at
1.0.0.

Refs github#4345

Assisted-by: Claude Code (model: claude-fable-5, autonomous)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…em in fixtures

Copilot review round 3 on github#4351: the agent-context bump left every
checked-in bundle pinned to 1.0.0. BundleExtensionPrimitive enforces
exact pins against the bundled manifest, so the offline installs in
tests/integration/test_bundler_local_install.py and
test_bundler_init_install.py failed, and all four
examples/bundles/*/bundle.yml examples stopped being installable.

- examples/bundles/{business-analyst,developer,product-manager,
  security-researcher}/bundle.yml: agent-context pin 1.0.0 -> 1.1.0
  (exact pins are the point of the example format, so they stay
  literal).
- The two integration-test fixtures now resolve the pin through a new
  tests/bundler_helpers.bundled_extension_version() helper, which reads
  the version via the same _locate_bundled_extension lookup the
  primitive enforces against - so the fixtures test the bundler's pin
  mechanics rather than a frozen version literal, and the next
  legitimate extension bump cannot silently break them again.

The git and assess extensions are not pinned by any checked-in bundle;
tests/contract/test_bundle_cli.py's 1.0.0 pin feeds `bundle validate`,
which checks existence only, and keeps passing unchanged.

Refs github#4345

Assisted-by: Claude Code (model: claude-fable-5, autonomous)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

Catalog publication must wait until #4351 is merged and shipped, and that prerequisite remains open.

Pull request overview

Synchronizes bundled extension versions so updates can detect and deliver previously drifted content.

Changes:

  • Bumps agent-context and git to 1.1.0, and assess to 1.0.1.
  • Synchronizes the built-in catalog and example bundle pins.
  • Derives test fixture pins from bundled manifests.
File summaries
File Description
extensions/agent-context/extension.yml Bumps agent-context version.
extensions/assess/extension.yml Bumps assess version.
extensions/git/extension.yml Bumps git version.
extensions/catalog.json Synchronizes catalog versions and timestamp.
examples/bundles/business-analyst/bundle.yml Updates agent-context pin.
examples/bundles/developer/bundle.yml Updates agent-context pin.
examples/bundles/product-manager/bundle.yml Updates agent-context pin.
examples/bundles/security-researcher/bundle.yml Updates agent-context pin.
tests/bundler_helpers.py Adds bundled-version lookup helper.
tests/integration/test_bundler_init_install.py Uses the current bundled version.
tests/integration/test_bundler_local_install.py Uses the current bundled version.
tests/extensions/git/test_git_extension.py Updates the expected git version.
Review details
  • Files reviewed: 12/12 changed files
  • Comments generated: 0
  • Review effort level: Balanced

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

@mnriem mnriem added triage-must-have Verdict: high-value, important work for Spec Kit — do first triage-nice-to-have Verdict: evidence-backed fix or greenlit feature — land after review and removed triage-must-have Verdict: high-value, important work for Spec Kit — do first labels Sep 11, 2026
@CrazyBaran

Copy link
Copy Markdown
Contributor Author

@mnriem — all the other parts of the #4345 series have now landed, and this is the last piece.

Merging this is what actually triggers the update: until the catalog advertises the new versions, specify extension update keeps reporting "Up to date" to every project that installed agent-context or git before the fixes landed — users who don't know they are running stale copies. Once this lands, the next extension update picks them up automatically.

Happy to rebase if you'd like it on top of the latest main first.

🤖 Generated with Claude Code

…45-version-bumps-catalog-sync

# Conflicts:
#	tests/integration/test_bundler_local_install.py
Copilot AI review requested due to automatic review settings September 19, 2026 09:33

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Publishing the catalog before a release contains these bumped manifests leaves released clients unable to install the advertised updates.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 High severity · 2 Medium severity

Open (3)

Comment thread extensions/catalog.json Outdated
Comment thread extensions/catalog.json Outdated
Comment thread tests/specify_cli/bundles/helpers.py
Address Copilot review on github#4394.

The version bumps are only useful if a copy installed before them is
actually offered an update, and until now nothing proved that with the
real data: unit tests drive the local-package update route with synthetic
extensions, and the version contract only checks catalog/manifest
equality. Add tests/contract/test_bundled_extension_update_delivery.py,
which installs each bundled extension's real source with its manifest
rewritten to the pre-bump 1.0.0, runs `extension update` against the real
catalog entry and the real bundled copy (download must never be
attempted), and asserts the install reaches the catalog version. The
three extensions that had drifted at 1.0.0 when github#4345 was filed
(agent-context, git, assess) must stay bumped past it - reverting one is
a failure, not a skip - while an unbumped extension (bug) skips. A
companion test asserts an install already at the bundled version is
reported up to date, so fresh installs cannot loop.

Fixtures now derive their pins from the bundled manifest, so the four
changed examples/bundles/*/bundle.yml pins were no longer exercised by
any test even though BundleExtensionPrimitive enforces exact pins. Add a
contract test that parses every example bundle and checks each bundled
extension pin against its manifest version; it fails when an example is
left on a previous version.

Refs github#4345

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings September 19, 2026 09:51

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The delivery regression suite can silently omit a previously drifted extension from its parameterized coverage.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
Resolved since last review (3)

Comment thread tests/contract/test_bundled_extension_update_delivery.py Outdated
…he delivery tests

Address Copilot review round 2 on github#4394.

The update-delivery tests draw their parametrized cases from the live
catalog, so an extension that lost its `bundled` flag, its catalog entry,
or its in-repo manifest silently dropped out of both tests, and the
DRIFTED_BEFORE_BUMP guard inside them never ran for it. The previous
presence test only asserted the case list was non-empty.

Replace it with test_drifted_extensions_are_covered, which asserts every
extension in DRIFTED_BEFORE_BUMP is still a bundled, in-repo catalog
entry. De-bundling one of them is a deliberate decision that should
update that set rather than silently shrink coverage. Verified: clearing
the bundled flag on `assess` drops its cases from the parametrized tests
and this test is the only one that fails.

Refs github#4345

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings September 19, 2026 10:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

Manifests, catalog entries, bundle pins, and focused regression coverage are consistently synchronized.

Review effort: Balanced
Findings: None

Resolved since last review (1)

@mnriem mnriem left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any extension, preset, workflow or bundle that is delivered inside of the core is still versioned separately. There is no lock step here with the version of the CLI itself. So please unless the actual extension warrants a minor release it should only really rev the patch version if that was missed

@CrazyBaran
CrazyBaran requested a review from mnriem September 22, 2026 04:53
@CrazyBaran CrazyBaran changed the title Fix #4345 (2/4): bump drifted bundled extension versions and sync the catalog Fix #4345 (2/4): patch-bump drifted bundled extension versions and sync the catalog Sep 22, 2026
Jakub Baranowski and others added 2 commits September 22, 2026 07:12
…rst-party assess bundle pin

Review on github#4394: bundled extensions, presets, workflows and bundles are
versioned independently of the CLI, so correcting a missed bump should
rev the patch version unless the component itself warrants a minor
release. Move agent-context and git from the proposed 1.1.0 to 1.0.1
(assess was already 1.0.1) in the manifests, extensions/catalog.json,
the four example bundle pins and the git manifest test. Any version
above 1.0.0 delivers the full current content, so the step size does
not change what installed copies receive.

Merging current main also brings in the new first-party bundles/
directory, whose assess bundle pins the extension at an exact 1.0.0;
BundleExtensionPrimitive enforces exact pins and
test_firstparty_bundle_catalog_consistency.py requires them to match the
shipped manifest, so the pin moves to 1.0.1 with the extension. The
bundle's own version stays 1.0.0: manifests are fetched live and
`bundle update` always re-resolves and refreshes components, so nothing
version-gates that change.

Refs github#4345

Assisted-by: Claude Code (model: claude-fable-5-1)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings September 22, 2026 05:14
@CrazyBaran

Copy link
Copy Markdown
Contributor Author

Fair point, and done in 0825351 — all three extensions are now at 1.0.1.

For the record, why the original proposal was 1.1.0 for agent-context and git: the drift these two accumulated at 1.0.0 was not just fixes but new capabilities — for git, configurable Conventional Commit support (#3413), the Python port of its scripts (#3400), namespaced feature-branch templates (#3293) and SPECIFY_INIT_DIR (#2892); for agent-context, the Python port of update-agent-context (#3387) and new agent integrations (#2734, #3535). Read strictly as SemVer, features shipped since the last version are a minor bump, which is where 1.1.0 came from — it was never about tracking the CLI version. assess had only a docs-only change, hence 1.0.1 from the start.

That said, your framing is the more useful one: this PR corrects a missed bump rather than cutting a release of those features, and any version above 1.0.0 delivers the full current content to installed copies either way, so the step size changes nothing for users. Patch it is.

Two things the merge of current main pulled in, for visibility: the new first-party bundles/assess/bundle.yml pins assess at an exact 1.0.0, so that pin moves to 1.0.1 with the extension (the consistency test requires it; the bundle's own version is left at 1.0.0 since bundle update always re-resolves the manifest — happy to bump it too if you'd rather treat the pin change as bundle content). And since #4351 has shipped in v1.0.6 through v1.0.9, the sequencing constraint on this PR is satisfied — it can land whenever you're happy with it. The #4395 guard passes against the branch, and the update-delivery tests added on Sep 19 pass with the patch versions unchanged.

🤖 Generated with Claude Code

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

Versions, catalogs, bundle pins, and regression coverage are consistent with no unresolved issues found.

Review effort: Balanced
Findings: None

…45-version-bumps-catalog-sync

# Conflicts:
#	tests/integration/test_bundler_init_install.py
#	tests/specify_cli/bundles/test_command_install.py
Copilot AI review requested due to automatic review settings September 22, 2026 13:04

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

Version synchronization, bundle pins, and regression coverage are complete and consistent.

Review effort: Balanced
Findings: None

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The manifests, catalog, bundle pins, and regression contracts are consistent, with no unresolved defects found.

Review effort: Balanced
Findings: None

@mnriem
mnriem merged commit 3789423 into github:main Sep 22, 2026
15 checks passed
@mnriem

mnriem commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator

Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

triage-nice-to-have Verdict: evidence-backed fix or greenlit feature — land after review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants