Architecture Decision Records¶
Every architecturally significant decision is recorded here as a numbered ADR.
What gets an ADR (and what doesn't)¶
A decision gets an ADR when it shapes the system's structure, affects a quality goal, constrains future options, or is expensive to reverse. Examples: architecture style, data separation approach, storage/versioning model, choice of framework or persistence layer (tooling, but architecturally constraining).
Development-process conventions (commit message format, branching model, formatting, review workflow) do not get an ADR — they live in the IEC 62304 process documents (docs/process/) or docs/ai/conventions.md, which are equally version-controlled. When in doubt, ask: "would reversing this decision require touching the system or just our habits?" System → ADR; habits → process docs.
Rules¶
- File name:
adr-NNNN-short-kebab-case-title.md(e.g.adr-0001-use-quarkus.md). - Use adr-template.md as the starting point.
- ADRs are immutable once accepted — never delete or rewrite an accepted ADR; the record of what was decided when is the point. A later decision amends it via a new ADR.
- Status flow:
proposed→accepted(orrejected). A fully replaced ADR gets statussuperseded by ADR-NNNN; a partially refined ADR keepsaccepted(the change is captured by the links below, not by flipping the status). - Bidirectional links keep amendments visible from both ends: the newer ADR names what it
changes (
Refines:/Supersedes:), and the older ADR gets a matchingRefined by:/Superseded by:header line and a cell in this index's Refined / superseded by column — so a reader of the old ADR can always tell it has been amended. - Add every new ADR to the index here and in architecture/09_architecture_decisions.md (which references this registry for amendment status).
Named organizations¶
ADRs cite the first adopter organization by name where its practice produced the decision or the quote that triggered it; LQMS is not specific to that organization, and no cited example requires knowing it.
Index¶
The Refined / superseded by column is defined above as holding back-links only — what LATER amended this row's ADR, so a reader of the old ADR can tell it has been amended. 2026-09-04 link-repair wave: the 30 missing back-links and 5 half-marked pairs found by review-adr-coherence.md were filled, and where a repaired row's cell had been carrying a FORWARD relationship instead ("builds on…", "amends…"), that text moved into the Title cell. Known residue: roughly a dozen rows from ADR-0072 onward that the wave did not touch still carry forward text in this column (§2.3 of the review) — read those cells as the row's own outgoing relationships, not as amendments to it.
| ADR | Title | Status | Refined / superseded by |
|---|---|---|---|
| ADR-0001 | Content-addressed document storage with PostgreSQL as source of truth | accepted | ADR-0017, ADR-0029, ADR-0045 |
| ADR-0002 | Single instance with scope hierarchy and copy-on-derive | accepted | ADR-0027, ADR-0127 |
| ADR-0003 | Fixed life cycle states with configurable review processes | accepted | ADR-0030, ADR-0066 |
| ADR-0004 | Global catalogs for roles and document types with per-scope activation | accepted | — |
| ADR-0005 | Modular monolith | accepted | ADR-0036 |
| ADR-0006 | Three-layer search with in-database index and pluggable LLM | accepted | ADR-0044 |
| ADR-0007 | Angular frontend with server-side-only enforcement | accepted | — |
| ADR-0008 | Flyway migrations and jOOQ codegen from the migrated schema | accepted | — |
| ADR-0009 | RLS enforcement via a session-scoped authorized scope set | accepted | ADR-0027 |
| ADR-0010 | Self-managed QMS via an internal mandator | accepted | — |
| ADR-0011 | Authentication via OIDC SSO with server-side (BFF) sessions | accepted | ADR-0028, ADR-0033 |
| ADR-0012 | Permission-based authorization and system bootstrap | accepted | ADR-0027, ADR-0121, ADR-0128, ADR-0129 |
| ADR-0013 | User identity lifecycle | accepted | — |
| ADR-0014 | Electronic signatures (Part 11 / Annex 11-capable) | accepted | — |
| ADR-0015 | Document effectivity, periodic review & validity | accepted | ADR-0038 |
| ADR-0016 | Data retention, disposal & privacy (FADP / GDPR) | accepted | ADR-0040, ADR-0042 |
| ADR-0017 | Multi-part version content | accepted | ADR-0029, ADR-0045 |
| ADR-0018 | Non-functional targets (capacity, availability, security) | accepted | — |
| ADR-0019 | Notifications & tasks | accepted | ADR-0034, ADR-0037, ADR-0041 |
| ADR-0020 | Internationalization (content language, time zones, formatting) | accepted | — |
| ADR-0021 | General typed document relationships | accepted | ADR-0049, ADR-0085 |
| ADR-0022 | Read-acknowledgement & questionnaires | accepted | ADR-0052 |
| ADR-0023 | Migration / import — current released state | accepted | ADR-0068 → ADR-0075 → ADR-0113 (the current-state-only doctrine reversed) |
| ADR-0024 | Draft / in-review cancellation | accepted | — |
| ADR-0025 | Disposal & erasure mechanics (storage, index, backups) | accepted | ADR-0042, ADR-0043, ADR-0044 |
| ADR-0026 | RLS runtime safety — connection-pool scope isolation | accepted | ADR-0027 |
| ADR-0027 | RLS boundary — content-plane vs control-plane | accepted | ADR-0029, ADR-0048 |
| ADR-0028 | Stateless encrypted token-state cookie (no server-side session store) | accepted | — |
| ADR-0029 | Document content model — draft-freeze, content-table RLS, append-only audit | accepted | ADR-0045, ADR-0110 |
| ADR-0030 | Review & life-cycle realization model | accepted | ADR-0046, ADR-0047, ADR-0066 (WITHDRAW joins the state machine), ADR-0096 (transition semantics superseded), ADR-0132 |
| ADR-0031 | Released-base readability enforcement & copy-on-derive mechanics | accepted | — |
| ADR-0032 | Frontend realization — Quinoa, Angular Material, i18n & E2E | accepted | ADR-0050 |
| ADR-0033 | CSRF control for the BFF session (SameSite + JSON content-type) | accepted | — |
| ADR-0034 | Notification realization — in-process domain events + system-context fan-out | accepted | ADR-0035 |
| ADR-0035 | Fan-out contract as shipped — gate semantics, count disclosure, audit protocol | accepted | ADR-0046 |
| ADR-0036 | Repository layer — services carry rules, repositories carry jOOQ | accepted | — |
| ADR-0037 | Task scheduler — in-process tick, advisory-lock election, SQL sweep | accepted | ADR-0039 |
| ADR-0038 | Periodic-review realization — derived due date, policy-gated confirmation | accepted | ADR-0039 |
| ADR-0039 | Sweep & periodic-review contract as shipped — grants, guards, addressing | accepted | — |
| ADR-0040 | Disposal-due surfacing — closure-anchored retention, scope-level legal hold | accepted | — |
| ADR-0041 | Email channel & notification i18n — notification-as-outbox, structured messages | accepted | — |
| ADR-0042 | Disposal execution — document tombstoning, single-actor hard-gated destruction | accepted | ADR-0043 |
| ADR-0043 | Disposal blob deletion is post-commit, GC-backstopped | accepted | — |
| ADR-0044 | Search FTS baseline — event-indexed, RLS-scoped search_index | accepted | — |
| ADR-0045 | Image attachments as content parts — draft working area, freeze-to-manifest | accepted | ADR-0057 |
| ADR-0046 | Four-eyes — submitter excluded from approval | superseded by ADR-0047 | ADR-0047, ADR-0096 (transition semantics) |
| ADR-0047 | Four-eyes — submitter-only exclusion (author exclusion removed) | accepted | — |
| ADR-0048 | Document organization — folder tree per scope | accepted | ADR-0124 (the empty-scope re-draw of §3's gate) |
| ADR-0049 | Content model round 2 — type categories, template instantiation, trace relations, completeness rules | accepted | ADR-0051, ADR-0085 |
| ADR-0050 | Live frontend — SSE state push, CodeMirror 6, draft presence | accepted | ADR-0051 |
| ADR-0051 | In-text document links — doc: scheme, human-id targets, freeze-time relation sync | accepted | — |
| ADR-0052 | Addressees & read-acknowledgement — role-declared, release-fanned, controlled ack records | accepted | ADR-0053 |
| ADR-0053 | Addressees per document + process owner (amends ADR-0052 K-1) | accepted | ADR-0054 |
| ADR-0054 | Process owner is a role (amends ADR-0053 P-3) | accepted | — |
| ADR-0055 | WYSIWYG editing mode over markdown — Milkdown, byte-identical fidelity gate, entry guard | accepted | ADR-0057 |
| ADR-0056 | Visual-editor chrome via Milkdown Crepe (spike-gated, canon fenced) | accepted | ADR-0057, ADR-0059 |
| ADR-0057 | Content record is the ProseMirror tree; markdown becomes a derived projection | accepted | ADR-0058 |
| ADR-0058 | PM_DOC is the only content format — pre-production cut (amends ADR-0057 §5) | accepted | — |
| ADR-0059 | Editor engine switches to TipTap (spike-gated; supersedes Milkdown/Crepe) | accepted | — |
| ADR-0060 | Backup & restore: scripted ordered backup + automated restore rehearsal | accepted | ADR-0116 (the primary mechanism moves in-app; backup.sh becomes the drilled fallback) |
| ADR-0061 | CSV: generated validation package per release (dogfooded templates) | accepted | — |
| ADR-0062 | SBOM: CycloneDX over production layers, validated against the artifact | accepted | — |
| ADR-0063 | User identity binds on subject only (issuer becomes provenance) | accepted | — |
| ADR-0064 | Per-document workflow role bindings (author/reviewer/releaser), enforced | accepted | — |
| ADR-0065 | Diagrams: Excalidraw manual layer + Mermaid for UML (spike-passed) | superseded by ADR-0072 | ADR-0072 |
| ADR-0066 | WITHDRAW: the author side may reclaim a version from review | accepted | — |
| ADR-0067 | Review comments: anchored, immutable, resolvable | accepted | — |
| ADR-0068 | Confluence/Jira QMS import: staged, read-only, repeatable | accepted | ADR-0075 (amends M-4/M-7), ADR-0113 (supersedes for real instances) |
| ADR-0069 | Arbitrary file attachments: download-only confinement | accepted | — |
| ADR-0070 | Training questionnaires: versioned, auto-scored, release-gated | accepted | — |
| ADR-0071 | Training plans: document obligations + external certifications | accepted | — |
| ADR-0072 | Diagrams: self-hosted draw.io replaces Excalidraw | accepted | supersedes ADR-0065 |
| ADR-0073 | Per-scope QMS configuration surface | accepted | — |
| ADR-0074 | PDF export of released documents — server-side via Apache FOP over the canonical projection | accepted | — |
| ADR-0075 | Source history import: continuity without forged audit | accepted | amends ADR-0068 |
| ADR-0076 | Periodic-review status visibility (due date + history), derived not stored | accepted | reaffirms ADR-0038 |
| ADR-0077 | Requirement items: keyed blocks inside controlled documents | accepted | ADR-0088 |
| ADR-0078 | Generalized trace items: one typed item, type-agnostic engines (traceability model stage A) | accepted | extends ADR-0077 |
| ADR-0079 | Risk & risk-control items: ISO 14971 thread, scores recorded (scheme is content) — traceability model stage B | accepted | builds on ADR-0078 |
| ADR-0080 | Traceability workspace: overview hub + role-gated sub-pages; QMB training oversight moves out of My training | accepted | ADR-0093 (the per-view scope selectors are removed) |
| ADR-0081 | Draft-only trace-structure changes, server-enforced (409); importer/seed resequenced create→link→release | accepted | enforces ADR-0049/-0077, follows ADR-0080 |
| ADR-0082 | Table-shaped risk authoring: a grid surface over :::risk blocks — the tree stays the record |
accepted | builds on ADR-0079 |
| ADR-0083 | TD dossier: versioned cross-scope regulatory-structured deliverable — doc-version pins, DRAFT→ISSUED, merged PDF + hash-manifest zip; builds on ADR-0074/-0075 | accepted | ADR-0104 (issued dossiers become persisted artifacts of record) |
| ADR-0084 | Validation & regulatory axes (traceability Stage C: schema-driven frontend, four new types, conformity + validation views) | accepted | — |
| ADR-0085 | Relation-layer consolidation: one trace vocabulary over document relations + item links | accepted | — |
| ADR-0086 | Requirement trace chains: end-to-end path view + flat CSV path export; rides the coverage-engine edge-type-set consolidation; builds on ADR-0077/-0078/-0080 | accepted | ADR-0088 |
| ADR-0087 | Scope traceability report: one derived overview artifact (gap digest + sectioned chains), hub download + audit-pack entry — never a controlled document | accepted | builds on ADR-0086/-0083/-0074 |
| ADR-0088 | Verification evidence classes: planned vs verified derived at the read layer via a per-type evidence flag; evidence dates surfaced | accepted | refines ADR-0077/-0086 |
| ADR-0089 | Recurring obligations: periodic QMS tasks with released-record completion evidence, derived due/overdue, inbox fan-out | accepted | — |
| ADR-0090 | Release & versioning policy: semver from v0.8.0 (1.0 = audit-readiness), deliberate communicated releases (tag → report-at-tag → GitHub release), pre-1.0 wire-breaking allowance | accepted | — |
| ADR-0091 | Release modes: single-person DIRECT release for RECORD-category types with a structural four-eyes floor (PRESCRIPTIVE/TEMPLATE never relaxable) | accepted | pairs with ADR-0089 |
| ADR-0092 | Orphan-blob garbage collection: quarantine bin (30-day soft delete, registry not file move), explicit reference-column inventory, never-delete-referenced invariant | accepted | discharges ADR-0025/-0042 GC assumption |
| ADR-0093 | One scope context: the toolbar switcher is the only scope selector; per-view selectors removed; required views show a neutral picker on ALL that writes the shared state; refines ADR-0080 and the toolbar context switcher the code calls "Amendment B" (see the ADR's citation note) | accepted | — |
| ADR-0094 | Calendar-anchored obligation schedules: INTERVAL/MONTHLY/YEARLY with day-clamping (never too late), occurrence-after-anchor next-due, sweep-derivation parity pinned | accepted | extends ADR-0089 |
| ADR-0095 | Key-rule governance: free until first use, then frozen; changes only as an audited, loudly-confirmed exception act | accepted | — |
| ADR-0096 | Transition permissions: always visible, deny unless granted; the complete grant set per policy | accepted | — |
| ADR-0097 | Governed provisioning surface: MANAGE_SCOPES gates the four birth acts (mandator, scope, type/role activation, key rules), all audited GLOBAL-anchored; 2026-07-30 amendment adds the governed scope-settings update | accepted | ADR-0109 (§5 — MANAGE_MANDATORS splits out), ADR-0122 (§4 — CREATE_PROJECT splits out, so "one permission gates all four acts" no longer holds) |
| ADR-0098 | Org chart × role system: marriage at the evidence level (primary staffing bit, derived authority view), never in authorization | accepted | — |
| ADR-0099 | The user manual is an in-app topic reference (scene-captured, lint-gated), not a controlled document | accepted | — |
| ADR-0100 | The name: LQMS is the Living Quality Management System | accepted | — |
| ADR-0101 | The executable validation journey: PQ evidence that cannot drift (journey bundle promoted at release) | accepted | extends ADR-0090 |
| ADR-0102 | Typed template variables (text/date/number, deliberately no enum) | accepted | — |
| ADR-0103 | npm audit joins the verification gate as a second standing input (release-blocking, triage-documented) | accepted | extends ADR-0090 |
| ADR-0104 | The issued dossier is a persisted artifact of record and clones to a new draft; plain delete forbidden | accepted | — |
| ADR-0105 | Navigation grouped by moment-of-use: Work flat, Evidence menu, Admin behind the gear | accepted | — |
| ADR-0106 | Client reflection follows assignments, not only content reach (the fresh-install dead-end, half 1) | accepted | pairs with ADR-0107 |
| ADR-0107 | Audit append follows assignment reach — "write where you are staffed, read what you may view"; amended: enforcement counts resolve on true state | accepted | realizes V080-V086 |
| ADR-0108 | Mandator membership: invite-accept for everyone, pre-assigned responsibilities, redemption-time evaluation; wave 2 = email branch, provider-minted credentials | accepted | — |
| ADR-0109 | Organization founding is its own process: operator-only workflow, project step never creates a tenant, narrow empty-org dissolve, MANAGE_MANDATORS splits from MANAGE_SCOPES; amends ADR-0097 | accepted | ADR-0122 (§4 — CREATE_PROJECT splits out too; §5's "MANAGE_SCOPES keeps project-scope create" is stale) |
| ADR-0110 | The audit trail is not a read model: written by every act, read only to be shown or counted — promoted facts (V088 shape) answer business questions | accepted | refines ADR-0029 |
| ADR-0111 | Imported persons are external: unbound, uninvitable, provenance-marked; never auto-merge on email (bulk-but-explicit link); source trail travels as evidence artifact; importer = step one of the generic transfer arc | accepted | builds on ADR-0108/-0110 |
| ADR-0112 | The element-kind catalog: kinds carry semantics + dependencies in the MODEL; scopes activate kinds (key rule = the visible half); custom kinds as a semantics-free tier; extending the well-known set is a product act with chains-as-data; per-scope labels+prefixes frozen at first use | accepted | re-founds the #33k arc; builds on ADR-0086/-0095 |
| ADR-0113 | Project arrival import: released documents arrive released with their true approved bodies, source dates and EXTERNAL authors; nothing backdated ever; D1 cage structural; Amendment 1 — head-only floor by design (ceremony-fingerprint premise falsified by the full-corpus oracle) | accepted | builds on ADR-0110/-0111 |
| ADR-0114 | The operating model arrives with the corpus: roles as functions with the mapping preview, one-transaction policy arrival, per-document source bindings; §7 — dissolve locked by the first LOCAL release | accepted | builds on ADR-0113 |
| ADR-0115 | Collaborative draft editing mainline: recovery buffer, session lock, honest credit — the contributor set as frame-fact read from the real trail; reconnect + SSE meta-sync; no feature flag | accepted | realizes V100 |
| ADR-0116 | The system maintenance surface: the app backs itself up (async audited pg_dump + blob archive into its own volume, image-pinned client), backup evidence + NO_VERIFIED_BACKUP finding + job heartbeats on Admin → System; the host keeps one dumb sync job; restore stays deploy-level | accepted | realizes V102; EXPORT_BACKUP finds its home |
| ADR-0117 | Role documentation: described_by link on the role ACTIVATION (manual / import recognizer / cross-scope), ROLE_WITHOUT_DESCRIPTION setup finding (staffed+activated, warn not block), per-source recognizers; substitution REJECTED as acting-as — staffing is the mechanism, time-boxed staffing the named trigger; builds on ADR-0114/-0098 | accepted | ADR-0130 + ADR-0131 — the named trigger FIRED 2026-09-01: the acting-as refusal stands, time-boxed staffing was built and the declared substitution matrix rides it. This ADR's own realization (described_by, ROLE_WITHOUT_DESCRIPTION, recognizers) is still unbuilt — open-decisions row 62 |
| ADR-0118 | Offline QMS copy: the scope audit pack committed to the repo as loose PDFs + manifest.json — reuses ADR-0074's §4.2.4 header/footer and ADR-0083's sha256 manifest, so NO second renderer; index.md the pointer that survives alone; two-question drift split; eligibility opt-in per scope | accepted | in 1.0 — open decision 10 (eligibility) ruled 2026-08-24, 1.0 inclusion confirmed 2026-09-04; only the pack-size measurement remains before implementation (v1.0-criteria C-4d) |
| ADR-0119 | Module-internal package structure: capability packages first, layer packages second (closed at ADR-0036's service/repository), capability root = published surface (promotion is a visible move, killing api/model churn), ONE cross-capability rule (never import a sibling's repository/), Kotlin file-privacy absorbs internal DTOs, ports for behavioral seams; Konsist enforces in the same wave | accepted | rides with the scope split, before the export twin; realization queued |
| ADR-0120 | The shared kernel: the domain-exception vocabulary (DomainExceptions.kt, requireValid/checkState) leaves the authorization module for a dependency-free common module — scope becomes purely authorization + tenancy; RlsScopeContext and TransactionPostCommit deliberately stay |
accepted | rides with ADR-0119; closes the 2026-08-18 review's scope finding |
| ADR-0121 | Project Administrator role: seeded, bootstrap-ensured per-scope administration (ASSIGN_ROLES, MANAGE_USERS, ACTIVATE_CATALOG_ENTRIES, CONFIGURE_REVIEW_POLICY, MANAGE_TRAINING) plus read-class content (VIEW, VIEW_TRACEABILITY) — admin≠content stays absolute at GLOBAL, deviates at project level behind the project's own activation+staffing act; authoring/approval and records-governance permissions OUT deliberately; permission-vocabulary classification guard test | accepted | realization rides v0.9.16; ADR-0114 name-adoption consequence stated |
| ADR-0122 | Org-level administration: cascade kept as documented contract (sovereignty flows downhill), cascaded holders rendered as derived "via organization" rows wherever evaluators count them, warning on org-activating authoring-class roles (flexible per org — no catalog flag until a proven variation point), CREATE_PROJECT split from MANAGE_SCOPES checked at the target org's anchor, wizard birth path opens to org admins | accepted | realization rides v0.9.18 |
| ADR-0123 | Draft save-points: save-level (never keystroke) restore history, retained for the LIFE of the version incl. post-release (his reconstruction use case), deleted by disposal / reached by dissolution, restore = new audited save with provenance, visibility follows DRAFT access not VIEW | accepted | IN SCOPE FOR v1.0 (his ruling); new FORCE-RLS table — the inventory guard will demand classification |
| ADR-0124 | Birth without content clothes: while a scope holds ZERO documents, folder creation is a setting-up act (ACTIVATE_CATALOG_ENTRIES in scope; first record → ORGANIZE_DOCUMENTS governs; empty-scope line checked in the write transaction, V106 pattern); the wizard stops recommending self-staffing across the admin≠content boundary; staffing bridge accepts hand-added roles; re-entry via the governable union; filtered offers named | accepted | his boundary insight; realization = the next wave |
| ADR-0125 | The export twin: export emits an ARRIVAL BUNDLE (one exporter, the battle-proven consumer); unit = project + declared dependency manifest; fidelity line = released corpus travels, acts stay (ADR-0075 red line; migration loses the working-record layer BY DESIGN, said in bold); in-app audited EXPORTED act (PackWriter pattern, EXPORT_PROJECTS@GLOBAL); export is a read, V106 one-shot governs the target; cross-scope refs re-bind by identity, never tree export (you export what you own) | accepted | Amendment 1: id-adoption (batch-only, counter seeded), REVOKED as state, treeJson beside the md; Amendment 2 (the base-library landing): idsAuthoritative extends to adopted-EMPTY scopes (V118), the id namespace is the BUNDLE's declared code behind an explicit flag, mandator check only where the target has one; round-trip count-diff = the C-4 evidence |
| ADR-0126 | Project dissolution: mayBeDissolved pre-resolved on project rows (null to the ungated); gate = CREATE_PROJECT at the org anchor (creation's mirror); line in two slices — zero documents now, V106 working-record line next (drafts destroyed with counted consent, a native release blocks: it is a witnessed approval act); V113 destroyer re-checks past RLS, delete set from pg_constraint; SCOPE_DISSOLVED beside SCOPE_CREATED at the org anchor, event-then-destroy one transaction; departure dissolve = separate act riding the export twin (verified export + named final backup cited); any-status sysadm kill switch REJECTED (the wall argument recorded); sandbox scope kind named as the post-1.0 direction | accepted | wave-1 lane dispatched; slice 2 after it proves the pattern |
| ADR-0127 | Base-QMS layers: consumption-defined — base library = the one GLOBAL scope read in place (BASE_READ, released face only), templates = derive masters (adapt + SOURCE_UPDATED drift, never auto-propagated), records stay; tool-operational docs migrate-then-REVOKE-then-supersede (his amendment — the transition itself becomes QMS evidence; revocation wave only AFTER import acceptance, the one-shot window); Base Reader role auto-assigned at GLOBAL; picker demotes (never hides) a mastered-here template; row 29 = refuse with the remedy in hand (missing kinds named, one-click activation for the authorized); migration = export twin bundle-split; base-library UPDATE imports sequenced-after | accepted | Amendment 1 (2026-08-29): the visibility doctrine — the four faces (strangers nothing; readers who-did never who-may; members full process transparency; participants the working layer); build wave: reader role + picker demotion + derive refusal; instance migration scheduled by the owner |
| ADR-0128 | The GLOBAL cascade carries administration, never content: from a GLOBAL assignment only ADMINISTRATIVE-class permissions cascade; CONTENT-class permissions are effective in GLOBAL alone (ADR-0121's guarded classification becomes structural — QMB@GLOBAL = library authoring with zero project reach; lqms-admin and Base Reader unchanged by construction; MANDATOR-anchor cascade untouched) | accepted | his catch at the library-staffing question; V005 slice to build |
| ADR-0129 | Role identity from a GLOBAL assignment acts in GLOBAL alone: workflow authority (role-gated — approve/release/revoke have no permission) stops cascading from GLOBAL; MANDATOR-anchor role cascade deliberately KEPT (org staffing is a ruled feature, stops at the org boundary); one shared predicate across lqms_effective_roles + every holder/authority/fan-out sibling | accepted | the residual half of his catch; ships BEFORE genesis staffing (G-5) |
| ADR-0130 | Break-glass: the project administrator's escalation is a first-class, witnessed, self-expiring act — PA's permission set UNCHANGED (no standing content rights: ASSIGN_ROLES was always the master key, so the boundary is a witness, not a capability limit); refusals become doors (missing permission + holding roles named, inline audited self-staffing for ASSIGN_ROLES holders); permission closure surfaced at import + a setup-status dead-end check; TIMED self-staffing (30/60 min, 1 day; default 60) enforced in the authorization predicate — expires_at filtered on the assignment READS, never a job, keeping the ADR-0129 inlined predicate immutable; header chip while active, doubling as the pre-expiry warning | accepted | closes row 48 (all three layers); realizes ADR-0117's time-boxed-staffing trigger; §6 resequenced into 1.0 by ADR-0131 |
| ADR-0131 | Role substitution as declared adoption edges: "A may take over B" authorizes a holder of A to SELF-STAFF into B — own name, witnessed, timed (the ADR-0130 mechanism; ADR-0117's acting-as rejection load-bearing — four-eyes stays intact because the substitute IS a different person); the matrix is operating-model content (per-scope governance act, travels in the arrival bundle, the declaration IS the qualification statement); hard constraint: CONTENT-class targets only, refused at declaration via the ADR-0128 classification (no master key through a side door; absent PA covered via ADR-0122, not the matrix); emergency ≠ planned absence (short presets self-service; vacations = ordinary deputy staffing by the PA); not built: transitive edges, cross-scope edges, impersonation | accepted | his feature, ruled IN 1.0 — resequences ADR-0130 §6; mechanism + matrix land as one arc after the 1.0 fix waves |
| ADR-0132 | Dual-hat reviewer satisfaction is a declared policy choice: a per-(scope, type) review-policy flag — one person may satisfy multiple role requirements — default OFF, so today's cross-role distinct-person floor stands everywhere until a scope's governance opts in (a witnessed CONFIGURE_REVIEW_POLICY act that travels in the arrival bundle); untouched by the flag: within-role distinctness, four-eyes (≥2 humans per release, always), one approval = one declared role (ADR-0064 D-4a); "Approve as <Role>" ships UNCONDITIONALLY; the global change rejected as undeclared semantic weakening (the row-52 defect class); implementation post-1.0 (his ruling) |
accepted | refines ADR-0030 point 4 |