Skip to content

Commit 7ce9501

Browse files
committed
Merge release/2 for the 2.0.0 release
833 commits of 2.0 work: the unified processor model, entity/context/connector intentions as grammar, instance identity (Id/self/initiate/terminate), typed holes, correlations, numeric literals, `empty`, `forward`, multi-line `do`, 303+ named diagnostic rule ids, the `find` command, JSON as a fourth fully reflective surface, and Scala 3.9.0. Tagged from main per policy: a FINAL release ships from main, never from the release branch.
2 parents f904af2 + 6a70cf0 commit 7ce9501

853 files changed

Lines changed: 110773 additions & 24486 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/skills/rc/SKILL.md

Lines changed: 808 additions & 0 deletions
Large diffs are not rendered by default.

.claude/skills/ship/SKILL.md

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,32 @@ not provided:
1717

1818
## Pre-Flight Checks
1919

20-
1. **Always ship from `main`; bring it up to date with
21-
`development` first.** **We NEVER publish from
22-
`development` or feature branches.** The release commits
23-
normally live on `development`, so the standard process is
24-
to fast-forward `main` up to `development` before tagging.
25-
This is part of every release — do NOT ask the user whether
26-
to do it:
20+
1. **Always ship a FINAL release from `main`.** Ordinary work commits
21+
directly to `main`, so in the usual case there is nothing to bring
22+
forward and you are already where you need to be:
2723
```
2824
git checkout main
2925
git pull origin main
30-
git merge --ff-only development
26+
git branch --show-current
3127
```
32-
- If `--ff-only` fails because `main` has commits not on
33-
`development` (genuine divergence), STOP and ask the user
34-
how to reconcile before proceeding. A clean fast-forward
35-
is the expected case.
36-
- Confirm you ended up on `main`:
37-
```
38-
git branch --show-current
39-
```
28+
**There is no `development` branch.** It was deleted (local and
29+
remote) on 2026-08-27, having been 0 commits ahead of `main`; the
30+
GitFlow pre-flight this step used to prescribe — fast-forwarding
31+
`main` up to `development` — was a no-op or contrary to policy for
32+
every release from 1.30.0 onward, and was skipped by hand each time.
33+
See `CLAUDE.md` § Branch Strategy.
34+
35+
**When the release IS on a branch**, which is the case for a large
36+
change such as `release/2`, merge that branch into `main` and tag
37+
`main`. Do not tag the branch:
38+
```
39+
git checkout main && git pull origin main
40+
git merge --no-ff release/2
41+
```
42+
Release CANDIDATES are the documented exception and may be tagged on
43+
the release branch — an RC is a prerelease on GitHub, an `@rc` formula
44+
in the tap and an `rc` dist-tag on npm, so nothing resolves to it
45+
unless asked for by name. See the `/rc` skill.
4046

