Skip to content

The mandated broker path has no agent-reachable identity — every credential task dead-ends at the human #282

Description

@chitcommit

Filing this because it is the structural blocker behind three separate tasks today, and it is not a task anyone can close by trying harder.

What happened

chittyconnect-concierge was dispatched with a concrete, in-scope ask: grant API Tokens Write on the account so the provisioner can mint scoped Cloudflare tokens. It could not execute, and its failure code was not POLICY_BLOCKED_CHITTYCONNECT_UNAVAILABLE — both broker legs are live:

  • connect.chitty.cc/health → 200, v2.2.0
  • connect.chitty.cc/api/credentials/{health,types,provision}401 Missing API key — mounted and correctly enforcing auth
  • secrets.chitty.cc → Cloudflare Access interstitial on every path, gate working as designed

The code was MISSING_CREDENTIAL_MATERIAL. The agent holds no ChittyConnect API key and no ChittySecrets service-principal JWT, so it cannot invoke ch1tty.cast_execute_to_chittyconnect at all.

Why this is the finding and not a footnote

~/.ch1tty/canon/system-wide-sensitive-intent-contract-v1.md makes ChittyConnect the mandatory control path for credentials, deploys, registry mutation, and infrastructure change, and forbids falling back to chat. That contract is sound. But an agent that cannot authenticate to the mandatory path has exactly two moves: fail closed, or route the work to the human.

Failing closed is correct and is what happened. The problem is what happens next — the work still needs doing, so it lands on the one human, which is the precise outcome the contract exists to prevent. The policy is enforced; the capability behind it is not reachable. That gap is why "use the broker instead of the Global API Key" has been advice nobody could follow, and why 34 files still use the account Global API Key.

What would close this

An agent-reachable service principal for the broker: a ChittyConnect API key or ChittySecrets service-principal JWT, scoped to credential provisioning, that a dispatched agent can obtain without a human in the loop and without any secret value transiting a chat surface. Whatever the shape, the acceptance test is one sentence — a dispatched agent completes a credential-provisioning request end-to-end with no human step.

Until then, MISSING_CREDENTIAL_MATERIAL is the honest terminal state for every credential task, and it should be reported as a capability gap rather than as "requires operator action" — the noun does not change what is missing.

Immediate downstream blockers

  • The API Tokens Write grant on account-owned token bb924f… (needed by fix(credentials): address Cloudflare account-owned tokens, not the /user token family #281). Whoever holds the account-owner credential must provision it into ChittySecrets; no agent path reaches it today.
  • Whether /accounts/{id}/tokens/permission_groups returns the same permission-group IDs as /user/tokens/permission_groups. Unanswerable while 403'd. fix(credentials): address Cloudflare account-owned tokens, not the /user token family #281 now fails closed rather than guessing, so this is safe to leave open — it just means minting stays blocked.
  • EnhancedCredentialProvisioner has no path to edit an existing token's permissions (no PUT /accounts/{id}/tokens/{id}), and its static permission catalog has no Account API Tokens group at all. If "extend the existing token" is the intended operation rather than "mint a sibling," that needs new code and is a maintainer design call.

Related: #279 (end-to-end retrieval acceptance test), #280 (broker adapter), #281 (account token API family).

🤖 Generated with Claude Code

https://claude.ai/code/session_01Nz8PYvgzrfpm9hM86vSWBc

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions