# 2026-09-18 — IEI → EAGLE / Home Assistant Migration Detailed Record

## 1. Session purpose
继续关闭 Home Assistant PREPARE gate。原则保持不变：未获明确授权不得 STOP HA、不得启动 Eagle HA、不得执行 final HA data copy、不得提前实施 fencing、不得产生两个 production HA writers；IEI 保持 production / rollback source。

## 2. Codex PREPARE reassessment
Codex 更新：
`review/ha-prepare-reassessment-2026-09-18.md`

结果：
- PREPARE READY: NO
- unresolved blockers：
  - enforceable HA-only authority/writer exclusion
  - executable state/dependency restoration recipe
  - named ownership and acceptance/rollback decisions

支持的 final persistence scope：
- complete stopped `/home/foo/homeassistant/`
- hidden state / secrets / databases / surviving sidecars or journals
- container `/root/.panasonic-settings`
- preserve metadata
- retain verified exact HA image
- separately reconstruct observed writable-layer runtime package changes

## 3. Panasonic evidence
`/root/.panasonic-settings`
- regular file
- mode 0644
- uid:gid 0:0
- size 1650 bytes

Runtime:
- `aio-panasonic-comfort-cloud==2026.8.9`
- `aiofiles==25.1.0`
- `aiohttp==3.14.3`
- `beautifulsoup4==4.13.3`
- `bs4==0.0.2`
- `packaging==26.3`
- `urllib3==2.7.0`
- `panasonic-viera==0.4.4`

Docker diff 支持 `aio_panasonic_comfort_cloud` 和 `/root/.panasonic-settings` 为 writable-layer additions；没有相同证据把 `panasonic-viera==0.4.4` 分类为 layer addition。

Codex：Panasonic preservation design 仍未完成，deterministic reconstruction 仍需关闭。

## 4. HA authority evidence
已有证据：
- HA RestartPolicy `unless-stopped`
- AutoRemove false
- Compose project/service `homeassistant`
- working dir `/home/foo/homeassistant`
- config `/home/foo/homeassistant/compose.yaml`
- 已查相关 systemd/cron/timers，无匹配 HA auto-start mechanism
- root crontab none
- foo crontab none
- Portainer RW `/var/run/docker.sock`
- Portainer RestartPolicy `always`

因此普通 Docker automatic restart 风险与 explicit admin/Docker/Portainer authority 必须分开处理。

## 5. HA-only worksheet
Codex 创建：
`review/ha-only-authority-control-worksheet-2026-09-18.md`

当时结果：
- WORKSHEET COMPLETE: YES
- HA-ONLY FENCE DESIGN: NOT READY
- PORTAINER HA MANAGEMENT: UNKNOWN

要求补充 Portainer stack metadata、privileged/scoped writer coverage、tested reversible enforcement、Panasonic restoration、acceptance/rollback decisions。

Codex weekly limit 随后低于 10%，故停止继续消耗额度。

## 6. Portainer runtime investigation
IEI Portainer：
- container `portainer`
- version 2.39.5
- Config.Image `portainer/portainer-ce:latest`
- exact Image ID `sha256:f6bc23d1695530a609563fd65c180aaafec0fc02e019d5fc63d16b6fbe83addd`
- volume `/var/lib/docker/volumes/portainer_data/_data` → `/data`
- Docker socket `/var/run/docker.sock` RW
- volume name `portainer_data`

Data directory 包含 `portainer.db`, key/pub, bin, certs, chisel, compose, tls。

一次 Python SQLite `mode=ro` 读取返回 `sqlite3.DatabaseError: file is not a database`；没有写入数据库。`compose` 目录在所查深度无文件。

未认证：
`GET https://127.0.0.1:9443/api/stacks`
→ HTTP 401。

## 7. Portainer admin recovery
Chrome Password Manager 未找到 Portainer/9443 credential。

恢复前创建 rollback copy：
- original `portainer.db`
- backup `portainer.db.pre-reset-2026-09-18`
- 两者约 512K，root:root，0600

执行 `docker stop portainer` 后立即确认：
- `homeassistant` 仍 Up 25 hours
- 只有 Portainer 被停止

使用官方 `portainer/helper-reset-password` 对 `portainer_data:/data` 恢复 admin password，成功；新密码未贴入聊天。

随后 `docker start portainer`，验证：
- homeassistant Up
- portainer Up

HA 全程未停止。

## 8. Direct Portainer Stack evidence
登录 Portainer 后，local environment 显示 2 stacks。

Stacks：
1. `homeassistant`
   - Type Compose
   - Control Limited
   - Created 2026-08-30 00:36:04
   - Ownership administrators
2. `remoteoffice`
   - Type Compose
   - Control Limited
   - Created 2026-09-15 00:15:51
   - Ownership administrators

打开 `homeassistant` 后页面明确显示：
“This stack was created outside of Portainer. Control over this stack is limited.”

同时显示：
- stack `homeassistant`
- container `homeassistant`
- state running
- image `ghcr.io/home-assistant/home-assistant:stable`

### 更新后的解释
- Portainer recognizes HA stack: YES
- HA stack created by Portainer: NO
- created outside Portainer: YES
- Portainer control: LIMITED
- source: external Docker Compose
- Compose project: `homeassistant`
- config already evidenced: `/home/foo/homeassistant/compose.yaml`
- Portainer 仍拥有 RW Docker socket，因此仍属于 administrative authority path

这解决了主要的 Portainer ownership/source UNKNOWN，但没有自动解决 fencing。

## 9. End-of-day safety checkpoint
IEI：
- HA RUNNING
- Portainer RUNNING
- FRO/其他服务未因本次 HA/Portainer 工作而被主动停止
- final HA capture NOT PERFORMED
- HA fencing NOT APPLIED
- cutover NOT PERFORMED
- Portainer admin password 已恢复/reset
- Portainer DB rollback copy retained

EAGLE：
- Eagle HA NOT STARTED
- final production HA copy NOT PERFORMED

Frozen data：
- protected ZIP migration remains frozen
- 本次没有 deliberate re-read/re-hash/re-transfer frozen ZIP payloads

## 10. Remaining work before STOP authorization
1. 把 Portainer direct evidence 更新到 authority worksheet。
2. 设计 technically enforceable + reversible HA-only fence，分别覆盖：
   - automatic restart prevention
   - explicit restart prevention
   - container recreation prevention
   - old IEI HA filesystem/data writer prevention
   且尽量不 power off IEI、不影响 FRO/其他 containers。
3. 完成 Panasonic deterministic restoration。
4. 明确 controller/ownership、acceptable outages、callbacks、Panasonic startup effects、observation/abort budget、rollback write-loss policy。
5. PREPARE READY + explicit authorization 后才可：
   fence → graceful STOP → verify stopped → final capture → verify → Eagle prepare → explicit start authorization → validation → commit/rollback。

## 11. Do not repeat tomorrow
无需重复：
- Portainer version/image identity
- Portainer volume location
- Portainer password recovery
- Portainer sees two stacks
- HA is external Compose stack
- Portainer Control = Limited
- HA remained running during Portainer recovery
- resolved cron/systemd/timer checks
- exact HA image preservation
- frozen ZIP verification

## End checkpoint
2026-09-18 安全停止点。明日从 HA-only fence design / PREPARE closure 继续。
