docs: record 1.3.5 release completion and external verification

Merge-time gates, registry artifacts and anonymous page checks for 1.3.5
recorded as a separate finding; the validation finding gains a status
pointer so its historic 'not yet executed' section is not silently stale.
Released main/tag and uploaded artifacts are untouched.
This commit is contained in:
2026-09-09 14:02:15 -04:00
parent ab00aa4457
commit d2455e8fd4
4 changed files with 105 additions and 2 deletions
@@ -0,0 +1,98 @@
---
type: finding
node_id: finding:2026-09-09-135-release-completion
title: "1.3.5 发布完成与外部验收:合并后门、registry 产物与页面亲查"
date: 2026-09-09
---
# 1.3.5 发布完成与外部验收
> 状态:**1.3.5 已发布并完成外部验收,#19 / #23 已评论关闭**。main 与 `v1.3.5` 同指
> `ab00aa44576bd4cd47d0680d107d5191679dc1ee`。发布准备阶段的证据见
> [1.3.5 验收证据](2026-09-09-135-call-observability-validation.md)(其 §8.6 列的"尚未执行"由本文逐项关闭,
> 该文当时结论不追改)。本轮无生产/测试代码改动、未派子代理;原始日志在
> `tests/outputs/135/publish-20260909/`gitignore,不入库)。
## 1. 合并与合并后门
长跑全部在 tmux `pgw135-publish` 串行执行,`PYTHONUNBUFFERED=1`,命令末尾**不接管道**,每门独立 `.exit`
| 步骤 | 结果与证据 |
| --- | --- |
| 远端占用复查(改动前) | `git ls-remote` 最高 `v1.3.4`registry simple 索引按完整字面量 `polygateway-1.3.5` 无命中;Release API `/releases/tags/v1.3.5` 与包页面 1.3.5 均 **404**。origin/main = 本地 main = `af57f93`,无未审变更 |
| 合并 | `--no-ff``ab00aa4``git diff HEAD feature/1.3.5-call-observability` **空**,即合并树与父会话已审的 `433039b` 逐字一致;`merge.log/.exit` |
| CLAUDE.md 纯格式 diff | 合并前仅对该文件 `git stash push`(未 stash 全部),合并后 `stash pop` 回原样;全程未提交、未覆盖 |
| `make lint` | **exit 0**ruff 无自动改动,import-linter **1 kept / 0 broken**`lint.log/.exit` |
| `make test` | **1605 passed / 23 skipped / 108 deselected95% 覆盖,282.48sexit 0**`daily.log/.exit`。skip 与 deselected **不计通过** |
| 真实网关 e2e 冒烟(显式 slow) | `pytest tests/e2e/test_smoke_gateway.py -m slow -v`**4 passed98.00sexit 0**(流式/非流式/结构化 json/结构化模型阶梯);`smoke-gateway.log/.exit` |
| Redis 时间语义(显式 slow | `pytest tests/contracts tests/integration -m slow -q`**18 passed / 159 deselected1138.67sexit 0**`redis-time.log/.exit` |
未补全模型矩阵(用户已批准):本版对 `thinking.py`、能力表、wire 片段、缓存 key 公式、重试/限流/熔断语义一字未改,
故 1.3.4 的型号级结论在其**原有边界**内继续成立,连同其 FAIL/UNKNOWN/不可达/缺轮一并继承,不因本版升格。
本版**已变更**的统计/SQL/PG 口径不复用旧统计,全部由 1.3.5 新测试承担(36 列契约、终态行、真实 PG 30 项)。
## 2. push / tag / 构建 / 上传
| 步骤 | 结果 |
| --- | --- |
| push main | `af57f93..ab00aa4`exit 0`push-main.log/.exit` |
| tag | `git tag -a v1.3.5`,注释 tag 对象 `ab780cf36a8c6b2de316c0b194dcaa9485e8172f`,解引用 = `ab00aa4`push exit 0`remote-refs-after.log` |
| 构建 | 确认 `dist` 是项目内真实目录(非符号链接)后清掉旧 1.3.3/1.3.4 产物;`python -m build` exit 0wheel + sdist 各一份 |
| `twine check` | 两份均 **PASSED**exit 0 |
| 上传 | exit 0。凭据只从 tea 配置读入 `TWINE_PASSWORD` 环境变量,不进 argv/日志;**未重传任何已存在版本的字节** |
产物 SHA-256
wheel `c017599ea6bef69a485e1d35eab2ca89154cd33180ebd6dc759647097221a6b4`
sdist `87fd4151b77f55829b5d3206c5b75ac6c1c6bb8c94faa194955bf0db33ad0211`
## 3. 独立下载、解包与安装后行为
全部在仓库外临时目录(`/tmp/pgw135-registry-*`)进行,不引入新依赖。
| 检查 | 结果 |
| --- | --- |
| registry 下载 | wheel exit 0sdist 因私有索引不镜像 setuptools 需 `--no-build-isolation`(沿用 1.3.4 已记录的处置)exit 0 |
| 字节一致 | 下载的两份 SHA-256 与本地构建**逐字相同** |
| 包内源码 | `__init__.py` / `types.py` / `ports.py` / `telemetry/schema.py` / `middleware/telemetry.py` / `client.py` / `embedding.py` / `ocr.py` 八个文件 wheel、sdist 与已发布提交**散列全等**sdist 内 README == 仓库 README |
| 元数据 | wheel METADATA `Version: 1.3.5``Description-Content-Type: text/markdown`、正文 30465 字符,含《1.3.5 逻辑调用统计与失败诊断》与安装下界 `>=1.3.5,<2`Project-URL 三项齐全 |
| 安装后公共面(`pip install --target` + 仅从该目录导入) | `CallStats``__all__`、frozen、字段 `logical_call_id/attempts/total_latency_ms`;四类响应 `call_stats` 均为**末尾**字段且默认 `None``record_llm_call` 实测 **36 参**10 个新参全为 keyword-only 且**无默认值**`len(schema.COLUMNS) == 36` |
| 安装后终态行行为(离线,httpx MockTransport 固定 503,不发真实请求) | 3 条 `attempt` + **恰 1 条** `terminal_failure`;终态 `attempts=3``total_latency_ms` 非空、`cost IS NULL``usage_source='unavailable'``http_status_code` 为 NULL;尝试行三条均记真实 **503**`error_body``error_type='TransientError'`;四行共享同一 `logical_call_id`;物理列 **37**36 写入列 + `created_at` |
## 4. 外部产物亲查(匿名,看到什么算什么)
| 目标 | 结果 |
| --- | --- |
| Release 创建 | POST **201**,id 22,正文 1898 字符逐字取自 CHANGELOG 1.3.5 段 |
| [包页面](https://gitea.iomgaa.online/iomgaa/-/packages/pypi/polygateway/1.3.5) | 匿名 **200**;可见正文含安装命令与《1.3.5 逻辑调用统计与失败诊断》;页面有指向 `iomgaa/PolyGateway` 的仓库锚点 |
| [v1.3.5 Release](https://gitea.iomgaa.online/iomgaa/PolyGateway/releases/tag/v1.3.5) | 匿名 **200**;可见文本含 `WHERE event_kind = 'terminal_failure'` 与「26 → 36」迁移说明 |
| [Releases 列表](https://gitea.iomgaa.online/iomgaa/PolyGateway/releases) | 匿名 **200**,含 v1.3.5 |
| simple 索引 | 匿名 **200**1.3.5 的 wheel 与 sdist 均列出 |
## 5. issue 收尾
仅动 **#19 / #23**:各评论一条后关闭,随后**以 GET 读到的 state 为准**复核(不拿 PATCH 返回码推断),两者均 `closed`
评论内容点名:自建 recorder 需补 10 参或改 `**fields`**装配期报错**)、PG manual 档补列、
计失败改 `WHERE event_kind = 'terminal_failure'``AVG(latency_ms)``event_kind` 分组;
并明确「新增失败统计列与终态行是**常规口径变更、不是异常字段**」,`http_status_code` 不可当成败判据;
同时声明**未做全模型矩阵、不宣称所有模型或渠道可用**。#22 / #24 未触碰(复核仍 `open`、评论数 0)。
## 6. 真实失败与处置(原件保留,不改写成功)
| 失败 | 根因与处置 |
| --- | --- |
| 首次安装后终态验证 exit 1 | `sqlite3.OperationalError: no such column: id` —— 是**我的验证脚本**臆断了主键列名,实际第 37 个物理列是 `created_at`。改脚本 `ORDER BY rowid` 并把多出的物理列打印出来自证,**未改库代码**;失败日志保留 |
| 首次 Release 创建 exit 1 | `KeyError: 'TOKEN'` —— 变量未 export 到子进程,**未发出任何 API 请求**(不是服务端拒绝)。改为 export 后 201 |
| 包关联 POST **400** | 返回 `invalid argument`,与 1.3.4 同款。**不把 400 当成功、也不据此猜已关联**:另以认证 GET 包 API 读到 `repository.full_name = iomgaa/PolyGateway`,并匿名读到包页面上的仓库链接,两条实测证据才是关联成立的依据;既有正确关系不为重试而解绑 |
## 7. 残余缺口(不自称已关)
| 缺口 | 说明 |
| --- | --- |
| live 覆盖基线 | `metrics/call-telemetry-coverage.md` 的实际基线列仍待首次生产运行填入 |
| 下游自建 recorder | 装配闸只证形状可被接受,证不了函数体真的落这些列(已写进 READMECHANGELOGissue 评论) |
| 模型矩阵 | 未重跑;1.3.4 的 FAIL/UNKNOWN/不可达/缺轮例外原样继承,不外推为「全模型可用」 |
| 其余 e2e | 本轮 slow 只跑了 `test_smoke_gateway.py` 与 contracts/integration 的 Redis 时间语义,`tests/e2e/` 其余文件未跑 |
| 用户文档站(Gitea Wiki) | 本轮未同步;`docs-convention.md` §2 清单待另行执行 |
conda 启动器既有 `RequestsDependencyWarning` 保留,不宣称零告警。本记录落在独立
`docs/1.3.5-release-evidence` 分支,**不改动已发布的 maintagregistry 产物**。