Files
rose-ash/plans/sx-review/PLAN.md
giles 4f766ea4f1 plans: SX review master remediation plan + evidence
Consolidates the three-lane review (core K01-K110, hosts J*/C*/JS*/P*/S*,
conformance F1-F15) into plans/sx-review/:
- PLAN.md — 15 workstreams, phased execution, full per-finding coverage
  ledger (every ~213 finding-instances mapped to a workstream + status)
- RULINGS.md — 40 draft normative rulings (Phase-0 gate)
- core.md / hosts.md / conformance.md — the lane evidence files

dc7aa709 quick-wins batch marked DONE in the ledger; K01 (guard re-raise
hang), S1 (live HTTP crash), K03 (shift-k), and W14 (test gate) flagged as
the highest-value open work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 21:28:41 +00:00

24 KiB
Raw Blame History

SX Review — Master Remediation Plan

Consolidates every finding from the three parallel review sessions (2026-07-03):

  • core.md — language core / spec semantics (K01K110)
  • hosts.md — per-host implementations + FFI (J*, C*, JS*, P*, S*, PY)
  • conformance.md — cross-host agreement + test adequacy (F1F15, conf-S1S5)
  • RULINGS.md — 40 draft normative rulings (R1R40) that gate the ambiguity fixes

How to read this. Findings are grouped into workstreams (W1W15). Each workstream lists the finding IDs it resolves, the approach, what ratified ruling(s) it needs, and status. The full per-ID coverage ledger is at the bottom — every finding maps to a workstream + status, so nothing is silently dropped. [DONE] = landed in commit dc7aa709 (quick-wins batch). [GATE] = blocked on a Phase-0 decision. [dup→Kxx] = same defect found by another lane, fixed once.

Prime directive from the review: the verification infrastructure currently cannot tell you whether a fix works (runner envs diverge from production, the WASM kernel never runs the corpus, the JS gate is structurally red, one test passed because of the bug it tested). So Phase 1 Track A (gate repair) comes before the bulk of the semantic work — otherwise fixes land blind.


Phase 0 — Decisions (BLOCKING; maintainer; no code)

Nothing in Phases 2+ that changes observable semantics should merge before the relevant ruling is ratified. These three decisions unblock ~40 findings.

D1. Host lineup

Evidence: the JS-transpiled bundle is hollow (C0a: define-library files → 0 bytes) and its gate is red (C0b: 2490/5086 fail); nothing serves it. The standalone Python host cannot load (C30/PY). Production = OCaml native + WASM kernel (one OCaml library) + the load-bearing Python parser/bridge in shared/sx/. Recommendation: declare the kernel family the only evaluator targets; retire hosts/javascript

  • hosts/python standalone; shrink shared/sx/parser.py to a wire-subset with a parity suite. → Ratifying this closes W13 entirely (C0a/C0b/JS1JS8 become "delete") and simplifies W6/W7.

D2. Ratify RULINGS.md (R1R40)

Each ruling is one normative answer + one mechanical fix. Ratify in a pass; four need a pre-ratification usage sweep because they're high-churn: R17 (arity: kill nil-fill), R9 (cond flat-only), R31 (append! errors on derived lists), R15a (HO swap only when unambiguous). See RULINGS.md for the per-ruling recommendation.

D3. Define the merge gate

Recommendation: (a) native run_tests green with hs-upstream skip-listed; (b) same corpus on the WASM kernel; (c) cross-kernel differential battery output-identical; (d) CEK-vs-forced-JIT differential when JIT is on; (e) sx_ref.ml regen + diff. This is W14's definition of done.


Phase 1 — Trustworthy verification + stop the bleeding

W14. Test gate & conformance infrastructure (do FIRST — everything else verifies against it)

Findings: C0b, C9, C21, C22, C23, C3, C4, C5, C6, C7, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, K19 (harness/runtime primitive drift, partial from batch), K104 (harness log-before-mock). Approach:

  1. Unify runner env with production env — delete or productionize every runner-only binding: values/call-with-values (F7, K42), the JS runner's fake sha3/equal?/apply/env-set! shims (JS5, F7). Rule: if the spec needs it, it's a kernel primitive; if not, the test can't have it.
  2. WASM corpus runner in CI (F2) — promote conformance's run_wasm.js prototype.
  3. MCP harness honesty (K19): mcp_tree.ml drops its parallel primitive table and links real sx_primitives (batch aligned 8 entries as a stopgap); make sx_harness_eval fresh per call.
  4. Harness fixes: log IO before invoking the mock (C22/K104); real perform/suspend mode (C21); adapter-dom render-output tests (C23).
  5. Epoch-loop protocol fuzz suite (C3/C4/C5/C6/C7) + skip-list hs-upstream (F10) + empty suite label (C9).
  6. Test-debt ledger: pin every confirmed finding with a failing test FIRST — the three lane files are a ready-made corpus of minimal reprs. Batch gap to close: dc7aa709's fixes have no pinning tests (except crit-2, now non-vacuous). Add tests for K09, K11, K18, K20, K39, K49, C1/C1b, S4 before further evaluator work. Gate: none (this IS the gate). Status: OPEN — highest priority.

W1. Condition system & delimited continuations (the kernel criticals)

