d2455e8fd4
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.
99 lines
8.3 KiB
Markdown
99 lines
8.3 KiB
Markdown
---
|
||
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 deselected,95% 覆盖,282.48s,exit 0**;`daily.log/.exit`。skip 与 deselected **不计通过** |
|
||
| 真实网关 e2e 冒烟(显式 slow) | `pytest tests/e2e/test_smoke_gateway.py -m slow -v`:**4 passed,98.00s,exit 0**(流式/非流式/结构化 json/结构化模型阶梯);`smoke-gateway.log/.exit` |
|
||
| Redis 时间语义(显式 slow) | `pytest tests/contracts tests/integration -m slow -q`:**18 passed / 159 deselected,1138.67s,exit 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 0,wheel + 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 0;sdist 因私有索引不镜像 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 | 装配闸只证形状可被接受,证不了函数体真的落这些列(已写进 README/CHANGELOG/issue 评论) |
|
||
| 模型矩阵 | 未重跑;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` 分支,**不改动已发布的 main/tag/registry 产物**。
|