fix(clustering): drop TTL check from isUpToDate; task hash is the only signal

If tasks haven't changed, the output is valid forever. If they changed,
always recompute regardless of age. TTL on focus-area restored to 24h —
it only controls recommender eligibility, not recompute frequency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-12 14:46:43 +00:00
parent d12f11d29d
commit 12c956b588
2 changed files with 3 additions and 6 deletions

View File

@@ -37,7 +37,7 @@ MANIFEST = AgentManifest(
context_schema=["todoist.tasks"],
required_consents=["data:core", "data:todoist"],
output_contract={"type": "snippet", "format": "free_text"},
ttl_sec=3_600,
ttl_sec=86_400,
inferred_params=[
InferredParam(
key="preferred_areas",

View File

@@ -165,17 +165,14 @@ function taskListHash(tasks: { content?: string }[]): string {
}
async function isUpToDate(userId: string, agentId: string, currentHash: string): Promise<boolean> {
const now = new Date().toISOString();
const rows = await db
.select({ signalsSnapshot: agentOutputs.signalsSnapshot, expiresAt: agentOutputs.expiresAt })
.select({ signalsSnapshot: agentOutputs.signalsSnapshot })
.from(agentOutputs)
.where(and(eq(agentOutputs.userId, userId), eq(agentOutputs.agentId, agentId)))
.limit(1);
if (!rows.length) return false;
const row = rows[0];
if (row.expiresAt <= now) return false;
try {
const snapshot = JSON.parse(row.signalsSnapshot ?? '{}') as { _task_hash?: string };
const snapshot = JSON.parse(rows[0].signalsSnapshot ?? '{}') as { _task_hash?: string };
return snapshot._task_hash === currentHash;
} catch { return false; }
}