Findings: K01 (guard/handler re-raise hang — CRITICAL), K03 (shift-k nested cek-run double-exec — CRITICAL), K10 (dynamic-wind re-entry + sibling winder corruption), K12 (-> non-HO steps in nested CEK), K36 (guard multi-expr clause body — inherits cond fix W5), K41 (host errors uncatchable by guard), K57 (strict errors uncatchable), K106 (SUSPECTED: expand-macro/let-values/qq nested-eval boundaries), S10 (VM inline-IO in HO callbacks can't suspend). K02 [DONE]. Root cause (shared by K03/K12/K106/S10): evaluation crosses a nested cek-run/trampoline (eval-expr) boundary the outer continuation can't see. One architectural fix — invoke continuations and evaluate these sub-expressions via CEK frames, not nested runs — resolves the cluster. K01 is separate: run handlers with the OUTER handler set (unwound kont must EXCLUDE the matched frame); make guard clause bodies evaluate after the escape (the no-match auto-reraise path already does this — make it the only path). K10: common-ancestor before/after algorithm + winders stored per-continuation, not one global length-keyed stack. K41/K57: raise host/primitive/strict errors as structured catchable conditions (needs R7). Gate: R6 (handler installation), R7 (what's catchable), R8 (raise-continuable). Status: OPEN — K01 is the single highest-value fix left (DoS-able hang, server + browser).

W3. HTTP-mode concurrency & serving safety (production robustness — lib/host is LIVE)

Findings: S1 (multi-Domain render race — LIVE CRASH), S2 (per-request globals read by queued workers), S3 (expand-components? bind/remove on shared env), S5 (cache key ignores cookies/query), S11 (URL evaluated as SX — any env binding invokable), S12 (island hydration reuses no SSR DOM), S13 (SSR/client purity, no dev-mode check), K30 (emit!/emitted cross-request — shared with W2). S4 [DONE], J1/J2/J3 mitigated by the batch JIT gate. Approach: serialize or isolate rendering (S1: lock _stream_mutex or per-Domain env/cache); per-request state carried with the request not process-global (S2/S3/K30); include query in cache key + cookie policy (S5); whitelist URL-routable bindings to a page: prefix (S11); hydration cursor

  • dev-mode purity check (S12/S13). Pairs with W2 (per-flow scope stacks). Gate: none for S1/S4/S5 (safety). Status: OPEN — S1 is a live crash.

Phase 2 — Correctness families (each = ruling + fixes + conformance rows)

W2. Environment & scope integrity

Findings: K04 (caller frame leaks into interpreted lambda + JIT disagrees), K05 (letrec injects into foreign closures — global contamination), K06 (named-let leaks loop name), K07 (~60 unshadowable names; = J8 VM-honors-CEK-doesn't), K30 (emit! cross-request — shared W3), K31 (provide leak on raise/shift), K32 (provide! ambient global), K33 (set! unbound creates + JIT/interp split brain), K40 (scope :value dead + dead frame type), K107 (SUSPECTED env_merge depth-100 flip). Approach: fresh frames for letrec/named-let (K05/K06); drop the top-frame copy in env_merge (K04/K107); reserved-words error for dispatch names, aligning VM+CEK (K07/J8); unwind-safe + invocation-scoped dynamic state — one mechanism for provide/emit!/batch (K30/K31/K32); set!-unbound per R1 + kill the JIT/interp global split (K33); remove dead scope :value/frame (K40). Gate: R1 (set!), R2 (reserved names). Status: OPEN.

W4. Higher-order forms & threading

Findings: K13 (2-arg reduce returns coll), K14 (reduce init-swap), K15 (data-first drops extra args), K43 (O(n²) map/filter), K44 (HO names not first-class), K45 (cryptic uncatchable HO errors), K46 (multi-coll rejects strings/vectors), K47 (thread lambda literal), K78 (component in HO → zeros), K79 (dead |>), K80 (keyword getters in HO/->), K81 (zero-arg HO silent ()), J7 (VM data-first deopt — shared W11). Approach: implement R15 sub-rulings (swap only when one arg callable + error otherwise; reduce arities; drop-extra→error; multi-coll seq-to-list parity; HO first-class; zero-arg→error); fix O(n²) via reversed-cons accumulation; delete dead |>. Gate: R13 (threading), R15 (HO forms). Status: OPEN.

W5. Special forms & macros

Findings: K08 (cond dual-grammar — silent side-effect drops), K34 (qq depth), K35 (qq dict traversal), K37 (&key misbind on fn/defmacro), K38 (splice non-list/malformed), K70 (case else any position), K71 (case dialect + punning), K72 (letrec parallel + ref-before-init), K76 (defmacro unhygienic vs "hygiene" test name), K77 (match guard clauses silently structural), K42 (values — special forms now registered [DONE-partial]; values primitive still runner-only). K09/K11/K39 [DONE]. Approach: cond flat-only + explicit begin (R9); qq depth tracking + dict traversal + splice arity errors (R12); &key one binding path for fn/defmacro/component (R5/K37); case final-else + evaluated- datum doc + clause-syntax error (R10); letrec* + ref-before-init error (R4); match guards implemented or error (R14); make values a real kernel primitive (finish K42). Gate: R4, R5, R9, R10, R12, R14. Status: OPEN (K09/K11/K39 done).

W6. Parser, serializer, canonical form & CIDs

Findings: K21 (canonical.sx runner-only helpers), K22 (serializer dict-key escaping + CID fixed- point), K23 (four divergent ident/number classifiers), K24 (1e→nil), K25 (guest rationals throw), K63 (#; before )), K64 (= no Char arm — shared W7), K65 (#\a mcp crash), K66 (multibyte char literals), K67 (\uXXXX validation), K68 (unknown-escape divergence), K69 (#name reader macro unimpl on OCaml), K100 (parse error locations), K101 (dict literal edges), K102 (#| raw string), K103 (:/:: keyword edges), K108 (SUSPECTED cross-host CID nondeterminism), C25 (Py↔OCaml escape corruption), C26 (Py unicode symbols), C27 (Py dict order — shared W7/P9). Approach: ONE normative ident/number classifier bound by every surface (R32); \u validation + unknown-escape error + datum-comment fix (R27/R33); native #name reader macro registry; canonical path = native CBOR/CID normative, spec/canonical.sx tested mirror or deleted, property- test parse(serialize(x))=x and canonical fixed-point cross-kernel (R34/R35). CID determinism (K108/K35-in-canonical) is sx-pub-critical. Gate: R27, R32, R33, R34, R35. Status: OPEN.

W7. Numbers, equality, strings, collection primitives

Findings: K17 (append! silent no-op), K52 (byte-based strings), K53 (spec/runtime primitive drift), K54 (div-by-zero inconsistency), K55 (/ doc), K56 (sort no comparator), K64 (char equality), K85 (binary =, exactness conflation), K86 (rounding/inexact->exact/sqrt), K87 (float/nil rendering), K88 (nil/empty tolerance), K89 (keys reverse order — GATED, see R29 note: breaks render tests), K90 (keyword-name on evaluated kw), K91 (string->number), K92 (apply doesn't spread), P1 (lossy float wire), P2 (sort mixed int/float), P3 (into needs bridge), P4 (int63 vs float64), P5 (= not deep on JS dicts, missing eq?/eqv?), P6 (string units), P7 (JS coercion cluster — GATE D1), P8 (nil/list strictness), P10 (NaN/Inf wire tokens), P11 (upcase/round), P12 (zip-pairs). K18/K20 [DONE]. Approach: append! errors on non-mutable lists + deprecate (R31); codepoint string semantics (R25); implement eq?/eqv?, add = Char arm, n-ary comparisons (R19); exact-±2^53 + overflow-promote (R21); shortest-round-trip float printing + inf/nan wire tokens (R23); div-by-zero catchable (R22); apply spreads (R16); sort comparator + numeric compare (R30/P2); into native, contains?-on-dict [done], merge-skip-nil, zip-pairs sliding window (R30/P8/P12); reconcile spec/runtime primitive lists (K53). Gate: R16, R19, R21, R22, R23, R25, R29, R30, R31. Status: OPEN (K18/K20 done).

W8. Render pipeline

Findings: K16 (infinite recursion no depth guard), K48 (attr-name injection — XSS class), K50 (aser list kwargs), K51 (dom/html attr parity = C19), K82 (bool-attr truthiness footgun), K83 (dead is-render-expr? / html: tags), K84 (script/style escaping), K87 (float render — shared W7), C19 (=K51), C20 (CSRF cross-origin), S14 (deep nested-list flatten html vs aser), S9 (SPA boosted-nav fragility). K49 [DONE]. Approach: depth limit + cycle guard (K16); attr-name validation (R36/K48); quote aser list kwargs (R38/K50); align 4 adapters on bool-attr contract (R36/C19/K51); script/style raw-text error-on-breakout (R37/K84); wire or delete is-render-expr? (R37/K83); depth-2 aser/html parity test (S14). CSRF cross-origin (C20) + SPA manifest staleness (S9, overlaps W11 stale-bundle). Gate: R36, R37, R38. Status: OPEN (K49 done).

W9. Strict typing

Findings: K26 (HO callbacks bypass), K27 (apply bypasses), K58 (unknown type names match all), K59 (keyword type dead / components untypeable), K60 (component &key misalign), K93 (name-keyed, evaded), K94 (set-prim-param-types! no validation), K95 (too-few args skip checks), K96 ((:as type) unenforced), K97 (paper cuts). Approach (R20): move checks to continue-with-call/vm_call chokepoints (covers HO, apply, components, => receivers); validate type names at declaration; real "component" branch, remove dead "keyword" (R18); (:as type) as the declaration channel; merge+validate set-prim-param-types!; strict errors catchable (R7, shared W1). Return types explicitly out of scope. Gate: R7, R18, R20. Status: OPEN.

W10. Signals & coroutines

Findings: K28 (dispose-computed no-op), K29 (batch wedge on exception), K61 (identity-not-equality change detection), K62 (diamond glitch), K98 (batch unusable on server / coroutines inert), K99 (effect cleanup double-invoke), K109 (SUSPECTED coroutine non-yield wedge), K110 (SUSPECTED VM no strict — shared W9/W11). Approach (R39): =-based change detection (needs W7 R19); unwind-safe batch (shared W2 mechanism); two-phase/topological notify for glitch-freedom; fix dispose-computed + effect cleanup; make batch/coroutines work outside run_tests (bind batch-begin!/end! + cek hooks in real envs, or fold into kernel). Zero test coverage today — add suites. Gate: R39. Status: OPEN.

W12. Python bridge & boundary (load-bearing in production)

Findings: C24 (boundary validation dead — [DONE-partial]: now warns; full revival needs tier-1 declarations recreated + zero-violation proof since SX_BOUNDARY_STRICT=1 is live), C28 (two SxExpr classes double-quote), C29 (reader-macro auto-resolve broken), C30 (standalone Python host dead — GATE D1: delete), C31 (14/33 test files broken + 5 live failures), S-bridge (coroutine-cancel desync, no timeouts, dead _restart), S-bridge2 (numeric-result-as-epoch ambiguity), K42 (values — shared W5). C25/C26/C27 live in W6 (parser). Approach: finish C24 (recreate declarations, prove clean, re-enable); single SxExpr class (C28); fix OcamlSync.start→_ensure (C29); bridge timeouts + working _restart (S-bridge); robust (ok N V) parse (S-bridge2); fix/retire broken tests (C31). Gate: D1 (C30). Status: OPEN (C24 partial).

W11. JIT correctness (serving-JIT re-enable preconditions)

Findings: J1 (-> miscompile), J2 (fallback re-runs whole call — double side effects), J3 (macro args eager), J4 (VM component kwargs misparse), J5 (specialized opcodes freeze redefs), J6 (compiler- used prim redef poisons), J7 (data-first deopt — shared W4), J10 (stale Sx_compiler stub), J11 (JIT debug paths diverge), K33 (set! split brain — shared W2), K19 (harness drift — shared W14), C10 (browser compiler one fix behind), C11 (stale module-manifest.sx), C12 (dead SOURCE_MAP paths), C14 (stale dist/ bundle). J12 = positive (perform/resume fixed). Currently MITIGATED (JIT gated OFF in both epoch and — post-batch — HTTP mode). Approach: fix compile-thread-step (J1); fallback-before- side-effects or compile-time reject of fallback-prone forms (J2); macro-aware compile (J3); keyword tagging in constant pool (J4); redefinition invalidation (J5/J6); one browser-compiler sync pipeline

  • single bundle dir (C10/C11/C12/C14). Do NOT re-enable serving-JIT until the CEK-vs-JIT differential (W14) is green. Gate: W14 differential. Status: DEFERRED (mitigated; only unblock if serving-JIT is wanted).

W13. JS host (GATE D1 — likely "delete")

Findings: C0a (hollow bundle), C0b (2490 fail gate), JS1 (define-record-type/makeRtd), JS2 (host- callback type tag), JS3 (arithmetic drops args), JS4 (. symbol), JS5 (runner shims), JS6 (str nil), JS7 (no qq emission), JS8 (stale metadata). If D1 retires the JS bundle: delete hosts/javascript, remove from sx-build-all.sh/CI, keep only the WASM kernel path. If kept: this is a ~2500-test revival project. Gate: D1. Status: BLOCKED on D1.


Phase 3 — Hygiene & docs

W15. Hygiene & documentation

Findings: C8 (triplicated hosts/ocaml/hosts/ tree), C13 (test_platform.js stale path), C15 (tracked stale wasm blob), C16 (orphaned hosts/native), C17 (sx-platform-2.js + 23 dead .sxbc.json), C18 (spa-debug.js + root clutter), C2 (r7rs string->number radix shadow), F14 (doc drift — batch fixed canonical-ref + island rules; suite counts + case-syntax + primitives-header still stale), F15 (sha3 stub / test.sx dead filename), F13 (regen reproducibility — [DONE] as batch side effect). K105/K73 [DONE]. Approach: delete dead trees/blobs/files; fix r7rs shadow (C2); finish CLAUDE.md (suite counts, case syntax); regen-diff CI check (F13 → make it a gate in W14). Gate: D1 (some deletions). Status: OPEN (K105/K73/F13 done).


Suggested execution shape (maps to the loop workflow)

Four loops, mostly independent after Phase 0:

  1. loops/sx-gate (W14 + W15 hygiene) — the enabler. Start FIRST. Pins tests for the dc7aa709 batch, builds the WASM corpus runner + differential battery, unifies runner env, cleans dead code.
  2. loops/sx-kernel (W1 + W2 + W5) — condition system, scope integrity, special forms. Single owner (touches evaluator.sx + regen). TDD off W14's pinned tests. K01 first.
  3. loops/sx-runtime (W3 HTTP safety + W12 Python bridge) — production robustness; can run parallel to kernel since it's mostly host OCaml + Python, not spec.
  4. loops/sx-families (W4, W6, W7, W8, W9, W10) — one family at a time, each gated by its rulings
    • the new batteries. W6/W7 pay the sx-pub CID debt. W11 (JIT) and W13 (JS) are decision-gated and sit out until D1 + a green differential exist.

Sequencing rule: no semantic fix merges before (a) its pinning test exists, (b) the relevant ruling is ratified, (c) native + WASM both run it. D1/D2/D3 are the only hard blockers.


Coverage ledger — every finding accounted for

Status key: DONE (dc7aa709) · OPEN · PARTIAL · DEFERRED · GATE(Dn) · dup→(primary). Workstream in [].

Core (K01K110)

  • K01 [W1] OPEN — guard/handler re-raise hang (CRITICAL, highest value)
  • K02 [W1] DONE — signal-return frame key
  • K03 [W1] OPEN — shift-k nested cek-run (CRITICAL)
  • K04 [W2] OPEN · K05 [W2] OPEN · K06 [W2] OPEN · K07 [W2] OPEN (=J8)
  • K08 [W5] OPEN — cond dual grammar
  • K09 [W5] DONE · K10 [W1] OPEN · K11 [W5] DONE
  • K12 [W1] OPEN (=W4 threading) · K13 [W4] OPEN · K14 [W4] OPEN · K15 [W4] OPEN
  • K16 [W8] OPEN · K17 [W7] OPEN — append! · K18 [W7] DONE · K19 [W14] PARTIAL · K20 [W7] DONE
  • K21 [W6] OPEN · K22 [W6] OPEN · K23 [W6] OPEN · K24 [W6] OPEN · K25 [W6] OPEN
  • K26 [W9] OPEN · K27 [W9] OPEN · K28 [W10] OPEN · K29 [W10] OPEN
  • K30 [W2/W3] OPEN — emit! cross-request (=S2 dir)
  • K31 [W2] OPEN · K32 [W2] OPEN · K33 [W2/W11] OPEN — set! split brain
  • K34 [W5] OPEN · K35 [W5/W6] OPEN · K36 [W1/W5] OPEN · K37 [W5] OPEN · K38 [W5] OPEN
  • K39 [W5] DONE · K40 [W2] OPEN · K41 [W1] OPEN · K42 [W5/W12] PARTIAL (forms registered; values prim runner-only)
  • K43 [W4] OPEN · K44 [W4] OPEN · K45 [W4] OPEN · K46 [W4] OPEN · K47 [W4] OPEN
  • K48 [W8] OPEN · K49 [W8] DONE · K50 [W8] OPEN · K51 [W8] OPEN (=C19)
  • K52 [W7] OPEN · K53 [W7] OPEN · K54 [W7] OPEN · K55 [W7] OPEN · K56 [W7] OPEN
  • K57 [W1/W9] OPEN · K58 [W9] OPEN · K59 [W9] OPEN · K60 [W9] OPEN
  • K61 [W10] OPEN · K62 [W10] OPEN · K63 [W6] OPEN · K64 [W6/W7] OPEN — char =
  • K65 [W6] OPEN · K66 [W6] OPEN · K67 [W6] OPEN · K68 [W6] OPEN · K69 [W6] OPEN
  • K70 [W5] OPEN · K71 [W5] OPEN · K72 [W5] OPEN · K73 [W15] DONE
  • K74 [W2] OPEN (component &key false→nil; R5) · K75 [W2] OPEN (trailing kw; R5)
  • K76 [W5] OPEN · K77 [W5] OPEN · K78 [W4] OPEN · K79 [W4] OPEN · K80 [W4] OPEN · K81 [W4] OPEN
  • K82 [W8] OPEN · K83 [W8] OPEN · K84 [W8] OPEN · K85 [W7] OPEN · K86 [W7] OPEN · K87 [W7/W8] OPEN
  • K88 [W7] OPEN · K89 [W7] OPEN — keys order, GATED R29 (breaks render tests, see RULINGS note)
  • K90 [W7] OPEN · K91 [W7] OPEN · K92 [W7] OPEN — apply spread
  • K93 [W9] OPEN · K94 [W9] OPEN · K95 [W9] OPEN · K96 [W9] OPEN · K97 [W9] OPEN
  • K98 [W10] OPEN · K99 [W10] OPEN · K100 [W6] OPEN · K101 [W6] OPEN · K102 [W6] OPEN · K103 [W6] OPEN
  • K104 [W14] OPEN · K105 [W15] DONE
  • K106 [W1] OPEN (SUSPECTED nested-eval boundaries) · K107 [W2] OPEN (SUSPECTED)
  • K108 [W6] OPEN (SUSPECTED CID nondeterminism) · K109 [W10] OPEN (SUSPECTED) · K110 [W9/W11] OPEN (SUSPECTED)

Hosts — JIT (J1J12)

  • J1 [W11] DEFERRED (mitigated: JIT gated off) · J2 [W11] DEFERRED · J3 [W11] DEFERRED
  • J4 [W11] DEFERRED · J5 [W11] DEFERRED · J6 [W11] DEFERRED · J7 [W11/W4] DEFERRED
  • J8 [W2] OPEN dup→K07 · J9 [W11/W14] DEFERRED · J10 [W11] DEFERRED · J11 [W11] DEFERRED
  • J12 POSITIVE (no action — perform/resume verified fixed)

Hosts — kernel/protocol/build (C*)

  • C0a [W13] GATE(D1) · C0b [W13/W14] GATE(D1) · C1 [W3] DONE · C1b [W3] DONE
  • C2 [W15] OPEN · C3 [W14] OPEN · C4 [W14] OPEN · C5 [W14] OPEN · C6 [W14] OPEN · C7 [W14] OPEN
  • C8 [W15] OPEN · C9 [W14] OPEN · C10 [W11] DEFERRED · C11 [W11] DEFERRED · C12 [W11/W15] OPEN
  • C13 [W15] OPEN · C14 [W11/W15] OPEN · C15 [W15] OPEN · C16 [W15] OPEN · C17 [W15] OPEN · C18 [W15] OPEN
  • C19 [W8] OPEN dup→K51 · C20 [W8] OPEN · C21 [W14] OPEN · C22 [W14] OPEN · C23 [W14] OPEN
  • C24 [W12] PARTIAL · C25 [W6] OPEN · C26 [W6] OPEN · C27 [W6/W7] OPEN dup→P9
  • C28 [W12] OPEN · C29 [W12] OPEN · C30 [W12] GATE(D1) · C31 [W12] OPEN

Hosts — JS host (JS1JS8)

  • JS1JS8 [W13] all GATE(D1) — delete if JS retired, else ~2500-test revival

Hosts — cross-host parity (P1P12, PY)

  • P1 [W7] OPEN · P2 [W7] OPEN · P3 [W7] OPEN · P4 [W7] OPEN · P5 [W7] OPEN · P6 [W7] OPEN
  • P7 [W7] GATE(D1) · P8 [W7] OPEN · P9 [W6/W7] OPEN (=C27) · P10 [W7] OPEN · P11 [W7] OPEN · P12 [W7] OPEN
  • PY [W13] GATE(D1) dup→C30

Hosts — HTTP/suspected (S1S14, S-bridge*)

  • S1 [W3] OPEN (LIVE CRASH) · S2 [W3/W2] OPEN · S3 [W3] OPEN · S4 [W3] DONE · S5 [W3] OPEN
  • S6 [W14] OPEN · S7 [W14/W1] OPEN (unify eval/IO paths) · S8 [W13/W8] OPEN (browser env prims)
  • S9 [W8/W11] OPEN · S10 [W1] OPEN · S11 [W3] OPEN · S12 [W3] OPEN · S13 [W3] OPEN · S14 [W8] OPEN
  • S-bridge [W12] OPEN · S-bridge2 [W12] OPEN

Conformance (F1F15, conf-S1S5)

  • F1 [W7] OPEN dup→K18/P4 (WASM int wrap) · F2 [W14] OPEN · F3 [W7/W6] OPEN (apply + dict order) · F4 [W13/W14] GATE(D1)
  • F5 [W14] OPEN (host-neutral corpus) · F6 [W14] OPEN (directories one-host-gated) · F7 [W14] OPEN dup→K42
  • F8 [W14] OPEN (differential battery) · F9 [W7/W14] OPEN (primitive parity) dup→K53 · F10 [W14] OPEN (skip hs)
  • F11 [W12] OPEN dup→C24 · F12 [W6] OPEN dup→C25/26/27 · F13 [W15] DONE · F14 [W15] PARTIAL · F15 [W15] OPEN
  • conf-S1 [W14] OPEN (native-vs-WASM web-stack diff) · conf-S2 [W14] OPEN (hyperscript unverifiable)
  • conf-S3 [W11] OPEN (import path browser vs test) · conf-S4 [W14] OPEN (float golden precision) · conf-S5 [W11] OPEN (JS build-flag ADT divergence)

Tally

~213 finding-instances. DONE: 13 (dc7aa709). PARTIAL: 4 (K19, K42, C24, F14). DEFERRED: 12 (W11 JIT). GATE(D1): ~16 (JS host + Python standalone). OPEN: the rest, distributed across W1W12/W14/W15.