on master help sign in
branches43compare
masterdefault58f5d8fDrop the `Nothing` special-case from Maybe `#`-arguments field-sig-the6a47b3cRemove field-sig prefix syntax; signatures are written with `the (Type)` on the value iko/pass8-audit960a19bSet without replace keyword: error on full-table write instead of silent rewrite push-rntxqrtnmopmb8cf2e5Fix 18 bugs from pass 8 static audit mainc6bd689Fix all remaining audit findings (pass 5+) fix/audit-bugs-july1435497e9Fix 22 bugs found in static audit fix/bug-audit-all-82-bugs9b33d1eremove BUGS.md — all 82 bugs verified fixed push-zqkywxmzwyvy4ef678bfix: module system — duplicate name panic, export filter drops units/impls, selective import poisoning push-oplmoxtvzxmo93910a6fix: bytesGet OOB and crypto functions abort on bad input push-plmuqqwsokqt54d018cfix: int literal overflow, relation literal dedup, nested relation field bind push-zyqyszxkllzt3f008a4fix: compiler hangs on partially-applied recursive helper in tail position (#71) push-ovkuqpslmqkn12f1538fix: stratification error blames correct cause (aggregate/diff), not always diff push-wxtrrtrwpzqta9e0bedfix: sum over empty [Float] returns Float 0.0, not Int 0 push-lwuxxolplnlm6752a47fix: SQLite NULL from ALTER TABLE ADD COLUMN now returns proper default values push-yrlupltquxtnc9476dbfix: replace *rel = if/case with comprehension branches no longer crashes push-qyumvpvukpsm527a23efix: LSP extract function/variable swallows trailing newline push-mylqzqrkurvu4f901d7fix: show appends unit suffixes for Float values with units push-qqxklpwswmmw88aa571fix: reject ambiguous trait dispatch when ADTs share constructor names push-noqloyyurzyr6b1cde3fix: formatter no-ops on comment with odd number of quotes push-nwkzuvnnrzpy412f3a3fix: deep do-blocks stack overflow — run compiler passes on large stack push-zuovrutqvyqo2d0db47fix: comprehension tail in sequential IO do-block yields all matching rows push-upwkutmqvmkk364a7fbfix: validate ADT tag parameters in HTTP routes, return 400 for unknown tags push-xrxsvpyxoyxuba16652fix: source-relation comprehension bound with <- and where filter no longer yields empty push-yyxprqyuozvm09f3628fix: when/unless guards now properly gate writes in do-blocks push-tmornynlvuqs47497effix: reject reserved column names in persisted relations at compile time push-ytrtzvxyulmufac6b72fix: split division_by_zero test into float (IEEE) and int (panic) cases push-xplslkxkukpm498d93cfix: ADT field write path uses declaring constructor column type, not first-declared push-okmvpovynvvmdbb06e1fix: sortBy/minOn/maxOn use Ord dispatcher instead of panicking on non-primitive keys push-mwrloqxwqwsw74d0a18fix: constructor Ord uses declaration order, not tag name alphabetical push-pookzovlpzlr5649bdcfix: type alias free variables skolemised as flexible, not rigid push-slvuzylwwozkf37a6e0fix: effect row soundness — defer rigid row unification with skolems intact push-lpxxxuokkyqz5c9fa48fix: shift prelude FieldPat::name_span and method name_spans to prevent inlay hint position drift (issue #4) push-mktnrsxomypx1154338fix: rename skips stale owner in open-doc scan, lets disk phase handle it push-rosxytsywwtkf46eae8fix: iterative JSON serializer to prevent stack overflow on deep nesting push-soxovttpsqryea7c95ffix: record update type inference + stale Eq/Ord constraint tests push-koynlqonmnwp2b639b6fix: update stale Eq/Ord constraint tests after structural comparison change push-nlqunpotnutqfd7c667Fix pure do-blocks returning list instead of expression type iko/fix-knot-issues59bac9fFix do-block final-expression typing, refined-type subtyping, and nested route refinements push-wtwrrwwsmtut528360cFix clippy: elide needless lifetime in format.rs find_do push-mymlvvrknylkac7ae6eFix clippy: match_like_matches_macro and collapsible_if push-qrkpyvslquyoa444d51Fix B11, B13, B14, B36, B52, B57, B60, B80: bug audit second batch iko/bughunt-batch-235acabaFix 11 bugs: Cons pattern, assoc-type Ty::Alias, lone-yield monad, sortBy/elem SQL guards, savepoint leak, Float params, LSP organize-imports/completion/methods/references iko/polymorphic-yield76425b3Make yield polymorphic for any Applicative monad
tags593
2026.9.6.134758f5d8fDrop the `Nothing` special-case from Maybe `#`-arguments 2026.9.6.12177094642Extend collection `#`-argument elements to Bytes, Uuid, enum, and refined 2026.9.3.1342c67a2b4Aggregates return one-element relations; drop obsolete docs 2026.9.2.5489078a7cAdd `#name` argument definitions — CLI-settable program parameters 2026.9.1.14350041ab6Dump uses the embedded with-block source for the declarations 2026.9.1.1316419bbb1Add a dump command: print the database state as a knot program 2026.9.1.1038376ce5aRemove the full keyword; *rel = expr handles both write forms 2026.9.1.827c50d621Generalize the run ack: the frame covers the whole query 2026.9.1.65369de742run/run1 take a Vec of &-ids acknowledging the full reads 2026.9.1.53281d59feReplace the nameOf keyword with the & sigil 2026.9.1.5137900ab4Add the column to the nameOf identity (file:line:col:name) 2026.9.1.43906a0893Add the nameOf operator: a value identity string (file:line:name) 2026.8.30.14100ddc115Suppress the full-read warning per run/run1 with a trailing comment 2026.8.30.13400351d25Use the bare function name in the full-read warning, not hard-coded base. 2026.8.30.13293a555d0Underline the whole run/run1 call in the full-read warning 2026.8.30.1210d1c8b66Name run1 in the full-read warning (it was "a direct read") 2026.8.30.11442491b4aName the function in the full-read warning 2026.8.30.1016a7f2c1aTrace the full-read warning back to the source declaration 2026.8.30.9590d8dadaRender the full-read diagnostic as a Warning, not Advice 2026.8.30.947090acfaPrefix the source name with * in the full-read advice 2026.8.30.75536f216cSimplify the full-read advice to knot terms 2026.8.30.631d9197b2Add run1: extract the single row of a one-element relation 2026.8.30.531db71514Drop the not prefix operator; not is only a function 2026.8.29.2127e688d48Allow base.not as a first-class function value 2026.8.29.2125703ecc2Allow base.not as a first-class function value 2026.8.29.16061244f8eBoolean tests return a one-element relation (Rel Bool) 2026.8.29.1533c8c1cd9Remove head, findFirst, single from the relation API 2026.8.29.1354ba31a8cScalar aggregates return a one-element relation (Rel a -> Rel <scalar>) 2026.8.29.12592efe921count returns a one-element relation (Rel a -> Rel Int) 2026.8.29.11456c40cefSet ops over a source + a literal push down to SQL 2026.8.29.837a865397Literal-relation pushdown: WHERE over a literal column + Int-typed projections 2026.8.29.807fafe1e9Push down literal relations in comprehensions (cross-join in SQL) 2026.8.28.23505e459cfType count's relation read as IO (first step of honest-IO reads) 2026.8.28.144271c9e61Single-value persistence: a bare-type source (Person *owner) 2026.8.28.1239ccb2443Sweep stale case/of syntax from DESIGN.md 2026.8.28.12190de6528Run the program on a worker thread so panics unwind, not abort 2026.8.28.10163e940e9Wrap the migration phase in one group savepoint 2026.8.28.826ad44c38More extract tests: queried relations + scalar/text corners 2026.8.28.757b4a1732Gap-separate extracted closure env + more extract tests 2026.8.28.738a544da2Register ctor decls in knot_user_main so JIT extract is self-contained 2026.8.28.631e06ad1ebase.extract test suite 2026.8.28.552612cb1eRename the do keyword to | 2026.8.28.239cdf29abRename the match keyword to ? 2026.8.28.1501d41c98Replace the serve/where keywords with a < marker 2026.8.28.49ad38c28Migration-lambda expressiveness tests 2026.8.28.4234da5d2Type-check migration lambdas after builtins are registered 2026.8.27.17311eccf2bEven more migration corner-case tests 2026.8.27.17200bd77d4Suspend constraint triggers across a migration's table swap 2026.8.27.170165febbbMore migration corner-case tests 2026.8.27.1622b63c5bbRender match as knot syntax in migration lockfiles + migration corner-case tests 2026.8.27.1601fdea9c6Extend migration child-table handling to record and ADT fields 2026.8.27.1540e95b967Fix relation-field data loss on migration 2026.8.27.1313a5c7f27Drop the residual 'using' terminology from migration diagnostics 2026.8.27.124519b14caRemove inline variants from the type grammar 2026.8.27.1243ebf1a0cRemove inline variants from the type grammar 2026.8.27.11452c4c395Push down match-on-payload-ADT-field filters as a correlated EXISTS 2026.8.27.919df6db8eRemove the dead ColType::Json storage variant 2026.8.27.6562ae2b85Migration clause is a bare lambda — drop the migrate/from/using keywords 2026.8.27.4388e77bceRename the composite pushdown guard from json to composite 2026.8.27.346bec166dFix SQL-pushdown type checks for the knot-syntax descriptor 2026.8.27.30159d7fe8Close gaps from the descriptor-format change 2026.8.26.1800a16cbdbClose three gaps: TUI descriptor parsing, rel-of-rel in records, drop _id 2026.8.26.1634437e311Schema descriptors use knot type syntax 2026.8.26.100647ff22bMigrations use 'migrate from _ using f' (drop the 'to' annotation) 2026.8.26.759a03f205Add a migration cursor so revert chains (A → B → A) are idempotent 2026.8.26.6592416eb1Error on multiple pending migrations on one source 2026.8.26.5027ced38eRemove _parent_id entirely — hashes everywhere 2026.8.26.4527ae0b2cReclaim ref children + fix the delete_where cascade for the link model 2026.8.26.403375d9b9Correct the RelRef doc comment (link/element model, not _parent_id) 2026.8.26.401c7fe218Reclaim relation-of-relations inner elements on rewrite 2026.8.26.350fdf05bfFix relation-of-relations fields (no more silent data loss) 2026.8.26.32845fad0aSupport relations nested inside ADT payload fields 2026.8.26.24607d09b4Fix relation-of-record fields under the recursive descriptor 2026.8.25.2352aabb104Store relation fields as content-addressed element + link tables 2026.8.25.1906ef089faGuard content-addressed inserts against silent hash collisions 2026.8.25.17097482304Content-address nested-record and scalar-relation fields (no JSON) 2026.8.25.131938ada69Store payload-ADT record fields as content-addressed child tables 2026.8.25.713d1326d5Round-trip payload-ADT record fields through JSON 2026.8.25.457a60557eRestrict IO-arg deferral to computation forms, not function values 2026.8.25.425a259588Defer any IO-yielding expression in argument position 2026.8.25.3378676fdbDefer Atomic in function-argument position (like Set/FullSet) 2026.8.25.214be91daaReport Int SUM i64-overflow with a clean message 2026.8.25.14392a563eCatch functions in named-ADT constructor payloads too 2026.8.24.182496d17f8Reject function/IO fields in source schemas at build time 2026.8.24.1746bf1cb00Clean up Int-storage leftovers: stale comment + dead col_sql_for_minmax 2026.8.24.1730c0898c9Document native-INTEGER Int storage; add e2e + ad-hoc verification 2026.8.24.1438bc026a6Support ADT-element sources (Rel over a variant type) 2026.8.24.1321ee33dd7Close migration gaps: stale colon-form comment + dangling committed-migration types 2026.8.24.12382aec411Type-check pending migration using-fns as Old -> New at build time 2026.8.24.111230ff681Schema-lock-owned migrations: to-only blocks, knot lock, chain baking, DB forking 2026.8.23.244bfa3de5Enforce the offside rule for newline continuations 2026.8.23.2061114655Require field type signatures to be a single-line declaration 2026.8.22.1940d945aaeMake `the` a regular type-witness function in `base` (remove the keyword) 2026.8.22.1739727cc4cFix type-witness application dropping the value argument (fixes #93) 2026.8.22.16186a47b3cRemove field-sig prefix syntax; signatures are written with `the (Type)` on the value 2026.8.22.11446f84e98Require a type signature on named function definitions; remove standalone sigs 2026.8.22.9406f881a4Allow match arms on the same line as the scrutinee. 2026.8.22.925176ee84Replace `case X of` with `match X`; arms are gap-separated. 2026.8.22.640a5fab87Remove the dead Int↔Float equality arm and its hash canonicalization. 2026.8.22.231a00d434Add `knot base`: list every base field with its inferred type, re-parseably. 2026.8.22.132aa45acaSupport one-line record-field signature + value: `TYPE NAME BODY`. 2026.8.22.106953f010Align `base.num` impl layout with `morph` style. 2026.8.22.2285734c6Replace unary `-` negation with a type-directed `neg` function. 2026.8.21.16422a7b76aType record-projection paths: replace the `"_i"` magic string with `RecordKey`. 2026.8.21.1535d1918efLet `^` descend through top-level `_`, and capture `with`-aliases into IO thunks. 2026.8.21.14179aa95d7Resolve `^field` at the top level of a program. 2026.8.21.13233200a57Model record-field names as a `FieldName` enum instead of a magic string. 2026.8.21.11423db39e8Make `<>` fold-dictionaries collect absent-embedded fields. 2026.8.21.110910681cfAbsent keys anonymously embed a record, searched by `^`/`<>`. 2026.8.21.10271e34f67Add absent keys to records: `_`-keyed fields reachable only via `^_`. 2026.8.21.9300c0f195Add an absent-field list to the record type representation. 2026.8.21.742bde9407Parse parenthesized function and forall types as expression type literals. 2026.8.21.6254821d8fTreat Rel, Vec, and List as single-parameter type-argument heads. 2026.8.21.5215df3905Erase nested type-head spans in type-witness type arguments. 2026.8.21.440c4447d5Accept unit-annotated and hole type arguments in type-witness calls. 2026.8.21.213e148da5Make integer literals polymorphic over Int and Float. 2026.8.20.2041a504c2dRemove the `b"…"` raw byte-string literal. 2026.8.20.14077c72003Make list literals polymorphic over Vec, Rel, and List. 2026.8.20.12377901b51Separate record fields with a gap, not a single space. 2026.8.20.646983b30dEnforce the list-element gap in the parser; finish corpus migration. 2026.8.20.623d1c695bSeparate list-literal elements with a gap, not a single space. 2026.8.20.51864ffe71Require parens around unit-carrying type arguments. 2026.8.20.30614a727Add type-prefix lambda parameter annotations: `\(T x)`. 2026.8.19.16390371d8aFix corpus examples broken by prior syntax changes; drop block comments. 2026.8.19.1519f74f80cRestore examples/groupby.schema.lock in the new syntax. 2026.8.19.15178aadb08Make type declarations keyword-free and whitespace-separated. 2026.8.19.12489f82ee2Make string literals polymorphic over Text and Bytes. 2026.8.19.1039c194594Reject declaring a value with a time-unit name (`ms`, `seconds`, …). 2026.8.19.84210fe5feRemove backwards-compatibility shims and dead legacy code. 2026.8.19.65170623a1Untrack .hermes/ (local Hermes-agent tooling/notes) and gitignore it. 2026.8.19.64090244feRemove tools/migrate (knot-migrate), a spent one-shot syntax upgrader. 2026.8.19.6035f78baaSupport parameterized variants (`type Pair a b = MkPair {fst a snd b}`). 2026.8.19.545884eaedRemove the `data` keyword; `type X = Ctor {…} | …` variants fully replace it. 2026.8.19.4116c0fceaSupport single-constructor `type`-variants; migrate tests from `data` to `type`. 2026.8.19.33923467c1Make named `type`-variants nominal; migrate corpus from `data` to `type`. 2026.8.19.1354fcc342Add structural variant types: `type X = A {} | B {}`. 2026.8.18.2359fd721cfRemove dead code and boolean literals; booleans are constructors only. 2026.8.18.1525e773ad4Document why type-first sig speculation excludes lowercase-led fields. 2026.8.18.1414c196e05Rename "tall whitespace" to "gap". 2026.8.18.13584d0e94fFix type-first source decl after a `type` alias field. 2026.8.18.12545697952Remove `:` from knot: parser rejects colon annotations; renderers emit colon-free. 2026.8.17.160146acf84Remove accidentally-committed ad-hoc probe files (crates/knot/examples/probe3.rs, .hermes/__pycache__) and gitignore __pycache__/*.pyc. 2026.8.17.1550530dcafMake record types use the same field syntax as record literals: whitespace-separated `name Type` pairs, no `:` or `,`. 2026.8.17.12586891ad9Rename the relation type `[T]` to `Rel T` throughout. 2026.8.17.547e1b4df7Make ast::ExprKind::Var carry a Binding ADT instead of a String, so internal aliases are typed end-to-end. 2026.8.16.450315a82bDrop the \0 prefix from internal alias keys. With the Binding ADT keying codegen's Env, alias uniqueness comes from the span and the Internal variant separates aliases from user names — no string prefix is needed. to_key() now produces a plain span-qualified name (with<span>@<field>). Removes the dead starts_with(0) exemption in bind_at (aliases are Binding, never a \0-string there) and the stale \0with:/\0withrec: comments. The string-literal \0 escape is unchanged. 2026.8.16.11126f75cbKey codegen Env on a Binding ADT instead of mangling aliases into the user-name string space. Add infer::InternalName (WithField{span_start, field} / WithRecord{span_start}) and infer::Binding (User / Internal), derive Hash+Eq so Binding keys codegen's Env directly. implicit_refs / implicit_dict_args now carry Binding; the ImplicitRef arm looks an Internal alias up in the env directly and round-trips a User name through Var (for the global base record). Removes the \0with:/\0withrec: prefix consts and every format!-based mangle; to_key() remains only for the synthetic-AST Var boundary in infer. Nested/sibling with blocks with same-named fields no longer collide on the flat env.' 2026.8.15.1955e7f9eaaRemove views. Only `*name : [T]` source declarations (persistent, typed, no body) keep the `*` prefix; a query assigned to a field is a plain query field (lazy [T], composable). Removed: ViewDecl AST node + parser view paths (`*name = body` is now a parse error), DeclViewKind::View, analyze_view + ViewInfo + compile_view_set + the view read/write/schema codegen, view typing in infer (in_view_comprehension, view_names, RelMarker::View), and the entire stratify module (its only subjects were views/derived — recursive query fields are guarded by the runtime fixpoint convergence cap). Docs: Views/Derived Relations sections replaced by Query Fields. Removed the two view tests. 2026.8.15.1416cbd62e1Simplify the stratify diff-alias tracking: env held only the \0diff sentinel (a relation name was never stored), so replace the HashMap<String,String> + magic-string value with a plain HashSet<String> of diff-aliased variable names. Removes the \0diff constant and its unutterable-name comment. 2026.8.15.83814d0cbfRemove dead code left by recent refactors. Drop the write-only inside_fixpoint_body / PendingLambda.inside_fixpoint chain (its only consumer — the full read gate — was removed), the uncalled type_name_to_tag, and the dead type_unit/is_numeric helpers in infer. Update stale comments referencing removed features (recursive derived relations, the implied full marker). Collapse a nested if-let in the LSP view-annotation action. 2026.8.15.7091434293Build-time INFO diagnostic for full in-memory table reads. When `base.run` (or any materialization) reads a source table fully into memory instead of pushing the query down to SQL — the `run *source` fast path or the in-memory SourceRef fallback — emit one Advice diagnostic naming every such table, with a label at each read site and help on resolving it (push the filter/projection down to SQL, narrow with where/take, or use an aggregate like base.count/base.sum). Advice only; never fails the build. 2026.8.15.6329d49da1Remove the `full` read marker. A bare `*rel` read is always allowed (no opt-in gate); `rows <- *rel` in an IO do-block binds the whole relation `[T]`, while a pure comprehension `i <- *rel` iterates per-row — the difference is the block monad, not a marker. `full` now only marks a whole-table WRITE (`full *rel = ...`). Removed the SourceRef.full flag, the codegen full-read gate + unnecessary-full lint, and the full_read_spans/full_read_in_memory tracking. 2026.8.15.25559b3f04Remove the & derived-relation syntax. Query fields (bare with-record fields whose value is a relation query) replace &name entirely: they are pure lazy [T], inline at each use (pushdown folds through, re-reads fresh), and self-referencing ones route to knot_relation_fixpoint. Removed TokenKind::AmpersandIdent, ExprKind::DerivedRef/DerivedDecl, DeclViewKind::Derived, RelMarker::Derived, RecordRelKind::Derived, the define_recursive_derived/expr_contains_derived_ref machinery, the recursive_derived/recursive_body_fns/derived_types/deriveds registries, and the & parser arms. The bare & token stays only as the route query-param separator. 2026.8.14.910e3bc2caRename user_fns to global_fns 2026.8.14.84909ebc4aRemove unused has_global_fn helper (clippy -D warnings) 2026.8.14.84593900bcKey stdlib fns by flattened base.<name> so user shadowing is structural 2026.8.14.545d44c0eaFix cyclic-record segfault when a with-field shadows a builtin via base.X 2026.8.13.1957e529cf3Strip debug info from release binaries (profile.release strip=debuginfo) 2026.8.13.194688a1712Strip produced binaries automatically at link time 2026.8.13.14298a262c8Link the JIT compiler archive only when the program uses base.compile 2026.8.13.1340e91a8f1Compile with maximum cranelift optimization (opt_level=speed) 2026.8.13.12268be626bFix CI: resolve the clippy -D warnings backlog and the macOS link failure 2026.8.13.1119ad0a0caRemove knot-issues.txt, a stale July 2026 issue-tracker scratch doc 2026.8.13.1118e79d2eeRemove stale scratch: 2 old declaration-style .knot files and db cruft 2026.8.13.6538578233Read const-eval result as Bool without panicking on non-Bool 2026.8.13.554328bc0dMake CheckOutput a named struct instead of a 25-element tuple 2026.8.13.536945d124Document explicit type arguments and higher-rank polymorphism 2026.8.13.529c2285ecRefer to the stdlib as base, not prelude, in the bind_at comment 2026.8.13.52509eaebaExempt prelude-internal bindings from the no-shadowing check 2026.8.13.4265c9d2d9Treat any value as a valid program return, including a bare record 2026.8.13.11d5aedc1Make Bool.True {}/Bool.False {} produce a primitive Bool, not a Constructor 2026.8.12.23267835a93Fill out-params in the compiler binary's knot_compile_impl 2026.8.12.2244852cf71Report which field failed in per-field record refine violations 2026.8.12.212302c831fEvaluate arbitrary refinement predicates at compile time via the in-process JIT 2026.8.12.1625989ad1eRequire refined-type predicates to be pure Bool functions 2026.8.12.15405d3ca27Const-check inline-refined top-level constants at compile time 2026.8.12.14591445883Support refine targeting per-field refined record aliases 2026.8.12.1412e3ec17eEmit migrations for top-level with-block sources 2026.8.12.912dd47010Fix traverse with Maybe/Result applicatives 2026.8.12.75580e8d76Fix duplicate-definition compiler panic → clean diagnostic 2026.8.12.7477156fc1Fix filtered view read/write: normalize view map key 2026.8.12.728f913f4eAuto-refresh stale runtime archive at link time 2026.8.12.6089da89f6Add patterns tests (9 more) 2026.8.12.55705746afAdd text_bytes tests (12 more) — found toJson ADT serialization detail 2026.8.12.5441924115Add errors tests (6 more) 2026.8.12.5298c9cc26Add refinements and constraints tests (11 more) — found 1 real limitation 2026.8.12.502ed091b9Add numeric_text, crypto, and views tests (30 more) — found 2 real view bugs 2026.8.11.1314f5b9968Fix lockfile migration round-trip (writer/parser syntax mismatch) 2026.8.11.9118973362Make e2e harness self-cleaning (TempDir RAII) 2026.8.11.84506633e7Add schema-evolution (migration) tests; expose build_in_dir/run_bin/knot_bin 2026.8.11.8139ebaa37Add lists, units/refinements, nested/meta, HTTP, and concurrency tests 2026.8.11.729f6837c9Add functions.rs, type_errors.rs; extend persistence.rs (morph, traverse) 2026.8.11.709d7fd352Add exhaustive JIT + subprocess test harness and first test batch 2026.8.11.5540c671adRewrite base.md as a complete reference for the whole base namespace 2026.8.11.5454270c95Document the missing language features in the README 2026.8.11.5154f37361Remove historical content from documentation 2026.8.11.512d0ba637Document the structured logging API and guttered multiline output 2026.8.11.4496b9d60fRoute runtime stderr events through the log infrastructure 2026.8.11.122a4bd0bcdoc comments attach to decls + 'docs' subcommand on the compiled binary 2026.8.11.39a2ba397lexer: block comments + doc comments with markdown 2026.8.11.12611688cprettier, glanceable terminal log lines 2026.8.10.23289997006terminal log prefix shows the machine zone offset 2026.8.10.231736aff48prefix terminal log lines with local time 2026.8.10.1642e5acbbcserve/listen per-request log auto-context {requestId, method, path} 2026.8.10.160635d4e89route trace through the structured Debug log 2026.8.10.15472c2f5c5deprecate logInfo/logWarn/logError/logDebug as prelude renames threading logCtx 2026.8.10.14514c8b746fix base.* nested-with merge: surface collapsed outer with fields 2026.8.10.14220c8b2d2generalize (<>field) fold: arbitrary folder + heterogeneous values 2026.8.10.72930d39f3(<>field) fold constraint: compiler collects and merges the in-scope dict at the callsite 2026.8.9.192614369a3(<>field) fold constraint: caller passes the dict as an explicit <> fold 2026.8.9.637a851396Fold-dictionary callsite resolution + codegen merge 2026.8.9.6318933391Fold-dictionary callsite resolution + codegen merge 2026.8.9.543bf2ed39Add (<>field : T) => fold-constraint syntax 2026.8.9.526a227a07Add knot_emit_log: unified structured-log runtime sink 2026.8.9.5103813940Register Level ADT (Debug/Info/Warn/Error) as a builtin 2026.8.9.343640c771docs: log takes a plain Text message; context comes from <> not a record arg 2026.8.9.32837ef803docs: unify all stderr output into one shape; fold trace into the logging infra 2026.8.9.315ae85422docs: rename the log-context field from log to logCtx 2026.8.9.244c933293<> collects purely by name; drop the speculative type filter 2026.8.8.1754b3d6702Add <> collecting-fold operator for structured-context merging 2026.8.8.10095820808Add examples: forall, migrate, apiserver 2026.8.8.91029615f7Remove the route DSL; api is the sole HTTP route syntax 2026.8.8.839a1593a2api DSL: response headers via @{} after the response type 2026.8.8.831af586d5api DSL: rateLimit clause 2026.8.8.5373f82e2capi DSL: URL-template HTTP route syntax 2026.8.7.5002bdfd31lexer: add Tilde token (~) for upcoming relation-ordering syntax 2026.8.7.4322ce92c0compile: return Result Text a with the real error, not Maybe a 2026.8.7.418d9832f2test+fix: ADT payload field-set checks; more boundary coverage 2026.8.7.355a7fc756test: compile-boundary ADT subsumption; fix single-variant field check 2026.8.7.1195976510compile: close nested-ADT expected-type gap (was unchecked crossing) 2026.8.7.111dc0ddbcompile: include ADT decls transitively; recurse ctor-set check into payload fields 2026.8.6.2218ec50758compile: variance-aware constructor checking across the boundary 2026.8.6.14480f6d729compile: keep the dimensionless unit on the expected-type wire (Int 1/Float 1) 2026.8.6.1008345608dcompile: check subsumption in the JIT on real types, in source type syntax 2026.8.6.10067834fabcompile: check subsumption in the JIT on real types, in source type syntax 2026.8.5.152309192a1compile: compare ADTs across the boundary on constructor set, not just name 2026.8.5.132834becb8compile: accept a snippet function whose call site leaves the result generic 2026.8.5.1205b402f2ecompile: runtime subsumption check against the caller's expected a 2026.8.5.10507c676c6compile: surface snippet body type + per-call expected type for the runtime check 2026.8.5.945f7c184ccompile: reject snippets declaring relations the host doesn't have 2026.8.5.85360bc309compile: always-link knot-compile-rt so base.compile JITs in-process 2026.8.5.6577c16644compile: base.compile builtin scaffold + knot-compile-rt staticlib 2026.8.5.356237f9dfjit: make knot-jit runtime-agnostic (no knot-runtime dep) 2026.8.5.255b2a8261jit: in-process JIT compilation backend + knot-jit driver crate 2026.8.4.12519830eb5refactor: generalize Codegen over cranelift Module (prep for JIT backend) 2026.8.4.6359ba613dextract: self-contained custom-typed values via inline data declaration 2026.8.4.607a19d987lang: constructors must always be applied to a record 2026.8.4.545ea497e2test: show (display) coverage — actual-code functions/IO, stable nullary ctors 2026.8.4.539494f85bshow: actual code for functions/IO; normalize nullary-ctor display 2026.8.4.5262042165test: extract_source coverage (scalars, ctors, closures, curried builtins, IO) 2026.8.4.4537471fcdextract: curried builtins, multi-arg leaf IO, nullary ctors 2026.8.4.4130ab3bc2extract: qualify constructor tags (Maybe.Just, Result.Ok, …) 2026.8.3.1504f4077c5Record/variant fields: source order via IndexMap; ^name resolves bottom-to-top 2026.8.3.14210c0d710Runtime freshness: content-hash instead of mtime 2026.8.3.14087e3390fDocs: record-update removal + unify open-row support 2026.8.3.1039b27826fRemove record update syntax {base | f v}; unify supersedes it 2026.8.3.7251e6b39eAdd unify : {r1} -> {r2} -> {r1 ∪ r2} record merge (right-biased) 2026.8.3.612e34a8baAdd scalar Int fns abs/intMin/intMax/clamp with SQL pushdown 2026.8.2.1453f774eaaPush down ASCII text ops, sortByDesc, and multi-key ORDER BY 2026.8.2.1359734c658Expand sql.md pushdown docs with examples and safety gates 2026.8.2.740c54168dDocument fused GROUP BY/HAVING, correlated EXISTS, IN sub-select, GLOB 2026.8.2.738bf651efstartsWith/endsWith builtins + GLOB pushdown 2026.8.2.72220da38bCorrelated EXISTS/NOT EXISTS for any/all in WHERE 2026.8.2.70416afcb2IN sub-select for relation-derived elem haystacks 2026.8.2.64323b836bHAVING pushdown for post-groupBy filters 2026.8.2.626791a3edFused GROUP BY pushdown for groupBy do-blocks 2026.8.2.459eac641bAdd --debug flag: print source expression + generated SQL for every pushdown 2026.8.2.4135a1581aAdd sql.md: how SQL pushdown works + full coverage 2026.8.2.300cbe382fAdd distinct builtin with SELECT DISTINCT pushdown 2026.8.2.239e14ceedPush down any/all over a filtered source 2026.8.2.23632bf3eePush down head/findFirst over a map projection 2026.8.2.228c39588fPush down out-of-order pipe chains via staged FROM-subqueries 2026.8.2.2077941d6bPush down in-order call-form query compositions via pipe delegation 2026.8.1.19252baf2cePush down more SQL: aggregates over map, head/count over take/drop 2026.8.1.17460dbb7ecPush down head/findFirst to SQL (SELECT ... LIMIT 1) 2026.8.1.1545a50e61aPush down drop/any/all/elem/contains to SQL; DISTINCT for collapsing projections 2026.8.1.84881c19d2Error on unnecessary full marker: a full *rel read that codegen pushes down to SQL now errors (unnecessary full). Two-phase span classification: collect all full-marked SourceRef spans (reusing infer::walk_exprs_read, now pub(crate)), mark spans that reach the in-memory full-load fallback, and at end of codegen error on any full-marked span that did not. Exact dual of the required-full check, so the marker is required precisely where a whole-relation load occurs. knot.md/DESIGN.md updated 2026.8.1.810ddfebf4Require full marker on non-pushed-down relation reads: a bare *rel read that codegen cannot push to SQL now errors (full *rel to allow the in-memory whole-table load). SourceRef gains a full flag (parsed from full *rel read position, kept distinct from the full *rel = expr write), codegen emits the error at the in-memory full-load fallback, formatter preserves full on reads, LSP/tools updated for the struct variant. Examples + all 5 docs migrated; knot.md/DESIGN.md document the requirement 2026.7.31.1833d5d9edfRename replace keyword to full: replace *rel = expr -> full *rel = expr (TokenKind::Replace->Full, ExprKind::ReplaceSet->FullSet across compiler+LSP+tools/migrate, formatter emits full, examples+docs+doccheck updated; doccheck binary path now repo-relative) 2026.7.31.655712ae33DESIGN.md: 96/96 blocks compile (7 knot-skip) — full pass: routes+serve+headers+rate-limit capstones (query params, IO-bind-first relation responses, per-field refine, qualified ctors, same-name destructure), views (constant cols in type per impl), migrate record-field form, units (toS/toMiles/arithmetic/constants), refined types (refine keyword, per-field handler, RefinementError shape), STM/concurrency, implicit-dictionary clamp example, nested relations, do-notation quartet; retag 6 definitional builtin-semantics + 1 fetch block as knot-skip 2026.7.31.447a51b3a6knot.md: 67/67 blocks compile (1 knot-skip for fetch doc-vs-impl gap) — fix todo-app example (qualified ctors, groupBy where-idiom, case not if-expr), rate-limit/serverLimit (parenthesized key lambda, Int Ms units), serve response-headers (base.count not length), Maybe/Result do-blocks (qualified ctors, lambda-form safeDivide); harness recognizes subset-constraint decls & knot-skip fence 2026.7.31.42196256fdknot.md: fix routes/serve/headers (verified syntax from routes.knot), migrate (record-field clause), subset constraints (source decls), refined types (Int 1 units, refine keyword not base.refine, RefinementError shape), atomic/STM (base.when retry idiom), write-validation example 2026.7.31.4035407984knot.md: fix case patterns (qualified ctors, space-form record/list patterns); rename n->cents (n is a reserved builtin); harness groups case-of arms with their decl 2026.7.31.3539666ce2knot.md: views use direct-comprehension form (with{result} wrapper breaks view type inference) 2026.7.31.348740b087knot.md: self-contain function-application/pipe/type-hole/annotation examples (with{} + do-body); fix nested-with scoping (inline values); replace *people full-write; record value bound to name 2026.7.31.3352ec39d0knot.md: fix with-expression & comprehension examples (self-contained programs with source decls); split multi-expression blocks; case-binding example 2026.7.31.3287361366knot.md: add source decls for relation examples; fix recursive &reportsTo (base-case &direct not &base), join comma-record, view write-through self-contained, match qualified, dedupe &circles; drop main keyword 2026.7.31.3122d66fd0stdlib.md: 111/111 blocks compile — fix waitForTask retry idiom (base.when not IO where-guard), bump single-line, &all->&everyone (codegen name collision); harness handles name-do/name-value fields, outer-vs-inner with{} 2026.7.31.2461522a1fstdlib.md: fix transfer (case-on-Bool not if/then/else, parenthesized record-update arithmetic), race Result ctors, source decls for comprehension examples, bare builtins (log/fs/uuid), unit literal bodies 2026.7.31.220bb98d36stdlib.md: fix wrong sigs (match/bytesGet/encrypt/decrypt/sign/strip/dress), correct source-relation & aggregate idioms, prefix missed builtins 2026.7.31.159d222c2bknot/stdlib/DESIGN: prefix bare builtin calls with base.; fix groupBy idiom (direct source bind, groupBy {owner t.owner}, count (base.count t)) 2026.7.31.129129b5cfbase.md: 91/91 blocks compile — fix derived-relation idiom (&x = do-bind not source-pipeline), self-contain fragments; harness handles multi-line decls + program_decls 2026.7.31.1032ceb3adbase.md/stdlib.md: correct floor/intToFloat/take/drop/bind/strip sigs; IO {record} -> IO ({record}); fix stale bind comment in infer.rs 2026.7.30.18013dfcab8Docs: atomic is a keyword (drop false value-sig + DB-only claim); harness handles keyword builtins 2026.7.30.1631865cbddParser: accept IO a (type var) without parens now that effect rows are removed; revert doc sigs to IO a 2026.7.30.1623c2954ffFix polymorphic IO sigs to IO (a) (parser rejects IO a); make fork example runnable; drop remaining false effect prose 2026.7.30.161644fe4efRemove effect-row prose from all docs (no effect tracking in impl); correct atomic/serve/fork/race claims 2026.7.30.16034eef0b5Docs follow impl: remove effect rows (IO T, not IO {eff} T); fix README true/false and case-arm syntax 2026.7.30.14204ea9a91Fix invalid name=value record-binding syntax in docs (use name value) 2026.7.30.13595622f14Document base.morph and the floor/intToFloat/textToInt/textToFloat conversions 2026.7.30.1124a1b7e86Seed base.morph: ^into-resolvable conversions + floor/intToFloat/textToInt/textToFloat builtins 2026.7.30.7020cda8a4Add the '_' hole: inferrable type argument + base.todo-style value 2026.7.30.44785a70afBidirectional ^name application: resolve by expected RESULT type 2026.7.29.15121ccc090Fix ^field resolution: collect same-depth candidates across all record bindings 2026.7.29.93764e0734Add base.list namespace: List ADT + 13 builtin functions 2026.7.29.811b3551d2feat(infer): type-directed backtracking for ^name projections 2026.7.29.503de4976dchore(ci): rewrite signature_help fallback chain for latest clippy 2026.7.29.4573130d75chore(ci): rewrite Option-chains with `?` for latest clippy 2026.7.29.447d80fb1cchore(ci): make clippy and release-binaries pass 2026.7.28.18270919363feat(syntax): remove commas from relation literals; ctors take payload unparenthesized 2026.7.28.17049f50eefdocs(readme): detail records before the with-heavy sections; stress everything-is-an-expression 2026.7.28.161301400d2docs(readme): detail records before the with-heavy sections; stress everything-is-an-expression 2026.7.28.1515ac2feb2lang: with {Type …} type imports — expose constructors unqualified in the body 2026.7.28.140457d1789lang: remove lowercase true/false — require Bool.True {}/Bool.False {} 2026.7.28.1307a75ae6dlang: prefer Bool.True {}/Bool.False {} over lowercase true/false 2026.7.28.9504ac5399compiler: push down arithmetic-map feeding an aggregate (map f |> sum → SELECT SUM(...)) 2026.7.28.75927ceb95docs: replace non-parsing derived 'match' example with built-in base.match (DESIGN.md) 2026.7.28.758f158ad9docs: qualify constructor patterns in binds (Shape.Circle) + fix base.match example 2026.7.28.74787a00f2docs: apply the 30 'with'-binding space-form conversions (working-copy follow-through) 2026.7.28.740e45b0efdocs: fix 'with' bindings to space form (30 sites) + nested-comprehension record example 2026.7.28.732d39e30cdocs: rewrite DESIGN.md/knot.md/README trait narrative to match structural dispatch 2026.7.28.7198a4fd1ddocs: remove user-facing trait system from stdlib.md and knot.md 2026.7.28.70835505ccdocs: remove if/then/else (deleted from language — use case-on-Bool); fix all record-update literals to space form {r | field value} 2026.7.28.70462efad1docs: normalize all record-VALUE literals to space form across README/DESIGN/stdlib/knot 2026.7.28.650231a69ddocs: stdlib.md — add unified Query Pushdown & Auto-Indexing section (filters/joins/aggregates/sortBy, auto-indexed join+filter cols, in-memory fallback); base.md — expand relation-ops pushdown intro with JOIN detail + cross-ref 2026.7.28.648f4ab604docs: knot.md — teach direct multi-source JOIN comprehension in Relation Comprehensions (single SQL SELECT + auto-indexed join/filter cols, in-memory fallback) 2026.7.28.646ce3c76ddocs: README — add tools/migrate + full doc list to Project Structure, correct test section (75: migrate+runtime, no frontend/compiler unit tests) 2026.7.28.6458737f3bdocs: correct AGENTS.md/CLAUDE.md — real test counts (75: 57 migrate + 18 runtime), add tools/migrate to workspace layout, document do-block SQL JOIN pushdown in compile_io_do 2026.7.28.55848bfc7dSQL JOIN pushdown for cross-source comprehension do-blocks 2026.7.28.4214e007d2Fix five broken examples + comprehensive README + new base.md 2026.7.28.131bdce585Inline pure helper functions to widen SQL pushdown 2026.7.28.152bb49aaWarn on surviving `base.trace` probes at compile time 2026.7.28.903d3ffaAdd `base.todo` and `base.trace` debug primitives 2026.7.27.15532ab9b4dMake `base` an ordinary record: purely lexical `with` shadowing 2026.7.27.15101ad4841Reject shadowing across the top-level `with` chain 2026.7.27.1422620cb78Reject shadowing the `base` record with a clean error 2026.7.27.13499a33a88Reject provably non-terminating definitions at compile time 2026.7.27.1250ffe1ab8Reject with{base ...} at compile time 2026.7.27.9335fd977dUnify SQL pushdown emission behind a Query IR 2026.7.27.619d0387d1Forbid all shadowing in the type checker 2026.7.26.1546a7a20f5Identify stdlib functions by resolution, not name, for SQL pushdown 2026.7.26.1403fb35adfSMT-based subtyping between refined types 2026.7.26.1320a37cb26Const-fold && and || in refinement predicates; document refined types 2026.7.26.736837ee5eCheck constants against refinement predicates at compile time 2026.7.26.7080920cfbAdd "Learn Knot in Y Minutes" guide to the README 2026.7.26.7009c164ddRevert "Change relation syntax from [ ] to [| |]" 2026.7.26.6408ffa066Remove if/then/else; use case-on-bool for conditionals 2026.7.26.1549cd5af3Change relation syntax from [ ] to [| |] 2026.7.26.108d0e9b33Remove the effect system; keep the IO monad and do-notation 2026.7.25.1840e36d80dinfer: error on same-scope duplicate type declarations 2026.7.25.174394c64acfix: bind toJson/parseJson into stdlib_schemes directly 2026.7.25.1735f1c2628docs: update stale comments for the base-only scope model 2026.7.25.1732acd00dfstdlib: move everything into `base` — stdlib fns leave user scope 2026.7.25.1248307666fprelude: query forms as first-class base fields + gate server/STM forms 2026.7.24.195304ea43ccodegen: run the file body as the entry point + fix with-record decl scoping 2026.7.24.1840b98a4d0compiler+lsp: migrate to file-as-expression AST (no top-level decls) 2026.7.24.907d3a0442tests(knot/format): migrate 2 sources to file-as-expression 2026.7.24.8380540fc7effects: remove orphaned fun_names set + stale trait-method comment 2026.7.24.829519371aexamples: migrate final 5 examples — all 31 now file-as-expression 2026.7.24.815f790c7bparser: signature-only record fields → required CLI constants 2026.7.24.748a97e75fexamples: migrate 15 examples to file-as-expression syntax 2026.7.24.619c204f13examples: migrate builtins.knot to file-as-expression syntax 2026.7.24.6134a363bbunused: count qualified constructor use of a data type 2026.7.24.6098072b9aConstructors always qualified for user ADTs; open variants removed 2026.7.24.546db8a144Qualified constructor patterns: nominal matching + confinement 2026.7.24.533ecd8f74File-as-expression + qualified constructors (Phase 1) 2026.7.24.4500e078ffRemove dead let/in keywords 2026.7.24.4187c878f6Remove modules/imports, export keyword, and trait/impl keywords 2026.7.23.210919b5acfAdd record-embedded route declarations 2026.7.23.1604096421bElaborate implicit dictionaries for record-field funs 2026.7.23.1527c073b6cGive record-field functions full type schemes 2026.7.23.1453df219d5Add record-embedded subset constraints 2026.7.23.1346aead0f0Remove standalone top-level migrate declaration 2026.7.23.114132ff693Record-embedded do-block field values (indented, no parens) 2026.7.23.1125442f4ecRecord-embedded function fields (bare-lambda field values) 2026.7.23.104091b96b6Record-embedded derived relations (`&name = body` in a record) 2026.7.23.917a04083cSources in records, record-embedded migrations & views, drop-migration 2026.7.22.16275d65523Implicit dictionaries: resolve (^field : T) => constraints at callsites 2026.7.22.1520c6da1ebParse signature-level `^`-field constraints (syntax + tooling) 2026.7.21.3232093cf3Add examples/ord.knot: Ord as a record dictionary 2026.7.21.201cfcf5b4Fix `with`/`^` implicit-field-projection lexical scoping 2026.7.21.31f8437c2Add examples/builtins.knot showcasing intrinsic builtins 2026.7.20.1852f287531Remove the trait/impl system 2026.7.20.130620fe88eImplicit record-field projection `^name` 2026.7.20.10532a9f48fType all constructors uniformly as {} -> T, eta-expand bare ctors to closures 2026.7.20.5416268396Add embedded `data` declarations in record value literals 2026.7.19.1849e75ab9fMulti-type-arg application + rank-N inline forall params 2026.7.19.135305822f7Π-lite explicit type arguments: \(T : Type) type-witness lambdas 2026.7.19.835855fde8Resolve parameterized type aliases at application sites 2026.7.19.8038503074Allow embedded `type` alias declarations in record value literals 2026.7.19.62605174c9Allow standalone type-signature lines in record value literals 2026.7.19.519f0be436Allow newline-separated field signatures in record types 2026.7.19.444efde2cdMigrate remaining compiler/LSP fixtures; fix effects-hint anchor expectation 2026.7.19.124f66a602Replace do-block let/let-in with with-records 2026.7.18.1449f8cd928Add top-level strip/dress for unit rebranding 2026.7.18.1333242ca53Remove unit declarations 2026.7.18.136c66c527Change unit syntax from angle brackets to regular type application 2026.7.18.45537d0d7Reimplement units of measure: Int/Float as Con with Unit kind 2026.7.16.1535e50b82aFix 14 bugs from pass 5 static audit 2026.7.16.103014139e1Fix 16 bugs from exhaustive cross-crate audit 2026.7.16.340aa98710Fix 7 bugs from deep static audit 2026.7.15.2216e4bdde2Fix stale comment: BEGIN IMMEDIATE → SAVEPOINT 2026.7.15.2208375f2e3Fix 2 runtime bugs from pass 4 deep audit 2026.7.15.21564f6bd97Fix 5 LSP bugs from pass 4 subagent audit 2026.7.15.21522a829fdAdd verification tests for selection_range Annot/Serve recursion fix 2026.7.15.2105a1aed24Fix selection_range missing Annot/Serve/UnitLit/TimeUnitLit in AST recursion 2026.7.15.1957f8f6f2cFix 16 bugs found in pass 3 static audit 2026.7.15.18461eb5d5aFix 37 bugs found in exhaustive static audit 2026.7.14.23493007744Fix CRITICAL double-free in race BoxDropGuard + OpenAPI request headers 2026.7.14.23374bb18e6Fix remaining span boundary off-by-ones in shared/completion/linked_editing/rename 2026.7.14.2329532ab6eFix sql_lint beta-reduction gap and builtins doc mismatch 2026.7.14.18513b72a02Fix 6 LSP bugs found in second-pass audit 2026.7.14.1842d240798Fix: detect multiple nullable ADT trait dispatch ambiguity 2026.7.14.18264882501Fix 22 bugs found in static audit 2026.7.13.17592e5e0a5Fix all 82 bugs from BUGS.md audit (#85) 2026.7.13.544ea5f857Merge pull request #84 from ilyakooo0/push-quqskwyyyqnm 2026.7.13.52834ab6dcMerge pull request #83 from ilyakooo0/push-mukurrouztqr 2026.7.13.451a3441a1Merge pull request #82 from ilyakooo0/push-qotzonpntrpx 2026.7.12.733fb58287fix: int literal overflow, relation literal dedup, nested relation field bind (#79) 2026.7.12.729cd66098fix: module system — duplicate name panic, export filter drops units/impls, selective import poisoning (#78) 2026.7.12.7185318dfcfix: bytesGet OOB and crypto functions abort on bad input (#77) 2026.7.12.6435c9d869fix: compiler hangs on partially-applied recursive helper in tail position (#71) (#76) 2026.7.12.3542737f14fix: stratification error blames correct cause (aggregate/diff), not always diff (#75) 2026.7.12.2318d70720fix: sum over empty [Float] returns Float 0.0, not Int 0 (#74) 2026.7.12.218ac81de4fix: replace *rel = if/case with comprehension branches no longer crashes (#73) 2026.7.12.2127eb77e6fix: SQLite NULL from ALTER TABLE ADD COLUMN now returns proper default values (#72) 2026.7.12.508c02c31fix: LSP extract function/variable swallows trailing newline (#70) 2026.7.12.40a39ad73fix: show appends unit suffixes for Float values with units (#69) 2026.7.12.20f26f7aafix: reject ambiguous trait dispatch when ADTs share constructor names (#68) 2026.7.11.234610e52eefix: formatter no-ops on comment with odd number of quotes (#67) 2026.7.11.2259d40982dfix: deep do-blocks stack overflow — run compiler passes on large stack (#66) 2026.7.11.22272ee3bc5fix: comprehension tail in sequential IO do-block yields all matching rows (#65) 2026.7.11.215736cc530fix: validate ADT tag parameters in HTTP routes, return 400 for unknown tags (#64) 2026.7.11.21526c9ef18fix: source-relation comprehension bound with <- and where filter no longer yields empty (#63) 2026.7.11.2125f3c5ae5fix: when/unless guards now properly gate writes in do-blocks (#62) 2026.7.11.21217229949fix: reject reserved column names in persisted relations at compile time (#61) 2026.7.11.1957357795cfix: split division_by_zero test into float (IEEE) and int (panic) cases (#60) 2026.7.11.1945ba74b26fix: ADT field write path uses declaring constructor column type, not first-declared (#59) 2026.7.11.19345b75564fix: sortBy/minOn/maxOn use Ord dispatcher instead of panicking on non-primitive keys (#58) 2026.7.11.191635f1963fix: constructor Ord uses declaration order, not tag name alphabetical (#57) 2026.7.11.1842ceb1ad7fix: type alias free variables skolemised as flexible, not rigid (#56) 2026.7.11.18196e3e3a4fix: effect row soundness — defer rigid row unification with skolems intact (#55) 2026.7.11.1810ca35cddfix: shift prelude FieldPat::name_span and method name_spans to prevent inlay hint position drift (issue #4) (#54) 2026.7.11.1723830bf08fix: rename skips stale owner in open-doc scan, lets disk phase handle it (#53) 2026.7.11.1712c5de0eafix: iterative JSON serializer to prevent stack overflow on deep nesting (#52) 2026.7.11.16574717ccafix: record update type inference + stale Eq/Ord constraint tests (#51) 2026.7.11.16517273d2cfix: update stale Eq/Ord constraint tests after structural comparison change (#50) 2026.7.11.154059bac9fFix do-block final-expression typing, refined-type subtyping, and nested route refinements 2026.7.11.13179fe8e67Remove Eq/Ord trait checks, add compile-time refinement const-folding (#48) 2026.7.11.510a2eafd8Fix B1, B2, B3: groupBy arena promote, ADT per-constructor write, stdlib shadowing (#12) 2026.7.11.45997f7305Fix B72: extract actions accept selections that aren't expression nodes (#42) 2026.7.11.50097f7305Fix B72: extract actions accept selections that aren't expression nodes (#42) 2026.7.11.447daeba36Fix B10: IO effect-widening rebinds an already-bound variable, laundering effects (#38) 2026.7.11.416615da8aFix B50, B51, B71: format layout in parens, time-unit sugar preservation, rename capture detection (#41) 2026.7.11.4156c1caefFix B27: minOn/maxOn on legacy BigInt TEXT values silently degrades to Float (#24) 2026.7.11.4142e20ecaFix B56, B70: nested-pipe lint skip, rename mid-debounce partial edit (#21) 2026.7.11.4137353f41Fix B4: bare references to user declarations named like zero-arg builtins (#13) 2026.7.11.115964968bFix clippy: match_like_matches_macro and collapsible_if (#43) 2026.7.10.1242a444d51Fix B11, B13, B14, B36, B52, B57, B60, B80: bug audit second batch 2026.7.6.3258b30eccAdd BUGS.md documenting 82 findings from full-codebase bug audit 2026.7.5.145836d75e2Fix clippy warnings in stratify.rs and semantic_tokens.rs 2026.7.5.1453500f735Remove macOS x86_64 release build from CI matrix 2026.7.5.1424f1220baFix 4 clippy warnings: doc lazy continuation, type complexity, while-let on iterator, collapsible if 2026.7.5.5445003747Fix 15 bugs: missing write lock + STM notification in knot_source_migrate, groupBy error-path Cranelift verifier crash, record update row-polymorphic extension, LSP semantic tokens delta ×5 encoding, duplicate field/constructor detection, CRLF formatting corruption, workspace root canonicalization, sql_lint nested pipe double-report, CLI -o/--output flag-swallow guard, KNOT_RUNTIME_LIB typo error, lex diagnostic severity filtering, iterative Tarjan SCC, structured value text escaping 2026.7.3.535eccf6aaFix 16 bugs: let-comprehension iteration, sum/minOn/maxOn constraints, refined-type symmetry, stratification negation, parser comma-terminator, HOF effect inference, LSP rename edit_span, LSP highlights/traits/imports, HTTP framing headers, union non-finite floats, Bool override, OpenAPI nullable 2026.7.2.16455ab690aReplace std::mem::replace on Option with Option::replace to fix clippy lint 2026.7.2.16282cc2c95Fix 11 bugs: Cons pattern, assoc-type Ty::Alias, lone-yield monad, so… (#10) 2026.7.2.1444a983db0Fix 6 bugs: atomic-gate bypass for crypto keygen, JSON-set dedup order-sensitivity, nested-atomic write-lock release, trait-method rename gaps, route-outline symbol range, refined-type laundering in set/replace 2026.7.2.111606d632eFix 6 bugs: doubly-nested relation corruption, unit-relation duplicates, spurious lambda effect error, dropped field refinements, LSP doubled-sigil completion, migrate workspace symbols 2026.7.2.6107700fecFix all remaining clippy warnings across workspace 2026.7.2.5187cde745Fix 8 bugs: Int<->Float compare/equality/hash wrong at the 2^63 boundary (saturating i64 cast made Int(i64::MAX) == Float(2^63)), hash-join key serializer dropping fn_ptr for functions (distinct functions with equal source/env collided), knot_debug_init panic on non-UTF-8 argv crashing every program at startup, set-op SQL pushdown (diff/inter/union) comparing columns positionally with misaligned order between schema-ordered sources and yield-ordered do-blocks, IO laundering past the atomic gate via closed-row higher-order helpers whose callback effects were dropped at call sites and never recovered from the declared row (plus the accompanying spurious 'declared effects are not used' warning on legitimate closed-row HOFs), LSP rename/find-references/goto ignoring route rateLimit expressions (leaving stale names after rename), LSP completion consuming a binary */&& operator as a source/derived sigil and corrupting the buffer, and LSP hover on a record-field token leaking an unrelated same-named source's schema/refinements 2026.7.1.17121c2718eFix 16 bugs: parser forall stack overflow, view unsupported-where panic, hash-join dropping second predicate, SYNTH_SPAN_ORIGINS unbounded growth in LSP, fork-wrapper effects under-approximation in atomic gate, refined type laundering through arithmetic/negation/concat, refined ADT base laundering, unit exponent overflow panic, mutually recursive derived relations stack overflow, ADT temp schema first-row-only type guessing, non-UTF-8 stdin crash, STM skip flag stale across retry, ADT field affinity change auto-migration corruption, knot_diff double RELEASE SAVEPOINT, camel_to_header_case mangling on underscores/trailing underscores, bare boolean override flag swallowing next argument, TUI raw-mode not restored on alternate-screen failure, LSP trait method anchor matching where substring in name, LSP field rename/linked-editing missing type signatures and inline annotations, LSP completion safe_slice on stale spans, LSP defs serve handler endpoint references 2026.6.30.1307c4bf216Fix mutex poisoning crash in desugar SYNTH_SPAN_ORIGINS lock 2026.6.26.1947d5c7f76Canonicalize -0.0 floats for consistent equality, harden runtime error handling and type coercion, and fix polymorphic type-pattern matching 2026.6.26.1642ff88bc3Move Knot architecture documentation to AGENTS.md 2026.6.26.164003e4693Fix 7 bugs: codegen ctor-pattern bind over relation source in IO do-blocks, parser stack overflow on deep lambda/if/case/let nesting, runtime NaN BTreeMap Ord and TEXT-column STM wake comparison, LSP parenthesized-constructor span, goto-type-definition field guard, and constructor-in-pattern semantic token 2026.6.26.1429347d4b6Fix all clippy errors via targeted lint allows 2026.6.26.1407cef6c38Add GitHub Actions workflow to run clippy 2026.6.23.1842635e614Fix LSP linked-editing missing record-pattern fields; suppress on unsafe puns 2026.6.23.10405f52681Fix 8 bugs: parser stack overflow (atomic/refine), desugar/codegen divergence, effects fork-via-pipe, inline units, refined-type subsumption, LSP (completion IO fields, inlay-hint panic, rename dedup), runtime cascade-delete 2026.6.23.932084e543Fix false 'IO not allowed in atomic' by registering missing pure builtins and treating callee params as known in opaque-callee scan 2026.6.23.32419efad0Fix 8 bugs: runtime (verify, groupBy, nested), compiler (Maybe override), LSP (nav field-tokens, rename scope, completion, hints) 2026.6.22.618c1a8131Bump macos-latest to macos-15 for aarch64 builds 2026.6.22.433865cc9aFix 6 bugs: compiler (stale skolem index, ADT field reorder), LSP (rename resolves wrong symbol, completion mid-token), runtime (typed headers/int decode) 2026.6.21.1839101def7Fix 10 bugs: parser (empty RHS), compiler (refinement in atomic), runtime (route literal decode), formatter (export comment), LSP (folding, symbols, hints, completion, selection-range) 2026.6.21.1248fc74bc0Fix 9 bugs: runtime (savepoint leak, JSON u64, tui widths), compiler (constructor overloading), parser (lambda recovery, caret in expr, digit separators), LSP (refine hover nondeterminism, completion offset space) 2026.6.20.22591f8086aFix 10 bugs: JSON/HTTP type safety, float aggregates, route field collision, recursive derived lambda, time-unit homogeneity, parser/format robustness 2026.6.20.2156191f631Fix 3 bugs: integer JSON coercion, pipe-LHS lambda effects, iterative-spine AST depth bounds 2026.6.19.1004f10aa2eFix 4 bugs: single-variant data subsumption, selective import coalescing, exponential record parsing, route recursion overflow 2026.6.19.4531be02a1Fix 4 verified bugs: deriving (Eq, Ord) type-check, unit polymorphism on x*x, strip_spans hash collision, sql_lint json-column guard 2026.6.15.1957b02d0cdFix 2 verified bugs: __knot_bytes JSON field-name collision, Retry-After integer overflow 2026.6.14.1303c7575d4Fix 11 verified bugs: record parsing, pattern matching, line endings, code actions, HTTP validation, and runtime persistence 2026.6.13.946201335eFix 11 verified bugs: codegen patterns, effect-row subsumption, race synchronization, minmax Text handling, and LSP inverted-range + navigation + signatures + diagnostics 2026.6.13.7144dd5930Fix 12 verified bugs: parser, desugar, runtime, LSP, and effect-row soundness 2026.6.11.2149d54b94dMake Maybe encode/decode to and from JSON as null 2026.6.11.1926974c9eeFix 61 verified bugs: miscompiles, data corruption, type/effect soundness, SQL divergences, and LSP issues 2026.6.11.1200d4caadcFix 72 verified bugs across all crates: compiler crashes, runtime data corruption, type/effect system soundness, formatter round-trips, LSP sync/state/nav/rename/completion 2026.6.10.2118db12673Fix 78 verified bugs across all crates: compiler crashes, runtime data corruption, type/effect system soundness, formatter round-trips, LSP sync/state/nav/rename/completion 2026.6.10.17535d8de03Fix 28+ bugs: panic unwinding (C-unwind ABI + .eh_frame emission), race cancellation, listen IO wrapping, STM wakeups, SQL pushdown invalidation, type inference, LSP precision, and formatter round-trip 2026.6.10.1544c6fcc3eFix 43+ verified bugs across all crates: formatter round-trip, type system soundness, SQL pushdown semantics, STM wakeups, runtime concurrency, LSP editor integration, effects inference, and CLI safety 2026.5.29.1522ea2151bFix formatter dropping rateLimit clauses in routes 2026.5.29.145119f4d87Update documentation to match current implementation 2026.5.25.542ae8e1cbFall back to LRU cache when text-literal slot is misaligned on some platforms 2026.5.25.126f153865Fix aarch64 SIGBUS: align text-literal cache slots and stack slots to pointer size 2026.5.24.848bfabb86Update examples and README to reflect current compiler state 2026.5.22.13268a9bb64Add upsertBy builtin for relation upsert operations 2026.5.11.182539eeef1Refactor race's type signature to use \/ operator via AST construction 2026.5.11.130365f0b3cRemove .DS_Store and add to .gitignore 2026.5.11.1222e2836d9Make fork propagate effects: IO r {} -> IO r {} 2026.5.10.1630d8c9ad0Add % modulo operator with Num trait dispatch and SQL pushdown 2026.5.10.4193c77dd1Implement built-in per-endpoint HTTP rate limiting 2026.5.8.806e13b4b9Add -o/--output option to knotc build for specifying output path 2026.5.8.35854f0888Show default values from source when calling --help on compiled binary 2026.5.7.17268a278c6Allow omitting top-level constant values that can be supplied via CLI arguments with refined type validation 2026.5.7.22124707a3Preserve IO shorthand syntax in formatter for empty effect rows 2026.5.7.216ba979cfDisplay unresolved effect row variables as `_` instead of letter names 2026.5.7.13780cec12Hide Server effect row when no concrete effects to avoid confusing third parameter in display 2026.5.7.12afbfdc6Update all docs to serve API where syntax 2026.5.5.20091ebf4dcImprove LSP robustness: cap reverse_imports, semantic tokens, diagnostics, and pending sources 2026.5.5.958c4bec36Improve LSP robustness: cap diagnostics, clamp tab_size, workspace analysis panic boundary, cache cleanup 2026.5.4.1750e0df541Make replace check fold through let bindings to catch all source references 2026.5.4.8448fa69d1Fix effect checker: propagate lambda effects through row-polymorphic callees 2026.5.4.4495361570Add hash builtin (BLAKE3, polymorphic over any value) 2026.5.3.1014407fc99Rename effect keywords: reads→r, writes→w, add rw shorthand 2026.5.3.911d6ea0f7Fix workspace diagnostic clearing and crypto function types 2026.5.3.811176b6e1Add parser test for one-line case expressions with semicolon separators 2026.5.3.806d62583bAdd fuel bounds to beta_reduce to prevent exponential expansion 2026.5.3.4361355f3bUpdate state.documents before sending diagnostic refresh 2026.5.3.430887fabeSend workspace/diagnostic/refresh for pull-mode LSP clients 2026.5.2.2109ae5ae74Add validation error for unnecessary replace when value references source 2026.5.2.2102704e621Implement full beta-reduction for SQL pushdown optimization to enable helper function inlining 2026.5.2.20232bf1195Add GitHub workflow to release static binaries for Linux and macOS 2026.5.2.2012e6ebed7Fix diagnostic spans pointing to wrong lines when source contains non-ASCII characters 2026.5.2.1216951aaf7Warn when declared effects are not actually used 2026.5.2.114973be950Allow type-application arguments to span multiple lines in signatures 2026.5.2.100626923d6Implement AST-based formatter with knotc fmt command and LSP integration 2026.5.2.625d81a82dAdd 16 LSP improvements: refined-type details, trait-dispatch lens, constraint hints, completion resolve, prepare-rename validation, folding, semantic tokens for predicates, unit hints, code actions for refine wrap, and workspace symbols 2026.5.1.606b5706c0Enhance LSP with semantic tokens, signature help, case completion, trait stubs, inlay hints, goto-impl, effect fixes, and workspace diagnostics 2026.4.29.2126cd90906Allow type signatures to span across multiple lines 2026.4.29.20497bb3082Add bare shorthand syntax for effect row variables (IO e a) 2026.4.29.2002b722175Add effect row polymorphism for IO types 2026.4.29.19117a3f379Check reads/writes effects in IO type annotations 2026.4.28.2130bc8ca09Check IO effect annotations in effect-checker pass 2026.4.28.21188aa785dFix do-block type inference for yield-only expressions in IO context 2026.4.28.2053f95e712Fix rank-2 row polymorphism: preserve skolem tail in field unification 2026.4.28.19263c5a1e6Allow inline type annotations for functions, views, and derived relations 2026.4.27.22067e8d23bImplement stripUnit/withUnit builtins for Int and Float unit conversion 2026.4.27.20578734ec2Implement rank-2 polymorphism with explicit forall quantification 2026.4.27.20200993f27Add dropRelation function for relations 2026.4.27.1122ef338aaStream fold rows from SQLite one-by-one instead of materializing 2026.4.26.8476ee8ae6Allow overriding top-level constants during compile time 2026.4.26.327f2f4f52Add unified logging infrastructure with terminal colors and JSON file output 2026.4.25.162360efe94Support dashes in route path segments (e.g., /user-orders, /line-items) 2026.4.25.6067fcbd9eSupport Maybe constant overrides: wrap values in Just automatically 2026.4.24.21462682f10Parser: skip newlines after parenthesized expression before type annotation 2026.4.22.1931d7ebae9Fix build errors from dependency upgrades: ureq 3, rusqlite 0.39, cranelift 0.131 2026.4.22.1725571df86Remove dead code: unused var_only_used_in_sql_do and expr_refs_var_outside_sql_do functions 2026.4.22.172094584bcExpand SQL optimizations: text concatenation (++), built-in functions (length/toUpper/toLower/trim/contains/not), and arithmetic aggregates 2026.4.22.9529891fadAdd SQL optimization lint to LSP: inform users when constructs could be folded into SQL but will run at runtime 2026.4.21.915991b407Fix let-bound variable schema tracking for groupBy in do-blocks 2026.4.20.1901c1da358Fix 8 compiler bugs: expr_is_io Refine recursion, scalar refinement validation, collect_source_refinements alias resolution, schema_for_source wrapper unwrapping, callee_effects If/Case handling, function effect fixpoint, and UnitTy variable exponent algebra 2026.4.19.18175467c50Optimize STM retry: use RwLock for table versions and per-thread wake slots for targeted notifications 2026.4.19.14692178b3Handle Unit as empty relation in trait dispatch and fold/map/filter/traverse/bind/union operations 2026.4.19.139559ac95Fix field access on empty relation groups to return empty relation instead of Unit 2026.4.19.133c36c6d6Allow field access on empty relations to return Unit instead of panicking 2026.4.19.1249d985f7Fix IO do-block where guards to skip remaining statements instead of panicking 2026.4.19.15b651833Fix IO do-block yield and constructor JSON serialization 2026.4.16.20473f2925bFix thread teardown crashes: use try_with for pool access, fix deep_drop_value double-free on DAGs 2026.4.16.953314de9aComplete GC improvements: implement pointer tagging, vector pooling, dedup scratch, and recursive clone optimization 2026.4.14.121941e756eSupport Text as implicit nullary constructors in constructor runtime functions 2026.4.14.1204745d581Resolve named ADT types in route field descriptors: detect all-nullary ADTs and emit 'tag' type instead of 'text' 2026.4.14.1143e002b85Fix HTTP tag-type ADT deserialization: coerce JSON strings to Constructors for all-nullary ADTs in request bodies 2026.4.14.10166675e71Fix type inference for unresolved vars in IO do-blocks and enhance runtime diagnostics 2026.4.11.21408d12840Implement three-tier garbage collection: frame-stack arena, per-iteration reset with promotion, and frame wrapping for recursive calls 2026.4.11.1841ad438f5Suppress unused code compiler warnings 2026.4.11.1809ecbd2b0Fix ToJSON trait dispatch for nested values in compound types 2026.4.11.1236c2930ffFix stack overflow in multi-param user function trampolines by generating curry chains instead of recursive partial applications 2026.4.9.202020f2425Allow custom implementations of the ToJSON and FromJSON traits which override the default behaviour 2026.4.9.1527442e6c8Add Functor, Applicative, and Monad instances for IO 2026.4.9.151092931e0Add unit annotations to all standard library functions 2026.4.9.141700bf9e6Enforce uppercase concrete units, lowercase unit variables in type annotations 2026.4.9.643ca8b97dImprove LSP refined types support: semantic highlighting, predicate display, expression introspection 2026.4.9.5516a039bdImplement refined types: type aliases restricted by predicates with compile-time and runtime validation 2026.4.8.11336a546f9Add semantic token highlighting for unit declarations and unit-annotated expressions 2026.4.8.104037725bdImplement 9 LSP improvements: incremental sync, cross-file references/rename, workspace symbols from disk, better signature help, code lens commands, better dot-completion, go-to-type-definition, call hierarchy, and document formatting 2026.4.7.22351c58ee9Fix case expression panic: use TrapCode::user(1) instead of user(0) 2026.4.7.214376425b3Make yield polymorphic for any Applicative monad 2026.4.7.2111926342fBundle VS Code extension with esbuild so vscode-languageclient is included in VSIX 2026.4.5.2104d960f56Improve LSP server discovery, add error handling and output channel 2026.4.5.2046ed5ba60Center logo in README 2026.4.5.20456d017c9Fix README logo alignment 2026.4.5.20410bbb96eAdd Knot logo as VS Code extension icon and to README 2026.4.5.11228a0dbb1Add VS Code extension with syntax highlighting, LSP support, and auto-release workflow