# Harness follow-ups

- `pi_idle.py`: Its `openai-codex` 1800 s TTL is an estimate; the ChatGPT
  backend publishes no TTL. Local data shows 90% cache hits after 20–30 min idle
  gaps (work item `idle-ttl-detection`,
  `evidence/openai-codex-observed-cache.md`). Revisit if OpenAI publishes a
  ChatGPT-backend TTL or observed hit rates at 20–30 min drop.
- `extractors/opencode.py`: native OpenCode denials provide OpenCode's generic reason,
  not Meridian's `HEADLESS_REJECT_REASON`, and an unavailable tool produces no attempted-call
  event to journal. Closing either gap requires an upstream custom-denial-reason/event seam
  or a Meridian hook that mediates calls instead of native policy; do not fabricate events.
- `transcript.py`: a Claude compaction segment's setup slot (entry 0) holds the
  `compact_boundary` event's literal `content` ("Conversation compacted"); the real
  summary arrives next as a user event flagged `isCompactSummary` (not `isSynthetic`),
  so it lands at entry 1. Segment 0's slot can also catch a hook's system notice
  (seen: `meridian-idle: hooks.json changed`) instead of a prologue. Observed on
  `c8788`. The bundled sessions skill reads `--from 0 --limit 2` around this;
  narrow it to `--limit 1` once the summary fills the slot.
