Administering an LQMS Installation¶
Audience: whoever administers an installation and the scopes inside it without being a content person — the installation operator, an organization's administrator, and a project administrator.
This chapter describes LQMS v0.9.50. Everything in it is behaviour you can see in the running product today. The three things earlier editions marked as forthcoming have all landed: break-glass escalation and emergency cover (§8), and the permission-closure check that warns about the failure §5 describes (§6).
Administering LQMS is not administering its documents. The people this chapter is written for staff roles, found and dissolve scopes, bring colleagues in and out, and keep an installation's governance legible — and most of them deliberately cannot read a line of the QMS content they administer. That separation is the product's central claim, and this chapter explains how to work with it rather than around it.
Judgment note. This chapter is the product-admin half. The operator half — installing, upgrading, backing up, restoring, TLS, secrets, the identity provider — is a separate trio of operations documents (§10) and is deliberately not repeated here: one description of a
docker composeinvocation is enough, and two would disagree within a release. Where the two halves meet — the bootstrap administrator, the installation's own organization, break-glass recovery — this chapter states what the product shows you and points at the operations document for the command.
1. The three altitudes¶
"Administrator" names three different jobs in LQMS, and almost every confusion in this area comes from treating them as one. They differ by where the person is staffed, and that single fact decides their reach.
| Altitude | Staffed at | Administers | Sees content? |
|---|---|---|---|
| Installation administrator | the base scope, GLOBAL |
the whole installation: organizations, cross-tenant provisioning, the catalog, users, backups, import/export | No — by construction |
| Organization-level administrator | an organization's own anchor scope | every project of that one organization, present and future, including starting new ones | Depends on the role's own permissions, inside that organization only |
| Project administrator | one project | that one project: staffing, activation, policies, training | Yes — read-only, and only where the project activated the role |
Three rules make this table true rather than approximate.
Sovereignty flows downhill (ADR-0122). An assignment at an organization's anchor scope is effective in every current and future scope of that organization. That is the org-admin mechanism: there is no separate "org admin" switch, only a staffing at the anchor. Because a future project inherits it automatically, an organization that staffs its administrator once never has to remember to re-staff for project number seven.
A cascaded holder is shown where they act. A person staffed at the organization appears in each project's staffing view as a derived "via organization" row. This is not cosmetic: the four-eyes evaluator has always counted effective permissions, so an org-level approver held authority in a project while appearing nowhere in its roster — and a roster that hides an approver destroys the audit argument the roster exists to make. What an evaluator counts, a surface shows.
GLOBAL is different, in both directions (ADR-0128, ADR-0129). The base scope is a cross-tenant
boundary, so a GLOBAL assignment is deliberately half-blind:
- Administrative permissions cascade from
GLOBALinto every scope — that is what running an installation means. - Content permissions do not. A content permission held via a
GLOBALassignment is effective inGLOBALalone. - Role identity does not either. Workflow authority — approve, release, revoke, review — is
gated by which role you hold here, not by a permission, so the same rule had to be drawn for it
separately. A person holding an authoring role at
GLOBALholds it in the library and nowhere else.
Read together: a GLOBAL grant means "run this installation and work in the shared library" — it
never means "act inside somebody's project". The organization-anchor cascade is untouched by
this and stays whole-class, because it stops at the organization boundary, which is exactly where
the separation guarantee lives.
Where administration lives¶
The Admin area holds the installation-level surfaces. Each page is gated separately, so two administrators can see quite different menus:
| Page | What it is for | Needs |
|---|---|---|
| Users | the people surface: status, per-scope assignments, deactivate/reactivate, the accountable-holder star, organization invitations, and a separate People from imported records section (§4) | MANAGE_USERS in some scope |
| Roles | the installation's role catalog: create, rename, delete, set each role's permissions, and choose which scopes may use it | MANAGE_CATALOG at the base scope |
| Document types | the installation's document-type catalog and its per-type defaults | MANAGE_CATALOG at the base scope |
| Project setup | the setup wizard — birth and remediation (§3.1, §6) | CONFIGURE_REVIEW_POLICY in some scope |
| Found a new organization | founding a tenant, as its own workflow with its own entry point | MANAGE_MANDATORS at the base scope |
| Scopes | the project directory grouped by organization; renaming and the derive-source setting; dissolution | reads widely; writes need MANAGE_SCOPES at the base scope |
| Activity | any scope's audit trail, newest first, with its own scope picker | read per scope, server-side |
| System | backups (trigger, history, download), search reindex, sweep heartbeats, installation-level findings | EXPORT_BACKUP or MANAGE_SYSTEM_SETTINGS at the base scope, per section |
Two habits of the surface are worth knowing because they are house rules rather than quirks of one page:
- An affordance the server would refuse is never shown as a disabled control that leaves you guessing. Either it is offered, or the reason it is absent is stated.
- The Admin area tells you honestly when you hold nothing. Opening
/adminforwards you to the first page whose gate you pass; if none does, it says "You hold no installation-level administration" rather than showing an empty shell.
Per-project governance lives outside the Admin area, on the surfaces the project's own people use: Scope configuration (the gear — review policies, training, types, retention, project settings), Authority (who holds each function here, and what it may do), and My access (what you may do, per project, as the system enforces it right now). My access is the fastest way to answer "why can't this person do X?" when the person is you.
2. Admin ≠ content — the boundary is a witness, not a fence¶
This is the sentence to internalize, because it overturns the natural reading of the word "administrator", and because getting it wrong produces either a frustrated administrator or a compromised trail.
The boundary was never a capability limit. A project administrator holds the authority to staff people into roles — and themselves is one of the people. Anyone who can staff can staff their way into any role activated in their scope, and from there do anything that role can do. The master key is already in the administrator's own hand and always was, so no argument for widening the role can be made from "but he must be able to fix things". He must, and he can.
What the boundary actually does is decide whether that rescue looks ordinary or exceptional in the record. If the administrator held standing content rights, the audit question "who moved this, and under what authority?" would get the answer "the administrator, as usual" — which is no answer. Separating the two makes the intervention a visible, bounded, named event instead of an unremarkable Tuesday. Since one person holds both keys anyway, separating them in time is the only separation available.
The system's job is to hold the glass, not the key.
Three consequences worth stating flatly:
- The installation administrator's role carries no content permission at all. They cause trail entries they cannot themselves read. That is not a defect to be patched; it is admin ≠ content working, and it is why the installation operator can never quietly read a customer's QMS.
- The Project Administrator role is the one recorded, narrow exception, and it is narrow on
purpose: read access (
VIEW,VIEW_TRACEABILITY) and nothing else from the content side. It is principled rather than a compromise, because at project level there is no cross-tenant boundary to cross: the catalog only defines the role, and the project must activate and staff it itself, inside its own trust domain. - Neither model touches four-eyes. Review and release discipline live in each document type's workflow role bindings and its review policy, never in an administrator's permission set. Widening or narrowing administration cannot loosen an approval chain — which is precisely why the choice between the models is about trail honesty and nothing else.
What a project administrator holds, exactly¶
| In — administer, staff, observe | Out — deliberately |
|---|---|
ASSIGN_ROLES — staff people into activated roles |
every authoring/approval permission (CREATE_DOCUMENT, EDIT_DRAFT, DERIVE, ORGANIZE_DOCUMENTS) |
MANAGE_USERS — administer people in this project |
the records-governance cluster (DISPOSE_RECORDS, APPLY_LEGAL_HOLD, MANAGE_RETENTION, ERASE_PERSONAL_DATA) |
ACTIVATE_CATALOG_ENTRIES — activate roles and document types |
every installation-wide authority — this role administers a project, not the installation |
CONFIGURE_REVIEW_POLICY — the governance box per type |
|
MANAGE_TRAINING — training rules and monitoring |
|
CREATE_PROJECT — but only where it is checked (see below) |
|
VIEW, VIEW_TRACEABILITY — read what you administer |
The in/out lists are not maintained by hand. Every permission in the vocabulary carries a class, and the build fails when a newly added permission is not classified:
- Content — reading and authoring the QMS: view, base-library read, the traceability and training and obligation reads, create, edit, derive, organize.
- Project administration — staffing, user administration, catalog activation, review policy, training rules, project creation.
- Global administration — the catalog itself, system settings, provisioning, portability (import/export), backups, dossier authority.
- Records governance — dispose, legal hold, retention, personal-data erasure. A records-officer function, deliberately not bundled into administration: bundling would dilute both.
- Retired — names that were declared and never enforced, removed rather than left lying around.
The classification is not documentation about the boundary; it is the boundary. It decides what
cascades out of GLOBAL (§1), so mis-classifying a new permission would change runtime reach — which
is why the guard exists and why each classification carries a written argument.
The CREATE_PROJECT subtlety. Starting a project is checked at the target organization's
anchor scope — never at GLOBAL, never inside a project. One permission in one list therefore
means two different things depending on where the holder is staffed: a Project Administrator at an
organization's scope may start that organization's projects; one staffed in a project holds the
permission only where the check never looks, and can start nothing. If someone reports that they
"have project-admin but cannot create a project", this is almost always the answer: they are staffed
one altitude too low.
3. The life of a project scope¶
3.1 Birth¶
A project is born through the setup wizard, and the birth is a one-party act: an organization or project administrator — including one who holds no content permission whatsoever — can carry a project from nothing to a complete, configured shape. The full walkthrough is how a new organization and project are born; what an administrator specifically needs to know:
- Founding an organization and starting a project inside one are two different processes with
two different authorities. Founding is installation-level (
MANAGE_MANDATORS); starting a project is the organization's own business (CREATE_PROJECTat its anchor). - The code is identity; the name is a label. A project's code is minted into every document id in it, into cross-project references and into audit-pack manifests. There is no "change code" affordance anywhere in LQMS, and its absence is not an omission waiting to be filled — see renaming a project, and what can never change.
- The folder skeleton is a setting-up act, not a content act. While a scope holds zero
documents, creating folders is gated like the rest of setup (
ACTIVATE_CATALOG_ENTRIES), because an empty tree is scaffolding, not records. The moment the first document exists, the tree is live andORGANIZE_DOCUMENTSgoverns it exactly as it governs any other reorganization. This is a structural line checked in the same transaction as the write — never a judgment the screen makes.
That line exists because of a real failure: the wizard once told a content-blind operator to staff themselves into Quality Manager just to create folders. The remedy institutionalized the exact breach the boundary exists to prevent. The wizard no longer recommends self-staffing across the boundary anywhere in the birth path. Self-staffing remains available as what it always was — a deliberate act with content consequences — never a required workaround. - Staffing comes before policies, and that order is not a preference. See the birth-path topic §3.
3.2 Staffing and the operating model¶
Once the project exists, three verbs shape it, and they belong to different people at different altitudes:
- Define — a role or document type exists in the installation's catalog. Catalog governance is installation-level by design; a project cannot mint a role for itself out of nothing.
- Activate — the project decides which catalog entries it uses (
ACTIVATE_CATALOG_ENTRIES). Nothing is staffable in a project until it is activated there. - Staff — a person is bound to an activated role in this project (
ASSIGN_ROLES).
Then the operating model on top: review policies per document type, key rules, training rules. See staffing people into roles, what a review policy controls, and special elements and when their names freeze.
Two administrator-facing facts that live nowhere else:
- Unstaffed roles are normal on day one. Invited people bind to their accounts on first login, so a project can be fully configured and still show unstaffed roles. The setup check tells you this; it does not block you (§6).
- A virgin catalog needs the operator first. On a brand-new installation with no roles minted yet, someone with catalog authority has to create them before a project administrator has anything to activate. This is correct rather than a gap — the catalog is installation-level — but it is the one step of the birth path that a project-level administrator genuinely cannot perform alone.
3.3 Dissolution¶
A project born by mistake — a wrong code, a duplicated tenant, a test scope from week one — can be dissolved, and the rules around that act are the strongest statement this product makes.
- The gate is
CREATE_PROJECTeffective at the project's organization anchor: create and un-create are one authority, and sovereignty stays inside the organization boundary. - The line is emptiness. A project is dissolvable while it holds no documents and no record-evidence rows — that is, while this instance has witnessed no act in it beyond setup. Drafts do not block dissolution (they are work, not records) and are destroyed with a counted confirmation. A released version does block, because an ordinary release is an approval act this instance witnessed.
- The offer is the server's, not the screen's. The provisioning read answers whether a project may be dissolved; the frontend offers Dissolve project… exactly where the server said yes, and shows nothing at all to a caller without the gate. You will never meet a dissolve button that then refuses.
- The trail outlives the scope.
SCOPE_DISSOLVEDis written at the organization anchor, beside theSCOPE_CREATEDthat opened its life, before the rows go and in the same transaction, with a counted payload (code, name, folders, activations, policies) — counts, never content. The organization's trail tells the whole life: born, shaped, dissolved. - Re-birth under a dissolved project's code is possible. No residue holds the code hostage.
What stays impossible, on every surface: deleting a scope this instance has witnessed real acts in. No identity anywhere — including the installation administrator — can destroy witnessed records. An any-status dissolve "with a clear record in the activity log" was explicitly considered and rejected: a log line preserves that something was destroyed, never what, and a global kill switch would be one identity able to destroy a tenant's scope. What can be destroyed is exactly what the system can prove nobody ever relied on. The remedy for a real scope that has finished its life is retirement and disposal with retention semantics, and every refusal names it.
Dissolving an organization is the same principle one level up and is covered in the birth-path topic §6: it is offered only while the organization is still completely empty, and its own dissolution record makes an organization that has one permanent. A wrongly-named tenant can therefore be renamed but never dissolved once its trail has begun.
4. The life of a person¶
The mechanics — invitations, acceptance, assignments, the accountable holder, the personnel-change runbook — are covered in belonging to an organization and staffing people into roles. This section states the four things an administrator most often gets wrong.
Belonging and reach are different. A person exists once in the installation and belongs to organizations one membership at a time. Membership makes someone staffable and lists them in the roster; it shows them nothing. Only roles ever grant access. A brand-new member with no assignments is not a broken row — it is the staffable-but-unstaffed state.
There is no path around an invitation. Staffing a person into a project of an organization they do not belong to is refused, naming the person, the organization and the remedy — and the picker does not offer it in the first place, so you usually meet the rule as an absence rather than as an error. A role is given inside an organization somebody is in; it is never a way of putting them in one.
Accounts bind on first login, and LQMS never holds the password. An invited person is pre-created and binds to their real identity at the identity provider on their first login — but only if the identity provider says the email is verified. An unverified email never adopts a pending invitation, so a self-asserted address cannot inherit somebody else's pre-staffed roles. Reactivating someone who never bound returns them to Invited, so that binding still applies. Where credentials, resets and two-factor live is your password.
A person who signs in but was never invited belongs nowhere — and that is correct. If your identity provider lets someone authenticate who has no invitation here, LQMS creates them as an ordinary active person with no membership: no organization lists them, no scope reflects for them, and they see nothing at all. They appear only in the installation operator's user list, ready to be invited. A memberless person is not a leak; it is the honest representation of "authenticated, belongs nowhere yet". Authorization comes only from role assignments — never from having logged in.
Deactivation is installation-wide; ending a membership is not. Inviting, deactivating and reactivating a person are installation-wide acts, because a user is one global identity. Ending a membership is a single organization's authority: it unassigns every role that person held anywhere in that organization's scopes — each removal recorded at its own scope — and closes the membership. The person, their account and their history remain untouched. There is deliberately no code path from ending a membership to ending an account, which is the strongest form that guarantee can take: one organization can never switch off a person who also works elsewhere.
Deactivation does not unstaff anybody, and that is deliberate. A deactivated person keeps their memberships and role assignments; their access dies at the authentication edge, where every request they make is refused. Reactivation therefore restores exactly what they had, with no repair step — which is what makes the runbook in staffing §5 safe. Note the consequence for rosters: a deactivated person still appears as a holder, which is why the "no active holder" findings of §6 count activity rather than assignment.
Two guards you will meet:
- You cannot deactivate your own account. A deliberate footgun guard.
- The last active system administrator cannot be deactivated, and cannot have their installation-wide administration role removed. An installation with no administrator cannot invite one, reactivate one or staff one — every repair path needs the authority that just vanished — so the system refuses rather than warns, and offers the Deactivate verb disabled with the reason on it. Appoint a second administrator first; then either may go. The guard holds even when two administrators try it on each other in the same moment.
The EXTERNAL kind — people who are not accounts¶
An installation that has imported a corpus from another QMS will find rows in the roster that are
not accounts at all: EXTERNAL persons, minted so an imported history can say who brought it to
its state. They are, by construction:
- unbound — no identity at the identity provider, and they can never authenticate;
- uninvitable and never mailed — they are outside the invitation flow entirely;
- not staffable — they hold no roles and cannot be given any.
They carry a provenance chip naming the source system they came from and when this instance minted the record, plus the codes of the projects whose document history references them. The chip answers "which source did this name come from"; the project list answers "where in my installation does this person actually turn up" — two different questions, and an administrator investigating an attributed release usually wants the second.
Minting them is idempotent on their natural key (source plus email), so re-running an importer after
a failure or a correction does not split one Hans Muster's corpus between two rows. An EXTERNAL
person is deliberately excluded from the match key that binds live logins, so a real colleague who
later joins never adopts a historical actor's record.
5. Role administration, and the closure lesson¶
The three seeded roles¶
Every installation is born with three roles in its base catalog, ensured on every startup — so an installation that predates one of them gains it on upgrade, free:
- System Administrator — the installation cut, assigned at
GLOBAL. Carries every administrative permission and, deliberately, no content permission. Some of its grants are honest break-glass reach it cannot itself drive: it holdsMANAGE_DOSSIERS, for instance, but noVIEW, so an installation grants dossier authority to the quality role that also holdsVIEWin the scope. - Project Administrator — the per-project cut of §2, defined but never activated. The catalog defines it; a project activates and staffs it by its own deliberate act, which is exactly what licenses its read access.
- Base Reader — carries exactly
BASE_READand nothing else, activated atGLOBAL(the only place that permission is effective). The invitation flow assigns it per person on acceptance, so base readership is visible and revocable per person instead of travelling as a passenger on somebody else's content role. Note that the bootstrap administrator holds no Base Reader — it never accepts an invitation — so grant it explicitly if the operator should read the library.
Beyond those three, roles are entirely the installation's own vocabulary. There are no locked
"system roles": the seeded three are a floor, not a lock — re-ensured on every boot, never
stripped — so a role you tailored keeps your edits across upgrades. Roles are created, renamed,
deleted, given their permissions and activated into scopes on Admin → Roles, which needs
MANAGE_CATALOG at the base scope. The permission vocabulary itself is closed and extended only by
a release: you choose which permissions a role holds, never what permissions exist.
Deleting a role is refused while anything depends on it, and the refusal names the blockers — the scopes it is activated in, the people holding it — so the offer and the act can never disagree.
A role's name is load-bearing at import: a bundle arriving with a role literally named "Project Administrator" or "Base Reader" adopts onto the seeded one rather than minting a second. Name beats function, by decision rather than by accident.
The closure lesson¶
This is the failure mode most worth knowing, because it produces a bug report with no bug in it.
In a real imported project, nobody could move a document or set its language. The gate on the act
(ORGANIZE_DOCUMENTS, the folder-move class) was correct. The staffed operating model was
internally coherent: the Project Administrator held administration plus read, the quality role held
create and edit, the reader roles held reads. But no staffed role held that one permission. A
permission existed that belonged to nobody, and nothing in the system said so. Every actor was
correct; the set had a hole in it.
The lesson generalizes past that one permission:
An operating model is not validated by checking each role. It is validated by checking the closure — that every permission the project's own acts will ask for is held by at least one role somebody actually holds.
Why the hole opens, and where. Permissions in LQMS imply nothing about one another: there is no "X therefore Y". They are also not implied by workflow function. Occupying the author, reviewer or releaser slot of a document type requires only the reading floor plus, for authoring, create and edit — nothing else comes with the job. Filing, language, retention, dossiers: each must be granted on purpose.
That is exactly why an imported operating model is the highest-risk source of a coverage hole.
The arrival import derives each created role's permissions from the workflow slots the source role
occupied, and filing is not a workflow slot — so no imported model can ever produce a role holding
ORGANIZE_DOCUMENTS. The setup wizard's lane presets do not have this hole: they give the Reviewer
and Quality Manager roles filing rights deliberately, and give the Author role none, on the
principle that filing is a document-control act, not an authoring one. A wizard-born project
therefore arrives closed; an imported one arrives with whatever the source's slots implied.
Two structural answers now close it, and they are the same question one word apart:
- At import, the role-mapping preview is the moment the operating model is still cheap to change, so that is where the closure belongs: before the model lands, the preview states which permissions would end up held by no role in the target scope.
- In a running project, the setup check carries a permission held by no staffed role finding (§6), so a project that drifts into the hole says so before somebody hits the wall. It names the permission in words, quotes the catalog's own description of it, and names the two fixes — give the permission's holder a person, or give a person's role the permission.
Two ways to audit it by hand, which are still the right tools when you want to look rather than be told:
- Admin → Roles searches by permission, not only by role name — type the permission and it names the roles carrying it. An empty answer is the hole.
- Authority (per project) lays out role × holders × permissions × gaps, which is the same question asked from the staffing side.
When the hole is real and somebody is stuck in it now, §8's break-glass is the sanctioned way through — a bounded, recorded step, not a substitute for the grant that fixes the model.
The immediate remedy, when you meet it today, is ordinary and correct: grant the permission to the
role that should have had it — in that incident, ORGANIZE_DOCUMENTS to the quality role — as a
recorded catalog act. Do not solve it by staffing yourself into a content role and doing the work; §7
explains why.
6. What the system tells you: the setup check and the dead-end philosophy¶
An administrator's hardest question is "is this project actually in order?", and LQMS answers it without being asked. The setup check on a project's configuration page is always on and always current: a chip reading Setup complete or "N setup gaps", with the findings listed underneath and a fix link on each.
The philosophy, in four rules¶
Every finding mirrors a gate that already exists. The setup check invents no rules. Each finding is the preview of something that would otherwise fire as a surprise at somebody's first submit. That is why the wording of a finding and the wording of the refusal it predicts are the same sentence: re-reading the setup status right after a save can never contradict what the save just told you.
State, never a path. A finding describes what the scope is, never how it got there. Nothing records "was this founded by the wizard and then abandoned", and a resumed session, an API caller and the importer would each answer that differently — while the state answers identically for all three. This is also why an empty project is deliberately not flagged: a freshly provisioned scope with nothing activated is unconfigured, not a dead end, and shouting about missing roles on the wizard's first screen would only teach people to ignore the chip.
A withheld finding beats a false one. The check reads through the lens of what the caller may be
told — content read, or the scope's governing permissions — and complete always means "complete as
far as you may be told". A gap the caller may not see is simply not reported. The rule behind it:
a withheld finding is a gap in what someone was told; a fabricated one is a lie about the scope.
The vocabulary is open. Findings carry a stable code plus a human sentence, and a surface meeting a code it does not know falls back to the sentence. New findings can therefore ship without every consumer being taught about them first.
What it flags¶
Two severities: warn — something an existing gate will block on — and hint, a soft
"you probably want this". Setup complete means no findings at all, hints included.
| Finding | What it means for you |
|---|---|
| No activated role | nobody can ever be staffed here and no workflow can run. Activate roles first — this is the day-one finding. |
| Type without review policy | new documents of the type start with empty workflow roles and cannot be submitted. |
| Unstaffed workflow role | a role taking part in a review workflow has no active holder, so submitting or releasing will be blocked. Normal on day one, while invited people have not yet logged in. |
| Unstaffed addressee role | documents address this role for training, so their acknowledgement obligation can never be met by anyone. |
| Unstaffed standing role | a role carrying a standing permission on a document type has no active holder, so nobody can exercise it. |
| Permission held by no staffed role | an authoring permission — filing documents, creating them, editing drafts — is held by no role that is both activated and staffed here, so the acts it gates are refused for everyone in the project. This is §5's closure hole, said out loud. The finding names the permission in plain words and both fixes: staff somebody into the role that holds it, or grant it to a role somebody holds. |
| Nobody may revoke / cancel / revise | the review policy grants a transition to no role. The revoke case on a prescribing type is the one that also refuses the save — a released procedure nobody can withdraw is not a configuration this system will store (ISO 13485 §4.2.4). |
| Trace type without key rule | the project has not declared the element kind, so it has no name or key prefix of its own and suggestions fall back to the built-in one. |
| Kind without defining type | an element kind is activated but no document type here may define it, so no item of it can be written anywhere. |
| Kind dependency unmet | an element kind is in use while a kind it depends on is not — the catalog supplies the explanation. |
| No folders (hint) | documents can only live at the root of this scope. |
Two siblings in the same grammar live on other surfaces:
- An organization with no project and nobody in it shows on the provisioning directory — founded and then left standing, with the ways out named (found its first project, invite its first member, or dissolve it if it was a mistake).
- No verified backup in 7 days shows on the System page. Read its sentence carefully: it reports
what this application has recorded. Backups taken by the host's own
deploy/backup.shjob run outside the application and do not appear here, so check the host's schedule before acting on this finding — see §10.
The chip monitors; the wizard remediates¶
These are two tools and confusing them wastes time both ways. The chip is the monitor — you never need the wizard to find out whether a project is in order, and re-running it as a routine health check is ceremony. Wizard re-entry is the remediation tool: it does the one thing the chip cannot, comparing the project against a whole lane and offering the entire difference as a single editable batch. Reach for it when a project was configured by hand or arrived through an import, when new document types were activated, or when you are adopting a lane's shape late. Details in the setup wizard §6.
The principle behind all of it¶
Every process feature ships the derived answer to "then what?".
A gate that can block someone owes them a surface that says so in advance, in terms of state they can check, and a remedy they can act on. The setup check is that principle applied to project configuration; §8's refusals-become-doors is the same principle applied to the authorization layer.
7. When an administrator must NOT act¶
Everything in §2 was about what an administrator may do. This section is about the acts an administrator is capable of and should nevertheless refuse to perform, because performing them damages the record that the whole system exists to produce.
Do not author, approve or release content. Not because you cannot — you can staff yourself into any activated role in your scope — but because a document approved by the person who granted themselves the approval authority is the one combination access auditors like least, and the trail cannot tell it apart from ordinary work. The correct move is always the same shape:
Staff the right role, then let its holder act.
Do not fix a stuck workflow by becoming the workflow. When someone reports that an action is missing, the answer is nearly always governance data rather than an act:
| Symptom | Where to look | The administrator's act |
|---|---|---|
| "The Revise / Revoke / Cancel button is missing" | the type's review policy — a row granted to nobody | grant the transition to the role that person holds |
| "Nobody can submit documents of this type" | the same box: empty workflow groups, or no stored policy at all | configure the policy |
| "The permission exists but nothing happens" | a grant to a role with no active holder | staff somebody, or re-point the grant |
| "Nobody can move or re-file documents" | permission closure — held by no staffed role (§5) | grant it to the owning role |
| "I have project-admin but cannot start a project" | altitude — CREATE_PROJECT is checked at the organization anchor (§2) |
staff them at the organization, or start it for them |
| "This person cannot be staffed here" | membership — they do not belong to the organization | invite them; acceptance makes them staffable |
Do not rename to fix identity. If a project's code is genuinely wrong, the answer is a new project and a documented migration of its content — a deliberate, auditable act — not a rename that would silently re-identify a corpus already cited in released PDFs.
Do not test release workflows in a production scope. There is no admin key that makes a witnessed record disposable afterwards, and there deliberately never will be (§3.3). Until the declared sandbox scope kind arrives, use a scope you are willing to keep — or dissolve it before anything is released in it, while the emptiness line still holds.
Do not treat self-staffing as routine. It remains available and is sometimes right — an administrator genuinely is the "oh no, I have a problem" person. But use the timed door, not the permanent one: §8's break-glass staffs you for a declared window, records what you were trying to do, and takes the role back by itself, so the record shows an exceptional act as exceptional. Permanently staffing yourself into a content role looks exactly like ordinary staffing in the trail, and then the honesty of the record is entirely on you.
8. Break-glass and emergency cover¶
The auditor's question — "how does your administrator intervene, and how would we know?" — now has an answer you can point at on the screen rather than in a design document. The two mechanics below are the whole of it, and they have their own topics: the door and the marker for the person meeting a refusal, emergency cover for the person governing who may cover for whom. This section is the administrator's summary of both.
Break-glass escalation turns an administrator's rescue into a first-class act with a name, a moment and an end:
- A permission refusal stops being a wall and becomes the first step of the remedy. For a caller holding staffing authority in the scope, the refusal names the missing act, names which activated roles hold it, and offers the audited self-staffing act inline — "You may take it on yourself — it will be recorded", with Staff yourself as QMB on the message. One click, one audited act, then you repeat the original act yourself: the door and the act stay separate, separately attributed things.
- The staffing carries a declared duration — 30 minutes, 60 minutes or 1 day, default 60 minutes — and a short optional note saying what you were trying to do, prefilled from the refused act.
- Expiry is enforced by the authorization read itself, never by a cleanup job. If the janitor never runs, nothing is over-granted. A scheduled sweep only tidies the rows and writes the expiry event.
- The trail distinguishes three endings, because they are three different facts about a person: Ended early (handed back before the window closed, through End now — an actor), Window closed (expired as declared — no actor; the system honouring the window), and Extended (a fresh audited act with its own window, never a silent edit of the original).
- While any timed staffing is live, the application header carries a persistent chip — "Acting as QMB — 42 min left", one per active role, shortening to "QMB · 42 min" on a narrower bar and folding into a single counted glyph on a phone. It turns amber with an hourglass in the last five minutes, and carries Extend… and End now in its own menu. It is a personal marker: others read the trail, not a badge on the person. It doubles as the pre-expiry warning, so nobody is ambushed mid-edit.
- Ordinary staffing is untouched. Staffing other people, long-term, stays permanent.
Emergency cover generalizes the same mechanism beyond the administrator, and it is the reason the mechanism was pulled into 1.0:
- A per-project matrix of declared edges — "a holder of role A may take over role B" — declared by whoever governs roles there (the Emergency cover tab of the project's configuration page), as an audited governance act.
- The declaration is the qualification statement. "We judged A-holders competent to cover B" is exactly what an auditor asks about substitution arrangements, and here it is a witnessed judgment with a name and a date rather than tribal knowledge on paper.
- Own-name staffing, never impersonation. A substitute approving as B is a different person approving, which is precisely the fact four-eyes exists to establish. The trail says "she held QMB, from then until then" — never "she acted for him". Impersonation is permanently rejected.
- Edges may only target content-class roles, refused at declaration time by the server, in the server's own words. An edge into an administrative role would hand the master key through a side door. An absent administrator is covered through the organization level (§1), never through the matrix.
- Emergency is not planned absence. The matrix carries short windows and answers "the role-holder is unreachable and the act is stuck now". A vacation is ordinary, deliberate staffing of a deputy by the administrator. Folding planned absence into the self-service path would normalize the exceptional act, which is the failure this whole design exists to prevent: the matrix is glass to break, not a schedule.
- Not built, by decision: transitive edges (A-covers-B plus B-covers-C grants A nothing toward C — every edge is its own declared judgment) and cross-scope edges (cover across scopes is staffing, not substitution).
Read it as a rollout diagnostic, not only as an audit trail. The same tab lists every timed staffing, extension, early end, expiry and cover declaration the project has seen. In an installation's first months that list is the most useful map you have of where the declared operating model missed reality: each entry marks a place where somebody had to work around the model to get work done. Fix what the list points at — a permission nobody holds, a role nobody is staffed into — and the list stops growing, which is the outcome you want. §7's discipline still applies on top: staff deliberately, and let the trail say what happened.
9. Troubleshooting — the refusals an administrator meets¶
Since v0.9.40, refusals speak human. The rule is binding rather than stylistic: a refusal names
what is missing and where, in human terms — never a permission constant, never a scope UUID. The
server publishes the facts (which permission, which scope) and the screen composes the sentence,
because a client cannot humanize a sentence but it can humanize facts. The trigger was an operator
meeting ORGANIZE_DOCUMENTS required in scope 06ab83d3-… and having to look up both halves.
Permission refusals¶
The sentence you get says as much as the server could honestly establish, and no more. There are three endings, in rising order of how much help they can offer:
In QMS Operations you do not have the permission to staff people into roles. Ask someone who holds it there.
… It is held there by Quality Manager — ask one of them.
… You may take it on yourself — it will be recorded. — with the act on the message: Staff yourself as Quality Manager.
The second and third forms are §8's work: the server names which activated roles hold the missing permission, and marks the ones you could legitimately take on yourself. Nothing is inferred — a refusal that names no roles means the server named none, not that none exist.
The act itself is named in plain words in all three — provision and deactivate users, maintain the global catalogs and the role permissions, manage organizations, create projects, activate roles and document types here, organize documents into folders, read the base library. When an act has no phrase yet, the sentence degrades to "You do not have the permission this needs" — never to the raw constant. When the scope cannot be resolved for you, the "where" is dropped rather than printed as a UUID. And when no single permission is missing — the configuration read, which several permissions can satisfy — you get the scope-only form: "You do not have the permission this needs in X."
The refusals an administrator actually meets¶
Each of these is a full sentence from the server, rendered to you verbatim, and each names its own remedy.
Staffing and people
| You tried to | You get, in substance |
|---|---|
| Deactivate the last system administrator | "…is the last active system administrator — deactivating them would leave this installation with nobody who can administer users, and nobody able to undo it. Appoint a second system administrator first…" The screen pre-empts this: the verb is offered disabled with the reason on it. |
| Staff someone into a project of an organization they do not belong to | "…does not belong to 'X', and 'CODE' is one of its scopes — a role can only be given inside an organization the person is a member of. Invite them to the organization first; once they accept, this role can be assigned (an invitation can also carry it, so it applies the moment they accept)." |
| Assign a role that is not activated here | "role 'Regulatory Affairs' is not activated in scope 'CARDIO'" — both named, so you know exactly which activation to add. |
| Staff, deactivate or invite an imported person | "…is an external person imported from 'MERIDIAN-QMS' — a record of history, not an account here. External persons cannot be staffed: they have no login and never receive mail. To give this person access, invite their email address; that creates their own account beside the imported record." (§4) |
| Deactivate your own account | "you cannot deactivate your own account" |
| Invite yourself into an organization | "An invitation is an offer one person makes to another, and accepting it is the other person's answer — ask another administrator of 'X' to invite you." |
| Invite someone who already holds a role there | "…already belongs to 'X' — they hold a role in one of its scopes, which is what belonging to an organization means. There is nothing left to invite them to." |
| Invite a deactivated person | "…is deactivated and cannot accept an invitation — reactivate the account first." |
| Invite into an organization with no anchor scope | "…has no mandator-level scope, and membership is anchored there… Create a MANDATOR scope for 'X' first (Admin › Scopes), then invite people into it." |
| Answer someone else's invitation | "An invitation is answered by the person it was sent to." |
A person whose account has been deactivated meets a single sentence on every request — "User account is deactivated" — because access dies at the authentication edge rather than by unstaffing. Their memberships and assignments are deliberately left intact, so reactivating restores exactly what they had.
Scopes and dissolution
| You tried to | You get, in substance |
|---|---|
| Dissolve an organization that has recorded something | "'X' is not empty — it still has 2 projects ('Alpha', 'Beta'), 3 membership records, 14 audit-trail entries. Only an organization that has recorded nothing at all can be dissolved, because dissolving it must destroy nothing; anything that ever held content or a trail stays permanent." — the holdings are counted and named, so you know precisely what to look at. |
| Dissolve a project holding releases | "…holds 7 released versions. Drafts in a project may still be thrown away with it, but a release is an act this instance witnessed — somebody here approved that document and put it into force, and everybody after them was entitled to rely on it. Retiring a project that holds records is disposal — with retention semantics and an archive of record — which this act is not, and never becomes." |
| Dissolve a project under legal hold | "…is under a legal hold, so nothing in it may be destroyed — including the project itself. Release the hold first if it no longer applies." |
| Dissolve an import-born project | "…arrived through an import, and the import's own record governs its lifecycle (Admin › Import). Dissolving it here would destroy that record as a side effect, which an import record must never be." |
| Dissolve the base scope or an organization's anchor | "…is not a project. The installation's base scope belongs to the bootstrap, and an organization's own scope is dissolved with the organization…" |
| Dissolve without the authority | the sentence that teaches the whole altitude rule: dissolving needs CREATE_PROJECT in the organization the project belongs to — "hold it at an organization's own scope and you may end that organization's unused projects; hold it inside a single project and it reaches nothing, because this act is never checked in a project. MANAGE_SCOPES, which shapes the installation, is a different authority and does not end a project." |
| Dissolve while somebody records something | "…could not be dissolved: something was recorded in it while the dissolution was running, so it is no longer a project this installation has never worked in. Nothing was destroyed. Read the project again — if it now holds records, they are permanent." |
| Rename the base scope | "The global base scope's name belongs to the installation bootstrap — it is the installation's own scope, not a project that can be relabelled." |
| Give an organization a second anchor scope | "…already has a mandator-level scope ('CODE') — a tenant has exactly one, because it is the single anchor its memberships are governed and audited at. Create a PROJECT scope instead, or rename the existing one (Admin › Scopes)." |
| Choose an organization to work in, without authority | "MANAGE_SCOPES at the installation level, or CREATE_PROJECT at an organization's own scope, is required to choose an organization to work in." |
One refusal that means the installation is not up yet: "no GLOBAL scope exists; bootstrap the installation first". That is an operator-level condition, not an administration one — the bootstrap did not run. See §10.
Symptoms that are not refusals¶
The hardest cases produce no error at all, because nothing is broken — the governance data simply never said yes. §7's table is the index for these; the two most common:
- An action is simply absent. A half-configured review policy locks people out of every transition nobody was granted, silently. When somebody reports "the button is missing", open the review policy box for that document's type and look for the ⚠ nobody markers.
- Everyone is correct and nothing works. That is the closure hole of §5: a permission held by no staffed role. The setup check does complain about it now — permission held by no staffed role, on the project's configuration page (§6) — so start there rather than reading the operating model role by role. It is a set property, and that is the surface that evaluates it as one.
10. The operator's half — where installation and maintenance live¶
This chapter stops at the edge of the product. Everything below it — the host, the containers, the identity provider, the bytes — lives in three operations documents, and they are the authority:
- server-deployment.md — the reference installation on a
single Linux host with public HTTPS: topology and sizing, DNS and firewall, the published image and
its registry credential, secrets, bring-up, Keycloak administration, corpus import and export,
backups and the restore rehearsal, secret rotation, the upgrade ritual, the first-deploy
checklist, and a troubleshooting section for the infrastructure failures (issuer mismatch, login
loops, certificates,
exec format error). - deployment.md — the configuration reference: every property, the
database roles and the
BYPASSRLSrequirement, OIDC integration, the bootstrap admin flow, email enablement, sweep tuning, the upgrade path, the backup and retention window, and how to verify a deployment. - genesis-installation.md — standing up an installation whose QMS arrives as a portability bundle: the phase order from preflight through landing the library, the retirement wave, per-project landing, staffing and verification.
Three meeting points between the two halves are worth naming here, because they surprise people:
The bootstrap administrator is configuration, not a user you create. Two properties —
lqms.bootstrap.admin.subject and .email — must both be set for the bootstrap to run; without
them it is skipped and says so in the log (.display-name is optional). The subject must be the
administrator's stable OIDC sub at your identity provider: identities are matched on subject
alone, so a wrong subject silently grants the wrong account.
The bootstrap runs on every boot, idempotently, and it is both initial setup and the operator-level recovery path if an installation ever loses its administrator despite the last-admin guard (§4). This is a different thing from the in-app break-glass of §8: it is performed on the host by whoever can restart the service, and it re-grants installation administration rather than temporary content reach.
What it ensures each time: the base scope, the internal tenant with its ORG anchor and QMS-OPS
project, the three seeded roles (§5), and the configured identity assigned System Administrator at
GLOBAL. The seeded permission sets are a floor, not a lock — nothing is ever removed, so an
installation that tailored a role through the catalog keeps its edits across upgrades.
The installation founds its own organization, once. Bootstrap creates the base scope GLOBAL,
the installation's own internal organization with its anchor and operations scopes, and the seeded
roles. The tenant's name comes from LQMS_ORG_NAME and is applied only at creation: the
bootstrap never renames, because the name is a renameable label and a rename is a governed, audited
act on the provisioning surface. Name the tenant truthfully before the first boot — a wrongly-named
tenant can be renamed but, once its trail has begun, never dissolved.
Backups are the operator's, and they are the archive of record. Retention arguments that reach
past what the live system holds — a dissolved scope, a migrated corpus, everything a genesis rebuild
deliberately loses — rest on a named backup, not on the database. The schedule, the off-server copy,
and the restore rehearsal that turns a backup into evidence are in server-deployment.md §9.
Governing decisions: ADR-0012 / REQ-ADM-004 (admin ≠ content — the boundary, absolute at GLOBAL),
ADR-0010 (the base hierarchy the bootstrap creates), ADR-0121 (the Project Administrator: the
per-project cut, its read access, and the classification guard), ADR-0122 (organization-level
administration: the cascade kept and made visible, CREATE_PROJECT split out and checked at the
target anchor, the birth path opened to org administrators), ADR-0124 (the birth path completes
without borrowing content clothes — the empty-scope bright line for folders), ADR-0126 (project
dissolution: the creation-mirror gate, the emptiness line, the trail that outlives the scope, and
what stays impossible), ADR-0128 (the GLOBAL cascade carries administration, never content),
ADR-0129 (role identity from a GLOBAL assignment acts in GLOBAL alone), ADR-0130 (break-glass —
refusals become doors, timed self-staffing enforced by the authorization read, the header marker, and
the permission-closure check of §5/§6), ADR-0131 (emergency cover as declared adoption edges),
ADR-0117 (role
documentation; acting-as/impersonation rejected — the rejection §8 stands on), ADR-0108 (tenant
self-administration: invitations, membership, credentials), ADR-0111 §1 (EXTERNAL persons — imported
historical actors), ADR-0127 §3 (the Base Reader role), ADR-0097 (the governed provisioning
surface), ADR-0107 (assignment-reach audit anchoring — why an administrator can cause trail entries
they cannot read), ADR-0064 (workflow role bindings — why administration cannot loosen four-eyes),
ADR-0106 (derived facts: mayBeDissolved and the "via organization" rows), ADR-0007 (never show an
affordance the server refuses), ADR-0099 (this manual ships with the version it documents).
Regulatory frame: ISO 13485 §5.5.1 (responsibility and authority), §4.2.4 (control of documents),
§4.2.5 (control of records); IEC 62304 §5.1 (planning and personnel).