OmniNode-ai

Board readback

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.

OmniNode-ai 4 3 Updated 4w ago

Resources

1
GitHub

Install

npx skillscat add omninode-ai/omniclaude/plugins-onex-skills-board-readback

Install via the SkillsCat registry.

SKILL.md

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 is unread, 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

Categories