Use when you need cross-source context about this project's systems (recent deploys, logs, metrics, entities, correlated timelines), OR when organizing Tares itself — creating sources, labels, and views. Tares is the data plane; read it via the tares MCP tools for one correlated timeline per entity, and author its catalog with the create/derive tools following the rules below.
Scanned 9/3/2026
Install to Claude Code
npx -y skills add glassflow/tares --skill tares --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Tares?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/glassflow-tares)More formats (shields.io, HTML) on the badges page.
---
name: tares
description: Use when you need cross-source context about this project's systems (recent deploys, logs, metrics, entities, correlated timelines), OR when organizing Tares itself — creating sources, labels, and views. Tares is the data plane; read it via the tares MCP tools for one correlated timeline per entity, and author its catalog with the create/derive tools following the rules below.
---
# Tares
Tares is a data plane for agents: it ingests many sources (logs, metrics, deploys, database rows,
agent sessions) and serves **one correlated, time-ordered timeline per entity** (a service, customer,
session, …). The **tares** MCP server is connected (this plugin registers it).
## Reading
When a question needs real context about running systems — "what changed before this error", "is
this service healthy", "what has this customer done recently" — read Tares instead of guessing:
- Start by discovering what's there: `list_sources`, `catalog_list`, `entities`.
- Read a timeline with `query` (a view + an entity key) or `read` (a `{label: value}` selector).
- Treat the timeline as ground truth for *what happened and when*; cite specific events.
This plugin also streams the current Claude Code session into Tares (the `claude_code` source) when
session streaming is enabled, so prior sessions are queryable as a source.
## Challenger sessions
When the user asks to make this a challenger session (any wording: "challenger session",
"let Codex challenge this", "/tares:challenger"), call the `set_session_flow` tool with
`flow="challenger"` and say so in one sentence. Do not run Codex yourself: the plugin's hooks
challenge the plan when you leave plan mode and every commit you make, and hand you the findings.
`set_session_flow` with an empty `flow` turns it off.
## Authoring: sources, labels, and views
Tares's data model has three layers — get them right and correlation just works; guess and it
silently doesn't:
- **Fields** — the *candidate menu*. A source's raw payload is stored losslessly; `source_fields`
(and `discover_source` for a new source) profiles the fields it actually contains, with coverage
and top values. Fields are not queryable on their own.
- **Labels** — the *declared axes* you promote from fields (or a const, or a regex over a field).
Labels are what you filter, group, key, and correlate by. One label is the **primary key**.
- **Views** — correlate one or more sources into a per-entity timeline, keyed by a **label** the
sources share.
### Rule 1 — Labels must come from real fields (never invent one)
Before choosing a source's labels, call **`source_fields`** (existing source) or use
**`discover_source`**'s `proposed_config` (new source) to see the fields that actually exist. A
label reads from one of three things, all grounded in real data:
- `field`: a profiled field name — must match a field `source_fields` shows, exactly.
- `const`: a fixed value stamped on every event (for a source with no natural field for an axis).
- a **regex** over a field — set `pattern` + `replace` (and/or `map`) on the label to normalize
messy values. Regex/alias normalization is a first-class feature: use it instead of guessing at a
clean field. `type: "number"` makes a label aggregatable (for triggers); the primary key must be a
string.
Never name a `field` that isn't in the profile — it extracts nothing. Set labels by creating the
source (`create_source`) or updating its config with the full `labels` list.
### Rule 2 — Views key/filter on LABELS only, never raw fields
A view's `key_field` (and any filters) must be a **label the chosen sources expose** — not an
arbitrary payload field. If you want to correlate on something that isn't a label yet, **promote it
to a label first** (Rule 1), then `derive` the view keyed by that label. Confirm a source's current
labels with `catalog_describe("source:<name>")` before deriving.
### Rule 3 — To match a label across sources, add a NEW label — don't rename
To join source B to source A on a shared axis (say `service`), source B needs a label **named
`service`** too. Declare a **new** label on B (reading B's matching field) — do **not** try to
rename B's field or existing label. There is no rename; a source's label set is declared whole, so
add the shared-named label to B and keep its others. The values must agree **literally** across
sources for correlation to work — if B's raw values differ (e.g. `checkout-svc` vs `checkout`),
normalize them with `pattern`/`replace`/`map` on B's label so they match A's.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!