本文档地位:
/sky首页视觉的唯一权威(single source of truth)。取代:
SKY-VISUAL-STANDARD-v2.md(构图/色彩/亮度/判据全体继承并修订)、SKY-VISUAL-SPEC-v1.md、SKY-STYLE-DNA-v1.md、SKY-VISUAL-SPEC-v1-ADDENDUM-80-20.md(历史依据)。新增吸收:老板《Tempo Soul 首页视觉规格书 V1.0》(2026-09-16)+ 批次 510 样张实测修正。
建档:可吉(WorkBuddy)|日期:2026-09-16|批次:520
上位纪律:真实数据管线红线不得触碰;未验收不得部署线上。
把 /sky 首屏从「3D 城市场景」重新定义为「真实地理数据驱动的分层视觉合成系统」——这是正确的。但本批实测挖出了更根本的一件事:项目内部冻结的构图基线 CT-1,是老板参考图(ref-c)下半部被纵向压缩到 73.8% 的版本(两图上 48.8% 逐像素最大差仅 10,属 JPEG 噪声量级;下 51.2% 呈严格仿射关系 y=1.355x−344)。此后三个独立批次(440 / 480 / 490)、数千次迭代,全部在追这个被压缩过的靶子 —— 而且用错的判据把「城市带偏暗」判成了「城市带超亮」,修复方向整体反了。
一句话根因:靶子被改过,而且判据口径跟着一起错。 与技术能力无关。
⚠️ 本结论的证据等级与裁决状态(v3.0c 审计修正)
该结论现为 E1(本端可复现实测,方向经 falsify 检验),尚非 E0(E0 需要独立复核或老板确认)。它不依赖时间戳:方向性由「信息损失不可逆」检验确定 —— 5 种标准重采样核中最好的一个(LANCZOS)也只能从 CT-1 复原 ref-c 的 92.5% 细节,且下半部逐像素最大差达 243(远超「纯重编码」的色差量级),反命题被 falsify。
但「压缩是有意修改还是无意走样」这一点,文件本身无法回答 —— 只有老板能(§21 Q0)。 在 Q0/Q1 答复前,本文档凡由 ref-c 导出的全部阈值一律标记为「临时口径」(见 §1.4 与 §19.6)。
本文档是 /sky 首页视觉的 single source of truth。任何与本文件冲突的既有文档、代码注释、历史截图说明,以本文件为准。
| 文档 | 状态 | 处置 |
|---|---|---|
SKY-VISUAL-STANDARD-v2.md(CT-1 冻结版) | 降级为历史冻结基线 | 其 §1 北极星、§5 亮度体系、§6 元素模块、§7 风格基因 S1–S14、§8 排印、§12 红线 全数继承;其 §3 构图(CT-1 = 68.01%)被本文 §7 的 CT-2 取代,CT-1 资产本身不得删除、不得覆盖 |
SKY-VISUAL-SPEC-v1.md | 已被 v2 取代,v2 已被本文取代 | 保留为档案;其中 §3「亮度层级 L0–L5」是参数推导源,继续有效 |
SKY-STYLE-DNA-v1.md | 被继承 | §1 风格基因 S1–S14、§3 嫁接矩阵 全数有效 |
SKY-VISUAL-SPEC-v1-ADDENDUM-80-20.md | 部分废止 | 其「天 80 / 地 20」构图 废止(与 CT-2 的 57 / 43 冲突);其 §3 能量连接场、§4 地标可辨识度约束、§8 判据 V19–V28 继续有效 |
| 老板《Tempo Soul 首页视觉规格书 V1.0》(2026-09-16) | 主体采纳,8 处修正 | 见 §2 审计总表 |
docs/design/ 下全部基准图、D:\专家论证稿\、AI 地图主文件。本节的由来:v3.0 在 §2 写下「实测证据 > 老板原文 > 既有规范 > 我的推断」,但「本端实测」恰恰是我自己做的实验 —— 等于把「我的推断」换了个名字排到第二位。这构成一个循环:用自己未复核的实测去推翻别人的说法,再用「实测优先」这条自己定的规则为自己背书。 本节把这个漏洞制度化堵住。
| 等级 | 定义 | 可否用于推翻他人结论 | 可否写入硬判据 |
|---|---|---|---|
| E0 | 有确定性脚本 + 原始资产 + 第三方(含老板)复现成功 | ✅ 可以 | ✅ 可以 |
| E1 | 有确定性脚本 + 原始资产,本端单方复现(无外部复核) | ✅ 可以(但须标 E1) | ⚠️ 仅可作「临时口径」,须同步给出复核路径 |
| E2 | 估算 / 类比推理 / 未跑脚本的肉眼判断 | ❌ 不可以 | ❌ 不可以 |
| E3 | 我的推断、记忆、直觉 | ❌ 不可以 | ❌ 不可以 |
强制要求(写入流程,不写在别处):
本次已执行:§3.1c 的基准链溯源已按本节要求补齐脚本与证据等级,脚本
proto2d/verify_baseline_chain.py(确定性、无随机),输出assets-520/verify-baseline-chain.json+.log.txt+VERIFY-baseline-chain.png,复核路径见 §3.1e。
审计口径(v3.0c 修订):E0 实测 > 老板原文 > 既有规范 > E1 本端实测 > E2/E3 推断。
修订说明:v3.0 原文写的是「实测证据 > 老板原文 > 既有规范 > 我的推断」,其中「实测证据」被隐含等同为 E0。但本批全部实测均为本端单方复现(E1),把它排在老板原文之上,等于「用自己的实验推翻老板、再用自己定的规则背书」。现改为:E1 本端实测与老板原文并列,冲突时不自行判决,走 §21 开放问题。(老板原文若被 E1 实测挑战,须在 §21 立 Q,不得在正文直接推翻。)
本节状态:§2.1–§2.4 的条目本身不变,但其「依据」列的等级按 §1.4 重新标注。
| # | 老板 V1.0 条目 | 采纳理由 |
|---|---|---|
| 1 | 页面定义为「实时视觉场景」而非「3D 城市」 | 与 500/510 批实测结论一致;单相机追不出目标构图 |
| 2 | 7 层结构必须独立控制,不做成一个 3D Scene | 510 批实测:样张可分离出 9 层,层间零依赖 ⇒ 工程上成立 |
| 3 | 「不还原参考图,只继承构图 / 光线 / 气质 / 线条语言」 | 这是全篇最重要的一句,直接解掉「1:1 与红线互斥」的死结 |
| 4 | 星空必须真实天文计算(位置+时间+算法),禁随机撒点 / 禁图 | 项目已有 Astronomical Engine,属继承而非新建 |
| 5 | 地平线辉光是视觉锚点,且「极薄、极柔、不形成明显横线」 | 与 v2 §3.6 已知残留(辉光带)一致,v3 定为必须解决项 |
| 6 | 城市表现 = 高度 + 轮廓 + 极细线 + 局部辉光,不需要完整实体 | 直接推翻 480 批「5803 栋实体化」的错误路线 |
| 7 | 权重表:构图 ★5 / 氛围 ★5 / 轮廓 ★4 / 真实数据 ★4 / 建筑细节 ★2 / 真实 3D ★1 | 这张权重表是资源分配的唯一依据,写进 §9 作为调参优先级 |
| 8 | 城市肌理 = 「地图 × 星图 × 建筑线稿 × 粒子艺术」,禁 Google Maps / 3D 游戏感 | 与 §12 硬禁令一致 |
| 9 | 数据真实,表现艺术化(允许非线性视觉映射,不得虚构建筑) | 推翻我 500 批自设的「尺度天花板」约束 —— 老板是对的 |
| 10 | 小城市三级降级(真实建筑 → 真实路网+地形 → 抽象粒子结构) | 诸暨实测(8km 内仅 10 栋建筑)证明这是必需品,不是可选项 |
| 11 | 双引擎架构:Astronomical Engine + Geo-Luminous Engine + Visual Engine | 与项目现有模块边界吻合 |
| 12 | POC 五问验收(像不像那个世界 / 人在宇宙中 / 真实城市 / 生命节律 / 有无游戏赛博朋克感) | 用「人的眼睛」替代「机器数字」,正是 440 事故的根治药 |
| # | 老板 V1.0 写法 | v3 修正后 | 依据 |
|---|---|---|---|
| M1 | 「双视点合成是最值得保留的核心」 | 降级为「结果」,不是「核心」。 正确表述:每层只保留一个投影假设,⑦⑧ 拆成两个独立图层后,「双视点」自然涌现 —— 不需要「相机」这个概念存在。把它当核心追,就会重回「怎么让一台相机同时做两件事」的死循环 | 510 批;我的 v3/v4 原型正是死于此 |
| M2 | 「荧光粒子视觉世界」 | 精确为 线框 + 稀点光 + Bloom。城市主体是连续线框不是散点 | 实测:样张 ⑦城市天际线 12.7% + ⑧城市肌理 33.6% = 46.3% 是连续结构,非点云 |
| M3 | §20 技术栈「Three.js + WebGL」 | 方向对,但阶段 0 用不上 Three.js。阶段 0 是纯 2D 图层合成(Python/numpy 即可)。引入 3D 引擎会让人本能去建 3D 场景 —— 那正是卡死机制本身 | 500 批实验:v3 单相机原型失败、v4 分层原型骨架成立 |
| M4 | §12「Glow 宁可弱,不要强」 | 加限定条件:弱的是 Glow 半径与溢散,不是结构层亮度。样张实测下半区平均亮度 34.9 / p95 94.0 / 63.6% 像素 > 20 —— 它是「亮而细」,不是「暗而糊」。我 480/490 批按「暗而糊」做,方向反了 | 510 批实测 |
| M5 | §22「天空占 50–60%」 | 采纳,但必须同步裁定与 CT-1(68.01%)的冲突 → 定义新模板 CT-2,地平线 56 ± 2%。详见 §7 | 实测:老板参考图地平线 56.2%,落在 50–60% 内,与其 V1.0 自洽;与 CT-1 不自洽 |
| M6 | §26「三天 POC」 | 移出规范(规范不写工期),改写入执行计划 §19–§21,并拆成 Day 1/2/3 可验收的层 | 工期属计划域,不属标准域 |
| M7 | §25「第一阶段砍掉 GPS / IP 定位」 | 阶段 0 采纳;但项目现有 IP→坐标 L1 链路不得删除、不得改动,只是阶段 0 不接入 | 已有能力;「砍掉」应读作「暂不接入」,不是「拆掉」 |
| M8 | §18「可以把 10/20/30 映射成 10/25/50」 | 采纳原则,但必须落成代码约束(每图元带 source 字段),不能只是口头原则;否则「艺术合成引擎」会自然滑向「我画了一张好看的黑青插画」= 手绘 / AI 生图,再次触红线 | 510 批 §补充1 |
关于 M1 / M2 / M4 的等级声明(v3.0c):这三条是用本端 E1 实测去修改老板 V1.0 原文的表述。按 §2 修订后的口径,E1 不得直接推翻老板原文 —— 故这三条定位为「表述修正」而非「结论推翻」:它们没有改变老板的意图,只是把表述精确到可实现的层级(M1:双视点由「核心」变「结果」;M2:粒子由「散点」精确为「线框+稀点光」;M4:弱化的是「Glow 半径」而非「结构亮度」)。若老板认为这三条改动有违本意,请在 §21 立 Q 覆写。
| # | 条目 | 驳回理由 |
|---|---|---|
| R1 | §3「不要明显的银河 / 不要大面积紫红」 → 若读作「完全不要星云层」 | 实测样张存在第 ② 层「星野·银河雾」占 1.0% 面积。驳回「完全不要」,保留「极弱、只作背景存在」的原文限定 |
| R2 | §20「不建议把 Cesium 作为核心渲染器」 → 若读作「Cesium 完全不可用」 | Cesium 不用于首屏渲染是对的;但它可作为离线数据生产工具(地形/影像瓦片处理)候选之一。驳回「完全不可用」,保留「不作核心渲染器」 |
本表全部条目均为 E1(本端自纠) —— 即「我推翻我自己前批的结论」。按 §1.4 纪律 4,每条附「外部复核路径」。这些自纠本身不享受 E0 待遇。
| 结论 | 出处 | 实测 | 外部复核路径 | 处置 |
|---|---|---|---|---|
| 地平线在 69.76% | 480 批及之前的误读 | 该值来自标注面板的拼接缝(相邻行均值跳变最大处 50.88%,幅度 100.97)。v3.0c 更正归属:这条缝属于 SKY-BASELINE-CT1-annotated.png(2580×969 = 1920 画面 + 660 面板),不属于 ref-c。 ref-c(7.11)与 CT-1(7.98)均无拼接缝 | 跑 proto2d/verify_baseline_chain.py §B;或直接量三图行跳变 | 作废。真值 56.2%(行剖面)/ 58.4%(梯度法)。 |
| 「样张是暗色剪影,我在画灯珠,方向错了」 | 490 批我自己的结论 | 下半区 63.6% 像素亮度 > 20、最大连续亮块 479,805px。样张是中高亮度、纹理极密的青蓝色连续结构 | zone_probe_ct2.py / decompose_layers.py | 作废。上一批我因此把城市做得更暗更糊,方向反了。 |
| 「尺度天花板:诸暨最高 60m ⇒ 数学上做不出天际线」 | 500 批我自己的结论 | 「数据真实,视觉艺术化」允许非线性视觉高度映射 | 无需脚本,属原则性判断(E1→原则) | 降级为「物理真实天际线不成立」;Tempo Soul 不受此限 |
| 「双视点合成是核心技术」 | 500 / 510 批 | 拆层后每层只有一个投影假设 | decompose_layers.py 九层分离 | 降级为结果描述,见 M1 |
| 资产 | 尺寸 | 地平线(两法实测) | 暖色(月) | 来源 |
|---|---|---|---|---|
| CT-1 冻结基线 | 1920×969 | 69.14% / 68.01% | 0.0485% | docs/design/baseline/SKY-BASELINE-CT1.png |
| 老板参考图 ref-c | 1920×969 | 58.41% / 56.2% | 0.0485% | docs/design/redraw-20260914/_refs/ref-c-老板参考构图.jpg |
| 老板 V1.0 §22 文字 | — | 「天空 50–60%」 | — | 2026-09-16 规格书 |
三者中,老板 V1.0 的文字与自己的参考图(56–58%)自洽;CT-1(68–69%)是内部产物。
两种测量法:行剖面法(找地平线辉光峰值)与梯度法(行均值上升斜率最大处)。两法在两张图上系统性相差约 1–2 个百分点,故每个值给出两法结果。CT-2 取值见 §3.2。
| 指标 | CT-1(旧靶) | ref-c(真实目标) | 差异 |
|---|---|---|---|
| 地平线 | 69.14% | 58.41% | −10.7 pt |
| 天空区 mean(0–54%) | 7.96 | 8.06 | +1.3% ✅ 基本一致 |
| 带区 mean(54–60%) | 10.54 | 26.73 | +153.6% |
| 带区 >20 亮度像素占比 | 7.1% | 54.5% | +47.4 pt |
| 地貌区 mean(60–100%) | 30.69 | 35.27 | +14.9% |
| 纯黑 <12 | 59.5% | 54.4% | −5.1 pt |
| 下半区青蓝(>R+6 且 G>R+2) | 81.0% | 89.2% | +8.2 pt |
| 全域 mean | 17.22 | 20.07 | +16.6% |
带区差异是这张表的核心:CT-1 的地平线在 68–69%,所以它的「54–60% 带区」仍然全是暗天空(mean 10.54、仅 7.1% 像素 > 20)。而 ref-c 的地平线在 57–58%,同样的 54–60% 区间已经是真实城市(26.73、54.5% 像素 > 20)。
用 CT-1 当靶子测「带区」,等于拿天空去比城市。
v3.0c 重写说明:v3.0 原文把「时间戳(16:33 → 16:39,+6 分钟)」当作主要证据。这条证据强度不足 —— 文件 mtime 可被复制 / 导出 / 保存动作改写,它只能证明「同一会话内先后生成」,不能证明发生了「压缩」这个具体变换;而且仿射拟合本身对方向不敏感(无论谁是谁的缩放,都能拟合出高相关)。本节据此重写:以「信息损失不可逆」为主证据,时间戳降为旁证。 全部数据由
proto2d/verify_baseline_chain.py确定性复算产出。
| 区段 | 逐像素最大差 |
|---|---|
| y < 473px(< 48.81%) | 10(JPEG 量化噪声量级) |
| y ≥ 473px(≥ 48.81%) | 243(内容已错位) |
v3.0 原文记「上半部最大差 = 0」。v3.0c 更正为 ≤ 10 —— 原值系按 5% 间隔抽样测量所致(抽样带恰好避开了那几行),全行扫描后真实上界为 10。在 JPEG 噪声量级内,「同源」结论不变。
独立复算(枚举 a∈[0.60,1.60]、b∈[−400,400],最小化下半部行剖面残差):
y(ref-c)px = 1.355 × y(CT-1)px − 344 (H = 969,行剖面残差 = 0.7793) 等价:y(ref-c)% = 1.355 × y(CT-1)% − 35.5% 反解:CT-1 下半部 = ref-c 下半部 × 0.7380(压缩到 73.8%)
v3.0 原文记
1.36 / −348、73.5%。v3.0c 复算为1.355 / −344、73.8% —— 差异来自步长(原步长 0.01,本次 0.005)与插值方式(本次用np.interp而非最近邻)。两版结论一致,本版为准。
这是本次补上的、真正能 falsify 反命题的检验。设两个假说:
CT-1下半部 = 降采样(ref-c下半部, 0.738) —— ref-c 是源,CT-1 丢失细节ref-c下半部 = 升采样(CT-1下半部, 1.355) —— CT-1 是源,ref-c 只是被拉大检验法:把 CT-1 下半块按各标准核放大回 ref-c 几何,看能否复现 ref-c。
| 重采样核 | MAE(放大的CT-1, ref-c) | 梯度能量比(vs ref-c) |
|---|---|---|
| NEAREST | 4.26 | 88.0% |
| BILINEAR | 3.98 | 80.2% |
| BICUBIC | 3.93 | 88.2% |
| LANCZOS(最佳) | 3.94 | 92.5% |
| BOX | 4.26 | 88.0% |
5 种标准重采样核里最好的一个,也只能复原 ref-c 的 92.5% 细节。
若 CT-1 只是 ref-c 的再编码(同尺寸、仅色差),下半部逐像素差应 < 30。实测最大差 243 ⇒ 内容位置已改变 ⇒ 排除纯重编码。(这条同时回应审计意见 1 提出的「可能是导出工具的一次重新编码」假说。)
| 项 | ref-c | CT-1 | CT-1-annotated |
|---|---|---|---|
| 格式 / 尺寸 | JPG 1920×969 | PNG 1920×969 | PNG 2580×969 |
| EXIF | 空 | 空 | 空 |
| ICC | 456B sRGB / Google Inc. 2016 | 无 | 无 |
| mtime | 16:33:46 | 16:39:53(+366s) | 16:41:21(+88s) |
新发现(v3.0c):ref-c 内嵌的 ICC profile 描述为
sRGB、info 含Google Inc. 2016—— 这是 Chromium/Chrome 内嵌的 sRGB profile 指纹 ⇒ ref-c 由 Chromium 系产出(浏览器截图 / 浏览器「另存图像」)。 这意味着 ref-c 的 mtime 记录的是「保存动作」的时间,不是内容生成时间 —— 因此 mtime 单证不足以定方向(审计意见 1 成立)。 方向由 ③ 的信息损失检验确定。
| 项 | 内容 |
|---|---|
| 脚本 | D:\workbuddy\2026-09-15-00-01-41\sky-build\proto2d\verify_baseline_chain.py |
| 输入 | docs/design/redraw-20260914/_refs/ref-c-老板参考构图.jpg(262,699 B)<br>docs/design/baseline/SKY-BASELINE-CT1.png(1,626,873 B)<br>docs/design/baseline/SKY-BASELINE-CT1-annotated.png(1,807,857 B) |
| 随机性 | 无(全确定性计算,无抽样、无随机种子) |
| 输出 | docs/sky/assets-520/verify-baseline-chain.json(全部数值)<br>docs/sky/assets-520/verify-baseline-chain.log.txt(全文报告)<br>docs/sky/assets-520/VERIFY-baseline-chain.png(证据图) |
| 复现命令 | <python 3.13> proto2d/verify_baseline_chain.py(依赖 numpy / Pillow) |
| 当前等级 | E1 —— 待任一方复跑成功即升 E0 |
| 要老板做的 | 若您愿意,跑一次上面的命令并看一眼控制台 §D 段;或直接答复 §21 Q0 |
同一个脚本还顺带回答了审计意见 2 的两项(ref-c 纯净度、JPEG 量化敏感度),见 §3.1f。
审计指出两个隐患:(a) ref-c 疑似「画面 + 标注面板」复合 ⇒ 用作亮度基准会被污染;(b) V44/V45 的推导基于对一张 JPEG 的 p99.9 测量 ⇒ JPEG 量化本身会削峰,精确倍数不可靠。两项均已实查。
(a) 拼接缝归属 —— v3.0 原文张冠李戴,已更正
| 文件 | 尺寸 | 最大行跳变 | 最大列跳变 |
|---|---|---|---|
| ref-c | 1920×969 | 7.11 @y=34.47% | 10.11 @x=976 |
| CT-1 | 1920×969 | 7.98 @y=88.44% | 9.78 @x=976 |
| CT-1-annotated | 2580×969 | 100.97 @y=50.88% | 51.00 @x=1921 |
结论:那条「50.9% 拼接缝」属于 SKY-BASELINE-CT1-annotated.png,不属于 ref-c。 该文件是 2580 = 1920(画面)+ 660(标注面板)的横向复合图:列均值在 x=1919→1920 处由 12.83 跳到 60.00(面板左边框),面板底色 9.00–12.30。50.88% 的强行跳变由面板内容在纵向上的起止造成,与画面地平线无关。 历史「地平线 69.76%」正是在这张 2580px 复合图上误测的 —— 这解释了该错误的确切来源。
⇒ v3.0 原 D13「ref-c 在 50.9% 处有拼接缝」为错误归属,已在 §23.3 更正。
(b) ref-c 纯净度四查 —— 全部通过
| 查项 | 方法 | 实测 | 判定 |
|---|---|---|---|
| 上下边带 UI 条 | 行标准差(UI 条带=极低) | 上 5% 带 3.98(min 2.47)/ 下 5% 带 36.49 vs 全图 18.96 | ✅ 无条带 |
| 左右边带滚动条 | 列标准差 | 左 3% 6.80(min 5.85)/ 右 3% 6.79 vs 全图 22.5 | ✅ 无滚动条 |
| 纯色面板底 | 最长「同值水平游程」(阈值 25% 宽) | 318px = 16.56% @y=9.39% | ✅ 无面板 |
| 四角 logo / 水印 | 6% 方块亮度统计 | TL max 2.7 / TR max 2.0(纯黑,且 std 0.2–0.3) | ✅ 无浮层 |
⇒ ref-c 是单幅画面,不含标注面板 / UI 控件。§19 全部由 ref-c 导出的基准值未被污染,审计意见 2(a) 的风险排除。
(c) JPEG 量化敏感度 —— 结论方向可信,但精确倍数不可写死
把 CT-1(PNG 无损)按各质量重编码后重测:
| JPEG 质量 | p99.9 | Δp99.9 | 近白 L>200 占比 | Δ倍数 |
|---|---|---|---|---|
| 95 | 163.00 | +0.00 | 0.0071% | 0.97× |
| 90 | 163.33 | +0.33 | 0.0074% | 1.01× |
| 80 | 163.33 | +0.33 | 0.0075% | 1.03× |
| 70 | 163.67 | +0.67 | 0.0078% | 1.07× |
| 50 | 163.00 | +0.00 | 0.0082% | 1.12× |
对 ref-c(本身即 JPEG)重编码:p99.9 落在 164.0–165.67(Δ ≤ 1.34),近白占比 0.0060–0.0074%。
⇒ JPEG 量化对 p99.9 与近白占比的影响仅为「个位数点位」量级,而 480 批与目标的差距是 ~70 点 / ~130 倍量级。判据方向与量级完全可信;但「134 倍」「18.8 倍」这类精确倍数不得写成硬阈值。 §19.4b 的阈值已按此改为稳定域判据(见 §19.6)。
项目把老板的参考图下半部纵向压缩了 26.2%(压到 73.8%),并把这个压缩版冻结成「CT-1 基线」。此后 440 / 480 / 490 三个批次、数千次迭代,全部在追这个被压缩过的靶子。
⚠️ 两处必须由老板裁决、本端不得自行断定的地方(v3.0c 补)
- 意图未知:文件本身只能证明「发生了压缩」,不能证明这是有意修改还是无意走样(例如:某个上屏 / 截图 / 导出环节做了纵向适配,而产物被直接归档为基线)。只有老板能回答(§21 Q0)。
- 若压缩是有意为之,则 CT-1 本身就是「老板要的效果」,全部判据须回 CT-1 口径重算 —— 这是一个会翻转所有数字的岔路,必须以 Q0 为唯一开关。
在 Q0 答复前:§19 全部阈值标记为「临时口径」,不得用于终局判决(详见 §19.6)。
三层错误叠加:
| 层 | 错误 | 后果 |
|---|---|---|
| ① 靶子被改 | CT-1 = ref-c 压缩到 73.8% (是否为有意修改待 Q0 裁定) | 若为无意走样:城市永远比老板要的矮 26.2% |
| ② 判据口径错 | 用 CT-1 的 54–60% 带区(实际是暗天空,mean 10.54)去判定真实城市(ref-c 同区间 mean 26.73) | 「带区超标 +74.7%」判决方向完全反了 |
| ③ 自我加强 | 480 批据②继续把城市压暗、压扁(winGain 收敛、高度幂压缩、TILE_Z_SCALE 调整) | 越修离目标越远 |
证据图:docs/sky/assets-520/PROOF-ct1-is-compressed-refc.png(含两图城市体等高缩放对照 —— 压缩后两块内容一致)
对照图:docs/sky/assets-520/TARGET-OFFSET-ct1-vs-refc.png(含 CT-2 分区线与实测地平线标注)
候选模板 CT-2:地平线 57 ± 3%(实测两法 56.2% / 58.4%);分区 天空区 0–54%、带区 54–60%、地貌区 60–100%。
门禁的两道闸(v3.0c 新增,解决原版自相矛盾)
v3.0 原文写「确认前不进入实施阶段」,但同一批又「同批完成」了 S0 回填 —— 而回填确实是实施的第一步。这是自相矛盾,现拆成两道闸:
| 闸 | 允许做什么 | 禁止做什么 | 当前状态 |
|---|---|---|---|
| 闸 1 · 建表闸(不触碰 renderer,可逆,纯测量) | 重算基准值、建判据表、出证据图、写文档 | 写任何渲染 / 合成代码 | ✅ 已通过(S0 已执行,产物可一键回退) |
| 闸 2 · 施工闸(会产出画面与代码,方向性投入) | 执行阶段 0 的 S1–S12 | 在 Q0/Q1 未答复时动手 | 🔒 关闭中 —— 等 §21 Q0 / Q1 / Q2 |
理由:建表闸的产物是数字与文档,即使 CT-2 被否,也只需重跑一次 probe(§28 已列此回退);施工闸的产物是画面方向,一旦押错方向就会重演 440–490 那种「数千次迭代全废」。把两道闸分开,才能既不等死、也不押错。
闸 2 的唯一开关是老板的一句话(§21 Q0 与 Q1)。在拿到之前,本端不写任何渲染代码。
前三个独立批次(440 LED 点阵墙 / 480 青色栅栏 / 490 竖柱阵)全部被判定为「不达标」,而判定所用的数字,是拿 CT-1(68–69%) 当靶子算的。真实目标(ref-c,老板参考图)在 56–58%。
靶子偏了约 11 个百分点 ⇒ 所有「超标 / 达标」判决都失去意义。 这是「两千次仍卡住」的第一个根因,与技术能力无关。
而且判决方向是反的。 以 480 批的带区为例:
| 数值 | 对 CT-1(10.54)的判定 | 对 ref-c(26.73)的判定 | |
|---|---|---|---|
| 480 批实测带区 | 20.77 | 「超标 +74.7%」⚠️ | 「偏低 −22.3%」⚠️ |
同一个实测值,换个靶子,从「太亮」变成「太暗」,结论 180° 反转。
这意味着 480 批的修复方向可能一直是错的 —— 当时为「降带区亮度」做的多轮调参(TILE_Z_SCALE / 高度系数 / winGain 收敛),是在把已经偏暗的城市继续压暗,而真实目标是一块更亮、更密、更连续的城市带(ref-c 带区 54.5% 的像素亮度 > 20)。
这与 §2.4 中「样张是暗色剪影」的错误认知互为因果 —— 两者共同构成了 440–490 三批失败的真实原因。
让用户站在自己的此时此地,面对宇宙,看见自己的生命节律。
| 代号 | 判据 | 反例(出现即失败) |
|---|---|---|
| A1 | 层级分明,无平铺 | 所有元素同一亮度平铺;城市与天空糊成一片 |
| A2 | 暗空间是主体,亮是稀缺资源 | 全屏泛亮;大面积霓虹 |
| A3 | 减法优先 | 元素堆砌;为了"丰富"而加层 |
Cosmic + Human + Reality + Rhythm + Luminous Wireframe + Particle + Minimal + Deep Space + Real-Time Sky + Abstract Geography
中文:宇宙、人在其中、真实世界、生命节律、荧光线稿、粒子、极简、深空、实时星空、抽象地理。
关键词不是 "3D City"。任何以 "3D City" 为目标的实现路径,一律视为方向性错误。
样张经多尺度分解后得到 9 个可独立提取的层,层间零依赖。v3 采用此 9 层为实施口径。
| # | 层 | 实测面积 | 类别 | 与老板 V1.0 七层的映射 |
|---|---|---|---|---|
| ① | 天空底·大气渐变 | 25.8% | 工程层 | = 老板① 深空 |
| ② | 星野·银河雾 | 1.0% | 气质层 | = 老板① / ② |
| ③ | 星座网络·连线 | 2.2% | 气质层 | = 老板② 星座 |
| ④ | 月牙 | 0.04% | 气质层 | = 老板 §17 月亮(单列) |
| ⑤ | 中轴光柱 + 辐射网 | 6.0% | 气质层 · 骨架 | 老板 V1.0 缺此项 |
| ⑥ | 山脉框景·左右对称 | 3.2% | 气质层 | 隐含在老板④,v3 单列 |
| ⑦ | 城市天际线·密集塔群 | 12.7% | 工程层 | = 老板④ |
| ⑧ | 俯视城市肌理·路网街区 | 33.6% | 工程层 | = 老板⑤ |
| ⑨ | 前景·人影与地光 | 2.8% | 气质层 | = 老板⑥ + ⑦ |
铁律一:工程层撑体量,气质层定成败。
① ⑤ ⑦ ⑧ 合计 78.1%,是画面的体量;② ③ ④ ⑥ ⑨ 合计 9.2%,是画面的「气质」。后者任何一个缺失,画面从「作品」退化为「图表」。
前三个批次的全部工作量都投在 78% 的工程层里,那 9.2% 的气质层从未立起来。 这是「两千次仍卡住」的第二个根因。
铁律二:画面真正的构图骨架是第 ⑤ 层「辐射网」,不是城市。
它只占 6.0% 面积,却把月亮、人影、城市、道路全串在一条中轴线上。而且它可以直接由真实路网驱动 —— 这是真实地理数据在整个画面里最优雅的落点:既是构图骨架,又是数据落点,又是鼠标视差的载体。
createRadialGradient 直填的硬边贴片感)。保留(驳回 R1 的「完全不要」),但严格限幅:面积 ≤ 1.5%,亮度不超过相邻天空 +8。
数据来源(硬性):恒星位置必须由 用户位置 + 当前时间 + 天文算法 计算。不是随机撒点,不是背景图,不是 AI 生成。
| 项 | 规范 |
|---|---|
| 恒星 | 微小光点;不均匀分布;亮度有差异;极少数亮星明显突出;轻微呼吸 |
| 禁止 | 满屏均匀小点;游戏式星空;大量闪烁;彩色星星 |
| 星座 | 只显示重要星座(不全显);极细线;低亮度;线要像「有人用极细荧光笔在宇宙里轻轻画了一笔」 |
| 连线角度 | 相邻夹角标准差 ≤ 5°;总张角 ≤ 120°;禁止抖动 > 5°(继承 v2 §6) |
| 衍射星芒 | 禁止(继承 v2) |
真实时间 + 用户位置 计算。这是 v3 相对老板 V1.0 的新增层,优先级最高。
| 项 | 规范 |
|---|---|
| 形态 | 中轴一条光柱 + 由它辐射出的细网 |
| 骨架作用 | 串联月亮、人影、城市、道路;画面视觉重心落在此轴 |
| 数据驱动 | 用真实路网生成辐射网:以用户所在位置为原点,取 N 条主干道方向作为辐射线(N = 5–7,与 v2 §6 能量连接场条数一致) |
| 亮度 | 低于城市主体;不占 L1/L2 名额(焦点唯一律) |
| 禁止 | 在辉光带内形成横向连续亮带;抖动 > 5° |
表现优先级(严格按老板 V1.0 §7 权重表):整体构图 ★5 > 光线氛围 ★5 > 城市轮廓 ★4 > 真实数据 ★4 > 建筑细节 ★2 > 真实 3D ★1。
| 项 | 规范 |
|---|---|
| 图元 | 高度 + 轮廓 + 极细线 + 局部辉光。线框,非实体 |
| 禁止 | 实体填充;完整建筑模型;CAD / Google Earth / 游戏城市感 |
| 塔身 | 纯线框 + 窗格点阵(点径 1px / 间距 4px / α ≤ L5);禁止实体填充(继承 v2) |
| 地标高亮槽位 | 必须留。让人一眼认出「这是我的城市」的只有具体地标(样张右下有环形建筑、超出天际线一个量级的超高塔) |
| 480 批状态 | 判定「带区超亮 +74.7%」方向反了 —— 按 ref-c 应为「偏低 −22.3%」(§3.3);城市体纵高尚不足(目标 ≥ 40 pt);形态为「竖柱阵」,需重做 |
视觉目标:地图 × 星图 × 建筑线稿 × 粒子艺术。不是 Google Maps × 3D 游戏。
| 元素 | 表现 |
|---|---|
| 道路 | 极细发光曲线 |
| 建筑 | 低亮度几何轮廓 |
| 河流 | 连续柔和线条 |
| 地形 | 等高线 / 粒子轮廓 |
| 大型地标 | 明显但克制的轮廓 |
像素级事实:样张下半区实测 平均亮度 34.9、p95 = 94.0、亮度 > 20 的像素占 63.6%、最大连续亮块 479,805 px(占下半区 24%)、青蓝像素 96–98%。
即:⑧ 层是「亮而细」,不是「暗而糊」。 480 / 490 批按「暗而糊」做,方向反了(见 §2.4)。
人物是页面的情绪核心,但:
前景环境代表「人的现实世界」,语义链:宇宙 = 无限;城市 = 现实;人物 = 我;前景 = 我所处的人生环境。表现用几何线条、曲折结构、粒子、微弱荧光、不完整轮廓 —— 形成「复杂、曲折、但仍可向前走」的空间。
| 分区 | 区间(CT-2) | 内容 |
|---|---|---|
| 天空区 | 0 – 54% | ① ② ③ ④ 天空底 / 星野 / 星座 / 月 |
| 带区(地平线) | 54 – 60% | ③' 地平线辉光 · ⑤ 中轴光柱 · ⑥ 山脉 |
| 地貌区 | 60 – 100% | ⑦ 天际线 · ⑧ 肌理 · ⑨ 人影前景 |
| 项 | 指标 |
|---|---|
| 画幅 | 16:9 横向 Hero(基准 1920×969;须设计移动端降级,见 §13 Q4) |
| 地平线位置 | 57 ± 3%(实测 ref-c:行剖面法 56.2% / 梯度法 58.4%) |
| 城市集中区 | 画面中下部 |
| 城市体纵高 | ≥ 40 pt(判定口径:>20 亮度像素占比 > 35% 的连续行段;ref-c 实测 44.2 pt,CT-1 仅 32.5 pt —— 这是两靶的核心差异) |
| 人物位置 | 底部中央附近 |
| 两侧环境 | 形成天然视觉框架 |
| 天空区占比 | 50–60%(即上半部分为「黑色宇宙 + 星空」主体) |
| 暗区占比 | ≥ 50% 区域保持非常暗(黑色是本页重要的留白) |
🔒 临时口径:本表的「地平线 57±3%」与「城市体纵高 ≥ 40 pt」均由 ref-c 导出,在 §21 Q0/Q1 答复前为临时口径(§19.6)。Q1 若选 (B),地平线须改回 CT-1 的 68–69%,纵高判据随之作废(CT-1 只有 32.5 pt)。
| 角色 | 色 | 配额 | 说明 |
|---|---|---|---|
| 主色 | 黑 | ≥ 50% 面积 | 留白,不是「空」 |
| 第一视觉色 | 青蓝 / 电光蓝 | 画面主体结构 | 样张实测青蓝像素占 96–98%(下半区) |
| 第二视觉色 | 极淡白蓝 | 辅助 | 最亮线、关键轮廓 |
| 强调色 | 极少量暖色 | ≤ 0.5% | 仅限:极少数重要地标 / 特殊光点 / 用户交互反馈 / 月亮 |
暖色禁止大面积使用。 480 批实测暖色 0.008%(月亮缺失),需补齐至设计值但不得超过 0.5%。
| 级 | 用途 | 相对峰值 |
|---|---|---|
| L0 | 天光 / 地平线辉光底 | 最高 |
| L1 | 焦点唯一律 · 主焦点 | 1 名额 |
| L2 | 焦点唯一律 · 次焦点 | 1 名额 |
| L3 | 城市主体结构 | — |
| L4 | 次级线框 / 道路 | — |
| L5 | 窗格点阵 / 粒子 / 星座线 | α ≤ 0.14 |
层级判据(A1):必须一眼读出「星空 > 地貌 > 城市 > 人物 > 细节」五级层次,相邻两级峰值亮度差 ≥ 25%。禁止平铺。
原则(M4 修正版):弱的是「Glow 半径与溢散」,不是「结构层亮度」。宁可弱,不要强 —— 但不要因此把结构本身压暗。
核心线 ████ 第一层 Glow ░░████░░ 第二层 Glow ░░░░████░░░░
禁止 ████████████████ —— 一旦出现立即变成赛博朋克 / 游戏 UI / 科幻宣传片。
目标画面在数值上「亮而不爆」:均值高(地貌区 35.27)、尾部低(p99.9 = 164.3),近白 L>200 占比仅 0.0062%。
正确的 Glow 做法:
| 错误做法(480 批) | 正确做法 | |
|---|---|---|
| 能量形态 | 少数像素饱和成硬核(p99.9 235、近白 0.940%) | 大范围中亮度连续结构(p99.9 164、近白 0.0062%) |
| 观感 | 「LED 点阵墙」/ 竖柱阵 | 「一整块亮起来的城市」 |
| 数值特征 | 尖峰(尾部极高 + 均值偏低) | 平台(均值高 + 尾部低) |
一句话:靠「面」亮起来,不靠「点」爆出来。
操作禁令(v3.0c 按稳定域修订):
| 项 | 规定 |
|---|---|
| p99.9 | ≤ 185(目标 164.3;实测编解码噪声 ≤ ±1.4 ⇒ 阈值留有 ~15 倍噪声余量) |
近白 L>200 占比 | ≤ 0.06%(目标 0.0062%;噪声最大 ×1.12 ⇒ 阈值留有 ~10 倍余量) |
| 例外 | 仅月亮与地标辉光槽位允许超出;两者合计 ≤ 0.5% 面积,且不得形成 L>230 的饱和像素簇 |
v3.0c 修订说明:原版写「任何图层不得产生
L > 200的像素(月亮除外)」—— 这与实测不符(目标 ref-c 自身就有 0.0062% 的L>200像素)。禁令的对象不是「>200 的存在」,而是「>200 的规模与形态」 —— 即「少量离散点可以,成片硬核不行」。现按稳定域重写。此数值在 Q0/Q1 答复前为临时口径(§19.6)。
| 项 | 权重 | 说明 |
|---|---|---|
| 整体构图 | ★★★★★ | 先对构图,再谈其他 |
| 光线氛围 | ★★★★★ | 与构图同级 |
| 城市轮廓 | ★★★★ | |
| 真实数据 | ★★★★ | |
| 建筑细节 | ★★ | 不要再在细节上耗预算 |
| 真实 3D | ★ | 已证伪的方向 |
| 类 | 来源 | 说明 |
|---|---|---|
| A 星空粒子 | 真实恒星 | 天文计算 |
| B 城市粒子 | 建筑 / 道路 / 地标数据转换 | 数据真实,艺术化表达 |
| C 人物粒子 | 人物轮廓 | 青蓝边缘 |
| D 环境粒子 | — | 制造空间感 |
| 允许 | 禁止 |
|---|---|
| 极慢漂移 | 爆炸 |
| 呼吸 | 大幅飞散 |
| 微弱闪烁 | 快速旋转 |
| 鼠标产生轻微扰动 | 游戏粒子效果 |
| 局部聚集 | 粒子雨 |
| 元素 | 速度 |
|---|---|
| 星云 / 恒星 / 星座 | 极慢 |
| 城市粒子 | 慢 |
| 人物 | 极慢 |
| 环境 | 极慢 |
| 鼠标视差 | 即时但阻尼 |
| Glow | 缓慢呼吸 |
禁止快速动画。
| 对象 | 反应 |
|---|---|
| 星空 | 极轻微视差 |
| 城市 | 轻微空间偏移 |
| 人物 | 极小幅度跟随 |
| 粒子 | 微弱扰动 |
| 地标 | 局部响应 |
核心原则:用户应感觉「这个世界在呼吸」,而不是「我在操作一个 3D 游戏」。
3D 数据源 + 2.5D/2D GPU 合成 + WebGL 交互层
即:数据是 3D 的,合成是 2D 的,交互层挂 WebGL。这样既有视差 / 呼吸 / 响应,又不掉进「真正 3D 城市必须物理正确」的陷阱。
赛博朋克 · 科幻城市 · 游戏地图 · Google Earth 风格 · 写实 3D 建筑 · 大面积霓虹 · 大量彩色粒子 · 紫红色银河 · 强 Bloom · 机械 HUD · 雷达 · 数据面板 · 科技 UI · 大量文字 · 复杂按钮 · 普通网页渐变背景
| # | 禁令 |
|---|---|
| ❌ | 回归 AI 猜图 / AI 生图静态方案 |
| ❌ | 以位图整幅贴图作为默认路径(?plate=1 仅留档) |
| ❌ | stock 星空图片 / 普通 Three.js 星空模板 |
| ❌ | 引入实体材质 / 阴影 / 道路光带 / 大面积暖色 |
| ❌ | 破坏已解决能力(真实星空 / 星座标签 / 山脊 / 渐进时序 / 三层定位) |
| ❌ | 删除 docs/design/ 基准资产、D:\专家论证稿\、AI 地图主文件 |
| ❌ | 绕过 :8083 代理直连裸引擎 |
| ❌ | 未验收就部署线上 |
| ❌ | 把阶段 0 / 阶段 1 的沙箱产物(layer-.png / compose-.png / numpy 脚本)直接搬进线上前端(v3.0c 新增)。阶段 0 产物是语法样张,只用于与老板对拍;进入线上必须经阶段 2 的 WebGL 重写 + 五问复核。产物出口仅限 §25.1 的工作目录与 docs/sky/ |
| ❌ | 把复合 / 标注图用作测量基准(v3.0c 新增)。基准必须是单一画面文件;*-annotated.png(2580×969 等横向复合)只能用于人工阅读,禁止入任何 probe 脚本 —— 历史「地平线 69.76%」事故的直接成因即此 |
Tempo Soul
│
┌────────────────┴────────────────┐
↓ ↓
Astronomical Engine Geo-Luminous Engine
(天文引擎 · 已有) (地理灵境引擎 · 新建)
│ │
真实星空 / 月亮 / 星座 城市 / 建筑 / 山河 / 地标
│ │
└────────────────┬────────────────┘
↓
Visual Engine
(Shader / Particle / 分层合成)
↓
合成场景
↓
Hero 首屏
引擎间唯一契约:两者各自输出图层,不共享坐标系、不共享相机。Visual Engine 只负责按 §7 分区融合。
用户位置 + 当前时间
↓
真实地理数据(建筑 / 道路 / 河流 / 山脉 / 地标 / 高度)
↓
城市高度场 + 矢量数据
↓
┌──────────────┬──────────────┐
↓ ↓
投影假设 A 投影假设 B
低视点 高视点
↓ ↓
⑦ 城市天际线剪影 ⑧ 城市俯视肌理
↓ ↓
└──────────────┬──────────────┘
↓
GPU 分层合成
↓
①②③④⑤⑥ + ⑦⑧⑨ + Bloom + 调色
↓
Tempo Soul 首屏
注意:图中「投影假设 A / B」不实现为两个相机对象(M1)。它们是两个独立的图层生成函数,各自只保留一个投影假设。
| 层 | 阶段 0 | 阶段 1+ |
|---|---|---|
| 定位 | 不接入 | Browser Geolocation + IP 兜底 |
| 城市数据 | OSM(已有)+ DEM(已有) | + 政府开放数据 + 地标库 |
| 建筑 | Footprint + Height | 同 |
| 地形 | DEM → 山脊线 | 同 |
| 数据预处理 | Python / numpy | Python / Node.js |
| 城市数据格式 | 自定义 Geo Tile JSON / Binary | 同 |
| 高度场 | Raster / Heightmap(4000² @ 5 m/px) | 同 |
| 合成 | Python / numpy(2D 图层) | Three.js + WebGL |
| Shader | — | GLSL |
| 粒子 | — | GPU Particle |
| 荧光 | — | Bloom + 双层线条(RenderTarget) |
| 星空 | 已有 Astronomical Engine | 同 |
| 前端 | 不碰 | 现有 Tempo Soul 前端 |
为什么阶段 0 刻意不用 Three.js(M3):阶段 0 是纯 2D 图层语法复刻,不需要 3D 引擎。引入它会产生「我该建一个 3D 场景」的本能,而那正是导致 440–490 三批卡死的机制。Python/numpy 也更快 —— 改一行、0.2 秒出图,适合逐层对拍。
原则(老板 V1.0 §18):允许非线性视觉映射;不能把虚假的建筑说成真实建筑。
每一个图元(建筑 / 道路 / 河流 / 山脊 / 地标)必须携带 source 字段。
{
"id": "b_1042",
"kind": "building",
"source": "osm:way/123456789", // 真实来源;合成数据则为 "synth:roadside/v1"
"h_real_m": 60.0, // 真实高度(米)—— 永不改写
"h_visual": 138.0, // 视觉高度(单位)—— 可非线性映射
"lat": 29.7271, "lon": 120.2345,
"footprint": [[...]],
"synth": false
}
| # | 规则 |
|---|---|
| 1 | h_real_m / lat / lon / footprint 只能来自数据源,禁止在任何渲染阶段被改写或估算 |
| 2 | 视觉映射(h_real_m → h_visual)必须是单一、可审计、全局一致的函数,不得逐栋随机 |
| 3 | 合成图元(synth: true)必须在图层中可区分,且合成规则必须可复现(固定种子);不得用合成数据冒充实测数据 |
h_visual = clamp( pow(h_real_m, 0.35) * k , h_min , h_max )
k / h_min / h_max 为全局常量,写在本文件,改动需记变更记录。| 级 | 触发条件 | 表现 |
|---|---|---|
| Level 1 | 半径 R 内带高度建筑 ≥ 200 栋 | 真实建筑数据 → ⑦⑧ 完整 |
| Level 2 | 带高度建筑 < 200 栋,但路网 ≥ 100 段 | 真实道路 + 地形 → ⑧ 降级为「路网光带肌理」,⑦ 由路网+地形推断轮廓 |
| Level 3 | 路网也 < 100 段 | 抽象城市粒子结构(不做成「真实城市」),视觉语言不变 |
| 城市 | 半径 | 建筑 | 道路 | 水系 | 判定 |
|---|---|---|---|---|---|
| 北京·朝阳区 | 3 km | 5803 | 1232 | 47 | Level 1 |
| 诸暨·暨阳 | 8 km | 10 | 403 | 31 | Level 2(路网充足、建筑近零) |
诸暨市中心在开放地图上只有 10 栋建筑。中国中小城市的建筑数据基本空白 —— 路有人画,楼没人画。这不是渲染问题,是数据源事实。V1.0 的三级降级不是可选项,是必需品。
synth: true 标记。/geo/<city-slug>/
├── height.bin 高度场(raster)
├── buildings.bin 建筑 footprint + height
├── roads.bin 路网
├── water.bin 水系
├── dem.json 地形高程(生成 ⑥ 山脊)
├── landmarks.json 地标(⑦ 高亮槽位数据源)
└── meta.json { slug, name, lat, lon, radiusM, level, source, built_at }
渲染器完全一样,只更换 Geo Tile。 这是全球化成立的前提 —— 每个城市不再需要「生成一个场景」。
阶段 0 不生产任何 Geo Tile,不碰全球城市、不碰 GPS、不碰网页。
本节的数字分两档,不得混用:一档是实测量级(可作判据),一档是估算(E2)(只作设计目标,不作验收判据)。v3.0 原文把二者都写成了硬指标,现更正。
| 环节 | 目标 | 依据 | 等级 |
|---|---|---|---|
| 离线数据拉取 + 烘焙 | 一次性,可 20 分钟 | 实测:诸暨 8km / 16 片拉取实测 ~20 min;高度场 4000² @ 5 m/px 实测 ~0.2 s / 城市 | E1 实测 |
| 首屏加载 + 合成 | ~~≤ 300 ms~~ → ≤ 300 ms(设计目标) | E2 估算,非测量:由「CPU numpy 光线投射 10–20 s」类比推算「fragment shader < 10 ms 可达」。这是类比推理,不是实测 —— 阶段 2 必须以真实 profile 替换 | E2 估算 |
| 运行帧率 | 60 FPS | 行业基线;阶段 2 实测 | E2 → 待测 |
| 交互延迟 | 即时 + 阻尼 | 视觉需求,非性能指标 | 定性 |
关于「3 秒」的概念纠正:老板 V1.0 提到的「3 秒」混了「拉数据」与「首屏出图」两件事。拉取 + 烘焙留在离线(overpass 拉取可 20 分钟);首屏只做加载 + 合成。
阶段 2 的强制动作:在真实 GPU 上 profile 首屏,把 E2 估算替换为 E1 实测,再决定 ≤300 ms 能否作为验收判据。在那之前,任何「首屏性能达标」的声明都无效。
审计意见 5 指出:全部亮度测量都在 sRGB 数值域上做,而五问由老板的眼睛裁决 —— 若验收显示器未校准,「亮而不爆」(V44/V45)与「暗剪影」的观感判断可能互相打架。
| 项 | 规定 |
|---|---|
| 测量域 | 一律 sRGB 数值域(L = RGB 均值,0–255),不做任何显示器补偿 |
| 验收环境 | 老板的验收结论只在同一台显示器 + 同一亮度设置下有效;换设备后五问需重答 |
| 记录 | 每轮交付的 ROUND 文档须记「验收设备 / 亮度 / 是否夜间模式」 |
| 已知风险 | 若显示器偏冷 / 偏亮,V44「禁止近白核」的观感会更严;若偏暗,会放松 —— 以数值判据为硬约束,观感判据为软约束,两者冲突时按 §18.1 以眼睛为准,但须记录冲突 |
不再用「代码完成了吗」作为验收。只问下面 5 个问题。
| # | 问题 | 判定 |
|---|---|---|
| ① | 第一眼像不像那个世界? | 是 / 否 |
| ② | 有没有「人在宇宙中」的感觉? | 是 / 否 |
| ③ | 有没有真实城市的感觉? | 是 / 否 |
| ④ | 有没有生命探索 / 命运 / 节律的感觉? | 是 / 否 |
| ⑤ | 有没有明显的游戏 / 赛博朋克 / 地图产品感? | 有 / 没有 |
通过条件:① ② ③ ④ = 是,且 ⑤ = 没有。
当机器数字与人的眼睛冲突时,以眼睛为准。
| 优先级 | 判据 | 性质 |
|---|---|---|
| P0 | 五问 | 人之裁决 · 最高 |
| P1 | §19 量化判据(🔒 临时口径) | 机器辅助 · 失敏风险 |
| P2 | 层面积配额(§5.1) | 结构核查 |
五问的显示环境要求(v3.0c 新增 · 回应审计遗漏项):五问由眼睛裁决,故必须同一台显示器 + 同一亮度设置下作答;换设备后需重答。每轮 ROUND 文档须记录「验收设备 / 亮度 / 是否夜间模式」。详见 §17.1。
冲突处理:若数值判据(P1)与眼睛(P0)冲突 —— 按本节以眼睛为准,但必须把冲突写进 ROUND 文档,不得静默忽略(这是 440 事故「用失敏指标自我打勾」的制度性防范)。
⚠️ 全部阈值为「临时口径」—— 不得用于终局判决本节所有由 ref-c 导出的基准值(V41–V48 的阈值列)成立于「CT-2 取代 CT-1」这一裁定之上,而该裁定尚未获老板确认(§21 Q0 / Q1)。 因此:
允许 禁止 报趋势判决:偏高 / 偏低 / 方向反转 报终局判决:「达标」「不达标」 用作迭代时的相对刻度(这版比上版更接近目标) 用作放行依据(据此宣布某批通过验收) 在 Q1 答复后一键转正 在 Q0/Q1 悬空时对外声称「按规格书达标」 转正条件:§21 Q0 与 Q1 答复 + §3.1e 的复核路径被执行(E1 → E0)。
一键回退:若 Q1 选 (B)(仍以 CT-1 为准),本节全部数字作废,重跑 probe 即可(工作量:1 个脚本 + 本节表格)。
| 口径 | 天空区 | 带区 | 地貌区 |
|---|---|---|---|
| 旧(CT-1 / v2) | 0 – 51% | 51 – 68% | 68 – 100% |
| 新(CT-2 / v3) | 0 – 54% | 54 – 60% | 60 – 100% |
方法学:全部图像统一 resize 到 1920×969;
L = RGB 均值;亮度阈值为L值。口径一旦固定不得混用(§18.2 纪律一)。基准纯净度:ref-c 已做四项纯净度检查(边带 / 游程 / 边角 / 元数据),确认不含面板或 UI,数值未经污染 —— 详见 §3.1f(b)。
基准抗噪性:ref-c 为 JPEG,已实测量化敏感度:p99.9 在 q=50–95 区间波动 ≤ 1.34,基准值抗 JPEG 噪声 —— 详见 §3.1f(c)。
等级:全部为 E1(本端单方复现),脚本
verify_baseline_chain.py/zone_probe_ct2.py/target_offset.py。
| 指标 | CT-1(旧靶) | ref-c(新靶) | 480 批实测 | 判定 |
|---|---|---|---|---|
| 地平线位置 | 69.14% / 68.01% | 58.41% / 56.2% | ~70% | 靶子本身偏 11 pt |
| 天空区 mean(0–54%) | 7.96 | 8.06 | 7.28 | ✅ 接近 |
| 带区 mean(54–60%) | 10.54 | 26.73 | 20.77 | 偏低 −22.3% ⚠️ |
| 带区 >20 亮度占比 | 7.1% | 54.5% | — | 480 未测此项 |
| 地貌区 mean(60–100%) | 30.69 | 35.27 | 28.60 | 偏低 −18.9% ⚠️ |
| 地貌区 p95 | — | 95.67 | — | — |
| 下半区最大连续亮块 | — | 479,805 px(占下半区 24%) | — | — |
| 青蓝占比(下半区 · 严格) | 81.0% | 89.2% | — | 口径:B>R+6 且 G>R+2 |
| 青蓝占比(下半区 · 宽松) | — | 97.4% | — | 口径:B>R(旧记录「96–98%」即此口径) |
| 纯黑 <12 | 59.5% | 54.4% | 45.4% | 偏低 −9.0 pt ⚠️ |
| 暖色(月亮) | 0.0485% | 0.0485% | 0.008% | ✗ 月亮缺失 |
| 全域 mean | 17.22 | 20.07 | — | — |
| p99.9(最亮尾部) | 163.0 | 164.3 | 235.0 | ✗ 硬高光核 |
| 近白 >200 占比 | 0.0073% | 0.0062% | 0.940%(约为目标的 150 倍量级) | ✗ 差两个数量级 |
| 近白 >230 占比 | 0.0004% | 0.0001% | 0.245% | ✗ |
| 画面 max | 246.0 | 232.0 | 245.7 | — |
数值来源(v3.0c 校准):p99.9 与近白占比取
verify_baseline_chain.py§E 的确定性复算值(ref-c p99.9=164.33 / 近白 0.0062%;CT-1 p99.9=163.00 / 近白 0.0073%)。v3.0 原文记 «164.3 / 0.006%» 与 «163.0 / 0.007%»,结论一致,小数位以本节为准。
两个新发现(本批首次量化)
发现一(带区方向反了):480 批实测带区 20.77,对 CT-1(10.54)判「超标 +74.7%」,对 ref-c(26.73)应判「偏低 −22.3%」。同一数值,结论 180° 反转(详见 §3.3)。
发现二(硬高光核):目标图(CT-1 与 ref-c)几乎没有近白像素 —— >200 占比仅 0.006–0.007%,p99.9 ≈ 163。而 480 批 >200 占比 0.940%、p99.9 = 235。
这说明目标画面的城市是「亮而不爆」:均值高(35.27)、尾部低(p99.9 164)。480 批做成了相反的形态 —— 均值偏低(28.60)但尾部极高(235),即「大面积偏暗 + 少量爆亮硬核」。
这直接定义了 Glow 的正确做法:靠「面」亮起来(大范围中亮度的连续结构),不是靠「点」爆出来(少数饱和硬核)。 这条同时修正了 §9.2 —— 不只是「降 Glow 亮度」,而是禁止出现近白核。
抗噪性声明(v3.0c 补,回应审计意见 2(b)):审计质疑「对一张 JPEG 测 p99.9,JPEG 会削峰 ⇒ 精确倍数不可靠」。已实查并结论如下:把 CT-1 按 JPEG q=50–95 重编码,p99.9 波动仅 163.0–163.67(Δ ≤ 0.67),近白占比波动 0.0071–0.0082%(≤ 1.12×);ref-c 自身重编码波动 ≤ 1.34。⇒ 编解码器噪声为「个位点数」量级,而 480 批与目标的差距是 ~70 点 / 两个数量级 ⇒ 判据方向与量级不受 JPEG 影响。
但审计是对的:不得把「134 倍」这类精确倍数写进硬阈值。 §19.4b 已据此改为稳定域判据(见 §19.6)。
| 代号 | 层 | 判据 | 阈值 |
|---|---|---|---|
| V32 | ① 天空底 | 面积占比 | 24–28% |
| V33 | ② 星野雾 | 面积占比 | ≤ 1.5% |
| V34 | ③ 星座 | 面积占比 + 连线夹角标准差 | 2–3% / ≤ 5° |
| V35 | ④ 月牙 | 存在性 + 暖色占比 | 必须存在 / ≤ 0.5% |
| V36 | ⑤ 中轴辐射网 | 面积 + 条数 | 5–7% / 5–7 条 |
| V37 | ⑥ 山脉框景 | 面积 + 左右对称性 | 3–4% / 双侧呼应 |
| V38 | ⑦ 城市天际线 | 面积 | 11–14% |
| V39 | ⑧ 城市肌理 | 面积 + 平均亮度 | 32–36% / ≥ 32(防「暗而糊」) |
| V40 | ⑨ 人影地光 | 面积 + 人物相对亮度 | 2–4% / 暗于背景 |
判据列已改名为「趋势判决」 —— 在 §21 Q0/Q1 答复前,不允许出「达标 / 不达标」的终局判决(见 §19.6 规则 1)。
| 代号 | 判据 | ref-c 基准 | 允许区间 | 480 批 | 趋势判决 |
|---|---|---|---|---|---|
| V41 | 天空区 mean(0–54%) | 8.06 | 7.09 – 9.03(±12%) | 7.28 | ✅ 同量级 |
| V42 | 带区 mean(54–60%) | 26.73 | 22.72 – 30.74(±15%) | 20.77 | 偏低(−22.3%) |
| V43 | 地貌区 mean(60–100%) | 35.27 | 31.04 – 39.50(±12%) | 28.60 | 偏低(−18.9%) |
V42 是「靶子偏了 ⇒ 结论反转」的直接体现:同一实测值 20.77,对旧靶(10.54)判「超标 +74.7%」,对新靶(26.73)判「偏低 −22.3%」。
容差 ±12% / ±15% 的依据:E3 经验值(本端设定,非从数据推出) —— 阶段 0 期间须用真实样本方差校准,见 §19.6 残余风险 3。
依据 §19.2 发现二:目标画面没有近白像素,城市是「亮而不爆」。
v3.0c 修订:原版阈值
≤ 180/≤ 0.05%建立在单点测量 + 「134 倍 / 18.8 倍」的精确倍数论证上。审计指出 JPEG 量化会削峰 ⇒ 精确倍数不可靠。现改为稳定域判据 —— 阈值与目标值的余量放宽到编解码噪声的 10 倍以上,结论不再依赖精确倍数。
| 代号 | 判据 | ref-c 基准 | 稳定域阈值 | 编解码噪声(实测) | 480 批 | 趋势判决 |
|---|---|---|---|---|---|---|
| V44 | p99.9(最亮尾部) | 164.3 | ≤ 185 | ±1.4(q50–95) | 235.0 | 严重偏高(+~70 点) |
| V45 | 近白 L>200 占比 | 0.0062% | ≤ 0.06% | ×1.12(最差) | 0.940% | 高约两个数量级 |
| V46 | 纯黑 L<12 占比 | 54.4% | 50 – 58% | — | 45.4% | ⚠️ 偏低 |
| V47 | 暖色(月亮)占比 | 0.0485% | 0.02 – 0.5% | — | 0.008% | 月亮缺失 |
| V48 | 青蓝占比(下半区 · 严格口径) | 89.2% | ≥ 85% | — | — | 待测 |
稳定域阈值的设计逻辑(重要):V45 阈值 0.06% 与目标 0.0062% 之间留了 ~10 倍余量,而实测编解码噪声的最大漂移仅 1.12 倍。⇒ 阈值比噪声宽一个数量级,结论不依赖「精确倍数」这种脆弱论证。 480 批的 0.940% 即便打满噪声折扣,仍是阈值的 ~15 倍以上。结论稳健,但表述必须用「两个数量级」,不写「150 倍」这类精确倍数。
V44/V45 的操作含义:禁止出现近白硬核。 城市层要「整体提亮 + 消除爆点」,即把能量从「少数饱和像素」重新分配到「大范围中亮度连续结构」。
这是 480 批「竖柱阵」在数值上的真面目 —— 柱阵不是"太亮",是能量分布形态错误(尖峰而非平台)。
| 标记 | 含义 | 可作放行依据 |
|---|---|---|
| ✅ | 与目标同量级(趋势一致) | ❌(临时口径期) |
| ⚠️ | 偏离但方向正确,可接受为中间态 | ❌ |
| ✗ | 明显偏离 | ❌ |
| 🔒 | 临时口径:数值可用,判据待 Q0/Q1 转正 | — |
一句话:临时口径期内,本节的任何标记只是迭代刻度,不是验收结论。
审计原文:「这份文档最大的优点是『用证据推翻自己』,最大的隐患是 —— 它正在用同样自信的口吻,把一批尚未经老板确认(Q0/Q1)的数字写成硬判据。CT-1 的教训是『靶子被悄悄改了』;下一个教训可能就是『新靶子未经确认就被当成了铁律』。」
本节即为堵此漏洞而设。 三条硬规则:
| # | 规则 |
|---|---|
| 1 | 临时口径声明:§19 全部由 ref-c 导出的阈值,在 §21 Q0 与 Q1 答复前一律为「临时口径」。任何报告不得据此写「达标 / 通过 / 放行」。 |
| 2 | 稳定域优先于精确值:判据须满足「阈值与目标值的余量 ≥ 编解码 / 采样噪声的 10 倍」。不满足者只能作趋势指标,不得作硬阈值。已按此修订 V44/V45。 |
| 3 | 基准纯净性是使用前提:任何基准图进入 probe 脚本前,必须先过 §3.1f(b) 的四项纯净度检查(边带 / 游程 / 边角 / 元数据)。复合图(annotated)永久禁入(§12.2)。 |
残余风险(诚实列出,不掩饰):
| # | 残余风险 | 现状 | 处置 |
|---|---|---|---|
| 1 | Q0 意图未知 —— 若那个压缩是老板有意要的,则 CT-2 方向本身错误,全部数字需翻转 | 未解 | 等 §21 Q0;这是唯一的开关 |
| 2 | 全部测量为 E1(本端单方复现),无外部复核 ⇒ 存在「自己推翻自己、自己确认自己」的结构性弱点 | 未解 | 等 §3.1e 复核路径被执行(任一方复跑成功即升 E0) |
| 3 | 容差区间(±12% / ±15%)为依据不明 —— 系本端设定的工程容差,非从数据推出 | 未解 | 标 E3 经验值;阶段 0 期间用真实样本方差校准后再定为硬阈值 |
| 4 | 「地平线」两法差异 1–2 pt 未收敛 | 已知 | 全文一律并列两法结果;CT-2 取 57±3% 已覆盖该差异 |
docs/design/redraw-20260914/_refs/ref-c-老板参考构图.jpg(1920×969)— 🔒 待 §21 Q1 转正docs/design/baseline/ CT-1 冻结资产(保留,不覆盖,仅作历史对照)SKY-BASELINE-CT1-annotated.png 及任何复合 / 标注图进入 probe 脚本或任何测量管线(§12.2)。 该类文件只允许人工阅读。docs/design/ 下的基准资产。每次使用前可用 §3.1e 的脚本核一次尺寸与行跳变,确认未被改写。基准健康检查(v3.0c 新增,每次开批前 30 秒可跑):三张图的 (尺寸, 最大行跳变) 应为
ref-c: 1920×969 / 7.11、CT-1: 1920×969 / 7.98、CT-1-annotated: 2580×969 / 100.97。任一项不符 ⇒ 基准已被改写 ⇒ 立即停批、重跑 §3.1e 脚本、按 §28「基准资产被再次改写」处置。
改一层 → 出图 → 给需求方看 → 记「是/否」 → 下一层
<layer>-v<n>.png + 与 ref-c 的同尺寸叠放对照图。docs/sky/ROUND-YYYYMMDD-<批号>-<主题>.md + 同内容深色 HTML。| 条件 | 要求 |
|---|---|
| 本地预览 | 允许(127.0.0.1 端口,需说明端口) |
| 线上部署 | 必须五问全过 + 老板明示放行 |
| worktree 提交 | 按老板指令;默认不提交 |
主仓 src/ / functions/ | 零改动,除非老板明示 |
门禁提示:Q0 与 Q1 是 §3.2「施工闸」的唯一开关。在二者有明确答复前,本端不写任何渲染代码。(纪律来源:480 批「需求裁决悬空时自行默认选路」的教训。)
| # | 问题 | 选项 | 我的建议 |
|---|---|---|---|
| Q0 | CT-1 对 ref-c 的那个压缩(下半部缩到 73.8%、地平线下移 11 pt),是你当时要求的修改,还是一次无意的走样?<br>(v3.0c 补:本端已用信息损失检验证实「压缩」这一事实,但无法从文件推断意图 —— 只有你能回答) | (A) 我要的就是 ref-c 那种(城市更高更饱满)→ 按 CT-2 走<br>(B) 压缩是我要的(城市更矮更含蓄)→ 按 CT-1 走,但判据口径必须同步改<br>(C) 那是一次无意走样 / 我不记得有这个改动 → 按 CT-2 走,并把「基线产生环节」当作事故复盘<br>(D) 两者都不完全是,我另说 | A 或 C —— 无论哪个,结论都指向 CT-2;但只有你点头,它才从「临时口径」转正 |
| Q1 | CT-2(地平线 57±3%)是否取代 CT-1(69.14%)成为新验收靶子? | (A) 是,CT-2 转正,CT-1 存档 (B) 否,仍以 CT-1 为准 (C) 另定 | A —— 与老板 V1.0 §22「天空 50–60%」及 ref-c 实测(56.2% / 58.4%)自洽 |
| Q2 | 是否现在开工阶段 0(纯沙箱样张生成器)? | (A) 是 (B) 先看计划 | A |
| Q3 | 视觉高度映射的边界 | 真实 60m 的楼,轮廓 / 辉光最多增强到什么程度? | 增强轮廓与辉光;不虚构高度数值、数量、位置 |
| Q4 | 移动端竖屏(390×844)是否在阶段 0 处理? | (A) 阶段 0 只做桌面 (B) 同步做 | A(老板 V1.0 §25 亦明确砍掉) |
| Q5 | 小城市无数据时的对外表述 | (A) 不提示,静默降级 (B) 页面标注「数据稀疏」 | B(符合「不得把合成说成真实」) |
| Q6 | 验收显示环境(v3.0c 新增):五问在什么设备 / 亮度下作答? | (A) 就用你现在这台,以后每轮都在同一台 (B) 我再指定一台校准过的 | A —— 只要前后一致即可;§17.1 已把「同设备」写成硬约束 |
| Q7 | 关键测量的独立复核(v3.0c 新增):是否要指定一方复跑 §3.1e 的脚本? | (A) 不必,我信你的实测 (B) 我会跑一次 / 让 Codex 跑一次 (C) 先放着,等有空 | B —— 这是把 §3.1c 从 E1 升到 E0 的唯一途径;否则本文件的核心结论永远停在「待复核」 |
| 日期 | 版本 | 变更 | 作者 |
|---|---|---|---|
| 2026-09-16 | v3.0 | 建档。整合 SKY-VISUAL-STANDARD-v2.md、SKY-VISUAL-SPEC-v1.md、SKY-STYLE-DNA-v1.md、SKY-VISUAL-SPEC-v1-ADDENDUM-80-20.md,并审计吸收老板《Tempo Soul 首页视觉规格书 V1.0》。核心变更:① 定义 CT-2 构图模板(地平线 57±3%),与 CT-1 冲突裁定;② 确立九层模型与面积配额;③ 纠正「样张是暗色剪影」的错误认知(实为高亮密纹连续结构);④ 双视点降级为「结果」;⑤ 新增第 ⑤ 层中轴辐射网为构图骨架;⑥ 「数据真实,表现艺术化」落成代码约束 | 可吉(WorkBuddy)· 批次 520 |
| 2026-09-16 | v3.0a | S0 测量回填(同批完成)。按 CT-2 口径重算 ref-c 三区基准(天空 8.06 / 带 26.73 / 地貌 35.27);确认 CT-1 与 ref-c 地平线相差 10.7 pt(69.14% vs 58.41%);发现带区判定方向反转(480 批 20.77:对旧靶「超标 +74.7%」→ 对新靶「偏低 −22.3%」);新增尾部判据 V44/V45(目标 p99.9 = 164.3、近白 0.006%;480 批实测 235.0 / 0.940%,超标 18.8 倍)→ 确立「禁止近白核」硬指标(§9.2b);地平线取值由 56±2% 修订为 57±3%(两法实测 56.2% / 58.4%) | 可吉(WorkBuddy)· 批次 520 |
| 2026-09-16 | v3.0b | 变形链溯源(同批完成,本批最硬的一条证据)。逐像素差分证明 CT-1 的上半部(y<48.8%)与 ref-c 完全一致(最大差 = 0),下半部呈严格纵向仿射 y_refc = 1.36 × y_CT1 − 348,三点边界全部命中(误差 <0.2 pt)⇒ CT-1 = ref-c 下半部压缩到 73.5% 的版本;时间戳(16:33 输入 → 16:39 产出,+6 分钟)钉死方向。据此确立「两千次卡住」的完整根因链(§3.1d)。证据图 PROOF-ct1-is-compressed-refc.png | 可吉(WorkBuddy)· 批次 520 |
| 2026-09-16 | v3.0c | 审计回应批 —— 把「用未确认的数字写硬判据」这个新教训堵住。 外部审计提出 5 类问题,本版逐条修复:<br>① 证据强度:§3.1c 重写 —— 时间戳降为旁证(新发现 ref-c 的 ICC = Google Inc. 2016,系 Chromium 指纹 ⇒ mtime 只记「保存动作」),主证据换为信息损失不可逆检验(5 种重采样核最高仅能复原 ref-c 的 92.5% ⇒ 反命题 H2 被 falsify);新增「排除纯重编码」检验(下半部最大差 243)。仿射参数复算为 1.355 / −344 / 73.8%。<br>② 基准纯净度:发现那条「50.9% 拼接缝」属于 SKY-BASELINE-CT1-annotated.png(2580×969 = 1920 画面 + 660 面板),不属 ref-c —— 原 D13 属张冠李戴,已更正;ref-c 四项纯净度检查全通过。<br>③ 判据稳定性:实查 JPEG 量化敏感度(q50–95 下 p99.9 波动 ≤ 1.4、近白占比 ≤ 1.12×)⇒ 结论方向可信、但精确倍数不可写死;V44/V45 改为稳定域判据(余量 ≥ 噪声 10 倍),表述由「134 倍」改为「两个数量级」。<br>④ 制度补漏:新增 §1.4 证据等级(E0–E3)与复核制度,修正 §2 审计口径(E1 本端实测不再高于老板原文,冲突走 §21);§19 抬头加 「全部阈值 = 临时口径,禁止终局判决」 横幅,新增 §19.6 稳定域与残余风险表;§3.2 拆成 「建表闸 / 施工闸」两道闸(解决原版「确认前不作为」与「S0 已回填」的自相矛盾);§12.2 增两条红线(阶段 0 产物禁入线上前端 / 复合图禁作测量基准)。<br>⑤ 工程与遗漏:§17 把「≤300 ms」由硬指标降为 E2 估算并新增 §17.1 验收显示环境;§18.1 给五问加显示环境约束;§25.2 补 S7 稀疏高度场填充技术要点 与 S0b 复核步;§26 补 阶段 0→1 量化回归闸;§21 新增 Q6(显示环境)/ Q7(独立复核),Q0 增 (C) 「无意走样」选项。<br>新增可复现产物:proto2d/verify_baseline_chain.py + assets-520/VERIFY-baseline-chain.png + .json + .log.txt | 可吉(WorkBuddy)· 批次 520-C |
先摆困难,再谈路径。以下每条都有实测依据,不是预判。
| # | 困难 | 实测依据 | 严重度 | 缓解 |
|---|---|---|---|---|
| D1 | 验收靶子偏了 11 个百分点 —— 内部冻结 CT-1(68.01%)与老板参考图(56.2%)不是同一个资产 | 本批实测(§3.1) | 致命 | 裁定 CT-2(Q1);本批已默认按 CT-2 建判据,等老板一句话确认 |
| D2 | 我自己的靶子认知曾两次搞反(把「亮而细的连续密纹」当成「暗剪影」)→ 480/490 把城市做得更暗更糊 | 实测量化(§6.8) | 致命 | 本文 §6.8 已写死「亮而细,非暗而糊」;V39 加下限 ≥ 32 防回归 |
| D3 | 真实建筑数据在中国中小城市基本空白 —— 诸暨市中心 8km 仅 10 栋建筑 | Overpass 实测 | 高 | §15 三级降级;Level 2 = 真实路网 + 程序化建筑(带 synth 标记) |
| D4 | 逐栋建筑材质 → 必然产出「柱阵 / LED 点阵墙」 | 440 / 480 / 490 三批同一病征 | 高 | ⑦⑧ 改为整层剪影 / 连续线框生成,禁止逐栋独立发光;Voxel-Space 式高度场光线投射天然一体遮挡 |
| # | 困难 | 实测依据 | 缓解 |
|---|---|---|---|
| D5 | 参数在两极摆动:亮 → 柱阵;暗 → 细带 | 490 三版实测 | 根因是 D4。分层后每层独立出图、独立验收,不再全局调参 |
| D6 | 环境极不稳定 | Overpass 一次性 3km 查询被 504;Chrome 被系统策略拦(改 Edge headless 成功);CDP 每次截图后浏览器退出需重启;预览端口需常驻 | 固化脚本:Edge headless CDP + 端口探活(ProxyHandler({}) 禁代理)+ 截图后自动重启 |
| D7 | 线上 /api/geo 全部超时(25–28 s) | 今日实测 | 完全走本地离线烘焙 Geo Tile 路径,不依赖运行时 API |
| D8 | 大气透视 / 纵深感参数陌生(色比、衰减曲线) | 500 批原型 v4 下半部「仍需美术调校」 | 按 §9.3 权重表:氛围 ★5 优先,先定辉光与透视再抠轮廓 |
| D9 | 气质层(②③④⑤⑥⑨)无法用工程指标验收 —— 它们是美术判断 | 510 批:这 6 层合计仅 9.2% 面积,却是成败所在 | 必须由老板的眼睛裁决,这正是五问存在的理由;工程侧只保证「层存在 + 面积达标 + 不违反硬禁令」 |
| D10 | 迭代成本高 —— 前几批每次 8 轮调参、数千次工具调用 | 批次 440–490 实况 | 阶段 0 改逐层交付:一层一图一验收,单层失败不牵连全局 |
| # | 问题 | 说明 |
|---|---|---|
| D11 | 「3 秒渲染」是概念错位 | 拉取 + 烘焙(可 20 分钟)与首屏出图(≤ 300 ms)是两件事。把它们混在一起会得出「做不到」的错误结论 |
| D12 | 「街景地图」不可用于此 | 街景是地面视角 360° 照片:与「高空远眺」差 90°、无几何、无高度、本质是贴图(触红线)。可用素材只有三类:矢量建筑轮廓+高度 / DEM 高程 / 卫星影像(仅参考,不作底图) |
| D13 | 测量基准可能是复合图(v3.0c 更正归属) | 原 v3.0 写「ref-c 在 50.9% 处有拼接缝」—— 错误归属。 实测:那条缝属于 SKY-BASELINE-CT1-annotated.png(2580×969 = 1920 画面 + 660 标注面板,列边界在 x=1920)。ref-c 行跳变 7.11、CT-1 行跳变 7.98,均无拼接缝。⇒ 历史「地平线 69.76%」是在 2580px 复合图上误测的。新增红线:复合图永久禁入 probe 脚本(§12.2)。 详见 §3.1f(a) |
| D15 | 「本端实测」被当成「客观事实」(v3.0c 新增) | v3.0 审计口径把「实测证据」置于老板原文之上,但本批全部实测均为本端单方(E1) ⇒ 构成循环论证。已制度性修复:§1.4 证据等级 + §2 口径修订 + §19 临时口径横幅 + §21 Q7 独立复核。 |
| D14 | 「1:1 像素一致」与红线物理互斥 | 只有贴图或 AI 生图能做到;真实几何渲染数学上不可能。本文件 §4.2 已把它转为「同一套世界观」,不再追像素 |
阶段 0 语法复刻(不碰数据、不碰网页、不碰 GPS) ↓ 目标:稳定复刻视觉语言,五问通过 阶段 1 真实数据映射(只接一个城市:真实建筑 → 高度场 → ⑦⑧) ↓ 目标:数据进来后视觉语言不塌 阶段 2 工程化(WebGL/Three.js 重写 + GPU 合成 + 交互 + 性能) ↓ 目标:60 FPS、≤300ms 首屏、可交前端 阶段 3 全球化(Geo Tile 生产流水线 + 多城市)
因为一旦同时引入「数据」和「语法」两个变量,失败时就无法判断是语法错了还是数据错了。 490 批同时背真实数据 + 语法探索,结果在「数据稀疏」与「形态不对」之间反复纠结 —— 这是双变量陷阱。
阶段 0 的产物是一块纯语法样张(不含任何地理信息),它必须先独立通过五问。
| 日 | 老板 V1.0 原定 | v3 细化(按九层收敛) | 交付 |
|---|---|---|---|
| Day 1 | 画面骨架:黑宇宙 / 星云 / 星空 / 星座 / 地平线 / Glow / 城市抽象轮廓 | 层 ①②③ + 带区辉光 + ⑦ 抽象轮廓 | L1-day1.png + 五问 |
| Day 2 | 城市肌理 / 山体 / 道路 / 人物 / 粒子 / 双层空间 | 层 ④⑤⑥ + ⑧ + ⑨ | L2-day2.png + 五问 |
| Day 3 | 鼠标视差 / 粒子呼吸 / 星星动态 / 地标响应 / UI / 性能 | 交互层 + 性能 | L3-day3.png + 五问 |
工期是叙述性的,不是承诺 —— 只作为收敛刻度。验收按五问,按层,不按时间。
| 项 | 值 |
|---|---|
| 工作目录 | D:\workbuddy\2026-09-15-00-01-41\sky-build\stage0\ |
| 语言 | Python 3.13 + numpy(已就绪) |
| 输入 | ref-c-老板参考构图.jpg(1920×969)作构图与气质基准 |
| 输出 | layer-NN-<name>.png 逐层 + compose-v<N>.png 合成 |
| 主仓 | 零改动 |
| 未验收前 | 不接前端、不部署、不提交 |
阶段 0 不使用 Three.js / WebGL / 任何 3D 引擎(M3)。理由见 §13.3。
| 步 | 动作 | 技术要点 | 产出 | 验收 | |
|---|---|---|---|---|---|
| S0 | 用 CT-2 口径重算 ref-c 三区基准值(已执行 · 🔒 临时口径) | zone_probe_ct2.py + target_offset.py;排除拼接缝干扰(三图行跳变实测:ref-c 7.11 / CT-1 7.98 / annotated 100.97 ⇒ 复合图禁入) | 回填 §19.2 / §19.4;证据图 assets-520/TARGET-OFFSET-ct1-vs-refc.png | 数值已落表,待 Q0/Q1 转正 🔒 | |
| S0b | 基准链复核(v3.0c 新增) | 跑 verify_baseline_chain.py(确定性、无随机):溯源 / 拼接缝归属 / ref-c 纯净度 / 方向性 falsify / JPEG 抗噪 | assets-520/VERIFY-baseline-chain.png + .json + .log.txt | 任一方复跑成功即 E1 → E0(§21 Q7) | |
| S1 | ① 天空底 + 大气渐变 | 垂直渐变 + 分形噪声;纯黑 ≥ 50% | layer-01-sky.png | V32 | |
| S2 | ② 星野银河雾 | 分形噪声遮罩 + ≤ 9 blob,α ≤ 0.15 | layer-02-nebula.png | V33 | |
| S3 | ③ 真实星空 + 星座 | 接现有 Astronomical Engine;只显重要星座;夹角标准差 ≤ 5° | layer-03-star.png | V34 | |
| S4 | ④ 月牙 | 位置由时间+天文算;极小克制 | layer-04-moon.png | V35 | |
| S5 | 带区:地平线辉光 | 极薄极柔;中心向两侧衰减;不形成明显横线 | layer-05-glow.png | 目视 + 无横线 | |
| S6 | ⑤ 中轴光柱 + 辐射网 | 本阶段骨架层,用 5–7 条射线串联月 / 人 / 城市 | layer-06-axis.png | V36 | |
| S7 | ⑦ 城市天际线(抽象) | 高度场光线投射(Voxel-Space 式)→ 一体剪影 + 边缘光;留地标高亮槽位。<span style="color:#39FF14">稀疏高度场填充(v3.0c 补,回应审计意见 4):Level 2 城市(如诸暨)的真实 footprint 极稀疏,直接栅格化会得到「塌陷的剪影」。须按序补:① 以真实 footprint 为种子,沿真实路网两侧做各向异性膨胀(沿街方向权重高、垂直方向低),使建筑呈「沿街连续」而非「孤立孤岛」;② 对膨胀后仍低于 h_min 的区域,用低频噪声底床填充至 h_min(保证剪影连续、不塌);③ 全部填充体标注 synth:true 与 `fill:expand | bed`,与实测建筑在图层中可区分(§14.2 规则 3)。④ 剪影的「连续性」判据:单行连通段数 ≤ 8、最长连通段 ≥ 15% 宽</span> | layer-07-skyline.png | V38 + 五问 + 连通性 |
| S8 | ⑧ 城市肌理 | 俯视路网光带 + 街区低亮轮廓 + 河流柔和线 | layer-08-texture.png | V39(均值 ≥ 32) | |
| S9 | ⑥ 山脉框景 | 程序化山脊(DEM 留到阶段 1);左右对称 | layer-09-mountain.png | V37 | |
| S10 | ⑨ 人影 + 前景 | 暗剪影 + 青蓝粒子边缘;禁亮白立柱 | layer-10-figure.png | V40 | |
| S11 | 合成 + Glow + 调色 | 按 seam = 56% 融合;Bloom 双层线;Glow 只加半径不加亮度 | compose-v1.png | 五问 | |
| S12 | 交互(可选,Day 3) | 视差 + 呼吸 + 扰动(2D 近似即可) | compose-v2.gif | 目视 |
每完成 S1–S11 任一步,立即出图 + 报五问。老板说不行就停在那一步改,不往下走。
五问:① 是 ② 是 ③ 是(此处指「有城市感」,阶段 0 无真实数据,判据放宽为「抽象城市是否成立」)④ 是 ⑤ 没有。
全过 → 进阶段 1(换真实数据)。任一不过 → 停,回报,等指令。
只做一个城市:台北 101 × 3 km(不东京、不纽约、不全球)。
| 步 | 动作 | 验收 |
|---|---|---|
| 1 | 台北 101 3km 真实建筑 footprint + height → 高度场 raster(4000² @ 5 m/px) | 高度场可视化出图 |
| 2 | 真实路网 → 驱动 ⑤ 辐射网 + ⑧ 路网光带 | 骨架与原城市肌理吻合 |
| 3 | 真实 DEM → 驱动 ⑥ 山脊 | 山形合理 |
| 4 | 地标(台北 101)→ ⑦ 高亮槽位 | 一眼可辨识 |
| 5 | 五问复核 | ① ② ③ ④ 是 / ⑤ 没有 |
为什么选台北 101:项目已有台北数据与 Geo Tile 资产(taipei101-{L0,L1,L2,dem}.json),无需新拉数据;且 101 是「超出天际线一个量级」的地标样板,最能验证地标槽位。
审计原文:「§25 的 layer-NN 逐层产物与 §26 阶段 1 的 Geo Tile 格式之间缺少对拍方案 —— 阶段 1『数据进来后视觉语言不塌』的验收标准只有一句五问,没有量化回归。这是下一个『方向漂移』最可能发生的位置。」
本节即为补此缺口。 五问回答「像不像」,量化回归回答「有没有在换数据时把已经对好的东西弄坏」。
| # | 回归判据(阶段 1 产物 vs 阶段 0 达标的 compose-v1.png) | 阈值 | 性质 |
|---|---|---|---|
| G1 | 九层面积配额逐层偏移(§5.1 的 9 个占比) | 每层 ≤ ±20% 相对偏移 | 结构不塌 |
| G2 | 三区 mean(天空 / 带 / 地貌) | 每区 ≤ ±12% 相对偏移 | 光度不塌(与 §19.4 同容差) |
| G3 | 地平线位置 | 仍在 57 ± 3% | 构图不塌 |
| G4 | p99.9 / 近白占比(V44 / V45) | 仍满足稳定域阈值 | 能量形态不塌(防「竖柱阵」复发) |
| G5 | ⑤ 中轴辐射网 | 仍存在、条数 5–7 | 骨架不塌(最易被真实数据挤掉的一层) |
| G6 | 青蓝占比(下半区 · 严格口径,V48) | ≥ 85% | 色调不塌 |
执行纪律:
layer-NN 前后)。| 步 | 动作 | 技术 | 验收 |
|---|---|---|---|
| 1 | 把阶段 0/1 的 numpy 图层逻辑移植到 GLSL fragment shader | Three.js + WebGL + RenderTarget | 逐层与 numpy 版零重采样对拍一致 |
| 2 | GPU 粒子(四类) | GPU Particle | 60 FPS |
| 3 | Bloom 双层线荧光 | Shader / RenderTarget | 弱 Glow,无赛博朋克感 |
| 4 | 交互层 | 鼠标视差 + 阻尼 + 呼吸 | 「世界在呼吸」而非「操作 3D 游戏」 |
| 5 | 首屏性能 | 加载 + 合成 | ≤ 300 ms;稳定 60 FPS |
| 6 | 接前端 | 现有 Tempo Soul 前端 | 老板验收后才部署 |
| 风险 | 触发信号 | 回退 / 处置 |
|---|---|---|
| 阶段 0 五问不过 | 老板说「不像」 | 停在当前层,只改该层;不进入下一层,不接数据 |
| 又陷入「柱阵 / 细带」摆动 | 出现竖条纹或模糊细带 | 立即检查是否违反 D4(逐栋材质)→ 改整层剪影;并查 V44/V45(近白核) |
| 真实数据稀疏导致城市塌陷 | ⑦⑧ 面积 < 判据 | 触发 §15 三级降级;S7 的稀疏填充三序处理(膨胀 → 底床 → 标记);对外表述按 Q5 |
| 环境不可用(浏览器 / 网络) | 截图失败 / Overpass 504 | 用 Edge headless;数据走离线烘焙,运行时零依赖 |
| CT-2 裁定被否 | 老板选 Q1(B) | 全部判据回 CT-1 口径重算(工作量:重跑 probe + 改 §19 表 + §3.2 两道闸重判) |
| Q0 裁定「压缩是有意的」(v3.0c 新增) | 老板选 Q0(B) | CT-2 方向本身错误 ⇒ 按 CT-1 重算全部基准,并把「CT-1 = ref-c 压缩版」这一发现降级为「老板的设计选择」而非事故;§3.1d 的根因叙述需改写 |
| 关键测量被独立复核推翻(v3.0c 新增) | §21 Q7 的复核结果与本文不符 | 以复核结果为准,修正 §3.1c / §19 全部相关数字,并在 §22 记一条 v3.0d;不得辩解,直接改 |
| 阶段 1 语言漂移(v3.0c 新增) | G1–G6 任一超差 | 逐层二分定位(哪一层引入的偏移)→ 只回退该层;禁止在漂移未定位时叠加新功能 |
| 验收设备 / 亮度变更(v3.0c 新增) | 老板换显示器或改了亮度 | 五问必须重答(§17.1);历史五问结论标注为「旧设备下有效」 |
| 基准资产被再次改写(v3.0c 新增) | docs/design/ 下基准图 mtime 变化 / 尺寸变化 | 立即重跑 verify_baseline_chain.py;基准图为只读资产,禁止任何工具覆盖(§12.2 / §1.3 纪律 3) |
任何阶段的主仓改动:默认零。需改动前先出清单 + 备份 + 二次确认。
| # | 待办 | 依赖 | 闸 |
|---|---|---|---|
| 1 | 裁定 Q0(那个压缩是有意的还是走样) | 老板 | 闸 2 开关 |
| 2 | 裁定 Q1(CT-2 是否转正) | 老板 | 闸 2 开关 |
| 3 | 放行阶段 0(Q2) | 老板 | 闸 2 开关 |
| 4 | 复核基准链(Q7):跑一次 verify_baseline_chain.py | 老板 / 任一方 | E1 → E0 |
| 5 | ~~重算 ref-c 三区基准(S0)~~ 已执行 · 🔒 临时口径 | — | 闸 1 ✅ |
| 6 | 执行 S1–S11,逐层出图 | Q0 / Q1 / Q2 | 闸 2 |
| 7 | 复核五问(同一显示器,§17.1) | 老板 | — |
| 8 | 阶段 1 过量化回归闸 G1–G6 | 阶段 0 通过 | 闸 3 |
在 Q0 / Q1 / Q2 有明确答复前,我不动手写任何渲染代码。(纪律来源:需求裁决悬空时不得自行默认选路 —— 480 批的教训。)
本批(520-C)已做的,全部落在「闸 1(建表闸)」之内:重测、复核、修订文档、补证据脚本。一行渲染代码都没有写。