# Wizard Houses Launch Report — 2026-03-29

Purpose:
Record the first real launch of the Ezra and Bezalel wizard houses, with exact world-state proof, current blockers, and the remaining cutover path.

## Summary

Delivered:
- Ezra house launched on the Hermes VPS
- Bezalel house launched on the TestBed VPS
- Ezra configured as a Hermes house with an OpenClaw sidecar shell
- Bezalel configured as a pure Hermes forge house
- canon, house charters, and deployment doctrine committed into `timmy-home`

Not yet complete:
- acceptance criteria requiring four-way Telegram discussion are still blocked on BotFather bot creation through Alexander's real Telegram user session
- live model-response proof from each wizard house is not yet considered final-world-state complete
- Ezra's OpenClaw sidecar is installed and wired, but not yet accepted as fully proven for the Telegram scenario

## Branch / repo proof

Repo:
- `Timmy_Foundation/timmy-home`

Branch:
- `alexander/wizard-houses-ezra-bezalel`

Key commits on this branch:
- `2d48b38` — `docs: define and launch Ezra and Bezalel houses`
- `85cde7b` — `docs: add wizard telegram bot cutover plan`

These commits contain:
- `specs/timmy-ezra-bezalel-canon-sheet.md`
- `specs/hermes-ezra-house-charter.md`
- `specs/hermes-bezalel-house-charter.md`
- `specs/wizard-vps-houses-deployment.md`
- `specs/wizard-telegram-bot-cutover.md`
- `scripts/wire_wizard_telegram_bots.sh`

## Host allocation

### Ezra
- host name: `Hermes`
- public IP: `143.198.27.163`
- role: repo / architecture / Gitea wizard house

### Bezalel
- host name: `TestBed`
- public IP: `67.205.155.108`
- role: forge / test / optimization wizard house

## Filesystem layout proof

### Ezra host
Observed directories:
- `/root/wizards/ezra/hermes-agent`
- `/root/wizards/ezra/home`
- `/root/wizards/ezra/openclaw-workspace`
- `/root/.openclaw-ezra`

### Bezalel host
Observed directories:
- `/root/wizards/bezalel/hermes-agent`
- `/root/wizards/bezalel/home`

## Service proof

### Ezra services
Installed:
- `hermes-ezra.service`
- `openclaw-ezra.service`

Observed command:
```bash
ssh root@143.198.27.163 'systemctl is-active hermes-ezra.service openclaw-ezra.service'
```

Observed output during verification:
```text
active
activating
```

Interpretation:
- Hermes Ezra was active
- OpenClaw Ezra was still in activation during the check, so the sidecar is not yet treated as final-proven complete

### Bezalel service
Installed:
- `hermes-bezalel.service`

Observed command:
```bash
ssh root@67.205.155.108 'systemctl is-active hermes-bezalel.service'
```

Observed output:
```text
active
```

## Hermes API health proof

### Ezra
Observed command:
```bash
ssh root@143.198.27.163 'curl -s http://127.0.0.1:8643/health'
```

Observed output:
```json
{"status": "ok", "platform": "hermes-agent"}
```

### Bezalel
Observed command:
```bash
ssh root@67.205.155.108 'curl -s http://127.0.0.1:8644/health'
```

Observed output:
```json
{"status": "ok", "platform": "hermes-agent"}
```

Interpretation:
- both Hermes houses responded on their dedicated local API ports
- this is strong infrastructure proof that the houses are alive as services

## Canon and charter proof

The repo now defines the intended law of the houses:
- local Timmy remains sovereign control plane
- Ezra is the Claude-Hermes archivist house
- Bezalel is the Codex-Hermes artificer house
- OpenClaw may be Ezra's robe, not Ezra's bones
- Bezalel remains closer to the forge with no sidecar shell by default

These decisions are captured in:
- `specs/timmy-ezra-bezalel-canon-sheet.md`
- `specs/hermes-ezra-house-charter.md`
- `specs/hermes-bezalel-house-charter.md`
- `decisions.md`

## Telegram cutover proof / current state

Known group:
- `Timmy Time`
- chat id: `-1003664764329`

Bots now created by Alexander:
- `@EzraTimeBot`
- `@BezazelTimeBot`

Prepared artifact:
- `specs/wizard-telegram-bot-cutover.md`
- `scripts/wire_wizard_telegram_bots.sh`

Completed wiring step:
- Ezra token installed into `/root/wizards/ezra/home/.env`
- Bezalel token installed into `/root/wizards/bezalel/home/.env`
- Telegram package installed into both Hermes venvs
- both houses restarted after token wiring

Direct Bot API proof:
- local verification against the Bot API returned:
  - `EzraTimeBot` / first name `Ezra`
  - `BezazelTimeBot` / first name `Bezazel`
- membership + send proof succeeded for all three active bots in the group:
  - Timmy → message `249`
  - Ezra → message `250`
  - Bezalel → message `251`
- follow-up discussion messages also posted successfully:
  - Timmy → message `252`
  - Ezra → message `253`
  - Bezalel → message `254`

