{
  "run_id": "alpsei--aseprite-lua-mcp-gpt-6-luna-1792959653773058500",
  "date": "2026-10-25T20:26:51.392977+00:00",
  "repo": "alpsei/aseprite-lua-mcp",
  "kind": "mcp",
  "source": "https://github.com/alpsei/aseprite-lua-mcp",
  "commit": "d55f986547e3c5de620a25a9e8b2da5feaa8d124",
  "model": "gpt-6-luna",
  "model_version": "gpt-6-luna",
  "test_version": "readme-28be396a13b37d359c3180d70d32e54f628c075f93f36a825acbf4adbf9e947c",
  "pass": true,
  "outcome": "pass",
  "time_to_working_s": 328.69202186900657,
  "total_s": 357.61988592147827,
  "steps": [
    "pwd; vault-search 'aseprite lua mcp repository quickstart operation' 2>&1; cat <host-path> 2>&1; rg --files -g 'README*' -g 'AGENTS.md' -g 'pyproject.toml' -g 'package.json' -g 'Cargo.toml' -g 'go.mod' -g '*.md' | head -80; git status --short --branch; git rev-parse --show-toplevel; rg -n \"\" README.md | head -240",
    "ls -la; find .. -name AGENTS.md -o -name README.md; find . -maxdepth 2 -type f | head -100",
    "cat README.md; cat package.json; cat .claude/mcp.json; python3 --version; node --version 2>&1; npm --version 2>&1; id -u; sudo -n true; echo sudo_status:$?",
    "sudo apt-get -o DPkg::Lock::Timeout=300 update && sudo apt-get -o DPkg::Lock::Timeout=300 install -y nodejs npm",
    "npm install && npm run build",
    "node --version; npm --version; command -v aseprite || true; apt-cache policy aseprite; find .coldpass -maxdepth 2 -type f -print; sed -n '1,240p' src/index.ts; sed -n '1,240p' src/aseprite.ts",
    "node -e 'const {spawn}=require(\"node:child_process\"); const p=spawn(\"node\",[\"dist/index.js\"],{cwd:\"<guest-path>\",stdio:[\"pipe\",\"pipe\",\"inherit\"]}); let b=\"\"; p.stdout.on(\"data\",d=>{b+=d; while(b.includes(\"\\n\")){let i=b.indexOf(\"\\n\"),l=b.slice(0,i);b=b.slice(i+1);if(!l)continue;let n=JSON.parse(l);if(n.id===2){console.log(JSON.stringify(n));p.kill();}}}); p.stdin.write(JSON.stringify({jsonrpc:\"2.0\",id:1,method:\"initialize\",params:{protocolVersion:\"2024-11-05\",capabilities:{},clientInfo:{name:\"coldpass-probe\",version:\"1\"}}})+\"\\n\"); setTimeout(()=>{p.stdin.write(JSON.stringify({jsonrpc:\"2.0\",method:\"notifications/initialized\"})+\"\\n\");p.stdin.write(JSON.stringify({jsonrpc:\"2.0\",id:2,method:\"tools/call\",params:{name:\"get_aseprite_lua_docs\",arguments:{}}})+\"\\n\");},100); setTimeout(()=>p.kill(),5000);'",
    "mkdir -p .coldpass; cat > .coldpass/probe.json <<'EOF'\n{\"kind\":\"mcp\",\"argv\":[\"node\",\"dist/index.js\"],\"cwd\":\"<guest-path>\",\"tool\":\"get_aseprite_lua_docs\",\"arguments\":{},\"expected_text\":\"# Aseprite Lua API cheat sheet\"}\nEOF\ncat > .coldpass/claims.json <<'EOF'\n[{\"kind\":\"claim\",\"claim\":\"The documentation tool returns an Aseprite Lua API cheat sheet.\",\"source\":\"Returns a compact cheat sheet of the Aseprite Lua API (Sprite, Layer, Cel, Image, Color, Palette, `saveCopyAs`) so the agent doesn't need to guess.\",\"input\":\"get_aseprite_lua_docs with empty arguments\",\"expected\":\"# Aseprite Lua API cheat sheet\",\"probe_kind\":\"mcp\",\"argv\":[\"node\",\"dist/index.js\"],\"tool\":\"get_aseprite_lua_docs\",\"arguments\":{},\"expected_text\":\"# Aseprite Lua API cheat sheet\",\"cwd\":\"<guest-path>\"}]\nEOF\ncat > .coldpass/examples.json <<'EOF'\n[{\"kind\":\"example\",\"claim\":\"Build the documented development entrypoint\",\"source\":\"README.md / Development\",\"input\":\"npm install && npm run build\",\"expected\":\"TypeScript build completes\",\"argv\":[\"npm\",\"run\",\"build\"],\"cwd\":\"<guest-path>\",\"expected_text\":\"tsc\"}]\nEOF\ncat > .coldpass/cycles.json <<'EOF'\n{\"detected\":false,\"reason\":\"Inspected README command entrypoints and src/index.ts: the program serves MCP tool calls on stdio and contains no cron, timer, loop, webhook, or one-shot cycle scheduler.\" ,\"checks\":[]}\nEOF\n",
    "<env-var>=<guest-path> python3 -I <guest-path> --validate --replay",
    "cat > .coldpass/report.json <<'EOF'\n{\"outcome\":\"working\",\"fault_owner\":null,\"operation\":\"MCP initialization and get_aseprite_lua_docs tool call\",\"operation_scope\":\"Node.js 18.19.1 stdio server, with documentation result replayed; README's Aseprite-dependent script execution could not be exercised because Aseprite is not installed and unavailable through the guest apt package index.\",\"steps\":[\"Read README Quick start and Development sections.\",\"Installed Node.js and npm with sudo apt-get -o DPkg::Lock::Timeout=300 install -y nodejs npm; versions are 18.19.1 and 9.2.0.\",\"Ran npm install and npm run build successfully.\",\"Started documented server entrypoint node dist/index.js and called get_aseprite_lua_docs using MCP initialize and tools/call.\",\"Saved and replayed a README claim and MCP probe; checker validation and replay passed.\"],\"deviations\":[\"Aseprite required for execute_aseprite_script is not installed; command -v aseprite found none and apt-cache policy aseprite returned no package. Therefore script execution and sprite output remain unverified.\"],\"stuck_step\":null,\"main_blocker\":null,\"plain_failure\":null,\"suggested_fix\":null}\nEOF\n"
  ],
  "stuck_step": null,
  "error_excerpt": null,
  "what_it_did": "MCP initialization and get_aseprite_lua_docs tool call",
  "suggested_fix": null,
  "tokens_in": 286415,
  "tokens_out": 1858,
  "cost_usd": null,
  "usage_complete": true,
  "checks": [
    {
      "check": "operation",
      "status": "PASS",
      "details": {
        "working": true,
        "argv": [
          "node",
          "dist/index.js"
        ],
        "kind": "mcp",
        "serverInfo": {
          "name": "aseprite-mcp",
          "version": "0.1.1"
        },
        "tools": [
          "execute_aseprite_script",
          "get_aseprite_lua_docs"
        ],
        "tool_schema_bytes": 1183,
        "tool_result": {
          "content": [
            {
              "type": "text",
              "text": "# Aseprite Lua API cheat sheet (run with: aseprite --batch --script file.lua)\n\n## Globals\napp.sprite            -- active sprite (nil in batch unless you open/create one)\napp.activeLayer / app.activeFrame / app.activeCel\napp.params            -- script params (--script-param key=value)\nprint(...)            -- goes to stdout\nRect(x,y,w,h)  Point(x,y)  Size(w,h)\nColor{ r=255, g=0, b=0, a=255 }  or  Color(255,0,0,255)  or Color{ gray=128 }\napp.pixelColor.rgba(r,g,b,a)  -- integer pixel value (RGB mode)\n\n## Sprite\nlocal spr = Sprite(width, height)            -- new RGB sprite (also: Sprite(w,h,ColorMode.INDEXED))\nlocal spr = Sprite{ fromFile=\"in.png\" }      -- open file\nspr.width / spr.height / spr.colorMode / spr.filename\nspr.layers  spr.frames  spr.cels  spr.palettes  spr.tags\nspr:newFrame()  spr:newEmptyFrame()  spr:deleteFrame(frame)\nspr:newLayer()  spr:deleteLayer(layer)\nspr:resize(w,h)  spr:crop(x,y,w,h)  spr:flatten()\nspr:setPalette(palette)\nspr:saveAs(\"out.aseprite\")   -- changes sprite filename\nspr:saveCopyAs(\"out.png\")    -- export without changing filename (png/gif/aseprite/...). Multi-frame -> out{frame}.png unless gif/sheet\nspr.frames[1].duration = 0.1 -- seconds\nlocal tag = spr:newTag(fromFrame, toFrame); tag.name=\"walk\"; tag.aniDir=AniDir.FORWARD\n\n## Layer\nlocal layer = spr.layers[1]\nlayer.name = \"bg\"; layer.isVisible = true; layer.opacity = 255; layer.blendMode = BlendMode.NORMAL\nlayer.isGroup / layer.isImage / layer.cels\nlayer = spr:newLayer()\n\n## Cel\nlocal cel = spr:newCel(layer, frame, image, Point(x,y))   -- or spr:newCel(layer, 1)\ncel.image   cel.position (Point)   cel.frame   cel.layer   cel.opacity\n\n## Image (pixel buffer, coordinates 0-based inside the image)\nlocal img = Image(w, h)                      -- RGB by default; Image(w,h,ColorMode.RGB)\nlocal img = cel.image\nimg:putPixel(x, y, color)                    -- color: Color or integer from pixelColor\nimg:getPixel(x, y)                           -- integer\nimg:clear()   img:clear(Rect)   img:clone()\nimg:drawImage(otherImage, Point(x,y))\nimg:drawSprite(spr, frameNumber, Point(x,y))\nfor it in img:pixels() do it(app.pixelColor.rgba(255,0,0,255)) end  -- it.x, it.y, it() getter, it(v) setter\n-- fastest way to fill: loop over x,y with putPixel; modifying img directly is fine for a fresh cel\n\n## Palette\nlocal pal = spr.palettes[1]\n#pal                               -- number of colors\npal:resize(n)\npal:setColor(index, Color{r=..,g=..,b=..})   -- index is 0-based\npal:getColor(index)\n\n## GraphicsContext-free drawing helpers (via Image only)\nNo native line/circle/rect primitives on Image: write small helpers (loops + putPixel) in the script.\n\n## Common patterns\n-- Create, draw, export\nlocal spr = Sprite(32, 32)\nlocal cel = spr.cels[1]\nlocal img = cel.image\nlocal red = Color{r=255,g=0,b=0}\nfor y=0,31 do for x=0,31 do\n  if (x-16)^2 + (y-16)^2 <= 100 then img:putPixel(x,y,red) end\nend end\nspr:saveCopyAs(\"circle.png\")\n\n-- Animation: draw into each frame's cel\nfor i=1,4 do\n  if i>1 then spr:newFrame() end\n  local c = spr.cels[i]   -- cel of frame i on layer 1\n  ...\nend\nspr:saveCopyAs(\"anim.gif\")\n\n-- Scale up for preview\nspr:resize(spr.width*8, spr.height*8)  -- use only on a copy; nearest-neighbor for pixel art\n\n## Notes\n- Paths are relative to the server's working directory unless absolute; prefer absolute output paths.\n- Batch mode has no UI: do not use Dialog or app.command that needs a window.\n- Image coordinates are 0-based; Lua arrays (layers, frames, cels) are 1-based; palette indices are 0-based.\n- Errors surface on stderr with a line number; fix and re-run.\n"
            }
          ]
        },
        "tool_result_checked": true,
        "scope": "product operation"
      }
    }
  ],
  "safety": {
    "version": "z2x-1",
    "rules_version": "z2x-1",
    "summary": "Review signals: 6 known vulnerability.",
    "findings": [
      {
        "kind": "known-vulnerability",
        "count": 6,
        "note": "OSV reports a known vulnerability in this dependency version.",
        "location_count": 3
      }
    ],
    "context": [],
    "limitations": [
      "A short run cannot establish that code is safe.",
      "Connections show IP addresses; proxies can hide the final hostname.",
      "Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing."
    ],
    "static": {
      "dependency_note": "OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check."
    },
    "evidence_url": "/safety/?run=alpsei--aseprite-lua-mcp-gpt-6-luna-1792959653773058500",
    "evidence_file": "/data/safety/alpsei--aseprite-lua-mcp-gpt-6-luna-1792959653773058500.json.gz"
  },
  "agent_execution": "native_agent",
  "agent_runtime": "codex",
  "agent_runtime_version": "codex-cli 0.163.0",
  "tool_transport": "mcp-assigned-vm",
  "platform": "linux",
  "reasoning": "low",
  "service_tier": "standard",
  "resources": {
    "cpus": 2,
    "memory_mib": 4096,
    "disk_mib": 32768
  },
  "native_tool_calls": 10,
  "native_bundle": null,
  "architecture": null,
  "backend": "hyperv",
  "platform_details": {
    "backend": "hyperv",
    "os": "linux"
  },
  "platform_conflicts": null,
  "sandbox_source": null,
  "source_pin": {
    "commit": "d55f986547e3c5de620a25a9e8b2da5feaa8d124",
    "url": "https://github.com/alpsei/aseprite-lua-mcp"
  },
  "purpose": "initial",
  "profile": {
    "model": "gpt-6-luna",
    "reasoning": "low"
  },
  "fault": {
    "owner": null,
    "status": "resolved",
    "reason": null
  },
  "fix_id": null,
  "verifies_run_id": null,
  "hosting": null,
  "operation_scope": "product operation",
  "tool_calls": 10,
  "guest_setup": null,
  "runtime": null,
  "runtime_version": null,
  "runtime_revision": null,
  "source_revision": null,
  "evidence_version": null,
  "failure_origin": null,
  "evidence_strength": "readme_checked",
  "works": "yes",
  "install_s": null,
  "first_use_s": null,
  "mcp": "local",
  "needs": [],
  "needs_which": null,
  "agent_interface": [
    "mcp"
  ],
  "license": "MIT",
  "repo_url": "https://github.com/alpsei/aseprite-lua-mcp",
  "cost_to_try": "free",
  "hardware": null,
  "what_failed": null,
  "local_or_hosted": "local",
  "cycle_checks": [
    {
      "kind": "cycle",
      "claim": "Scheduled or looping main behavior",
      "source": "repository entry points",
      "input": "source inspection",
      "expected": "identify the product trigger",
      "verdict": "yes",
      "outcome": "Inspected README command entrypoints and src/index.ts: the program serves MCP tool calls on stdio and contains no cron, timer, loop, webhook, or one-shot cycle scheduler.",
      "evidence": "Inspected README command entrypoints and src/index.ts: the program serves MCP tool calls on stdio and contains no cron, timer, loop, webhook, or one-shot cycle scheduler.",
      "command": ""
    }
  ],
  "claims": [
    {
      "kind": "claim",
      "claim": "The documentation tool returns an Aseprite Lua API cheat sheet.",
      "source": "Returns a compact cheat sheet of the Aseprite Lua API (Sprite, Layer, Cel, Image, Color, Palette, `saveCopyAs`) so the agent doesn't need to guess.",
      "input": "{\"tool\": \"get_aseprite_lua_docs\", \"arguments\": {}}",
      "expected": "# Aseprite Lua API cheat sheet",
      "command": "node dist/index.js tools/call {\"tool\": \"get_aseprite_lua_docs\", \"arguments\": {}}",
      "verdict": "yes",
      "outcome": "Real input produced the expected result: # Aseprite Lua API cheat sheet",
      "evidence": "# Aseprite Lua API cheat sheet (run with: aseprite --batch --script file.lua)\\n\\n## Globals\\napp.sprite            -- active sprite (nil in batch unless you open/create one)\\napp.activeLayer / app.activeFrame / app.activeCel\\napp.params            -- script params (--script-param key=value)\\nprint(...)            -- goes to stdout\\nRect(x,y,w,h)  Point(x,y)  Size(w,h)\\nColor{ r=255, g=0, b=0, a=255 }  or  Color(255,0,0,255)  or Color{ gray=128 }\\napp.pixelColor.rgba(r,g,b,a)  -- integer pixel value (RGB mode)\\n\\n## Sprite\\nlocal spr = Sprite(width, height)            -- new RGB sprite (also: S",
      "source_checked": true,
      "source_file": "README.md"
    }
  ],
  "claims_note": null,
  "example_checks": [
    {
      "kind": "example",
      "claim": "Build the documented development entrypoint",
      "source": "README.md / Development",
      "input": "npm install && npm run build",
      "command": "npm run build",
      "evidence": "> aseprite-lua-mcp@0.1.1 build\n> tsc",
      "deferred": false,
      "expected": "TypeScript build completes",
      "returncode": 0,
      "verdict": "yes",
      "outcome": "command completed successfully"
    }
  ],
  "does_what_it_says": "yes",
  "maintenance": {
    "archived": false,
    "commits_90d": 2,
    "last_commit_at": "2026-10-22T07:18:19Z",
    "last_release_at": null,
    "median_reply_hours": null,
    "merged_prs_90d": 0,
    "note": "actively maintained: last commit 1 days ago; 2 commits and 0 merged PRs in 90 days; 0 open issues, 0 open PRs; no releases",
    "open_issues": 0,
    "open_prs": 0,
    "reply_share": null,
    "reply_threads": 0,
    "verdict": "maintained"
  },
  "maintenance_verdict": "maintained",
  "maintenance_note": "actively maintained: last commit 1 days ago; 2 commits and 0 merged PRs in 90 days; 0 open issues, 0 open PRs; no releases",
  "maintained": "active",
  "maintained_note": "last commit 3 days ago",
  "last_commit_at": "2026-10-22T07:18:20Z",
  "last_release_at": null,
  "open_issues": null,
  "answered_issues": null,
  "platforms_claimed": [
    "linux",
    "mac",
    "windows"
  ],
  "topic": "mcp-server",
  "agent_interfaces": [
    {
      "interface": "mcp",
      "evidence": "independent checker",
      "observed": true,
      "operation_checked": true
    }
  ],
  "agent_interfaces_note": "README metadata is a discovery hint, not pinned documentation proof. Observed interfaces were exercised in this run. An empty list means unknown.",
  "mcp_context": {
    "tool_count": 2,
    "schema_bytes": 1183,
    "tokens_approx": 296,
    "estimate_method": "ceil(compact UTF-8 tools/list JSON bytes / 4)",
    "scope": "returned tools/list page only; excludes client framing and tool results"
  },
  "tested_at": "2026-10-25T20:26:51.392977+00:00",
  "tested_commit": "d55f986547e3c5de620a25a9e8b2da5feaa8d124",
  "tested_with": {
    "agent": "codex",
    "agent_version": "codex-cli 0.163.0",
    "model": "gpt-6-luna",
    "model_route": "gpt-6-luna",
    "reasoning": "low",
    "os": "linux",
    "backend": "hyperv",
    "transport": "mcp-assigned-vm"
  },
  "setup_identity": {
    "repo": "alpsei/aseprite-lua-mcp",
    "source": "https://github.com/alpsei/aseprite-lua-mcp",
    "commit": "d55f986547e3c5de620a25a9e8b2da5feaa8d124",
    "source_revision": null,
    "os": "linux",
    "architecture": null,
    "backend": "hyperv",
    "model": "gpt-6-luna",
    "model_version": "gpt-6-luna",
    "agent_execution": "native_agent",
    "agent_runtime": "codex",
    "agent_runtime_version": "codex-cli 0.163.0",
    "tool_transport": "mcp-assigned-vm",
    "runtime": null,
    "runtime_version": null,
    "runtime_revision": null,
    "sandbox_source": null,
    "guest_setup": null,
    "source_pin": {
      "commit": "d55f986547e3c5de620a25a9e8b2da5feaa8d124",
      "url": "https://github.com/alpsei/aseprite-lua-mcp"
    },
    "platform_details": {
      "os": "linux",
      "backend": "hyperv"
    },
    "platform_conflicts": null,
    "reasoning": "low",
    "service_tier": "standard",
    "resources": {
      "cpus": 2,
      "memory_mib": 4096,
      "disk_mib": 32768
    },
    "operation": "MCP initialization and get_aseprite_lua_docs tool call",
    "operation_scope": "product operation",
    "hosting": null,
    "kind": "mcp",
    "test_version": "readme-28be396a13b37d359c3180d70d32e54f628c075f93f36a825acbf4adbf9e947c",
    "evidence_version": null
  },
  "other_model": null,
  "other_run_id": null,
  "models_agree": null,
  "furthest_model": null,
  "transcript_url": "/transcripts/alpsei--aseprite-lua-mcp-gpt-6-luna-1792959653773058500.txt",
  "report_url": "/reports/alpsei--aseprite-lua-mcp-gpt-6-luna-1792959653773058500.json"
}
