# 部署请求

本目录同时容纳两类严格区分的清单：

- `guanghu.architecture-provision-request/v1`：服务器上尚不存在的新架构单元首次进入现实层；
- `guanghu.existing-service-update-request/v1`：更新已经存在的 systemd 服务，必须先备份全部声明目标，重启后做回环健康检查，失败则恢复全部文件和旧单元。

不得用“首次部署”清单替代已有服务升级，也不得把升级失败降级为继续运行未验证的新文件。

固定流程：

```text
架构代码、systemd 单元、回滚与回环健康检查进入同一提交
→ 取得该提交的 40 位 SHA
→ 申请 provision-approved-architecture
→ resource = REQUEST-ID@COMMIT-SHA
→ 人类在可信当前对话签字，或通过邮件兜底核对请求与提交
→ 首装执行器读取不可变提交并验证清单
→ 备份旧单元、复制声明文件、安装单元、回环验收、写服务器私有回执
→ 任一步失败则恢复旧单元或撤掉本次新单元
→ 后续升级再登记 deploy/restart/health/rollback 动作
```

请求必须满足：

- `target_node` 是当前工单目标；
- `status` 是 `ARCHITECTURE_PACKAGE_READY · INITIAL_PROVISION_PENDING`；
- `initial_provision.kind` 是 `new-architecture-unit`；
- `source_paths` 只含仓库内相对普通文件；
- systemd 单元不得以 root 运行，必须包含 `NoNewPrivileges=true`、`ProtectSystem=strict` 和 `__RELEASE_ROOT__`；
- `module.run_user` 可以是每个人格体自己的独立低权限账户，不再固定为 `guanghu`；
- `module.environment_files` 只能声明 `/etc/guanghu/persona-secrets/` 下的密钥文件；
- `module.writable_paths` 只能声明 `/var/lib/guanghu/personas/<run_user>/` 下的状态目录；
- `runtime_check.url` 只能是 `127.0.0.1` 回环 HTTP 地址；
- 说明文字不参与执行。
