Files
PolyGateway/research-wiki/findings/2026-09-09-135-release-completion.md
T
iomgaa d2455e8fd4 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.
2026-09-09 14:02:15 -04:00

8.3 KiB
Raw Blame History

type, node_id, title, date
type node_id title date
finding finding:2026-09-09-135-release-completion 1.3.5 发布完成与外部验收:合并后门、registry 产物与页面亲查 2026-09-09

1.3.5 发布完成与外部验收

状态:1.3.5 已发布并完成外部验收,#19 / #23 已评论关闭。main 与 v1.3.5 同指 ab00aa44576bd4cd47d0680d107d5191679dc1ee。发布准备阶段的证据见 1.3.5 验收证据(其 §8.6 列的"尚未执行"由本文逐项关闭, 该文当时结论不追改)。本轮无生产/测试代码改动、未派子代理;原始日志在 tests/outputs/135/publish-20260909/gitignore,不入库)。

1. 合并与合并后门

长跑全部在 tmux pgw135-publish 串行执行,PYTHONUNBUFFERED=1,命令末尾不接管道,每门独立 .exit

步骤 结果与证据
远端占用复查(改动前) git ls-remote 最高 v1.3.4registry simple 索引按完整字面量 polygateway-1.3.5 无命中;Release API /releases/tags/v1.3.5 与包页面 1.3.5 均 404。origin/main = 本地 main = af57f93,无未审变更
合并 --no-ffab00aa4git diff HEAD feature/1.3.5-call-observability ,即合并树与父会话已审的 433039b 逐字一致;merge.log/.exit
CLAUDE.md 纯格式 diff 合并前仅对该文件 git stash push(未 stash 全部),合并后 stash pop 回原样;全程未提交、未覆盖
make lint exit 0ruff 无自动改动,import-linter 1 kept / 0 brokenlint.log/.exit
make test 1605 passed / 23 skipped / 108 deselected95% 覆盖,282.48sexit 0daily.log/.exit。skip 与 deselected 不计通过
真实网关 e2e 冒烟(显式 slow) pytest tests/e2e/test_smoke_gateway.py -m slow -v4 passed98.00sexit 0(流式/非流式/结构化 json/结构化模型阶梯);smoke-gateway.log/.exit
Redis 时间语义(显式 slow pytest tests/contracts tests/integration -m slow -q18 passed / 159 deselected1138.67sexit 0redis-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..ab00aa4exit 0push-main.log/.exit
tag git tag -a v1.3.5,注释 tag 对象 ab780cf36a8c6b2de316c0b194dcaa9485e8172f,解引用 = ab00aa4push exit 0remote-refs-after.log
构建 确认 dist 是项目内真实目录(非符号链接)后清掉旧 1.3.3/1.3.4 产物;python -m build exit 0wheel + sdist 各一份
twine check 两份均 PASSEDexit 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.5Description-Content-Type: text/markdown、正文 30465 字符,含《1.3.5 逻辑调用统计与失败诊断》与安装下界 >=1.3.5,<2Project-URL 三项齐全
安装后公共面(pip install --target + 仅从该目录导入) CallStats__all__、frozen、字段 logical_call_id/attempts/total_latency_ms;四类响应 call_stats 均为末尾字段且默认 Nonerecord_llm_call 实测 36 参10 个新参全为 keyword-only 且无默认值len(schema.COLUMNS) == 36
安装后终态行行为(离线,httpx MockTransport 固定 503,不发真实请求) 3 条 attempt + 恰 1 条 terminal_failure;终态 attempts=3total_latency_ms 非空、cost IS NULLusage_source='unavailable'http_status_code 为 NULL;尝试行三条均记真实 503error_bodyerror_type='TransientError';四行共享同一 logical_call_id;物理列 3736 写入列 + created_at

4. 外部产物亲查(匿名,看到什么算什么)

目标 结果
Release 创建 POST 201,id 22,正文 1898 字符逐字取自 CHANGELOG 1.3.5 段
包页面 匿名 200;可见正文含安装命令与《1.3.5 逻辑调用统计与失败诊断》;页面有指向 iomgaa/PolyGateway 的仓库锚点
v1.3.5 Release 匿名 200;可见文本含 WHERE event_kind = 'terminal_failure' 与「26 → 36」迁移说明
Releases 列表 匿名 200,含 v1.3.5
simple 索引 匿名 2001.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 产物