Offline bot training

Train a mind for the Wilds

Observe → teach → train → trial → play. Build a learned Fenwild bot on your own machine, then send only ordinary player decisions into the game.

Brain forgeLOCAL
108 synthetic examples27 scenarios0 training servers
The brain forge

Real training. Player rules. Your hardware.

The Pilot SDK turns confirmed play into a versioned local dataset, fits a small supervised model, evaluates it against independent journeys, and loads the resulting artifact as an ordinary PilotBrain. It is real machine learning—multiclass linear softmax—not an LLM and not a secret resident service.

108synthetic examples

Identity-free CC0 demonstrations you can inspect, copy, and replace.

27scenarios

Healing, banking, resting, combat, waiting, loot, resources, run control, and death.

3honest splits

Train, validation, and test evidence stay explicit in every frame.

0hosted gyms

No production replay service, model upload, training endpoint, or database access.

Reference model, not resident magic.

The included brain proves the complete toolchain and compatibility contract. Your advantage comes from better journeys, teachers, candidates, trainers, and evaluation—not private Fenwild data.

Training loop

Six stations from first sight to first fight

01

Observe

Read the same typed world snapshot available to an ordinary player client.

02

Teach

Choose one legitimate action. Only authority-confirmed decisions become examples.

03

Split

Keep independent journeys for training, validation, and the final test.

04

Train

Fit the deterministic reference model—or your own trainer—on local CPU.

05

Trial

Challenge the artifact against held-out scenarios and public thresholds.

06

Play

Run the chosen brain through one scoped token and normal game authority.

Collection is the only learning step that needs a live character. Conversion, merging, training, evaluation, and the public benchmark are local-file and local-CPU operations. play reconnects only after you choose an artifact.

Journey-level holdouts

Do not let tomorrow's test leak into today's lesson

Collect separate journeys for fitting, tuning, and the final verdict. Adjacent ticks from one run are highly correlated, so Fenwild preserves each journey's split instead of randomly scattering nearby frames across train and test.

export FENWILD_AUTOMATION_TOKEN="the-one-time-secret"

npx --no-install fenwild-pilot-training collect \
  --out train.json --id mossmere-train --split train
npx --no-install fenwild-pilot-training collect \
  --out validation.json --id yard-validation --split validation
npx --no-install fenwild-pilot-training collect \
  --out test.json --id wilds-test --split test

npx --no-install fenwild-pilot-training merge \
  --inputs train.json,validation.json,test.json \
  --out my-corpus.json --id my-held-out-corpus
A unique quest name for every run.

merge rejects duplicate scenario or frame IDs, incompatible schemas, oversized corpora, and split mismatches before training begins.

Public proving ground

Make the brain earn its deployment

Start with benchmark. It validates the shipped corpus and its fingerprint, the reference model's feature schema, and the acceptance thresholds without a token or network connection. Then train your corpus and judge the untouched test journeys.

fenwild / brain-forgeoffline
npx --no-install fenwild-pilot-training benchmark

npx --no-install fenwild-pilot-training train \
  --input my-corpus.json \
  --out my-brain.json

npx --no-install fenwild-pilot-training evaluate \
  --model my-brain.json \
  --data my-corpus.json \
  --split test

npx --no-install fenwild-pilot-training play --model my-brain.json
Local CPUVersioned artifactAuthority on play

The loaders fail closed on unknown fields, non-finite weights, invalid labels, incompatible versions, and choices outside their candidate set; training refuses work beyond the bounded local compute budget. A passing test score is evidence for the journeys you authored—not permission to assume every corner of Fenwild is solved.

Resident contenders

Fork a resident head without forking the runtime

The zero-install path starts with a live resident Pilot. Open its modeless Console and choose Teach. That view keeps the fresh moments when the planner compared at least two safe goals; a committed plan remains observable but is not falsely presented as editable. Open Teach this decision, pick one of the exact alternatives already admitted by the Go planner and safety shield, then choose how to use it. Do this next time applies one short-lived preference without writing training data. Save as training example separately records your exact pairwise preference on this device; it never changes the running brain.

After taking back control, open Game → Resident Pilot → Training & local data. Build improved bot fits a bounded correction in an isolated Go/WASM worker, repeats the public evaluation, and makes a new data-only v2 bot selectable. Each generation accepts at most 32 confirmed decision examples. The certified G45 parent remains immutable, and only family transitions you actually demonstrated may override its choice.

Choose Download bot data when you deliberately want to keep or share the contender artifact. Learning uploads nothing by default. Existing v1 data-only contenders remain importable and become v2 when locally forked.

Import in the same Game → Resident Pilot panel loads a downloaded contender. Fenwild's source-built contender tool is maintainer-only and is not distributed, so every player contender workflow happens in the game.

Compatibility is not a victory certificate.

The Deck repeats the declared evaluation before loading the artifact, proving that it is bounded and executable—not that it outperforms its parent on your character. Your account's real public observations and outcomes are the honest test.

A contender changes local model data only. The official Go/WASM planner, durable project executor, safety supervisor, public SDK connection, and server validation remain unchanged. This convenient Deck workflow does not constrain independently owned SDK bots: they may keep using any local or self-hosted runtime through the same public protocol.

Custom teacher

Teach the behavior you actually value

The built-in teacher is intentionally modest. Point collect at a local ESM module to demonstrate your own choices. The module receives an ordinary typed observation and returns one public action; only actions authority accepts become examples.

// teacher.mjs — a cautious, hometown-aware starting teacher
import { yardTrainer } from "@fenwild/pilot-sdk/brains";

export default function decide(observation) {
  return yardTrainer(observation);
}

// Collect through the ordinary live player boundary:
// npx --no-install fenwild-pilot-training collect --teacher ./teacher.mjs ...
The included model learns the verb, not the target.

It predicts which action type to take. play offers it only the reference candidates—observe, heal with a carried potion, rest at or head to the Bank, enable run, loot, gather, or attack the nearest living NPC of any kind—so this teacher's trainer-only targeting is not reproduced. Routes, economy loops, social play, or your own targeting need your own candidates (predictPilotAction accepts a list) or your own trainer inside a PilotBrain.

Strategy author

Write a deterministic teacher, collect clean outcomes, and train the included linear model to choose among the reference verbs.

ML builder

Consume the versioned JSON schema with your own trainer, then adapt its result into a local PilotBrain.

Experimenter

Compare artifacts on the same frozen holdouts and keep the incumbent when a challenger regresses.

Operator

Supervise one character per controller, bound shutdown, and treat unknown outcomes as unknown.

Production safety

The game stays a game server

On your machine

  • Recordings and identity-minimized datasets
  • Feature extraction and model fitting
  • Holdout evaluation and benchmarks
  • Private, crash-atomic model files

At Fenwild authority

  • One scoped realtime character session
  • Current player-visible observations
  • Rate-limited ordinary player actions
  • Accepted, rejected, or unknown outcomes

Never offered

  • No training server or reset/step gym
  • No source code or database access
  • No model upload or hosted inference
  • No resident corpus, holdouts, or hidden state
  • Local documents are size-bounded, version-checked, written with owner-only permissions, and replaced atomically only when --force is explicit.
  • Training work has a deterministic compute ceiling; oversized example/label/epoch combinations fail before the expensive loop.
  • Only collect and play accept the scoped automation token. benchmark, merge, train and evaluate are tested with networking disabled.
  • Personal datasets still reveal inventory, progression, and visible surroundings. Keep them private even though player identities and chat are stripped.
Open exact training signatures