diff --git a/.beads/interactions.jsonl b/.beads/interactions.jsonl index fe8b7d7..a82d49b 100644 --- a/.beads/interactions.jsonl +++ b/.beads/interactions.jsonl @@ -11,3 +11,5 @@ {"id":"int-ba29d2c7","kind":"field_change","created_at":"2026-06-04T18:45:52.297233Z","actor":"Yogthos","issue_id":"jolt-gxr","extra":{"field":"status","new_value":"closed","old_value":"open"}} {"id":"int-b7e06923","kind":"field_change","created_at":"2026-06-04T18:55:10.600885Z","actor":"Yogthos","issue_id":"jolt-7n5","extra":{"field":"status","new_value":"closed","old_value":"open"}} {"id":"int-0d2b12ab","kind":"field_change","created_at":"2026-06-04T18:56:25.718778Z","actor":"Yogthos","issue_id":"jolt-90c","extra":{"field":"status","new_value":"closed","old_value":"open"}} +{"id":"int-a86d84ba","kind":"field_change","created_at":"2026-06-04T18:57:26.21495Z","actor":"Yogthos","issue_id":"jolt-h0n","extra":{"field":"status","new_value":"closed","old_value":"open"}} +{"id":"int-5ddb241f","kind":"field_change","created_at":"2026-06-04T18:57:27.904474Z","actor":"Yogthos","issue_id":"jolt-7dy","extra":{"field":"status","new_value":"deferred","old_value":"open"}} diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 1186d0d..d8bbb41 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -9,7 +9,8 @@ {"_type":"issue","id":"jolt-40n","title":"HIGH: update/update-in/assoc-in fail on map literals (struct)","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:56Z","created_by":"Yogthos","updated_at":"2026-06-04T18:40:42Z","closed_at":"2026-06-04T18:40:42Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-ytt","title":"HIGH: str semantics — (str nil)='nil' should be '', (str :b)='b' should be ':b'","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:56Z","created_by":"Yogthos","updated_at":"2026-06-04T18:33:45Z","closed_at":"2026-06-04T18:33:45Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-9sb","title":"HIGH: destructuring gaps (nested seq, :strs, nested map, fn-param)","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:55Z","created_by":"Yogthos","updated_at":"2026-06-04T18:31:24Z","closed_at":"2026-06-04T18:31:24Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"jolt-7dy","title":"MED: compiler path lacks IFn dispatch (collections-as-fn) — only interpreter fixed","status":"open","priority":3,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:10:00Z","created_by":"Yogthos","updated_at":"2026-06-04T18:10:00Z","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"jolt-7dy","title":"MED: compiler path lacks IFn dispatch (collections-as-fn) — only interpreter fixed","status":"deferred","priority":3,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:10:00Z","created_by":"Yogthos","updated_at":"2026-06-04T18:57:28Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-90c","title":"MED: filter/take-while not lazy — infinite-seq (take N (filter p (range))) loops","status":"closed","priority":3,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:10:00Z","created_by":"Yogthos","updated_at":"2026-06-04T18:56:26Z","closed_at":"2026-06-04T18:56:26Z","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"jolt-7n5","title":"MED: REPL display — def/defn should print #'ns/name; lazy-seq printer realizes only head ((0 \u003cfunction\u003e))","status":"closed","priority":3,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:59Z","created_by":"Yogthos","updated_at":"2026-06-04T18:55:11Z","closed_at":"2026-06-04T18:55:11Z","dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"jolt-h0n","title":"MED: missing core fns — letfn fnil trampoline doseq cycle partition-all reductions dedupe keep-indexed map-indexed transduce reduce-kv assoc-in peek subvec read-string format","status":"open","priority":3,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:58Z","created_by":"Yogthos","updated_at":"2026-06-04T18:09:58Z","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"jolt-h0n","title":"MED: missing core fns — letfn fnil trampoline doseq cycle partition-all reductions dedupe keep-indexed map-indexed transduce reduce-kv assoc-in peek subvec read-string format","status":"closed","priority":3,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:09:58Z","created_by":"Yogthos","updated_at":"2026-06-04T18:57:26Z","closed_at":"2026-06-04T18:57:26Z","dependency_count":0,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"jolt-l8f","title":"transduce + transducer arities (1-arg map/filter/take); niche, deferred","status":"open","priority":4,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-06-04T18:57:27Z","created_by":"Yogthos","updated_at":"2026-06-04T18:57:27Z","dependency_count":0,"dependent_count":0,"comment_count":0} diff --git a/PLAN.md b/PLAN.md index e90a298..643766a 100644 --- a/PLAN.md +++ b/PLAN.md @@ -96,6 +96,39 @@ Three layers: - ✅ 16 total CLJS ported test files, 440 assertions across 31 test files - ✅ 317/317 tests pass, 0 failing scripts +### Phase 19: Clojure Conformance Hardening ✅ + +Added `test/conformance.janet` — a harness that evaluates `(= expected actual)` +inside jolt (using jolt's own `=`, i.e. real Clojure semantics), seeded from +`~/src/clojure/test`. Drove fixes for a large class of real-Clojure idioms the +bespoke `.janet` suite never exercised. **80/80 conformance, 46/46 legacy suite, +0 SCI-load failures.** + +CRITICAL (core semantics): +- Collections as IFn (`([v] i)`, `({m} k)`, `(#{s} x)`) via unified `jolt-invoke` +- Unified vector representation on Janet tuples (PersistentVector was broken/disconnected) +- `=`/`reduce`/`vec`/`into` now realize lazy-seqs; `into {}`/`into ()` fixed +- Lazy `iterate`/`range`(infinite)/single-coll `map` (over lazy input) +- Truly lazy `concat` → self-referential `lazy-cat`/`lazy-seq` work (`fib-seq`) + +HIGH: +- Unified recursive destructuring (nested seq/map, `:strs`/`:syms`/`:or`/`:as`, fn-params) +- `defn` docstring/attr-map handling (docstring'd fns were silently param-less) +- Clojure `str`/`pr-str` (nil→"", keywords/symbols, collections render readably) +- `update`/`update-in`/`assoc-in` on immutable maps; multimethod `:default` key dispatch +- defrecord inline protocol methods with field scope +- `require` loads stdlib namespaces from disk + aliased-ns resolution (`s/join`) + +MED: +- New: peek/pop/subvec/reduce-kv/cycle/partition-all/reductions/dedupe/ + keep-indexed/map-indexed/trampoline/format/read-string/fnil + letfn/doseq macros +- Recursive `jolt-equal?` (nested sequential + order-independent map equality) +- Lazy `filter`/`take-while`/`remove` over lazy input +- REPL: lazy-seq printer walks full chain (capped); `def`/`defn` print `#'ns/name` + +Deferred (niche / opt-in): `transduce` + transducer arities; compiler-path IFn +dispatch (the interpreter is the live path — `init` never enables `:compile?`). + ### Phase 17: Optimization - Compiler improvements: inline small core functions