Skip to main content

Commits and Anchors

A git commit stores a diff, a message, an author, and a timestamp. It tells you what changed but says nothing about how the change was produced. An anchor extends a commit with AI context. It records which AI sessions were active, how many tokens were spent, and which lines came from AI vs. the developer.
FieldWhat it stores
commit_hashThe git commit this anchor is attached to
messageCommit message
authorGit author
author_typeagent, assisted, human, or automated
contributorsAll participants (humans + AI tools with model info)
branchBranch name
committed_atTimestamp
session_idsArray of linked AI session IDs
files_changedList of modified files
added / deletedAggregate diff stats
file_changesPer-file: path, added/deleted, attribution (ai/human/mixed), agent
ai_added / ai_deletedLines attributed to AI
human_added / human_deletedLines attributed to human
ai_percentageAI contribution percentage (0-100)

Author Types

TypeWhen it applies
agentAn AI agent made the commit autonomously
assistedA human committed while one or more AI sessions were active
humanNo AI session was active during the commit
automatedNon-interactive commit (CI, scripts, bots)

Where Anchors Are Stored

Anchors are stored on the git orphan branch oobo/anchors/v1. This branch:
  • Travels with the repo (pushed alongside your code)
  • Is invisible to normal git operations (git log, git diff, working tree)
  • Is created automatically on the first tracked commit
  • Is pushed via the pre-push hook
The orphan branch is the single source of truth for anchor data. There is no separate database or cloud service required.

Sessions

A session represents a single AI coding conversation. Oobo discovers sessions by reading the local storage of each supported tool (Cursor’s SQLite databases, Claude Code’s JSONL files, Gemini’s JSON files, etc.).
FieldWhat it stores
session_idUUID (prefix-matchable)
nameSession title or first message
sourceTool name (cursor, claude, gemini, etc.)
modeInteraction mode (agent, composer, chat, ask) - available at discovery time
project_pathAssociated project directory
created_at / updated_atTimestamps (from file metadata)
When a session is linked to an anchor, additional data is stored in the SessionLink (on the orphan branch):
FieldWhat it stores
modelAI model used
input_tokens / output_tokensToken counts (native or estimated)
cache_read_tokens / cache_creation_tokensPrompt cache stats
duration_secsHow long the session lasted
tool_callsTotal tool invocations
files_touchedFiles the session interacted with
is_estimatedtrue if tokens are tiktoken estimates
is_subagentWhether this was a child/sub session
See the full schema reference for all SessionLink fields including tool usage breakdown, bash commands, thinking time, and subagent details.

Token Sources

Some tools store exact token counts (Claude Code, Gemini CLI, OpenCode, Codex CLI, Zed). For tools that don’t (Cursor, Copilot), oobo estimates tokens using tiktoken and marks them with is_estimated: true.

Transparency

Transparency controls whether redacted session transcripts are written to the orphan branch alongside anchor metadata.
ModeWhat syncs to orphan branch
on (default)Anchor metadata + redacted session transcripts
offAnchor metadata only. Transcripts stay local.
Set via config:
[privacy]
transparency = "off"    # or "on"
When transparency is on, session transcripts are redacted (secrets removed via gitleaks patterns) before being written to the orphan branch. Transparency has a global default in ~/.oobo/config and can be overridden per-project in .oobo/config.

Turns

A turn is a single exchange within a session - one user prompt and the agent’s response. Oobo’s TurnTap pipeline captures per-turn workspace state (tree hashes) for tools that support it (Claude, Cursor, Codex, OpenCode). This enables oobo goto to restore exact workspace snapshots mid-session.

Projects

A project is any git repository where oobo is enabled. Projects are found during oobo setup or normal command use. Run bare oobo outside a repo to see a project picker.

Disabling a Project

oobo disable           # stop tracking the current repo
oobo enable            # re-enable tracking
When a repo is disabled, hooks do not fire - no anchor creation, no orphan branch writes, no session discovery. On first use in a new repo, oobo prints a one-time notice:
oobo: enriching commits in <project> with AI attribution. Run `oobo disable` to opt out.