Ithibati ships three optional checks for consuming applications. Enable them in your existing .credo.exs configuration to catch direct table access, unused WebAuthn settings and calls to internal functions.

Enable the checks

Include config/ in the files Credo reads; the WebAuthn configuration check needs it. Merge these entries into your configuration:

# .credo.exs
%{
  configs: [
    %{
      name: "default",
      # `config/` is not in Credo's default list, and the wax rule has nothing to read without it.
      files: %{included: ["lib/", "test/", "config/"]},
      checks: %{
        extra: [
          {Ithibati.Credo.NoDirectTableAccess, []},
          {Ithibati.Credo.NoWaxConfiguration, []},
          {Ithibati.Credo.NoInternalCalls, []}
        ]
      }
    }
  ]
}

Run compilation before Credo so the check modules are available:

$ mix compile
$ mix credo --strict

If Credo reports Ignoring an undefined check, that check did not run. Confirm that Credo is installed in the current environment and Ithibati was compiled with it available.

What each check reports

CheckReportsUse instead
Ithibati.Credo.NoDirectTableAccessQueries and repo operations naming Ithibati-owned schemas or tablesPublic identity functions, or supported account associations
Ithibati.Credo.NoWaxConfigurationwax_ settings for origin and rp_idPer-call arguments or the web handler's relying-party callback
Ithibati.Credo.NoInternalCallsCalls to undocumented Ithibati functionsDocumented APIs

Use mix credo explain for a finding's explanation. The check modules' documentation describes the individual rules.

Limits

These are static checks, not runtime access controls. Enablement is optional and a clean run only describes the code the checks can inspect.

NoDirectTableAccess recognizes schema references in queries and repo calls, including joins, and table-name strings using your configured prefix. It does not inspect raw SQL inside a string. Account associations are allowed; for example, an application may revoke an account's sessions with Repo.delete_all(Ecto.assoc(account, :sessions)).

NoInternalCalls permits generated reflection functions such as __schema__/1 and __struct__/0. It cannot classify a module whose documentation chunk was stripped, and it skips ambiguous aliases when the same short name means different modules within a file.

Use mix ithibati.doctor alongside these checks to inspect actual configuration, tables, indexes and handler wiring.