gitvow
Provenance and a policy gate for AI-agent coding sessions, stored in the git you already have.
Who made this change, what were they trying to do, and was it allowed? For code written with AI agents, git alone cannot answer. gitvow makes it answer.
- Commits made during an agent session carry the session id and a step number as trailers.
- Each such commit gets a session note: the agent's stated plan, the tools it used, the files it touched, how much of the commit it wrote. Redacted, stored as a git note, never in the tree.
- Every tool call passes a gate first: destructive commands are refused, risky ones require asking you, edits to gate-bearing files need a human. The rules are a JSON file you own. Missing policy fails closed.
- A ledger of the whole session stays in your home directory. Nothing leaves the machine unless you push it.
Standard-library Python and git. No runtime dependencies, no network calls, no telemetry.
Quick start
pip install gitvow
gitvow install --user
gitvow selftest
Work in Claude Code as usual. When the agent commits:
$ git log -1 --format=%B
Fix week-start cache key
Gitvow-Session: 8f3d5c71-574a-4eec-8903-9425e3a8335b
Gitvow-Step: 4
$ gitvow show HEAD
...
gitvow-session
{
"step": 4,
"tools_used": ["Bash", "Edit", "Read"],
"last_stated_plan": "Change the cache key to include week start so per-org settings do not collide...",
"files_in_commit": ["query-engine/.../QueryCacheHelper.java | 4 +++-"],
"files_written_by_agent_this_session": ["query-engine/.../QueryCacheHelper.java"],
"attribution": {"files_in_commit": 1, "touched_by_agent": 1}
}
Try the gate by hand:
gitvow check -- git push --force # DENY: force push
gitvow check -- kubectl apply -f x.yaml # CONFIRM: cluster apply
gitvow check --path core/authz_rules.go # CONFIRM: edits an authorization or gate file
Remove everything:
gitvow uninstall --user
Documentation
The docs site is the source of truth: https://wirevow.dev/gitvow (built from docs/).
- Quick start
- Concepts: Sessions, steps and notes · The gate · What stays out of git
- Guides: Install per user or per repo · Write a policy · Read a commit's session · Run a trial · Redaction
- Reference: CLI · Hook payloads · Note schema · Policy schema
- Security · Roadmap · FAQ
How it works
Claude Code ──hook──▶ gitvow hook PreToolUse ──▶ policy ──▶ allow / confirm / deny (exit 0 / 2 / 2)
──hook──▶ gitvow hook PostToolUse ─▶ on `git commit`: read transcript → redact → git notes add
git commit ──prepare-commit-msg──▶ Gitvow-Session / Gitvow-Step trailers (from .git/gitvow-session.json)
Claude Code ──hook──▶ gitvow hook Stop ─────────▶ ~/.gitvow/ledger/<session>.json
| Data | Where | Enters git? |
|---|---|---|
| session id, step | commit trailers | yes |
| session note (structure, redacted plan, attribution) | refs/notes/sessions |
as a note; local until pushed |
| ledger, hook log, session state | ~/.gitvow/, <repo>/.git/ |
no |
| transcript | untouched | never |
Status
0.1.0. Used in a small internal trial; the roadmap lists what comes next and what is deliberately not planned. Claude Code is the only agent supported today; the hook payload is documented so adapters are straightforward.
Contributing and security
See CONTRIBUTING.md and SECURITY.md. Reproductions of redaction gaps must use synthetic secrets.
Apache-2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gitvow-0.11.1.tar.gz.
File metadata
- Download URL: gitvow-0.11.1.tar.gz
- Upload date:
- Size: 65.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f825d46ef42612753d956166e0806210016b07babef0b7fbeb2eeb87e6dfd45
|
|
| MD5 |
506041208434cd6e54df146e082abd5f
|
|
| BLAKE2b-256 |
98097cf59599aadd9dbd22c72c0f513ff7e65cf5a59fd1d00feb15f01bfadc88
|
Provenance
The following attestation bundles were made for gitvow-0.11.1.tar.gz:
Publisher:
release.yml on wirevow/gitvow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gitvow-0.11.1.tar.gz -
Subject digest:
9f825d46ef42612753d956166e0806210016b07babef0b7fbeb2eeb87e6dfd45 - Sigstore transparency entry: 2768365343
- Sigstore integration time:
-
Permalink:
wirevow/gitvow@3f6ed35fa5522d8c6571a505a653692ed9acfe83 -
Branch / Tag:
refs/tags/v0.11.1 - Owner: https://github.com/wirevow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f6ed35fa5522d8c6571a505a653692ed9acfe83 -
Trigger Event:
push
-
Statement type:
File details
Details for the file gitvow-0.11.1-py3-none-any.whl.
File metadata
- Download URL: gitvow-0.11.1-py3-none-any.whl
- Upload date:
- Size: 51.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a1aedd62b527e4a99c0adbb638a26f9a8f129214146139f485c20e579f7a866
|
|
| MD5 |
c630a3ae91cf9b21446728ce67d62486
|
|
| BLAKE2b-256 |
0383a3c14ef3016f4f326a4728a0f8aa2faff52f0efbe63b9e51b63e1d8b4cbc
|
Provenance
The following attestation bundles were made for gitvow-0.11.1-py3-none-any.whl:
Publisher:
release.yml on wirevow/gitvow
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
gitvow-0.11.1-py3-none-any.whl -
Subject digest:
2a1aedd62b527e4a99c0adbb638a26f9a8f129214146139f485c20e579f7a866 - Sigstore transparency entry: 2768365617
- Sigstore integration time:
-
Permalink:
wirevow/gitvow@3f6ed35fa5522d8c6571a505a653692ed9acfe83 -
Branch / Tag:
refs/tags/v0.11.1 - Owner: https://github.com/wirevow
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@3f6ed35fa5522d8c6571a505a653692ed9acfe83 -
Trigger Event:
push
-
Statement type: