Re-read a generated status board's own inputs immediately before the change that lands it, and quote the re-read in that change. Thin process interface — the overlay names the generator, its inputs and the landing surface.
Resources
1Install
npx skillscat add omninode-ai/omniclaude/plugins-onex-skills-board-readback Install via the SkillsCat registry.
Board readback
Catalogue row: board_readback · Replacement: none yet
This skill is a temporary prose interface. It owns no logic and it is
deleted when the mechanical replacement below exists.
What it wraps
The readback path of the same status-board generator the refresh row runs. The
generator, its inputs, and the change that lands the readback are overlay
content.
The distinction from the refresh row is the direction of proof. The refresh row
asks did the board move. This row asks does the board still agree with the
inputs it was generated from — and asks it at the last possible moment, because
a board generated an hour ago and landed now is a board that has had an hour to
go stale.
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" board_readback| Order | Location | Kind |
|---|---|---|
| 1 | BOARD_READBACK_OVERLAY_PATH |
explicit pointer — a miss is a hard stop, never a fall-through |
| 2 | each root in ONEX_SKILL_OVERLAY_ROOTS, joined with board_readback/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.
| Field | What it holds |
|---|---|
input_locators |
how to read each input the generator consumes |
board_locator |
how to read the generated board back |
landing_surface |
where the readback is quoted so a reviewer sees it |
working_directory |
where the readback is run from |
Preflight, by intent
As every process row: run the preflight first, at the given intent. A blocker
stops the readback.
Verification contract
The generator's own inputs were re-read immediately before the merge, and the
re-read output is quoted in the change that lands it.
Two things make this contract fail, and both look like success from the outside:
- a readback of a cached board, which proves the cache and nothing else;
- a re-read done early in the run and quoted at the end, with writes in between.
- an empty read: an input command that exits zero and prints nothing, quoted
as an empty block and compared as if it agreed. A read that exits non-zero or
produces zero bytes isunread, and an unread input fails the readback.
So the re-read is the last action before landing, and its raw output — not a
summary of it — goes into the landing surface. A reviewer must be able to
recompute the verdict from what is quoted.
Mechanical replacement
none yet. The replacement is a gate on the landing surface that refuses the
change unless it carries a re-read newer than every input it names, anchored on
whole lines rather than a substring so that prose describing a readback cannot
satisfy it. Until that gate exists this row depends on the person running it,
which is the property the catalogue exists to retire.
What this skill does NOT do
- Regenerate the board (that is the refresh row)
- Accept a cached read, or a summary of a read, as the readback
- Name a repository, a path or a host in this file