Sole-Maintainer Approval

An approval is four-eyes: the approver is never the requester. The ONE exception is the installation's DECLARED maintainer, who may approve a request they filed themselves — and every such approval is stamped on the node, written to its log and shown on its page as "self-approved by maintainer", who and when. Everyone else still needs a different approver. Policy sole-maintainer-approval (register).

Why

A single-maintainer estate runs its agents through the maintainer's own credential, so nearly every pending request — a Reconcile, a Recycle, an operation request — is filed under the maintainer's identity. Four-eyes then leaves the estate with nobody who may approve anything at all. The alternatives are worse: an agent identity that approves on the maintainer's behalf moves the decision to a machine, and a standing admin bypass makes it silent. The exception is therefore NAMED (one person), DECLARED (configuration a governed change controls, never a node any administrator can edit), and AUDITED (it can never look like a second person's approval).

The rule — one function, three gates

The decision lives in ONE place, SoleMaintainerApproval.Decide(requester, approver, maintainer) (MeshWeaver.Plugins Store/Core/Source/SoleMaintainerApproval.cs), shared by source into every gate:

answer when what the gate does
Other the approver is not the requester, or either is unknown the ordinary case — every other check of the gate applies
SelfApprovedByMaintainer approver = requester = the declared maintainer admitted, and STAMPED (below)
SelfApprovalForbidden approver = requester, not the declared maintainer refused: a second person must approve

Identities are compared trimmed and case-insensitively. The rule decides ONLY the self-approval question: every gate's global-administrator check, binding, freshness and single-use checks are unchanged.

gate where it calls the rule who counts as the requester
Hosting/InstanceAction ActionsExecutor.ApprovalGate, ApprovalNotice.EligibleApprovers the recorded requester (RequesterOf)
Essentials/OperationRequest OperationRequestContent.ApprovalRefusal / RelationOf BOTH the typed requester and the framework-stamped creator — an agent filing under a person's credential types itself as requester, and the credential's owner is still its author
Governance/Activity ActivityGates.SignatureRefusal, FromSignatureRequest the proposer; the maintainer is the STANDARD's own authority.maintainer

Where the maintainer is declared

The installation's maintainer is the configuration key Hosting:Operator:Maintainer, which the deployment record's operator.maintainer renders (Hosting__Operator__Maintainer; HostingOperatorSpec.Maintainer). The key kept its historical name, from when it covered only the instance-action Actions path. It now holds for every approval gate of the installation: instance actions on any executor, and operation requests. Absent, nobody may approve their own request. It is deliberately NOT a node: a node in the Admin partition would let any global administrator name themselves and approve their own requests — the very bypass the rule exists to prevent. Changing the record is itself a governed Reconcile that someone approves. A Governance standard may name a narrower maintainer for that standard alone (authority.maintainer, committed content); the decision is the same function either way.

Signing alone — a count-of-signers gate on a one-person installation

Self-approval decides WHO may approve; it does not change HOW MANY must. A governed activity's Signatures gate counts distinct signers, so a count: 2 gate (package.provision on a standard installation) can never go green where only one person exists — the maintainer's own signature counts as one. A second, separately declared key lets that ONE signature satisfy the gate:

configuration key Hosting:Operator:MaintainerSignsAlone (true; absent, blank or anything else is false)
deployment record operator.maintainerSignsAlone (HostingOperatorSpec.MaintainerSignsAlone), rendered as Hosting__Operator__MaintainerSignsAlone: "true" only when true — by the chart (hostingOperator.maintainerSignsAlone) and the Aspire renderer alike
who the installation's declared maintainer (Hosting:Operator:Maintainer) and nobody else — and not on a standard that names its own, DIFFERENT authority.maintainer
where the Governance/Activity Signatures gate only (ActivityGates.SoleSignerFor / SignedAloneBy). Instance actions and operation requests take ONE approver and have no count, so the key does not touch them

It is declared for the same reason the maintainer is: a node or a standard field an administrator can write would let them make a two-person rule a one-person rule for themselves. Nothing else loosens — the maintainer's signature must still be their own write, eligible under the standard's signers, bound to the current content, younger than the acceptance and the signature lifetime, and unconsumed; every other signer counts as before. Meant for a single-person installation with no confidential data (a test instance).

It is audited like a self-approval: the gate's detail reads 1/2 — <id> (signed alone as sole maintainer, policy sole-maintainer-approval, Hosting:Operator:MaintainerSignsAlone); the write that makes the activity ready stamps signedAloneBy / signedAloneAt and logs SIGNED ALONE BY MAINTAINER: '<id>' signed the activity '<standard>', and that one signature satisfied a gate asking for N signer(s) …; no second person signed; and the activity page shows Signed alone by maintainer (German: Allein von der verantwortlichen Person unterschrieben) through SoleMaintainerApproval.AloneLabel / AloneExplanation.

Audited, never silent

gate on the node in the log on the page
instance action selfApprovedBy / selfApprovedAt, stamped by the watcher in the write that starts the approved run; cleared by the next park SELF-APPROVED BY MAINTAINER: '<id>' requested … and approved it themselves … (policy sole-maintainer-approval …) a warning above the plan and a row in the Summary
operation request selfApprovedBy / selfApprovedAt, stamped by the control plane when the run starts the same line, kept at the HEAD of the run log by every later frame a fact row "Self-approved by maintainer"
governed activity the maintainer's own signatures entry (signer, signedAt) and the Signatures gate's detail, which names <id> (self-approved by maintainer '<id>' (policy sole-maintainer-approval)) the gate transition line the activity logs with its timestamp (gates: …: Green (1/1 — <id> (self-approved by maintainer …))) the gate's evidence in the Gates grid, and the signature row

The page label and explanation are translated (English, German) through SoleMaintainerApproval.Label / Explanation; the log line is machine-facing English and UTC.

The approvals inbox

Hosting/Approvals (NodeType Hosting/ApprovalInbox) lists every item on THIS instance that waits for an approval and that the viewer can read: parked instance actions, approvable operation requests, and open governed activities. One fed grid (BindGrid + PropertyColumnControl): type, what it does, plan, filed by, filed, expires, "can you approve it?" and the live result; a row-scoped ☐/☑ selection; "Approve selected", "Reject selected", "Select every approvable row".

Manual for operators: MeshWeaver.Plugins Hosting/ApprovalsInbox (get Hosting/ApprovalsInbox).