4147
2. Assert working tree is clean:
4248
```
@@ -88,8 +94,35 @@ not provided:
8894

8995
9. Run the full test suite and publish all modules:
9096
```
91-
sbt clean test publish
97+
sbt "; clean; tJVM; tJS; tNative; publish"
9298
```
99+
**NEVER `sbt clean test publish`.** That was prescribed here until
100+
2026-08-27 and it is a gate that can skip most of the suite while
101+
reporting success. In sbt 2 bare `test` resolves to **`testQuick`**,
102+
which skips suites it judges unaffected — and **that judgement
103+
survives `clean`, because the action cache does**. It once left the
104+
JS row of a GREEN run executing 109 of 567 tests, with `languageJS`,
105+
`passesJS` and `testkitJS` never running at all. `tJVM`/`tJS`/`tNative`
106+
exist precisely to defeat this: they are `testOnly *`, which ignores
107+
incremental state. See the alias comments in `build.sbt`.
108+
109+
**Count what ran.** One `Suites: completed N` line per module in each
110+
alias, and zero `No tests to run`. A short count means a module was
111+
skipped or the `;` chain aborted at a failure — either way, look.
112+
113+
**For a MAJOR release, certify from a genuinely cold cache first**
114+
(Reid, 2026-08-27, shipping 2.0.0). `clean` removes `target/` but NOT
115+
the shared store at `~/.cache/sbt/v2` (or `~/Library/Caches/sbt/v2`),
116+
so results can still be replayed:
117+
```
118+
sbt -batch shutdown # a warm server IGNORES the -D
119+
sbt --server -Dsbt.global.localcache=/tmp/sbt-verify-<ver> -batch "; clean; tJVM; tJS; tNative"
120+
```
121+
The property applies only at **server boot**, so the shutdown is not
122+
optional. Afterwards the throwaway directory must EXIST and have GROWN
123+
(`du -sh`) — an empty one means the run was served from the shared cache
124+
and certified nothing.
125+
93126
Because the tag is on HEAD and the tree is clean,
94127
BuildInfo and all published artifacts will carry the
95128
clean `<VERSION>`. Verify in the sbt output.
@@ -164,18 +197,33 @@ not provided:
164197
- Commit them: `git add -u && git commit -m "Fix copyright headers"`
165198
- Push: `git push origin main`
166199
These changes are harmless formatting fixes and should be
167-
committed before merging back to `development`.
200+
committed straight to `main`.
168201
169-
14. Switch back to `development` and merge the tag forward:
202+
14. **Delete the release branch, if the release came from one.**
203+
There is no merge-back step: `main` IS the working branch, so
204+
there is nowhere to merge the tag forward TO. This step used to
205+
say `git checkout development && git merge main`, which since
206+
1.30.0 has been either a no-op or contrary to policy.
170207
```
171-
git checkout development
172-
git merge main
173-
git push
208+
git branch -d <release-branch>
209+
git push origin --delete <release-branch>
174210
```
175211
176212
15. Report a summary: tag, commit SHA, release URL, and any
177213
CI workflows triggered.
178214
215+
16. **Drop upgrade tasks in dependent projects.** Invoke
216+
`/ossuminc-skills:bump-consumers` with library `riddl` and the
217+
version just released. That skill owns the consumer list
218+
(`skills/bump-consumers/consumers.md`) and the task-file format —
219+
do **not** maintain a repo list here. riddl has more consumers
220+
than any other library (Scala via `project/Dependencies.scala`;
221+
npm via `@ossuminc/riddl-lib` in `package.json`), so let the skill
222+
apply its usual restraint: it asks before writing and proposes
223+
skipping patch releases rather than filing a task in every
224+
consumer for a bugfix. Requires the `ossuminc-skills` plugin
225+
installed (`claude plugin list | grep ossuminc-skills`).
226+
179227
## If Something Fails
180228
181229
- If tests fail in step 9: delete the local tag

.github/workflows/coverage.yml

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ jobs:
1818
runs-on: ubuntu-latest
1919
steps:
2020
- name: Checkout Code
21-
uses: actions/checkout@v4
21+
uses: actions/checkout@v6
2222

2323
- name: Set Up JDK 25
24-
uses: actions/setup-java@v4
24+
uses: actions/setup-java@v5
2525
with:
2626
java-version: '25'
2727
distribution: temurin
@@ -31,12 +31,12 @@ jobs:
3131
uses: sbt/setup-sbt@7e33f738678e47369c83dcb4b1d9c65d66eb3cdd # v1
3232

3333
- name: Coursier Caching
34-
uses: coursier/cache-action@2addd381bd2c931f42d4b734b9d0c9b73aac16fb # v6
34+
uses: coursier/cache-action@v7
3535

3636
- name: Configure sbt GitHub Packages credentials
3737
run: |
38-
mkdir -p ~/.sbt/1.0
39-
cat > ~/.sbt/1.0/github.sbt << 'EOF'
38+
mkdir -p ~/.sbt/2
39+
cat > ~/.sbt/2/github.sbt << 'EOF'
4040
credentials += Credentials(
4141
"GitHub Package Registry",
4242
"maven.pkg.github.com",
@@ -47,18 +47,12 @@ jobs:
4747
4848
- name: Coverage For JVM projects only
4949
run: |
50-
sbt clean coverage \
51-
utils/Test/compile language/Test/compile passes/Test/compile \
52-
commands/Test/compile riddlc/Test/compile \
53-
utils/test language/test passes/test commands/test riddlc/test \
54-
coverageAggregate coveralls
50+
sbt "; clean; coverage; utils/Test/compile; language/Test/compile; passes/Test/compile; commands/Test/compile; riddlc/Test/compile; utils/test; language/test; passes/test; commands/test; riddlc/test; coverageAggregate"
5551
5652
- name: Coverage Results Collection
57-
uses: actions/upload-artifact@v4
53+
uses: actions/upload-artifact@v6
5854
with:
5955
name: code-coverage-report
6056
retention-days: 30
6157
path: |
62-
**/jvm/target/scala-3.8.3/scoverage-report/scoverage.xml
63-
**/target/scala-3.8.3/scoverage-report/scoverage.xml
64-
target/scala-3.8.3/scoverage-report/scoverage.xml
58+
target/out/jvm/scala-3.9.0/**/scoverage-report/scoverage.xml

.github/workflows/hugo.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,16 @@ jobs:
3737
url: ${{ steps.deployment.outputs.page_url }}
3838
steps:
3939
- name: Checkout
40-
uses: actions/checkout@v4
40+
uses: actions/checkout@v6
4141

4242
- name: Setup Pages
43-
uses: actions/configure-pages@v4
43+
uses: actions/configure-pages@v6
4444

4545
- name: Upload artifact
46-
uses: actions/upload-pages-artifact@v3
46+
uses: actions/upload-pages-artifact@v5
4747
with:
4848
path: ./doc/redirect-site
4949

5050
- name: Deploy to GitHub Pages
5151
id: deployment
52-
uses: actions/deploy-pages@v4
52+
uses: actions/deploy-pages@v5

.github/workflows/npm-publish.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ jobs:
2626

2727
steps:
2828
- name: Checkout repository
29-
uses: actions/checkout@v4
29+
uses: actions/checkout@v6
3030

3131
- name: Set up JDK 25
32-
uses: actions/setup-java@v4
32+
uses: actions/setup-java@v5
3333
with:
3434
java-version: '25'
3535
distribution: temurin
@@ -39,12 +39,12 @@ jobs:
3939
uses: sbt/setup-sbt@v1
4040

4141
- name: Coursier Caching
42-
uses: coursier/cache-action@v6
42+
uses: coursier/cache-action@v7
4343

4444
- name: Configure sbt GitHub Packages credentials
4545
run: |
46-
mkdir -p ~/.sbt/1.0
47-
cat > ~/.sbt/1.0/github.sbt << 'EOF'
46+
mkdir -p ~/.sbt/2
47+
cat > ~/.sbt/2/github.sbt << 'EOF'
4848
credentials += Credentials(
4949
"GitHub Package Registry",
5050
"maven.pkg.github.com",
@@ -54,7 +54,7 @@ jobs:
5454
EOF
5555
5656
- name: Set up Node.js
57-
uses: actions/setup-node@v4
57+
uses: actions/setup-node@v6
5858
with:
5959
node-version: '22'
6060

.github/workflows/release.yml

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ jobs:
3131
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3232
steps:
3333
- name: Checkout Code
34-
uses: actions/checkout@v4
34+
uses: actions/checkout@v6
3535
with:
3636
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}
37+
fetch-depth: 0
38+
fetch-tags: true
3739

3840
- name: Set Up JDK 25
39-
uses: actions/setup-java@v4
41+
uses: actions/setup-java@v5
4042
with:
4143
java-version: '25'
4244
distribution: temurin
@@ -46,12 +48,12 @@ jobs:
4648
uses: sbt/setup-sbt@7e33f738678e47369c83dcb4b1d9c65d66eb3cdd # v1
4749

4850
- name: Coursier Caching
49-
uses: coursier/cache-action@2addd381bd2c931f42d4b734b9d0c9b73aac16fb # v6
51+
uses: coursier/cache-action@v7
5052

5153
- name: Configure sbt GitHub Packages credentials
5254
run: |
53-
mkdir -p ~/.sbt/1.0
54-
cat > ~/.sbt/1.0/github.sbt << 'CREDSEOF'
55+
mkdir -p ~/.sbt/2
56+
cat > ~/.sbt/2/github.sbt << 'CREDSEOF'
5557
credentials += Credentials(
5658
"GitHub Package Registry",
5759
"maven.pkg.github.com",
@@ -77,7 +79,7 @@ jobs:
7779
- name: Package Native Binary
7880
run: |
7981
mkdir -p staging/bin
80-
cp riddlc/native/target/scala-3.8.3/riddlc staging/bin/riddlc
82+
cp target/out/native0.5/scala-3.9.0/riddlc/riddlc staging/bin/riddlc
8183
cd staging && zip -r ../${{ matrix.artifact }}.zip bin/
8284
8385
- name: Upload to Release
@@ -88,7 +90,7 @@ jobs:
8890
gh release upload "$TAG" "${{ matrix.artifact }}.zip" --clobber
8991
9092
- name: Upload Build Artifact
91-
uses: actions/upload-artifact@v4
93+
uses: actions/upload-artifact@v6
9294
with:
9395
name: ${{ matrix.artifact }}
9496
retention-days: 30
@@ -105,12 +107,14 @@ jobs:
105107
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
106108
steps:
107109
- name: Checkout Code
108-
uses: actions/checkout@v4
110+
uses: actions/checkout@v6
109111
with:
110112
ref: ${{ github.event.release.tag_name || github.event.inputs.tag }}
113+
fetch-depth: 0
114+
fetch-tags: true
111115

112116
- name: Set Up JDK 25
113-
uses: actions/setup-java@v4
117+
uses: actions/setup-java@v5
114118
with:
115119
java-version: '25'
116120
distribution: temurin
@@ -120,12 +124,12 @@ jobs:
120124
uses: sbt/setup-sbt@7e33f738678e47369c83dcb4b1d9c65d66eb3cdd # v1
121125

122126
- name: Coursier Caching
123-
uses: coursier/cache-action@2addd381bd2c931f42d4b734b9d0c9b73aac16fb # v6
127+
uses: coursier/cache-action@v7
124128

125129
- name: Configure sbt GitHub Packages credentials
126130
run: |
127-
mkdir -p ~/.sbt/1.0
128-
cat > ~/.sbt/1.0/github.sbt << 'CREDSEOF'
131+
mkdir -p ~/.sbt/2
132+
cat > ~/.sbt/2/github.sbt << 'CREDSEOF'
129133
credentials += Credentials(
130134
"GitHub Package Registry",
131135
"maven.pkg.github.com",
@@ -137,7 +141,7 @@ jobs:
137141
- name: Build and Stage JVM Version
138142
run: |
139143
sbt riddlc/stage
140-
cd riddlc/jvm/target/universal/stage && zip -r ../../../../../riddlc.zip bin/ lib/
144+
cd target/out/jvm/scala-3.9.0/riddlc/universal/stage && zip -r "$GITHUB_WORKSPACE/riddlc.zip" bin/ lib/
141145
142146
- name: Upload to Release
143147
env:
@@ -147,7 +151,7 @@ jobs:
147151
gh release upload "$TAG" riddlc.zip --clobber
148152
149153
- name: Upload Build Artifact
150-
uses: actions/upload-artifact@v4
154+
uses: actions/upload-artifact@v6
151155
with:
152156
name: riddlc-jvm
153157
retention-days: 30
@@ -160,7 +164,7 @@ jobs:
160164
runs-on: ubuntu-latest
161165
steps:
162166
- name: Download all artifacts
163-
uses: actions/download-artifact@v4
167+
uses: actions/download-artifact@v6
164168
with:
165169
path: artifacts
166170

@@ -171,21 +175,44 @@ jobs:
171175
echo "linux_x86=$(shasum -a 256 artifacts/riddlc-linux-x86_64/riddlc-linux-x86_64.zip | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
172176
echo "jvm=$(shasum -a 256 artifacts/riddlc-jvm/riddlc.zip | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
173177
178+
# A release candidate updates a SEPARATE formula. `gh release create --prerelease`
179+
# still fires this same `release: [created]` workflow, so without routing on
180+
# `prerelease` an RC would overwrite the stable formula and `brew install riddlc`
181+
# would serve a release candidate. Homebrew has no prerelease flag and its `devel`
182+
# block is deprecated; a versioned formula the user opts into by NAME is the
183+
# supported pattern, and the name is the "experimental" marking.
174184
- name: Dispatch formula update to homebrew-tap
175185
env:
176186
GH_TOKEN: ${{ secrets.HOMEBREW_TAP_SECRET }}
177187
run: |
178188
TAG="${{ github.event.release.tag_name || github.event.inputs.tag }}"
189+
if [ "${{ github.event.release.prerelease }}" = "true" ]; then
190+
FORMULA="riddlc-rc"
191+
else
192+
FORMULA="riddlc"
193+
fi
194+
echo "Dispatching formula update for ${FORMULA} at ${TAG}"
179195
gh api repos/ossuminc/homebrew-tap/dispatches \
180196
--method POST \
181197
-f event_type=update-formula \
198+
-f "client_payload[formula]=${FORMULA}" \
182199
-f "client_payload[version]=${TAG}" \
183200
-f "client_payload[sha_macos_arm64]=${{ steps.hashes.outputs.macos_arm64 }}" \
184201
-f "client_payload[sha_linux_x86]=${{ steps.hashes.outputs.linux_x86 }}" \
185202
-f "client_payload[sha_jvm]=${{ steps.hashes.outputs.jvm }}"
186203
187-
# Notify ossum.ai to create a blog post from release notes
204+
# Notify ossum.ai to create a blog post from release notes.
205+
#
206+
# FULL RELEASES ONLY. Every other channel makes a release candidate opt-in by
207+
# name -- a prerelease on GitHub, an `rc` npm dist-tag, a separate `riddlc-rc`
208+
# formula -- but a blog post announces itself to everyone. 2.0.0-rc.1 shipped a
209+
# live post on ossum.ai because this job, unlike `update-homebrew` below, had no
210+
# prerelease guard.
211+
#
212+
# `workflow_dispatch` leaves `release.prerelease` empty, so a manual run still
213+
# posts; that is deliberate, since dispatching by hand is an explicit act.
188214
notify-blog:
215+
if: github.event.release.prerelease != true
189216
needs: [native-build, jvm-build]
190217
timeout-minutes: 10
191218
runs-on: ubuntu-latest

0 commit comments

Comments
 (0)