portal_pages.yaml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. # 门户页面与子页的"内容归口"登记表 (2026-09-17, 用户令 1)
  2. #
  3. # 回答两个问题:
  4. # ① 这一页/这一件 **该不该随输入数据(data/raw)变化**?
  5. # ② 它 **算不算产物**? 算的话归到哪、由谁生成、怎么查它陈旧没陈旧?
  6. #
  7. # 五个 kind (每个都有机器可查的规则, 见 scripts/pages_audit.py):
  8. # static 受管静态: 外壳正文(方法论/架构/案例叙述)。不随输入数据变, 进 git, 不引用产物。
  9. # live 实时取数: iframe/链接到组件服务或 API。永远与产物一致, 不需要快照, 也不进产物管理。
  10. # data-citing 静态正文 + **产物引用脚注**(如"判据全量见 outputs/<场>/…/findings.json")。
  11. # 正文不随数据变; 但被引用的产物路径必须**存在**, 否则引用悬空(挂羊头)。
  12. # data-derived 数据派生快照: 把产物/输入烘进页面(内嵌 JSON / 指纹 / 生成时间)。
  13. # ★**属于产物**: 必须登记 source + (source_sha256 或 generated_at), 并做陈旧检测。
  14. # frozen-delivery 冻结交付件: 带版本号与日期的客户交付件(治理清单/报告/资料包)。
  15. # 按**交付版本**变, 不随数据自动变; 必须能从文件名或正文读到版本号与日期。
  16. #
  17. # 判定依据(evidence)一律写清"凭什么这么判", 可复核: 看的是页面里有没有 iframe/fetch/内嵌数据/产物引用,
  18. # 以及内容是不是由 data/raw 算出来的。要改分类, 先改证据。
  19. version: 1
  20. farm: rudong
  21. # 产物路径写法统一: 一律以 outputs/<场>/… 记录(相对安装根), 便于陈旧检测直接定位文件
  22. pages:
  23. # ── 门户外壳里的静态叙述页 (受管, 不随数据变) ───────────────────────────────
  24. - id: index
  25. title: 总览
  26. kind: static
  27. changes_with_data: false
  28. file: release/portal_src/shell.html
  29. evidence: "外壳 #index 段 2,519 B: 0 iframe / 0 fetch / 0 产物引用; 正文是产品承诺与入口导航"
  30. - id: architecture
  31. title: 系统架构
  32. kind: static
  33. changes_with_data: false
  34. file: release/portal_src/shell.html
  35. evidence: "外壳 #architecture 段 3,037 B: 无数据引用; 描述分层架构"
  36. - id: method
  37. title: 方法
  38. kind: static
  39. changes_with_data: false
  40. file: release/portal_src/shell.html
  41. evidence: "外壳 #method 段 2,959 B: 无数据引用; 描述方法论"
  42. - id: findings
  43. title: 经验发现
  44. kind: static
  45. changes_with_data: false
  46. file: release/portal_src/shell.html
  47. evidence: "★用户问的三页之一。外壳 #findings 段 2,322 B: 0 iframe / 0 fetch / 0 产物引用; 正文是公司级经验叙述(59 项内部检查 → 8 条公开教训, 60+ 个风场), 不是本场站数据的函数 ⇒ 不该随输入数据变, 也不是产物。若将来要放本场站计数, 必须改成 data-derived 并登记 source"
  48. - id: case_hydraulic
  49. title: 案例·液压
  50. kind: static
  51. changes_with_data: false
  52. file: release/portal_src/shell.html
  53. evidence: "外壳 #case_hydraulic 段 6,187 B: 无数据引用; 案例叙述"
  54. # ── 实时取数页 (永远与产物一致) ──────────────────────────────────────────
  55. - id: cms
  56. title: 振动·CMS
  57. kind: live
  58. changes_with_data: true
  59. file: release/portal_src/shell.html
  60. live_target: http://127.0.0.1:18020/
  61. evidence: "外壳 #cms 段里 1 个 iframe + 2 个链接指向组件 :18020 (src/windcms/serve.py), 组件按需读产物 ⇒ 页面本身不存快照, 数据变了刷新即变"
  62. - id: recalc
  63. title: 数据重算
  64. kind: live
  65. changes_with_data: true
  66. file: release/portal_src/shell.html
  67. live_target: http://127.0.0.1:28084/ops
  68. evidence: "外壳 #recalc 段只有 1 个到 /ops 的链接(网关提供, 后端即真实状态)"
  69. - id: login
  70. title: 登录
  71. kind: live
  72. changes_with_data: true
  73. file: release/portal_src/shell.html
  74. live_target: http://127.0.0.1:18033/v2
  75. evidence: "外壳 #login 段链接到工作台 :18033/v2"
  76. - id: admin
  77. title: 系统状态
  78. kind: live
  79. changes_with_data: true
  80. file: release/portal_src/shell.html
  81. live_target: http://127.0.0.1:28084/healthz
  82. evidence: "外壳 #admin 段由外壳 JS 拉网关 /healthz 渲染(段内无静态数字)"
  83. # ── #sim 仿真与回放 ────────────────────────────────────────────────────
  84. - id: sim
  85. title: 仿真与回放
  86. kind: static
  87. changes_with_data: false
  88. file: release/portal_src/shell.html
  89. evidence: "★用户问的三页之一。外壳 #sim 段 50,767 B 是**静态叙述**(机理/图纸说明), 段内 0 iframe / 0 fetch; 6 个链接指向 :18792 仿真台页与 :64292 三维工作台。仿真台的输入是**图纸/机型参数**(configs/machine_packs), 不是 data/raw ⇒ 页面本体不该随输入数据变"
  90. children:
  91. - name: 控制律仿真台资料包 (5 页)
  92. file: release/如东SWT40_控制律仿真台_20260906.zip
  93. members_in_zip: ["0_四系统合页.html", "1_偏航系统.html", "2_传动链与功率.html", "3_发电机与热管理.html", "4_变桨轮毂液压.html"]
  94. served_by: release/sim_sys_server.py
  95. kind: frozen-delivery
  96. changes_with_data: false
  97. version: "20260906"
  98. evidence: "release/sim_sys_server.py 直接从 zip 里读这 5 页 ⇒ 冻结资料包(日期在包名里); 内容为图纸/机理仿真, 不随输入数据变"
  99. - name: 三维拆装工作台
  100. file: release/viewer/unit-workbench.html
  101. kind: static
  102. changes_with_data: false
  103. evidence: "release/viewer/** 由图纸/三维模型构建(build-*.py + esbuild), 与 data/raw 无关; rev=hub-review-v1 是评审版本号"
  104. - name: 控制律仪表台面板 (门户内嵌)
  105. file: release/portal_src/templates/tpl-swt40_控制律仪表台_外发版.html.html
  106. kind: data-citing
  107. changes_with_data: false
  108. cites: [outputs/rudong/yaw_verify/findings.json]
  109. known_gap:
  110. missing: [outputs/rudong/yaw_verify/findings.json]
  111. why: 引用的产物目录 yaw_verify/ 不在本包(振动线/偏航专项产物未随包); 本包同类台账在 outputs/<场>/sop/findings.json。不改交付件正文(那是客户手里的冻结版本), 但按「引用悬空」如实记账, 见 docs §7
  112. evidence: "面板正文是固定的判据/仪表说明, 只把产物当**脚注引用**('判据与证伪条件全量见 outputs/rudong/yaw_verify/findings.json') ⇒ 正文不随数据变, 但被引用的产物必须在位"
  113. - name: 四系统判据面板 (门户内嵌, 4 份)
  114. file: release/portal_src/templates/tpl-swt-subsystem-*.html.html
  115. kind: data-citing
  116. changes_with_data: false
  117. cites: [outputs/rudong/yaw_verify/findings.json]
  118. known_gap:
  119. missing: [outputs/rudong/yaw_verify/findings.json]
  120. why: "同仪表台: 引用 yaw_verify/ 专项产物, 该目录不在本包"
  121. evidence: "同仪表台: 静态正文 + findings 引用脚注"
  122. # ── #documents 交付文档 ───────────────────────────────────────────────
  123. - id: documents
  124. title: 交付文档
  125. kind: static
  126. changes_with_data: false
  127. file: release/portal_src/shell.html
  128. evidence: "★用户问的三页之一。外壳 #documents 段 5,690 B 是导航页(0 fetch), 1 个 iframe 指向网关下发的治理清单 HTML(release/如东/**)。段内不含数据快照"
  129. children:
  130. - name: 治理清单交付包 (分册 + 全册 + 正式报告)
  131. file: "release/如东/如东治理清单_交付_20260901/**/*.html"
  132. kind: frozen-delivery
  133. changes_with_data: false
  134. evidence: "文件名自带版本号与日期(如 如东_液压系统治理清单_v1.2_2026-09-01.html / 全册_v4.5_2026-09-06.html) ⇒ 客户交付件, 随交付版本变; 内容虽由分析产出, 但**冻结发布**, 不该随输入数据自动改"
  135. - name: 全场状态一览 (脱敏)
  136. file: release/如东/全场状态一览_脱敏_20260825.html
  137. kind: data-derived
  138. changes_with_data: true
  139. source: null
  140. known_gap:
  141. why: "内容是实际运行状态的函数(脱敏快照), 属产物性质; 但页面里没有任何指纹/生成时间/来源登记, 全仓也搜不到生成端 ⇒ 现在**无法做陈旧检测**。处置: 要么补生成端并改成带 source_sha256 的产物(推荐), 要么在登记表里把它降级为 frozen-delivery 并接受它会过期(需用户裁定)"
  142. evidence: "★这是问题所在: 1.5 MB 的场站状态快照(脱敏版), 内容是实际运行状态的函数 ⇒ **属于产物**, 但页面里**没有任何指纹/生成时间/来源登记**, 全仓也搜不到生成端 ⇒ 目前游离在产物管理之外(无溯源、无陈旧检测、无重算入口)"
  143. - name: 如东取数单
  144. file: release/如东/如东取数单_2026-08-21.html
  145. kind: data-derived
  146. changes_with_data: true
  147. cites:
  148. - outputs/rudong/cleaned/native_scturbine.parquet
  149. - outputs/rudong/m5_cms_tcm/tcm_index.parquet
  150. - outputs/rudong/structured/events/fastlog.parquet
  151. known_gap:
  152. missing:
  153. - outputs/rudong/cleaned/native_scturbine.parquet
  154. - outputs/rudong/structured/events/fastlog.parquet
  155. - outputs/rudong/structured/events/fault_scada_xml.parquet
  156. why: "取数单里列的 cleaned/、structured/ 两棵产物树不在本包(属缺失的六层链/结构化产物线, 见 docs §7); 本包在位的同类是 outputs/<场>/windscada/ 与 m5_cms_tcm/"
  157. evidence: 取数单是「要哪些数据」的清单页, 明列产物路径 ⇒ 随产物结构变; 现在只有日期没有指纹, 也没有生成端随包
  158. # ── 门户内嵌的数据派生页 (28 个模板里的) ──────────────────────────────
  159. - id: embed_replay_chain
  160. title: 传动链实际运行回放 (门户内嵌单文件版)
  161. kind: data-derived
  162. changes_with_data: true
  163. file: release/portal_src/templates/tpl-如东传动链实际运行诊断_单文件版.html.html
  164. embedded_json_var: RUDONG_ACTUAL_REPLAY
  165. source_key: source
  166. source_sha_key: source_sha256
  167. json_escaped: true
  168. source: outputs/rudong/cleaned/turbine_1min.parquet
  169. known_gap:
  170. missing:
  171. - outputs/rudong/cleaned/turbine_1min.parquet
  172. - outputs/rudong/cleaned/turbine_1min_fingerprint.json
  173. - outputs/rudong/gearbox_life/load_spectrum_summary.csv
  174. - outputs/rudong/gearbox_life/tcm_dynamic_severity.csv
  175. why: "页面烘入的 cleaned/ 与 gearbox_life/ 两棵产物树不在本包(六层链未随包, docs §7) ⇒ 内嵌快照**无法与当前产物比对**(拿不到当前值)。这恰恰说明它属于产物: 有 source+sha256 的机制已经齐了, 缺的是那份产物本身"
  176. evidence: "内嵌 window.RUDONG_ACTUAL_REPLAY 带 source=outputs/rudong/cleaned/turbine_1min.parquet 与 source_sha256 ⇒ 明明白白的产物烘入快照; **已可做陈旧检测**(产物在位时)"
  177. - id: embed_standard_panel
  178. title: 标准面板 (门户内嵌)
  179. kind: data-derived
  180. changes_with_data: true
  181. file: release/portal_src/templates/tpl-standard_panel_zh.html.html
  182. generated_at_key: 生成
  183. source: outputs/rudong/paradigm_r1/releases/E1_measure_replay_20260905/release.yaml
  184. cites:
  185. - outputs/rudong/structured/reference/turbine_master.parquet
  186. known_gap:
  187. missing:
  188. - outputs/rudong/paradigm_r1/releases/E1_measure_replay_20260905/release.yaml
  189. - outputs/rudong/structured/reference/turbine_master.parquet
  190. why: "引用的 paradigm 发布件与 structured/ 参考表不在本包(paradigm_r1 目录在, 但没有该 release 子目录) ⇒ 只能按正文里的生成时间判断新旧"
  191. evidence: "正文带 '生成 2026-09-05 16:28' 与产物引用 ⇒ 某次生成的数据快照; 缺 source_sha ⇒ 只能按生成时间+引用在位判断"
  192. - id: embed_coverage_ch0
  193. title: 覆盖度报告 ch0 (门户内嵌)
  194. kind: data-derived
  195. changes_with_data: true
  196. file: release/portal_src/templates/tpl-coverage_ch0_zh.html.html
  197. generated_at_key: 生成
  198. source: null
  199. known_gap:
  200. why: "正文写 '源: e1_base.parquet @e3b531b8eddf8197' —— 那份 e1_base.parquet 不在本包 ⇒ 指纹虽有, 但对不上任何在位文件, 溯源链断在包外; 只能按生成时间 2026-09-05 16:28 判新旧"
  201. evidence: "正文写 '生成 2026-09-05 16:28 · 源: e1_base.parquet @e3b531b8eddf8197 (10-min, 2,973,638 格, 38 台)' ⇒ 数据派生; 但 e1_base.parquet **不在本包** ⇒ 溯源链断在包外"
  202. - id: embed_u6_sim
  203. title: U6 变桨液压仿真台 (门户内嵌)
  204. kind: static
  205. changes_with_data: false
  206. file: release/portal_src/templates/tpl-U6_变桨液压仿真台.html.html
  207. evidence: "图纸派生的物理回路仿真台面板; 无内嵌数据/指纹/产物引用"
  208. - id: embed_u6_health
  209. title: U6 液压公共站健康报告 (客户版, 门户内嵌)
  210. kind: frozen-delivery
  211. changes_with_data: false
  212. file: release/portal_src/templates/tpl-U6_液压公共站健康报告_客户版.html.html
  213. version: "客户版"
  214. evidence: "984 KB 客户交付报告; 文件名标 '客户版'; 无数据指纹 ⇒ 按交付件冻结(缺版本号/日期, 见 audit 提示)"
  215. - id: embed_gearbox_report
  216. title: 整机综合诊断与风险评估 (主轴冲击深挖 V2.1, 门户内嵌)
  217. kind: frozen-delivery
  218. changes_with_data: false
  219. file: release/portal_src/templates/tpl-如东海上风电场_整机综合诊断与风险评估_主轴冲击深挖修订版V2.1.html.html
  220. version: "V2.1"
  221. evidence: "3.7 MB 综合诊断报告, 文件名带修订版号 V2.1; 报告类交付件按版本发布"
  222. - id: embed_reports_4
  223. title: 分系统评估报告 (主轴承/齿轮箱/发电机/变桨, 门户内嵌 4 份)
  224. kind: frozen-delivery
  225. changes_with_data: false
  226. file: release/portal_src/templates/tpl-report-*.html.html
  227. evidence: "4 份系统评估报告(0.7–3.4 MB), 无内嵌数据/指纹; 属交付报告(缺版本号/日期登记)"
  228. - id: embed_governance_12
  229. title: 治理清单分册 (门户内嵌 12 份)
  230. kind: frozen-delivery
  231. changes_with_data: false
  232. file: release/portal_src/templates/tpl-governance-*.html.html
  233. evidence: "12 份治理分册(0–11), 与 release/如东 下的分册同源; 冻结交付件"
  234. - id: embed_sc1_local
  235. title: SC1 本地占位 (门户内嵌)
  236. kind: static
  237. changes_with_data: false
  238. file: release/portal_src/templates/tpl-sc1-local.html.html
  239. evidence: "0.4 KB 占位面板"