Serfbound is a browser-native remake delivered through the PMO roadmap in
pm/roadmap/serfbound/. Contributions are welcome when they preserve the core
rules of the project: no bundled original game data, no .NET product runtime,
and evidence for every shipped change.
From a fresh clone:
source ~/.nvm/nvm.sh
nvm use
npm ci
npx playwright install chromium
git config core.hooksPath .githooksThe hook path matters. The PMO pre-commit hook checks that commits carry the
contract evidence described below. Do not use --no-verify.
Start with the data-free checks:
npm test
npm run ci:releaseUse narrower commands while iterating:
npm run test:unit
npm run test:browser
npm run check:boundaries
npm run check:independence
npm run check:design
npm run check:media
npm run check:links
npm run check:licensed-assets
npm run test:docsnpm test and npm run ci:release must pass without serfbound-local-data/
and without any original DOS or Amiga files.
Serfbound does not commit, host, download, or redistribute original DOS/Amiga
game data. Do not commit SPAU.PA, extracted sprites, music, sounds, disk
images, original executables, or unlicensed converted original assets.
Real-data checks are opt-in and local only:
npm run build
SERFBOUND_RUN_LOCAL_ASSET_TESTS=1 \
SERFBOUND_SPAU_PA="serfbound-local-data/sources/TheSettlersDemo/Serf-City-Life-is-Feudal_DOS_EN/SPAU.PA" \
npm run test:local:assetsIf you need screenshots from real local data, use the documented capture
commands in docs/developer-guide.md. Evidence may cite summaries and artifact
paths. It must not include raw original data.
Small typo fixes and narrow maintenance changes can be ordinary PRs, but the
commit hook still requires .tmp/CONTRACT.md with every checkbox set to [x].
Substantial product, test, release, or roadmap work should follow the roadmap story flow:
- Read the relevant
story-*.mdfile underpm/roadmap/serfbound/. - Make the code or docs change.
- Run the commands that prove the change.
- Add or update the matching
evidence-story-{n}.md. - Flip the story status to
doneonly when the acceptance criteria are met. - Update
current-phase-status.mdandpm/roadmap/serfbound/README.md. - Let the pre-commit hook run normally. Do not use
--no-verify.
If you are not sure whether a change needs a PMO story, open an issue first and link the files you expect to touch.
Bug reports should include:
- Browser and version.
- Device type and whether the app is installed as a PWA.
- Whether the run used no data, imported local
SPAU.PA, a licensed package, or a custom map. - The in-game
Copy error reportoutput when available.
Never attach original game data to an issue.
Feature requests should explain the player value, name the likely PMO phase or evidence pointer if known, and call out any browser boundary involved: rendering, storage, audio, input, network, packaging, or local data.
Good starter tasks are tracked with the good first issue label:
good first issue
Before opening a PR:
- Keep the scope tied to one story or one small maintenance fix.
- Add or update tests for behavior changes.
- Run the most focused checks first, then the relevant gate command.
- Keep generated media and phase artifacts small and intentional.
- Confirm no original DOS/Amiga data or unlicensed converted assets are staged.
- Fill out
.github/pull_request_template.md, including the PMO story and verification commands.
Be direct, specific, and respectful. The project is evidence-first: challenge claims with tests, source references, or reproducible steps.