W14: pin K20 contains?-dict support (test-only)

contains? did not support dict key membership in the real runtime —
(contains? {:a 1} :a) threw "contains?: 2 args", contradicting its own :doc.
The fix landed (primitives.sx + sx_primitives.ml) but had no pinning test.
Add suite gate-K20-contains-dict to spec/tests/test-gate-pins.sx (4 tests,
repro from plans/sx-review/core.md): present key true, missing key false,
list membership + string substring unchanged. 8/8 green under OCaml run_tests.

Test-only: no semantics edits, no push.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-03 22:55:19 +00:00
parent f09368e1c2
commit 0ceb9d1776
3 changed files with 39 additions and 7 deletions

View File

@@ -1 +1 @@
{"sessionId":"c4d97db1-361c-4a04-a99b-c838f9385469","pid":2426590,"procStart":"349789073","acquiredAt":1780789990975} {"sessionId":"d510140d-6197-40b7-9bd2-125ca304ad7a","pid":697492,"procStart":"125353752","acquiredAt":1783118024555}

View File

@@ -45,7 +45,7 @@ Pin each confirmed-and-fixed finding with a minimal repro. Add suites to
`spec/tests/test-gate-pins.sx` (one `defsuite` per finding). `spec/tests/test-gate-pins.sx` (one `defsuite` per finding).
- [x] K18 [W7] — `expt` overflow now float-promotes (no 63-bit wrap) - [x] K18 [W7] — `expt` overflow now float-promotes (no 63-bit wrap)
- [ ] K20 [W7] — identify the landed W7 fix and pin it - [x] K20 [W7] — `contains?` now supports dict key membership
- [ ] K09/K11/K39 [W5] — landed special-form fixes, pin each - [ ] K09/K11/K39 [W5] — landed special-form fixes, pin each
- [ ] K49 [W8] — render depth/cycle guard (infinite recursive component) - [ ] K49 [W8] — render depth/cycle guard (infinite recursive component)
- [ ] crit-2 [W1] — signal-return frame key (verify the pin is non-vacuous) - [ ] crit-2 [W1] — signal-return frame key (verify the pin is non-vacuous)
@@ -77,6 +77,13 @@ Pin each confirmed-and-fixed finding with a minimal repro. Add suites to
## Progress log (newest first) ## Progress log (newest first)
- 2026-07-03 — **K20 contains?-dict pin (item A.2)**. Mapped K-codes by
core.md severity order (K17 append!, K18 expt, K19 harness-drift, K20
contains?-dict). Added suite `gate-K20-contains-dict` to
`spec/tests/test-gate-pins.sx` (4 tests): present dict key → true, missing
key → false, list membership unchanged, string substring unchanged. Repro
from core.md ("(contains? {:a 1} :a) threw `contains?: 2 args`"). 8/8 green
across both suites under OCaml run_tests. Test-only.
- 2026-07-03 — **K18 expt-overflow pin (item A.1)**. Bootstrapped this briefing - 2026-07-03 — **K18 expt-overflow pin (item A.1)**. Bootstrapped this briefing
from PLAN.md §W14 (the referenced file did not exist yet). Added from PLAN.md §W14 (the referenced file did not exist yet). Added
`spec/tests/test-gate-pins.sx` with suite `gate-K18-expt-overflow` (4 tests): `spec/tests/test-gate-pins.sx` with suite `gate-K18-expt-overflow` (4 tests):

View File

@@ -1,10 +1,11 @@
;; ========================================================================== ;; ==========================================================================
;; test-gate-pins.sx — W14 regression pins for dc7aa709's landed fixes ;; test-gate-pins.sx — W14 regression pins for the review's landed fixes
;; ;;
;; The quick-wins batch (commit dc7aa709) landed real semantics fixes but ;; The quick-wins batch (commit dc7aa709 + siblings) landed real semantics
;; shipped WITHOUT pinning tests, so a regression would pass silently. This ;; fixes but shipped WITHOUT pinning tests, so a regression would pass
;; file pins each confirmed-and-fixed finding with a minimal repro lifted ;; silently. This file pins each confirmed-and-fixed finding with a minimal
;; from the review lane files (plans/sx-review/*.md). One suite per finding. ;; repro lifted from the review lane files (plans/sx-review/*.md). One suite
;; per finding.
;; ;;
;; TEST-ONLY: no semantics edits. If a pin fails, the fix regressed — do NOT ;; TEST-ONLY: no semantics edits. If a pin fails, the fix regressed — do NOT
;; relax the assertion; investigate the evaluator/primitive change. ;; relax the assertion; investigate the evaluator/primitive change.
@@ -31,3 +32,27 @@
(deftest (deftest
"expt 2^100 promotes to float" "expt 2^100 promotes to float"
(assert (number? (expt 2 100))))) (assert (number? (expt 2 100)))))
;; --------------------------------------------------------------------------
;; K20 [W7, high] contains? did not support dicts in the real runtime —
;; (contains? {:a 1} :a) threw "contains?: 2 args", contradicting its :doc
;; ("Dicts: key check"). Fixed: dict key membership works; lists/strings
;; unchanged. Repro (core.md).
;; --------------------------------------------------------------------------
(defsuite
"gate-K20-contains-dict"
(deftest
"contains? finds a present dict key"
(assert (contains? {:a 1 :b 2} :a)))
(deftest
"contains? reports a missing dict key as false"
(assert (not (contains? {:a 1 :b 2} :zz))))
(deftest
"contains? still works on list membership"
(do
(assert (contains? (list 10 20 30) 20))
(assert
(not (contains? (list 10 20 30) 99)))))
(deftest
"contains? still works on string substrings"
(assert (contains? "hello" "ell"))))