From 0be21176c161c154d2359737927b73bfadc36918 Mon Sep 17 00:00:00 2001 From: pai-scaffolde Date: Fri, 11 Sep 2026 16:52:08 -0700 Subject: [PATCH] fix(healthsync): one quiet skip line for unconfigured providers on pull `HealthSync.ts pull` (hourly via com.lifeos.healthsync) printed one `: unconfigured; ... error= not set in ~/.claude/.env` line per provider on every run, so a stock install with no Oura, Eight Sleep or Function Health credentials logged three error-shaped lines an hour for a state that is not an error. Group unconfigured and awaiting-first-export sources into a single `skipped (not configured): ...` line; ok/failed sources keep the detailed line, and current.json plus the healthsync JSONL row still carry the per-source reason. Co-Authored-By: Claude Fable 5.1 --- LifeOS/install/LIFEOS/TOOLS/HealthSync.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/LifeOS/install/LIFEOS/TOOLS/HealthSync.ts b/LifeOS/install/LIFEOS/TOOLS/HealthSync.ts index 3831e63efb..1fbd0d71e9 100755 --- a/LifeOS/install/LIFEOS/TOOLS/HealthSync.ts +++ b/LifeOS/install/LIFEOS/TOOLS/HealthSync.ts @@ -352,11 +352,22 @@ async function runPull(args: string[]): Promise { results, }); + // A provider with no credentials is a skip, not a failure: one quiet line for + // the lot instead of an error= line per provider on every hourly run. The + // per-source reason still lands in current.json and the JSONL row above. + const skipped: SourceName[] = []; for (const result of results) { + if (result.status === "unconfigured" || result.status === "awaiting-first-export") { + skipped.push(result.source); + continue; + } log( `${result.source}: ${result.status}; records=${result.records}; ms=${result.ms}; error=${result.lastError ?? "none"}`, ); } + if (skipped.length > 0) { + log(`skipped (not configured): ${skipped.join(", ")}`); + } return 0; }