add_repo(access:push) 토큰이 실제로는 read-only — git push 403 (owner 계정 소유 public repo)

Status Open
Maintainer reply None cached
Activity 0 comments · opened Aug 5, 2026

Environment: Claude Code Remote (CCR) / Claude Code on the web
Repo: teoteobak-commits/shortsbox (public, owner-owned)
Action: add_repo tool called with access: "push" — tool responded that push credentials were attached ("attached with credentials after the full repository-access checks").

Actual result: git push to https://github.com/teoteobak-commits/shortsbox fails with HTTP 403. Full server response body (not just the summary line):

Permission to teoteobak-commits/shortsbox.git denied to teoteobak-commits.

Diagnostics already ruled out:

  • Not a proxy/network block: CONNECT tunnel to github.com succeeds, /__agentproxy/status shows recentRelayFailures: [].
  • Not transient: retried 4x with backoff, same result.
  • Identity is correctly resolved as the repo owner, so a credential IS being injected — it simply lacks write scope.
  • Tried explicit -c http.extraheader="Authorization: Bearer $GITHUB_TOKEN" and SSH-form remote (git@github.com:...) — identical 403 in both cases.
  • Checked the GitHub account's own authorization surfaces — Installed GitHub Apps, Authorized GitHub Apps, and Authorized OAuth Apps all show no Claude/Anthropic entry whatsoever. So there is no user-facing GitHub permission screen where write access could be granted/upgraded — the credential CCR uses doesn't surface in the account's normal GitHub authorization UI.
  • Separately, $GITHUB_TOKEN in the session env authenticates as teoteobak-commits (GET /user → 200) but returns 403 even reading unrelated public repos (e.g. anthropics/claude-code), suggesting it's a narrowly-scoped fine-grained PAT, not a general-purpose credential.

Expected: add_repo(access:"push") should yield a token with contents:write (or equivalent) for a repo the calling user owns.

Impact: Any CCR workflow that generates a file and needs to commit+push it (e.g. daily automation writing to a repo) silently fails at the push step despite the tool reporting success on the access grant

View original on GitHub ↗