I read this as a final read-only onboarding audit - I will inspect the implementation and installed artifact, run the required disposable checks, and report only an unconditional pass or concrete blockers.


I read this as a final read-only onboarding audit - reporting the verified release gate result.

**BLOCKED**
blocker_count: **1**

1. The exact reproducible r35 installed wheels fail the required six-test onboarding gate: **5 passed, 1 failed**.
   `test_claimed_customer_registers_disabled_without_other_role` finds an unexpected `trainer` field in the registered customer row, violating the owner/customer-only registration contract. The wheel's `customer_admin.py` matches the r35 snapshot, so this is an artifact defect.

Verified clean: build reproducibility, live profile/data/customers/config/registry no-follow private owner/mode boundaries, and no live writes or messages.


I read this as an evidence-only follow-up - I will identify the recorded failing command and the exact wheel-source emission site without executing tests or changing state.


I read this as an evidence-only trace request - reporting the recorded failing gate and exact serialization site without rerunning it.

- Failing test:
  `/home/cube/projects/richard/hermes-agent/tests/gateway/test_telegram_customer_bootstrap.py`
  `test_claimed_customer_registers_disabled_without_other_role` at lines 207-259; failing assertion at line 250.

- Recorded installed-wheel command:
  ```bash
  cd "$work/tests"
  HOME="$work/home" XDG_CACHE_HOME="$work/home/cache" XDG_CONFIG_HOME="$work/home/config" TMPDIR="$work/tmp" PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 DUALCOACH_PROFILE_PACKAGE="$work/profile" PYTHONPATH="$hermes:$work/profile" /home/cube/projects/richard/hermes-agent/.venv/bin/python -m pytest -p no:cacheprovider --import-mode=importlib -q test_telegram_customer_bootstrap.py
  ```
  Where `hermes` was the r35 build-1 `hermes_agent` wheel and `profile` was the extracted r35 build-1 `physique_checkin_cli` wheel. Result: `5 passed, 1 failed`.

- Production emission path:
  - Field declaration:
    `.../checkin_cli/customer_coaching.py:962`
    `trainer: TrainerAssignment | None = None`
  - Serializer that emits it:
    `.../checkin_cli/customer_admin.py:670` `_register_customer_locked()`
    line **727**: `customers.append(customer.model_dump(mode="json"))`

  The serializer does not exclude unset/`None` fields, so the `CustomerSpec.trainer` field is persisted into the registered row. The tested wheel member matches the r35 snapshot source.