mirror of
https://github.com/garrytan/gbrain.git
synced 2026-07-27 22:15:33 +00:00
* feat: add sync freshness check to gbrain doctor - Add checkSyncFreshness function to detect stale sources - Check all sources with local_path for sync staleness - Warn if > 24 hours, fail if > 72 hours since last sync - Include page count drift detection (best-effort) - Add check to both remote and local doctor flows - Provides actionable error messages with gbrain sync commands * chore: bump version and changelog (v0.32.4) sync_freshness check ships in v0.32.4 — adds detection for stale federated sources (warn at 24h, fail at 72h) plus best-effort filesystem-vs-DB drift detection. Surfaces in both runDoctor (local) and doctorReportRemote (thin-client). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat: rewrite sync_freshness as staleness-only + env overrides + 12 tests Strip the inline FS-walk drift detector from checkSyncFreshness. Codex outside-voice review during plan-eng-review caught that doctorReportRemote runs in the HTTP MCP server (src/commands/serve-http.ts), so walking DB-supplied sources.local_path values from a remotely-callable endpoint crosses a trust boundary — an OAuth write-scoped client could mutate local_path and probe arbitrary server filesystem paths via timing/count signal. Drift detection belongs in the existing multi_source_drift check which already has GBRAIN_DRIFT_LIMIT + GBRAIN_DRIFT_TIMEOUT_MS guards. Functional fixes folded in: - Future-last_sync_at now warns ("clock skew or corrupted timestamp") instead of silently falling through as ok. Negative ageMs previously skipped both threshold tests. - GBRAIN_SYNC_FRESHNESS_WARN_HOURS / GBRAIN_SYNC_FRESHNESS_FAIL_HOURS env vars override the 24h / 72h defaults. Invalid values (NaN, <=0) fall back to defaults with a once-per-process stderr warn. - Failure messages embed source.id so `gbrain sync --source <id>` matches the user's copy-paste (was source.name, which doesn't match the CLI flag). checkSyncFreshness is now exported so tests can target it directly, mirroring the takesWeightGridCheck pattern at doctor.ts:89. 12 unit tests in test/doctor.test.ts cover every branch: empty sources, never-synced, >72h fail, 72h boundary, 24-72h warn, 24h boundary, <24h ok, future timestamp, mixed sources (highest severity wins), executeRaw throws -> outer-catch warn, env override fires at 7h, source.id regression. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs: refresh v0.32.4 CHANGELOG + CLAUDE.md to match staleness-only scope Drop the filesystem-vs-DB drift detector description from the CHANGELOG entry. Document the env-var overrides (GBRAIN_SYNC_FRESHNESS_WARN_HOURS / GBRAIN_SYNC_FRESHNESS_FAIL_HOURS), the future-timestamp warn behavior, the source.id-in-message fix, and the codex-surfaced trust-boundary rationale for stripping drift out of scope. CLAUDE.md doctor.ts annotation updated to reflect the simpler surface plus the 12 pinning tests. llms-full.txt regenerated to track the CLAUDE.md edit (mandatory per CLAUDE.md rule). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: garrytan-agents <garrytan-agents@users.noreply.github.com> Co-authored-by: Garry Tan <garrytan@gmail.com> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>