Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/gunnar

.nornir/account-audit-operator-privacy.md

The account's audit log, the operator's aggregates, the name filter

Owner's enterprise list, 2026-10-05. Nothing here is bought: every account has it. The account model it sits on (owner, 2026-10-03): one account type; the person who starts it is its admin; employees are NEW users the admin enrolls; private by default; only the account admin makes things public.

1. The account admin's audit log

2. The operator sees aggregates only

What still reaches the operator — said plainly

"We don't look, and the system doesn't show us." It is not secrecy from the people who run the box. What remains:

  1. Names in clone URLs. https://git.gunnar.rs/<account>/<repo>.git and the SSH path pass through the operator's front and gunnar's own process; the account and repository names are in those requests and in gunnar's own log lines (the journal, /serialdat) that whoever holds the box can read. The domain itself says whose forge it is.
  2. The box's own logs and trails. gunnar's tracing records name repositories and principals on transfers and decisions. The control plane's server-wide audit trail (GUN-044) is served over the API as its shape only (Admin.AuditTrail carries no entry), but the file is on the operator's disk.
  3. Timing and size. When an account is active, how long its requests take, how much it moves.
  4. Totals. The account's share of the aggregate figures, its own size and room (Usage.ReadAll's row for the account itself), and what it bought (the entitlement facts monetize pushes are the operator's to bill by).
  5. The account's own name. An account is addressed by its id — its namespace and its owner's principal — to gate, bill or recover it. Its members' names are not shown.
  6. Root on the box. The control store holds every repository, every name and every audit entry — pruned days included, in old document versions, until the store is compacted — and the twin and the backups hold copies. True secrecy from the operator needs keys the customer holds (the encrypted-repos line), not an API rule.
  7. The identity verbs are still the operator's. A server admin can add a passkey, an SSH key or an invite to an account's person (account recovery). Each such act is written into THAT account's audit log as done by an operator, which the operator cannot read and cannot rewrite without breaking the chain the admin sees.
  8. Machine keys, and the box's first identity. The shield binds people. A MACHINE principal's server grant — the replicator that pushes a tenant's data to its standby, the console's relay, an ops kit approved as a machine — keeps its reach, because a standby that refused a lapsed tenant's push would diverge from its primary. The same holds for the box's first identity (the installer's admin key bootstrap enrolled). Whoever holds such a key (the operator does, on its own boxes) can use it; the console's break-glass admin token signs with the console's own machine key. The operator's PASSKEY session in the console is a person and is shielded.
  9. monetize's narrowed principal calls its listed verbs (Entitlement.*, Accounts.EnrollEmployee with an order, Usage.ReadAll, Accounts.Purge) without consulting grants, by design; a server-scope caller delivering a PAID order may enrol the new user the order names. Both land in the account's audit log.
  10. Public is public — a repository or an account's events its admin made public are readable by the operator as by anybody.

3. The name filter