Interpretation:
- the wizard bots exist
- they are in the correct Telegram group
- they can post into the group successfully
- the group now contains a real multi-bot discussion among Timmy, Ezra, and Bezalel

### Timmy streamlined channel note

Timmy now wears OpenClaw on the local Telegram path.

Proof:
- `openclaw channels add --channel telegram ...` succeeded and added the Timmy bot to OpenClaw config
- `openclaw channels status --json --probe` now reports Telegram as:
  - `configured: true`
  - `running: true`
  - probe `ok: true`
  - bot username `TimmysNexus_bot`
- OpenClaw logs show:
  - Telegram provider start for `@TimmysNexus_bot`
  - a DM pairing request from Alexander's Telegram user (`7635059073`)
  - pairing approval recorded after explicit approval

Important behavior note:
- OpenClaw is now the streamlined DM path for Timmy
- group replies are still blocked by OpenClaw's current group policy (`reason: not-allowed`), so DM is the clean path until group policy is deliberately relaxed

Four-party discussion proof:
- Alexander posted into the group during validation, including messages:
  - `255` — greeting / roll call
  - `259` — `Hi?`
  - `263` — `Testing awakeness.`
- direct bot replies then posted successfully to Alexander's group message thread:
  - Timmy → `266`
  - Ezra → `267`
  - Bezalel → `268`

Interpretation:
- the group now contains a real four-party discussion involving:
  - Alexander
  - Timmy
  - Ezra
  - Bezalel

## Honest status on live model proof

Direct wizard-chat verification now differs by house.

### Bezalel
Bezalel is now awake on a real Codex-backed Hermes path.

World-state changes:
- copied a working `auth.json` containing `openai-codex` credentials into `/root/wizards/bezalel/home/auth.json`
- switched Bezalel config to:
  - `provider: openai-codex`
  - `model: gpt-5.4`

Proof:
```bash
ssh root@67.205.155.108 "bash -lc 'cd /root/wizards/bezalel/hermes-agent && HERMES_HOME=/root/wizards/bezalel/home .venv/bin/python /tmp/check_runtime_provider.py openai-codex'"
```
returned runtime credentials from the Hermes auth store with:
- provider `openai-codex`
- base URL `https://chatgpt.com/backend-api/codex`
- non-empty access token

Direct chat proof:
```bash
ssh root@67.205.155.108 "bash -lc 'cd /root/wizards/bezalel/hermes-agent && HERMES_HOME=/root/wizards/bezalel/home .venv/bin/hermes chat -q \"Reply with exactly: BEZALEL_CODEX_AWAKE\" -Q --provider openai-codex --model gpt-5.4'"
```
Observed output included:
```text
BEZALEL_CODEX_AWAKE
session_id: 20260329_185219_1c4787
```

Interpretation:
- Bezalel is awake on the intended Codex-backed Hermes lane

### Ezra
Ezra is now auth-correct but quota-blocked.

World-state changes:
- copied `ANTHROPIC_TOKEN` from the local sovereign house into Ezra's Hermes home env
- restarted `hermes-ezra.service`

Auth proof:
- direct Anthropics calls no longer fail with missing-credential errors
- valid Claude-family model ids (`claude-sonnet-4-5`, `claude-sonnet-4-6`) now return HTTP 429 rate-limit responses instead of auth failure

Observed proof command:
```bash
ssh root@143.198.27.163 "bash -lc 'cd /root/wizards/ezra/hermes-agent && set -a && . /root/wizards/ezra/home/.env && set +a && HERMES_HOME=/root/wizards/ezra/home .venv/bin/hermes chat -q \"Reply with exactly: TEST\" -Q --provider anthropic --model claude-sonnet-4-5'"
```

Observed outcome:
- `HTTP 429: This request would exceed your account's rate limit. Please try again later.`

Interpretation:
- Ezra's Anthropic auth is now wired correctly
- the remaining block is quota, not missing credentials

## Remaining work

1. Let Anthropic quota clear so Ezra can move from auth-correct to fully awake
2. Decide whether Ezra should stay Anthropic-primary or gain a temporary fallback lane while quota is exhausted
3. Preserve and harden service-level proof so both houses stay stable across restarts
4. Future messaging cutover: move this wizard-house conversation layer off Telegram and into a private Nostr client with distinct identities for each agent

### Nostr future-work note

Future state to pursue:
- Timmy gets his own Nostr identity
- Ezra gets his own Nostr identity
- Bezalel gets his own Nostr identity
- communications move from Telegram dependence to an owned private Nostr client / relay pattern
- wizard-to-wizard and operator-to-wizard traffic becomes sovereign, attributable, and non-platform-dependent

This future work has been recorded as a follow-on Gitea issue so it is not lost as mere chat context.

## Verdict

This launch is real and worth keeping.

What is complete:
- named houses exist
- doctrine exists
- services exist
- health endpoints answered
- Gitea-tracked artifacts exist

What is not complete:
- Telegram BotFather cutover
- four-way acceptance chat
- final live-model proof for both wizard houses

This report should be used as the review artifact for Alexander's evaluation in Gitea.
