Skip to main content
Code Storage uses ref policies for branch protection. Each ref policy limits writes from one JWT. A ref policy is not a repository setting. It applies only to a request that uses its JWT. Give each client or task a JWT with the limits it needs.
A git:write scope grants write access. A ref policy can limit that access, but it cannot grant access.
The SDK accepts refPolicies on getRemoteURL(), getEphemeralRemoteURL(), and getImportRemoteURL(). The write methods in this guide also accept this option.

Policy operations

Add a ref policy

The refPolicies option is an ordered list of rules. Each rule has a pattern and an optional ops list. This policy permits branches under agents/ in the default namespace. It rejects all other refs.
A rule with no ops permits its matched ref. Code Storage also permits a write when no rule matches. Add a final * rule with no-push when you need an allowlist. This rule rejects each ref that no earlier rule permits.

Match refs

Use an exact ref or a prefix glob. A prefix glob has one final * after a slash. Use * to match all refs. Code Storage treats a pattern without refs/ as a branch name in the default namespace. Code Storage uses the first rule whose pattern matches the ref. It does not check a later rule when the first rule has no ops.
Put a broad rule after each specific rule. An earlier * rule hides all later rules.

Apply policies to ephemeral branches

Ref policies apply to ephemeral branches. Code Storage stores them in the ephemeral ref namespace. The policy sees the complete stored ref. For example, the ephemeral branch preview/pr-123 has this ref:
A short preview/* pattern becomes refs/heads/preview/*. It matches branches in the default namespace only. This URL permits only ephemeral branches under agents/:
See Ephemeral Namespace for remote URLs and branch promotion.

Use a policy with an SDK call

Pass the same option to an SDK method that writes a ref. The SDK puts the rules in the JWT for that call.
These SDK write methods accept a ref policy:
  • createBranch() and deleteBranch()
  • createTag() and deleteTag()
  • createCommit(), createCommitFromDiff(), and restoreCommit()
  • merge() and pullUpstream()
  • createNote(), appendNote(), and deleteNote()
The policy checks the target ref.

Add a policy to a JWT

The SDK converts refPolicies to the refs JWT claim. Each claim entry is an ordered [pattern, ops] pair.
Keep the array order. JSON objects do not represent these rules. See Authentication & Security for the other JWT claims.

Commit signature checks

The verify-sig operation checks each commit that an update introduces to the matched ref. Code Storage checks each signature against the registered organization keys. A registered key does not enable a check by itself. Add verify-sig to a ref policy rule. See Commit Signing for key setup, check behavior, and an example.
Do not target a verify-sig ref with createCommit, createCommitFromDiff, or merge. These methods create unsigned commits.

Where ref policies apply

Code Storage checks ref policies on these write paths:
  • A Git push over HTTPS
  • A supported SDK or HTTP API method that updates a ref

Legacy ops option

Remote URL methods also accept a top-level ops list. This old option applies its operations to the * rule. Use refPolicies in new code. It shows the catch-all rule and supports specific refs.