# M6 — PACER 0.5.1: version-stamped surfaces

> JIT plan for request [#13](https://github.com/BigscreenVR/spt-pacer-tool/issues/13)
> (field origin: doyle's displaced-image incident, 2026-07-27 — a resident ran pre-0.5.0
> bits for hours and nothing pacer said revealed it). Version 0.5.1;
> `min_spt_core_version` stays `0.44.0`.

## Scope

1. **Education carries the version.** The onboarding body ends with a `— pacer vX.Y.Z`
   stamp, so the provenance of any onboarding text in an agent's scrollback is
   self-evident (doyle's incident becomes a one-glance diagnosis).
2. **Status answers the version.** The `status` verb's answer carries `pacer vX.Y.Z` —
   the on-demand discriminator doyle asked for ("tell me an op to query PACER-0's
   running version").
3. **Drift gate.** A unit test pins `manifest.toml` `version` == `CARGO_PKG_VERSION`
   (the two are bumped by hand in the release runbook; the gate makes a split
   impossible to ship).

## Rulings (mine, posted to #13)

- The scoped-out half: "re-educate on version change" was a false premise — first-online
  education fires on every resident start (`main.rs`), so a *current* resident never
  serves stale text. Only a displaced image does, and the new binary can't fix a process
  it isn't running in. Detection, not re-education, is the deliverable.
- Per-resume stretch reports stay **unstamped** — recurring noise; `status` answers the
  question on demand. Doyle invited to push back.
- Version source = `env!("CARGO_PKG_VERSION")` (compile-time, matches the running
  image by construction — an installed-manifest read would reproduce exactly the
  displaced-image confusion this milestone kills).

## Tasks

1. `traceable-reqs.toml` [doc]: add `REQ-PACER-VERSION-STAMP` (stages doc/impl/unit).
   `CONTEXT.md` glossary: **version stamp** (why compile-time, not manifest-read).
2. `education.rs`: append the stamp to `build_body()`. Unit: body contains
   `env!("CARGO_PKG_VERSION")`; existing assertions untouched. [impl+unit]
3. `main.rs` status path (or `state.rs` suffix): stamp the status answer. Unit: the
   assembled status line carries the version. [impl+unit]
4. Drift gate test: parse `manifest.toml` (compile-time `include_str!`), assert its
   `version` equals `CARGO_PKG_VERSION`. [unit]
5. Manifest + `Cargo.toml` → 0.5.1; CHANGELOG `[0.5.1]` (Added: version stamp on
   onboarding + status; the why in one line).
6. Gates: `cargo test`, `traceable-reqs check`, pack + schema-validate.
7. Release per `docs/RELEASE-RUNBOOK.md`; `spt adapter update PACER`; canary re-check;
   restart instance; live E2E — status answer shows `pacer v0.5.1`, fresh onboarding
   stamped.
8. #13: greenlit (plan committed) → wip → acceptance (release verified) → done (E2E).

## Gate

Build + `cargo test` + `traceable-reqs check` green; release digest-verified; status
E2E shows the stamp; #13 at done.
