Stress the compiler pipeline, not just one successful compile.
tscc's parser, AST, binder, symbol tables, type model, module graph and emitter create different lifetime pressures as the compiler grows. This page tracks repeatable leak and long-run resource evidence separately from syntax/semantic correctness, so checker growth can be compared against retained lifetime workloads rather than a one-off clean run.
The newer CP66-72 compiler paths have now been exercised through a real-binary Valgrind integration workload on Ubuntu x86-64 using Valgrind 3.26.0. Across the retained in-process corpus and 17 integration invocations, the measured result was 0 errors, 0 bytes definitely/indirectly/possibly lost, 0 still reachable and no measured TSCC file-descriptor leak. CP74-75 then fixed the correctness bugs discovered while constructing that workload.
Current phase
Checkpoint 5 compiler-lifetime baseline is complete. The finalized campaign at tscc commit 568bea7 retains the in-process/project evidence established from a05d3d8 onward; at a05d3d8, the maintained in-process corpus completed 80 ASan/LSan/UBSan iterations with no finding while repeatedly constructing and releasing lexer/parser/AST, semantic, binder, type, checker and emitter state across feature-heavy TypeScript, CommonJS, TSX, malformed inputs and success-after-failure transitions. Native lifetime evidence used 5 warm-ups plus 40 measured runs of 20 corpus iterations; RSS stayed within 4,908–5,108 KiB rather than growing monotonically. Project/module pressure also passed 8 sanitizer and 20 native rounds over a 120-file graph with a cycle, missing-module failure and immediate repair. That historical checkpoint-5 run used the then-current 519-case corpus at 492 pass / 0 fail / 27 intentional semantic skips. The current external compatibility suite is now 618 cases at 600 / 0 / 18; the old count is retained only as context for the lifetime measurement. Checkpoint 5B is now complete on Linux 7.0.0-29 x86-64 at tscc commit d96419e: Valgrind 3.26.0 completed 40 maintained lifetime iterations with 0 errors, 0 bytes in use at exit, and all 25,003 allocations freed. Peak Valgrind process RSS was 166,512 KiB. This closes the compiler-lifetime baseline; future checker growth should be compared against these retained workloads rather than inheriting the result indefinitely.
Planned workloads
- ASan + LeakSanitizer + UBSan over focused compiler tests and the independent regression corpus
- repeated single-file compile loops in one process where supported by the harness
- large many-file module graphs, cycles, failed resolution and recovery paths
- TSX/CommonJS transforms and semantic-checker paths with repeated success/failure alternation
- increasing symbol/type/AST pressure fixtures to identify retained graph state
- Valgrind confirmation for focused Linux workloads plus RSS/heap trends for long soaks
Acceptance rule
Zero maintained-workload leak findings, no lifetime sanitizer errors, and no unexplained monotonic growth after compiler state should have been released. Performance optimizations are not accepted if they silently trade latency for unbounded retained state.
Checkpoint plan
- establish compiler/sanitizer baseline before the checker broadens further;
- stress parser/AST/emitter lifetimes;
- stress binder/symbol/type-model allocation and teardown;
- exercise project/module graph creation, cycles, failures and repeated recompilation;
- run the independent regression corpus under leak instrumentation;
- cross-check focused cases under Valgrind and minimize any failures;
- promote the stable campaign into release/readiness gates and maintain results on this page.
See Battle tested for correctness evidence and Roadmap for the broader compiler development sequence.