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.
[0.3.0] - 2026-08-19
Changed
UnusedSetupKeysInTestsandUnusedSetupKeysPerTestnow resolve a context handed to adef/defpin the same file, following it through helper chains, pipes and%{ctx | ...}copies, and counting the keys that helper reads. A test that hands its context to something unresolvable — imported or remote — is treated as opaque and consumes every key in scope, so the checks stay quiet rather than report a live fixture as dead. Previously any test that passedctxto a helper read as using nothing.UnusedSetupKeysPerTestnow flags only a test that consumes none of the setup keys in scope for it. The previous rule — every test must consume every in-scope key — treated a shared fixture as a defect and was too noisy to enable: 1747 reports against 152 under the new rule, on the same 767-file suite. Its message and moduledoc now explain the cost being avoided (ExUnit has no lazylet), and document the case it cannot see: asetupwhose inserted rows are queried without being named.
Added
usage-rules.md, consumed by usage_rules, documenting how to respond to each check — starting with the rule that a report is a suspicion to verify, not a licence to delete code.SephiaCredo.TestContext, the shared AST reading behind both setup-key checks.
[0.2.0] - 2026-05-12
Added
AshCodeInterfaceReadWithArgs— flagsdefine :name, action: :read, args: [...]insidecode_interfaceblocks. Ash's generic:readaction declares no inputs, so the resulting function raisesAsh.Error.Invalid.NoSuchInputat runtime.AssertWithoutAssertion— flagsassert pattern = exprin test files where the bound variables are never used afterwards. The match succeeds vacuously and tests nothing.ProcessSleepInTests— flagsProcess.sleep/1in*_test.exsfiles, including insidesetupandsetup_allblocks. Causes flakes and slows the suite.RawRuntimeError— flagsraise "msg"andraise RuntimeError, .... Both lower toRuntimeError, defeating error-tracker grouping (every message becomes its own issue).SysGetStateWithoutTimeoutInPoll(opt-in) — flags:sys.get_state/1inside a polling fn without a surroundingtry/catch :exit. Configurable viapoll_functions:. Not added by the installer; opt in manually.
Changed
StructComparisonOperatorreplacesNoDateTimeOperatorCompare. In addition toDate,Time,DateTime, andNaiveDateTime, it now coversDecimalandVersion, and accepts anextra_modulesconfig for any other struct that defines its owncompare/2.mix sephia_credo.installregisters the new default-on checks alongside the existing ones.
Removed
NoDateTimeOperatorCompare— superseded byStructComparisonOperator. See the "Upgrading from 0.1" section of the README for the one-line migration.
[0.1.1] - 2026-04-17
- Igniter installer fixes.
[0.1.0] - 2026-04-17
- Initial release with
AppendInLoop,NoDateTimeOperatorCompare,UnusedSetupKeysInTests,UnusedSetupKeysPerTest.