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.
8.3 KiB
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.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 段 |
| 包页面 | 匿名 200;可见正文含安装命令与《1.3.5 逻辑调用统计与失败诊断》;页面有指向 iomgaa/PolyGateway 的仓库锚点 |
| v1.3.5 Release | 匿名 200;可见文本含 WHERE event_kind = 'terminal_failure' 与「26 → 36」迁移说明 |
| 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 产物。