ttm-dashboard

ttm-dashboard is a skill for Claude Code, Codex from ibm-self-serve-assets/building-blocks. It costs 64 tokens per session (2,156 once invoked), scanned A, original, Apache-2.0.

A standalone HTML page for viewing time-series forecasts in a browser. It uses Apache ECharts, a charting library, to show 96 predicted steps, a risk score, time until a limit is crossed, and the model's inference path.

In plain words
What is it for?
Use it to create a forecast dashboard, plot predicted temperatures or other numeric values, and show forecast risk and threshold information. The file can be opened directly in a browser.
Why use it?
It provides a forecast view without requiring a web server. It also describes how to connect the page to a live forecast API when needed.

Skill for Claude CodeCodex

Written for no agent in particular: nothing here depends on one.

Good fit Use it to create a forecast dashboard, plot predicted temperatures or other numeric values, and show forecast risk and threshold information. The file can be opened directly in a browser.

Compare 6 skills from other repositories ↓
Install with agentmods
npx agentmods add skills/ibm-self-serve-assets/building-blocks/ttm-dashboard
Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

Any agent
npx skills add ibm-self-serve-assets/building-blocks --skill ttm-dashboard
Clone the repo
git clone --depth 1 https://github.com/ibm-self-serve-assets/building-blocks

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for ttm-dashboard

