51 lines
1.4 KiB
Markdown
51 lines
1.4 KiB
Markdown
# Drawer Governance Contract (Portal No-Iframe Migration)
|
|
|
|
## Scope
|
|
|
|
This contract defines drawer behavior that must remain stable during migration.
|
|
|
|
## Canonical Responsibilities
|
|
|
|
Drawer metadata is responsible for:
|
|
|
|
- Information architecture grouping.
|
|
- Display order.
|
|
- Access visibility (`admin_only`).
|
|
|
|
Drawer metadata is not responsible for:
|
|
|
|
- Content embedding mode (`iframe`, `toolFrame`).
|
|
- Rendering technology selection (Jinja vs SPA route view).
|
|
|
|
## Contract Rules
|
|
|
|
1. Drawer IDs must be unique and non-empty.
|
|
2. Page routes must be unique and non-empty.
|
|
3. `page.drawer_id` (when present) must reference an existing drawer.
|
|
4. `order` values (when present) must be positive integers.
|
|
5. Page status must be one of `released` or `dev`.
|
|
6. Visibility outcomes must be deterministic for admin/non-admin users.
|
|
|
|
## Deterministic Rendering Order
|
|
|
|
Drawers:
|
|
|
|
- Primary sort by `order` ascending.
|
|
- Secondary sort by `name` ascending.
|
|
|
|
Pages in each drawer:
|
|
|
|
- Primary sort by `order` ascending.
|
|
- Secondary sort by `(name or route)` ascending.
|
|
|
|
## Visibility Semantics
|
|
|
|
- Non-admin users can view only `released` pages in non-admin-only drawers.
|
|
- Admin users can view all drawer-assigned pages according to current page status policy.
|
|
- Drawers with zero visible pages are hidden.
|
|
|
|
## Validation Artifacts
|
|
|
|
- `baseline_drawer_contract_validation.json`
|
|
- `baseline_drawer_visibility.json`
|