USER-ID-1: user identity resolution specification - #54
Conversation
|
Warning Review limit reached
Next review available in: 37 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Merge-ready (MERGEABLE, dev merged in). Template conformance: header present, RFC-2119 boilerplate present, sections numbered 1–9, See also section. Fixed: USER-ID-1 was absent from README spec table and CHANGELOG — both added. Cross-references to OVOS-SESSION-1, OVOS-TRANSFORM-1, OVOS-BRIDGE-1 are forward-pointing specs (correct for an in-review spec). Note: after #55 merges, GLOSSARY.md in this branch will need |
Squashed from: - spec: USER-ID-1 — trust-model rework: gate invariant, level decay, resolution order - spec: cite the SESSION-1 field registry as §2.2 - USER-ID-1: user identity resolution specification Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
What this adds
OVOS-USER-ID-1— the session fields that carry user identity andauthentication evidence for an utterance, who is allowed to write them,
how authentication strength is expressed and how it expires, and what
skills may assume from it.
Files
user-id-1.md(new) — the specification.session-1.md— §3 roster rows and See-also entry for the eightfields claimed here. The claiming mechanic (SESSION-1 §2.2) requires
the owner to be nameable from the roster, so this PR carries the rows
rather than deferring them.
README.md— spec-index row.CHANGELOG.md— entries for USER-ID-1 and for the SESSION-1 rosteraddition.
Trust model
The first draft let identity ride in on the wire: fields on the inbound
session were taken at face value, and §5.1 told plugins to preserve
them. That is not a trust model — any participant that can put a Message
on the bus can assert any
user_idand anyauth_level, and a skillgating a bank transfer on
auth_level >= 5would honour it. Thisrevision fixes that.
unauthenticated hints. The recognition plugin — or the bridge, where
the bridge runs recognition — MUST re-derive and overwrite every
identity field it can derive, and MUST clear every field it did not
derive, on every inbound Message from a governed participant. This
is BRIDGE-1 §4.1's gate invariant applied to identity: a gate, not a
handshake. The preserve-SHOULD is deleted. Cross-utterance identity
now comes from the plugin's own state keyed on
session_id(§5.3),never from what the session asserts.
them at a SESSION-2 §2.6 mutation boundary — normally the
metadata-transformer hook. The old "stable once written" sentence,
which contradicted both §5 and SESSION-1, is gone.
auth_levelgainsauthenticated_at. A level of 3 orabove MUST decay after a deployer-defined TTL to the strongest level
still derivable. A level was previously immortal for the life of a
session.
auth_levelis capped at 1 onsession_id: "default". That session is shared by everyone near thedevice and impersonable by any remote participant (SESSION-1 §3.1);
evidence from one speaker cannot be attributed to the next.
confidence", but no confidence field exists on the wire. It is now a
normative order by evidence class: active passphrase > corroborated
biometrics > single biometric > stated name > configured default. When
resolved signals name different people, the plugin MUST NOT set
user_idand MUST setauth_level0 — the spec does not guess whichsignal is lying.
user_id,default_user_id,and an
auth_levelcapped at 1. It MUST NOT set a per-signal field orauthenticated_atit did not derive from a recognizer it ran — afabricated
face_idis indistinguishable downstream from a real one.A bridge that does run a recognizer is acting as a recognition plugin
and is bound by §5 in full.
default_user_id. Deployer configuration, not a wire input.The recognition plugin MAY mirror it onto the session; every runtime
signal outranks it.
only
user_idandauth_levelshould be relayed. Ids MUST be opaqueand per-deployment, and MUST NOT be derived from or usable as
biometric templates.
Smaller changes
voice_id→speaker_idthroughout. TRANSFORM-1 §3.5 alreadyuses
voice_idas a context hint naming the synthetic voice forTTS; §2 states the distinction in one line.
note. This spec verifies identity, not liveness; a recognizer's
spoof-resistance is a property of the recognizer, and a deployer who
cares configures a shorter TTL or requires level 5.
item 3 requires of any claiming spec.
requirements.
the handler sets
session.response_modefrom its own dispatch, theprompt carries
listen: true, and delivery happens inside thepipeline via a front-positioned converse plugin.
high-trust example now shows the
response_modemutation andlisten: truerather than gesturing at them.reference is for.
Merge order
Merge after #128 (README restructure) — both touch the spec-index
table, and #128's row edits should land first.
#122 also edits
session-1.md. This PR only appends roster rows andone See-also bullet at the end of the existing lists, so the two should
merge cleanly, but whichever lands second wants a look.
Draft: the trust-model rework changes what implementations must do at
the bridge boundary and wants a read before it leaves draft.