Observe all drift on the identity plane, and alert what Vedanta cannot resolve #11
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Meta/Campaign
Meta/Epic
Meta/Session
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Curated
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Scope/Campaign
Status/Abandoned
Status/Blocked
Status/Conflicted
Status/In Progress
Status/In Review
Status/Need Grooming
Status/Need More Info
Status/Ready
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Depends on
You do not have permission to read 1 dependency
Reference
Ting/Vedanta#11
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
First required delivery
Keep both directions of the existing set comparison together, plus the held-slot alert producer required by Ting#2 Q2. Prove a real persisted, addressed alert against flake-ops#470; detection can proceed before transport, but alert acceptance requires that real surface. Broader adapters move to #55. The approved rationalization corrects the obsolete Jostoph-mutation and queen-mints-principal wording below without reopening the observation mandate.
Shared vocabulary
This record uses Proposal, Design, Tasks, and Specification Delta.
Proposal
Why
Drift detection has had no concrete case to be accepted against. It has two now, and both arrived by themselves rather than being constructed.
Declared-removed but still present.
sa-frekiandsa-geriare declared entities for personas that have been ruled removed. lar.ad/flake-ops#169 and #135 both state it: "The Pack roster is Saga, Sköll, Ratatoskr, Völundr, Starkaðr, and Heiðrún. Freki and Geri are dropped; Hati remains a sub-agent." Their SOULs were always placeholders —modules/users/fenrisulfr/agents/*/SOUL.mdsays "SLOT, NOT VOICE … standing room" — but their directory entities are real and reconciled today byimpl/forge-identity/kanidm. Nothing in the declarative path can remove them, by construction:nixops-kanidm'sprovider.nu:27states it outright — "NEVER PRUNES, NEVER DESTROYS. Schema v0 has no destroy" — and the trait is add-and-repair, so "a persona removed from the roster keeps its entity — removal is a revocation, which is runtime business".Declared but never present.
sa-odin's membership ofagentswas in the roster, evaluated into this impl'sgroup_membershipmember list, and had simply never reached the directory. This is the more expensive direction. A surviving entity is a revocation debt — bad, but inert; the wolves sat for weeks harming nothing. A missing membership is a live outage that presents four layers downstream: it surfaced ascurl: (22) ... 400in a nushell overlay, and the body kanidm actually sent ({"error":"access_denied"}) was being discarded by the caller. Cost: an evening, and every persona token exchange refused throughout.Scope
Observation of drift across the identity plane, and an alert wherever Vedanta cannot resolve what it observed. Not the roster edit itself (lar.ad/flake-ops#135), not entity creation, and not principal disposition — see the ruling below.
Design
Owner ruling (2026-09-03), Q1 — the observation mandate. Creation of permanent identities is the provider's fief, as previously ruled. The tension that leaves — something must still notice what the declarative path structurally cannot fix — is settled by a standing rule:
This is broader than the case that produced it. Consequences:
The forge half is currently vacuous for the wolves, and acceptance must say so. Neither
frekinorgerihas a Forgejo account —GET /users/frekiandGET /users/geriboth return nothing, and the only agent accounts on jo.et0.pw areagent.odin,agent.omo,agent.teylaandcodexo. A test that passes because there was never anything to observe is not evidence that observation works. The forge half needs a subject that actually has an account.Neither direction catches hand-minting, worth recording:
sa-odinwas minted by hand during the 2026-08-23 incident rather than through the mint path, whosekanidm-sastep does "service account + group membership" as one act. Hand-minting is what split the account from its membership. Drift detection is the net; that hole is upstream of it.Specification Delta
Requirement: drift is observed in both directions
Scenario: the wolves leave the roster
sa-frekiandsa-geriexist in kanidm, carrying theagentsgroupflake.users.*.agents) no longer declares eitherScenario: a declared membership never reached the directory
Scenario: a pool drone is not drift
agentsgroup whose deployed slot/name/UUID/grant projection is validRequirement: unresolvable drift is alerted, never silently tolerated
Scenario: observed drift whose fix belongs to another component
Tasks
agentsgroup the roster does not declare, discriminating personas (a+alias) from pool drones (no alias).flake-ops#135removes freki and geri from the roster; record the before/after directory state on this issue.flake-ops#135that the roster edit leaves entities behind, so the two land in order rather than by luck.Refs
a+alias becomes a forge join key thereSecond live case, from the opposite direction — 2026-08-24
This record's design says the drift is one-directional:
That catches declared-removed but still present —
sa-freki,sa-geri. A live case arrived today from the mirror image: declared but never present.sa-odin's membership ofagentsis in the roster, evaluates into this impl'sgroup_membershipmember list, and had simply never reached the directory. Under this record's rule it is not a candidate, because the scan walks the directory side and asks what the roster does not declare. Both directions are the same set comparison in opposite order, and the reconciler already holds both sets.The missing direction is the more expensive one. A surviving entity is a revocation debt — bad, but inert; this record's own case sat for weeks harming nothing. A missing membership is a live outage that presents four layers downstream: today it surfaced as
curl: (22) ... 400in a nushell overlay, and the body kanidm actually sent ({"error":"access_denied"}) was being discarded by the caller. Cost: an evening, and every persona token exchange refused throughout.This record's acceptance would not catch it either. Both scenarios (
the wolves leave the roster,a pool drone is not drift) assert on entities present in the directory. A third is wanted:Unlike the forge half noted above, this one is not vacuous — there was a live subject today (now remediated by a heimdallr apply, so a re-run would need a fresh one or a fixture).
What neither direction catches, worth recording:
sa-odinwas minted by hand during the 2026-08-23 incident rather than through the mint path, whosekanidm-sastep does "service account + group membership" as one act. Hand-minting is what split the account from its membership. Drift detection is the net; the hole is upstream of it.Whether this rides as a third scenario here or as a sibling issue is an owner call — same mechanism and code path, different failure class and urgency. Filed as a comment rather than a new record so the choice stays open.
(Filed from lar.ad/flake-ops's 2026-08-24 session; cross-forge, no edge created.)
Grooming state: Need Grooming — investigation remains.
Evidence: Audit 2026-09-19/20 G48 and S6-F6. Split acceptance into two surfaces: detector acceptance covers both declared-versus-actual drift directions and no out-of-scope mutation; alert acceptance covers a persistent, addressed alert on lar.ad/flake-ops#470.
Gate: The alert half is gated on lar.ad/flake-ops#470, the external persistent alert plane. Keep the live persistent-alert check flagged as a probe until that surface or a capture double exists. The native cross-repo dependency attempt did not complete; retain flake-ops#470 as the explicit cross-repo gate in this comment.
Related: The detector can proceed independently; the existing Q1, Q2, and Q3 rulings remain the governing evidence.
Drift detection has its first live case: sa-freki and sa-geri outlive the roster that declared themto Observe all drift on the identity plane, and alert what Vedanta cannot resolve