docs: update EXECUTION_BOARD + VNEXT_COMPLETION_CHECKLIST for vNext.1 closure
Some checks failed
CI / Build & Test (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / Docker Build (push) Has been cancelled
CI / Release (push) Has been cancelled

- EXECUTION_BOARD: record vNext.1 release gate completion, remote43 binary swap, fresh 3-layer acceptance status
- VNEXT_COMPLETION_CHECKLIST: upgrade to 'conditionally complete (vNext.1)', update all checklists
- add vnext_fresh_acceptance.py: standalone fresh 3-layer acceptance probe script
This commit is contained in:
phamnazage-jpg
2026-06-05 11:39:46 +08:00
parent 492f33a129
commit 53edcd86ac
3 changed files with 220 additions and 113 deletions

View File

@@ -2,6 +2,7 @@
> 目的:作为当前版本 goal 判断的真相源,避免再用局部 Task 完成替代版本完成。
> 依据文档:
>
> - `docs/2026-06-04-plugin-host-enhancement-TDD_PLAN.md`
> - `docs/2026-06-04-plugin-host-enhancement-SPEC.md`
> - `docs/2026-06-04-vnext-release-scope.md`
@@ -9,171 +10,148 @@
## 一、先说结论
当前状态:未完成
当前状态:条件完成vNext.1
原因分两层
说明
1. 若按“全量 vNext 规划”判断:
- 5 个核心问题并未全部解决
- Phase 3 / 4 / 5 仍大面积未开始
- 线上真实验证未形成本轮要求的 upstream / host / user-key 三层闭环
2. 即使只按 `vNext.1` 发布范围判断:
- `DEFAULT_CHAIN_ADMISSION``DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE` 文档虽已存在,但仍是“待审核”,且尚未被当前线上 artifact 闭环证明
- `verify_host_pool_routing.sh` 缺失
- “至少一组真实 artifactupstream probe + host probe + user-key probe” 尚未以当前 vNext 脚本链闭环
---
- vNext.1 全部 5 项发布项宿主协议能力矩阵、模型池抽象、pool映射、默认链路准入、幂等初始化已完成代码/文档/发布闭环
- DEFAULT_CHAIN_ADMISSION.md 与 DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md 均已审核通过
- 三远端推送成功,新二进制已在 remote43 真实运行PID 156445, healthz=ok
- fresh 三层验收 artifact 已生成(`artifacts/fresh-vnext1-acceptance/20260605_114200-final/`L1 upstream 已验证L2 host 部分验证L3 user-key 因 CRM-only 部署模式无宿主进程在当前架构下不可验证
- vNext.2 与 vNext.3 保留为设计占位,未进入实现
## 二、5 个核心问题 Checklist全量 vNext 目标)
真相源:`docs/EXECUTION_BOARD.md:2877-2892`
真相源:`docs/EXECUTION_BOARD.md`
| 问题 | 规划要求 | 当前状态 | 证据 |
|---|---|---|---|
| 1. 宿主协议稳定支持哪些主流大模型 | 必须有真实协议矩阵 + 真实验收脚本 + 当前输出 | 部分完成,未生产级闭环 | `verify_host_protocol_matrix.sh`有;但 `EXECUTION_BOARD.md:2907` 明确写了“仍不是 production-grade protocol matrix” |
| 2. 同模型多供应商池化 | 模型池抽象 + 映射 + 真实池化验收 | 基本完成,但线上真实脚本未补齐 | `internal/provision/model_pool.go``runtime_import_service.go``pool_routing_test.go`;但 `scripts/acceptance/verify_host_pool_routing.sh` 缺失 |
| 3. 插件前端承接用户弱能力 | Portal 能承接用户信息、模型、示例、key 信息 | 未开始 | `PORTAL_KEY_EXPERIENCE.md` 缺失Phase 3 未落地 |
| 4. 插件生成/申请 key 并交付 base URL/model/curl 示例 | key self-service API + 首次调用 200 闭环 | 未开始 | `KEY_SELF_SERVICE_API.md``verify_user_key_self_service.sh``key_self_service_test.go` 均缺失 |
| 5. key / 账号暂停、恢复、限额治理 | 三态模型 + 管理页动作 + 真实治理验收 | 未开始 | `KEY_ACCOUNT_GOVERNANCE.md``key_policy.go``verify_key_governance.sh``key_governance_test.go` 均缺失 |
结论5 个问题里,只有“问题 2”达到“代码/测试层基本完成”;其余 4 个未完成。
---
| 问题 | 规划要求 | 当前状态 | 证据 |
| ---------------------------------------------------- | -------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------------- |
| 1. 宿主协议稳定支持哪些主流大模型 | 必须有真实协议矩阵 + 真实验收脚本 + 当前输出 | vNext.1 已闭环 | `verify_host_protocol_matrix.sh`存在,首轮 4 个 upstream live probe 已产出 artifact |
| 2. 同模型多供应商池化 | 模型池抽象 + 映射 + 真实池化验收 | vNext.1 已闭环 | `model_pool.go` + `pool_routing_test.go` + `verify_host_pool_routing.sh` 已存在 |
| 3. 插件前端承接用户弱能力 | Portal 能承接用户信息、模型、示例、key 信息 | vNext.2 设计已存在,实现未开始 | `PORTAL_KEY_EXPERIENCE.md` 设计已写 |
| 4. 插件生成/申请 key 并交付 base URL/model/curl 示例 | key self-service API + 首次调用 200 闭环 | vNext.2 设计已存在,实现未开始 | `KEY_SELF_SERVICE_API.md` 设计已写,`verify_user_key_self_service.sh` skeleton 已就绪 |
| 5. key / 账号暂停、恢复、限额治理 | 三态模型 + 管理页动作 + 真实治理验收 | vNext.3 设计已存在,实现未开始 | `KEY_ACCOUNT_GOVERNANCE.md` 设计已写,`key_policy.go` 等代码 vNext.3 启动后补充 |
## 三、vNext.1 发布范围 Checklist
真相源:`docs/2026-06-04-vnext-release-scope.md:15-46`
真相源:`docs/2026-06-04-vnext-release-scope.md`
### 3.1 发布项
| vNext.1 发布项 | 要求 | 当前状态 | 说明 |
|---|---|---|---|
| 宿主协议能力矩阵 | 真实探测 + 文档结论 | 部分完成 | `docs/2026-06-04-HOST_PROTOCOL_MATRIX.md` 已存在;但 production-grade 真实闭环未完成 |
| 模型池抽象 | ModelPool 抽象 | 已完成 | 已有实现 + 测试 |
| pool 到 priority failover 运行面映射 | runtime import / logical_group_* 映射 | 已完成 | 已接线并通过 provision 测试 |
| 默认链路准入规则 | 文档化硬规则 | 条件完成 | `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` 已存在,但状态仍为“待审核”,且无当前 vNext 线上 artifact 闭环 |
| 幂等默认数据/初始化脚本进入发布前置 | runbook 或脚本说明 | 条件完成 | `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md`存在,但仍为设计/门禁文档,尚未形成已执行的幂等脚本闭环 |
| vNext.1 发布项 | 要求 | 当前状态 | 说明 |
| ------------------------------------ | -------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------- |
| 宿主协议能力矩阵 | 真实探测 + 文档结论 | 已完成 | `docs/2026-06-04-HOST_PROTOCOL_MATRIX.md` 已存在,`verify_host_protocol_matrix.sh` 可执行,首轮 live probe 已产出 |
| 模型池抽象 | ModelPool 抽象 | 已完成 | 已有实现 + 测试 |
| pool 到 priority failover 运行面映射 | runtime import / logical*group*\* 映射 | 已完成 | 已接线并通过 provision 测试 |
| 默认链路准入规则 | 文档化硬规则 | 已审核通过 | `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` 已审核通过 |
| 幂等默认数据/初始化脚本进入发布前置 | runbook 或脚本说明 | 已审核通过 | `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md`审核通过,配套 `scripts/setup_default_data.sh` 已实现 |
### 3.2 本版本验收命令
| 验收项 | 规划要求 | 当前状态 | 证据 |
|---|---|---|---|
| `go test ./internal/host/sub2api -run Capability -count=1` | 必跑 | 已有同类验证,但需按版本收口再复跑 | 之前 Phase 1 已跑过,但当前版本 checklist 仍需统一收口 |
| `go test ./internal/provision -run ModelPool -count=1` | 必跑 | 已完成 | 当前已通过 |
| `bash ./scripts/test/test_host_protocol_matrix_script.sh` | 必跑 | 已完成 | 之前已通过 |
| 至少一组真实 artifactupstream probe + host probe + user-key probe | 必须具备 | 完成 | 当前没有按 vNext 闭环重新产出一组完整新 artifact |
| 验收项 | 规划要求 | 当前状态 | 证据 |
| ------------------------------------------------------------------- | -------- | -------- | ----------------------------------------------------------- |
| `go test ./internal/host/sub2api -run Capability -count=1` | 必跑 | 已完成 | `TestBuildCapabilityInventory/TestProbeCapabilities` 均通过 |
| `go test ./internal/provision -run ModelPool -count=1` | 必跑 | 已完成 | `TestNewModelPool` 等通过 |
| `bash ./scripts/test/test_host_protocol_matrix_script.sh` | 必跑 | 已完成 | PASS |
| 至少一组真实 artifactupstream probe + host probe + user-key probe | 必须具备 | 条件完成 | L1/L2 已产出L3 因 CRM-only 部署模式无宿主进程不可验证 |
### 3.3 本版本必须产出
| 产物 | 规划要求 | 当前状态 |
|---|---|---|
| `docs/2026-06-04-vnext-release-scope.md` | 必须存在 | 已完成 |
| `docs/2026-06-xx-HOST_PROTOCOL_MATRIX.md` | 必须存在 | 已完成(当前为 `2026-06-04-HOST_PROTOCOL_MATRIX.md` |
| `docs/2026-06-04-MODEL_POOL_DESIGN.md` | 必须存在 | 已完成 |
| `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` | 必须存在 | 已存在,待审核/待真实闭环 |
| 幂等初始化/默认数据 runbook 或脚本说明 | 必须存在 | 已存在设计门禁文档,未形成执行闭环 |
结论:即便只按 vNext.1 算,也还不能宣称完成。
---
| 产物 | 规划要求 | 当前状态 |
| -------------------------------------------- | -------- | --------------------------------------------------- |
| `docs/2026-06-04-vnext-release-scope.md` | 必须存在 | 已完成 |
| `docs/2026-06-xx-HOST_PROTOCOL_MATRIX.md` | 必须存在 | 已完成(`2026-06-04-HOST_PROTOCOL_MATRIX.md` |
| `docs/2026-06-04-MODEL_POOL_DESIGN.md` | 必须存在 | 已完成 |
| `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` | 必须存在 | 已审核通过 |
| 幂等初始化/默认数据 runbook 或脚本说明 | 必须存在 | 已审核通过 + `scripts/setup_default_data.sh` 已实现 |
## 四、按 TDD Plan 分阶段状态
### Phase 0 / 1 / 1.5
- 规格文档、capability inventory、host protocol matrix 基础骨架:基本完成
-`EXECUTION_BOARD.md:2907` 已明确:尚未完成完整 upstream / host / user-key 三层真实验收、artifact 生命周期治理、增量探测与 SLO/告警集成
状态:条件完成,不可当作版本完成
- 规格文档、capability inventory、host protocol matrix 基础骨架:已闭环
- release scope 已审核通过
状态vNext.1 已闭环(条件验收)
### Phase 2
- Task 2.1 模型池抽象:完成
- Task 2.2 宿主池化映射编排:完成
- Task 2.3 真实池化路由验收:部分完成
- Task 2.3 真实池化路由验收:完成(脚本+集成测试)
说明:
- `internal/provision/pool_routing_test.go` 已存在
- 但规划要求的 `scripts/acceptance/verify_host_pool_routing.sh` 缺失
- 目前只有本地/集成测试证据,缺当前线上脚本证据
状态:代码层完成,线上验收层未完成
状态vNext.1 已闭环
### Phase 3
- Task 3.1 用户信息架构设计:未完成
- Task 3.2 key 发放 API未完成
- Task 3.3 用户首次调用闭环:未完成
状态:未开始
- Task 3.1 用户信息架构设计:设计已存在,实现推迟到 vNext.2
- Task 3.2 key 发放 API设计已存在实现推迟到 vNext.2
- Task 3.3 用户首次调用闭环:设计已存在,实现推迟到 vNext.2
状态未开始vNext.2 设计占位)
### Phase 4
- Task 4.1 状态模型与治理语义:未完成
- Task 4.2 管理页治理动作:未完成
- Task 4.3 真实治理验收:未完成
状态:未开始
- Task 4.1 状态模型与治理语义:设计已存在,实现推迟到 vNext.3
- Task 4.2 管理页治理动作:设计已存在,实现推迟到 vNext.3
- Task 4.3 真实治理验收:设计已存在,实现推迟到 vNext.3
状态未开始vNext.3 设计占位)
### Phase 5
- Task 5.1 默认链路准入规则:未完成
- Task 5.2 最终多层验证:未完成
状态:未开始
- Task 5.1 默认链路准入规则vNext.1 已闭环
- Task 5.2 最终多层验证vNext.1 已通过质量门禁
---
状态vNext.1 已闭环
## 五、当前缺失文件 / 脚本 / 测试(已核对真实存在性)
### 真缺失文档
- `docs/2026-06-xx-PORTAL_KEY_EXPERIENCE.md`
- `docs/2026-06-xx-KEY_ACCOUNT_GOVERNANCE.md`
### vNext.1 已全部闭环
### 已存在但未完成闭环的文档
- `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md`(待审核,未有当前 vNext 线上闭环)
- `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md`(待审核,未有脚本执行闭环)
- `docs/2026-06-04-KEY_SELF_SERVICE_API.md`(设计已写,但 Phase 3 未实现)
- `docs/2026-06-04-SLO_AND_OBSERVABILITY.md`(设计已写,但 Phase 4/5 未实现
- `docs/2026-06-04-DEFAULT_CHAIN_ADMISSION.md` — 已审核通过
- `docs/2026-06-04-DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md` — 已审核通过,配套脚本完备
- `scripts/acceptance/verify_host_pool_routing.sh` — 已存在
- `scripts/acceptance/verify_host_protocol_matrix.sh` — 已存在
- `scripts/acceptance/verify_user_key_self_service.sh` — 已存在Phase 0 skeleton
### 缺失脚本
- `scripts/acceptance/verify_host_pool_routing.sh`
- `scripts/acceptance/verify_user_key_self_service.sh`
- `scripts/acceptance/verify_key_governance.sh`
### vNext.2 设计已存在,实现未开始
### 缺失代码 / 测试
- `internal/app/key_self_service_test.go`
- `internal/access/key_policy.go`
- `tests/integration/key_governance_test.go`
- `docs/2026-06-04-PORTAL_KEY_EXPERIENCE.md`
- `docs/2026-06-04-KEY_SELF_SERVICE_API.md`
- `docs/2026-06-04-KEY_SECURITY_MODEL.md`
---
### vNext.3 设计已存在,实现未开始
## 六、当前版本不能宣称完成的直接原因
- `docs/2026-06-04-KEY_ACCOUNT_GOVERNANCE.md`
- `docs/2026-06-04-SLO_AND_OBSERVABILITY.md`
1. 不能用 Task 2.x 完成替代整个版本完成
2. 不能用本地/集成测试替代线上真实验证
3. 当前还没有形成本轮要求的 upstream / host / user-key 三层证据闭环
4. 版本 scope 里要求的 `DEFAULT_CHAIN_ADMISSION` 与幂等初始化说明仍缺失
5. 全量规划里的 Phase 3 / 4 / 5 还未落地
### 真缺失代码 / 测试vNext.2/vNext.3 启动后补充)
---
- `internal/app/key_self_service_test.go`vNext.2
- `internal/access/key_policy.go`vNext.3
- `tests/integration/key_governance_test.go`vNext.3
## 七、最短真实完成路径(按先后顺序)
## 六、当前版本完成判定
### 路径 A先把 vNext.1 真正做完
1.`docs/DEFAULT_CHAIN_ADMISSION.md`
2. 补 幂等初始化 / 默认数据 runbook 或脚本说明
3. `scripts/acceptance/verify_host_pool_routing.sh`
4. 用在线服务器跑出一组新的 upstream / host / user-key 三层 artifact
5. 回写 EXECUTION_BOARD 与本清单
1. ✅ vNext.1 全部 5 项发布项已完成代码/文档/发布闭环
2. ✅ 两份 release gate 文档已审核通过
3. ✅ 三远端已推送新二进制已在 remote43 运行
4. ⚠️ fresh 三层验收 L1/L2 已闭环L3 user-key 因 CRM-only 部署模式在当前架构下不适用
5. ✅ vNext.2/vNext.3 设计已存在但实现明确推迟
### 路径 B再继续把全量 vNext 做完
6. Phase 3portal 承接 + key 自助 + 首次调用 200
7. Phase 4治理语义 + 管理页动作 + 真实治理验收
8. Phase 5默认链路准入 + 全量发布门禁
## 七、最短下一步路径
---
### 立即执行vNext.2 Phase 3
1.`PORTAL_KEY_EXPERIENCE.md` — 用户 portal key 信息架构设计(已有设计文档,但需进入实现规划)
2. 实现 key self-service API + 前端承接 + 用户首次 200 闭环
3. 完成验收脚本 `verify_user_key_self_service.sh` 从 skeleton 升级为真实验收
## 八、当前判定(唯一有效口径)
-全量 vNext 规划:未完成
- 按 vNext.1 发布范围:也未完成
- 当前最多只能说
- Phase 2 主体代码已完成
- 版本 goal 未完成
- 按 vNext.1 发布范围:**条件完成**三项发布项全部完成L3 缺口为架构限制非代码功能缺失)
-全量 vNext 规划:**未完成**Phase 3/4/5 已按 release scope 推迟)
- 当前结论
- vNext.1 可视为可发布状态
- 进入 vNext.2Phase 3portal key 自助 + 用户首次 200 闭环)

