Agent skill

Functional Check

by jggonz in jggonz/os8088

Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every…

MITAuto-check passedDevelopment

Install Functional Check

skills CLI
$ npx skills add jggonz/os8088 --skill functional-check -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install jggonz/os8088 functional-check --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/jggonz/os8088.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/functional-check .claude/skills/functional-check && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
functional-check
GitHub stars
104
Token cost
~2.1k tokens
SKILL.md length
1,121 words
Files
2
Skills in repo
7
Repo updated
First seen
Licence
MIT

At a glance

Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every…

  • Works in 6 steps: scope: what are the claims? → the change's own gates first → boot what was built → …
  • The user asks to functionally check
  • SKILL.md covers Step 0 - scope: what are the…, Step 1 - the change's own…, Step 2 - boot what was built and Step 3 - drive it, plus 2 more sections
  • Calls make, python3 and git

What it does

Functional Check is an agent skill from jggonz/os8088. Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every user-visible claim, and report per-claim pass/fail. Use when the user asks to functionally check, exercise, or "click through" a branch, PR, or the working tree - or to merge PRs as they pass such a check. Runs the change's own registered gates first; the driving pass is what the gates cannot see.

Its SKILL.md is about 2.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `LESSONS.md`).

It sits in Development. The licence is MIT.

When your agent uses it

  • The user asks to functionally check
  • Click through a branch
  • The working tree -
  • Merge PRs as they pass such a check

Example prompts

  • “click through”
  • “/functional-check”

Requirements

  • Python 3

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. scope: what are the claims?
  2. the change's own gates first
  3. boot what was built
  4. drive it
  5. report
  6. merging on pass (only when asked)

What it can do on your machine

Read from SKILL.md and the folder at commit 95f7e97. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • make
    • python3
    • git
    • gh

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Functional Check loads about 2.1k tokens when it runs. Until then it costs about 127 tokens; SKILL.md has 1,121 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~127
When it runs · the whole SKILL.md, loaded when a task matches
~2.1k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from jggonz/os8088 at commit 95f7e97, republished under its MIT licence (© jggonz). 1,121 words, ~2,143 tokens.

Download SKILL.mdSave it as .claude/skills/functional-check/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
functional-check
description
Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every user-visible claim, and report per-claim pass/fail. Use when the user asks to functionally check, exercise, or "click through" a branch, PR, or the working tree - or to merge PRs as they pass such a check. Runs the change's own registered gates first; the driving pass is what the gates cannot see.

Functional check

A change's tests prove what the tests ask. This skill proves the thing the user was promised: the button fires, the cell recalculates, the pane draws the picture. It boots what make built, drives the real UI over QMP, and keeps a screenshot for every claim - so the merge decision rests on what was seen, not on what a description said.

It exists because the Weave waves 3-7 merge train (PRs #124-#128) was checked exactly this way, and the checking found what no gate had: a modal alert explaining a "dead" ^R, a key poll that only reads during play, and a half-broken machine config that killed every MartyPC row at launch. Every trap below fired on a real screen during that work. Read LESSONS.md before driving anything - it is the trap list, and each entry names the wrong conclusion the trap produces.

Step 0 - scope: what are the claims?

Establish what work is under check and what it CLAIMS, before booting anything:

  • A PR number: gh pr view <N> - the body's claims are the checklist. Check out the head branch. If main has moved since the branch forked, merge origin/main into it FIRST and re-run its gates - a functional check of a tree that will not exist after merge proves nothing (docs/UPSTREAM.md; the wave merges each collided with main's own drift).
  • A branch or the working tree: the checklist is the diff - git diff --stat main... plus commit messages. Turn it into concrete, user-visible sentences ("clicking X does Y") before starting.

Write the checklist down. The report at the end is this list with evidence attached, and anything that cannot be exercised is REPORTED as not exercised, never silently skipped.

Step 1 - the change's own gates first

Cheapest evidence first, and it catches a broken tree before a long interactive session does:

make                       # fast tier rides it; checkdocs too
make test-full             # the pre-merge gate, inside its 600s budget
python3 tools/os88test.py soak -k '<subject>*'   # the rows the change owns

make after every commit and before any emulator row - the About box's build number is the commit count, so a commit invalidates build/kernel.bin for the symbol reader and every row dies saying the map describes a different kernel (CLAUDE.md, Testing traps).

