Review pass over `1.4.0`…`1.9.1`: port 25 no longer shares the submission milter chain, DMARC reports are validated before they are stored, and the auto rate limit is correct for a non-default level-1 window. Schema migration `0010` (index only). Upgrading is a tag bump. Added: - SQLite migration `0010_send_log_app_login_index.sql` — - DMARC aggregate reports are accepted as **zip** as well as gzip or plain XML - e2e: `checkPort25ConfigCombinations` regenerates the Postfix configuration Changed: - README hero line and a **Positioning** block in `docs/product.md` record the Fixed: - The setup account's password is hashed at bcrypt cost `12` like every other - Login/setup rate limiter: protecting blocked buckets from eviction is now - `postqueue -p` output is bounded to 4 MiB (the timeout alone left the size of - [schema-migrations.md](docs/schema-migrations.md): the schema section was - postqueue reader is now time-bounded: `postqueue -p` runs under a 5-second … (11 more in CHANGELOG) Changed: - [roadmap.md](docs/roadmap.md) now carries everything the 2026-08-19 code - Extracted `internal/configsafe` — the empty-value and forbidden-character - Build, deploy and migration comments no longer cite the archived - Dropped the `parseDomainRateLimitForm` / `parseAppRateLimitForm` pass-through - Extracted shared helpers: `internal/atomicfile` (atomic temp-write+rename) and … (7 more in CHANGELOG) Removed: - Unused legacy asset `docs/assets/icon.png` (superseded by the four brand SVGs - Plan documents for already-shipped features: `domain-stats-auto-ratelimit`, Full detail: CHANGELOG.md (1.9.2).
40 lines
2.0 KiB
Plaintext
40 lines
2.0 KiB
Plaintext
---
|
|
description: The panel's design is fixed by accepted mockups; implement it, do not reinterpret it.
|
|
globs: internal/web/view/**,docs/assets/panel-redesign/**
|
|
alwaysApply: false
|
|
---
|
|
|
|
# Panel design contract
|
|
|
|
Source of truth, in this order: the mockups in
|
|
[docs/assets/panel-redesign/panel/](docs/assets/panel-redesign/index.html),
|
|
the [components page](docs/assets/panel-redesign/panel/components.html),
|
|
`panel/outlines.json`, then
|
|
[docs/plans/panel-redesign.md](docs/plans/panel-redesign.md). Read the plan's
|
|
**The contract** and **Enforcement** sections before touching a template.
|
|
|
|
You are implementing a finished design. You are not designing.
|
|
|
|
- Build pages only from Bulma classes in the `BULMA` list of `panel/check.py`
|
|
and from the `sp-` components on the components page, through their
|
|
partials. No other class, no hand-written component markup, no inline style.
|
|
- No selector in `panel.css` that names a page or an id, uses `!important`, or
|
|
sets a width outside `WIDTH_OK`. If a page looks wrong, the layout choice is
|
|
wrong — do not patch it locally.
|
|
- If a screen seems to need a component, state or layout that does not exist:
|
|
**stop and ask.** Do not approximate it, and do not substitute a look of
|
|
your own.
|
|
- Never edit a mockup, `outlines.json`, `check.py`, the vendored Bulma or a
|
|
guard test to make your work pass. A failing guard means the implementation
|
|
is wrong. Design changes go mockup-first in a separate `design:` commit on
|
|
the owner's explicit instruction.
|
|
- "Done" is evidence, not a description: passing `go test ./internal/web/...`
|
|
output plus a screenshot of each restyled page from the running container,
|
|
saved under `docs/assets/panel-redesign/evidence/` beside its mockup's name.
|
|
Report every difference from the mockup you could not remove; do not
|
|
describe a different result as the requested one.
|
|
|
|
After editing a fragment in `panel/src/`: `python panel/build.py`, then
|
|
`python panel/check.py` (add `--write` only when the structure change is the
|
|
point of the commit).
|