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 ab152f1
Browse filesBrowse the repository at this point in the historyBrowse files
Smell-audited: 2: the method-value branch reuses the SAME
resolveJavaSurface + lookupMethod pair the call path uses (a value
completes/resolves exactly when a call would — no second resolution
rule); recordFromMap moved to the runtime zone so the reader and the
__map->record primitive share one construction core; the brew-user
regression class is corpus-locked cross-class (26 golden pairs).
Method values (the brew report `(every? Character/isWhitespace s)` — a
Name error on 1.3.0): a bare `Class/method` in VALUE position lifts to
the static method's builtin fn via the analyzer's Java-surface branch,
generally (Character/Math/Long/Integer/Double/String/Boolean corpus).
The 1.12 `Class/.instance` + `Class/new` forms are recorded in D-563(a2).
defrecord ns-qualified identity: TypeDescriptor gains defining_ns + a
precomputed record_type_hash; records print `#user.Pt{…}` (clj form),
the reader CONSTRUCTS `#ns.Name{…}` back (recordFromMap — extras to the
extmap), and record hasheq is clj's (type-hash XOR mapHasheq) —
`(hash (->Pt 1 2))` = -1763326040 both. AD-035 retired as parity;
AD-009's record residual closed. scripts/nrepl_send.py added (the
nREPL debug client the user suggested).
Copy file name to clipboardExpand all lines: .dev/accepted_divergences.yaml
+9-25Lines changed: 9 additions & 25 deletions
Original file line number
Diff line number
Diff line change
@@ -105,8 +105,8 @@ accepted:
105
105
derives_from: "F-005 (numeric tower: auto-promote on overflow is the chosen cljw surface)"
106
106
pin: "none — clj diverges (throws) by design; cljw's promote result is pinned by the D-165/overflow cycle's e2e (campaign C7, next session)"
107
107
- id: "AD-009"
108
-
summary: "cljw carries ONE hash system: `(hash x)` (hasheq) is clj-PORTABLE for value types (2026-07-16 leaf-formula alignment), and `.hashCode` / format `%h` DELEGATE to it — where clj/JVM has a SECOND, Java-side `Object.hashCode` system (`(.hashCode \"abc\")` → 96354 ≠ `(hash \"abc\")` → 74834163) that cljw does not reproduce. Residual hasheq divergences: defrecord/deftype instances (per-run descriptor seed) and >i64 ratio/BigDecimal components."
summary: "cljw carries ONE hash system: `(hash x)` (hasheq) is clj-PORTABLE for value types incl. defrecords (2026-07-16 alignment), and `.hashCode` / format `%h` DELEGATE to it — where clj/JVM has a SECOND, Java-side `Object.hashCode` system (`(.hashCode \"abc\")` → 96354 ≠ `(hash \"abc\")` → 74834163) that cljw does not reproduce. Residual hasheq divergences: >i64 ratio/BigDecimal components; deftype stays identity-based."
109
+
example: '(hash "abc") => 74834163 BOTH ; (hash :user/k) / (hash 1/2) / (hash 1.5M) / (hash [1 2]) all match clj (corpus hash_compare.txt) ; (.hashCode "abc") => cljw 74834163 (= hash) / clj 96354 (Java String.hashCode) ; (hash (->Pt 1 2)) => -1763326040 BOTH (records joined 2026-07-16)'
110
110
why: |-
111
111
The 2026-07-16 D-562 sweep aligned every leaf hasheq formula with clj:
112
112
strings (Murmur3.hashInt over Java String.hashCode), keywords/symbols
@@ -120,11 +120,13 @@ accepted:
120
120
JVM's SECOND hash system — `Object.hashCode` (Java 31-fold String
121
121
hash, per-class formulas, identity hashes) — `(.hashCode x)` and
122
122
format `%h`/`%H` delegate to the single hasheq (D-207/D-216).
123
-
Residual hasheq gaps: defrecord/deftype hasheq seeds on the per-run
124
-
descriptor pointer (clj XORs the ns-qualified record-name hash — the
125
-
AD-035 ns-qualification residual would unlock parity), and ratio /
126
-
BigDecimal components beyond i64 keep the cljw-native managed hash.
127
-
derives_from: "ADR-0059 (no-JVM: no second Object.hashCode system, no identity hashes) + F-011 (the observable `(hash x)` values now MATCH clj for data; the single-hash delegation is the internal-representation freedom) + AD-028 (the mapHash/mapHasheq sibling) + AD-035 (the record-name residual)."
123
+
Residual hasheq gaps: ratio / BigDecimal components beyond i64 keep
124
+
the cljw-native managed hash, and a bare-registered descriptor with
125
+
no defining ns (unit-test contexts) keeps the descriptor-pointer
126
+
seed. defrecord instances joined parity 2026-07-16 (the D-563(a)
127
+
ns-qualification: type-hash XOR mapHasheq, corpus
128
+
records_method_values.txt).
129
+
derives_from: "ADR-0059 (no-JVM: no second Object.hashCode system, no identity hashes) + F-011 (the observable `(hash x)` values now MATCH clj for data; the single-hash delegation is the internal-representation freedom) + AD-028 (the mapHash/mapHasheq sibling)."
128
130
pin: "test/diff/clj_corpus/hash_compare.txt — 30+ `(hash …)` golden values locked against real clj across every aligned type; test/diff/clj_corpus/object_methods.txt — `(= (.hashCode \"abc\") (hash \"abc\"))` → true (single-system delegation locked); test/e2e/phase14_format.sh — `%h` lowercase-hex rendering."
129
131
- id: "AD-010"
130
132
summary: "a Namespace value prints as `#object[Namespace \"<name>\"]` (no JVM class FQN, no `0xADDR` identity hash)"
@@ -511,24 +513,6 @@ accepted:
511
513
locks. See ADR-0152 (the conscious election + the DA's seq_cst analysis).
512
514
derives_from: "ADR-0152 (uniform acquire/release volatile-grade ordering) — JMM volatile = seq_cst across volatile accesses; cljw's acquire/release omits the IRIW cross-cell total order. Substrate: atom.zig/volatile.zig/iref.zig/agent.zig + the D-444 deftype field path."
513
515
pin: "test/e2e/phase14_deftype_mutable.sh — the :volatile-mutable field increments correctly (the by-construction half: the field IS atomic acquire/release; the IRIW gap itself is non-deterministic + untestable)"
514
-
- id: "AD-035"
515
-
summary: "A defrecord prints with its SIMPLE name (`#R{:x 1, :y 2}`), not clj's namespace-qualified `#user.R{:x 1, :y 2}`."
the ns prefix would require threading a defining-ns through every record
528
-
descriptor purely for the print fiction, contradicting the AD-003 simple-
529
-
name policy for no behavioural gain.
530
-
derives_from: "ADR-0059 (no-JVM Class hierarchy) + AD-003 (simple class name, not FQCN); no_jvm_specific_assumption.md. Records carry only a simple `fqcn`, so the printer emits `#<simple>{…}`."
summary: "The 2-arg array ctors `(byte-array size n)` / `(short-array size n)` / `(char-array size n)` FILL with a number init; clj throws (`IllegalArgumentException`, 'Don't know how to create ISeq from: java.lang.Long') because the JVM `Numbers` overload for those element types has no number-fill branch."
0 commit comments