You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 92d7926
Browse filesBrowse the repository at this point in the historyBrowse files
docs(adr): ADR-0177 — capability claims carry a gated status marker
Smell-audited: depth 3: new ADR. The smell was Reservation-as-bias in
reverse — the ROADMAP asserted six capabilities in the present tense that
build.zig cannot produce, and the previous commit fixed the numeric half of
the same rot without touching the capability half. Devil's-advocate fork run
with fresh context (mandatory at depth >= 2); its output is reproduced
verbatim in Alternatives considered and it changed the outcome three times
over the draft, so it is worth naming what it caught:
1. The draft scoped ROADMAP §1.1 and §8.1 only. The fork found the SAME
false claim standing in §1.2 axis 1 ("v2 makes Wasm Component a
first-class output"), §1.3, §8.3 and §10.3 — landing the draft as scoped
would have marked §8.1 NOT IMPLEMENTED while the differentiation table
two pages above still asserted the artifact exists.
2. The draft justified the amendment partly with Cloudflare's 3 MB gzipped
limit against the 7,368,808-byte native binary. That compares two
different artifacts — a wasm32 build would carry neither the native
codegen paths nor necessarily the JIT, and would be gzipped. Dropped,
rather than shipping a refuted premise for a future reader to find.
3. The draft would have restated a corrected LOC figure in an ungated
sentence — re-arming the identical rot. The LOC target is retired in
favour of the property it proxied (§1.2 axis 3), and the measured
124,712 appears once, dated, in the ADR.
Its F-003 reading is the ADR's spine: retiring a false present-tense CLAIM is
not the same act as DECIDING an unbuilt structural plan. So the claims go and
the aim stays, owned by D-552. No scope changes here — F-010 (2026-05-29) and
D-552 (2026-07-02) were both user-directed and already sequenced this.
The mechanism, mirroring SIZE_EXEMPT_MARKER so it is one idea and not two:
- `<!--claim:shipped-->` / `<!--claim:planned:D-NNN-->` inline markers.
- `scripts/check_capability_claims.sh` (new, wired as a `run_all.sh` step):
every planned marker must name a debt row that exists AND is still open —
a planned claim whose owner was discharged is how "planned" quietly becomes
"abandoned, still advertised" — plus a curated forbidden-phrase list that
may not appear unmarked. Deliberately not a general prose scanner: a
heuristic over a 1,600-line ROADMAP would false-positive until disabled.
All three branches negative-tested (unmarked phrase, nonexistent owner,
discharged owner).
- `.dev/ROADMAP.md` joins SIZE_CLAIM_FILES; "9.5 MB at v1.3.1" appeared twice
in it and neither was checked.
handover trimmed 118 -> 96 lines (over the 100 cap): the v1.5.0 release detail
duplicated CHANGELOG, and the stale `## Stopped` section belonged to the
previous session per handover_framing.md.
| 1 |**Edge-native Clojure**| Babashka is native but produces no Wasm. SCI is JS-only. v2 makes Wasm Component a first-class output. |
90
-
| 2 |**Wasm-native interop**|`require` a Wasm **component** as a Clojure ns (finished form: **ADR-0135** + **Amendment 1**, 2026-06-21 user-directed — `(:require ["x.wasm" :as x])`, resolution order, type leverage, single-binary embed **ADR-0158**, always-latest **F-016**). **ACTIVE epic = D-404** (blocker dissolved; phases A ns-`:require` wiring → B resolution → C types → D single-binary → E resource/registry). Inversely, expose Clojure functions as WIT exports (later). |
91
-
| 3 |**Comprehensible runtime**| Codebase is small enough to be read end-to-end. Each phase ships a written walkthrough. |
92
-
| 4 |**Zig-level optimisation ceiling**| The *meta*-differentiator. Babashka rides GraalVM, clj rides the JVM: to make a hot path fast you must work *within* the host's object model / bytecode / GC. cljw is Zig from the metal up, so any primitive can be rewritten / fused / comptime-specialised (NaN-box, superinstructions, D-133 JIT) as a **Zig PR, not a host-engineering project** — a higher optimisation ceiling than any JVM-bound Clojure, provable per-workload. |
| 1 |**Edge-native Clojure**|**AIM, NOT BUILT**<!--claim:planned:D-552-->. Babashka is native but produces no Wasm; SCI is JS-only; making a Wasm Component a first-class *output* of cljw would be the differentiator — and it does not exist. No `wasm32` target in `build.zig`; `cljw build` emits a native binary with a bytecode trailer. Owner: **D-552** (research-first, user-nod-gated). Sequenced behind axis 2 by F-010. Compiling *Clojure source* to a component is a sibling project's scope (ClojureWit), not a cljw plan.|
100
+
| 2 |**Wasm-native interop**|`require` a Wasm **component** as a Clojure ns (finished form: **ADR-0135** + **Amendment 1**, 2026-06-21 user-directed — `(:require ["x.wasm" :as x])`, resolution order, type leverage, single-binary embed **ADR-0158**, always-latest **F-016**). **ACTIVE epic = D-404** (blocker dissolved; phases A ns-`:require` wiring → B resolution → C types → D single-binary → E resource/registry). Inversely, expose Clojure functions as WIT exports (later). |
101
+
| 3 |**Comprehensible runtime**| Codebase is small enough to be read end-to-end. Each phase ships a written walkthrough. |
102
+
| 4 |**Zig-level optimisation ceiling**| The *meta*-differentiator. Babashka rides GraalVM, clj rides the JVM: to make a hot path fast you must work *within* the host's object model / bytecode / GC. cljw is Zig from the metal up, so any primitive can be rewritten / fused / comptime-specialised (NaN-box, superinstructions, D-133 JIT) as a **Zig PR, not a host-engineering project** — a higher optimisation ceiling than any JVM-bound Clojure, provable per-workload. |
93
103
94
104
**Axis 2 is the north star** (ADR-0099 / **ADR-0135**): WebAssembly component as
95
105
a first-class namespace — the analogue of clj↔Java / cljs↔JS / cljd↔Dart, but
@@ -109,9 +119,12 @@ discipline is to keep the hot paths clean while the compat grind adds slow-OK
109
119
### 1.3 Intended users
110
120
111
121
-**Clojurians shipping to edge / serverless** who find Babashka / SCI
112
-
short on concurrency or Wasm interop.
113
-
-**Wasm-ecosystem users** who want to call a Clojure runtime as a
114
-
component, or distribute a Clojure DSL as a Wasm component.
122
+
short on concurrency or Wasm interop. (Today cljw serves them as a native
123
+
binary with fast cold start; the Wasm-guest deployment path is D-552.)
124
+
-**Wasm-ecosystem users** who want to pull a Wasm component into a Clojure
125
+
program <!--claim:shipped-->. The inverse — calling a Clojure runtime *as* a
126
+
component, or distributing a Clojure DSL as one — is **not built**
127
+
<!--claim:planned:D-552-->.
115
128
-**Learners of runtime implementation** who want design decisions and
116
129
implementation in lockstep.
117
130
@@ -942,13 +955,25 @@ comptime gate.
942
955
943
956
### 8.1 Adopted: hybrid
944
957
945
-
**Two artifacts from one source tree**:
946
-
1. **Native CLI** (`cljw`): the usual binary for macOS / Linux x86_64 / aarch64.
0 commit comments