Pin NyxID assistant registry v8 and add dormant service.reauthorize action path - #3496
Pin NyxID assistant registry v8 and add dormant service.reauthorize action path#3496eanz17 wants to merge 3 commits into
Conversation
…ction path Pin registry revision nyxid-assistant-actions.v8 (service.connect, key.create, key.rotate, service.reauthorize) ahead of NyxID#1400 with the assumed exact descriptor in registry-v8.json, and add the typed service.reauthorize machinery: producer tool class, shared browser-action helpers, registry mapper with strict identity/scope validation, blocker sub-message, AG-UI branch, projection fields. The verb stays unadvertised (no tool mount, intent candidate, or prompt line) while NyxID production serves v7; a follow-up branch advertises it after v8 ships. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ertised Drop the ServiceReauthorize arms from the conversation GAgent route-to-intent mapping and from the executor built-in intent checks so a published profile whose member IntentId is literally service_reauthorize keeps its full committed catalog instead of narrowing to a built-in the materializer does not resolve yet. Add a GAgent test pinning the ordinary-profile-route behaviour. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Superseded: 418cab8 already accepted the v8 composition, and 0b8ec50 (#3521) has since removed revision pinning entirely — schema_version is the only registry-wide gate and descriptors degrade per action, so a v8 (or any future) pin no longer exists. The dormant service.reauthorize action path continues separately on feat/2026-08-19_nyxid-reauthorize-advertise. |
|
Superseded: 418cab8 already accepted the v8 composition on feature/integrate, and 0b8ec50 (#3521) has since removed revision pinning entirely — schema_version is the only registry-wide gate and descriptors degrade per action, so a v8 (or any future) revision pin no longer exists in the loader. Recommend closing this PR; the dormant service.reauthorize action path continues separately on feat/2026-08-19_nyxid-reauthorize-advertise. |
Problem
ChronoAIProject/NyxID#1400 §1 will publish a new assistant-actions registry revision that adds a
service.reauthorizedescriptor.NyxIdAssistantActionRegistry.Loadrejects any revision it has not pinned (NYXID_ACTION_REGISTRY_REVISION_UNSUPPORTED) and the startup path then installs the disabled registry, so all browser actions (service.connect,key.create,key.rotate) would fail closed on the next Aevatar restart after NyxID deploys the new revision. The tolerant consumer therefore has to ship first (same order as v5/v6/v7). Aevatar also lacked the producer/mapper forservice.reauthorize(#3312).Solution
Deploy-safe branch A — pin + dormant machinery, nothing advertised while NyxID production is still v7:
nyxid-assistant-actions.v8= v7 descriptors +service.reauthorize {userServiceId, requestedScopes[]}(riskgrant, tierv1,remember_eligible=false, byte-pinned indocs/contracts/nyxid-assistant-conformance/v1/registry-v8.json). v8 executable set = all four; v4–v7 unchanged. Revision name is a single constant (SupportedRegistryRevision).NyxIdRequestServiceReauthorizeTool(exactuserServiceId, 1..64 unique scopes, no secret material) — not mounted in any tool source on this branch; shared internals extracted toNyxIdBrowserActionRequestToolHelpers.ResolveServiceReauthorize, typed blocker sub-message (ai_messages.proto),NyxIdChatBrowserActionsbranch → existingVerifyServiceReauthorizeAsyncpostcondition, flat AG-UI wire params (old nested field reserved), Studio projection/read-model for the params.ParseServiceReauthorizemade as strict as the typed resolver; duplicated safe-identity/distinct-set blocks inResolve*extracted.docs/canon/nyxid-chat-api.md) + conformance README "When NyxID publishes v8" checklist. Any drift in the served v8 descriptor (params_schema/risk/remember_eligible) or a different revision name disables the whole registry at startup — documented as intended fail-closed.Follow-up (stacked, merge only after NyxID production serves v8): #3497 — tool mounts, intent candidate, system-prompt line.
Impact
agents/Aevatar.GAgents.NyxidChat(registry, browser actions, AG-UI builder, protos, executor/GAgent),src/Aevatar.AI.ToolProviders.NyxId(new tool + helpers),src/Aevatar.AI.Abstractions/ai_messages.proto,src/Aevatar.Studio.*(projection + query port),docs/canon,docs/contracts/nyxid-assistant-conformance/v1.Verification
dotnet build aevatar.slnx --nologo— 0 errorsdotnet test test/Aevatar.AI.Tests --nologo --filter FullyQualifiedName~NyxId— 2353 passed / 0 faileddotnet test test/Aevatar.Studio.Tests --nologo --filter FullyQualifiedName~NyxIdChat— 44/0dotnet test test/Aevatar.Capabilities.Tests --nologo --filter "FullyQualifiedName~MainnetHostCompositionTests|FullyQualifiedName~NyxId"— 111/0dotnet test test/Aevatar.GAgents.ChannelRuntime.Tests --nologo --filter FullyQualifiedName~ConversationReplyGeneratorTests— 86/0python3 -m unittest tools/ci/tests/test_nyxid_conformance_guard.py tools/ci/tests/test_nyxid_semantic_evaluation.py— OKbash tools/ci/nyxid_conformance_guard.sh/bash tools/ci/architecture_guards.sh/bash tools/ci/test_stability_guards.sh/bash tools/docs/lint.sh— all passnyxid_request_service_reauthorizeon this branch.🤖 Generated with Claude Code