Response reasons
When inject() has nothing to add, it returns your base prompt unchanged and a machine-readable reason. None of these are errors — each one tells you exactly what to do next.
{
"injectedPrompt": "You are a helpful assistant.",
"reason": "empty",
"notice": "No context stored for this user yet. Call update() first."
}inject() reason values
emptyNo context is stored yet for this userId.
Call update() with a real exchange first, then inject() again.
no_grantThis agent has no grant for this user.
The first inject() auto-provisions a grant. If none exists, the grant was never created or was revoked — check the dashboard.
no_scopesA grant exists, but it shares no scopes with what the agent is allowed to read.
Widen the grant's scopes in the dashboard, or narrow what the agent requests.
empty_capsuleContext exists for this user but produced no injectable content.
Nothing to fix — keep calling update() so the capsule accumulates usable facts.
revokedThe user revoked this agent's access.
Re-grant from the dashboard. Auto-grant will NOT re-create a revoked grant.
update() refusals
update() reports what it wrote and what it refused. denied_scopes lists the scopes a fact was extracted into that the grant does not permit, and notice explains the refusal in plain language. Facts in denied scopes are not stored.
{
"updated": true,
"delta": {
"communication_style": "keeps answers terse"
},
"denied_scopes": ["relationships"],
"notice": "1 fact was not stored: the grant for this agent does not include the 'relationships' scope."
}When every extracted fact is denied, updated returns false and delta is empty. This is a governance outcome, not a failed request.
{
"updated": false,
"delta": {},
"denied_scopes": ["relationships"],
"notice": "No facts were stored: the grant for this agent does not include the 'relationships' scope."
}