Skip to content

release: @workspacejson/spec + @workspacejson/rules 0.5.0 - #44

Merged
qmarcelle merged 1 commit into
mainfrom
release/standard-v0.5.0
Aug 18, 2026
Merged

release: @workspacejson/spec + @workspacejson/rules 0.5.0#44
qmarcelle merged 1 commit into
mainfrom
release/standard-v0.5.0

Conversation

@qmarcelle

@qmarcelle qmarcelle commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

The release commit for the fixed group. Output of pnpm changeset version over the eight accumulated changesets, plus one gate fix this release was the first to actually hit.

The version

0.4.4 → 0.5.0, both packages, derived by Changesets — not typed anywhere. The document profile does not move and stays at generated.specVersion: "0.4". Package number and profile number are independent by policy; see docs/versioning.md.

Three of the eight changesets declare minor on their own terms (ADR-003 A-009, ADR-003 A-010, ADR-006), so a patch bump was never available.

META-332 is real, and I had it backwards

Two gates in this repository disagreed about the changelog heading format:

Gate Required
packages/spec/src/index.test.ts:290 ## [0.5.0] — Keep a Changelog
scripts/verify-release-identity.mjs:187 ## 0.5.0 — Changesets

Changesets writes the bare form. So the test's regex skipped it, matched the first bracketed heading it could find — the historical ## [0.4.4] — and compared 0.4.4 against a manifest reading 0.5.0.

No Changesets-generated release could ever have passed both. META-332's original title — "Changesets-generated changelog headings break the release-commit parity test" — was exactly right. An earlier analysis on that issue called it inverted and self-resolving; that was wrong, and this PR is where it would have bitten.

The test now matches the release gate's form. Only the top heading is inspected; the bracketed entries below are pre-Changesets history and are deliberately not matched, so a bracketed heading at the top yields no match at all — the correct failure, since it would mean the version was not produced by Changesets.

Test-only change. Tests are not in files and do not ship, so it carries no changeset and does not move the version.

Verification on this commit

Gate
check:release-identity --tag standard-v0.5.0 OK — names 0.5.0, matches the fixed group, 0 pending changesets
check:architecture + red tests pass
check:docs pass
check:adr + red tests pass
build · typecheck · test pass (264 spec tests)
check:schema · check:examples · check:corpus pass
release:verify-packs + red tests pass
release:verify-consumer pass

After merge

Tag standard-v0.5.0 on the merged commit. release.yml then runs verify → boundary → environment approval, which waits on the steward → publish with provenance → release:verify-published against the real registry.

NPM_TOKEN is now scoped to the npm-publish environment in both repositories with the repository-level copy deleted, so release.yml's comment about credential scoping is true for the first time. The environment requires a reviewer and is restricted to the standard-v* tag namespace.

No Linear release wiring is present. Live release mutations are disabled for this cut per the META-354 pilot verdict; the release is backfilled after registry verification from the verified version, commit and receipt.

Summary by Sourcery

Release both workspacejson packages as version 0.5.0 with widened compatibility, new analysis and path-identity APIs, clarified deprecated scoring behavior, and aligned package and schema metadata while keeping the document profile at 0.4.

New Features:

  • Add observation-based co-change data support alongside legacy rate-based entries, including basis revisions and validation rules.
  • Add canonical stored-key validation and document-wide inspection APIs for path-bearing fields.
  • Add optional root version compatibility and define the optional tooling-coupling classification state.

Bug Fixes:

  • Align changelog version-header validation with Changesets-generated headings so release identity checks can pass consistently.
  • Correct legacy document detection when root and generated version declarations disagree.

Enhancements:

  • Deprecate hygiene scoring for scans without evidence and represent unavailable scores and coverage explicitly.
  • Canonicalize the schema identity URL and update published package metadata, repository links, descriptions, and user-facing release content.

Build:

  • Remove unused runtime and development dependencies and the obsolete type-generation script; enforce unused runtime dependency checks.

Documentation:

  • Document the co-change observation contract, stored-key requirements, versioning boundaries, and migration guidance for deprecated hygiene scoring.

Tests:

  • Add executable positive and negative fixtures covering co-change validation and stored-key behavior, including preservation of the v0.4 acceptance boundary.

Chores:

  • Release @workspacejson/spec and @workspacejson/rules from 0.4.4 to 0.5.0 as a fixed group and consume the accumulated changesets.

Output of `pnpm changeset version` over the eight accumulated changesets. The
fixed group moves 0.4.4 -> 0.5.0; the document profile does not move and stays
at generated.specVersion 0.4.

Also fixes the changelog parity assertion, which is META-332 and which this
release is the first to actually hit. Two gates in this repository disagreed
about the changelog heading format:

  packages/spec/src/index.test.ts   required  ## [0.5.0]   (Keep a Changelog)
  scripts/verify-release-identity   required  ## 0.5.0     (Changesets)

