portal_pages.yaml 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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。★2026-09-17 裁决: 已核 cleaned/ gearbox_life/ yaw_verify/ structured/ 四棵产物树**确实都不在包内**(Test-Path 全 False) ⇒ **如实记账保留**: 不删交付件正文, 也不删本条(删了就变成没人管的悬空引用); 待该产物线随包后再复检"
  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/ 专项产物, 该目录不在本包。★2026-09-17 裁决: 四个被引目录均**确实不在包内** ⇒ 如实记账保留(同上)"
  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: frozen-delivery
  138. changes_with_data: false
  139. version: "20260825"
  140. source: null
  141. known_gap:
  142. why: "**性质是数据派生**(内容是实际运行状态的函数, 脱敏快照), 但页面里没有任何指纹/生成时间, 全仓搜不到生成端 ⇒ 无法做陈旧检测、无重算入口。2026-09-17 裁决: **按冻结交付件管**(kind=frozen-delivery), 与 delivery_pages_all 的统一口径一致; 残留风险如实记账 —— 它会随时间变旧, 重算链不会刷新它; 若要它随数据变, 需另做生成端并补 source_sha256"
  143. evidence: "★2026-09-17 用户裁决前的问题: 1.5 MB 的场站状态快照(脱敏版), 内容是实际运行状态的函数 ⇒ **属于产物**, 却没有任何指纹/生成时间/来源登记, 全仓搜不到生成端 ⇒ 曾游离在产物管理之外(无溯源、无陈旧检测、无重算入口)。**保留不删**: 它是客户手里的交付件, 删了交付就缺件"
  144. - name: 如东取数单
  145. file: release/如东/如东取数单_2026-08-21.html
  146. kind: frozen-delivery
  147. changes_with_data: false
  148. version: "2026-08-21"
  149. cites:
  150. - outputs/rudong/cleaned/native_scturbine.parquet
  151. - outputs/rudong/m5_cms_tcm/tcm_index.parquet
  152. - outputs/rudong/structured/events/fastlog.parquet
  153. known_gap:
  154. missing:
  155. - outputs/rudong/cleaned/native_scturbine.parquet
  156. - outputs/rudong/structured/events/fastlog.parquet
  157. - outputs/rudong/structured/events/fault_scada_xml.parquet
  158. # ★2026-09-19 补: 取数单里还引用了 `m5_cms_tcm/tcm_index.parquet`(w0127 首窗索引)。
  159. # 它是"包内无生成端"的那一批之一 —— 本机的摄入只产出 `windows/<窗>/index.parquet`
  160. # (实测现为 windows/w0316/), w0127 那种"索引放 m5 根"的首窗特例没有生成端,
  161. # 清过产物后就不在位了。按「引用悬空」如实记账(不删交付件正文, 也不假装它在位)。
  162. - outputs/rudong/m5_cms_tcm/tcm_index.parquet
  163. why: >-
  164. 取数单里列的 cleaned/、structured/ 两棵产物树不在本包(属缺失的六层链/结构化产物线, 见 docs §7);
  165. 本包在位的同类是 outputs/<场>/windscada/ 与 m5_cms_tcm/。
  166. ★2026-09-19 实测补充: 它引用的 m5_cms_tcm/tcm_index.parquet = **w0127 首窗索引**(随包件),
  167. 清过产物后不在位, 而本机重算只产出 windows/<窗>/index.parquet ⇒ 该引用同样悬空。
  168. 2026-09-17 裁决: **按冻结交付件管**(kind=frozen-delivery, 与 delivery_pages_all 口径一致) ——
  169. 包内无生成端, 它是"2026-08-21 那一版要哪些数据"的清单, 冻结在交付日;
  170. 残留风险: 产物结构再变它也不会自动跟, 需重出交付版
  171. evidence: >-
  172. 取数单是「要哪些数据」的清单页, 明列产物路径 ⇒ **性质上随产物结构变**;
  173. 但只有日期没有指纹, 也没有生成端随包 ⇒ 无法自动刷新。**保留不删**:
  174. 另有 3 处交付侧引用它(`release/如东/如东取数单_2026-08-21/README.md`、
  175. `如东现场一页单*.md`), 删了就成悬空引用
  176. # ── 页面侧产物 (页面读的就是它们; 用户令 2026-09-17: 是产物就要纳入产物管理) ──────────
  177. - id: page_product_cms
  178. title: CMS 评估报告页/件 (门户「振动·CMS」页读的就是它们)
  179. kind: data-derived
  180. changes_with_data: true
  181. file: outputs/rudong/windcms/index.html
  182. known_gap:
  183. missing: ['outputs/rudong/windcms/index.html']
  184. why: >-
  185. 打包口径明确排除 outputs/(产物不随包,页面数据在目标机重算生成)⇒ 包副本里该件必然查不到;开发树里它是在位的(2026-10-01 实测在位)。属"不随包",非缺件。
  186. source: outputs/rudong/m5_cms_tcm/windows/w0316/index.parquet
  187. generator: scripts/windcms.py report
  188. generated_at_source: mtime
  189. evidence: >-
  190. 门户 #cms 的 iframe 指向组件 :18020, 组件页读的就是 outputs/<场>/windcms 下的这些页面件
  191. (index.html / 逐台页 / workbench.html / report_*.md) —— 它们是**产物**(由 windcms 报告生成器读
  192. TCM 窗索引写成), 不是程序。本包缺六层链的 model_run/fusion 产物, 重生成会掉内容 (report.md −97%,
  193. docs §7), 故**不在重算链里重建**, 交付时按随包件补齐并登记为 shipped。
  194. 管理动作: 登记(本条) + 溯源(_provenance.json 的 shipped) + 陈旧检测(源=TCM 窗索引的 mtime/sha)。
  195. - id: page_product_vib_raw_manifest
  196. title: 振动摄入清单 (数据层「CMS 振动评估报告」页引用)
  197. kind: data-derived
  198. changes_with_data: true
  199. file: outputs/rudong/m5_cms_tcm/vib_raw_manifest.json
  200. known_gap:
  201. missing: ['outputs/rudong/m5_cms_tcm/vib_raw_manifest.json']
  202. why: >-
  203. 打包口径明确排除 outputs/(产物不随包,页面数据在目标机重算生成)⇒ 包副本里该件必然查不到;开发树里它是在位的(2026-10-01 实测在位)。属"不随包",非缺件。
  204. source: outputs/rudong/m5_cms_tcm/windows/w0316/index.parquet
  205. generator: scripts/vib_raw_build.py
  206. generated_at_source: mtime
  207. evidence: >-
  208. 每次振动摄入重写: 记本窗索引/谱库的件数、时间跨度与**未随包的六层链缺口**(missing_chain)。
  209. 数据层页面与 docs §7 都引用它 ⇒ 属产物, 且已在台账中自登记。
  210. - id: embed_replay_chain
  211. title: 传动链实际运行回放 (门户内嵌单文件版)
  212. kind: data-derived
  213. changes_with_data: true
  214. file: release/portal_src/templates/tpl-如东传动链实际运行诊断_单文件版.html.html
  215. embedded_json_var: RUDONG_ACTUAL_REPLAY
  216. source_key: source
  217. source_sha_key: source_sha256
  218. json_escaped: true
  219. source: outputs/rudong/cleaned/turbine_1min.parquet
  220. known_gap:
  221. missing:
  222. - outputs/rudong/cleaned/turbine_1min.parquet
  223. - outputs/rudong/cleaned/turbine_1min_fingerprint.json
  224. - outputs/rudong/gearbox_life/load_spectrum_summary.csv
  225. - outputs/rudong/gearbox_life/tcm_dynamic_severity.csv
  226. why: "页面烘入的 cleaned/ 与 gearbox_life/ 两棵产物树不在本包(六层链未随包, docs §7) ⇒ 内嵌快照**无法与当前产物比对**(拿不到当前值)。这恰恰说明它属于产物: 有 source+sha256 的机制已经齐了, 缺的是那份产物本身。★2026-09-17 裁决: 两棵目录确实不在包内 ⇒ 记账保留, 不删页面(它是门户内嵌件, 删了门户裂口)"
  227. evidence: "内嵌 window.RUDONG_ACTUAL_REPLAY 带 source=outputs/rudong/cleaned/turbine_1min.parquet 与 source_sha256 ⇒ 明明白白的产物烘入快照; **已可做陈旧检测**(产物在位时)"
  228. - id: embed_standard_panel
  229. title: 标准面板 (门户内嵌)
  230. kind: data-derived
  231. changes_with_data: true
  232. file: release/portal_src/templates/tpl-standard_panel_zh.html.html
  233. generated_at_key: 生成
  234. source: outputs/rudong/paradigm_r1/releases/E1_measure_replay_20260905/release.yaml
  235. cites:
  236. - outputs/rudong/structured/reference/turbine_master.parquet
  237. known_gap:
  238. missing:
  239. - outputs/rudong/paradigm_r1/releases/E1_measure_replay_20260905/release.yaml
  240. - outputs/rudong/structured/reference/turbine_master.parquet
  241. why: "引用的 paradigm 发布件与 structured/ 参考表不在本包(outputs/<场>/paradigm_r1/ 下只有 experiments/, 没有 releases/; structured/ 目录不存在) ⇒ 只能按正文里的生成时间判断新旧。★2026-09-17 裁决: 两处在包内均不存在 ⇒ 记账保留, 不删内嵌件(门户 #method 段在用)"
  242. evidence: "正文带 '生成 2026-09-05 16:28' 与产物引用 ⇒ 某次生成的数据快照; 缺 source_sha ⇒ 只能按生成时间+引用在位判断"
  243. - id: embed_coverage_ch0
  244. title: 覆盖度报告 ch0 (门户内嵌)
  245. kind: data-derived
  246. changes_with_data: true
  247. file: release/portal_src/templates/tpl-coverage_ch0_zh.html.html
  248. generated_at_key: 生成
  249. source: null
  250. known_gap:
  251. why: "正文写 '源: e1_base.parquet @e3b531b8eddf8197' —— 那份 e1_base.parquet 不在本包 ⇒ 指纹虽有, 但对不上任何在位文件, 溯源链断在包外; 只能按生成时间 2026-09-05 16:28 判新旧"
  252. evidence: "正文写 '生成 2026-09-05 16:28 · 源: e1_base.parquet @e3b531b8eddf8197 (10-min, 2,973,638 格, 38 台)' ⇒ 数据派生; 但 e1_base.parquet **不在本包** ⇒ 溯源链断在包外"
  253. - id: embed_u6_sim
  254. title: U6 变桨液压仿真台 (门户内嵌)
  255. kind: static
  256. changes_with_data: false
  257. file: release/portal_src/templates/tpl-U6_变桨液压仿真台.html.html
  258. evidence: "图纸派生的物理回路仿真台面板; 无内嵌数据/指纹/产物引用"
  259. - id: embed_u6_health
  260. title: U6 液压公共站健康报告 (客户版, 门户内嵌)
  261. kind: frozen-delivery
  262. changes_with_data: false
  263. file: release/portal_src/templates/tpl-U6_液压公共站健康报告_客户版.html.html
  264. version: "客户版"
  265. evidence: "984 KB 客户交付报告; 文件名标 '客户版'; 无数据指纹 ⇒ 按交付件冻结(缺版本号/日期, 见 audit 提示)"
  266. - id: embed_gearbox_report
  267. title: 整机综合诊断与风险评估 (主轴冲击深挖 V2.1, 门户内嵌)
  268. kind: frozen-delivery
  269. changes_with_data: false
  270. file: release/portal_src/templates/tpl-如东海上风电场_整机综合诊断与风险评估_主轴冲击深挖修订版V2.1.html.html
  271. version: "V2.1"
  272. evidence: "3.7 MB 综合诊断报告, 文件名带修订版号 V2.1; 报告类交付件按版本发布"
  273. - id: embed_reports_4
  274. title: 分系统评估报告 (主轴承/齿轮箱/发电机/变桨, 门户内嵌 4 份)
  275. kind: frozen-delivery
  276. changes_with_data: false
  277. file: release/portal_src/templates/tpl-report-*.html.html
  278. evidence: "4 份系统评估报告(0.7–3.4 MB), 无内嵌数据/指纹; 属交付报告(缺版本号/日期登记)"
  279. - id: embed_governance_12
  280. title: 治理清单分册 (门户内嵌 12 份)
  281. kind: frozen-delivery
  282. changes_with_data: false
  283. file: release/portal_src/templates/tpl-governance-*.html.html
  284. evidence: "12 份治理分册(0–11), 与 release/如东 下的分册同源; 冻结交付件"
  285. - id: embed_sc1_local
  286. title: SC1 本地占位 (门户内嵌)
  287. kind: static
  288. changes_with_data: false
  289. file: release/portal_src/templates/tpl-sc1-local.html.html
  290. evidence: "0.4 KB 占位面板"
  291. # ── 用户令 2026-09-17 第 2 问补齐: 把"所有网页"逐页管起来 (workbench 标签 / 交付页 / 三维页 / 内嵌件) ──
  292. - id: detail_tabs
  293. title: 工作台 /detail/v2 的 10 个标签 (SPA)
  294. kind: live
  295. changes_with_data: true
  296. file: app_frontEnd/web/src/lib/tabs.ts # ★P13: 旧后端已退役,页签登记改指现行 Vue 页签清单
  297. tabs: [overview, energy, component, vibration, generation, fault, decision, assistant, report, system]
  298. live_target: http://127.0.0.1:18033/v2
  299. evidence: >-
  300. 工作台是单页应用: 外壳一次装载, 每个标签按需 fetch 后端 API, 而 API 现场读产物
  301. (产物指纹 TTL 2s 自动重载) ⇒ 页面本体不存快照、永远与产物一致, 不需要产物管理。
  302. 其中 report 标签渲染产物 `outputs/<场>/windcms/report.md`(结论件), 该件属产物并已在台账里。
  303. ★ 2026-09-17 现场: 清产物后 `tab=vibration` 空白, 不是页面坏了, 是它要的
  304. `m5_cms_tcm/{handoff_vibration_v2,component_history,baseline_38}.json` 与 CMS 页面件不在位 (§7/§13.5)。
  305. - id: delivery_pages_all
  306. title: 交付页 (release/如东 下全部 html)
  307. kind: frozen-delivery
  308. changes_with_data: false
  309. file: release/如东/**/*.html
  310. evidence: >-
  311. 客户交付件(治理清单分册/全册/正式报告/取数单/脱敏状态一览), 文件名自带版本号+日期 ⇒ 按交付版本冻结。
  312. 其中"脱敏状态一览"与"如东取数单"是**数据派生**的(内容随运行状态变) ⇒ 另见 §12 的逐页判定与 known_gap。
  313. - id: viewer_pages_all
  314. title: 三维页 (release/viewer 下全部 html)
  315. kind: static
  316. changes_with_data: false
  317. file: release/viewer/*.html
  318. evidence: 图纸/三维模型派生的资产页(工作台/索引/装配演示), 与 data/raw 无关 ⇒ 不是产物。