B-1QYO-dashboard-typed-entity-reads
The dashboard rosters (readTasks / readSimpleEntities) and readEntityDetail stayed on the untyped readRawFrontmatter bulk primitive when T-N9PM landed (PR #928) because full-contract reads measured ~4.5ms/file vs ~0.1ms and the rosters walk 700+ files per poll. User call during #928 review (2026-07-19): we’ll want typed reads in the dashboard eventually. Paths to explore: a cheap typed fm-only door (Zod safeParse over the raw fm, no mdast body plane); an mtime-keyed read cache so full-wrapper reads amortize across polls; or typed reads for readEntityDetail only (single file, wrapper cost fine). Related: T-N9PM, PR #928.