Refresh a generated status board by running the generator its overlay names, then prove the board's published timestamp advanced. Thin process interface — the overlay supplies the generator, the board and the publish surface; this skill supplies neither.
Resources
1Install
npx skillscat add omninode-ai/omniclaude/plugins-onex-skills-plans-board-refresh Install via the SkillsCat registry.
Plans board refresh
Catalogue row: plans_board_refresh · Replacement: none yet
This skill is a temporary prose interface over a process that already exists.
It is not the process and it owns no logic. Its whole job is that nobody has to
remember the generator's name and its arguments.
What it wraps
The status-board generator named by the overlay. The generator, the board it
publishes, the repository it lives in and the command that runs it are overlay
content and appear nowhere in this file. A committed default here would be an
organization's process shipped in a public plugin.
Overlay
Resolve the overlay with the shared resolver, the same search order every
overlay-configured skill uses:
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/resolve_skill_overlay.py" plans_board_refresh| Order | Location | Kind |
|---|---|---|
| 1 | PLANS_BOARD_REFRESH_OVERLAY_PATH |
explicit pointer — a miss is a hard stop, never a fall-through |
| 2 | each root in ONEX_SKILL_OVERLAY_ROOTS, joined with plans_board_refresh/overlay.yaml |
discovered |
It prints the resolved path, or exits non-zero naming every location it
tried. A non-zero exit is a hard stop, not a fall back to a default —
there is no default. Report its standard error and stop.
Do not guess a generator: a board refresh that ran against a guessed generator
is worse than one that did not run.
The overlay supplies:
| Field | What it holds |
|---|---|
generator_command |
the command that regenerates and publishes the board |
board_locator |
how to read the published board's timestamp back |
working_directory |
where the generator is run from |
cadence |
how often the process is expected to fire |
Preflight, by intent
Run the session preflight first and let --intent decide what it prints:quiet prints nothing but a blocker, normal prints one line per check with
its fix command, tick writes the same verdict to the run's own record and
nothing to the transcript. A blocked preflight stops the refresh; it does not
downgrade it.
Verification contract
The board's published timestamp advanced past the time this run started.
Read the timestamp before the run and again after it, through board_locator,
and report both. A generator that exits zero having published nothing is the
failure this row exists for, so an unchanged timestamp is a failure, never a
no-op. Report the two timestamps even when they differ — the reader is checking
the delta, not taking a verdict.
A timestamp read that exits non-zero or produces zero bytes is a failed read,
not a timestamp. Two empty reads compare equal, and two failed reads compared
as strings can look like anything, so either one fails the run.
Mechanical replacement
none yet. This row is prose because the refresh is invoked from memory
today. The replacement is a scheduled trigger that fires the generator on its
cadence and writes a firing receipt before it does any work, so that "fired and
published nothing" is distinguishable from "nothing fired". When that exists,
this skill is deleted rather than kept alongside it.
What this skill does NOT do
- Carry a generator command, a repository name, a path or a host in this file
- Edit the board, or publish anything the generator did not produce
- Report success from the generator's own exit code alone