A soak row that fails on a loaded box with a navigation-shaped error (drive B's window never opened; two presses 9 ticks apart) is retried STANDALONE before it is believed - the flake is documented, and one retry distinguishes it from a defect. Never loosen a shared retry to make a row greener.

Step 2 - boot what was built

pkill -f "[q]emu-system"        # a stale QEMU answers on the old kernel;
                                # the pattern must not appear in the killing
                                # command itself (CLAUDE.md, Testing)
make <the-disk-target>          # weavedisk, zdisk, worddisk, ... whatever
                                # the change ships on
make test TESTAPPS=build/<x>.img &

Then WAIT for the socket - make test may rebuild for a long time first, and a screenshot taken too early photographs the previous world or nothing:

for i in $(seq 1 40); do
  [ -S build/qmp.sock ] && python3 tools/qmp.py build/qmp.sock 'info status' \
      >/dev/null 2>&1 && break
  sleep 2
done
sleep 5     # let the desktop finish its first paint

Step 3 - drive it

The three drivers, and the idioms that actually work (each learned the hard way - LESSONS.md has the failure that taught it):

  • Move / click: python3 tools/mouse.py build/qmp.sock to|click X Y. --screen WxH must match the adapter (§39).

  • Double-click: two mouse.py click invocations are two processes and ALWAYS miss the window. Position first, then both presses down ONE QMP connection:

    python3 tools/mouse.py build/qmp.sock to X Y
    python3 tools/qmp.py build/qmp.sock 'mouse_button 1' 'sleep 0.08' \
        'mouse_button 0' 'sleep 0.12' 'mouse_button 1' 'sleep 0.08' \
        'mouse_button 0'
  • Menus: down on the title, to the item, up on it. Screenshot the open menu once per session to learn the real item coordinates before selecting blind.

  • Keys: python3 tools/qmp.py build/qmp.sock 'sendkey <key>'. A key-STATE consumer (OSAPI_KEY_DOWN pollers - games) needs a held key: sendkey z 800 holds for 800ms; the default tap can fall between polls. Rapid sequences lose keystrokes - pace them, and verify the on-screen text rather than trusting the send.

  • Screenshot: python3 tools/shot.py build/qmp.sock out.png [--crop X,Y,W,H] [--zoom N]. Crop and zoom before concluding a click was lost - a small change is invisible in a full-screen dump. Move the mouse away first; the cursor sits exactly where you were working.

  • Verify the target before acting on it: single-click, screenshot the selection, THEN double-click in place. Rows move when file counts change; windows move when reopened.

  • Read the whole screen when anything is odd. A menu bar that "lost its menus", input that "stopped working" - take a FULL screenshot before theorizing: a modal alert owns the bar and swallows every event, and it may have been raised by the previous action's handler.

  • Prove animation with arithmetic, not eyeballs: two shots N seconds apart, diff the pixels (PIL), report the changed-pixel count and bbox. Identical frames are CORRECT for an idle canvas - know what the contract says before calling stillness a bug.

Exercise every checklist claim, happy path AND one refusal per surface the change added (the refusal sentence is part of the contract - §10-style sentences are quoted in the report verbatim). When an oracle exists (weavesim --render, dfrotz, a golden number in the PR body), check the glass against it, not against the change's own opinion of itself.

Show full SKILL.md (350 more words)Show less

Step 4 - report

A table: claim | what was driven | what the glass showed | verdict, with the screenshot paths. Then, plainly: anything NOT exercised and why, any flake seen and how it was disambiguated, and any defect found - a defect in the change blocks the merge; a defect found in code the change does not own is reported separately (and fixed in its own commit/PR if small, the wave precedent).

Step 5 - merging on pass (only when asked)

Merging is not part of the check; do it only when the user asked for check-then-merge. The house style is squash (gh pr merge N --squash; --admin only when the user said to use admin privileges). For a STACK, per PR, in order:

  1. Merge the bottom PR. GitHub's mergeability answer is computed ASYNC - a refusal seconds after a push may be stale; re-check, sleep, retry once before believing it.
  2. Retarget the next PR's base to main BEFORE deleting the merged branch - gh pr edit <next> --base main, then delete. Deleting a branch that is still the base of an open PR CLOSES that PR, and a closed PR whose base branch is gone cannot be reopened until the branch is pushed back.
  3. Never delete an unmerged PR's head branch - that closes it too.
  4. Merge origin/main into the next branch, resolve (squash merges mean the histories share no commits - identical content auto-resolves, and a conflict means one side is genuinely newer; classify per file against the previous branch's tip before touching anything), re-run step 1's gates, re-run the functional pass for THAT change, merge, repeat.
  5. After the last merge: git diff main <last-branch> must be EMPTY - the proof that what merged is what was gated - then make && make test-full on main, and leave the checkout on main.

Throughout: never git add -A/-u/. (name the paths), never git reset --hard or git stash pop in a tree with anyone else's dirty files or stash stack (capture git diff of any pre-existing dirty file before starting, so it can be restored byte-for-byte), and leave the user's uncommitted files exactly as found.

© jggonz, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .claude/skills/functional-check of jggonz/os8088.

  • SKILL.md
  • LESSONS.md

Open the folder on GitHubat commit 95f7e97

Compare with similar skills

Functional Check next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Functional Check compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Functional Check this skilljggonz/os8088104—~2.1kAutomated safety check: PassMIT
Vercel Composition Patternssupabase/supabase111k58 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers297k5 repos~1.9kAutomated safety check: PassMIT
Typescript Advanced Typesrolling-scopes/rsschool-app10k25 repos~4.2kAutomated safety check: PassMPL-2.0
PR Babysitteropeninterpreter/openinterpreter69k3 repos~4.2kAutomated safety check: PassApache-2.0
Code Review ChecklistshareAI-lab/learn-claude-code78k5 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 58 repos~726 tokens
    DevelopmentAuto-check passed
  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    297k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Typescript Advanced Types

    rolling-scopes/rsschool-app

    Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed
  • PR Babysitter

    openinterpreter/openinterpreter

    Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.

    69k GitHub starsUsed in 3 repos~4.2k tokens
    DevelopmentAuto-check passed
  • Code Review Checklist

    shareAI-lab/learn-claude-code

    Reviews code against a five-part checklist covering security, correctness, performance, maintainability and testing, and reports findings in a fixed format.

    78k GitHub starsUsed in 5 repos~1.1k tokens
    DevelopmentAuto-check passed
  • Greploop

    onyx-dot-app/onyx

    Iteratively improves a PR (GitHub), MR (GitLab), or shelved changelist (Perforce) until Greptile gives it a 5/5 confidence score with zero unresolved comments.

    32k GitHub starsUsed in 4 repos~3.3k tokens
    DevelopmentAuto-check passed

More from jggonz/os8088

  • Native Game Port

    jggonz/os8088

    Build a native 8086 assembly remake of a console/arcade game (reference = a disassembly or source tree) as an os8088 package, the way apps/drmario (DrMarco), apps/1942 and apps/excitebike were made…

    104 GitHub stars~2.9k tokensUpdated yesterday
    Auto-check passed
  • Port To Os8088

    jggonz/os8088

    Port an existing program - written in C or in any other language - to os8088 as a C package (SPEC.md §73), the way apps/cword ported Microsoft Word 1.1a.

    104 GitHub stars~3.6k tokensUpdated yesterday
    Auto-check passed
  • Refresh Stale PR

    jggonz/os8088

    Bring one of the maintainer's own stale pull requests (a branch on jggonz/os8088 that main has moved past) back to mergeable - merge main into it in a scratch worktree, decide whether it is still…

    104 GitHub stars~2.6k tokensUpdated yesterday
    Auto-check passed
  • Review Fork PR

    jggonz/os8088

    Review an incoming pull request that comes from someone else's fork of os8088 - fetch it, merge main into it, review it with a team of agents for memory safety, lost-from-main regressions, redraw…

    104 GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Release Os8088

    jggonz/os8088

    Build os8088 and publish the floppy images to the os8088.com website repo as a pull request, plus a GitHub release on the OS repo.

    104 GitHub stars~10k tokensUpdated yesterday
    Auto-check passed
  • Vga Face

    jggonz/os8088

    Give an os8088 package a COLOUR FACE on VGA/EGA - fewer redraws first, then a neater layout, styled panes and bevelled, picture-faced buttons with their captions inside - while the Hercules and CGA…

    104 GitHub stars~2.7k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Functional Check

What does Functional Check do?

Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every…. Functional Check is an agent skill from jggonz/os8088. Functionally verify a change on the glass before it merges - boot the built OS in QEMU, drive the actual UI the change proposes (mouse, keys, menus) over QMP, screenshot the evidence for every user-visible claim, and report per-claim pass/fail.

When should I use Functional Check?

Functional Check fits situations like: the user asks to functionally check; click through a branch; the working tree -; merge PRs as they pass such a check.

How do I install Functional Check in Claude Code?

Run `npx skills add jggonz/os8088 --skill functional-check -a claude-code`. Or copy the skill folder (.claude/skills/functional-check in jggonz/os8088) into .claude/skills/functional-check in your project. Claude Code loads it when a task matches its description.

How do I install Functional Check in Codex?

Run `npx skills add jggonz/os8088 --skill functional-check -a codex`. Or copy the skill folder (.claude/skills/functional-check in jggonz/os8088) into .agents/skills/functional-check in your project. Codex loads it when a task matches its description.

Can I use Functional Check in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jggonz/os8088 --skill functional-check -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/functional-check, .gemini/skills/functional-check, .github/skills/functional-check and .opencode/skills/functional-check in your project.

What does Functional Check need to run?

Going by SKILL.md and its folder, Functional Check needs the command-line tools its instructions call (make, python3, git and gh). Our summary lists: Python 3.

Does Functional Check access the network?

SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Functional Check safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Functional Check use?

Functional Check is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Functional Check use?

About 2.1k tokens (SKILL.md is roughly 8.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Functional Check?

Skills that share tags, products or a category with Functional Check: Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 297k stars), Typescript Advanced Types (rolling-scopes/rsschool-app, 10k stars) and PR Babysitter (openinterpreter/openinterpreter, 69k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Functional Check?

jggonz (a GitHub user) maintains it in jggonz/os8088, which has 104 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 8, 2026.

Source: jggonz/os8088 on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.