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

empty

No context is stored yet for this userId.

Call update() with a real exchange first, then inject() again.

no_grant

This 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_scopes

A 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_capsule

Context exists for this user but produced no injectable content.

Nothing to fix — keep calling update() so the capsule accumulates usable facts.

revoked

The 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."
}