Judge the code
`describe` says what exists; `check` judges what you made of it. Both read the INSTALLED code, so neither can be out of date.Running it
py -m bretzel.cli.main check my_app/
py -m bretzel.cli.main check --deep my_app.main:app
The first pass is STATIC: it reads the files, mounts nothing, and needs no app to start. `--deep` additionally mounts the real app and arbitrates its map — the declared features against what they really do.Why ONE MORE linter
Ruff and mypy judge Python. Neither knows that an unknown kwarg passed to `ui.button` leaves as an inert HTML attribute: it does not raise, it does not show, and it is not visible in review. That is the dominant failure mode here, and it is the one these rules take — each catches a SILENT mistake.What it can see
18| Rule | It refuses… |
|---|---|
| assembled-tailwind-class | an assembled Tailwind class only exists in dev |
| class-duplicates-a-prop | a class in `classes=` that the SAME prop already sets |
| half-overridden-size-step | a theme that resizes PART of the form controls |
| hand-written-transport | an app does not drive the transport by hand |
| lambda-handler | a handler cannot be a lambda |
| link-inside-a-link | a link INSIDE a link — the parser undoes the card |
| mixed-sizes | SIBLING form controls at different sizes |
| non-literal-html | `ui.html` with anything but a literal |
| page-declared-in-a-function | a `@page` declared in a function body, harvested by nothing |
| state-built-on-the-loop | a `ServerState` built in an `async def` body |
| state-lost-by-a-cast | a cast that erases a state value's PROVENANCE |
| test-client-without-lifespan | a `TestClient` built without ever entering the lifespan |
| theme-step-changed-shape | a theme override that keeps the NAME and changes the SHAPE |
| undeclared-shared-counter | an `AppState` total incremented without being declared additive |
| unknown-kwarg | a kwarg passed to `ui.*` that the component does not accept |
| unknown-theme-vocabulary | a `Theme(components={…})` name that nothing reads |
| value-outside-the-table | a `variant=` / `size=` value no table carries |
| zone-listening-too-widely | a zone listening on behalf of a NESTED zone |