This commit is contained in:
sneakygriff 2026-08-15 23:48:41 +03:00 committed by GitHub
commit b75e99f4ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 26 additions and 1 deletions

View File

@ -521,6 +521,21 @@ function fetchRecentDecisions(projectSlug: string | null): string | null {
'--json', '--json',
]); ]);
if (!result?.pages) { if (!result?.pages) {
// F10 bug fix: this branch used to return the hardcoded
// "_No prior skill runs recorded._" string here, which is indistinguishable
// from a genuine zero-rows result. That silently converted a gbrain-
// unreachable FAILURE into a "successful" cached digest — refreshEntity()
// would write it and stamp last_refresh, so the false negative survived
// every subsequent TTL cycle forever. Returning null instead lets cmdGet's
// existing missing/stale-fallback machinery report the true state, exactly
// like every sibling fetcher (fetchGoals, fetchSimplePage) already does on
// failure.
return null;
}
// A malformed payload ({pages: {}} etc.) must classify as failure, not crash
// refreshEntity mid-refresh — same honest-missing polarity as the F10 fix.
if (!Array.isArray(result.pages)) return null;
if (result.pages.length === 0) {
return `# Recent decisions (project: ${projectSlug})\n\n_No prior skill runs recorded._\n`; return `# Recent decisions (project: ${projectSlug})\n\n_No prior skill runs recorded._\n`;
} }
const lines = result.pages.map((p) => `- ${p.title || p.slug}`); const lines = result.pages.map((p) => `- ${p.title || p.slug}`);
@ -576,7 +591,17 @@ function fetchSalience(projectSlug: string | null): string | null {
'--limit', '10', '--limit', '10',
'--json', '--json',
]); ]);
if (!result?.pages) return `# Recent salience\n\n_No salient pages in last 14d._\n`; // F10 bug fix (sibling of fetchRecentDecisions above): a gbrain-unreachable
// failure used to render the identical hardcoded "no salient pages" string
// as a genuine empty result, which refreshEntity() then cached as if it
// were verified truth. Unlike recent-decisions there is no project-local
// fallback for salience — it is specifically gbrain's emotional-weight-
// ranked *brain* pages, not project decision/work data, and conflating the
// two would defeat the D9 privacy allowlist's purpose. So on failure we
// return null and let the cache report 'missing' (same as product.md,
// goals.md, etc. already do on this machine) instead of asserting a claim
// we have no way to verify.
if (!result?.pages) return null;
// D9 privacy gate: strip entries outside the allowlist BEFORE rendering. // D9 privacy gate: strip entries outside the allowlist BEFORE rendering.
// Sensitive personal content (family, therapy, reflection) is never written // Sensitive personal content (family, therapy, reflection) is never written