mirror of
https://github.com/garrytan/gbrain.git
synced 2026-07-31 04:07:52 +00:00
New check_cycle_freshness sibling to checkSyncFreshness. Where sync_freshness reads sources.last_sync_at (one phase), this check reads sources.config->>'last_full_cycle_at' — the canonical "this whole cycle completed" timestamp the v0.38 runCycle exit hook writes and the v0.38 autopilot fan-out gate reads. Operator sees exactly what autopilot sees when deciding to skip a source. Default thresholds tighter than sync_freshness (6h warn / 24h fail vs 24h/72h) because full-cycle staleness compounds: sync stale → extract stale → embed stale → search returns stale results. Env overrides: - GBRAIN_CYCLE_FRESHNESS_WARN_HOURS (default 6) - GBRAIN_CYCLE_FRESHNESS_FAIL_HOURS (default 24) Edge cases covered (9 PGLite integration tests): - empty (no federated sources) → ok - last_full_cycle_at present + fresh → ok - last_full_cycle_at present + warn window → warn - last_full_cycle_at present + fail window → fail - last_full_cycle_at NULL (never cycled) → fail - mixed severity → highest wins - future timestamp (clock skew) → warn - unparseable timestamp → warn - local_path NULL sources filtered (codex P1-4 parity) Failure messages embed source.id so the printed fix command `gbrain dream --source <id>` matches what the user copy-pastes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>