--- name: thermograph-kylene-summaries description: The periodic job that mirrors kylene's Drive-hosted call summaries into the docs repo so they are searchable. Read this when running the loop, or setting it up. --- # kylene call-summary mirror **kylene** records `war-room`, and when the room empties it summarises the whole call, posts to `#voice-summaries`, and files a Google Doc in the team's Drive folder. That output is good — and invisible. `docs_search` and `notes_search` index the docs repo **only**; neither can see Google Drive. So a decision made on a kylene call cannot be found by anyone, human or agent, who does not already know to go and open Drive. This job closes that gap: it mirrors each finished call into `summaries/` in the docs repo, enriched with estate context, so the existing search tools reach it. ## There is only one voice pipeline kylene is it. Earlier versions of these docs described a second pipeline running beside it — raw transcript streamed into `#voice-transcripts` and digested every 30 minutes into `summaries/` — and **no such job ever existed**. The only thing that ever posted to `#voice-transcripts` was a third-party bot trialled briefly and since removed from the server; nothing in this estate wrote there. It matters here because that second pipeline was the reason this skill warned about duplicate and empty digests, and the reason the `(kylene)` marker read as a collision guard. There is nothing to collide with. Keep the marker — it is how a re-run recognises what it already mirrored — but do not go looking for the other side of it. | | kylene (this skill) | |---|---| | Voice channel | `war-room` | | Posts to | `#voice-summaries` | | What it posts | a **finished summary**, once per call | | Durable copy | a Google Doc in Drive | | This job's work | **mirror and enrich** an existing summary | Because kylene has already summarised the call, **do not re-summarise from scratch and do not pad.** The value added here is durability, searchability and estate cross-referencing — not a second opinion on what was said. ## What the loop does, each run 1. **Find what is already mirrored.** `summaries_list` + `docs_read` on recent `summaries/` files. Sections mirrored by this job are headed `war-room UTC (kylene)`, so an existing section for a call means that call is done. This is the idempotency anchor — a re-run or a missed run must not produce a second copy of the same call. 2. **Find the calls.** `voice_calls` with no `file` argument lists the Drive documents newest first, one per call. Any call with no matching section is unmirrored. If every call is already mirrored, **stop — do not write an empty summary.** If the Drive tools report no credential configured, fall back to reading `#voice-summaries` with `discord_get_messages` (its id is in `community_channels` under `voice_summaries`, or `CENTRALIS_VOICE_SUMMARY_CHANNEL`). The Discord post carries the summary but not the full transcript, so say so in the mirrored section rather than implying you had the whole call. 3. **Read the call.** `voice_calls` with `file` set to its id. It holds kylene's summary, the decisions and action items, and the transcript those were drawn from. 4. **Mirror it.** Carry across, tightened but not reinterpreted: - What was discussed and, above all, **what was decided**. - Action items, with owners where kylene identified them. - Open questions left unresolved. - Keep the grade-language rule: never call a percentile "hot" or "cold". - Link the Drive document, so the verbatim record is one click away. The mirror is a searchable index of the call, not a replacement for it. 5. **Enrich with estate context.** Where the call *genuinely* connects to something the estate already knows, look it up and fold in a brief, **cited** note under a short **Related context** section, clearly separated from what was said. Never invent a connection. Draw on: - **Repos, PRs** — `onedev_read`, `onedev_projects`, `onedev_prs`. OneDev has no issue tracker of its own; a bug or feature request lives in Taiga instead (`taiga_story_list`, `taiga_story_get`). - **Docs & notes** — `docs_search`, `docs_read`, `notes_search`, `notes_read` (is there a prior record? does a note contradict this?). - **The other pipeline** — `summaries_list` / `docs_search`. A topic raised on a kylene call may already have a war-room summary; cross-reference rather than duplicate. - **App stats** — `sql_query` (read-only, never `write:true`). - **Climate stats** — `lake_query` / `lake_tables`, `grade_location`, `geocode`. Percentiles versus local history, never absolutes. - **What broke** — `logs_query`, `fleet_status` when an incident is mentioned. - **Outside world** — `WebSearch`, `WebFetch`. 6. **Write it.** `summaries_write` with a `heading` of `war-room UTC (kylene)`, taking the times from the call document. It appends to `summaries/YYYY-MM-DD.md` for the **call's** date — pass `date` explicitly rather than defaulting to today, or a call summarised after midnight UTC lands on the wrong day. Commits straight to main; do not open a PR. The `(kylene)` marker is what this job anchors on to tell which sections it has already mirrored, so a re-run is harmless and a missed run self-heals. 7. **Surface it.** Post a short version into **#voice-summaries** with the Discord tools, linking the committed file and the Drive document. kylene posts there too, so it is the single place to see "what was decided on a call", whichever room it happened in. Name the room in the post so the two are distinguishable. ## Cost and gating, worth a glance Every kylene summary reports minutes of speech, minutes billed, and the request count. If billed minutes run far above spoken minutes, capture gating or batching has regressed — mention it in the mirrored section and in the `#voice-summaries` post, because nothing else on the estate watches that number. ## Idempotency and safety - **Anchor on mirrored sections, never wall-clock.** That is what makes a re-run harmless and a missed run self-healing. - **One section per call.** A call is the natural unit — never merge two calls into one section, and never split one. - **Never invent content.** If the call document is thin or the transcript garbled, mirror what is legible and say it was thin. - **Only `#voice-summaries` and the Drive folder, for call content.** Do not pull from other Discord channels — those two are where consent was given. `war-room` is announced-on-join and gated to Owner/Staff/dev; the community `Lounge` is never recorded by anything. - **Enrich read-only.** No `sql_query(write:true)`, no `docs_write` / `onedev_write`. The only writes are `summaries_write` and the `#voice-summaries` post. - If neither the Drive folder nor `#voice-summaries` is configured, there is nothing to do — report that the source is not configured and stop.