geargrafx-debugging — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited geargrafx-debugging (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Debug TurboGrafx-16, PC Engine, and SuperGrafx games using the Geargrafx emulator as an MCP server. Control execution (pause, step, breakpoints), inspect the HuC6280 CPU and hardware (HuC6270 VDC, HuC6260 VCE, HuC6202 VPC, PSG), read/write memory, disassemble code, trace instructions, and capture screenshots — all through MCP tool calls. Hardware documentation is available in the references/ directory.
IMPORTANT — Check before installing: Before attempting any installation or configuration, you MUST first verify if the Geargrafx MCP server is already connected in your current session. Call debug_get_status — if it returns a valid response, the server is active and ready.
Only if the tool is not available or the call fails, you need to help install and configure the Geargrafx MCP server:
Run the bundled install script (macOS/Linux):
bash scripts/install.shThis installs Geargrafx via Homebrew on macOS or downloads the latest release on Linux. It prints the binary path on completion. You can also set INSTALL_DIR to control where the binary goes (default: ~/.local/bin).
Alternatively, download from GitHub Releases or install with brew install --cask drhelius/geardome/geargrafx on macOS.
Configure your AI client to run Geargrafx as an MCP server via STDIO transport. Example for Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"geargrafx": {
"command": "/path/to/geargrafx",
"args": ["--mcp-stdio"]
}
}
}Replace /path/to/geargrafx with the actual binary path from the install script. Add --headless before --mcp-stdio on headless machines.
PC Engine hardware documentation is available in the references/ directory. Load them into your context when investigating specific hardware.
| Reference | File | Load when... |
|---|---|---|
| HuC6280 CPU | references/huc6280_cpu.md | CPU registers, MPR mapping, timer, interrupts, I/O, speed modes |
| Instruction Set | references/huc6280_instructions.md | Opcode reference, addressing modes, cycle counts |
| PSG | references/huc6280_psg.md | 6-channel sound: waveform, noise, LFO, volume, DDA |
| HuC6270 VDC | references/huc6270_vdc.md | Video Display Controller: BAT, sprites, scroll, DMA, interrupts |
| HuC6260 VCE | references/huc6260_vce.md | Video Color Encoder: palette, dot clock, color format |
| HuC6202 VPC | references/huc6202_vpc.md | Video Priority Controller (SuperGrafx): window, priority |
| Memory Map | references/memory_map.md | Full memory map: MPR pages, I/O, WRAM, VRAM, ROM banking |
load_media → get_media_info → get_huc6280_status → get_screenshotStart every session by loading the ROM, confirming it loaded correctly, then checking CPU state and taking a screenshot to understand the current game state. If a .sym, .lbl, or .noi file exists alongside the ROM, symbols are loaded automatically.
Load additional symbols with load_symbols or add individual labels with add_symbol.
Always call debug_pause before inspecting state. While paused:
get_huc6280_status — registers A, X, Y, S, P (flags), PC, MPR mapping, timer, interrupts, I/O port, speed modeget_disassembly with a start/end address range — only shows executed code pathsget_call_stack — current subroutine hierarchyread_memory with a memory area tab ID (use list_memory_areas to discover available areas and their IDs)Use breakpoints to stop execution at points of interest:
| Breakpoint Type | Tool | Use Case |
|---|---|---|
| Execution | set_breakpoint (type: exec) | Stop when PC reaches address |
| Read | set_breakpoint (type: read) | Stop when memory address is read |
| Write | set_breakpoint (type: write) | Stop when memory address is written |
| Range | set_breakpoint_range | Cover an address range (exec/read/write) |
Breakpoints support 5 memory areas: rom_ram (default), vram, palette, huc6270_reg, huc6260_reg.
Important: Read/write breakpoints stop with PC at the instruction after the memory access.
Manage breakpoints with list_breakpoints, remove_breakpoint.
After hitting a breakpoint or pausing:
| Action | Tool | Behavior |
|---|---|---|
| Step Into | debug_step_into | Execute one instruction, enter subroutines |
| Step Over | debug_step_over | Execute one instruction, skip JSR calls |
| Step Out | debug_step_out | Run until RTS/RTI returns from current subroutine |
| Step Frame | debug_step_frame | Execute until next VBlank |
| Run To | debug_run_to_cursor | Continue until PC reaches target address |
| Continue | debug_continue | Resume normal execution |
After each step, call get_huc6280_status and get_disassembly to see where you are.
The trace logger records CPU instructions interleaved with hardware events (VDC, VCE, PSG, timer, CD-ROM, SCSI, ADPCM, input).
set_trace_log with enabled: true to start recording (optionally filter event types)set_trace_log with enabled: false to stop (entries are preserved)get_trace_log to read recorded entriesAvailable trace event filters: cpu_irq, vdc, vce, psg, timer, input, cdrom, adpcm, scsi. CPU tracing is always on.
Tracing is essential for understanding timing-sensitive code, interrupt handlers, and hardware interaction sequences.
get_huc6270_status — VDC state: position, control, interrupt flagsget_huc6270_registers — all 20 VDC registers (0x00-0x13), Address Register (AR), Status Register (SR)write_huc6270_register — write to a VDC register (0-19) or AR (20). Use vdc parameter (1 or 2) for SuperGrafxlist_sprites — all 64 sprites with position, size, pattern, paletteget_sprite_image — get a sprite as a PNG imageget_huc6260_status — VCE state: position, sync signals, dot clock, controlget_huc6202_status — VPC state: window settings, priority configurationget_psg_status — all 6 PSG channels: waveform, frequency, volume, noise, LFO, DDAget_cdrom_status — CD-ROM drive statusget_cdrom_audio_status — CD audio playback statusget_adpcm_status — ADPCM audio statusget_arcade_card_status — Arcade Card statusget_huc6280_status — full CPU state: registers, MPR, timer, interrupts, I/O, speedwrite_huc6280_register — modify a register liveget_screenshot — current rendered frame as PNGUse screenshots after stepping or continuing to see the visual impact of changes.
debug_continue to run until the IRQ firesget_huc6280_status + get_disassembly to see the handler codeget_call_stack to see how deep you areadd_symbol to label the handler address and any subroutines it callsdebug_pause → get_huc6270_registers — check BAT, sprite attributes, scroll, DMA settingsget_huc6260_status — verify dot clock, color modeget_screenshot — capture the current visual stateread_memory on VRAM and SAT areas to inspect tile/sprite datavram or huc6270_reg) on display buffer addresses to catch corruption sourceset_breakpoint at the subroutine entry pointdebug_continue → when hit, get_huc6280_statusdebug_step_into / debug_step_overadd_symbol for the routine and any called subroutinesadd_disassembler_bookmark to mark interesting locationsadd_memory_watch on the variable's address — watches are visible in the emulator GUIset_breakpoint (type: write) on that addressget_disassembly reveals what code is modifying itget_call_stack shows the call chain leading to the writeset_trace_log with enabled: true to start recording timer and VDC eventsget_trace_log to see the interleaved CPU + hardware eventsget_huc6270_statusload_media with a .cue file to load a CD-ROM imageget_cdrom_status to verify drive stateset_trace_log with cdrom: true and scsi: true to trace CD access patternsget_adpcm_status to inspect ADPCM audio stateUse list_memory_areas to get the full list with IDs and sizes. Common areas:
| Area | Description | Typical Size |
|---|---|---|
| WRAM | Working RAM | 8KB (32KB for SuperGrafx) |
| ZP | Zero Page (fast variables) | 256 bytes |
| ROM | Game ROM | Varies |
| CARD RAM | HuCard RAM | Varies |
| BRAM | Backup RAM (save data) | 2KB |
| PALETTES | VCE color table | 512 bytes |
| VRAM / VRAM 1 | VDC video RAM | 64KB |
| VRAM 2 | VDC 2 video RAM (SuperGrafx) | 64KB |
| SAT / SAT 1 | Sprite Attribute Table | 512 bytes |
| SAT 2 | SAT for VDC 2 (SuperGrafx) | 512 bytes |
| CDROM RAM | CD-ROM working RAM | Varies |
| ADPCM | ADPCM sample RAM | 64KB |
| ARCADE | Arcade Card RAM | Varies |
| MB128 | Memory Base 128 | 128KB |
add_symbol liberally to label addresses you've identified — makes disassembly readableadd_disassembler_bookmark for code locations and add_memory_bookmark for data regionsadd_memory_watch for variables you're tracking across stepssave_state / load_state to snapshot and restore emulator state at interesting pointsget_rewind_status + rewind_seek to scrub back through recent execution history without manual save statesget_screenshot after significant changesThe emulator continuously records snapshots into a ring buffer during gameplay. You can seek to any recorded snapshot to restore full emulator state at that point in time — like time travel debugging.
get_rewind_status — returns snapshot count, capacity, buffered secondsdebug_pause — the emulator must be paused before seekingrewind_seek with a snapshot number (1 = oldest, snapshot_count = newest)get_huc6280_status, get_disassembly, get_screenshot, read_memory, etc.debug_continue to resume from the seeked state| Tool | Description |
|---|---|
get_rewind_status | Snapshot count, capacity, buffered seconds, configuration |
rewind_seek | Jump to snapshot N (1=oldest, count=newest). Non-destructive — can seek repeatedly |
rewind_seek loads a snapshot without removing it. You can seek to the same snapshot multiple times, or jump between different snapshots freely.debug_pause → get_rewind_status to see how far back you can gorewind_seek: try the midpoint, check if the bug is visible (get_screenshot), then narrow the rangerewind_seek to a snapshot just before the bug and debug_continue~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.