Skip to content

Survive jolt #813, and declare the jolt floor glitter already had - #6

Merged
burinc merged 1 commit into
mainfrom
fix/jolt-813-time-provides
Sep 2, 2026
Merged

burinc merged 1 commit into
mainfrom
fix/jolt-813-time-provides

Conversation

@burinc

@burinc burinc commented Sep 2, 2026

Copy link
Copy Markdown
Member

Jolt shipped three breaking-ish changes in quick succession. Only one of them actually reached glitter, and it arrived through a dependency rather than through any code in this repo.

The break that mattered: jolt #813

jolt#813 (RFC 0014) moved the host-class provider table out of the runtime. A library now declares the JDK classes it implements in its own deps.edn, and a class nobody claims fails to resolve. Nothing claimed java.time.ZoneId until jolt-lang/time#11 landed.

Two symptoms, and only one of them was loud:

  • jolt flights died outright.
  • glitter.nexus.action-log-test was silently dropped from the suite. 29 tests to 26, 78 assertions to 67, exit 0.

A green bb test did not catch the second one. Only the changed count did. Worth remembering the next time the toolchain moves: under a floating or fast-moving jolt, compare the test count against the last known one, because the exit code will not tell you.

Fix: pin jolt-lang/time at 33c5e98, two commits past the v0.0.7 tag, because no release carries the declaration yet. Move the pin back to a tag once one ships.

Why there is no local :jolt/provides here

A local declaration was tried first and is deliberately absent. Upstream declares all ten classes under one umbrella jolt.time namespace, not under the three namespaces its own statics! calls live in. Since jolt keys the duplicate-claim error on the install namespace rather than the declaring coordinate, the two spellings claim the same classes under different names and jolt refuses to resolve at all:

two dependencies both claim to provide the host class java.time.Clock:
io.github.jolt-lang/time (jolt.time) and this project (jolt.time.zoned)

Measured, not predicted. If you are unblocking another repo on this, delete the local block rather than trying to reconcile it.

The other two changes do not reach glitter, checked rather than assumed

jolt#802 flipped ffi/write's argument order (silent, since both spellings are integers) and the fixed-array descriptor to [:array element-type count]. glitter has no ffi/write call site and no [:array ...] layout anywhere in src, test or examples. #802 also renamed and removed nothing, so all 223 defcfn bindings, foreign-callable and the free-callable retain/release bookkeeping stand unchanged; the new arena-owned ffi/callback is an option, not a replacement.

Declares :jolt/min-version "0.7.24"

jolt#804. This is the floor glitter already had in prose, for correct local dates, and it is pinned at glitter's real floor rather than the newest version because a library's floor is enforced on its consumers. That was measured against a dependency declaring one, and the error names the dep via :jolt/required-by.

Two honest caveats, both documented next to the key:

  • It cannot fire today. The runtime that reads the key first shipped in v0.8.0, well above the floor, so every jolt able to enforce it already clears it. It is forward protection for the next break.
  • A floor cannot guard a break older than the reader that honours it. #804's sole parent is #802's merge commit, so no jolt exists that reads the key and still has the old write order. jolt's own changelog invites the opposite conclusion by using ffi/write as the motivating example, eight lines above the caveat that excludes it.

Docs: a stale claim in six files

jolt <task> swallowing the child's exit code was stated flatly in the present tense across README, CONTRIBUTING's public invariant list, CHANGELOG, two guide pages and the agent context. Jolt fixed that in v0.7.28, measured here: a task whose command exits 7 now answers 7.

The recommendation survives, for a narrower reason than the original. glitter's floor is v0.7.24 and the fix lands at v0.7.28, so there is a live v0.7.24-to-v0.7.27 window this project supports where the task form still swallows failures. The alias form is correct across the whole supported range, which is what a gate needs.

Verification

On jolt v0.8.0-45-g5e0e7a96:

  • bb test: 29 tests, 78 assertions, 0 failures
  • bb smokes: all 27 live-GTK smokes green
  • bb verify: passes
  • jolt flights runs again

The toolchain SHA is recorded alongside each result in the docs, since "v0.8.0" is now ambiguous across dozens of commits.

Not included

.github/workflows/ci.yml installs jolt with an unpinned fallback to latest, so v0.8.0 publishing overnight moved CI onto a jolt with two breaking changes on a tree nobody touched. Pinning it is worth doing and is left out of this PR deliberately, as a separate concern.

…ady had

Jolt shipped three changes worth reacting to. Only one of them actually
reached this project, and it arrived through a dependency rather than
through glitter's own code.

jolt #813 (RFC 0014) moved the host-class provider table out of the
runtime: a library now declares the JDK classes it implements in its own
deps.edn, and a class nobody claims fails to resolve. Nothing claimed
java.time.ZoneId until jolt-lang/time#11 landed, so on a jolt carrying
#813 `jolt flights` died outright and glitter.nexus.action-log-test was
silently dropped from the suite. 29 tests to 26, 78 assertions to 67,
exit 0. A green `bb test` did not catch that. Only the changed count did,
which is worth remembering next time the toolchain moves.

Fixed by pinning time at 33c5e98, two commits past the v0.0.7 tag,
because no release carries the declaration yet. A local :jolt/provides
was tried first and is deliberately NOT here: upstream declares all ten
classes under one umbrella `jolt.time`, jolt keys the duplicate-claim
error on the install namespace rather than the declaring coordinate, and
the two spellings therefore refuse to resolve together.

The other two jolt changes do not reach glitter, checked rather than
assumed. #802 flipped ffi/write's argument order and the fixed-array
descriptor, and glitter has neither a write call site nor an [:array ...]
layout anywhere in src, test or examples. It renamed nothing, so all 223
defcfn bindings, foreign-callable and the free-callable bookkeeping stand.

Also declares :jolt/min-version "0.7.24" (jolt #804), the floor this
project already had in prose for correct local dates. It is pinned at
glitter's real floor rather than the newest version because a library's
floor is enforced on its consumers, measured against a dependency
declaring one. Note it cannot fire today: the runtime that reads the key
first shipped in v0.8.0, well above the floor.

Docs: corrects the "jolt <task> swallows the child's exit code" claim,
stated flatly in the present tense across six files. Jolt fixed that in
v0.7.28 and the task form now exits correctly. The recommendation stands
but the reason changed, because a 0.7.24 floor leaves a live v0.7.24 to
v0.7.27 window where the task form still swallows failures.

Verified on jolt v0.8.0-45-g5e0e7a96: 29 tests, 78 assertions, all 27
live-GTK smokes green.
@burinc
burinc merged commit 339ba1c into main Sep 2, 2026
3 checks passed
@burinc
burinc deleted the fix/jolt-813-time-provides branch September 2, 2026 12:39
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.

1 participant