fabro/docs/public/integrations
Bryan Helmkamp ee6576cff7
Resolve one Git identity per run and inject it everywhere
A run now resolves a single author and committer identity once, after its
GitHub credentials are selected and before anything can commit, and uses it
for every commit it creates. Resolution order: a complete explicit
`run.git.author`; the run's GitHub App bot account
(`<slug>[bot] <id+slug[bot]@users.noreply.github.com>`); the authenticated
user of the run's PAT; the generic `Fabro <noreply@fabro.sh>`. A partial
explicit author overlays the fields it supplies. Only the selected
credential is consulted; a failed lookup is a setup error. A standalone
installation token falls back to the generic identity with a warning.

The resolved identity is carried on `RunOptions` and `EngineServices`,
recorded as a `git.identity.resolved` event and `RunProjection.git_identity`
so resume reuses it, and exposed through the run state API. Engine
checkpoints and metadata commits read it through `RunOptions::git_author`.
Every workflow execution path receives it as `GIT_AUTHOR_NAME`,
`GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME`, and `GIT_COMMITTER_EMAIL`, applied
last so it wins over inherited host variables and `[run.environment]`
entries: prepare steps, command stages, native agent shell tools, and ACP
launches. The identity is injected even without a Git origin, and the old
local `git config user.*` write is removed.

fabro-github gains `GET /user` and `/users/{slug}[bot]` lookups with mocked
tests for success, unauthorized, malformed, and transient cases. Real-Git
integration tests commit in the primary checkout, a clone, and a fresh
repository under conflicting local config, `[run.environment]`, and host
variables, and prove concurrent runs do not leak identities. CLI workflow
tests cover host script stages and ACP launch env through `fabro run`.

Docs and generated option metadata now describe the credential-derived
defaults instead of the stale `fabro`/`fabro@local` values.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-12 11:35:46 -06:00
..
bedrock.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
brave-search.mdx refactor(search): select backend from available credentials 2026-08-21 20:09:52 -04:00
daytona.mdx Let the Daytona provider cache images as snapshots instead of fabro 2026-09-11 13:11:16 -06:00
deepseek.mdx feat(model): separate tool and reasoning tests 2026-08-25 13:36:51 -04:00
fireworks.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
github.mdx Resolve one Git identity per run and inject it everywhere 2026-09-12 11:35:46 -06:00
litellm.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
modal.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
openrouter.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
poolside.mdx Document the catalog overlay without the metadata.fabro namespace 2026-09-09 23:26:48 -06:00
slack.mdx refactor(config): stop resolving {{ env.* }} in interpolated config 2026-07-27 21:09:35 -04:00
venice-search.mdx refactor(search): select backend from available credentials 2026-08-21 20:09:52 -04:00
venice.mdx feat(model): separate tool and reasoning tests 2026-08-25 13:36:51 -04:00