Breaking changes

Updated Jul 27, 2026

1.1.1 — Narrowed store key helper input types

repositoryStoreKey, branchStoreKey, and blobStoreKey now accept narrower input shapes rather than the full GitHub entity types. Callers passing complete entity objects continue to work unchanged, but explicit type annotations referencing the old parameter types must be updated.

repositoryStoreKey

// Before
repositoryStoreKey(repository: GitHubRepository)

// After
repositoryStoreKey(repository: { owner: string; name: string })

branchStoreKey

// Before
branchStoreKey(branch: GitHubBranch)

// After
branchStoreKey(branch: Pick<GitHubBranch, 'owner' | 'repo' | 'name'>)

blobStoreKey

// Before
blobStoreKey(blob: GitHubBlob)

// After
blobStoreKey(blob: Pick<GitHubBlob, 'owner' | 'repo' | 'path' | 'sha'>)

1.2.1 — Request-scoped actor resolution

GET /user, GET /user/memberships/orgs, and Query.viewer no longer fall back to the first seeded user when no actor header is present. They now return HTTP 401 with Authentication required for unauthenticated requests.

Scenario Before 1.2.1 After 1.2.1
No actor header sent First seeded user returned 401 {"message":"Authentication required"}
x-simulacat-user: <login> sent Named user returned (unchanged) Named user returned (unchanged)
x-simulacat-actor: user:<login> sent Not supported Named user returned

Set x-simulacat-actor: user:<login> (or a legacy alias) on every request that must exercise /user, /user/memberships/orgs, or viewer.

For REST authenticated-user routes, both GET /user and GET /user/memberships/orgs require x-simulacat-actor: user:<login> or a legacy user alias. Without an actor that resolves to a seeded user, these routes return HTTP 401 with {"message":"Authentication required"}.