All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
No breaking syntax changes will be made after this release in the 2.x series.
Five language design questions were locked permanently on 2026-07-26:
| Decision | Resolution |
|---|---|
compat/ handling |
examples/compat/ kept permanently; each file gets # LEGACY COMPAT TEST header |
| Stdlib call style | Qualified (math.abs(), json.parse()); implicit only for true built-ins (say, ask, env, file) |
| Null literal | null is canonical; none is deprecated alias → TSW1011 |
| Loop semantics | loop N = counted (runs exactly N times); repeat cond = while (runs while condition is true) |
| String interpolation | $"..." is canonical; f"..." is deprecated alias → TSW1012 |
Looptoken variant — new canonical keywordloopfor counted loops (loop N)Paralleltoken variant — new canonical keywordparallelfor parallel blocksDefaulttoken variant — new canonical keyworddefaultfor match default arms- Full TSW error code namespace — TSW1001–TSW1014, TSW2001–TSW2002, TSI3001 all defined
docs/engineering/LANGUAGE_FREEZE_2.0.md— permanent freeze declaration document- Expanded semantic analysis — 10 canonical rules now formally documented in
10_semantic_analysis.md - Full grammar expansion —
03_grammar_ebnf.mdupdated with lambda, bitwise ops, DSL, parallel,$"...",loop, and complete operator precedence
token_kind.rs— inverted canonical/deprecated classification:- Canonical 2.0 (no warning):
do,send,when,loop,repeat,for,in,match,case,default,try,catch,throw,use,class,struct,enum,trait,interface,const,null,say,ask,break,continue,else,async,await,parallel,end,export,new,self,true,false,typeof,with - Deprecated Alias (emit TSW):
build,make,return,model,if,elif,while,import,from,let,var,fun,function,attempt,none,keep,give,stop,skip,each,switch,be,equals,then
- Canonical 2.0 (no warning):
errors/src/lib.rs— E0104 description updated to "Expectedendto close block"to_canonical()— inverted: now mapsBuild→Do,Return→Send,If→When,While→Repeat,Model→Class,Import/From→Use, etc.is_canonical_keyword()— updated to reflect 2.0 canonical setis_alias_keyword()— updated to reflect 2.0 deprecated setis_future_reserved_keyword()— narrowed to onlyType,Yield,Spawn,Pub,MutFStringStart.static_lexeme()— changed fromf"to$"(canonical)
docs/engineering/01_language_spec_v1.md— full rewrite; all canonical keywords correctdocs/engineering/03_grammar_ebnf.md— expanded with all missing grammar rulesdocs/engineering/10_semantic_analysis.md— expanded with 10 canonical semantic rulesdocs/engineering/14_error_codes.md— full TSW namespace documenteddocs/StyleGuide.md— full rewrite withtsc fmtspecificationdocs/MigrationGuide.md— rewritten as 1.0.8 → 2.0 guidedocs/LanguageGuide.md— updated with$"...",loop,parallel,nullexamplesREADME.md— hero example updated to canonical 2.0 syntax
examples/compat/files — added# LEGACY COMPAT TESTheader to each file
The following keywords, previously documented as canonical in some docs, are now officially deprecated and will emit warnings:
build, make, let, var, return, give, if, elif, while,
import, from, each, attempt, model, none, f"...", keep,
stop, skip, switch, then, be, equals
These keywords continue to compile in the 2.x series. They are never removed —
only deprecated. Run tsc migrate . to auto-convert.
- Created 17 Cargo workspace member crates, covering the entire compiler, runtime, and tools stack.
- Unified common types (
Span,NodeId,Ident) inside thetechscript_commoncrate. - Unified syntax constants, keyword lists, tokens, and operator precedence levels inside the
techscript_syntaxcrate. - Scaffolding skeleton for all remaining modules: AST, Lexer, Parser, Errors, Semantic Analyzer, Interpreter, VM, GC, Builtins, Stdlib, CLI, LSP, Formatter, Linter, and Package Manager.
- Established default placeholder unit tests and example entry points.
- Configured CI/CD workflows and GitHub templates.