fix(preview+pipeline): 资产键编码归一——7 张全角名图片预览 404 修复;证据文档叙述修正

spec 复审发现(浏览器可见缺陷):manifest 资产行 exact_key 有 7 例为裸形
(文件名含全角括号/顿号/间隔号)——html/redirect 键源数据侧已编码、asset
键来自文件名本体是裸形;浏览器对裸非 ASCII 一律百分号编码后发请求,预览
按请求字节逐字匹配 → 裸键永不命中 → 两页 3 张图破图(dist 文件在盘;
生产面 nginx 先解码不受影响)。修补 pipeline.toManifestRoute:exact_key
归一为 URL 线形(可打印 ASCII 原样、其余 UTF-8 百分号编码大写 hex),
target_file 仍盘上裸名、DB/渲染快照域不变。

回归三层:build-pipeline 注入裸全角资产行(红验证);preview-server 2c
非 ASCII redirect → Location → 资产终端 200;e2e 断言 ④c(7 条全查
跟随到终端 200)+ ⑦c(manifest 2772 键全 ASCII 不变量)。spec 复审复跑
(新库全链 job e059bf41)23/23 PASS,浏览器实测 3 张原破图全部加载。

证据文档:§5.2 失败计数修正(5×500+2×mojibake=7 例)、§2 ①c 措辞对齐
断言实义(抽前 3 标题)、§5.5 修补记录、计时/产物/job 面更新至复跑值。
验证:vitest 382 + 主题 26 全绿(408);typecheck 过;lint 裸跑零告警。

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-22 15:31:14 +08:00
parent c64f6ac48a
commit 236f3dc4d3
6 changed files with 306 additions and 70 deletions
+117 -37
View File
@@ -1,6 +1,6 @@
{
"verdict": "PASS",
"generatedAt": "2026-10-22T06:21:14.951Z",
"generatedAt": "2026-10-22T07:20:15.759Z",
"env": {
"node": "v24.13.0",
"platform": "win32",
@@ -10,55 +10,58 @@
},
"chain": {
"register": {
"runId": "20261022T142105-hiapw6",
"siteId": "599b435b-0778-4676-8a95-b134546a1eb8",
"siteCreated": false,
"connectionId": "3c6b9a48-0426-4f01-b822-56c20b5e8208",
"runId": "20261022T151903-lhppmd",
"siteId": "763a6544-dcdd-43c8-b1a9-11769f4b720a",
"siteCreated": true,
"connectionId": "05a9f6a7-cf67-4f0f-ac11-a4899378bd08",
"snapshots": [
{
"kind": "wxr",
"sha256": "f9bc5d4497a1",
"byteSize": 5490399,
"reused": true,
"reused": false,
"copied": false,
"durationMs": 15.189599999999928
"durationMs": 16.857200000000034
},
{
"kind": "media_bundle",
"sha256": "8b674261c104",
"byteSize": 172532000,
"reused": true,
"reused": false,
"copied": false,
"durationMs": 1288.2132000000001
"durationMs": 2684.0553999999997
},
{
"kind": "manual_url_list",
"sha256": "c935d444f52b",
"byteSize": 143945,
"reused": true,
"reused": false,
"copied": false,
"durationMs": 20.976500000000215
"durationMs": 24.289099999999962
}
]
},
"import": {
"jobId": "9d82df35-5c8a-4345-8156-3319c7ac9d67",
"jobId": "c7b4fd9d-61d6-46d5-8022-86259a1675ac",
"status": "succeeded_with_issues",
"reused": true,
"reportPath": "D:\\project\\cms-one\\artifacts\\import\\9d82df35-5c8a-4345-8156-3319c7ac9d67\\reports\\import.json"
"reused": false,
"reportPath": "D:\\project\\cms-one\\artifacts\\import\\c7b4fd9d-61d6-46d5-8022-86259a1675ac\\reports\\import.json"
},
"publish": {
"dryRunCandidates": 0,
"publishedCount": 0,
"dryRunCandidates": 192,
"publishedCount": 192,
"upToDateCount": 192,
"siteConfigRevision": null
"siteConfigRevision": {
"created": true,
"version": 1
}
},
"build": {
"jobId": "619c440c-f579-4647-99dc-2840dcd36f19",
"jobId": "e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e",
"status": "succeeded",
"reused": true,
"inputDir": "D:\\project\\cms-one\\artifacts\\jobs\\619c440c-f579-4647-99dc-2840dcd36f19\\input",
"reportPath": "D:\\project\\cms-one\\artifacts\\jobs\\619c440c-f579-4647-99dc-2840dcd36f19\\reports\\build.json",
"reused": false,
"inputDir": "D:\\project\\cms-one\\artifacts\\jobs\\e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e\\input",
"reportPath": "D:\\project\\cms-one\\artifacts\\jobs\\e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e\\reports\\build.json",
"counts": {
"contents": 192,
"taxonomies": 6,
@@ -71,14 +74,23 @@
},
"issues": [],
"artifacts": {
"distPath": "D:\\project\\cms-one\\artifacts\\jobs\\619c440c-f579-4647-99dc-2840dcd36f19\\dist",
"distPath": "D:\\project\\cms-one\\artifacts\\jobs\\e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e\\dist",
"distSha256": "b97ecbdaa37de096a5b780b9b3b2c889e9156a1c2bb06457cff4686436aa6276",
"distByteSize": 122929197,
"distFileCount": 1029,
"distSha256": "6883e70a1ae31f1f5244fef3315bd57a6c46eb08f078ac84d99373f21c621832",
"routeManifestPath": "D:\\project\\cms-one\\artifacts\\jobs\\619c440c-f579-4647-99dc-2840dcd36f19\\route-manifest.json",
"routeManifestPath": "D:\\project\\cms-one\\artifacts\\jobs\\e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e\\route-manifest.json",
"routeManifestSha256": "5b11f7f11da66dff6dcfac97bc0324178e8ed146227dc5b3df90c2cd49f2486d",
"routeManifestByteSize": 812072,
"sitemapEntries": 190,
"mediaCopied": 836
},
"marks": []
"marks": [
"queued",
"snapshotting",
"building",
"validating",
"succeeded"
]
}
},
"sqlCounts": {
@@ -116,14 +128,17 @@
]
},
"timings": {
"registerWallMs": 1771,
"registerServiceMs": 1750,
"importMs": 94,
"publishDryRunMs": 87,
"publishConfirmMs": 77,
"buildTotalMs": 11875,
"astroProbeMs": 7486,
"smokeMs": 1225
"registerWallMs": 2886,
"registerServiceMs": 2874,
"importMs": 57199,
"publishDryRunMs": 6,
"publishConfirmMs": 17,
"buildTotalMs": 9498,
"buildSnapshotMs": 431,
"buildBuildingMs": 8880,
"buildValidatingReportMs": 174,
"astroProbeMs": 4865,
"smokeMs": 285
},
"assertions": [
{
@@ -196,6 +211,13 @@
"pass": true,
"note": ""
},
{
"id": "④c 非 ASCII redirect → 资产终端(7 条全查)",
"expect": "301 → 跟随 Location 编码形 → 终端 200 + 图片 MIME(exact_key 编码线形命中)",
"actual": "[{\"request\":\"/?attachment_id=2835\",\"location\":\"/wp-content/uploads/2024/01/PE-water-supply-pipe-engineering-drawing-of-Wuxi-Wuai-Primary-School-%EF%BC%881%EF%BC%89.jpg\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/jpeg\"},{\"request\":\"/?attachment_id=3125\",\"location\":\"/wp-content/uploads/2024/03/Papua-New-Guinea-Water-Supply-Project-PE-Water-Supply-Pipe%EF%BC%88hesu%EF%BC%89.png\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/png\"},{\"request\":\"/changqing%c2%b7lixiang-cultural-tourism-street-project-steel-mesh-skeleton-pipe-1/\",\"location\":\"/wp-content/uploads/2024/04/Changqing%C2%B7Lixiang-Cultural-Tourism-Street-Project-Steel-Mesh-Skeleton-Pipe-1.png\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/png\"},{\"request\":\"/changqing%c2%b7lixiang-cultural-tourism-street-project-steel-mesh-skeleton-pipe/\",\"location\":\"/wp-content/uploads/2024/04/Changqing%C2%B7Lixiang-Cultural-Tourism-Street-Project-Steel-Mesh-Skeleton-Pipe.jpg\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/jpeg\"},{\"request\":\"/hdpe-carat-pipe/hdpe-carat-pipe-%ef%bc%881%ef%bc%89/\",\"location\":\"/wp-content/uploads/2024/10/HDPE-carat-pipe-%EF%BC%881%EF%BC%89.jpg\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/jpeg\"},{\"request\":\"/product/steel-belt-reinforced-pe-corrugated-pipe/steel-belt-reinforced-pe-corrugated-pipe%e3%80%81-4/\",\"location\":\"/wp-content/uploads/2023/12/Steel-Belt-Reinforced-PE-Corrugated-Pipe%E3%80%81-4.jpg\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/jpeg\"},{\"request\":\"/product/steel-belt-reinforced-pe-corrugated-pipe/steel-belt-reinforced-pe-corrugated-pipe%e3%80%81-5/\",\"location\":\"/wp-content/uploads/2023/12/Steel-Belt-Reinforced-PE-Corrugated-Pipe%E3%80%81-5.jpg\",\"hopStatus\":301,\"terminalStatus\":200,\"terminalContentType\":\"image/jpeg\"}]",
"pass": true,
"note": ""
},
{
"id": "⑤sitemap 条目数",
"expect": "= manifest indexable html 数(190)",
@@ -224,10 +246,17 @@
"pass": true,
"note": ""
},
{
"id": "⑦manifest 键线形",
"expect": "全 2772 键纯 ASCII(编码线形——裸非 ASCII 键 = 预览永不命中)",
"actual": "nonAsciiKeys=0",
"pass": true,
"note": ""
},
{
"id": "⑨门禁 validation_runs",
"expect": "job succeeded + validation_run PASS(build succeeded 即含门禁通过)",
"actual": "job=succeeded runs=[{\"id\":\"6dc3776b-7bd5-4199-aa95-2db8e8a5ea41\",\"status\":\"PASS\",\"rule_version\":\"min-gates-v1\"}] issues=[]",
"actual": "job=succeeded runs=[{\"id\":\"6459e0df-dd53-4158-b300-7c610100eeef\",\"status\":\"PASS\",\"rule_version\":\"min-gates-v1\"}] issues=[]",
"pass": true,
"note": ""
},
@@ -536,6 +565,57 @@
"locationMatch": true
}
],
"a4c": [
{
"request": "/?attachment_id=2835",
"location": "/wp-content/uploads/2024/01/PE-water-supply-pipe-engineering-drawing-of-Wuxi-Wuai-Primary-School-%EF%BC%881%EF%BC%89.jpg",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/jpeg"
},
{
"request": "/?attachment_id=3125",
"location": "/wp-content/uploads/2024/03/Papua-New-Guinea-Water-Supply-Project-PE-Water-Supply-Pipe%EF%BC%88hesu%EF%BC%89.png",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/png"
},
{
"request": "/changqing%c2%b7lixiang-cultural-tourism-street-project-steel-mesh-skeleton-pipe-1/",
"location": "/wp-content/uploads/2024/04/Changqing%C2%B7Lixiang-Cultural-Tourism-Street-Project-Steel-Mesh-Skeleton-Pipe-1.png",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/png"
},
{
"request": "/changqing%c2%b7lixiang-cultural-tourism-street-project-steel-mesh-skeleton-pipe/",
"location": "/wp-content/uploads/2024/04/Changqing%C2%B7Lixiang-Cultural-Tourism-Street-Project-Steel-Mesh-Skeleton-Pipe.jpg",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/jpeg"
},
{
"request": "/hdpe-carat-pipe/hdpe-carat-pipe-%ef%bc%881%ef%bc%89/",
"location": "/wp-content/uploads/2024/10/HDPE-carat-pipe-%EF%BC%881%EF%BC%89.jpg",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/jpeg"
},
{
"request": "/product/steel-belt-reinforced-pe-corrugated-pipe/steel-belt-reinforced-pe-corrugated-pipe%e3%80%81-4/",
"location": "/wp-content/uploads/2023/12/Steel-Belt-Reinforced-PE-Corrugated-Pipe%E3%80%81-4.jpg",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/jpeg"
},
{
"request": "/product/steel-belt-reinforced-pe-corrugated-pipe/steel-belt-reinforced-pe-corrugated-pipe%e3%80%81-5/",
"location": "/wp-content/uploads/2023/12/Steel-Belt-Reinforced-PE-Corrugated-Pipe%E3%80%81-5.jpg",
"hopStatus": 301,
"terminalStatus": 200,
"terminalContentType": "image/jpeg"
}
],
"smoke": {
"htmlTotal": 190,
"htmlFailures": 0,
@@ -544,14 +624,14 @@
}
},
"buildReport": {
"distPath": "D:\\project\\cms-one\\artifacts\\jobs\\619c440c-f579-4647-99dc-2840dcd36f19\\dist",
"distPath": "D:\\project\\cms-one\\artifacts\\jobs\\e059bf41-0ba6-4539-a9b4-6eb8a75c1b6e\\dist",
"distFileCount": 1029,
"mediaCopied": 836,
"sitemapEntries": 190,
"validation": {
"ruleVersion": "min-gates-v1",
"status": "PASS",
"runId": "6dc3776b-7bd5-4199-aa95-2db8e8a5ea41",
"runId": "6459e0df-dd53-4158-b300-7c610100eeef",
"p0Count": 0,
"p2Count": 0
},
@@ -559,6 +639,6 @@
"rewritten": 386,
"unresolved": 317
},
"durationMs": 11875.096499999992
"durationMs": 9485.525300000001
}
}