No work step here. This is probably a skill that reads or coordinates, not one that produces something.
.md file to compare - side-by-side diff against now
now
What it does for you
This skill does one job for you, the same careful way every time.
What it produces
A recent result, so you can see the kind of work it returns.
loading…
How to get it
These run inside the Snappy workspace. Want this working in your business? I set skills like this up with you, in one focused week.
For developers how this skill is built, graded, and how it runs
at a glance- the short version
what's inside - the parts that make up a skill 2/4 present
A skill is just a few plain-text files. Only the main one is required. The rest are optional, added as the work needs them. This is what the skill is made of; how it runs is just below.
state/skills/now/SKILL.md
present
state/lib/now.ts
not present
state/bin/now/
not present
state/skills/now/AGENTS.md
present
how it runs - the shared frame every skill uses 3/5 present
Every skill runs the same way. One part does the work, a separate part checks it, and a short loader hands the AI exactly what it needs for the job. Anything this skill doesn't use shows a one-line note saying why, on purpose, not by accident.
state/log/evals.ndjson what it has learned - fixes written back in over time sample
When a run hits something this skill didn't handle, the fix gets written back into the skill so it doesn't happen again. FIXED means it was corrected on the spot. LOGGED means it's queued for a bigger rewrite. Either way, the skill gets a little better and never makes the same mistake twice.
- Loading feedback rows…
SKILL.md- the skill, written out in plain English
now
Composite top-level dashboard. Not a skill that runs - a UI surface that queries multiple endpoints to render the current system state in real time.
Lives at state/skills/now/resources/ui.openui. Served via the per-skill serve route when the user asks broad intent questions like "show me what's happening right now", "give me a system overview", "show me the status".
The dashboard IS the verb. There is nothing to invoke server-side; the chat renders the OpenUI Lang composition fetched from the skill's resource file.
Dashboard shape
The Now dashboard shows:
- Agent activity - running agents, their status, how long they have been running
- Recent skill runs - the last 10 skill evaluations with scores and timestamps
- System KPIs - total agents, active dispatches, recent activity count
- Skills summary - total skills available, recent skill count
Each panel is a Card with a Table or Stack of key metrics. The dashboard queries multiple endpoints:
/agents- list of agents and their current status/recent- recent skill evaluations (evals.ndjson tail)/full-state- high-level summary of dispatch activity
All data is live; the dashboard refreshes by re-rendering when the user asks again.
No prose steps
The dashboard is purely a UI resource. It has no executable steps - the Steps section is deliberately omitted. The render happens client-side when the snappy-chat app mounts the shape.
AGENTS.md- what the AI loads when this skill comes up
now - loader
Per-turn rules for the live status dashboard. Full skill: state/skills/now/SKILL.md. Prose-only UI resource; no executable steps.
Critical Rules
- No backend execution. "now" is a pure UI resource (OpenUI Lang). It does not run anything server-side.
- Resource served via per-skill route. Broad-intent regex matches "what is happening now" / "system overview" and routes to
/bundle/now/resources/ui.openui. - Live data binding: OpenUI Query() at render time. Resource file uses
Query()calls to fetch from/agents,/recent,/full-stateinline. Data fetched at render time, not pre-fetched. - All fields must render, even if empty. Agent list, recent evals, KPIs must exist even with 0 agents or stale data. Fallback to sensible defaults (empty arrays, 0 counts).
- Three data endpoints:
/agents(agent list + status),/recent(tail of evals.ndjson),/full-state(system-wide counts + summaries).
Commands
| operation | command | |
|---|---|---|
| view dashboard | send intent "show me what is happening right now" in snappy-chat | |
| check resource | `curl -s http://127.0.0.1:3147/bundle/now/resources/ui.openui \ | head -50` |
| check endpoint data | `curl -s http://127.0.0.1:3147/agents \ | jq .agents[0:2]` |
| reference | state/skills/now/SKILL.md | |
| resource file | state/skills/now/resources/ui.openui |
Dashboard Shape
Renders four panels:
- Agent activity - running agents, status, elapsed time
- Recent skill runs - last 10 evaluations with scores, timestamps
- System KPIs - total agents, active dispatches, recent count
- Skills summary - total skills available, recent skill count
Query Pattern
Resource uses OpenUI Query() for live binding:
agents = Query("get_agents", {}, {agents: []}, 10)
recent = Query("get_recent", {}, {evals: []}, 10)
kpis = Query("get_kpis", {}, {total_agents: 0, running_count: 0, recent_count: 0}, 30)
Custom backend routes (get_agents, get_recent, get_kpis) return JSON matching shapes above. Refresh by re-render.
Self-Test
- [ ] Understand "now" is pure UI, no backend execution?
- [ ] Know resource is served via
/bundle/now/resources/ui.openui? - [ ] Recognize Query() fetches live data at render time?
- [ ] Know endpoints:
/agents,/recent,/full-state? - [ ] Understand broad-intent regex routing for "what is happening now"?
<!-- kernel-ok: historical attribution for the PID-loader pattern. -->
Self-correcting loader (PID feedback)
This is the rule that makes loaders learn. Ported from snappy-kernel, where it demonstrably worked: the snappy-dom-cartographer skill mapped Skool admin UI once, every later ship-agent inherited the full map for free.
Before you finish, do two things:
1. Fix gaps (P - proportional). MANDATORY. If this loader didn't cover your case - if you had to read another file, run an undocumented command, work around a wrong selector, or discover a quirk - you MUST attempt an Edit to this AGENTS.md before you log.
- Default action: edit this file. Surgical. Add the missing line, table
row, or code example where it belongs. No restructuring.
- Only
LOGGEDis allowed when: the fix needs >10 lines, spans multiple
files, or requires a structural rewrite.
- "I didn't have time" / "it's minor" / "the next agent will figure it out"
are NOT valid reasons.
- The goal: the next agent never has to leave the loader.
2. Log the result.
echo "[$(date -u +%FT%TZ)] now: <what was missing or fixed> [FIXED|LOGGED] action_kind=<kind>" >> state/log/loader-feedback.log
Do not skip this. Every agent run must leave the system better than it found it. The loader is the setpoint; you are the sensor; the gap is the error signal; closing the gap is the correction.
OpenUI Resource
- Skill-owned OpenUI Lang resource:
state/skills/now/resources/ui.openui. Read it before rendering or editing this skill's generated component surface. - Treat this resource as a first-class artifact of the skill, not a generic chat response. Improve it when the skill's user-facing output needs to become richer.
- System resources compose OpenUI primitives and inherit SnappyChat tokens. Use
ui_contract: brandedin SKILL.md only for deliberate platform or client visuals.
api.ts- the code it can call
⚠ no api.ts - this skill has no typed action surface
scripts- helper scripts it can run
prose-only skill - no sidecar under state/bin/ yet. Steps, if any, are described in SKILL.md.
how we check it- the checks, plus the last 3 runs
| timestamp | verb | score | primary_issue | artifact |
|---|---|---|---|---|
| 2026-05-01 09:19Z | - | 1.00 | - | - |
| 2026-05-01 09:19Z | - | 1.00 | - | - |
| 2026-05-01 09:19Z | - | 1.00 | - | - |