History evidence indexing

Purpose: Derive equivalent commit counts and relevant activity evidence without repeated large Git manifests or unused line diffs. Scenario: A rebuild streams raw Git tree changes for commit file counts. Activity refresh shares a disposable file-backed SQLite lookup across bounded batches, fetching only requested source/signature/key paths and retaining at most 512 requested results in PHP. Small commits remain batched. Sources: commit reader (source unavailable), evidence lookup (source unavailable), refresh (source unavailable), evidence service (source unavailable). Failure behavior: Git history output is spooled successfully before commit rows are yielded. Evidence loads use savepoints inside one scratch operation transaction; failed loads roll back before fallback. The scratch file is removed on close, failure or destruction. No scratch state crosses refreshes or enters read-model exports. Synchronous-off/exclusive settings apply only to this disposable file, never canonical or published data. Boundary: Full commit-detail views keep their manifest contract. Existing Git rename/merge defaults and missing-history/trust behavior remain. Small-manifest workloads may pay a modest scratch overhead; measured improvements are specific to the fixed workloads, not every history shape. Verification: Exact legacy/new rows, signed evidence/key roles, missing/corrupt history, rename/binary/mode changes, repeated and incremental refresh, failure rollback, memory bounds and process counts; schema remains 39 because core tables and queries are unchanged.