Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Data Formats

This document describes the JSON schemas used by whogitit.

Versioning

whogitit uses two versioning mechanisms:

  • version in git-note attribution payloads (AIAttribution)
  • schema_version in 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

FieldTypeDescription
versionnumberAttribution schema version (current: 3)
sessionobjectSession metadata
promptsarrayPrompt records
filesarrayPer-file attribution

Line source in git notes

Line source is serialized as a tagged enum:

source.typeExtra fields
Originalnone
AIedit_id
AIModifiededit_id, similarity
Humannone
Unknownnone

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, schema
  • file, revision
  • lines[]
  • summary

lines[].source uses a stable, lowercase tagged format:

source.typeExtra fields
originalnone
aiedit_id
ai_modifiededit_id, similarity
humannone
unknownnone

prompt --format json (whogitit.prompt.v1)

Top-level fields:

  • schema_version, schema
  • query (input reference + resolved file/line/revision)
  • line (resolved line attribution)
  • commit
  • prompt (nullable)
  • session

show --format json (whogitit.show.v1)

Top-level fields:

  • schema_version, schema
  • has_attribution
  • commit, commit_short
  • attribution_version (present when attribution exists)
  • session, prompts, files
  • summary (totals)

summary --format json (whogitit.summary.v1)

Top-level fields:

  • schema_version, schema
  • commits_analyzed, commits_with_ai
  • additions (AI/AI-modified/human totals)
  • ai_percentage
  • files
  • models

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:

  • delete
  • export
  • retention_apply
  • config_change
  • redaction