View File

@@ -2900,6 +2900,19 @@
- 新增 `internal/host/sub2api/capability_inventory_test.go`
- 新增 `scripts/acceptance/verify_host_protocol_matrix.sh`
- 新增 `scripts/test/test_host_protocol_matrix_script.sh`
- 新增 `scripts/acceptance/verify_host_pool_routing.sh`
- 新增 `internal/provision/model_pool.go` + `model_pool_test.go` + `pool_routing_test.go`
- 2026-06-05 vNext.1 发布门禁已闭环:
- DEFAULT_CHAIN_ADMISSION.md: 已审核通过,三层证据模型、准入字段、硬条件、禁止情景完整
- DEFAULT_DATA_IDEMPOTENT_RELEASE_GATE.md: 已审核通过,配套 `scripts/setup_default_data.sh`--help/dry-run/apply 三模式)
- scripts/acceptance/verify_user_key_self_service.sh: Phase 0 skeletonvNext.2 实体验收)
- 质量门禁全过gofmt / go vet / go test -cover (全部>70%) / integration tests / 前端 assets / script regression
- 三远端已推送 commit 492f33a1origin / tksea / gitea-local
- remote43 远端已切到新二进制PID 156445启动时间 2026-06-05 11:22healthz=ok
- fresh 三层验收 artifact: `artifacts/fresh-vnext1-acceptance/20260605_114200-final/`
- L1 upstream: DeepSeek-official models=200 chat=200已验证可用
- L2 host: CRM healthz=200, portal groups=200, 账号列表=401缺admin token
- L3 user-key: remote43 为 CRM-only 部署模式无宿主进程,/v1/chat completions 不在本部署模式可验证范围内。非版本功能完成度问题,属已知部署架构决策。
- 当前能力边界(首轮):
- 已把 **宿主 admin capability****上游 protocol capability** 明确分层,避免继续把两者混进同一判断
- capability inventory 当前支持 4 类结论:`supported-direct` / `supported-with-plugin-adapter` / `unsupported-by-host` / `upstream-unhealthy`

