Context
nyxid-chat recovery UI must route connection/grant failures back to the
matching NyxID readiness capability.
The current contract cannot do this safely:
NyxIdChatToolStepSource defines tool_name, service_slug, and
service_id, but production task creation populates only tool_name.
- live task frames may carry the actor step protobuf, while the public
current-state projector/DTO drops source entirely.
- connected service ID, service slug, catalog slug, and NyxID readiness
capabilityId are different identity domains. Consumers must not infer
equality between them.
Related consumer: eanz17/nyxid-chat#10.
Related readiness producer: ChronoAIProject/NyxID#1307.
Scope
- Add an optional producer-authored
readiness_capability_id
(readinessCapabilityId on JSON) to typed NyxID tool provenance.
- Snapshot that exact identity into the actor-owned tool step source when
the authorized tool call is admitted.
- Preserve it unchanged in
nyxid.task.snapshot,
nyxid.task.step.changed, and
GET /api/chat/conversations/{conversationId}/state.
- Keep connected service ID, service slug, and catalog slug as separate
identities with their existing meanings.
- Check in convergent live-frame and current-state fixtures for failed
and uncertain tool steps.
When authoritative provenance is unavailable, omit the field. Do not
derive it from tool names, failure text, service IDs, or slugs.
Acceptance
Non-scope
No readiness fetch inside Aevatar, no management URL projection, no
browser heuristics, no frontend implementation, and no new recovery
authority outside the conversation actor.
Context
nyxid-chat recovery UI must route connection/grant failures back to the
matching NyxID readiness capability.
The current contract cannot do this safely:
NyxIdChatToolStepSourcedefinestool_name,service_slug, andservice_id, but production task creation populates onlytool_name.current-state projector/DTO drops
sourceentirely.capabilityIdare different identity domains. Consumers must not inferequality between them.
Related consumer: eanz17/nyxid-chat#10.
Related readiness producer: ChronoAIProject/NyxID#1307.
Scope
readiness_capability_id(
readinessCapabilityIdon JSON) to typed NyxID tool provenance.the authorized tool call is admitted.
nyxid.task.snapshot,nyxid.task.step.changed, andGET /api/chat/conversations/{conversationId}/state.identities with their existing meanings.
and uncertain tool steps.
When authoritative provenance is unavailable, omit the field. Do not
derive it from tool names, failure text, service IDs, or slugs.
Acceptance
readinessCapabilityId.readiness capability ID intentionally distinct.
externalEffectand actor-computedavailableActionsremain unchanged.
Non-scope
No readiness fetch inside Aevatar, no management URL projection, no
browser heuristics, no frontend implementation, and no new recovery
authority outside the conversation actor.