Tests
Every test run on EDGEchat so far: how to run it again, what to expect, and what it showed. Each phase ends with a test on the dev PC (design, “Phases”); new tests are added here when they are first run.
Last updated 2026-10-23.
At a glance
| Test | Kind | Phase | Last run | Result |
|---|---|---|---|---|
| Validate | CLI | P0, P1 | 2026-10-23 | Pass, one expected warning |
| Install from the checkout | CLI, scratch config | P0, P1 | 2026-10-23 | Pass |
| Install from GitHub | CLI, scratch config | P1 | 2026-10-26 | Pass, also in one command |
| Update from GitHub | CLI, scratch config | P1 | 2026-10-21 | See the section |
| Plugin servers beside servers added by hand | CLI, scratch config | P0, P1 | 2026-10-21 | Seen, recorded in the design |
| Unset options | CLI, scratch config | P1 | 2026-10-16 | Seen: empty string |
| redcode server | By hand, over stdio | P1 | 2026-10-27 | Pass (0.4.0, no wrapper); mesh_items misses outfit sets |
| edgedeck server through the wrapper | By hand, over stdio | P1 | 2026-11-02 | Pass (0.30.0) |
| edgemat server | By hand, over stdio | P1 | 2026-10-23 | Pass |
| rednode with no token | CLI, game running | P1 | 2026-10-16 | Seen: HTTP 401 |
| OAuth sign-in for a plugin server | CLI, scratch config; then in the game | P4 | 2026-10-26 | Seen with a stand-in; against REDnode 0.40.1 in game: pass |
| Plugin sign-in in VS Code | By hand, in a session | P4 | 2026-10-26 | Pass |
| P1 test in VS Code with the game | By hand, in a session | P1 | 2026-10-21 | Pass; the ask before deploy failed, fixed in 0.0.5 (asks before changes) |
| Asks before changes | By hand, in a session | P1 | 2026-10-23 | Pass |
| Changing the game folder | By hand, in a session | P3 | 2026-10-23 | Pass after a restart |
| new-mod in the game | By hand, in a session | P3 | 2026-10-26 | Pass |
| init-project on a real project | By hand, in a session | P3 | 2026-10-26 | Pass |
| Clean install | By hand, fresh PC or account | P4 | 2026-10-26 | Pass |
| Swap and restore in the game | By hand, in a session | P4 | 2026-11-02 | Pass |
| EDGEkit one-click setup | By hand, in EDGEkit | P4 | 2026-10-26 | Pass, after EDGEkit changed to the install dialog |
| Evals: archives-and-cr2w | claude plugin eval |
P2 | 2026-10-23 | Skill fires; Δ 0.00 |
| Evals: rednode-mods | claude plugin eval |
P2 | 2026-10-25 | Δ +1.00; with new-mod, mean Δ +0.95 |
| rednode-mods in the game | By hand, in a session | P2 | 2026-10-23 | Pass |
| Evals: wolvenkit-projects | claude plugin eval |
P2 | 2026-10-23 | Δ +0.33 |
| Evals: edge-tools | claude plugin eval |
P3 | 2026-10-26 | Skill fires 9 of 9; Δ +1.00 |
| Evals: the whole suite | claude plugin eval |
P2, P3 | 2026-11-02 | 0.1.1: 15 cases, all pass; mean Δ +0.73 |
A scratch config has no Claude login, so the CLI tests check how the plugin installs and starts its servers, not what Claude does with it. The P1 test on 2026-10-21 was the first run of a skill in a session.
A scratch config
CLAUDE_CONFIG_DIR points Claude Code at another settings folder, so a test never touches your own plugins, servers or login. Every CLI test below starts like this (Git Bash):
export CLAUDE_CONFIG_DIR=<an empty scratch folder>
CLI
Validate
claude plugin validate .
claude plugin validate .claude-plugin/plugin.json
claude plugin validate skills --strict
Last run 2026-10-25 with Claude Code 2.1.310, at 0.0.10: pass, the same one warning, plus two new “plugin directory” warnings that do not change the result: no icon (ICON_MISSING) and no privacyPolicyUrl (PRIVACY_URL_MISSING, since rednode is a remote server). Run 2026-10-23 with 2.1.302, at 0.0.5: pass, the one warning. First run 2026-10-16 with 2.1.299.
| Check | Expected |
|---|---|
. (the marketplace manifest) |
Passes with one warning: CLAUDE.md at the plugin root is not loaded as project context. That file is for sessions working on this repo, so the warning is expected and --strict fails on it |
.claude-plugin/plugin.json |
The same one warning |
skills --strict |
Passes |
In P0, marketplace.json failed --strict until it had a top-level description.
Install from the checkout
claude plugin marketplace add "<path to this checkout>"
claude plugin install edge@edgemodders
claude plugin details edge@edgemodders
claude plugin configure edge@edgemodders
claude mcp list
Last run 2026-10-23 at 0.0.5 with Claude Code 2.1.302: pass: “6 userConfig options not yet set”; details lists the four servers, always-on cost about 185 tokens; configure lists the six options, gemini_api_key and openai_api_key sensitive; mcp list connects redcode, edgedeck and edgemat (rednode refused, game closed). Run 2026-10-21 at 0.0.2 with the results below. First run 2026-10-16 at 0.0.1, with the same results less edgedeck and its option.
| Check | Expected |
|---|---|
| Install | “Successfully installed plugin: edge@edgemodders (scope: user)” and “4 userConfig options not yet set” |
details |
edge 0.0.2; skills init-project, setup; MCP servers rednode, redcode, edgedeck; always-on cost about 150 tokens |
configure |
game_path, rednode_token (sensitive), redbridge_exe, edgedeck_library, all optional and not set |
mcp list |
plugin:edge:redcode ... Connected and plugin:edge:edgedeck ... Connected, each through its wrapper under the checkout’s path. plugin:edge:rednode connects only while the game runs (see rednode with no token) |
With a local marketplace the plugin is read from the checkout (CLAUDE_PLUGIN_ROOT is the checkout itself), and the checkout’s path has spaces: redcode still connects.
Install from GitHub
What a user does. Needs the commit pushed.
claude plugin marketplace add Edgemodders/EDGEchat
claude plugin install edge@edgemodders
claude mcp list
One command does both, as the README gives it: claude plugin install edge --marketplace Edgemodders/EDGEchat, with --config <key>=<value> for settings. Run 2026-10-26 in a scratch config, with Claude Code 2.1.310 and --config game_path=...: pass. It added the marketplace in user settings, installed 0.0.14 at user scope, saved game_path, and said “4 userConfig options not yet set”.
Run 2026-10-17 at 8fd75a2, just after the repo was renamed to EDGEchat: pass. redcode connects; rednode is ECONNREFUSED with the game closed.
First run 2026-10-16 at 4f07db8, as Edgemodders/EDGEplugin: the same results as from the checkout; the plugin runs from <config>/plugins/cache/edgemodders/edge/0.0.1/, and redcode connects from there.
Update from GitHub
What an existing user sees when a release adds a server and an option. Install the old version from GitHub first, push the new one, then update.
claude plugin marketplace add Edgemodders/EDGEchat # before the push: installs the old version
claude plugin install edge@edgemodders
# push the new version, then:
claude plugin marketplace update edgemodders
claude plugin update edge@edgemodders
claude plugin details edge@edgemodders
claude mcp list
First run 2026-10-21, 0.0.1 to 0.0.2 (5dbcc7c), Claude Code 2.1.302: pass, with one gap.
| Check | Seen |
|---|---|
plugin update |
“Plugin “edge” updated from 0.0.1 to 0.0.2 for scope user. Restart to apply changes.” |
details |
edge 0.0.2, MCP servers rednode, redcode, edgedeck |
mcp list |
redcode and edgedeck Connected from <config>/plugins/cache/edgemodders/edge/0.0.2/ |
configure |
The new edgedeck_library listed, not set |
| The gap | The update says nothing about the new option, unlike install (“N userConfig options not yet set”). Whether the form opens after an update in VS Code is not seen yet. A new option a server cannot do without must say so in the release notes and in /edge:setup |
Plugin servers beside servers added by hand
Run 2026-10-16 in P0, on a throwaway copy of the plugin. Results, recorded in the design’s facts:
| Setup | claude mcp list showed |
|---|---|
| Plugin installed | plugin:edge:redcode and plugin:edge:rednode: plugin servers are named plugin:<plugin>:<server> |
Plugin installed, plus claude mcp add --transport http --scope user rednode http://127.0.0.1:41820/mcp ... |
Only the hand-added rednode; the plugin’s copy is not listed. After claude mcp remove rednode -s user, plugin:edge:rednode is back |
Plugin 0.0.2 installed, plus claude mcp add --scope user edgedeck -- npx -y @edgemodders/edgedeck-mcp@0.27.3 (run 2026-10-21) |
Both plugin:edge:edgedeck and edgedeck, each Connected: a stdio server added by hand runs beside the plugin’s, so Claude would see every tool twice. /edge:setup finds it |
Working inside a folder with the servers in a root .mcp.json |
The servers also show as that folder’s project servers, “Pending approval”. With the servers inline in plugin.json, they do not |
Unset options
Run 2026-10-16 in P1. A test server that writes its argv and environment to a file, with --game ${user_config.game_path} in its args and REDCODE_GAME_PATH, REDBRIDGE_EXE from options in its env.
| Options | The server got |
|---|---|
| Not set | --game "", REDCODE_GAME_PATH="", REDBRIDGE_EXE="" |
game_path set with claude plugin configure edge@edgemodders --values-stdin |
The path in both places; REDBRIDGE_EXE still "" |
Also seen: a server that uses an option userConfig does not declare is dropped, and validate says so. CLAUDE_PLUGIN_ROOT and CLAUDE_PLUGIN_DATA are in every server’s environment.
By hand
redcode server
Speaks MCP to the server directly, with the plugin’s options empty as when they are unset. Needs Node.js, the game and REDbridge, found from REDcode’s VS Code settings. From plugin 0.1.1 the plugin starts redcode-mcp 0.4.0 with npx alone; until then it went through scripts
edcode-mcp.cmd, which cleared empty options.
node tools/test/mcp-probe.cjs --empty REDCODE_GAME_PATH --empty REDBRIDGE_EXE "npx -y @edgemodders/redcode-mcp@0.4.0" bridge_info
Last run 2026-10-27 with redcode-mcp 0.4.0, no wrapper: pass, REDbridge 0.11.0 (WolvenKit 10.0.0, from REDcode’s redcode.bridgePath), game 2.5 loaded, 57 archives, 592,071 files; exit 0. Earlier: 2026-10-23 through the wrapper with 0.3.0, pass; 2026-10-16 with 0.2.0, pass.
| Run | Expected |
|---|---|
npx directly, both options empty (0.4.0) |
gameLoaded: true, the bridge and game taken from REDcode’s settings; exit 0. The log names both |
| The same with 0.3.0 or older | Fails: “The argument ‘file’ cannot be empty. Received ‘’”; exit 1. Why the wrapper existed until 0.1.1 (design) |
mesh_items (new in 0.4.0), checked 2026-10-27 through a small MCP client in the same way, game 2.5, REDbridge 0.11.0:
| Mesh | Seen |
|---|---|
basecharactersgarmentplayer_equipmenteets1_055_shoe__converses1_055_pma_shoe__converse.mesh (the tool’s example) |
Items.CasualShoes_01_basic_01 (“Sunny Ammo synthetic high-tops”) and more, each with its .app look and entity appearances |
The cop jacket’s t2_064_pwa_jacket__t2_player_heavy_02.mesh (the archives-and-cr2w chain) |
items: [], looks: [], though outfitset_01.app shows it in appearances.55 and .57. Reported: REDcode#17 |
edgedeck server through the wrapper
Speaks MCP to the server directly and calls edgedeck_list, which only reads. Needs Node.js 20 or newer. With options set, it makes an empty library in the folder it is given, so give it a scratch folder.
node tools/test/mcp-probe.cjs --empty EDGEDECK_LIBRARY --empty EDGEDECK_GAME "scripts\edgedeck-mcp.cmd" edgedeck_list
EDGEDECK_LIBRARY='<scratch>\deck lib (x86)' EDGEDECK_GAME='<game folder>' node tools/test/mcp-probe.cjs "scripts\edgedeck-mcp.cmd" edgedeck_list
Last run 2026-11-02 with edgedeck-mcp 0.30.0, both options empty: pass, the default library (one mod now), deploy, undo and remove still flagged. Before that 2026-10-27 with 0.29.1: pass. Both options empty: the default library %USERPROFILE%EDGEdeck (empty on the dev PC now: no mods), game 2.5. A scratch library deck lib (x86) with the game folder: no mods, and the folder gets library. edgedeck_deploy, edgedeck_undo and edgedeck_remove still carry anthropic/requiresUserInteraction. Earlier: 2026-10-23 with 0.28.0, pass; 2026-10-21 with 0.27.3, pass.
| Run | Expected |
|---|---|
| Both options empty | The default library in %USERPROFILE%\EDGEdeck: the dev PC’s mods, starting [x] archivexl 1.26.8 |
| Library only, a scratch folder | no mods, and the folder gets a library folder |
| Library with spaces and parentheses, plus the game folder | The same, in that folder |
What the first runs found, and why the wrapper is written as it is:
| Tried | Seen |
|---|---|
The folders as args in plugin.json, through the probe: npx ... --library "" --game "" |
The server got the quotes: mkdir '...\""\library'. The probe’s own quoting may add to it, but arguments through cmd and npx are fragile, so the plugin passes variables |
The wrapper with npx ... !ARGS! (delayed expansion) |
The default library, whatever was set: npx.cmd got the text !ARGS!. The wrapper’s own echo !ARGS! showed the right value, which hid it |
endlocal & npx ... -- %ARGS% |
Works: %ARGS% is expanded before npx.cmd runs |
| The probe running a wrapper from a folder with a space in its name | No answer, for redcode-mcp.cmd too: the probe’s quoting from Git Bash. Claude Code starts both wrappers from such a folder (install from the checkout) |
edgemat server
Speaks MCP to the server directly, with the plugin’s options empty. Needs Node.js 20 or newer. mat_library with no arguments only reads.
node tools/test/mcp-probe.cjs --empty EDGEMAT_GAME_PATH --empty REDBRIDGE_EXE --empty GEMINI_API_KEY --empty OPENAI_API_KEY "npx -y @edgemodders/edgemat-mcp@0.3.1" mat_library
node tools/test/mcp-probe.cjs --empty GEMINI_API_KEY --empty OPENAI_API_KEY "npx -y @edgemodders/edgemat-mcp@0.3.1" mat_generate '{"words":"red leather"}'
First run 2026-10-23 with edgemat-mcp 0.3.1: pass.
| Run | Expected |
|---|---|
mat_library, every option empty |
The library’s counts (17,734 setups on the dev PC), “matchesGame: not checked (the bridge is not running)”, cache %LOCALAPPDATA%\EDGEmat; exit 0. Empty variables are taken as unset |
mat_generate, no key |
“No image service key: set GEMINI_API_KEY or OPENAI_API_KEY …”; exit 1, and no network call |
rednode with no token
Seen 2026-10-16 while the game ran, plugin installed in a scratch config with no rednode_token:
plugin:edge:rednode: http://127.0.0.1:41820/mcp (HTTP) - ✘ Failed to connect — Server rejected the configured Authorization header (HTTP 401). ... {"error":"A valid token is required"}
With the game closed it is ECONNREFUSED instead. /edge:setup tells the two apart this way.
OAuth sign-in for a plugin server
Whether a plugin’s HTTP server gets Claude Code’s OAuth sign-in, for connecting to REDnode by approving in the game instead of pasting a token (REDnode#19). Run 2026-10-26 with Claude Code 2.1.310 in a scratch config: a stand-in server on 127.0.0.1:41899 that answers /mcp with 401 and WWW-Authenticate: Bearer resource_metadata="...", serves the two .well-known documents and /register, and logs every request; a scratch plugin whose only server is {"type": "http", "url": "http://127.0.0.1:41899/mcp"}.
| Step | Seen |
|---|---|
claude mcp list, the same URL also added by hand |
Only the hand-added server listed, “Needs authentication”: it hides the plugin’s |
claude mcp list, plugin only |
plugin:otest:srv ... ! Needs authentication. Requests: POST /mcp, then both .well-known documents |
claude mcp login plugin:otest:srv, stdin not a terminal |
POST /register with client_name “Claude Code (plugin:otest:srv)” and a http://localhost:<port>/callback redirect; prints the authorize URL (PKCE S256, state, resource); then stops: “stdin isn’t a terminal” |
| Token exchange | Not run: needs an interactive sign-in. Test it against REDnode’s build |
Then against REDnode itself, 2026-10-26, by the user on the dev PC: game 2.5, REDnode 0.40.0, then 0.40.1. REDnode’s test “MCP sign-in: test” in its docs/mcp.md, with a header-less rednode-signin added by hand beside the plugin’s (which still sends the token). Pass on 0.40.1, every step: authenticate, the same code in the browser and the game’s Connect window, Allow, game_state answered, Connected assistants listed it, still connected after a game restart, Revoke, Deny, a request lapsing after 2 minutes. On 0.40.0, signing in again after Revoke failed with “Unknown client”; 0.40.1 fixed it (REDnode#19, closed).
| Seen | What it means for EDGEchat |
|---|---|
| After a Revoke, Claude Code shows the server connected until its next request, which gets a 401 | /edge:setup should take “connected” with a failing call as “signed out”: authenticate again |
A plain {"type": "http", "url": "http://127.0.0.1:41820/mcp"} signs in by itself |
The plugin can drop rednode_token and the Authorization header once REDnode 0.40.1 is released |
Whether the VS Code extension’s /mcp offers Authenticate |
Yes: seen in the plugin sign-in in VS Code |
Plugin sign-in in VS Code
The plugin’s own rednode (0.0.13, the URL alone) signing in from the VS Code extension, then /edge:setup with all four servers. Run 2026-10-26 by the user on the dev PC: plugin 0.0.13 from GitHub, game 2.5, REDnode 0.40.1, the hand-added rednode removed first (claude mcp remove rednode -s user), game_path set back to the 2.5 folder. Pass.
| Step | Seen |
|---|---|
/mcp before signing in |
plugin:edge:rednode with Authenticate, and also Reconnect (the user’s recollection) |
| Authenticate | The browser and the game’s Connect window showed the same code; Allow signed in |
/edge:setup |
All four connected. rednode: REDnode 0.40.1, main menu, overlay interactive. redcode: REDbridge 0.10.0 reporting WolvenKit 10.0.0, 57 archives, 592,071 files (2.5). edgedeck: library C:\Users\VYRAL\EDGEdeck, no mods, game 2.5. edgemat: library built, 17,867 setups. No EDGE server added by hand |
Found on the way: the plugin’s settings form in VS Code has its Save configuration button below the fold with five options, and the user missed it, so game_path stayed on the 2.31 backup. It was set with claude plugin configure edge@edgemodders --values-stdin instead (a JSON object of strings on stdin; options left out keep their values). The README and /edge:setup now say to scroll down to the button.
P1 test in VS Code with the game
The test that ends P1 (design). Needs your own Claude Code login, so it runs in your real config.
- Remove a
rednodeadded by hand, which hides the plugin’s:claude mcp remove rednode -s user. - In the VS Code extension:
/plugins, add the marketplaceEdgemodders/EDGEchat, installedge. - Start the game and load a save. Open the REDnode launcher (F10 for REDnode’s overlay, then the REDNODE tab at the bottom left), and its Settings panel with the gear at the right of the Theme row (REDnode 0.32.2 or newer; before that the switches were in the launcher itself): MCP server on, Copy setup. Do not run the copied command. Put only the token (after
Bearer) in the plugin’srednode_token: the gear on theedgerow. - Start a new session and run
/edge:setup.
| Check | Expected |
|---|---|
| The settings form | Opens after install with the four options |
/edge:setup |
A table: rednode connected with the game state, redcode connected with REDbridge’s version and the archive count, edgedeck connected with the mods |
| The tool names | mcp__plugin_edge_rednode__*, mcp__plugin_edge_redcode__*, mcp__plugin_edge_edgedeck__* |
api_call, edgedeck_deploy, edgedeck_undo |
Ask before they run (now its own test, asks before changes) |
First run 2026-10-21, plugin 0.0.2 installed from GitHub on a second PC (the user’s laptop, with the game, EDGEdeck and REDcode’s REDbridge), in the VS Code extension. Steered from the dev PC’s session, which could not run /plugins through Remote Control (“isn’t available in this environment”), so the user installed it locally. Pass, one check not seen.
| Check | Seen |
|---|---|
| The settings form | Pass: opened after install with the four options, empty |
/edge:setup, game closed, options empty |
A correct table: edgedeck connected (18 mods, frameworks line “game 2.31”); redcode started (REDbridge 0.10.0, WolvenKit 9.1.0) with no game folder and 0 archives, and the next step named the right folder, the one EDGEdeck uses; rednode refused, “start the game”. It found edgemat added by hand and said it duplicates nothing. It changed nothing |
/edge:setup after setting game_path and rednode_token, game at the main menu |
Pass: all three connected. rednode: REDnode 0.26.15, main menu, overlay interactive. redcode: REDbridge 0.10.0, 57 archives, 583,798 files. edgedeck: 18 mods, 15 on |
| The tool names | Not looked at; the skill called each server’s tools, so they loaded |
Asks before api_call, deploy, undo |
Fail for deploy. Asked to deploy, Claude called edgedeck_deploy with no prompt; only EDGEdeck’s refusal while the game runs stopped it (that refusal comes from inside the deploy, so the call was made). Whether api_call prompted was not noted. The session’s permission mode was not reported; auto mode is the likely reason. Fixed in the servers: see asks before changes |
| An approval step for the servers | None: the servers connected without asking (the user’s recollection) |
Found on the way: the user did not know where “the REDNODE tab” was. 0.0.3 names the REDnode launcher everywhere. redcode did not fall back to REDcode’s VS Code setting on that PC (whether REDcode’s setting is set there, or the editor was EDGEkit, is not known), so game_path was needed.
Changing the game folder
Run 2026-10-23 on the dev PC, plugin 0.0.8, game closed. The game had updated to 2.5, which the EDGE tools do not support yet, so the user pointed the tools at a backup of 2.31. Pass once the plugin’s option was changed and Claude Code restarted.
| Step | Seen |
|---|---|
REDcode’s redcode.gamePath in VS Code set to the backup, plugin’s game_path still the 2.5 folder |
redcode, edgedeck: still the 2.5 folder. The plugin’s game_path comes first |
Plugin’s game_path changed in /plugins, no restart |
Saved in settings.json; the servers still on the 2.5 folder: they read it only at start |
After a restart, /edge:setup |
All on the backup. redcode: 57 archives, 583,798 files (592,071 on 2.5). edgedeck: 12 mods, 7 on, frameworks line “game 2.31 · 2 updates”, the mods shown as deployed. edgemat: 17,734 setups, built 2026-10-21. rednode: refused, game closed |
| A session started before the update to 0.0.8 | Ran the servers from the 0.0.8 cache but the skills from the 0.0.2 cache, until a restart |
To change folders: set the plugin’s game_path, not only REDcode’s setting, then restart Claude Code.
Asks before changes
Needs REDnode 0.26.16 or newer in the game, and plugin 0.0.5 or newer for the edgedeck rows (it runs edgedeck-mcp 0.28.0, the first with the flag). Run it in auto mode, the mode that skipped the prompt in P1. Game at a loaded save for the rednode rows, closed for the edgedeck rows. Deny every prompt, except the one allowed api_call.
| Ask Claude | Expected |
|---|---|
| “What’s the player’s money?” (or another read) | It uses api_read, which runs without a prompt |
| “Give the player 1 eddie” | api_call prompts, with no “don’t ask again”; denied, nothing changes |
Again, after allowing api_call once |
It prompts again |
| “Reload my mod’s archive” | archives_reload prompts |
| “Deploy my mods” | edgedeck_deploy prompts; denied, the game folder is unchanged |
| “Undo the last deploy”, “Remove mod X” | edgedeck_undo, edgedeck_remove prompt |
/edge:setup with REDnode older than 0.26.16 |
It says to update REDnode, since api_read is missing |
First run 2026-10-23 on the user’s laptop, in the VS Code extension in auto mode, plugin 0.0.5, REDnode 0.32.1: pass. The user’s words: every prompt appeared as expected, and each was allowed or denied as the steps said.
| Asked | Seen |
|---|---|
| “How much money does V have right now? Just read it.” | No prompt (api_read) |
| “Give V 1 eddie.”, denied | api_call prompted |
| “Give V 1 eddie.” again, allowed | Prompted |
| “Give V 1 more eddie.”, denied | Prompted again after the allow |
Reload an archive in archive/pc/mod, denied |
archives_reload prompted |
| Game closed: “Deploy my mods.”, denied | edgedeck_deploy prompted. In P1 it ran without one |
| “Undo the last deploy.”, denied | edgedeck_undo prompted |
Not run: “remove a mod” (edgedeck_remove carries the same flag in edgedeck-mcp 0.28.0; not tried, to keep the mods safe), the default mode, and /edge:setup with an old REDnode.
new-mod in the game
The P3 test: /edge:new-mod run by the user as a modder who does not code, with the game running: it asks what the mod should do, picks the kind of mod, makes the project, builds a first small version, and tests it in the game. Changes to the game and the game folder ask first. Run 2026-10-26 by the user on the dev PC: plugin 0.0.14, game 2.5, REDnode 0.40.1, REDbridge 0.11.0. Pass, by the user’s report; the details were not recorded.
Clean install
The P4 test: the README’s steps alone on a fresh PC or Windows account, with REDbridge from its releases zip and the .NET 10 runtime, then /edge:setup and the REDnode sign-in. Run 2026-10-26 by the user on the dev PC: plugin 0.0.14, game 2.5, REDnode 0.40.1, REDbridge 0.11.0. Pass, by the user’s report; the details were not recorded.
Swap and restore in the game
The wolvenkit-projects loop for 0.1.1: a WolvenKit project deployed by EDGEdeck, changed and swapped into the running game through REDswap, then EDGEdeck brought back in step. Run 2026-11-02 by the user on the dev PC, in claude --plugin-dir <checkout> (plugin 0.1.1 from the checkout, with game_path and edgedeck_library copied to edge@inline), game 2.5, REDnode 0.50.2 (REDswap 1.0.3), REDbridge 0.11.0, redcode-mcp 0.4.0, edgedeck-mcp 0.30.0. Pass.
The project: E:ModdingCyberpunk 2077RedmodsEDGEchatSwapTest, made with EDGEmat: the jacket of Items.Cop_01_Set_Jacket (cop_blue_black, four player meshes and a new .mlsetup), recoloured red. It packed as a REDmod (packed/mods/EDGEchatSwapTest/).
| Step | Seen |
|---|---|
Pack, edgedeck_install_project, edgedeck_pending |
Library mod edgechatswaptest, version dev. Pending listed it and three UV Texture Framework mods waiting from before; Claude offered to deploy the test mod only |
| Deploy | Asked first. EDGEdeck ran REDmod’s deploy: r6/cache/modded/mods.json lists the mod |
| Start the game | Not red at first: the game was started without -modded. Red after a start through EDGEdeck’s Run (16:08), which adds it |
Recolour green, pack, archives_reload |
Asked first. Swapped in 88 ms, no errors, V’s outfit applied again; green at once |
edgedeck_pending after the swap |
One file, mods/EDGEchatSwapTest/archives/EDGEchatSwapTest.archive, “changed in the game folder”, with keep and restore explained |
edgedeck_install_project, deploy with restore |
Asked first. After a restart the jacket stayed green |
Found on the way:
| Finding | What came of it |
|---|---|
An earlier swap of EDGEmatA.archive (a file from the laptop, never deployed by EDGEdeck) added it to archive/pc/mod unmanaged; Claude offered to delete it by hand |
wolvenkit-projects now says what a swap does with an archive the game has not mounted, and never to delete it by hand |
A REDmod needs -modded |
In wolvenkit-projects |
The first recolour changed the citizen vest (citizen_casual... 2_073_ma/wa...), not V’s: the user’s slip in EDGEmat’s Find view, not a fault |
None |
cr2w_search does not look inside a mesh’s localMaterialBuffer; cr2w_get_node reads it |
For REDcode |
| Three UV Texture Framework mods (left over from an EDGEdeck fix) were deployed at 16:08 | Not a fault: EDGEdeck’s records (deploys/) show the deploys for one mod (15:47, 16:16) touched only it, and 16:08 was a full deploy: EDGEdeck’s Run, which deploys every switched-on mod and starts the game with -modded (the user’s account). The user turned the UV mods off |
EDGEkit one-click setup
The P0 decision (design): EDGEkit sets up the plugin in one click (EDGEkit#5). In an EDGEkit with Claude Code signed in, and the plugin not installed:
| Step | Expected |
|---|---|
| Finish EDGEkit’s first-run steps, answer Set Up to “Set up Claude Code for EDGE?” | Claude Code’s plugin dialog opens on edge (its install link, edgekit://anthropic.claude-code/install-plugin?plugin=edge&marketplace=Edgemodders/EDGEchat) |
| Confirm the marketplace, Install | edge@edgemodders installed (plugins/installed_plugins.json) |
| After the install | EDGEkit opens a new Claude Code session with /edge:setup in the prompt box |
Run /edge:setup |
The servers’ table, as in a VS Code install |
Run 2026-10-26 on the dev PC, EDGEkit 1.140.2 (signed in, Claude Code 2.1.310), plugin 0.0.15. Pass, by the user’s report and EDGEkit’s on #5, after one change in EDGEkit:
| Build | What happened |
|---|---|
da32f12 (the P0 plan) |
EDGEkit wrote extraKnownMarketplaces and enabledPlugins["edge@edgemodders"] into the user settings. Claude Code added the marketplace but installed nothing: claude plugin list said “No plugins installed”. enabledPlugins only turns on an installed plugin (Claude Code’s docs, “Choose an install scope”) |
d342a8b |
EDGEkit opens Claude Code’s install link instead, then /edge:setup once the plugin is installed. Every step above passed. Released in EDGEkit 1.140.2 the same day |
EDGEkit also pointed out that Claude Code leaves auto-update off for this marketplace; the README and setup now say how to turn it on.
Evals: archives-and-cr2w
The P2 test (design): each case runs with the plugin and without it, and the difference (Δ) is what the skill adds. Runs as you, on your Claude login; the plugin’s servers are not started (no mocks), so only the skill is tested. The report stays local with --no-publish; results go to evals/results/, which git ignores.
claude plugin eval . --tag archives-and-cr2w --runs 1 -j 3 --no-publish --trust-plugin
First run 2026-10-23, Claude Code 2.1.302, one run per arm: 3 cases, $0.49, 41 s.
| Case | With | Without | Seen |
|---|---|---|---|
item-to-files (item to its files, in order, with the linking fields) |
1.00 | 1.00 | Without the plugin, Claude gave the same chain from memory, down to colorScale in the .mlsetup |
path-capitals (a replaced file with capitals in its path) |
1.00 | 1.00 | Both named the capitals and the path hash |
edit-app-mesh (components or compiledData) |
1.00 | 1.00 | Both said components |
The skill fired in every run with the plugin. Δ 0.00: general WolvenKit knowledge is already in the model, so this skill adds little. See the design’s P2 note.
Evals: rednode-mods
claude plugin eval . --tag rednode-mods --runs 1 -j 3 --no-publish --trust-plugin
Run 2026-10-25 at 0.0.10, Claude Code 2.1.310, guide copied from REDnode 00c1947 (0.37.0), with development folders and services in the skill, together with --tag new-mod and --judge-model sonnet: 5 cases, $1.16, 71 s, mean Δ +0.95. The three rednode-mods cases Δ +1.00 each as before (hud-widget still names red4ext/plugins/REDnode/apps); money-on-screen +1.00, cheaper-jackets +0.75. money-on-screen again loaded rednode-mods, not new-mod.
First run 2026-10-23, Claude Code 2.1.302, one run per arm, skill copied from REDnode 7e0d9ca (0.32.1): 3 cases, $0.63, 49 s. Δ +1.00: without the plugin, Claude failed every case; with it, it passed every one, and the skill fired each time.
| Case | With | Without |
|---|---|---|
hud-widget (manifest, page and folder for a HUD widget showing V’s position) |
1.00 | 0.00, and no red4ext/plugins/REDnode/apps |
mod-output (where a Node mod’s console.log goes; mod.js with import) |
1.00 | 0.00 |
data-folder (a mod writing into its own folder restarts under hot reload) |
1.00 | 0.00, no pkg.dataDir |
Evals: the whole suite
Every case, three runs per arm, judged by Sonnet. The first runs used the default judge (Haiku), which failed correct answers that were long or covered more than the rubric asked (check-mod found all three planted problems and got FAIL three times; Sonnet passed the same case). Use --judge-model sonnet from now on.
claude plugin eval . --runs 3 -j 6 --judge-model sonnet --no-publish --trust-plugin
Run 2026-11-02 at 0.1.1, before the release, after the wiki was copied again (EDGEweb 842dae8) and the connect-claude and into-the-game rubrics said which correct answers are not failures: 15 cases, all pass with the plugin, mean Δ +0.73, $10.63, 6 min 38 s. connect-claude and into-the-game 1.00 each (Δ +1.00). As before, check-mod and new-mod did not fire on plain prompts (broken-package, money-on-screen pass through the other skills).
Run 2026-11-02, --tag wolvenkit-projects only, after the skill learned REDmods and swaps of undeployed archives: changed-after-swap 1.00 (Δ +0.33), pack-resources 1.00 (Δ 0.00), into-the-game 0.67: the failing answer had every PASS step again, as on 2026-10-27; the judge, a second time.
Run 2026-11-02, --tag rednode-mods only, after REDnode’s guide was copied again from 0.50.2: Δ +1.00 each (data-folder, hud-widget, mod-output), $2.39.
Run 2026-10-27 at 0.1.1 (local, before the push): 15 cases, mean Δ +0.66, $10.31, 5 min 15 s. Two cases short, both checked:
| Case | With | What it was |
|---|---|---|
into-the-game (wolvenkit-projects) |
0.33, then 1.00 in a rerun | The judge. Both failing answers had every PASS step; Sonnet, asked for its reason on one, passed it twice and called archives_reload a rednode tool, not an invented one |
connect-claude (edge-tools) |
0.67, and 0.67 in two reruns | The eval withholds the servers, so setup’s description (“when the tools are missing”) fires and Claude runs its checks instead of naming /edge:setup. In a real session with the servers missing that is right. A stricter edge-tools rule did not change it and was dropped. 0.0.15’s three runs passed |
edgemat-library (edge-tools) |
0.67, then 1.00 in a rerun | One answer added the wiki’s caveat that the library folder also holds EDGEmat’s MCP server; the judges read it as losing something |
Every other case as at 0.0.15 (cheaper-jackets without the plugin: 0.42).
Run 2026-10-26 at 0.0.15, Claude Code 2.1.310, after the skills’ recheck on game 2.5: 15 cases (with edge-tools’s three), mean Δ +0.70, $9.92, 5 min 40 s. Two misses, both from graders out of date, not the plugin: money-on-screen failed one run because its rubric wanted the apps folder and the answer chose a REDnode development folder, which the skills teach from 0.0.10; cheaper-jackets’s checks-tweakdb regex wanted tweakdb_ where the answers said “check it with the TweakDB tools” (seen 2026-10-23 too). The rubric now takes either folder, and checks-tweakdb is an llm grader. Rerun of --tag new-mod with them: both 1.00 with the plugin (cheaper-jackets Δ +0.67, money-on-screen Δ +1.00), $1.62.
| Case | Skill | With | Without (3 runs) | Δ |
|---|---|---|---|---|
hud-widget, mod-output, data-folder |
rednode-mods |
1.00 each | 0 each | +1.00 each |
changed-after-swap |
wolvenkit-projects |
1.00 | 0.67 | +0.33 |
into-the-game |
wolvenkit-projects |
1.00 | 0 | +1.00 |
pack-resources |
wolvenkit-projects |
1.00 | 1.00 | 0.00 |
money-on-screen |
new-mod |
1.00 (after the rubric fix) | 0 | +1.00 |
cheaper-jackets |
new-mod |
1.00 (after the grader fix) | 0.33 | +0.67 |
broken-package |
check-mod |
1.00 | 0 | +1.00 |
edit-app-mesh |
archives-and-cr2w |
1.00 | 0 | +1.00 |
item-to-files, path-capitals |
archives-and-cr2w |
1.00 each | 1.00 each | 0.00 each |
connect-claude, edgemat-library, vortex-switch |
edge-tools |
1.00 each | 0 each | +1.00 each |
As before, new-mod and check-mod did not fire on plain-language prompts (rednode-mods and the others carried the answers); the commands are run as /edge:new-mod and /edge:check-mod, and passed that way in the game.
Run 2026-10-23 at 0.0.8, Claude Code 2.1.302: 12 cases, 10 pass, mean Δ +0.68, $7.91, 5 min 22 s.
| Case | Skill | With | Without (3 runs) | Δ |
|---|---|---|---|---|
hud-widget, mod-output, data-folder |
rednode-mods |
1.00 each | 0, 0, 0 | +1.00 each |
changed-after-swap |
wolvenkit-projects |
1.00 | 0, 0, 0 | +1.00 |
into-the-game |
wolvenkit-projects |
0.67 (one run failed) | 0, 0, 0 | +0.67 |
pack-resources |
wolvenkit-projects |
1.00 | 1, 1, 1 | 0.00 |
money-on-screen |
new-mod |
1.00 | 0, 0, 0 | +1.00 |
cheaper-jackets |
new-mod |
0.83 | 0.25 each | +0.58 |
broken-package |
check-mod |
1.00 | 0, 0, 0 | +1.00 |
edit-app-mesh |
archives-and-cr2w |
1.00 | 0, 1, 0 | +0.67 |
item-to-files |
archives-and-cr2w |
1.00 | 1, 1, 0.33 | +0.22 |
path-capitals |
archives-and-cr2w |
1.00 | 1, 1, 1 | 0.00 |
Seen:
- With three runs,
archives-and-cr2wshows some gain (Δ +0.67 and +0.22), where one run each showed none. new-modandcheck-modnever fired on these plain-language prompts: Claude loadedrednode-modsinstead, which carries the same knowledge, and the answers passed. The commands are for/edge:new-modand/edge:check-mod; the in-game test runs them that way.cheaper-jacketslost points twice onchecks-tweakdb, a regex fortweakdb_: those answers said they would check “with the TweakDB tools” without the tool’s name. The regex is stricter than the rubric means.
Evals: wolvenkit-projects
claude plugin eval . --tag wolvenkit-projects --runs 1 -j 3 --no-publish --trust-plugin
First run 2026-10-23, Claude Code 2.1.302, one run per arm: 3 cases, $0.47, 40 s. Δ +0.33.
| Case | With | Without | Seen |
|---|---|---|---|
into-the-game (the steps and tools from an edited project to the game) |
1.00 | 0.00 | Without the plugin, Claude did not know the EDGE servers’ flow |
pack-resources (.xl and tweak files missing after project_pack) |
1.00 | 1.00 | The prompt said project_pack ran on source/archive, which gives the answer away |
changed-after-swap (EDGEdeck reports a hot-swapped archive) |
1.00 | 1.00 | The prompt described keep and restore; plain Claude reasoned it out |
The two Δ 0 cases test reasoning from a detailed prompt more than knowledge. They stay as they are: rewording prompts until plain Claude fails would only flatter the skill.
Evals: edge-tools
claude plugin eval . --tag edge-tools --runs 3 -j 6 --judge-model sonnet --no-publish --trust-plugin
First run 2026-10-26, Claude Code 2.1.310, plugin 0.0.12 (the wiki copied from EDGEweb 8b425af), three runs per arm: 3 cases, $1.78, 51 s. The skill fired in all 9 runs with the plugin. Mean Δ +0.93 as run; +1.00 without the regex grader removed after it (below).
| Case | With | Without | Seen |
|---|---|---|---|
vortex-switch (moving from Vortex to EDGEdeck, and back) |
1.00 | 0.00 | Without the wiki, Claude did not know EDGEdeck’s Import from Vortex, the purge first, or Undo deploy |
edgemat-library (where the library is, game updates, deleting it) |
1.00 | 0.00 | Without it, a wrong folder or a guess |
connect-claude (connecting Claude Code, the plugin installed) |
0.78 | 0.00 | The judge passed all 3 answers with the plugin: /edge:setup, REDnode’s MCP server switch. A regex grader for “no claude mcp add” failed 2 of them, which only warned to remove servers added by hand that way. The regex was removed; the rubric fails real advice to add servers by hand. Without the plugin, Claude gave claude mcp add steps |
rednode-mods in the game
What the evals cannot show: Claude building a package in the running game with the skill and the rednode server. Plugin 0.0.6 or newer, the game at a loaded save, Hot reload on in the REDnode launcher’s Settings panel (the gear at the right of the Theme row). In a new session:
Make me a small REDnode HUD widget at the top of the screen that shows V’s position. Build it in my game and check it works.
| Check | Expected |
|---|---|
| Before writing | It looks up the game functions it uses (gameapi_lookup) |
| Where | A folder in red4ext/plugins/REDnode/apps/, with rednode-app.json ("kind": "hud") and a page; Claude Code asks before writing |
| After writing | It checks the package with apps, logs or a screenshot, and says what it checked |
| In the game | The widget shows V’s position at the top of the screen |
First run 2026-10-23 on the user’s laptop, in the VS Code extension, plugin 0.0.6, REDnode 0.32.1: pass, in the user’s words “it showed up properly and worked”. The package folder can be deleted afterwards.
init-project on a real project
Run 2026-10-26 by the user on the dev PC: plugin 0.0.14, game 2.5, REDnode 0.40.1, REDbridge 0.11.0. Pass, by the user’s report; the details were not recorded. Run on the mod made in new-mod in the game.
In a session with the plugin, in a WolvenKit project (for example one under E:\Modding\Cyberpunk 2077\Projects) and in a REDnode package folder:
/edge:init-project
| Check | Expected |
|---|---|
| What it finds | The project’s kind from its files, and the frameworks from source/resources |
An existing CLAUDE.md |
It asks before changing it and adds an ## EDGE section |
| The paths it writes | Only ones in skills/init-project/layouts.md or the project itself |