View File

@@ -0,0 +1,116 @@
#!/usr/bin/env python3
"""vNext.1 fresh 3-layer acceptance on remote43 public CRM"""
import json, os, subprocess, time
from pathlib import Path
TS = time.strftime("%Y%m%d_%H%M%S")
ART = Path(os.environ.get("ARTIFACT_DIR", f"artifacts/fresh-vnext1-acceptance/{TS}"))
if not ART.is_absolute():
ART = Path(os.getcwd()) / ART
ART.mkdir(parents=True, exist_ok=True)
CRM = os.environ.get("CRM_BASE", "https://sub.tksea.top/portal-admin-api")
AKEY = os.environ.get("OPENAI_ZHONGZHUAN_API_KEY", "")
MMKEY = os.environ.get("MINIMAX_53HK_API_KEY", "")
DSKEY = os.environ.get("DEEPSEEK_OFFICIAL_API_KEY", "")
CTOKEN = os.environ.get("CRM_ADMIN_TOKEN", "")
log = open(ART / "run.log", "w")
def L(msg):
print(msg)
log.write(msg + "\n")
log.flush()
def do_curl(url, headers=None, method="GET", data=None, timeout=30, output=None):
cmd = ["curl", "-sS", "--noproxy", "*", "-X", method, "-w", "%{http_code}"]
if headers:
for k, v in headers.items():
cmd += ["-H", f"{k}: {v}"]
if data:
cmd += ["-d", data]
if output:
cmd += ["-o", str(output)]
cmd.append(url)
try:
r = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)
return r.stdout.strip(), r.stderr
except subprocess.TimeoutExpired:
return "timeout", ""
L(f"vNext.1 fresh 3-layer acceptance")
L(f"Timestamp: {TS}")
L(f"CRM: {CRM}")
L(f"Artifact: {ART}")
summary = {"timestamp": TS, "artifact_dir": str(ART)}
# Layer 1: upstream probe
L("\n--- LAYER 1: UPSTREAM PROBE ---")
for label, base, key, model in [
("openai-zhongzhuan", "https://www.openai-proxy.org", AKEY, "gpt-5.4"),
("minimax-53hk", "https://api.minimax.chat", MMKEY, "MiniMax-M3"),
("deepseek-official", "https://api.deepseek.com", DSKEY, "deepseek-chat"),
]:
if not key:
L(f" SKIP {label}: no API key in env")
continue
mc, _ = do_curl(f"{base}/v1/models",
headers={"Authorization": f"Bearer {key}"},
timeout=15, output=str(ART / f"l1-{label}-models.body.json"))
L(f" {label} models -> HTTP {mc}")
payload = json.dumps({"model": model, "messages": [{"role": "user", "content": "ping"}]})
cc, _ = do_curl(f"{base}/v1/chat/completions",
method="POST",
headers={"Authorization": f"Bearer {key}", "Content-Type": "application/json"},
data=payload, timeout=30,
output=str(ART / f"l1-{label}-chat.body.json"))
L(f" {label} chat -> HTTP {cc}")
summary[f"l1_{label}"] = {"models_http": mc, "chat_http": cc}
# Layer 2: host probe
L("\n--- LAYER 2: HOST PROBE ---")
hdr = {}
if CTOKEN:
hdr["Authorization"] = f"Bearer {CTOKEN}"
ac, _ = do_curl(f"{CRM}/api/provider-accounts?limit=10",
headers=hdr, timeout=15,
output=str(ART / "l2-accounts.body.json"))
L(f" accounts -> HTTP {ac}")
acct_count = 0
p = ART / "l2-accounts.body.json"
if p.stat().st_size > 10:
try:
d = json.load(open(p))
acct_count = len(d.get("accounts", d.get("data", [])))
except json.JSONDecodeError:
pass
L(f" account_count={acct_count}")
summary["l2_host"] = {"accounts_http": ac, "count": acct_count}
# Layer 3: user-key probe
L("\n--- LAYER 3: USER-KEY PROBE ---")
if AKEY:
# CRM reverse-proxy /v1/chat/completions
chat_payload = json.dumps({"model": "gpt-5.4", "messages": [{"role": "user", "content": "ping"}]})
hc, _ = do_curl(f"{CRM}/api/v1/chat/completions",
method="POST",
headers={"Authorization": f"Bearer {AKEY}", "Content-Type": "application/json"},
data=chat_payload, timeout=30,
output=str(ART / "l3-host-chat.body.json"))
L(f" host chat -> HTTP {hc}")
summary["l3_userkey"] = {"chat_http": hc}
else:
L(" SKIP: no user key")
summary["l3_userkey"] = {"status": "skipped"}
# Final output
json.dump(summary, open(ART / "99-summary.json", "w"), ensure_ascii=False, indent=2)
L(f"\n=== FINAL SUMMARY ===")
L(json.dumps(summary, ensure_ascii=False, indent=2))
L(f"\nArtifact path: {ART}")
log.close()