Review (2026-07-26): approved as the tool-lane template by Nicolas Burri (C-V2 red-pen round; QMS/engineering domain-expert review, no legal-counsel claim — legal review deferred to before any commercial distribution).
Tool-Risk Assessment — LQMS as a QMS Tool (TEMPLATE)¶
Tool-lane TEMPLATE, free of any organisation's specifics. Per ADR-0061 §2 the tool-risk assessment ships as a seeded template document in LQMS itself (C-V2a); each organisation that uses LQMS in its quality management system instantiates it for its own use. Everything below is true of any LQMS installation; organisation-specific values are declared template fields (§2) and nothing else. This document references no instance document — see the lane rule.
Status: working draft for review, not yet a controlled document.
Norm handling: standards are paraphrased with clause citations only (conventions.md; ADR-0061 D-5). This assessment borrows ISO 14971 / GAMP-5 vocabulary; it assesses tool risk, not the risk of any device.
1. Purpose and method¶
This is the risk input required by ISO 13485 §4.1.6 ("proportionate to risk"): what could go wrong when an organisation — here {{organisation}} — uses LQMS as its QMS / document-control tool, and what already mitigates it. It pairs with the organisation's intended-use specification ({{intendedUseRef}}); together they scope which PQ steps are mandatory in the CSV package.
Recorded, not computed (ADR-0079 doctrine, applied to the tool's own table). LQMS's own design
rule is that the tool records a risk judgment and never computes or endorses a score — the scoring
scale and how a level is reached live in content, not in the tool
(ADR-0079). The same discipline applies here: the
Severity / Likelihood / residual entries below are recorded judgments, entered by the assessor
and confirmed by the reviewer, not values this document calculated. They are written as neutral
tokens (Severity · Likelihood — Residual), never as a formula (no S × L = level), consistent
with the presentation-honesty rule in conventions.md. The scale itself belongs to the instantiating
organisation's risk policy ({{riskPolicy}}) — this template ships no suggested scores, precisely
so it cannot appear to compute one.
Each entry cites the real mechanism and its ADR / requirement / test, so the mitigation is objective evidence, not assertion.
2. Instantiation fields¶
Every value that differs between installations is a declared field; the body carries nothing else
organisation-specific. Mechanics (template-vars declarations + brace placeholders, camelCase keys):
ADR-0049 §2 and the
field guide.
organisation | Organisation validating its use of LQMS | yes |
instanceName | Deployment / instance identifier | yes |
lqmsRelease | LQMS release under assessment (tag + git SHA) | yes |
assessor | Assessor recording the judgments | yes |
assessmentDate | Assessment date | yes |
riskPolicy | Organisation's risk-scoring scale / policy (reference) | yes |
intendedUseRef | Companion intended-use specification (document id) | yes |
backupCadence | Backup + restore-rehearsal cadence on this deployment (automated / manual) | yes |
hardeningStatus | Deployment hardening per the operations guide (applied / pending) | yes |
esignatureStatus | Electronic-signature capability in this deployment (configured / not configured) | no | not configured
emailDelivery | Email / notification delivery in this deployment (enabled / disabled) | no | disabled
tr001 | Recorded judgment TR-001 wrong document served (Severity · Likelihood — Residual) | yes |
tr002 | Recorded judgment TR-002 access leak across mandators / projects | yes |
tr003 | Recorded judgment TR-003 data loss | yes |
tr004 | Recorded judgment TR-004 stale or false traceability claims | yes |
tr005 | Recorded judgment TR-005 export / audit-pack integrity | yes |
tr006 | Recorded judgment TR-006 unauthorized or self-approved release | yes |
tr007 | Recorded judgment TR-007 released evidence eroded by in-place edit | yes |
tr008 | Recorded judgment TR-008 acknowledgement gap | yes |
tr009 | Recorded judgment TR-009 audit-trail integrity / forged history | yes
Assessment identity: {{organisation}} · instance {{instanceName}} · LQMS {{lqmsRelease}} · assessed by {{assessor}} on {{assessmentDate}} · risk scale: {{riskPolicy}}.
3. Risk table¶
TR-001 — Wrong document served (stale, superseded, or not-yet-effective version)¶
- Failure mode / effect: a user acts on a version that is not the one in force → work performed against an outdated or premature procedure.
- Recorded judgment: {{tr001}} (recorded, for review).
- Mitigation in place: the currently effective version is derived, never stored — the released, non-revoked version with the latest effective date not after now; the prior version stays in force until the new version's effective date, then is superseded (REQ-EFF-002; ADR-0015, "computed, not stored states"). Released content is frozen; the only vehicle for change is a new version (ADR-0057). Overdue/periodic review is flagged and escalated — the tool never silently revokes a governing document (REQ-EFF-007). Evidence: effectivity/periodic-review tests; the full-stack browser smoke drives the release/revision loop.
TR-002 — Access leak across mandators / projects¶
- Failure mode / effect: a user sees or changes another mandator's or project's content → breach of the top data-separation quality goal.
- Recorded judgment: {{tr002}} (recorded, for review).
- Mitigation in place: row-level security enforced in the database, independent of application
code — a per-session authorized-scope set (
lqms.authorized_scope_ids), the runtime connecting as a non-BYPASSRLSrole, request-boundedSET LOCAL ROLE lqms_app+ scope GUCs via therunAscontext, SECURITY INVOKER resolution functions, and a content-plane / control-plane boundary (ADR-0009/ ADR-0026/ ADR-0027). Evidence: the automated separation suite —RlsSeparationTest(cross-scope data invisible even to an unfiltered query) andRlsConnectionReuseTest(pooled-connection isolation), negative-tested (weakening a policy makes the suite fail) and run in CI on every change (REQ-SEP-004 / -007 / -011 / -012). - Instance precondition: this backstop depends on the runtime not connecting as a BYPASSRLS role — see the hardening precondition in §4.
TR-003 — Data loss (content, records, or configuration)¶
- Failure mode / effect: hardware/volume loss or corruption destroys controlled documents and records → §4.2.4 g) loss-prevention and §4.2.5 retrieval duties fail.
- Recorded judgment: {{tr003}} (recorded, for review — see the cadence note below before recording Low).
- Mitigation in place (as designed): scripted ordered backup —
deploy/backup.sh, blobs first, database second (self-consistent archive), blob re-hash on copy (bit-rot detection),pg_dump -Fc, Keycloak realm export, a manifest, off-box copy, bounded retention (default 35 days), and a dead-man success ping — with an automated weekly restore rehearsaldeploy/verify-backup.shthat restores into a scratch project and checks migrations current, health + manifest-SHA match, blob re-hash clean, and referential closure, writing a dated verification record intodeploy/backup-verification.log(ADR-0060; RPO ≤ 24 h / RTO ≤ 1 business day per ADR-0018). Those verification records are the cited IQ/CSV evidence (ADR-0061). - Cadence is an instance fact — recorded here as {{backupCadence}}. The mechanism is implemented in the tool, but whether a schedule runs on a given deployment (backup cron, rehearsal cadence, dead-man ping) is per-installation. Where the cadence is manual, continued execution depends on operator discipline: the residual must not be recorded as Low on that ground alone, and the instantiation states the gap plainly and names the closing act — automating the cadence, a natural first ADR-0089 recurring obligation — before the organisation relies on LQMS for retained §4.2.5 records at scale.
TR-004 — Stale or false traceability claims¶
- Failure mode / effect: a coverage or trace claim shown to an auditor is no longer true (an upstream item changed) but still reads as satisfied → false assurance.
- Recorded judgment: {{tr004}} (recorded, for review).
- Mitigation in place: all traceability status is derived live, never stored — the house
doctrine (ADR-0086;
ADR-0078), so there is no stored status that
can silently drift. When an upstream item moves, the dependent link is flagged suspect per hop
(re-score a risk → its controls'
mitigateslinks go suspect; change a requirement → theimplemented-bylink goes suspect — ADR-0079); chain roll-up flags (not satisfied / satisfied-but-unverified / suspect on the path) are honest and non-suppressible, and access rules bound every hop's read. Evidence: the trace-item generalization / chain tests; risk-traceability tests exercising each suspect and gap path.
TR-005 — Export / audit-pack integrity (tampered or incomplete evidence bundle)¶
- Failure mode / effect: an exported audit pack is altered or silently truncated, or omits a cited document → the evidence given to an auditor is not trustworthy or not complete.
- Recorded judgment: {{tr005}} (recorded, for review).
- Mitigation in place: the scope audit pack / traceability report is a zip of the effective-
released PDF of every visible document plus
manifest.jsonandmanifest.txtcarrying a SHA-256 of every PDF — the evidence-grade layer a verifier re-hashes (REQ-DOC-037; ADR-0083).manifest.txtstreams last as the completeness marker (a truncated pack is detectably incomplete and raises no audit event); the singleEXPORTEDevent commits only after the whole pack is written. Transitive citation closure pulls every cited document at its effective-released version, bounded absolutely by access rules (an invisible cited document is silently absent — no name/count/existence leak). Each PDF carries a §4.2.4-style identity header and an honest "Uncontrolled copy — issued via LQMS to \<user> on \<date>; validity must be verified against the live system" footer (ADR-0074). Evidence:PdfExportServiceTest(streamed zip, sha256 manifest, citation closure, completeness marker),audit-pack.spec.ts.
TR-006 — Unauthorized or self-approved release (four-eyes bypass)¶
- Failure mode / effect: a document is released without independent review, or by its own author → §4.2.4 review-and-approval duty defeated.
- Recorded judgment: {{tr006}} (recorded, for review).
- Mitigation in place: release is gated by a per-(scope,type) review policy; the default and the floor for prescriptive types is four-eyes — the releaser is structurally not the author — and every approval/release is permission-gated and recorded in the audit trail (ADR-0003/0030/0046-0047 review-policy machinery).
- Caveat (bounds this row) — e-signature capability in this deployment: {{esignatureStatus}}. Where signing is not configured, releases are plain approvals, not asserted Part 11 electronic signatures: the capability (ADR-0014) is designed but left unconfigured, and an LQMS approval must not be represented as a compliant e-signature. The companion intended-use specification carries the matching exclusion. Where signing is configured, that configuration is itself validated and claimed before this caveat is dropped.
TR-007 — Released evidence eroded by in-place edit¶
- Failure mode / effect: a released document's trace links or relations are changed in place, so a coverage rule satisfied at release becomes silently unsatisfiable → evidence erosion.
- Recorded judgment: {{tr007}} (recorded, for review).
- Mitigation in place: released content is frozen
(ADR-0057); trace-structure changes (links,
relations) are draft-only and server-enforced — the authority rejects a structure change whose
source document has no draft version (409), so the proper vehicle for fixing released trace is a
revision, not an in-place edit
(ADR-0081). Re-attestation
(clearing a suspect flag) is deliberately state-independent and always audited. Evidence:
RelationServiceTest/RequirementLinkServiceTestdraft-gating tests.
TR-008 — Acknowledgement gap (an addressee misses a required document)¶
- Failure mode / effect: a person who must read a released document never does, or a late-added role holder is missed → training/awareness obligation unmet.
- Recorded judgment: {{tr008}} (recorded, for review).
- Mitigation in place: on release of a document that requires acknowledgement, one obligation is fanned out per addressed person; the acknowledgement is a controlled, version-precise record (acknowledging v2 never satisfies v3); a periodic sweep resolves newly-assigned role holders into open obligations (late joiners); status is reportable per document / role / scope, gaps first (ADR-0052/ ADR-0053).
- Caveat — email / notification delivery in this deployment: {{emailDelivery}}. Where delivery is disabled (ADR-0041), obligations surface in-tool only — the deployment does not push external reminders.
TR-009 — Audit-trail integrity / forged history¶
- Failure mode / effect: the record of who did what, when, is incomplete or falsifiable → the audit trail cannot be relied on as evidence.
- Recorded judgment: {{tr009}} (recorded, for review).
- Mitigation in place: life-cycle and export events are recorded append-only and tied to the acting authenticated identity; imported source history is represented as continuity without forging audit actors (ADR-0075). Evidence: audit-trail tests; ADR-0075 import verification.
4. Residual risks inherent to the tool¶
These bounds hold for every installation and are not the instantiating organisation's to remove — only to accept, or to close by configuration where a field says so. The instantiation adds its own residuals and open items on top (it does not restate these).
- Backup cadence must be operating, not merely available (bounds TR-003). The ADR-0060 mechanism is implemented and restore-verified; the schedule is a deployment act. Cadence recorded as {{backupCadence}}; where manual, automating it is the closing act (a natural first ADR-0089 recurring obligation).
- No e-signature claim unless configured (bounds TR-006): with signing unconfigured, approvals are not Part 11 signatures (ADR-0014 designed, not enabled). Recorded as {{esignatureStatus}}.
- Single-instance, no HA (bounds TR-003 recovery): recovery is backup-based within RTO ≤ 1 business day; not continuous-availability (ADR-0018).
- Deployment hardening precondition — recorded as {{hardeningStatus}}. The reference stack ships
demo credentials and a single BYPASSRLS datasource; a production instance must apply the
docs/operations/deployment.mdhardening (credentials, TLS, two-role database) before these mitigations hold in production. The RLS backstop (TR-002) specifically depends on the runtime not connecting as a BYPASSRLS role. - In-tool surfacing only where delivery is disabled (bounds TR-008): recorded as {{emailDelivery}}.
5. Open points for the red-pen round (template-level)¶
These concern the template; an instantiation's own open items live in the instantiation.
- Row set. The table covers the five rows named in the CSV concept (TR-001…005) plus four high-risk-function rows it called out: four-eyes (TR-006), released-content immutability (TR-007), acknowledgement (TR-008), audit-trail (TR-009). Confirm the set — add retention/disposal (ADR-0060 B-3) as its own row if it should be separated from TR-003, or drop TR-009 if it is considered in scope of TR-005/TR-007.
- No suggested judgments shipped. The nine judgment tokens are fields with no default, so the template cannot appear to compute or endorse a score (ADR-0079 doctrine). If a suggested baseline would be more useful than the pure doctrine, say so and it becomes a set of defaults the instantiator overwrites.
- Nine required fields at instantiation time is real friction: LQMS enforces required variables
at instantiate, so the assessor must record all nine tokens before first reading the rows in
context. The alternative is optional fields defaulting to
— to be recorded —, filled during the draft's review. Pick one. - AI-authorship as a row here vs. its own document. The AI-authorship posture template states the posture standalone; folding it in would add a TR-010 row ("AI authorship introduces an undetected defect into a released control") plus a short narrative section. That choice is the same one flagged in that document.
- Field granularity of the judgments. One field per row holds the whole
Severity · Likelihood — Residualtoken (nine fields) rather than three fields per row (twenty-seven). Confirm the coarser form is what you want in the definition table.