Report offline analysis provenance

ober

a22cd53a4f133e86cb4720af9c2fb7c16eec5e2b

diff --git a/README.md b/README.md
index e5656c3..0da9fef 100644
--- a/README.md
+++ b/README.md
@@ -80,6 +80,8 @@ JSON output includes:
 
 - `detector_version`
 - `config_hash`
+- analysis provenance fields: `analysis_provider`, `llm_used`, and
+  `network_used`
 - repository path
 - commit and parent IDs
 - author/committer-facing metadata
diff --git a/main-binary.ss b/main-binary.ss
index 23e06f6..b7ee1b8 100644
--- a/main-binary.ss
+++ b/main-binary.ss
@@ -638,6 +638,7 @@
         (cons 'evidence (signal-evidence s)) (cons 'limitations (signal-limitations s))))
 (def (finding-json repo f)
   (list (cons 'detector_version detector-version) (cons 'config_hash (scan-config-hash current-config))
+        (cons 'analysis_provider "offline-heuristics") (cons 'llm_used #f) (cons 'network_used #f)
         (cons 'repository repo) (cons 'commit (finding-commit f))
         (cons 'parent (finding-parent f)) (cons 'author_name (finding-author-name f)) (cons 'author_email (finding-author-email f))
         (cons 'time (finding-time f)) (cons 'subject (finding-subject f)) (cons 'files (finding-files f))
@@ -649,6 +650,7 @@
         (cons 'score (finding-score f)) (cons 'verdict (finding-verdict f)) (cons 'warnings (finding-warnings f))))
 (def (report-json repo findings)
   (list (cons 'detector_version detector-version) (cons 'config_hash (scan-config-hash current-config))
+        (cons 'analysis_provider "offline-heuristics") (cons 'llm_used #f) (cons 'network_used #f)
         (cons 'repository repo) (cons 'count (length findings))
         (cons 'findings (map (lambda (f) (finding-json repo f)) findings))))
 
diff --git a/tests/fixture-smoke.sh b/tests/fixture-smoke.sh
index 5ea2a2e..da2aa5c 100755
--- a/tests/fixture-smoke.sh
+++ b/tests/fixture-smoke.sh
@@ -41,6 +41,9 @@ git -C "$fixture" notes --ref=ai add -m '{"tool":"codex","model":"gpt-5","lines"
 json=$("$root/bin/jerboa-aigit" scan "$fixture" --format json --count 2)
 printf '%s\n' "$json" | grep -q '"count":2'
 printf '%s\n' "$json" | grep -q '"config_hash":"[0-9]'
+printf '%s\n' "$json" | grep -q '"analysis_provider":"offline-heuristics"'
+printf '%s\n' "$json" | grep -q '"llm_used":false'
+printf '%s\n' "$json" | grep -q '"network_used":false'
 printf '%s\n' "$json" | grep -q '"verdict":"recorded-ai-authorship"'
 printf '%s\n' "$json" | grep -q '"recorded_ai_note_present":true'
 printf '%s\n' "$json" | grep -q '"recorded_attribution":\[{"source":"refs/notes/ai","tool":"codex","model":"gpt-5","session":"","path":"src/generated.py","start":1,"end":360}\]'
@@ -72,8 +75,10 @@ stats=$("$root/bin/jerboa-aigit" stats "$fixture" --count 2)
 printf '%s\n' "$stats" | grep -q 'commits: 2'
 printf '%s\n' "$stats" | grep -q 'recorded AI notes: 1'
 
-jsonl_lines=$("$root/bin/jerboa-aigit" scan "$fixture" --format jsonl --count 2 | wc -l | tr -d ' ')
+jsonl=$("$root/bin/jerboa-aigit" scan "$fixture" --format jsonl --count 2)
+jsonl_lines=$(printf '%s\n' "$jsonl" | wc -l | tr -d ' ')
 test "$jsonl_lines" = 2
+printf '%s\n' "$jsonl" | grep -q '"analysis_provider":"offline-heuristics"'
 
 head_rev=$(git -C "$fixture" rev-parse HEAD)
 base_rev=$(git -C "$fixture" rev-parse HEAD~1)