| REQ-API-001 |
All system functionality shall be exposed via a REST API; the frontend shall use no other channel. |
STR-013; ADR-0005, ADR-0007 |
| REQ-API-002 |
Every API request shall be authenticated and executed under the requesting user's permissions; RLS shall apply to all API-initiated database access. |
STR-003; ADR-0002 |
| REQ-API-003 |
The API shall expose the requesting user's effective permissions per resource so clients can reflect them without duplicating rule logic. |
STR-007; ADR-0007 |
| REQ-API-004 |
The API shall be documented in an OpenAPI specification generated from the implementation. |
STR-013, STR-014 |
| REQ-API-005 |
The API layer shall be structured so an MCP interface can be added as an additional consumer of the same services, subject to the same enforcement. |
STR-013; ADR-0005 |
| REQ-API-006 |
The system shall expose a product version (plain semver, per the release ritual) via GET /api/version — a productVersion field alongside the build SHA and timestamp — and surface it in the UI build/version display where the product version leads the build stamps; a pre-release build (no release tag) shall render as "unreleased". The exporting tool version shall be recorded in the EXPORTED audit event (queryable evidence), never printed on a controlled-copy face. |
STR-014; ADR-0090 |
| REQ-UI-001 |
The web frontend shall be an Angular application consuming the REST API. |
STR-007; ADR-0007 |
| REQ-UI-002 |
All UI texts shall be translatable; language shall be selectable per user. Initial languages: TBD (expected: EN, DE, FR, IT). |
STR-012; ADR-0007 |
| REQ-UI-003 |
The UI shall reflect permissions (hide/disable unavailable actions) but never be the enforcement point. |
STR-003; ADR-0007 |
| REQ-UI-004 |
UI elements shall carry stable test selectors, and E2E flows shall be runnable against seeded test data, enabling the E2E suite to serve as CSV regression evidence. |
STR-014; ADR-0007 |
| REQ-UI-005 |
The web frontend shall target WCAG 2.2 level AA accessibility. |
STR-007, STR-012; ADR-0007 |
| REQ-UI-006 |
The web frontend shall support current evergreen browsers (latest stable Chrome, Edge, Firefox, Safari). |
STR-007; ADR-0007 |
| REQ-UI-007 |
The UI shall present the differences between two versions of a document at the content-source level, distinguishing added, removed, and changed content, to support informed review and approval. |
STR-001, STR-002; ADR-0007 |
| REQ-UI-008 |
The documents view shall present the scope's folder tree as a navigation panel; selecting a folder shall filter the document list to that folder, the document detail page shall show its folder path as a breadcrumb, the create flow shall allow preselecting a target folder, a move dialog shall relocate a document, and search hits shall show the resolved folder path. (Drag-and-drop is out of scope for this baseline.) |
STR-007; ADR-0048, ADR-0007 |
| REQ-UI-009 |
The documents view shall present category tabs (PRESCRIPTIVE as "Documents", RECORD as "Records", TEMPLATE as "Templates"), the folder-tree filter applying within the selected tab, and search shall offer a document-category facet. |
STR-007; ADR-0049, ADR-0007 |
| REQ-UI-010 |
The document detail page shall present a References section listing outgoing relationships grouped by type and incoming relationships as "referenced by", with both directions always visible; authorized users shall add edges via a search-backed document picker and remove edges per relationship, subject to permission (REQ-REL-005). |
STR-001, STR-007; ADR-0049, ADR-0007 |
| REQ-UI-011 |
The system shall provide a per-scope traceability/completeness page presenting coverage rules as entry points phrased in natural language, each with its list of uncovered documents and the ability to close a gap in place (adding the missing relationship without leaving the page), plus a coverage matrix (source type × relation type × counterpart type). |
STR-011, STR-007; ADR-0049, ADR-0007 |
| REQ-UI-012 |
The draft editor shall use a CodeMirror 6 markdown editor providing syntax highlighting, a selection/transaction API for the existing formatting toolbar, and editor keymaps; it shall be lazy-loaded and shall not change the server-side markdown preview/rendering pipeline. Delta note (2026-07-10, ADR-0055/0056/0057/0058): the draft editor now DEFAULTS to a visual WYSIWYG tree editor (Milkdown Crepe) that loads/saves the ProseMirror tree record directly, with NO round-trip guard (retired by ADR-0057). The CodeMirror 6 editor is the source mode, editing the derived Markdown projection; leaving source mode re-imports text→tree. Both modes save {treeJson, projection} (PM_DOC only, ADR-0058). |
STR-007; ADR-0050, ADR-0032, ADR-0055, ADR-0056, ADR-0057, ADR-0007 |
| REQ-UI-013 |
In the CM6 editor, typing [[ shall trigger a document-link autocompletion (fed by the document lookup, REQ-SRCH-012) that inserts a [Current Title](doc:<DOC-ID>) link on selection; the relationship picker (REQ-UI-010) shall use the same search-backed lookup. |
STR-007, STR-008; ADR-0051, ADR-0049, ADR-0007 |
| REQ-UI-015 |
The draft editor shall offer a diagram slash-command that opens a lazily-loaded Excalidraw editor island; a created diagram shall render in the reading/content surface and re-render after editing (double-click to edit). Delta note (2026-07-15, ADR-0072): the island is now a self-hosted draw.io editor in a sandboxed same-origin iframe, taking over the full frame with the canvas maximized (one slim top bar: back · title · caption/alt toggle · save); the slash entry is disabled on the create form (no version yet) with a save-first hint. Double-click re-opens the diagram for editing. |
STR-007; ADR-0065, ADR-0072, ADR-0007 |
| REQ-UI-016 |
The version detail shall present an Attachments section (name, media type, size, download link) and the draft editor shall provide an upload affordance; in-content references to non-image attachments shall be ordinary links to the attachment URL, never embeds. |
STR-007, STR-001; ADR-0069, ADR-0007 |
| REQ-UI-017 |
When the effective training mode is QUESTIONNAIRE, the draft surface shall present a training section with an author-gated questionnaire editor, and addressees shall take the questionnaire from the task/inbox (with per-attempt scoring shown); questionnaire and acknowledgement status shall be reported per document, role, and scope (extending REQ-TRN-006). |
STR-025, STR-007; ADR-0070, ADR-0007 |
| REQ-UI-018 |
The system shall present a per-scope QMS-configuration surface (route /scope-config, reached via a gear affordance next to Admin rather than a top-level nav word, with a scope picker) whose tabs each appear only when the caller holds that tab's governing permission (UI reflects, server enforces): Review policies (CONFIGURE_REVIEW_POLICY — four-eyes, release mode, comment gate, approval requirements, transition roles), Training policies (MANAGE_TRAINING — requires-ack/mode, addressee roles, training due-window), and Document types (ACTIVATE_CATALOG_ENTRIES — read-only activation/category view). The former top-level "Acknowledgements" nav item shall be removed and its route shall redirect here. New per-scope policy knobs shall land as fields in these tabs, never as new nav items. (the ADR-0091 release-flow knob — STANDARD/DIRECT, offered for RECORD-category types only — landed as a Review-policies field per this rule; REQ-LC-027. The ADR-0084 per-scope design-kind vocabulary editor landed as an ACTIVATE_CATALOG_ENTRIES-gated field on the Document-types tab per this rule; REQ-VAL-004.) |
STR-007, STR-003; ADR-0073, ADR-0030, ADR-0007, ADR-0091, ADR-0084 |
| REQ-UI-019 |
The system shall present a personal "My training" page (document-training obligations and external entries with mode/status chips, plus add/plan/complete/correct affordances and evidence upload/download) and, for MANAGE_TRAINING holders, a training-management dashboard (compliance summary chips, a worst-first per-document compliance table with click-through, an oldest-first aging tab, and expiring certifications with a per-person plan lookup). |
STR-025, STR-007; ADR-0071, ADR-0007 |
| REQ-UI-020 |
The version detail shall offer a "Download PDF" affordance on post-working versions (RELEASED, REVOKED) that retrieves the server-rendered export (REQ-DOC-033); it shall not be offered for DRAFT, IN_REVIEW, CANCELLED, or disposed versions. (scope-level audit-pack export menu added by REQ-UI-024) |
STR-007, STR-011; ADR-0074, ADR-0007 |
| REQ-UI-021 |
The revise flow shall require a reason for change and accept an optional impact note (REQ-DOC-031); the version detail shall show the change-info block whenever a reason exists (highlighted, with a review hint while IN_REVIEW), the version history shall list per-version reasons, and the draft editor shall show the reason/impact read-only with an inline edit affordance while DRAFT. |
STR-007, STR-009; ADR-0001, ADR-0007 |
| REQ-UI-022 |
The traceability page shall be a WORKSPACE: an overview hub whose tiles each show a headline metric + status (e.g. "Requirement coverage 36/77 · 5 gaps") and link to a focused sub-page (/traceability/{coverage,risk,relations,training}), reserving tiles for later views (validation / GSPR). Each tile and route shall appear only where the caller holds the governing permission in a scope (REQ-ADM-010), the hub aggregating per-scope rows across the caller's permitted scopes; when the caller holds none in any scope the Traceability nav entry shall hide entirely (like Admin / scope-config). The QMB training-compliance oversight roll-up shall MOVE here (/traceability/training) while the personal "My training" page keeps only the personal view. UI gating reflects the permissions; the server enforces them (REQ-ADM-010, REQ-UI-003). (the reserved validation / GSPR tiles are now live — the validation-matrix and gspr-conformity sub-pages, REQ-VAL-005 / REQ-GSP-002; ADR-0084.) |
STR-007, STR-011, STR-027; ADR-0080, ADR-0071, ADR-0007, ADR-0084 |
| REQ-UI-023 |
Risk-analysis-capable documents shall offer a TABLE-SHAPED authoring and reading surface over their risk items in which each grid row IS a :::risk block in the document tree — add row inserts a block, edit cell edits that block's attribute, delete row deletes the block — with NO second record and no parallel serialization path (the frozen tree, content hashes and projection fidelity stay byte-unaffected). Columns shall be the fixed risk attribute set (REQ-RISK-001) plus read-only DERIVED columns from the link substrate (mitigating controls, implemented-by, verified-by, gap flags), scoped to the document. Read mode shall render the same grid read-only on the version detail; the single-item block dialog and prose-embedded risks shall remain first-class; scores shall render as recorded tokens, never as a computed (=) column. |
STR-001, STR-007, STR-027; ADR-0082, ADR-0079, ADR-0057, ADR-0007 |
| REQ-UI-024 |
The scope's documents surface shall offer a scope-level export menu for the audit pack (REQ-DOC-037): the merged reviewer's-copy PDF shall LEAD the menu and the per-document zip entry shall carry the caveat that its relative cross-file links are viewer-dependent (they resolve in a desktop PDF viewer such as Acrobat, with the files kept in one folder). Both entries retrieve the server-rendered artifacts and are permission-gated (VIEW in the scope; the affordance follows the server gate, not the reverse). |
STR-007, STR-011; ADR-0083, ADR-0074, ADR-0007 |
| REQ-UI-025 |
The toolbar scope switcher (a scope id or ALL, persisted) shall be the application's single scope-filter state; per-view scope selectors are removed. Views that can honor ALL (the documents list, search) keep client-side filtering and show everything on ALL; views that require one scope (the per-scope traceability pages — coverage, chains, risk, training compliance, obligations oversight, validation matrix, GSPR conformity, report download — and the scope-config surface) shall read the context: a chosen scope is used directly with no view-level selector, while on ALL the view renders a neutral "Select a project" picker (no preselection) and fetches nothing until a scope is picked. Picking in a neutral picker shall write the one context (the toolbar switcher follows, applying the filter everywhere); a deep link naming a scope shall apply it to the context on load. The context is a display filter only — every per-scope API call remains server-authorized (REQ-API-002); a stored context the caller can no longer see falls back to ALL. Admin pages, action-target pickers, and the inbox stay excluded. |
STR-007, STR-003; ADR-0093, ADR-0080, ADR-0007 |
| REQ-UI-026 |
GSPR/applicability documents shall offer a TABLE-SHAPED authoring and reading surface over their regulatory-ref items in which each grid row IS a :::regulatory-ref block in the document tree — add row inserts a block (born applicability applicable, the "all applicable, mark exceptions" GSPR default), edit cell edits that block's attribute, delete row deletes the block — with NO second store and no parallel serialization path (the frozen tree, content hashes and projection fidelity stay byte-unaffected), mirroring the risk grid (REQ-UI-023) for the regulatory-ref type (REQ-GSP-001). Read mode shall render the same grid read-only; the single-item block dialog and prose-embedded references shall remain first-class. |
STR-001, STR-007, STR-027; ADR-0084, ADR-0082, ADR-0057, ADR-0007 |
| REQ-UI-014 |
The frontend shall consume the live event channel (REQ-NOT-010) to refetch and refresh affected views (document list, open detail, inbox) with a subtle "updated" affordance (no toasts in this baseline) and shall display ephemeral "is editing" presence chips (REQ-NOT-011) on the draft editor and document detail page. |
STR-007; ADR-0050, ADR-0007 |
| REQ-UI-027 |
The user manual shall ship inside the application, versioned with it; help affordances on a surface shall open the topic that documents that surface, and the build shall fail if a referenced topic, scene capture or surface link is missing (bidirectionality enforced). |
STR-030; ADR-0099 |