Changesets writes the bare form, so the test matched the first BRACKETED
heading it could find — the historical ## [0.4.4] — and compared 0.4.4 against
a manifest reading 0.5.0. The two assertions could not both be satisfied by any
one file, so no changesets-generated release could ever have passed.

The test now matches the release gate's form. Only the top heading is
inspected; the bracketed entries below it are pre-Changesets history and are
deliberately not matched, so a bracketed heading at the top would yield no
match at all — the correct failure, since it would mean the released version
was not versioned by Changesets.

Test-only change: tests are not in `files` and do not ship, so it carries no
changeset and does not move the version.
Copilot AI lite review requested due to automatic review settings August 17, 2026 23:36

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

qmarcelle has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@sourcery-ai

sourcery-ai Bot commented Aug 17, 2026

Copy link
Copy Markdown

Reviewer's Guide

Release commit for @workspacejson/spec and @workspacejson/rules 0.5.0: versions are bumped, changelogs are updated to reflect eight prior changesets, and the release-parity test is fixed to match Changesets’ heading format so the release gates agree; no new runtime or schema behavior beyond what the accumulated changesets already introduced.

Flow diagram for changelog heading parity test

flowchart TD
  start([Start release gate])
  read["Read top heading from CHANGELOG.md"]
  format["Expect heading in Changesets form: ## 0.5.0"]
  check{"Does top heading match /^## 0\.5\.0$/?"}
  ok["Use 0.5.0 from heading and compare to manifest versions"]
  mismatch["Fail: changelog heading does not match manifest (not a Changesets release)"]

  start --> read --> format --> check
  check -->|yes| ok
  check -->|no| mismatch
Loading

File-Level Changes

Change Details Files
Record the 0.5.0 release details in both package changelogs based on the accumulated changesets.
  • Add a 0.5.0 section to @workspacejson/spec CHANGELOG with detailed notes for the prior minor and patch changesets.
  • Add a 0.5.0 section to @workspacejson/rules CHANGELOG with detailed notes for its prior minor and patch changesets.
  • Ensure changelog entries clearly state that the package version moved to 0.5.0 while the document profile remains at generated.specVersion "0.4".
packages/spec/CHANGELOG.md
packages/rules/CHANGELOG.md
Bump package versions from 0.4.4 to 0.5.0 in the manifests for the fixed release group.
  • Update @workspacejson/spec package version to 0.5.0.
  • Update @workspacejson/rules package version to 0.5.0.
packages/spec/package.json
packages/rules/package.json
Align the schema identity test’s changelog-heading regex with the release gate so Changesets-generated releases can pass both gates.
  • Change the regex in the schema identity invariant test to match a bare "## " heading instead of Keep a Changelog-style "## []".
  • Restrict the match to the top-level heading so historical bracketed headings below do not interfere with the version parity check between changelog and package.json.
packages/spec/src/index.test.ts
Remove the changeset definition files that have now been consumed into the 0.5.0 release.
  • Delete the eight .changeset markdown files corresponding to the accumulated changesets that produced this release.
.changeset/lucky-pugs-invent.md
.changeset/olive-crabs-observe.md
.changeset/olive-hosts-settle.md
.changeset/olive-keys-report.md
.changeset/olive-moons-listen.md
.changeset/plenty-cooks-repair.md
.changeset/quiet-moons-admit.md
.changeset/tall-otters-classify.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sonarqubecloud

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Hey - I've left some high level feedback:

  • The CHANGELOG heading format is now encoded in both index.test.ts and scripts/verify-release-identity.mjs; consider centralizing the regex or deriving it from a shared helper to avoid the two gates drifting again on future format changes.
  • The changelog version regex ^## (\d+\.\d+\.\d+)\s*$ with m will match the first bare ## line anywhere; if a non-release section (e.g. ## Unreleased) is ever introduced above the latest version, this test will give a false positive—consider restricting the match to the first heading or asserting it appears immediately after the top-level title.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The CHANGELOG heading format is now encoded in both `index.test.ts` and `scripts/verify-release-identity.mjs`; consider centralizing the regex or deriving it from a shared helper to avoid the two gates drifting again on future format changes.
- The changelog version regex `^## (\d+\.\d+\.\d+)\s*$` with `m` will match the first bare `##` line anywhere; if a non-release section (e.g. `## Unreleased`) is ever introduced above the latest version, this test will give a false positive—consider restricting the match to the first heading or asserting it appears immediately after the top-level title.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@qmarcelle
qmarcelle merged commit f1f7825 into main Aug 18, 2026
7 checks passed
@qmarcelle
qmarcelle deleted the release/standard-v0.5.0 branch August 18, 2026 00:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants