- webhook.ts: createExportedHandler(opts) factory (offline send capture via
baseFetch); scheduled() wraps runGuidanceCronTick in ctx.waitUntil —
fail-closed unconfigured gate, paginated guidance: KV list (list_complete
respected), loadGraph awaited ONCE per tick (the shared R2 memo), per-key
getGuidanceSession → projectTurnCards → sendPhoto to envelope.chat_id ONLY
(T-06-02), every log a [guidance-cron] category, zero KV writes
- guidance-sessions.ts: GUIDANCE_KEY_PREFIX exported — the ONE key-scheme
authority (list scans derive prefix + slice ids from it)
- wrangler.jsonc: triggers.crons */1 * * * * (60 s scan, cadence in code)
- guidance-cron.test.mjs GREEN completion: GC-C3/C5/C8/C9 wire the recording
baseFetch through the factory (the header-documented seam — they defined
the recorder but never passed it); GC-C7 uses readdirSync (require is
undefined in ESM); GC-C1/C8/C9 drain inside the withConsole window (the
tick's logs fire under waitUntil)
- guidance-envelope.test.mjs: GE7 allows the GUIDANCE_KEY_PREFIX named import
- 125/125 bot tests green; bot:typecheck clean
- GE1/GE2/GE3 UNCHANGED in meaning (TTL 7200, 4+6 field freeze, inline snapshot)
- GE4 re-pinned: types-only token ban -> the module must EXPORT mint/get/deleteGuidanceSession
- GE7 re-pinned: total consumer ban -> named-imports-only of the service surface
- GE5/GE6 stand (exactly one kv namespace; no Env guidance field)
- GS1-GS5 behavioral: TTL'd mint, roundtrip, 7-class defensive null read,
UUID key-guard without KV touch (V5), active delete (D-14 server half)
- PG1 storageModules now covers kv/guidance-sessions.ts (same-line TTL law)