Three-layer architecture:
- Logster v2 handles HTTP request and LiveView socket telemetry in logfmt format
- Custom formatter as safety net escaping any remaining embedded newlines
- Config flag (single_line_logging) gating Logster attachment to prod only
Dev environment retains multi-line format for readability.
Mix aliases should only compose mix tasks. Shell tool orchestration
(shellcheck, fd) belongs in mise scripts. This removes the mix cmd
escape hatch and makes the boundary clear: mix.exs for pure mix
composition, scripts/ for cross-toolchain orchestration.
High priority:
- Auto-format on edit (.claude/hooks/format-elixir.sh): runs mix format
synchronously after every Edit/Write on .ex, .exs, and .heex files.
Ensures code is formatted before the next read or tool call.
- mix test permissions: added Bash(mix test) (bare) and Bash(mix test *)
(with path/flags) to the allow list. Previously only Bash(mix test:*)
was allowed, which didn't match common invocations.
- Slash commands: /precommit runs the full mix precommit pipeline and
reports failures with fix suggestions. /oban-status queries Oban job
state via Tidewave SQL, grouped by state and worker.
Medium priority:
- Chrome DevTools permissions: added 8 new tools (select_page,
list_network_requests, get_network_request, list_console_messages,
get_console_message, hover, press_key, wait_for) for debugging API
traffic, JS hook errors, hover states, and keyboard navigation.
- Gettext extraction hook (.claude/hooks/gettext-extract.sh): runs
mix gettext.extract --merge asynchronously after editing .heex files.
Async because it's project-wide and doesn't need to block the next edit.
- Sobelow permission: added Bash(mix sobelow:*) to the allow list for
independent security checks.
The upgrade surfaces a dependency problem that went unnoticed.
rustler_precompiled version 0.8.4 required castore, and that satisfied
the requirements for time_zone_info (which required the dependency
despite not listing it as such). With the upgrade to rustler_precompiled
0.9.0, castore is no longer listed as a dependency.
As it's still needed by time_zone_info, it's added to mix.exs. This
should have been done before, right when time_zone_info was added.
- Had to disable nonces for style-src directives (seems like they're not
propagated everywhere in oban_web's templates)
- Doesn't seem to support crons or workflows when backed by SQLite
Only meaningful difference with version 6 (which is required by swoosh)
is compatibility with old OTP versions. We don't care about that, so we
can try to upgrade.