# Zephyr Grafana Links

> Build or refresh the two Grafana dashboard links (overall and bulk ferment) in a Zephyr bake log's grafana section. Use when asked to add, update, or fix the Grafana links in a bake log, or to pin the link end times once a bake has finished.

- Skill: `gkwa/zephyr-grafana-links` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add gkwa/zephyr-grafana-links`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gkwa/zephyr-grafana-links/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: gkwa (https://skillmd.com/u/gkwa)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/gkwa/zephyr-grafana-links

---


## Overview

Grafana links give a bake log two ready-made views of the dashboard: one spanning the whole bake, one spanning bulk fermentation.

This skill is deliberately self-contained so it can be replaced with a different link implementation without touching the [[zephyr]] skill.

Filename resolution, event_time tags, the Starter peak duration block, and parameter precedence are owned by the [[zephyr]] skill — this skill consumes those rules, it does not restate them.

Read the [[zephyr]] skill before building links, for the bake log naming convention and the parameter defaults.

Annotations are a different concern entirely and belong to the [[grafana-bake-annotation]] skill. See Section Ownership below.

## Parameters

- dashboard base URL — `https://taylormonacelli1.grafana.net/d/tatmmtv/new-dashboard`
- fixed query parameters — `orgId=1`, `timezone=browser`, `refresh=30m`
- bake log directory — resolved per the Parameters section of the [[zephyr]] skill

## Trigger

Build or refresh links only when explicitly asked.

Never regenerate links automatically just because a bake log is open.

Requests that trigger this component:

- "Update the grafana links in this log"
- "Add the grafana links to bake log 7-20"
- "The bake is done, fix the grafana links"
- "Apply zephyr to bake log 7-20" — the compound request defined in the [[zephyr]] skill

Requests that do NOT trigger it:

- "Apply Grafana annotations" — that is the [[grafana-bake-annotation]] skill
- "Route the Zephyr entries in this log" — that is the [[zephyr-routing]] skill
- Reading a bake log for any other purpose

## Framing the Window

The window brackets the bake rather than sitting flush against it.

Each link opens one hour before its own starting event and closes roughly one hour after the bake ends.

That headroom keeps the trace from being clipped at the edges of the plot, so the run-up and the tail are both visible.

## Choosing the End Time

The `to` parameter depends on whether the bake is still running.

While the bake is in progress, use `to=now` so the graph keeps extending as new readings arrive and always shows data up to the present moment.

Once the bake is finished, `to=now` is wrong: the window keeps growing after the last reading, so the bake compresses into an ever-shrinking sliver on the left while empty time fills the rest of the graph.

For a finished bake, pin `to` to a fixed timestamp roughly one hour after the bake ended.

Decide which case applies by looking for an end-of-bake entry in the `## bake log` section — the loaves coming out of the oven, or the final loaf's bake finishing.

The annotation label for this event is `bake_done`; the log may instead phrase it as "out of the oven", "finished baking", or "the last loaf".

If no end-of-bake entry exists, the bake is still running — use `to=now` for both links.

If one exists, take its event time, add one hour, convert to UTC, and use that fixed timestamp as `to` for both links.

If only the start of the final loaf's bake is recorded and not its finish, treat the bake as ending 45 minutes after that start, then add the one hour of headroom.

Both links always share the same `to` value.

## Choosing the Start Times

Two links are written, each with its own `from`.

| link | starts one hour before | source |
| ---- | ---------------------- | ------ |
| overall | the levain feeding | the `fed` field in the `## Starter peak duration` block |
| bulk ferment | the start of bulk fermentation | the event time of the entry where the flour is mixed in |

The bulk ferment start is the `mix` event — bulk fermentation begins when the dough comes together, not at `long_bulk_start`.

When a required source is missing or still `[TBD]`, write `[TBD]` in place of that URL rather than guessing a time.

A missing source affects only its own link; the other is still written.

## Time Zone

Bake log times are local wall-clock times.

Grafana `from` and `to` take UTC, so convert before writing — during Pacific Daylight Time that means subtracting 7 hours.

Format as ISO 8601 with milliseconds and a trailing `Z`, matching the dashboard's own format: `2026-07-21T02:02:47.000Z`.

The literal `now` is never converted.

## Section Ownership

The links live at the top of the `## grafana` section of the bake log, in this exact shape:

```
overall
<URL or [TBD]>

bulk ferment
<URL or [TBD]>
```

Replace the whole links block on every run, whatever it currently holds — treat it as regenerated output, not as text to patch.

Everything else in the `## grafana` section belongs to the [[grafana-bake-annotation]] skill, in particular the fenced `annotate-grafana.py` command blocks.

Never delete, reorder, or edit those blocks while updating links.

Do not assume the section already has placeholders or any particular content — it may be empty, links-only, annotations-only, or both.

## Refreshing a Finished Bake

Links written mid-bake carry `to=now` and go stale the moment the bake ends.

When the end-of-bake entry lands in a log whose links still say `to=now`, rewrite both links with the pinned end time.

This is the common case for this component: it usually runs twice per bake, once early and once after the bake finishes.

## Commit

Commit the bake log after updating the links.

