Data Formats
This document describes the JSON schemas used by whogitit.
Versioning
whogitit uses two versioning mechanisms:
versionin git-note attribution payloads (AIAttribution)schema_versionin machine-readable CLI command output
Current values:
AIAttribution.version = 3- CLI machine output
schema_version = 1
AIAttribution (Git Notes)
Attribution attached to commits in refs/notes/whogitit:
{
"version": 3,
"session": {
"session_id": "7f3a4b2c-9d1e-8a7b-c3d4-e5f6a7b8c9d0",
"model": {
"id": "claude-opus-4-5-20251101",
"provider": "anthropic"
},
"started_at": "2026-01-30T14:23:17Z",
"prompt_count": 2,
"used_plan_mode": false,
"subagent_count": 0
},
"prompts": [
{
"index": 0,
"text": "Add user authentication with bcrypt...",
"timestamp": "2026-01-30T14:23:45Z",
"affected_files": ["src/auth.rs", "src/main.rs"]
}
],
"files": [
{
"path": "src/auth.rs",
"lines": [
{
"line_number": 1,
"content": "use anyhow::Result;",
"source": {
"type": "AI",
"edit_id": "8f5c3d6a-4f95-4fa9-8d11-2d54f12e6f01"
},
"edit_id": "8f5c3d6a-4f95-4fa9-8d11-2d54f12e6f01",
"prompt_index": 0,
"confidence": 1.0
}
],
"summary": {
"total_lines": 45,
"ai_lines": 25,
"ai_modified_lines": 3,
"human_lines": 2,
"original_lines": 15,
"unknown_lines": 0
}
}
]
}
AIAttribution fields
| Field | Type | Description |
|---|---|---|
version | number | Attribution schema version (current: 3) |
session | object | Session metadata |
prompts | array | Prompt records |
files | array | Per-file attribution |
Line source in git notes
Line source is serialized as a tagged enum:
source.type | Extra fields |
|---|---|
Original | none |
AI | edit_id |
AIModified | edit_id, similarity |
Human | none |
Unknown | none |
PendingBuffer
Temporary attribution buffer stored in .whogitit-pending.json:
{
"version": 3,
"session": {
"session_id": "7f3a4b2c-9d1e-8a7b-c3d4-e5f6a7b8c9d0",
"model": {
"id": "claude-opus-4-5-20251101",
"provider": "anthropic"
},
"started_at": "2026-01-30T14:23:17Z",
"prompt_count": 1,
"prompts": [
{
"index": 0,
"text": "Refactor auth middleware",
"timestamp": "2026-01-30T14:23:45Z",
"affected_files": ["src/auth.rs"],
"redaction_events": []
}
]
},
"file_histories": {
"src/auth.rs": {
"path": "src/auth.rs",
"original": {
"content": "old content",
"content_hash": "4f9e5f2c...",
"timestamp": "2026-01-30T14:23:44Z",
"line_count": 10
},
"edits": [
{
"edit_id": "8f5c3d6a-4f95-4fa9-8d11-2d54f12e6f01",
"prompt": "Refactor auth middleware",
"prompt_index": 0,
"tool": "Edit",
"before": { "content": "old content", "content_hash": "4f9e5f2c...", "timestamp": "2026-01-30T14:23:44Z", "line_count": 10 },
"after": { "content": "new content", "content_hash": "12ab34cd...", "timestamp": "2026-01-30T14:23:45Z", "line_count": 12 },
"timestamp": "2026-01-30T14:23:45Z",
"context": {
"plan_mode": false,
"agent_depth": 0
}
}
],
"was_new_file": false
}
},
"prompt_counter": 1,
"audit_logging_enabled": false,
"total_redactions": 0
}
Machine CLI Output Schemas
Machine output is versioned with:
{
"schema_version": 1,
"schema": "whogitit.<command>.v1"
}
blame --format json (whogitit.blame.v1)
Top-level fields:
schema_version,schemafile,revisionlines[]summary
lines[].source uses a stable, lowercase tagged format:
source.type | Extra fields |
|---|---|
original | none |
ai | edit_id |
ai_modified | edit_id, similarity |
human | none |
unknown | none |
prompt --format json (whogitit.prompt.v1)
Top-level fields:
schema_version,schemaquery(input reference + resolved file/line/revision)line(resolved line attribution)commitprompt(nullable)session
show --format json (whogitit.show.v1)
Top-level fields:
schema_version,schemahas_attributioncommit,commit_shortattribution_version(present when attribution exists)session,prompts,filessummary(totals)
summary --format json (whogitit.summary.v1)
Top-level fields:
schema_version,schemacommits_analyzed,commits_with_aiadditions(AI/AI-modified/human totals)ai_percentagefilesmodels
export --format json
export uses export_version:
{
"export_version": 1,
"exported_at": "2026-01-30T15:00:00Z",
"date_range": {
"since": "2026-01-01",
"until": "2026-01-31"
},
"commits": [],
"summary": {}
}
annotations --format json
Top-level fields:
schema_version,schema(whogitit.annotations.v1)annotations[]summary
Audit Log Format
Each line in .whogitit/audit.jsonl is a JSON object.
Example:
{"timestamp":"2026-01-30T14:23:15Z","event":"config_change","field":"retention.max_age_days","reason":"Set retention to 365 days","user":"greg","prev_hash":"1a2b3c4d5e6f70811a2b3c4d5e6f7081","event_hash":"5e6f7a8b9c0d1e2f5e6f7a8b9c0d1e2f"}
prev_hash and event_hash are 32-hex-character chain links (128 bits) used for tamper-evident integrity checks.
Current event types:
deleteexportretention_applyconfig_changeredaction