$ cat elixir/week/2026-11-02.log
the week in review · Nov 2 – Nov 8, 2026
Ecto stops caching interpolated JSON paths and splices
By RepoJournal · composed from the cited sources · human-reviewed weekly · methodology
The same-change Ecto patch closes a memory-exhaustion DoS that grew one cache entry per distinct JSON path and per splice length.
Do not cache queries with interpolated JSON paths, splices, and constants elixir-ecto/ecto
Each distinct interpolated JSON path and each distinct spliced-list length created a new cache entry, so query cache growth was driven by input rather than code. Interpolated JSON paths now stay as parameters instead of being inlined, which changes the generated query for anyone who relied on the inlined form.
Recursive type pretty printing elixir-lang/elixir
Recursive types now print as named definitions such as rec(x, nil or {integer(), x}) rather than expanding fields over and over, and tuples, maps, lists, functions and dynamic types are all covered while and/or/not expressions are preserved. Type errors in recursive data structures become readable; the type checker itself is unchanged.
Store query expression files relative to the current directory elixir-ecto/ecto
Query expressions stored the caller's absolute file path at compile time, so a project copied into a new checkout that reused its _build reported the original checkout's files in Ecto.QueryError messages. They are now stored relative to the current directory, which fixes diagnostics for git worktrees and copy-on-write clones.
Prune disjoint positives when converting map and tuple BDDs to DNF elixir-lang/elixir
Converting map and tuple BDDs to DNF used to expand every path and only then drop the lines with disjoint positive literals. Pruning those positives during conversion keeps large types refined by unions, such as a struct with a negated guard intersected with %{m: not :pp} or %{t: not :nn}, from blowing up before the empty paths are discarded.
Occurrence typing for cond and with elixir-lang/elixir
Occurrence typing now covers cond and with, the two constructs where a narrowed type from an earlier branch or match was previously lost. Alongside it, atom keys mixed with other domain keys in maps are tracked as optional, and the compiler tracks which guards may fail.
Improve checks in `return_compare` and `mismatched_ordered_comparison` elixir-lang/elixir
The return_compare and mismatched_ordered_comparison checks got tightened, with an unused number_type?/1 removed. The commit notes list Claude Code among the assistants, worth knowing if you audit how type-checker changes land.
Share one prepare function across router clauses phoenixframework/phoenix
Each __match_route__ clause previously compiled its own anonymous function just to merge path params with the route's private and assigns; clauses now return {private, assigns} and share one prepare function. Large routers stop paying one extra function per route in the Erlang compiler.
Store component call file relative to cwd phoenixframework/phoenix_live_view
Alongside: Phoenix's ~p route warnings and Elixir's after_verify diagnostics also moved to current-directory-relative and absolute source paths, while LiveView refuses joins whose url has no host instead of crashing and resolves that error page's relative links.
$ ls elixir/week/ # the briefings behind this review
Keep up with Elixir & Phoenix in about 3 minutes: what actually shipped — the commits, pull requests, releases, and security advisories that matter.
fair warning: these emails are deeply technical. diffs, version numbers, CVEs, benchmark deltas. if that's not your idea of a good read, this isn't your newsletter.
Folds into your digest — weekly by default, monthly if you prefer. Unsubscribe in one click.