fix: remove silent error suppression — cache failures, box index mutation, cleanup catches

geometry-cache.ts: replace 5 empty catch blocks with console.warn
- statSync failure, rmSync failure (x2), readCachedWorld failure,
  readCachedExtractionResult failure were all silently swallowed.
  Now emit context-bearing warnings so stale/corrupt caches are visible.

predicates.ts: replace __boxIndex as any mutation with WeakMap
- getBorderRect used (world as any).__boxIndex to cache a subject-to-
  box-index map on the world object. Replaced with module-level WeakMap
  that auto-collects when the world is GC'd. Eliminates 2 as any casts.

extraction.ts: serialize materializeSemanticSelector + debug cleanup
- 3 Promise.all sites over page.evaluate changed to sequential for..of
  to eliminate DOM modification race conditions.
- 2 .catch(()=>{}) cleanup blocks now use console.debug so failed
  cleanup is traceable when debugging.
- resolveViewport catch now emits console.warn on zero-viewport fallback.

648 SDK + 57 E2E tests pass.
This commit is contained in:
John Dvorak
2026-05-22 12:00:20 -07:00
parent a424d29ccc
commit e17e4d6c20
3 changed files with 22 additions and 14 deletions
+10 -7
View File
@@ -250,7 +250,8 @@ function evictOldestEntries(cacheDir: string, maxEntries: number): void {
const fullPath = join(cacheDir, f)
try {
return { name: f, path: fullPath, mtime: statSync(fullPath).mtimeMs }
} catch {
} catch (err) {
console.warn(`[imhotep-core] cache eviction: stat failed for ${f}: ${err instanceof Error ? err.message : err}`)
return null
}
})
@@ -262,8 +263,8 @@ function evictOldestEntries(cacheDir: string, maxEntries: number): void {
for (let i = 0; i < toRemove; i++) {
try {
rmSync(files[i].path)
} catch {
// ignore deletion errors
} catch (err) {
console.warn(`[imhotep-core] cache eviction: failed to remove ${files[i].path}: ${err instanceof Error ? err.message : err}`)
}
}
}
@@ -277,7 +278,8 @@ export async function readCachedWorld(cacheDir: string, cacheKey: string): Promi
try {
const json = await readFile(path, 'utf-8')
return deserializeGeometryWorld(json)
} catch {
} catch (err) {
console.warn(`[imhotep-core] readCachedWorld failed for ${cacheKey}: ${err instanceof Error ? err.message : err}. Cache miss.`)
return null
}
}
@@ -303,8 +305,8 @@ export function clearGeometryCache(cacheDir: string = DEFAULT_CACHE_DIR): void {
if (file.endsWith('.json')) {
try {
rmSync(join(cacheDir, file))
} catch {
// ignore deletion errors
} catch (err) {
console.warn(`[imhotep-core] cache clear: failed to remove ${file}: ${err instanceof Error ? err.message : err}`)
}
}
}
@@ -390,7 +392,8 @@ export async function readCachedExtractionResult(
try {
const json = await readFile(path, 'utf-8')
return deserializeExtractionResult(json)
} catch {
} catch (err) {
console.warn(`[imhotep-core] readCachedExtractionResult failed for cacheKey=${cacheKey}: ${err instanceof Error ? err.message : err}. Cache miss.`)
return null
}
}