LQMS Known Limits¶
- Status: the C-5 known-limits statement from v1.0-criteria.md — honesty as a feature. Every entry is a deliberate limitation of the 1.0 claim, with its reason and its named future (a register row, an ADR trigger, or a post-1.0 lane). A limits document that hides limits is worse than none; if something below surprises you, the surprise is the document working.
- As of: v0.9.44 (2026-09-04). Two hardening waves are in flight toward v0.9.45, and a handful of ruled-into-1.0 features are decided but not yet built — those are not listed as limits; they are separated into §The runway at the end so this document stays true at the tag.
- Companion: what the system defends, how, and against whom is the security posture — including the trust boundaries (operator, DB superuser, host, IdP) that are design decisions, not limits, and are therefore stated there.
1. No electronic signatures — the Part 11 boundary¶
The limit. LQMS 1.0 has no electronic-signature mechanism. Approvals, releases and revocations are witnessed, authenticated acts — recorded append-only with actor, role, timestamp and the content hash they bind to — but they are not electronic signatures in the FDA 21 CFR Part 11 / EU Annex 11 sense: there is no signing ceremony, no step-up re-authentication, no recorded signature meaning, no per-signature assurance proof. A deployment carrying Part 11 / Annex 11 obligations cannot satisfy them with LQMS 1.0.
Why. Ruled 2026-09-02 (register row 46): no mechanism before 1.0. The witnessed-approval
record already carries what ISO 13485 needs; building the Part 11 ceremony for customers who do
not need it would be weight without a wearer. The design exists and is accepted
(ADR-0014); the whole REQ-SIG group is honestly
marked future in the traceability matrix.
Named future. "Part 11 mode" as a named opt-in post-1.0 lane feature — OIDC step-up, signature meanings, per-signature record — per the row-46 ruling. The 1.0 rider from the same ruling (verify the released PDF's identity header prints releaser + approvers + dates) is tracked in v1.0-criteria.md C-1d.
2. The runtime database credential — DEBT-001's two-role packaging¶
The limit. The shipped deployment connects with a single privileged (BYPASSRLS) database
credential. Every content transaction drops into the RLS-subject role lqms_app via
SET LOCAL ROLE before touching data — so row-level security is enforced per transaction — but
the database is not the last line of defense against an application path that skipped that
discipline: such a path would run privileged instead of failing closed.
Why. Accepted as a residual 2026-08-21 (risk register D-4; the register's former row 2),
paired with a compensating control that exists and is mutation-proven: an architecture rule
fails the build when a persistence entry point is reachable outside runAs, and
PrivilegedDataAccessInventoryTest forces every privileged door to carry a written argument
(19 today). That moved RISK-002's residual to S4×P1 — opening a new privileged door now requires
deliberately writing a false argument into an inventory.
Named future. The packaged two-role split (lqms_runtime, NOBYPASSRLS at the pool) is
staged as arc42 §11 DEBT-001, specified in
deployment.md §4; it is the stronger control and closes the residual
entirely when packaging work justifies it.
3. The base library lands exactly once — and a wrong landing has no undo¶
The limit. The installation-wide base library (the GLOBAL scope) can be arrival-imported exactly once. There is no undo for a partial or wrong landing: neither dissolve function accepts GLOBAL, and a second batch requires a scope with zero documents. Documents land one committed transaction at a time, so a bundle failing at document #100 leaves 99 documents in the library every tenant reads — permanently, short of manual surgery.
Why. C-1a finding D-6 (review-c1a-module6.md), MAJOR, remedy sized L: what "undoing a base-library landing" means when the library is readable by every tenant is an ADR-sized decision, deliberately not improvised. The shipped mitigations are preventive: the import preview refuses id-less and doubly-claimed documents up front (the v0.9.39 fix wave — hardened because a GLOBAL landing has no undo), and ADR-0127 §5 makes inspection-before-acceptance the migration discipline. Operator consequence: treat the base-library import like the §8b production import it is (server-deployment.md §8b) — inspect the bundle, run the preview, land it deliberately.
Named future. The base-library UPDATE arc (ADR-0127 §5's "named, sequenced-after arc"; register row 66, recommended post-1.0 with a named trigger: due the day the library needs its first distributed revision). Until it lands, the base-library story is explicitly one revision deep: there is no mechanism for a revision reaching a GLOBAL scope that already holds documents.
4. What a migration bundle does and does not carry¶
The limits, three of them, in descending order of surprise:
- The working-record layer never travels — by design. A portability bundle carries the released corpus and its provenance; it carries no audit trail, no approvals, no acknowledgements, no comments, no periodic reviews, no tasks, no save-points. A migration loses these, and the bundle's own README says so; the source instance (or its final backup) remains the archive of record (ADR-0125 §3).
- Format 1.1 silently drops two fields it should carry.
verification_evidence— so a fully VERIFIED requirement chain lands in the target looking merely PLANNED, with no warning — andretention_period; and thecrossScopeReferencesNotCarriedcounter does not count what it actually drops. Until the ruled point release lands, do not run a production migration expecting verification state or retention rules to travel. - Cross-scope citations do not travel (G-10) — ruled out of 1.x. References into other scopes
leave the bundle as listed identities, never as content. Re-binding them in the target is
confirmed out of scope for the whole 1.x line (register row 59, ruled 2026-09-05): the
exporter's own recorded argument stands as the decision, not as an unexamined default. What the
bundle offers instead is the compensating
crossScopeReferencesNotCarriedcounter — and that counter only becomes the true compensation when the rows-52/53 fix makes it count what it actually drops. That fix is in flight; until it lands, the honest reading of this limit is the one above it — the bundle drops more than it reports.
Why. The first is the ruled trade of the export twin ("the corpus travels, the acts stay" — his 2026-08-24 ruling, ADR-0125). The second is a defect the row-37 two-instance rehearsal caught, ruled 2026-09-04 (rows 52/53: fix the format, fix the counter) — named here because this document's as-of predates the fix. The third is now a ruling, not merely a scope statement: row 59 was decided 2026-09-05 — cross-scope re-binding stays out of the entire 1.x line, and this entry is where that ruling lives. Its honest compensation (the counter) becomes true when rows 52/53 land.
Named future. The bundle-format point release (rows 52/53 + row 55's export-eligibility rule, queued behind hardening lane B; tracked as v1.0-criteria C-4) — it is what turns G-10's counter into an honest one. Re-binding itself has no 1.x future by decision (row 59); it becomes a question again only if a 2.x portability arc reopens it.
5. Single instance, no high availability¶
The limit. LQMS 1.0 runs as one application instance on one node. There is no clustering,
no failover, no zero-downtime upgrade. The engineered envelope
(ADR-0018): ~100 users (~20 concurrent), tens of
projects, on the order of 100k document versions; availability ~99.5% during business hours;
nightly backups (RPO ≤ 24h), restore within ~1 business day (RTO). Upgrades take a short outage
(~30 proven upgrades on the reference installation; deploy/release-chain.sh).
Why. The target tier is the deliberate decision — a QMS for teams this size fits comfortably on one PostgreSQL node, and clustering machinery would be operational weight the adopter pays daily for an availability class they did not ask for. The session layer is already stateless (ADR-0028) so the architecture does not bar redundancy — but the collaborative-editing relay is instance-local and is the named blocker.
Named future. ADR-0115's named trigger: multi-instance deployment requires sticky sessions or a broker for the collab relay — built when a real deployment needs it. Revisit the tier only if scale assumptions change (ADR-0018).
6. Data-protection automation is partial¶
The limit. Retention rules, legal hold, and deliberate audited disposal are built and
verified (REQ-DPR-001..005, 009..011). The erasure half of the FADP/GDPR story is not:
no "what personal data we hold about this individual, and on what basis" report (REQ-DPR-006),
no erasure/anonymization workflow — the ERASE_PERSONAL_DATA permission is seeded but unused
(REQ-DPR-007), no subject-access export (REQ-DPR-008). Handling a data-subject request in 1.0 is
a manual, documented act. Two adjacent facts an adopter's DPO should know: disposed content
persists in backup archives for up to the backup retention window (35 days by default —
pruning the off-server copies is the operator's configuration), and there is no crypto-shredding
(encryption at rest is platform-level; GAP-06 is the documented future option).
Why. ADR-0016's own analysis: identity data is minimized and pseudonymous by design, retention outweighs erasure for regulated records (the common lawful response is a documented refusal), and the data-subject set of a QMS tool is small — so the automation is a Later capability by explicit release-plan decision, not a gap discovered late.
Named future. The DPR automation lane (release-plan Later; the three REQ-DPR rows are the spec); crypto-shredding under GAP-06 if a deployment's threat model demands it.
7. Dual-hat reviewers: the strict floor is on, everywhere¶
The limit. One person holding two reviewer roles cannot satisfy two role requirements on one release in 1.0: the cross-role distinct-person floor applies unconditionally. A two-person team that binds "1 × Process Analyst + 1 × QMB" with one person holding both hats has declared a release that needs two humans — and the system will hold them to it.
Why. Relaxing this quietly is the undeclared-semantic-weakening defect class: every existing binding that meant "two people" would silently start meaning "possibly one" (ADR-0132, which also fixes the workaround: bind one role at min-count 2, use a single reviewer role, or staff a second person).
Named future. ADR-0132's declared per-(scope, type) policy flag — default off, opting in a witnessed governance act that travels in the bundle — ruled post-1.0 (row 56, on the v1.0-criteria post-1.0 list). The role-attributed "Approve as <Role>" UI ships regardless.
8. Projects with records cannot be deleted — and there is no sandbox mode¶
The limit. A project holding any witnessed act is structurally undeletable — dissolution is refused permanently from the first acknowledgement, comment, release or approval (the V106 working-record line). There is no scope-retirement lifecycle yet, and no declared sandbox scope kind: trying out release workflows on a production installation creates real records in a scope you can then never remove, only dispose record-by-record under retention rules.
Why. Records-management doctrine, not a missing feature: from the first act, the installation is the record's only home, and "delete" would be evidence destruction (ADR-0126; server-deployment.md §8b carries the operator-facing version). The refusals themselves point at the remedy by name.
Named future. The scope retirement/disposal arc (ADR-0126 §8, post-1.0 list) and the declared SANDBOX scope kind (ADR-0126 §7 — ruled desirable 2026-08-25, its own ADR comes with the post-1.0 arc). Until then: rehearse on a disposable installation, not a production one.
9. One universal base library per installation¶
The limit. BASE_READ is GLOBAL-only: there is exactly one shared base library, visible
(released face only) to every organization on the installation. There are no org-scoped
libraries — no middle layer of prescriptive documents read-in-place by some organizations.
Why. Until a real middle layer is proven needed, the honest mechanisms already exist: derive-it-down (tracked drift) or GLOBAL with applicability stated in the document. Building the tier speculatively would be configuration surface without a proven variation point.
Named future. Org-scoped libraries via BASE_READ anchored at a MANDATOR scope — on the post-1.0 list with its design sketch (v1.0-criteria post-1.0 todo).
10. Search reads metadata and authored text — not attachment contents¶
The limit. Search is the layer-1 engine: document metadata and authored content. The bytes inside uploaded attachments (PDFs, Office files) are not indexed — an attachment is findable by its name and its document, not by its contents. The RAG/LLM answer layers do not exist.
Why. The three-layer search architecture (ADR-0006) ships its deterministic base first; attachment content extraction (S-2b) and layers ⅔ are named post-1.0 arcs in the criteria's own out-of-scope list (C-6).
Named future. S-2b attachment extraction; search layers ⅔ — both on C-6's list.
11. The verified UI envelope is desktop; accessibility is not audited¶
The limit. The UI is built and screenshot-verified for desktop browser viewports (the standing verification loop renders the standard and large-desktop viewport classes). Small screens, unusual zoom levels, and assistive-technology use are outside the verified envelope; no WCAG accessibility audit has been performed. Large corpora have a UI cost too: the document tree and lists are engineered inside ADR-0018's tier, not proven beyond it.
Why. The 1.0 audience is the desktop-workstation QMS user; widening the envelope is verification work that would displace the evidence work 1.0 actually claims. Named as a limit in the criteria since 2026-08-17 rather than discovered by a customer.
Named future. The criteria carry these on the known-limits/C-6 line (browser/zoom envelope incl. the register-#114 class, accessibility, at-scale tree); each becomes its own lane when an adopter's reality makes it due.
12. What the trail can and cannot hand you¶
The limit. The audit trail is complete, append-only, queryable and exportable (the Activity API; JSON export is PQ-exercised). But no evidence artifact carries trail extracts: the audit pack has no trail section, and there is no single "complete inspection copy" artifact bundling a record's content with its full transition history (REQ-AUD-006 — an accepted gap in the matrix since 2026-07-22). Two adjacent recorded trades: dissolving an empty, never-worked-in project destroys its own setup story with only counts surviving at the organization anchor (register row 34's ruling, ADR-0126), and within a single transaction the trail's display order is insertion-arbitrary until the in-flight ordering fix lands (trail-honesty TH-11).
Why. The trail's queryable surface satisfies the operating requirement; the inspection artifact is assembly the dossier arc will subsume rather than a second renderer now.
Named future. A trail-extract section in the audit pack (trail-honesty TH-14's remedy,
post-1.0 lane — it would also close most of REQ-AUD-006); TH-11's seq column rides hardening
lane A.
13. Operational surface: the deliberate omissions¶
The limit. The reference deployment's own §14 names what it does not do, and an adopter
should read it whole (server-deployment.md §14). The ones
that most often surprise: no notification email (the channel is designed, ADR-0041, but
disabled — notifications are in-app; invitation credential mails are sent by Keycloak itself),
no metrics or log aggregation (health endpoint + backup dead-man ping are the monitoring
story), Keycloak on its dev-file store (backed up every run; moving it to PostgreSQL is
separate work), unsigned container images pinned by tag (release SBOM + /api/version
identity are what you verify instead), and reverse-proxy access logs off as a privacy
default.
Why. Each carries its reason in §14 — the section exists precisely so none of these reads as an oversight.
Named future. Digest pinning and the image-layer SBOM are on the post-1.0 list; the rest are revisit-on-need with their anchors in §14.
14. External dev-tool integration is data, not connections¶
The limit. There is no live JIRA/Bitbucket/ALM integration and none is planned as a live coupling: 1.0 has no typed external-reference vocabulary and no development-trace snapshot mechanism yet at all.
Why. Mutable external state is not evidence; live coupling breaks portability and separation. The ruled shape (2026-09-01, register row 49): typed external references as trace vocabulary plus snapshot evidence landed as controlled documents — data that travels in bundles, never connections.
Named future. Register row 49 — post-1.0 recommended, ADR at build time; pulled forward only if a real pilot project exercises it first.
The runway — decided, in 1.0, not yet built at v0.9.44¶
Not limits: these are ruled into the 1.0 claim and tracked with owners in v1.0-criteria.md; they are listed so this document is honest about its as-of moment rather than pre-dating the tag it serves.
- The break-glass + substitution arc (ADR-0130/0131, C-4c) — refusals become doors, timed audited self-staffing, the declared substitution matrix. The largest feature left in 1.0.
- The bundle-format point release (rows 52/53/55, C-4) — closes §4's second limit.
- The D-3 risk-acceptance records (row 61, C-5) — the MECHANISM shipped 2026-09-05 (the
Risk Acceptancetype, theQuality Responsiblerole, the annual re-evaluation obligation, seeded into every installation); what remains is the nine acceptance records themselves — the owner's signatures — and until each exists its risk-register row honestly readsOPEN — see D-3. - The offline QMS copy (ADR-0118, C-4d) — the repo carries the audit pack as uncontrolled PDF copies with a manifest.
- The v0.9.45 hardening waves — lane A (audit walls: the V128 append predicate, the record-site census guard, the trail-honesty fixes) and lane B (second doors: the concurrency review's X-1..X-4).
When the tag is cut, every runway item above is either shipped or this document gains its honest entry — that is the deal the v1.0-criteria C-5 row makes.