Files
last-hearth/docs/m1-verification.md
T
2026-11-03 12:41:09 -05:00

77 lines
6.7 KiB
Markdown
Executable File

# M1 implementation and evidence — The Last Hearth
Updated: 2026-11-02. Scope: M1 implementation and available automated/native
checks. **Not a human-playtest report or milestone acceptance.** M2 implementation
is proceeding under explicit user direction while M1 human acceptance stays open.
M0 evidence remains in [m0-verification.md](m0-verification.md); current sequence
is summarized in the [roadmap](roadmap.md).
## M1 implementation present
| Area | Implemented | Boundary |
| --- | --- | --- |
| Movement | `mods/hearth/movement.lua` applies bounded frame-time steps, smooth speed transitions, sprint intent/recovery lockout, stamina, wet slowdown, water pace, and spear brace. Runtime samples support/water/vertical velocity and changes only the engine speed multiplier. | Engine still owns character physics, camera, collision, prediction and networking. This is not a custom movement controller or full anticheat. |
| Tool interaction | Original B3D player rig with six animated clips and a right-hand bone; fixed-whitelist attached knife, axe, pick and spear visuals; contextual target/dig/placement preview; material step/dig/landing sounds. | First-person/third-person visibility depends on the native Luanti renderer. Camera motion is opt-in static FOV only; no imposed camera bob. |
| Combat | Weapon-specific reach, cooldown, stamina, wear, aim cone, line of sight and short recent-displacement plausibility check; three-phase opponent wind-up, strike and recovery; opt-in evasion/brace; non-lethal two-health floor, arena leash and disengagement. Production refuses developer spawn commands. | The moving opponent is a deterministic one-step sparring opponent, not wildlife AI or a network-robust competitive combat system. No true latency compensation. PvP stays disabled. |
| Course | Fixed-volume movement/interaction route with halves, doorway, pool, falls, material/tool and build stations, arena and ordered checkpoints. Generator exists only in a fresh nonce-marked local/staging course world. The engine-load preflight rejects non-live users and observed all 41,041 course-volume nodes unchanged. Mock tests exercise consenting generation/checkpoints; a live player must opt in with `/course`. | The native preflight intentionally did not generate or traverse the course. Its timing report is server-step intervals and Lua callback wall duration, **not** client FPS or CPU profiling. |
| Assets/audio | Deterministic generated B3D animation, four held-tool meshes, skin/material PNG and hash-pinned original mono Vorbis sounds. | Optional FFmpeg decode/regeneration test was not run; the package's Ogg framing/CRC/hash checks did run. No third-party sound/mesh was downloaded. |
| Feedback | Readable action/status HUD, contextual placement/tool hints, hit/counter/brace notices and material-specific sound feedback. | Individual comfort/accessibility and readability still need external playtesting. |
## Verification performed on the current M1 source
- **Node:** 31 tooling/asset tests pass, 0 fail. This includes reproducible assets,
packaged Ogg validation, animation/model geometry, safe staging/course launcher
behavior, production fixture denial, and packaging/backup path tests.
- **Lua in real Luanti 5.18.0:** 36 Lua files compile; 13 isolated suites pass,
**228 total checks** covering clock, combat, construction, content, course
security/geometry, encounters, movement, persistence, player lifecycle,
presentation cleanup, runtime safety, schema and the pure model.
- **Engine smoke:** pass. Real game bootstrap, M1 API/entity registration, recipes,
terrain/resources and enclosure test pass. Package identity marker matches the
exact staged package. No persistent survival world is opened by `test`.
- **Native `test:course`:** pass. Fresh local/staging nonce checks, native module
registration and no-consent refusal verified; 41,041 ordinary map nodes remain
byte/param-identical before and after the probe. It does not create terrain, grant
a kit, emulate a player or claim movement/combat/client rendering was exercised.
- **Interactive GUI:** one disposable summer course session has been launched on
the current Windows host for hands-on testing. A normal screenshot/engine startup
is not evidence that the route was traversed or that movement/combat is fun.
- **Environment:** current host uses Luanti 5.18.0 and integrated graphics driver
NVIDIA 596.47. No clean-machine, other-OS, multiplayer-client, FPS, frame-time,
memory, network-latency, server-load, controller, audio-listener or user-study
measurement is claimed.
## Manual M1 acceptance still required
1. In the disposable course, wait for the guide/arrival to finish and run
**`/course`**. This explicitly generates the bounded layout and gives a temporary
kit; until that command, terrain is deliberately untouched.
2. Traverse the ten ordered route checkpoints at walking and sprint pace. Repeat
troublesome stations and note terrain, slope, doorway, water, falling and
collision-snags with exact reproduction steps.
3. Try each held tool and attack a target. Run `/spar` for the moving opponent;
strike to consent to a round, step aside/back to evade, and face + hold RMB with
the spear to brace. Compare this with stationary `/practice`.
4. Use **`/course report`**; interpret the displayed values only as server globalstep
interval and course-callback duration. Capture client FPS/frame time separately
with actual client instrumentation; do not infer them from the report.
5. Invite several real testers. Ask whether they voluntarily repeat any movement,
interaction, or encounter. Record controls, host/device, frame-rate settings,
sample period, achieved latency/jitter/loss, player count, defects and observations.
6. Make a written, evidence-based decision: stock Luanti is adequate for this slice,
or a narrowly scoped engine API/client spike addresses a reproduced blocker.
The course uses a synthetic **45°N, 0°E summer/clear fixture only**; this is not the
community-world location. Production remains separate. Current `/spar` is allowed
only in local play or server-privileged staging; never in production.
## M1 disposition
Implementation, packaging/asset tests and automated/native preflight gates are
complete for this M1 scope. The **roadmap exit gate is not accepted yet**: several
testers have not been evidenced as voluntarily repeating play, there is no measured
performance/network matrix, and the stock-versus-custom decision lacks human
measurement. Subsequent M2 implementation does not change this status. No player
telemetry is automatically uploaded; share only voluntarily and omit private
location/account data from reports.