run-sim-identity.sh (the bf-2m534/bf-gdfwx THIRD-link acceptance harness)
exit-0s against the live hardware-free runtime: a served /api/blobs blob
carries non-empty canonical identity — personName="Alice",
assignedColor="#ec4899", identityResolved=true, identity_source="ble" —
corroborated by GET /api/ble/matches (blob_id=7, Alice, conf=0.600). No
panic. Records the captured JSON + exact flags/sequence in
notes/hardware-free-runtime.md so the capstone is reused, not re-derived.
Co-Authored-By: Claude <noreply@anthropic.com>
bf-1yr1w criterion 3: the --ble opt-in must be recorded in the canonical
runtime script (not a fork). scripts/run-sim-local.sh now carries an
opt-in env passthrough:
SIM_BLE=1 ./scripts/run-sim-local.sh # appends --ble to the sim invocation
./scripts/run-sim-local.sh # default: --ble OFF, CSI->blob path unchanged
Default-off preserves the script's existing gate (CSI->blob). The --ble +
fixture + matcher gate remains scripts/run-sim-ble-match.sh; only the
opt-in itself is added here. A matching "--ble opt-in (SIM_BLE=1)"
subsection is added to notes/hardware-free-runtime.md so the recipe is
recorded there, not only in the fixture note.
Also chmod +x scripts/run-sim-ble-match.sh: it was committed non-executable
(mode 100644), so its documented invocation (./scripts/run-sim-ble-match.sh)
failed with EACCES. Now 100755 like the other run-sim-*.sh scripts.
Re-verified PASS (fresh run, 2026-07-08): bash scripts/run-sim-ble-match.sh
-> exit 0, GetMatch() returns "Alice" for blob_id=7 (confidence=0.714,
is_ble_only=false) via /api/ble/matches; 0 rejects, no panic. This is the
evidence for criteria 1+2: the bf-21v71 wire fix (GetMatch() copied onto
the served slice) fires for the sim fixture and resolves the seeded person
onto a live CSI blob.
Hygiene (change is shell+md+mode only, zero Go source): go vet ./... clean;
go test ./internal/... ./cmd/... all ok. The containerized integration
packages (test/acceptance, tests/e2e) are unaffected and tests/e2e remains
deliberately RED per notes/hardware-free-runtime.md (gated on bf-4q5w /
bf-5jeo), not a regression of this shell+md change.
Co-Authored-By: Claude <noreply@anthropic.com>
Bead-Id: bf-1yr1w
Add a "BLE identity matcher (--ble)" subsection to
notes/hardware-free-runtime.md capturing the working --ble opt-in recipe
that scripts/run-sim-ble-match.sh exercises, so the parent capstone
(bf-2m534 / scripts/run-sim-identity.sh) reuses rather than re-derives.
Closes the bf-1yr1w acceptance gap: the --ble opt-in was documented only
for the FIXTURE (notes/ble-identity-fixture.md), not the matcher script.
Records: the script + the sim --ble invocation it runs; env params; the
key gotcha (SIM_WALKERS=1, NOT run-sim-local's 2 -- with two walkers the
nearest CSI blob is the second walker's, ~1.73m off, killing matchConf
below the 0.60 gate); the /api/ble/matches observation surface
(identityMatcher.GetAllMatches); and PASS evidence captured at HEAD
(blob_id=7, person_name=Alice, confidence=0.714, is_ble_only=false).
Links ble-identity-fixture.md for the fixture half rather than duplicating.
Also commits scripts/run-sim-ble-match.sh (child-2 artifact, was untracked)
so the recipe is reproducible at HEAD.
Verified at HEAD 7757149: bash scripts/run-sim-ble-match.sh -> PASS
(exit 0, blob_id=7 conf=0.714); go vet ./mothership/... clean.
Co-Authored-By: Claude <noreply@anthropic.com>
Bead-Id: bf-12h75
The bf-14wx5 deliverables were written but uncommitted (stuck-open-but-done —
auto-split fired at failure-count:3 only because the templated br close --body
had been failing). Commit the focused set so the bead is genuinely closable.
Adds:
- scripts/run-sim-ble-fixture.sh — canonical, self-verifying fixture: starts a
fresh-data-dir mothership, registers a person (POST /api/people), binds the
sim's advertised AA:BB:CC:DD:EE:00 (walker 0) via preregister + PUT, and gates
on GET /api/ble/devices?registered=true showing person_id/person_name in BOTH
phases.
- notes/ble-identity-fixture.md — reuse-note recording the exact REST sequence,
the observed sim BLE address convention (AA:BB:CC:DD:EE:%02X per walker, ids
from 0), and the answer to "must the device be seen-live first?": NO —
PreregisterDevice sets last_seen_at=now so it falls inside the
GetDevicesSeenInHours window with no live sighting, and the binding survives
live sim --ble advertisements (ProcessRelayMessage upserts never touch
person_id).
Verified 2026-07-08 at HEAD 36b9729: ./scripts/run-sim-ble-fixture.sh PASSes
phaseA (bind with NO live adv) and phaseB (binding survives live adv), exit 0.
All four acceptance criteria met; deliberately excludes scripts/run-sim-
identity.sh (parent bf-2m534 capstone) and notes/hardware-free-runtime.md
(bf-40hc re-verify).
Bead-Id: bf-14wx5
Adds the single canonical reproduce for the working end-to-end runtime path
(sim connect -> CSI ingest -> phase/fusion -> tracked blob), so later beads
(e.g. bf-f841 blob-identity runtime checks) and reruns reuse it instead of
re-deriving the command sequence or the rate tuning that caused bf-40hc's
repeated failures.
- scripts/run-sim-local.sh: builds mothership + canonical sim
(mothership/cmd/sim, the one with --verify) from source, starts the
mothership on an ephemeral port/data dir, streams simulated CSI, and gates
on peak>=1 blob via GET /api/blobs. No hardware/Docker/manual IP/manual token.
- notes/hardware-free-runtime.md: full reproduce sequence, the two gotchas
(two cmd/sim packages; rate=30 not 20), the token path, env/params, and the
determinism contract.
Verified clean-checkout run at HEAD 5bbe52c: peak_blob_count=2, first blob
@1s, sim --verify PASSED, 0 rejects, ~363 FPS, exit 0. Closes the chain
bf-3zll -> bf-3hji -> bf-51fq -> bf-5cr3.
Co-Authored-By: Claude <noreply@anthropic.com>