A view, not a fence

Player or tester

Runnable experiences, access requirements, and a short path to reporting what happened.

Your question: What can I try, and where does useful feedback go? Start here, then cross the lane whenever something catches your eye.

Choose another lens

Start in your lane

local-only

Steam Self-Service Join

An invite link, a Steam sign-in, and a mod-pack zip with your credentials already in it — no config file to hand-edit.

portal

Baseline

The public hub for the repository map, durable decisions, evidence, corpus, and discovery surfaces of the Valheim project fleet.

local-only

Quest Lab Turnkey Package

An arcane tome in-game that teaches you exactly what quests are possible, letting you practice writing them before trying them out for real.

live

Quest Picker + Absorption Engine

Turns a guild's real quest tracker into a single offline page where a player checks the quests they care about — and the game mod reads the result.

Recent work touching this lane

Gateway image m31-questlab-20260808-r1 cut and rehearsed locally: the tome mount contract holds on a real image

Cut a Gateway-only release (image m31-questlab-20260808-r1, still admitting the frozen mod m30-rolecontrol-20260723-r1) and rehearsed it locally rather than on the public origin. The route answered 200 where production 404s, X-QuestLab-Sha256 equalled the mounted file's digest -- proving it serves the mount and not the image copy -- and editing the mounted file changed the served digest with no restart, proving the mtime re-read. The onboarding, lab_target step and the hooked-vs-bound note all served. Two recreate traps recorded in the Publish-WorkbenchAssets header: the app reads a plain Urls config key that beats ASPNETCORE_URLS, and without it the host binds localhost inside the container -- status Up, Now listening in the log, no errors, and every request through the published port returns an empty reply. And the Postgres connection errors on startup are normal for this container, which carries no connection string and serves the static pages anyway. Promote-GatewayImage.ps1 cannot ship this: it targets comfy-p7 with a compose root, an environment file and a container name that do not exist on the AM4 host, and that VM is terminated. Delivery to lj-workbench has no tooling yet.

The questlab route is a 404 in production, the publish lane is correctly blocked, and lj-workbench has no definition outside itself

Chasing the container env var for the tome mount turned up three things. (1) /questlab returns 404 on the public origin: the running image is lumberjacks-gateway:m31-workbench-20260729-r2, pinned since 2026-08-01, and predates the route entirely -- so publishing questlab.html to the mount fixes nothing, and the earlier claim that this needed only an env var and a container recreate was wrong. It needs a Gateway image cut and promote. (2) The catalog's nav has been linking to that 404 since the questlab nav entry shipped; adding it to NAV_ROUTES today caught it, and because verify-live is Gate 4 the publish script now fails closed rather than shipping a page that links to a 404. (3) docker inspect shows lj-workbench carries no com.docker.compose.* labels, and no compose file exists in baseline, lumberjacks or isolate -- it was started by a bare docker run, so the only definition of a live public container was the container itself. Full spec captured in the Publish-WorkbenchAssets.ps1 header.

Combat and the quest lane verified in a live Valheim session; the run found a bug in the lab's own why-didnt-it-fire line

First in-game run of the quest lane. All four combat seams fired in one fight (OnDeath, Damage, RPC_Damage, Stagger), so combat joins harvest as witnessed. Startup logged '2 quests loaded (1 armed)' and the seeded quest completed twice on Greyling kills, with the Quests tab reporting fired-2-times and a live cooldown. The creature-naming fix showed correct: console printed $enemy_greyling with no prefab name beside it, because the token already contains Greyling. FOUND AND FIXED: the last-kill diagnostic read 'matched nothing' for a kill that matched fine but was on cooldown -- OnCreatureKilled returns empty for both cases -- which sends a creator to edit a target that was never wrong, the exact wrong-place-to-look failure the line exists to prevent. It now names the quest and the seconds remaining, deciding would-this-have-matched by dry-firing the real matcher.

Turn two of the Quest Lab's manual in-game checks into automated ones, and mutation-check that the regression test actually bites

The creature-naming rule -- the load-bearing half of the 08-07 bug fix -- was pure string work living beside Character and HitData, so the only way to check it was to launch Valheim and kill something. Extracted to Core/LabCreatureNaming.cs, Unity-free and linked into ComfyNetworkSense.Tests; LabKillWatch and LabObserve.Clean now delegate to it so there is one home for the rule. The Greydwarf_Elite vs $enemy_greydwarfbrute case is a test rather than a ritual. Also tested LabQuestSeed.EnsureSeeded, whose never-overwrite guarantee protects a creator's authored quests from a re-run of lab_setup and had zero coverage -- including that the check is keyed on any *.json, so a renamed draft also suppresses the seed.

Explore everything, including work outside this lens →