README.md
[![agentmods](https://agentmods.dev/badge/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard/github.svg)](https://agentmods.dev/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard)
Your own site
<a href="https://agentmods.dev/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard"><img src="https://agentmods.dev/badge/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for ttm-dashboard

Your own site · 80×15
<a href="https://agentmods.dev/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard"><img src="https://agentmods.dev/badge/skills/ibm-self-serve-assets/building-blocks/ttm-dashboard.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 64 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 2,156 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.00064 $0.02156
Opus 5.5 $0.00026 $0.00862
Sonnet 5.5 $0.00013 $0.00431
Haiku 4.5 $0.00006 $0.00216

Measured 7d ago against content hash 4ef534a895f3, method: parsed. Prices are Anthropic first-party input rates as of 2026-10-07, from the pricing page.

Security

Grade A, and why

ttm-dashboard scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Makes network callslowCapability

Not a fault in itself. Listed so you know the mod talks to something, and to what.

curl http://localhost:5001/api/forecast/temperature-breach/TRUCK-001 \
ibm-bob/skills/ttm-forecasting/ttm-dashboard/SKILL.md · 210 lines

How it starts

The opening of the file, as written. The whole thing — 210 lines — stays where its author put it; the contents beside it link to each section on GitHub.

TTM Dashboard — Forecast Visualisation

When to Generate dashboard.html

Generate this file when the user says any of:

  • "build a dashboard", "visualise the forecast", "show me the chart"
  • "create a forecast UI", "I want to see the predictions", "plot the temperature forecast"

dashboard.html Template

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>TTM Forecast Dashboard</title>
  <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
  <style>
    body { margin: 0; font-family: -apple-system, "Segoe UI", sans-serif;
           background: #f7f8fa; color: #1f2328; }
    header { background: #1f2328; color: #fff; padding: 16px 24px;
             display: flex; align-items: center; gap: 12px; }
    header h1 { margin: 0; font-size: 18px; font-weight: 600; }
    .badge { background: #3b82d4; color: #fff; font-size: 11px;
             padding: 2px 8px; border-radius: 4px; }
    .cards { display: flex; gap: 16px; padding: 20px 24px 0; flex-wrap: wrap; }
    .card { background: #fff; border: 1px solid #e5e7eb; border-radius: 8px;
            padding: 16px 20px; min-width: 160px; }
    .card .label { font-size: 11px; color: #57606a; text-transform: uppercase;
                   letter-spacing: .05em; }
    .card .value { font-size: 24px; font-weight: 700; margin-top: 4px; }
    .card .value.risk-high   { color: #dc2626; }
    .card .value.risk-medium { color: #d97706; }
    .card .value.risk-low    { color: #16a34a; }
    #chart { width: 100%; height: 420px; padding: 24px; box-sizing: border-box; }
    footer { text-align: center; font-size: 11px; color: #57606a;
             border-top: 1px solid #e5e7eb; padding: 12px; margin-top: 16px; }
  </style>
</head>
<body>

<header>
  <h1>TTM Forecast Dashboard</h1>
  <span class="badge" id="pathBadge">native api</span>
  <span style="margin-left:auto;font-size:13px;color:#9ca3af" id="metaLine"></span>
</header>

<div class="cards">
  <div class="card">
    <div class="label">Risk Score</div>
    <div class="value" id="riskScore">—</div>
  </div>
  <div class="card">
    <div class="label">Action</div>
    <div class="value" style="font-size:16px" id="riskAction">—</div>
  </div>
  <div class="card">
    <div class="label">Time to Breach</div>
    <div class="value" id="timeToBreach">—</div>
  </div>
  <div class="card">
    <div class="label">Predictions</div>
    <div class="value" id="predCount">—</div>
  </div>
</div>

<div id="chart"></div>

<footer>Made with IBM Bob · IBM Granite TTM · ibm/granite-ttm-512-96-r2</footer>

<script>
// ── Paste your forecast API response here ────────────────────────────────────
const FORECAST = /* INJECT_FORECAST_JSON */ null;
// ─────────────────────────────────────────────────────────────────────────────

// Or fetch from the live API — see "Wiring to Live API" section in SKILL.md
// fetch('http://localhost:5001/api/forecast/temperature-breach/TRUCK-001')
//   .then(r => r.json()).then(renderDashboard);

function renderDashboard(data) {
  if (!data) {
    document.getElementById('chart').innerHTML =
      '<p style="padding:40px;color:#57606a">Paste your forecast JSON into the FORECAST variable above.</p>';
    return;
  }

  const preds  = data.predictions || [];
  const risk   = data.risk_assessment || {};
  const meta   = data.metadata || {};
  const path   = data.inference_path || 'unknown';

  // Cards
  const score = risk.risk_score ?? '—';
  const scoreEl = document.getElementById('riskScore');
  scoreEl.textContent = typeof score === 'number' ? score + '%' : score;
  scoreEl.className = 'value ' +
    (score > 70 ? 'risk-high' : score > 40 ? 'risk-medium' : 'risk-low');

  document.getElementById('riskAction').textContent   = risk.action || '—';
  document.getElementById('timeToBreach').textContent =
    risk.time_to_breach != null ? risk.time_to_breach + ' min' : '—';
  document.getElementById('predCount').textContent    = preds.length;
  document.getElementById('pathBadge').textContent    = path.replace('_', ' ');
  document.getElementById('metaLine').textContent     =
    `${data.frequency || ''} · ${data.context_length || 512} ctx · ` +
    `${meta.inference_time_ms != null ? meta.inference_time_ms + ' ms' : ''}`;

  // Chart
  const timestamps = preds.map(p => p.timestamp.replace('T', ' ').slice(0, 16));
  const values     = preds.map(p => parseFloat(p.value.toFixed(3)));
  const threshold  = data.threshold ?? null;

  const series = [{
    name: 'Forecast', type: 'line', data: values,
    smooth: true, symbol: 'none',
    lineStyle: { color: '#3b82d4', width: 2 },
    areaStyle: { color: 'rgba(59,130,212,0.08)' },
  }];

  if (threshold !== null) {
    series.push({
      name: 'Threshold', type: 'line',
      data: new Array(values.length).fill(threshold),
      symbol: 'none',
      lineStyle: { color: '#dc2626', type: 'dashed', width: 1.5 },
    });
  }

  const chart = echarts.init(document.getElementById('chart'));
  chart.setOption({
    backgroundColor: '#ffffff',
    tooltip: { trigger: 'axis', formatter: params =>
      params.map(p => `${p.seriesName}: <b>${p.value}</b>`).join('<br>') },
    legend: { top: 8, right: 16, textStyle: { fontSize: 12 } },
    grid: { left: 56, right: 20, top: 40, bottom: 60 },
    xAxis: {
      type: 'category', data: timestamps, boundaryGap: false,
      axisLabel: { rotate: 30, fontSize: 11, color: '#57606a' },
      axisLine: { lineStyle: { color: '#e5e7eb' } },
    },
    yAxis: {
      type: 'value', name: 'Value',
      nameTextStyle: { color: '#57606a', fontSize: 11 },
      axisLabel: { color: '#57606a', fontSize: 11 },
      splitLine: { lineStyle: { color: '#f3f4f6' } },
    },
    series,
  });
  window.addEventListener('resize', () => chart.resize());
}

renderDashboard(FORECAST);
</script>
</body>
</html>

Read the full file on GitHub · 210 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 7d ago First seen · 210 lines · 64 tokens per session scan A 4ef534a895f3

Subscribe to this mod's changes

ttm-dashboard is a skill published in the GitHub repository ibm-self-serve-assets/building-blocks (28 stars, last pushed yesterday), licensed Apache-2.0. It adds 64 tokens to every session and 2,156 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-15.

Related

Other skills, from other repositories

local-ai-agents

Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…

microsoft/ai-agents-for-beginners · 200 tokens

systematic-debugging

Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.

obra/superpowers · 21 tokens

next-cache-components-adoption

Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…

vercel/next.js · 95 tokens

chat-pet-sprite-creation

Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.

microsoft/vscode · 53 tokens

cpu-profile-analysis

Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…

microsoft/vscode · 71 tokens

insight-error-page

Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…

vercel/next.js · 83 tokens