fix(skills): live-dashboard credits the human author and drops the product-name intro

Authoring standard 4 requires the human first in `author`; the skill was
drafted with Hermes so the tool was credited instead. The intro cited a
third-party product, which is allowed only in LICENSE/credit lines. Also
adds metadata.hermes.category and lowercases tags to match sibling
skills; docs page regenerated for this skill only.

Tests: the two prose tests asserted sentence literals (change-detectors);
they now assert structure — three Procedure phases, a "Done when" per step,
standard headings, and the tool wiring (cronjob/desktop_preview/[SILENT]).
This commit is contained in:
teknium1
2026-09-14 20:57:26 -07:00
committed by Teknium
parent 788601358d
commit b00ebf6210
3 changed files with 23 additions and 43 deletions

View File

@@ -2,12 +2,13 @@
name: live-dashboard
description: "Build self-updating dashboards from live sources."
version: 0.2.0
author: Hermes Agent
author: Teknium (teknium1), Hermes Agent
license: MIT
platforms: [linux, macos, windows]
metadata:
hermes:
tags: [Dashboards, Monitoring, Status, Automation, Reporting]
tags: [dashboards, monitoring, status, automation, reporting]
category: productivity
related_skills: [product-price-monitor, competitor-news-monitor, email-inbox-triage, google-workspace]
blueprint:
schedule: "0 8 * * *"
@@ -16,7 +17,7 @@ metadata:
# Live Dashboard
Turn one sentence — "make a dashboard for our visa applications, update it daily from the email threads and the case-status site" — into a persistent, self-refreshing status page. The user describes what they want to see; you define the data contract, build a self-contained HTML dashboard, verify one live refresh, then schedule the recurring tick. Inspired by Energy's (getenergy.com) natural-language live dashboards, adapted to Hermes's cron + connector architecture.
Turn one sentence — "make a dashboard for our visa applications, update it daily from the email threads and the case-status site" — into a persistent, self-refreshing status page. The user describes what they want to see; you define the data contract, build a self-contained HTML dashboard, verify one live refresh, then schedule the recurring tick.
Setup runs once in the foreground; the recurring refresh runs as a `cronjob` tick. Installing this skill offers a daily all-dashboards sweep via `/suggestions` (the frontmatter blueprint).

View File

@@ -1,9 +1,4 @@
"""Tests for the live-dashboard optional skill.
Inspired by Energy's (getenergy.com) natural-language live dashboards —
describe what you want to see in one sentence, get a persistent
self-refreshing status page fed by email/web/file sources.
"""
"""Tests for the live-dashboard optional skill."""
import re
from pathlib import Path
@@ -47,44 +42,28 @@ def test_related_skills_resolve_in_repo():
assert hits, f"related_skills entry does not resolve in-repo: {name}"
def test_setup_tick_split():
"""The skill must separate one-time setup from the recurring cron tick."""
_, body = _frontmatter_and_body()
assert "Setup (foreground, once)" in body
assert "Tick (each scheduled run)" in body
assert "cronjob(action=" in body, "must wire scheduling through the cronjob tool"
def test_state_discipline_present():
"""State-file source of truth + stale-read handling must be explicit."""
_, body = _frontmatter_and_body()
assert "dashboard.json" in body
assert "source of truth" in body
assert "last-known-good" in body or "last good value" in body
assert "never hand-edit HTML state" in body
assert "[SILENT]" in body, "no-change ticks must stay silent"
def test_source_verification_before_scheduling():
_, body = _frontmatter_and_body()
assert "Only after step 3 succeeded" in body
assert "one bounded foreground read" in body
def test_steps_have_completion_criteria():
def test_procedure_is_structured_setup_tick_show():
"""The skill splits into setup / scheduled tick / render phases, each phase is a
numbered-step procedure, and every step states a completion criterion."""
_, body = _frontmatter_and_body()
phases = re.findall(r"^## Procedure — (.+)$", body, re.MULTILINE)
assert len(phases) == 3, phases
steps = re.findall(r"^### \d+\..*?(?=^### \d+\.|^## )", body, re.MULTILINE | re.DOTALL)
assert len(steps) >= 7
for step in steps:
assert "Done when" in step, f"step missing completion criterion: {step[:60]!r}"
for heading in ("## When to Use", "## Prerequisites", "## Pitfalls", "## Verification"):
assert heading in body, heading
def test_desktop_preview_with_path_fallback():
"""Desktop sessions render in the preview pane; everything else gets the file path.
The Hermes home directory is never hardcoded in prose the agent executes."""
def test_tools_wired_and_home_not_hardcoded():
"""Scheduling goes through `cronjob`, desktop rendering through `desktop_preview`,
no-change ticks stay silent, and the Hermes home path is resolved, never assumed."""
_, body = _frontmatter_and_body()
assert 'desktop_preview(action="open"' in body
assert "report the absolute path" in body
assert re.search(r"cronjob\(action=\"create\"", body)
assert re.search(r"desktop_preview\(action=\"open\"", body)
assert "[SILENT]" in body
assert "dashboard.json" in body
assert "~/.hermes" not in body
@@ -98,4 +77,4 @@ def test_frontmatter_blueprint_is_a_valid_installed_blueprint():
job = blueprint_to_job_spec(spec)
assert job["skills"] == ["live-dashboard"]
assert len(job["schedule"].split()) == 5, f"invalid cron expr: {job['schedule']}"
assert "[SILENT]" in job["prompt"] and "~/.hermes" not in job["prompt"]
assert "[SILENT]" in job["prompt"] and "~/.hermes" not in job["prompt"]

View File

@@ -17,10 +17,10 @@ Build self-updating dashboards from live sources.
| Source | Optional — install with `hermes skills install official/productivity/live-dashboard` |
| Path | `optional-skills/productivity/live-dashboard` |
| Version | `0.2.0` |
| Author | Hermes Agent |
| Author | Teknium (teknium1), Hermes Agent |
| License | MIT |
| Platforms | linux, macos, windows |
| Tags | `Dashboards`, `Monitoring`, `Status`, `Automation`, `Reporting` |
| Tags | `dashboards`, `monitoring`, `status`, `automation`, `reporting` |
| Related skills | [`product-price-monitor`](/docs/user-guide/skills/bundled/productivity/productivity-product-price-monitor), [`competitor-news-monitor`](/docs/user-guide/skills/bundled/research/research-competitor-news-monitor), [`email-inbox-triage`](/docs/user-guide/skills/bundled/email/email-email-inbox-triage), [`google-workspace`](/docs/user-guide/skills/bundled/productivity/productivity-google-workspace) |
## Reference: full SKILL.md
@@ -31,7 +31,7 @@ The following is the complete skill definition that Hermes loads when this skill
# Live Dashboard
Turn one sentence — "make a dashboard for our visa applications, update it daily from the email threads and the case-status site" — into a persistent, self-refreshing status page. The user describes what they want to see; you define the data contract, build a self-contained HTML dashboard, verify one live refresh, then schedule the recurring tick. Inspired by Energy's (getenergy.com) natural-language live dashboards, adapted to Hermes's cron + connector architecture.
Turn one sentence — "make a dashboard for our visa applications, update it daily from the email threads and the case-status site" — into a persistent, self-refreshing status page. The user describes what they want to see; you define the data contract, build a self-contained HTML dashboard, verify one live refresh, then schedule the recurring tick.
Setup runs once in the foreground; the recurring refresh runs as a `cronjob` tick. Installing this skill offers a daily all-dashboards sweep via `/suggestions` (the frontmatter blueprint).