Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
cb6a8fd
docs: typechecker-branch commit regime — agent commits permitted on t…
ryanatkn Jul 10, 2026
4f29291
feat: tsc_conformance query tool over tsgo baselines
ryanatkn Jul 10, 2026
e16d9a7
feat: tsc_conformance errors.txt parser + renderer + roundtrip self-c…
ryanatkn Jul 10, 2026
32e8554
docs: tsc_conformance CLAUDE.md catalog entry
ryanatkn Jul 10, 2026
fb319a4
test: tsc_conformance renderer standalone-model tests
ryanatkn Jul 10, 2026
39ef63a
fix: recover nested related-info message chains in tsc_conformance (7…
ryanatkn Jul 10, 2026
db6a4d0
feat: gate tsc_conformance roundtrip in deno task conformance + publi…
ryanatkn Jul 10, 2026
9fce715
feat: carve the 14 pretty baselines out of tsc_conformance roundtrip …
ryanatkn Jul 10, 2026
7c2aa11
docs: tsc_conformance roundtrip pretty carve-out (in-scope 100%)
ryanatkn Jul 10, 2026
f521ae8
feat: pretty/ANSI tsc_conformance baseline path — roundtrip 7033/7033…
ryanatkn Jul 10, 2026
70c6f50
feat: tsc_conformance index — corpus/directives/variants substrate, 3…
ryanatkn Jul 10, 2026
f373ed0
test: pretty-path standalone render tests for unexercised branches + …
ryanatkn Jul 10, 2026
04556ca
fix: index gate 2 positional (name,body) via ported section-name reso…
ryanatkn Jul 10, 2026
a3aebdf
feat: mint tsv_check — pipeline skeleton, diag sort/dedup ports, fuse…
ryanatkn Jul 10, 2026
3616fa2
feat: bind-time conflict family — declareSymbolEx cascade, Excludes m…
ryanatkn Jul 10, 2026
2a99547
feat: globals merge — reportMergeSymbolError path, TS2397/TS2664 clos…
ryanatkn Jul 10, 2026
ac73942
fix: merge related-info model (fresh primary per merge, all-6203 unca…
ryanatkn Jul 10, 2026
595a400
Merge branch 'main' into typechecker
ryanatkn Jul 10, 2026
4da82ee
feat: lib binding — LibBase per resolved set, cached bound lib produc…
ryanatkn Jul 10, 2026
011a908
feat: conformance:tsc-check gating leg — runner filters/manifest/repo…
ryanatkn Jul 10, 2026
b1c8f9e
format
ryanatkn Jul 10, 2026
29aa1b2
docs: sweep repo docs for tsv_check/tsc_conformance reality — crate m…
ryanatkn Jul 10, 2026
f9d65a4
test: cover unpinned tsc_conformance runner paths — triage filters, r…
ryanatkn Jul 11, 2026
36c791e
chore: clippy semicolon lints in binder sym.rs
ryanatkn Jul 11, 2026
1554d36
feat: gate the lib external-no-globals invariant as a zero-gate lib c…
ryanatkn Jul 11, 2026
c5f8a64
feat: manifest filtered-flag, deeper corpus probe, single lib disk re…
ryanatkn Jul 11, 2026
bfa4888
chore: sort lib parse-error/missing-file triage lists for determinist…
ryanatkn Jul 11, 2026
9fbdb59
docs: describe the landed family/lib gates in harness comments and ru…
ryanatkn Jul 11, 2026
1d2d113
feat: bind signature params, object-literal methods, dotted-namespace…
ryanatkn Jul 11, 2026
f01a24f
feat: check-time duplicate-member pass (checkObjectTypeForDuplicateDe…
ryanatkn Jul 11, 2026
ef2bf06
feat: checkTypeParameters + honest deferred-late-bound split (family …
ryanatkn Jul 11, 2026
44635be
chore: cover octal/separator numeric keys; refresh dated missing-buck…
ryanatkn Jul 11, 2026
ea2f30e
docs: add the check module + check-time family to the tsv_check crate…
ryanatkn Jul 11, 2026
824383c
fix: bracket-inclusive computed-key spans (closes latent extra) + her…
ryanatkn Jul 11, 2026
1bb8e47
docs: note the check pass now descends heritage/decorator/template-li…
ryanatkn Jul 11, 2026
4da0c27
docs: flag the deferred general bind-side type descent at bind_type (…
ryanatkn Jul 11, 2026
df88bcf
feat: full expression+type descent in the binder SoA walk (+ node_fla…
ryanatkn Jul 11, 2026
a75d830
fix: descend class type parameters in the binder SoA walk (both decl …
ryanatkn Jul 11, 2026
8cd9304
feat: flow-graph SoA substrate + linear/unreachable construction + ch…
ryanatkn Jul 11, 2026
7191ad9
fix: char-boundary-safe --dump-flow truncation + pin the method-addre…
ryanatkn Jul 11, 2026
58306e2
feat: flow-graph branching constructs (conditions, if, loops, break/c…
ryanatkn Jul 11, 2026
90612b3
fix: reset condition targets at value sub-positions so nested logical…
ryanatkn Jul 11, 2026
3ee6250
feat: switch flow topology (clauses reachable from the head + (0,0) e…
ryanatkn Jul 11, 2026
1bac3ca
test: cover non-narrowing switch + default-present sentinel absence (…
ryanatkn Jul 11, 2026
d11695d
feat: flow landmines — try/finally ReduceLabels, IIFE inlining, initi…
ryanatkn Jul 11, 2026
fbaf5f4
fix: fork the catch parameter's destructuring default (bind_binding_t…
ryanatkn Jul 11, 2026
9fa6a51
feat: TS7027/TS7028 unreachable-code + unused-label shim + tsv_check …
ryanatkn Jul 11, 2026
441137f
fix: bare export{} -> NonInstantiated (close false-extra) + suggestio…
ryanatkn Jul 11, 2026
6a291eb
feat: flip the flow family gate — TS7027/7028 release-gating (match 3…
ryanatkn Jul 11, 2026
a4326d0
docs: note cfa in the honest-residual gate comment (F4 review)
ryanatkn Jul 11, 2026
dff5adb
docs: complete tsv_check module map (binder/flow.rs third walk + opti…
ryanatkn Jul 11, 2026
4a26c87
fix: key tsv_check address map on (address, NodeKind) — resolves meth…
ryanatkn Jul 11, 2026
5cbc861
fix: private-name TS2300 display carries the # — closes bind/check la…
ryanatkn Jul 11, 2026
0bb3433
refactor: borrow in check_bound (merges/paths) + code-aware conforman…
ryanatkn Jul 11, 2026
52f5b91
refactor: dedup class/fn descent helpers + drop dead flow/lib accesso…
ryanatkn Jul 11, 2026
9036050
fix: hoist address_map insert out of debug_assert (release-elision re…
ryanatkn Jul 11, 2026
3a9519e
fix: mint CALL flow nodes for comma (SequenceExpression) operands — t…
ryanatkn Jul 11, 2026
81cca34
fix: bind logical-compound-assign RHS top-level, not threaded — tsgo …
ryanatkn Jul 11, 2026
2537837
test: pin ??=/nested compound-assign RHS top-level flow shapes + fix …
ryanatkn Jul 12, 2026
0735fe5
docs: fix tsv_check doc drift — per-file atoms, two-walk binder, Comp…
ryanatkn Jul 12, 2026
016675b
refactor: collapse dead BoundFile.node_flags into FlowProduct + share…
ryanatkn Jul 12, 2026
bbd2c53
feat: zero-alloc flow antecedent read-API (single_antecedent + borrow…
ryanatkn Jul 12, 2026
e93358b
feat: wire obj-literal/class-expr method flow-write + Start.Node subj…
ryanatkn Jul 12, 2026
69a6bf9
refactor: keyed MissingCause classification + FAMILIES descriptor tab…
ryanatkn Jul 12, 2026
b332d62
feat: profile --bind --flow-stats deterministic anchors + tsc_conform…
ryanatkn Jul 12, 2026
4b86c4c
Merge branch 'main' into typechecker
ryanatkn Jul 12, 2026
a62c8ad
refactor: split tsv_check binder flow.rs into flow/ directory-module
ryanatkn Jul 12, 2026
afa5bab
refactor: split tsc_conformance runner.rs into runner/ directory-module
ryanatkn Jul 12, 2026
ebb1be5
refactor: extract tsv_check binder SoA visitors into lower/ submodule
ryanatkn Jul 12, 2026
1dd9c28
refactor: split tsv_check binder sym.rs into sym/ directory-module
ryanatkn Jul 12, 2026
f018494
refactor: decompose tsv_check SoaWalk::visit_expression into per-arm …
ryanatkn Jul 12, 2026
f55441a
refactor: decompose tsv_check SymbolBinder::visit_statement into per-…
ryanatkn Jul 12, 2026
ae79195
refactor: decompose tsv_check FlowBuilder::visit_expression into per-…
ryanatkn Jul 12, 2026
6840296
Merge branch 'main' into typechecker
ryanatkn Jul 12, 2026
450a5da
Merge branch 'main' into typechecker
ryanatkn Jul 12, 2026
3d6db63
refactor: split tsv_check binder flow/build.rs into build/ directory-…
ryanatkn Jul 13, 2026
0671f72
refactor: split tsv_check binder sym/walk.rs into statement/expressio…
ryanatkn Jul 13, 2026
63b0873
merge main
ryanatkn Jul 15, 2026
62166b3
Merge branch 'main' into typechecker
ryanatkn Jul 16, 2026
ce4816f
Merge branch 'main' into typechecker
ryanatkn Jul 18, 2026
63a65b8
Merge branch 'main' into typechecker
ryanatkn Jul 18, 2026
4a2ade7
merge main
ryanatkn Jul 18, 2026
ede481e
Merge branch 'main' into typechecker
ryanatkn Jul 20, 2026
b583c28
Merge branch 'main' into typechecker
ryanatkn Jul 20, 2026
d75bc2e
Merge branch 'main' into typechecker
ryanatkn Jul 20, 2026
e19abb7
merge main
ryanatkn Jul 20, 2026
e8b1d32
Merge branch 'main' into typechecker
ryanatkn Jul 20, 2026
6225f75
Merge branch 'main' into typechecker
ryanatkn Jul 20, 2026
d970ca6
Merge branch 'main' into typechecker
ryanatkn Jul 21, 2026
3e7a0f3
Merge branch 'main' into typechecker
ryanatkn Jul 21, 2026
527d22b
Merge branch 'main' into typechecker
ryanatkn Jul 21, 2026
dcea2f6
Merge branch 'main' into typechecker
ryanatkn Jul 21, 2026
fd2bb16
merge main
ryanatkn Jul 22, 2026
98dd175
pin status
ryanatkn Jul 22, 2026
3a32adc
Merge branch 'main' into typechecker
ryanatkn Jul 23, 2026
336a54e
Merge branch 'main' into typechecker
ryanatkn Jul 25, 2026
9902253
Merge branch 'main' into typechecker
ryanatkn Jul 25, 2026
b80ea11
Merge branch 'main' into typechecker
ryanatkn Jul 27, 2026
892d23f
merge
ryanatkn Jul 28, 2026
97248d5
refactor: fold tsv_check hash onto tsv_lang, enforce clone discipline
ryanatkn Jul 28, 2026
98ac207
Merge branch 'main' into typechecker
ryanatkn Jul 28, 2026
cb3d3e7
fix claude.md
ryanatkn Jul 28, 2026
97e660a
refactor
ryanatkn Jul 28, 2026
6af545d
refactor
ryanatkn Jul 28, 2026
7e98d46
docs
ryanatkn Jul 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ node_modules
!/benches/js/results/report.conformance.bun.md
!/benches/js/results/report.json
!/benches/js/results/report.md
!/benches/js/results/report.tsc-conformance.json
!/benches/js/results/report.tsc-conformance.md

# Env
.env*
Expand Down
36 changes: 28 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ cargo run -p tsv_cli format --content '<div>x</div>' --parser svelte # forma

```bash
deno task check # full committed-tree gate: fmt, audits, typecheck, tests, clippy (benches/js/CLAUDE.md §Gate map)
deno task doctor # one-pass setup check: runtimes, canonical pins + checkout alignment, node_modules freshness, oracle checkouts, corpus entries, build artifacts. Exit 1 only on MISLEADING state (pin drift, skew, stale deps); absences are warnings (--strict promotes warnings to failures)
deno task doctor # one-pass setup check: runtimes, canonical pins + checkout alignment, node_modules freshness, oracle checkouts, corpus entries, build artifacts. Exit 1 only on MISLEADING state (pin drift, skew, stale deps); absences are warnings (--strict promotes warnings to failures) — except in the explicitly optional experimental-typechecker tier, whose absences are informational at any strictness (a BROKEN checkout there still warns)
deno task typecheck # cargo check
deno task test # cargo test
deno task lint # cargo clippy
Expand Down Expand Up @@ -331,11 +331,11 @@ deno task conformance:ts-repo # tsv's TS parser vs the tsc corpus (../t

# The three gates above accept: -v, --json, <subtree>.

deno task conformance # the pre-release aggregate: the three gates above + corpus:compare:parse
# --all + corpus:compare:format --all, in ONE process (benches/js/conformance.ts; oracle modules load
# once, fail-fast, corpus FFI built once), then render:audit over the version-pinned checkouts (a
# subprocess — it drives its own sidecar). The external-oracle correctness gates that can't live in
# `deno task check`. The format leg's prettier calls ride a content-addressed cache
deno task conformance # the pre-release aggregate: the three gates above +
# corpus:compare:parse --all + corpus:compare:format --all, in ONE process (benches/js/conformance.ts;
# oracle modules load once, fail-fast, corpus FFI built once), then render:audit over the version-pinned
# checkouts (a subprocess — it drives its own sidecar). The external-oracle correctness gates that
# can't live in `deno task check`. The format leg's prettier calls ride a content-addressed cache
# (benches/js/lib/prettier_cache.ts; TSV_PRETTIER_CACHE=0 disables).

deno task conformance:test262 # tsv's JS parser vs test262 POSITIVES (pure Rust, `test262 --gate`);
Expand Down Expand Up @@ -514,6 +514,7 @@ tsv/
│ ├── tsv_css/ # CSS: parse(), format(), convert_ast_json_bytes()
│ ├── tsv_svelte/ # Svelte: parse(), format(), convert_ast_json_bytes()
│ ├── tsv_svelte_compile/ # Svelte→JS compiler (Svelte's compile() oracle) + JS canonicalizer (intent-erased reprint); consumed by tsv_debug — no shipped artifact links it
│ ├── tsv_check/ # EXPERIMENTAL TypeScript binder + checker — may never ship (tsgo-conformance target; consumed only by tsv_debug — no shipped artifact links it)
│ ├── tsv_cli/ # Production CLI (binary: tsv) - pure Rust
│ ├── tsv_debug/ # Dev utilities (binary: tsv_debug) - uses Deno
│ ├── tsv_ffi/ # C FFI bindings (Deno's native path)
Expand Down Expand Up @@ -867,10 +868,28 @@ cargo run -p tsv_debug test262 language/expressions # filter by path pattern

See ./docs/conformance_test262.md (command interface; §Differential for the tsv-vs-oxc comparison).

**Typechecker conformance (`tsc_conformance`) — EXPERIMENTAL, may never ship.**
`tsv_check` is a from-scratch TypeScript binder + checker in development; no shipped
artifact links it (`cargo tree -i tsv_check` → only `tsv_debug`), and the parser and
formatter are never modified in service of it. `tsv_debug tsc_conformance` grades it
against tsgo's committed `.errors.txt` baselines (`../typescript-go`, pin `168e7015`),
surfaced as **on-demand** tasks:

```bash
deno task conformance:tsc-roundtrip # baseline parse → re-render → byte-compare (zero checker code)
deno task conformance:tsc-check # the tsv_check conformance sweep + committed report
deno task conformance:tsc-check:update # re-pin the run's snapshot counts after deliberate drift
```

None is in `deno task check`, in `deno task conformance`, or release-gating, and
`../typescript-go` is not a release-required oracle — until the typechecker ships, no
ordinary dev or release flow pays for it. Full reference: ./docs/typechecker.md.

**Performance Profiling Commands** (all pure Rust, no Deno — full reference: ./docs/performance.md):

```bash
cargo run -p tsv_debug profile ~/dev/zzz/src/lib # parse vs format phase timing (--iterations, --json)
cargo run -p tsv_debug profile --bind ~/dev/zzz/src # parse vs lower+bind timing (TS-only) + peak RSS (§1)
cargo run --release -p tsv_debug -- json_profile ~/dev/zzz/src/lib # FFI parse path: parse vs the wire-JSON write (§2)
cargo run -p tsv_debug buffer_sizes ~/dev/zzz/src ~/dev/gro/src # printer SmallVec sizing histograms (§8)
cargo run -p tsv_debug arena_stats ~/dev/zzz/src/lib # DocArena node-population + memory audit (§7; --reuse, --list-errors)
Expand Down Expand Up @@ -1059,13 +1078,13 @@ cases; prettier, oxfmt and biome all get the JSDoc-cast paren binding wrong —
### Rust Crates (minimal deps)

- `serde_json` — wire-JSON emission: the writer's exact string-escape / `f64` formatting, and reparsing bytes to a `Value` (CLI `--pretty`, tests). The language crates no longer depend on `serde` directly (only transitively, without its `derive`); `serde`'s derive is dev-tooling only (`tsv_debug` / `tsv_cli`)
- `smallvec` — Stack-allocated vectors
- `smallvec` — Stack-allocated vectors (printers + `tsv_check`)
- `thiserror` — Error type derivation
- `phf` — Compile-time perfect hash maps (keywords, entities)
- `unicode-ident` — Unicode XID_Start/XID_Continue for identifiers
- `unicode-segmentation` — Grapheme clustering for visual width measurement
- `unicode-width` — Character display width (CJK, zero-width)
- `bumpalo` — Bump arena for the internal AST (and, via the `tsv_arena` crate, the bindings' per-thread `reset()` reuse — `tsv_ffi`/`tsv_napi`/`tsv_wasm`)
- `bumpalo` — Bump arena for the internal AST (and, via the `tsv_arena` crate, the bindings' per-thread `reset()` reuse — `tsv_ffi`/`tsv_napi`/`tsv_wasm`; `tsv_check`'s caller-owned check arenas follow the same contract)
- `talc` — WASM global allocator (`tsv_wasm` only, wasm32-only target dep): pure-Rust `no_std` allocator replacing std's default dlmalloc; the `WasmGrowAndExtend` source keeps the warm instance's linear-memory high-water at dlmalloc parity. Pulls `lock_api` + `allocator-api2` (+ `scopeguard`) into the wasm32 graph only; native builds unaffected
- `napi` / `napi-derive` / `napi-build` — N-API bindings for `tsv_napi` (Node/Bun native addon; tsv-scoped carve-out)

Expand Down Expand Up @@ -1111,6 +1130,7 @@ formatting behavior. Key files: `src/language-js/print/assignment.js` (assignmen
- ./docs/comments.md - the detached comment model: ownership, the three axes, hazards, emitters
- ./docs/compile_tooling.md - the sidecar-dependent compiler harnesses: corpus compare, compile fuzz, erase census
- ./docs/compile_validation_ratchet.md - the validation-suite ratchet: snapshot, kinds, verdict, triage
- ./docs/typechecker.md - the experimental `tsv_check` typechecker (may never ship) + its on-demand tsgo-conformance harness
- ./docs/performance.md - profiling methodology, tooling, and results tracking
- ./docs/workflow_corpus.md - corpus-driven formatting conformance workflow
- ./docs/workflow_test262.md - test262 conformance workflow
Expand Down
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ members = [
"crates/tsv_css",
"crates/tsv_svelte",
"crates/tsv_svelte_compile",
"crates/tsv_check",
"crates/tsv_cli",
"crates/tsv_debug",
"crates/tsv_wasm",
Expand Down Expand Up @@ -49,6 +50,11 @@ tsv_svelte = { path = "crates/tsv_svelte", default-features = false }
# no shipped artifact links it yet.
tsv_svelte_compile = { path = "crates/tsv_svelte_compile" }

# Experimental TypeScript type-checking. A consumer crate of tsv_ts's concrete
# types; referenced only by the tsv_debug harness so it never touches the
# shipped format/parse artifacts (a crate-boundary zero-cost exclusion).
tsv_check = { path = "crates/tsv_check" }

# External dependencies
argh = "0.1"
# N-API (Node.js/Bun) bindings — the native path for the `tsv_napi` crate, the
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ Future features (unknown order):
- svelte-check replacement
- LSP
- linter - type aware, initially focused on serializable data-only plugins for extensibility
- includes an experimental first-party typechecker `tsv_check` (which may never ship)
- bundling is probably out of scope
- [discussion](https://github.com/fuzdev/tsv/discussions) welcome

Expand Down Expand Up @@ -260,6 +261,7 @@ tsv/
│ ├── tsv_ts/ # TypeScript parser/formatter (standalone)
│ ├── tsv_css/ # CSS parser/formatter (standalone)
│ ├── tsv_svelte/ # Svelte parser/formatter (uses tsv_ts + tsv_css)
│ ├── tsv_check/ # experimental TypeScript binder/checker (may never ship; not in any shipped artifact)
│ ├── tsv_cli/ # unified CLI (binary: `tsv`)
│ ├── tsv_debug/ # dev utilities (binary: `tsv_debug`, uses Deno)
│ ├── tsv_ffi/ # C FFI bindings
Expand Down
45 changes: 30 additions & 15 deletions benches/js/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -454,23 +454,27 @@ green-skipping (the baselines are the oracle; publish Step 3b's probe is the
tolerance point). Full-corpus runs freshness-check `KNOWN_GAPS` (stale entries fail).

**Pre-release aggregate — `deno task conformance` (+ `conformance:test262` = `conformance:all`).** The three parse-conformance
gates (svelte-fixtures, ts-fixtures, ts-repo), plus
`corpus:compare:parse --all` and `corpus:compare:format --all`, are the
release-cadence correctness gates that run against external JS oracles (and so can't
live in `deno task check`). `deno task conformance:all` runs the pure-Rust **test262
gates (svelte-fixtures, ts-fixtures, ts-repo), plus `corpus:compare:parse --all`
and `corpus:compare:format --all`, are the release-cadence correctness gates that
run against external oracles (and so can't live in `deno task check`). The
typechecker's `tsc_conformance` tasks are deliberately NOT legs here — `tsv_check`
is experimental and may never ship, so its gates stay on-demand (see
../../docs/typechecker.md). `deno task conformance:all` runs the pure-Rust **test262
positive gate** FIRST (`conformance:test262` — `tsv_debug test262 --gate`, gating the
exact positive-pass count; the ~2.5k negatives are the deferred early-error frontier,
reported not gated), THEN the aggregate — fail-fast, so a positive-parse regression
trips the ~1-min gate before the multi-minute FFI legs run. That superset is what
publish Step 3b runs. `deno task conformance` builds the corpus FFI once and
runs all five legs in **ONE process** (`conformance.ts`, the driver): the canonical
runs all six legs in **ONE process** (`conformance.ts`, the driver): the canonical
oracle modules (prettier, the svelte plugin, svelte/compiler, acorn, acorn-ts) load
once via the module cache instead of once per leg, each leg gets a timing line, and
failure semantics match a `&&` chain exactly (every leg exits the process on a
finding — fail-fast). The driver takes no arguments; the per-leg tasks remain the
scoped/triage entries. `conformance:all` is wired into `scripts/publish.ts` **Step 3b**
(skipped by `--no-check`). Step 3b preflights the oracles (`../svelte`,
`../acorn-typescript`, `../typescript`, `../test262`, this dir's `node_modules`): a missing one
once via the module cache instead of once per leg (`render:audit`, the lone non-JS
leg, is a `cargo` subprocess — which is why the task carries `--allow-run=cargo`),
each leg gets a timing line, and failure semantics match a `&&` chain exactly
(every leg exits the process on a finding — fail-fast). The driver takes no
arguments; the per-leg tasks remain the scoped/triage entries. `conformance:all`
is wired into `scripts/publish.ts` **Step 3b** (skipped by `--no-check`). Step 3b
preflights the oracles (`../svelte`, `../acorn-typescript`, `../typescript`,
`../test262`, this dir's `node_modules`): a missing one
**FAILS a `--wetrun`** (only the explicit `--no-check` releases without gates),
warn-and-skips a dry-run, and any skip is re-warned in the run's final summary.
The gates themselves fail closed on a missing checkout (0 scanned = FAIL), so a
Expand Down Expand Up @@ -510,6 +514,17 @@ every real move in a number is a deliberate, visible edit.
test262 (discovered + graded-manifest), `fixtures_validate` (total fixtures —
protects the primary gate against a discovery collapse), and `swallow_audit`
(formatted files — closes its vacuous-pass).
- `tsc_conformance` (the largest set) splits its pins by what they mean, and
gates the ON-DEMAND experimental-typechecker tasks, not a release leg. The
drifting tsv-side counts (denominators, parse-divergence census, family
partitions, carve-outs) live in the machine-regenerated snapshot
`crates/tsv_debug/src/cli/commands/tsc_conformance_pins.txt`, rewritten by
`deno task conformance:tsc-check:update`. The oracle-side pins
(baseline/roundtrip/pretty + the `INDEX_*` denominators) and the
semantically-zero invariant gates stay hand-edited consts in
`cli/commands/tsc_conformance/pins.rs`; the crash-exclusion count sits beside its
ledger in `tsc_conformance/runner/grade.rs`. Re-pin ritual:
../../docs/typechecker.md.

**Semantics — three pin categories, chosen per surface:**

Expand Down Expand Up @@ -793,9 +808,9 @@ deno task bench:deno:run -- --compare-baseline # Compare against saved baseline

# Wipe local-only bench state (gitignored): baseline.json, timestamped
# results pairs, and the harvest caches (benches/js/.cache). Preserves the
# committed `report.<runtime>.{json,md}` / `report.conformance.node.*`
# because the glob is anchored on a leading digit (timestamped files start
# with a year).
# committed `report.<runtime>.{json,md}` / `report.conformance.node.*` /
# `report.tsc-conformance.{json,md}` because the glob is anchored on a
# leading digit (timestamped files start with a year).
deno task bench:clean

# Environment variables (apply to any runtime's :run)
Expand Down Expand Up @@ -1232,7 +1247,7 @@ benches/js/
├── install_deps.ts # `bench:install`: npm install + force-fetch the oxc wasi binding
├── harvest_test262.ts # `bench:harvest:test262`: graded positives → .cache/test262_files.json (Deno-only)
├── bench.ts # Benchmark entry point (runtime-neutral — runs under Deno AND Node)
├── conformance.ts # Single-process pre-release aggregate driver (deno task conformance): all five legs, one module cache
├── conformance.ts # Single-process pre-release aggregate driver (deno task conformance): all six legs, one module cache
├── smoke.ts # Smoke test for formatters and parsers (runtime-neutral: smoke / smoke:node / smoke:bun)
├── compose_reports.ts # Fold report.{deno,node,bun}.json → combined report.{json,md} (bench:compose)
├── idempotency_sweep.ts # F1 sweep over the `perf` corpus view — format(format(x)) == format(x) on real code (deno task idempotency:sweep; drives tsv_debug `fuzz --iterations 0`)
Expand Down
104 changes: 104 additions & 0 deletions benches/js/results/report.tsc-conformance.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

51 changes: 51 additions & 0 deletions benches/js/results/report.tsc-conformance.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading