dsh-data-domain-knowledge 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +360 -0
  3. package/cordis.patch.yml +410 -0
  4. package/eval/README.md +76 -0
  5. package/eval/evaluate-retrieval.mjs +121 -0
  6. package/eval/queries.example.jsonl +2 -0
  7. package/lib/client.js +111415 -0
  8. package/lib/types/config-schema.d.ts +35 -0
  9. package/lib/types/config-schema.d.ts.map +1 -0
  10. package/lib/types/config-schema.js +34 -0
  11. package/lib/types/config-schema.js.map +1 -0
  12. package/lib/types/convert/core-loader.d.ts +32 -0
  13. package/lib/types/convert/core-loader.d.ts.map +1 -0
  14. package/lib/types/convert/core-loader.js +60 -0
  15. package/lib/types/convert/core-loader.js.map +1 -0
  16. package/lib/types/convert/host.d.ts +88 -0
  17. package/lib/types/convert/host.d.ts.map +1 -0
  18. package/lib/types/convert/host.js +479 -0
  19. package/lib/types/convert/host.js.map +1 -0
  20. package/lib/types/convert/ingest.d.ts +125 -0
  21. package/lib/types/convert/ingest.d.ts.map +1 -0
  22. package/lib/types/convert/ingest.js +228 -0
  23. package/lib/types/convert/ingest.js.map +1 -0
  24. package/lib/types/convert/settings-schema.d.ts +18 -0
  25. package/lib/types/convert/settings-schema.d.ts.map +1 -0
  26. package/lib/types/convert/settings-schema.js +26 -0
  27. package/lib/types/convert/settings-schema.js.map +1 -0
  28. package/lib/types/convert/types.d.ts +46 -0
  29. package/lib/types/convert/types.d.ts.map +1 -0
  30. package/lib/types/convert/types.js +41 -0
  31. package/lib/types/convert/types.js.map +1 -0
  32. package/lib/types/diagnosis/cards.d.ts +71 -0
  33. package/lib/types/diagnosis/cards.d.ts.map +1 -0
  34. package/lib/types/diagnosis/cards.js +482 -0
  35. package/lib/types/diagnosis/cards.js.map +1 -0
  36. package/lib/types/diagnosis/problem-classes.d.ts +51 -0
  37. package/lib/types/diagnosis/problem-classes.d.ts.map +1 -0
  38. package/lib/types/diagnosis/problem-classes.js +66 -0
  39. package/lib/types/diagnosis/problem-classes.js.map +1 -0
  40. package/lib/types/diagnosis/schema.d.ts +65 -0
  41. package/lib/types/diagnosis/schema.d.ts.map +1 -0
  42. package/lib/types/diagnosis/schema.js +208 -0
  43. package/lib/types/diagnosis/schema.js.map +1 -0
  44. package/lib/types/diagnosis/seed-source.d.ts +20 -0
  45. package/lib/types/diagnosis/seed-source.d.ts.map +1 -0
  46. package/lib/types/diagnosis/seed-source.js +96 -0
  47. package/lib/types/diagnosis/seed-source.js.map +1 -0
  48. package/lib/types/diagnosis/seed.d.ts +50 -0
  49. package/lib/types/diagnosis/seed.d.ts.map +1 -0
  50. package/lib/types/diagnosis/seed.js +242 -0
  51. package/lib/types/diagnosis/seed.js.map +1 -0
  52. package/lib/types/diagnosis/store.d.ts +81 -0
  53. package/lib/types/diagnosis/store.d.ts.map +1 -0
  54. package/lib/types/diagnosis/store.js +409 -0
  55. package/lib/types/diagnosis/store.js.map +1 -0
  56. package/lib/types/diagnosis/types.d.ts +124 -0
  57. package/lib/types/diagnosis/types.d.ts.map +1 -0
  58. package/lib/types/diagnosis/types.js +13 -0
  59. package/lib/types/diagnosis/types.js.map +1 -0
  60. package/lib/types/directory-picker.d.ts +94 -0
  61. package/lib/types/directory-picker.d.ts.map +1 -0
  62. package/lib/types/directory-picker.js +110 -0
  63. package/lib/types/directory-picker.js.map +1 -0
  64. package/lib/types/extract-model.d.ts +76 -0
  65. package/lib/types/extract-model.d.ts.map +1 -0
  66. package/lib/types/extract-model.js +193 -0
  67. package/lib/types/extract-model.js.map +1 -0
  68. package/lib/types/extract.d.ts +121 -0
  69. package/lib/types/extract.d.ts.map +1 -0
  70. package/lib/types/extract.js +549 -0
  71. package/lib/types/extract.js.map +1 -0
  72. package/lib/types/fts.d.ts +96 -0
  73. package/lib/types/fts.d.ts.map +1 -0
  74. package/lib/types/fts.js +184 -0
  75. package/lib/types/fts.js.map +1 -0
  76. package/lib/types/index.d.ts +39 -0
  77. package/lib/types/index.d.ts.map +1 -0
  78. package/lib/types/index.js +1112 -0
  79. package/lib/types/index.js.map +1 -0
  80. package/lib/types/intent/engine.d.ts +108 -0
  81. package/lib/types/intent/engine.d.ts.map +1 -0
  82. package/lib/types/intent/engine.js +501 -0
  83. package/lib/types/intent/engine.js.map +1 -0
  84. package/lib/types/intent/host.d.ts +88 -0
  85. package/lib/types/intent/host.d.ts.map +1 -0
  86. package/lib/types/intent/host.js +389 -0
  87. package/lib/types/intent/host.js.map +1 -0
  88. package/lib/types/intent/preset-tools.d.ts +37 -0
  89. package/lib/types/intent/preset-tools.d.ts.map +1 -0
  90. package/lib/types/intent/preset-tools.js +45 -0
  91. package/lib/types/intent/preset-tools.js.map +1 -0
  92. package/lib/types/intent/settings-schema.d.ts +59 -0
  93. package/lib/types/intent/settings-schema.d.ts.map +1 -0
  94. package/lib/types/intent/settings-schema.js +57 -0
  95. package/lib/types/intent/settings-schema.js.map +1 -0
  96. package/lib/types/intent/store.d.ts +75 -0
  97. package/lib/types/intent/store.d.ts.map +1 -0
  98. package/lib/types/intent/store.js +139 -0
  99. package/lib/types/intent/store.js.map +1 -0
  100. package/lib/types/intent/tools.d.ts +63 -0
  101. package/lib/types/intent/tools.d.ts.map +1 -0
  102. package/lib/types/intent/tools.js +108 -0
  103. package/lib/types/intent/tools.js.map +1 -0
  104. package/lib/types/intent/types.d.ts +189 -0
  105. package/lib/types/intent/types.d.ts.map +1 -0
  106. package/lib/types/intent/types.js +62 -0
  107. package/lib/types/intent/types.js.map +1 -0
  108. package/lib/types/knowledge-bases.d.ts +266 -0
  109. package/lib/types/knowledge-bases.d.ts.map +1 -0
  110. package/lib/types/knowledge-bases.js +1107 -0
  111. package/lib/types/knowledge-bases.js.map +1 -0
  112. package/lib/types/layout.d.ts +262 -0
  113. package/lib/types/layout.d.ts.map +1 -0
  114. package/lib/types/layout.js +312 -0
  115. package/lib/types/layout.js.map +1 -0
  116. package/lib/types/migrate.d.ts +110 -0
  117. package/lib/types/migrate.d.ts.map +1 -0
  118. package/lib/types/migrate.js +280 -0
  119. package/lib/types/migrate.js.map +1 -0
  120. package/lib/types/recall-rank.d.ts +158 -0
  121. package/lib/types/recall-rank.d.ts.map +1 -0
  122. package/lib/types/recall-rank.js +261 -0
  123. package/lib/types/recall-rank.js.map +1 -0
  124. package/lib/types/runtime.d.ts +568 -0
  125. package/lib/types/runtime.d.ts.map +1 -0
  126. package/lib/types/runtime.js +3045 -0
  127. package/lib/types/runtime.js.map +1 -0
  128. package/lib/types/settings-schema.d.ts +117 -0
  129. package/lib/types/settings-schema.d.ts.map +1 -0
  130. package/lib/types/settings-schema.js +92 -0
  131. package/lib/types/settings-schema.js.map +1 -0
  132. package/lib/types/settings-volatile.d.ts +102 -0
  133. package/lib/types/settings-volatile.d.ts.map +1 -0
  134. package/lib/types/settings-volatile.js +114 -0
  135. package/lib/types/settings-volatile.js.map +1 -0
  136. package/lib/types/types.d.ts +799 -0
  137. package/lib/types/types.d.ts.map +1 -0
  138. package/lib/types/types.js +387 -0
  139. package/lib/types/types.js.map +1 -0
  140. package/lib/types/wiki-types.d.ts +68 -0
  141. package/lib/types/wiki-types.d.ts.map +1 -0
  142. package/lib/types/wiki-types.js +322 -0
  143. package/lib/types/wiki-types.js.map +1 -0
  144. package/package.json +101 -0
  145. package/preset/tita-data-agent/agent.cordis.yml +376 -0
  146. package/preset/tita-data-agent/preset.yml +3 -0
  147. package/python/requirements.txt +8 -0
  148. package/scripts/doctor.mjs +70 -0
  149. package/scripts/e2e-pipeline.mjs +355 -0
  150. package/scripts/install-agent-preset.mjs +92 -0
  151. package/scripts/setup-embedding.sh +34 -0
  152. package/scripts/sync-agent-preset.mjs +188 -0
  153. package/src/client/AgentPresetCard.tsx +247 -0
  154. package/src/client/DirectoryPicker.tsx +357 -0
  155. package/src/client/InfoHint.tsx +65 -0
  156. package/src/client/IntentLogicTab.tsx +185 -0
  157. package/src/client/IntentTab.tsx +715 -0
  158. package/src/client/KnowledgeBaseTab.tsx +1454 -0
  159. package/src/client/KnowledgeGraphView.tsx +306 -0
  160. package/src/client/KnowledgePanel.tsx +381 -0
  161. package/src/client/KnowledgeStepRail.tsx +60 -0
  162. package/src/client/NodeSettings.tsx +392 -0
  163. package/src/client/PreviewSections.tsx +116 -0
  164. package/src/client/RecallPanel.tsx +399 -0
  165. package/src/client/TypeDefinitionDrawer.tsx +215 -0
  166. package/src/client/WikiFlowCard.tsx +226 -0
  167. package/src/client/WikiTypeEditor.tsx +332 -0
  168. package/src/client/agent-preset.ts +121 -0
  169. package/src/client/arch/AgentArchitectureGraph.tsx +219 -0
  170. package/src/client/arch/NodeLogicPanel.tsx +133 -0
  171. package/src/client/arch/ProblemDetailPanel.tsx +88 -0
  172. package/src/client/arch/model.ts +691 -0
  173. package/src/client/architecture.css +191 -0
  174. package/src/client/architecture.tsx +530 -0
  175. package/src/client/attribution/AttributionGraph.tsx +104 -0
  176. package/src/client/attribution/AttributionTab.tsx +332 -0
  177. package/src/client/attribution/CaseView.tsx +102 -0
  178. package/src/client/attribution/GraphStage.tsx +87 -0
  179. package/src/client/attribution/RunView.tsx +184 -0
  180. package/src/client/attribution/StageChrome.tsx +403 -0
  181. package/src/client/attribution/ViewSwitch.tsx +107 -0
  182. package/src/client/attribution/graph-options.ts +381 -0
  183. package/src/client/attribution/model.ts +462 -0
  184. package/src/client/config-scope.ts +119 -0
  185. package/src/client/convert/ConvertPanel.tsx +594 -0
  186. package/src/client/convert/styles.css +138 -0
  187. package/src/client/convert/styles.ts +49 -0
  188. package/src/client/format.ts +39 -0
  189. package/src/client/graph/layout.ts +181 -0
  190. package/src/client/graph.css +113 -0
  191. package/src/client/index.ts +98 -0
  192. package/src/client/problem-domains.ts +114 -0
  193. package/src/client/styles.css +940 -0
  194. package/src/client/styles.ts +11 -0
  195. package/src/client/useFitScale.ts +68 -0
  196. package/src/config-schema.ts +45 -0
  197. package/src/convert/core-loader.ts +68 -0
  198. package/src/convert/host.ts +579 -0
  199. package/src/convert/ingest.ts +367 -0
  200. package/src/convert/settings-schema.ts +27 -0
  201. package/src/convert/types.ts +65 -0
  202. package/src/diagnosis/cards.ts +498 -0
  203. package/src/diagnosis/problem-classes.ts +117 -0
  204. package/src/diagnosis/schema.ts +260 -0
  205. package/src/diagnosis/seed-source.ts +107 -0
  206. package/src/diagnosis/seed.ts +291 -0
  207. package/src/diagnosis/store.ts +432 -0
  208. package/src/diagnosis/types.ts +152 -0
  209. package/src/directory-picker.ts +164 -0
  210. package/src/extract-model.ts +227 -0
  211. package/src/extract.ts +632 -0
  212. package/src/fts.ts +203 -0
  213. package/src/index.ts +1091 -0
  214. package/src/intent/README.md +63 -0
  215. package/src/intent/engine.ts +527 -0
  216. package/src/intent/host.ts +462 -0
  217. package/src/intent/preset-tools.ts +48 -0
  218. package/src/intent/settings-schema.ts +63 -0
  219. package/src/intent/store.ts +143 -0
  220. package/src/intent/tools.ts +139 -0
  221. package/src/intent/types.ts +245 -0
  222. package/src/knowledge-bases.ts +1160 -0
  223. package/src/layout.ts +350 -0
  224. package/src/migrate.ts +262 -0
  225. package/src/python/embedding_worker.py +471 -0
  226. package/src/recall-rank.ts +299 -0
  227. package/src/runtime.ts +3069 -0
  228. package/src/settings-schema.ts +94 -0
  229. package/src/settings-volatile.ts +122 -0
  230. package/src/types.ts +1140 -0
  231. package/src/wiki-types.ts +357 -0
@@ -0,0 +1,65 @@
1
+ import type { AttributionGraphData, AttributionNodeKind } from './types.js';
2
+ /**
3
+ * 问题排查作为**独立的 wiki 类型族**,以及它的 schema 与三层校验。
4
+ *
5
+ * 三条设计判断,都写在类型里而不是文档里:
6
+ *
7
+ * 1. **不是一个类型,是一个类型族。** 类型层(被复用上百次的假设)和实例层(只发生过
8
+ * 一次的排查记录)性质不同,合成一个 `问题排查` 会让 schema 立刻退化成「一半字段
9
+ * 可选」。所以按 `diagnosis/*` 命名空间分五个。
10
+ *
11
+ * 只有这五个是**手写卡片**。`asset` 随数据目录同步、`evidence` / `cause` 由一次排查
12
+ * 自动写入、`unknown` 是待抽象队列 —— 它们在同一张图里,但不是 wiki 文档。
13
+ * 2. **卡片三段式**:front matter 给机器读、正文小节给人读、路径段给图读。
14
+ * 序和枚举一旦写进散文,归并算法就再也读不到它们了。
15
+ * 3. **校验必须分三层报错**:格式 / 引用完整性 / 语义。混成同一个「校验失败」,
16
+ * 人就学不会怎么写卡片。
17
+ */
18
+ export type DiagnosisEntityType = 'diagnosis/symptom' | 'diagnosis/hypothesis' | 'diagnosis/check' | 'diagnosis/failure-mode' | 'diagnosis/case';
19
+ export interface DiagnosisFieldSpec {
20
+ name: string;
21
+ /** 由系统回填,人工不得手写 —— 否则先验可以被人为篡改,优先分就失去意义。 */
22
+ system?: boolean;
23
+ note: string;
24
+ }
25
+ export interface DiagnosisEntitySpec {
26
+ entityType: DiagnosisEntityType;
27
+ kind: AttributionNodeKind;
28
+ layer: 'type' | 'reference' | 'instance';
29
+ label: string;
30
+ /** front matter 的字段清单(不含统一信封的 id / title / status / source_refs)。 */
31
+ fields: DiagnosisFieldSpec[];
32
+ /** 正文小节名。写卡片的人照着填,模板卡里一一对应。 */
33
+ sections: string[];
34
+ }
35
+ /**
36
+ * 五类卡片实体的 entity_type 清单 —— **全仓库唯一的定义处**。
37
+ *
38
+ * `SchemaType` 的联合、默认 `schemaTypes`、模板卡生成、卡片编解码都从这里取,
39
+ * 而不是各自再抄一份字面量(抄三份的下场是它们迟早不一致,而不一致的表现是
40
+ * 「校验通过了但编译器不认」)。
41
+ */
42
+ export declare const DIAGNOSIS_ENTITY_TYPES: DiagnosisEntityType[];
43
+ /** 不是 wiki 卡片、但仍属于同一张图的节点类型。校验不按卡片规则要求它们。 */
44
+ export declare const NON_CARD_KINDS: AttributionNodeKind[];
45
+ /** 所有类型共有的信封字段。 */
46
+ export declare const DIAGNOSIS_ENVELOPE: DiagnosisFieldSpec[];
47
+ export declare const DIAGNOSIS_ENTITIES: DiagnosisEntitySpec[];
48
+ export type DiagnosisIssueLevel = 'format' | 'reference' | 'semantic';
49
+ export interface DiagnosisIssue {
50
+ level: DiagnosisIssueLevel;
51
+ entityId: string;
52
+ field?: string;
53
+ message: string;
54
+ }
55
+ export declare function specOf(kind: AttributionNodeKind): DiagnosisEntitySpec | undefined;
56
+ /**
57
+ * 三层校验。
58
+ *
59
+ * 分开报错不是洁癖:**格式错说明卡片没填完,引用错说明图断了,语义错说明这条知识
60
+ * 本身没用**。三者对应的动作完全不同(补字段 / 修边 / 重写),混在一起就只能靠猜。
61
+ */
62
+ export declare function validateDiagnosis(graph: AttributionGraphData): DiagnosisIssue[];
63
+ /** 空的模板卡:新人写卡片时看的是它,不是 schema。 */
64
+ export declare function templateCard(spec: DiagnosisEntitySpec): string;
65
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/diagnosis/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAmB,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAG5F;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,mBAAmB,GAC3B,mBAAmB,GACnB,sBAAsB,GACtB,iBAAiB,GACjB,wBAAwB,GACxB,gBAAgB,CAAA;AAEpB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,mBAAmB,CAAA;IAC/B,IAAI,EAAE,mBAAmB,CAAA;IACzB,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,qEAAqE;IACrE,MAAM,EAAE,kBAAkB,EAAE,CAAA;IAC5B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EAMvD,CAAA;AAED,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,mBAAmB,EAA8C,CAAA;AAE9F,mBAAmB;AACnB,eAAO,MAAM,kBAAkB,EAAE,kBAAkB,EAOlD,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,mBAAmB,EAyEnD,CAAA;AAKD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAA;AAErE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,mBAAmB,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB;AAMD,wBAAgB,MAAM,CAAC,IAAI,EAAE,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG,cAAc,EAAE,CAsE/E;AAED,kCAAkC;AAClC,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAY9D"}
@@ -0,0 +1,208 @@
1
+ import { PROBLEM_CLASS_LABEL, problemClassIds, problemSubclassOf } from './problem-classes.js';
2
+ /**
3
+ * 五类卡片实体的 entity_type 清单 —— **全仓库唯一的定义处**。
4
+ *
5
+ * `SchemaType` 的联合、默认 `schemaTypes`、模板卡生成、卡片编解码都从这里取,
6
+ * 而不是各自再抄一份字面量(抄三份的下场是它们迟早不一致,而不一致的表现是
7
+ * 「校验通过了但编译器不认」)。
8
+ */
9
+ export const DIAGNOSIS_ENTITY_TYPES = [
10
+ 'diagnosis/symptom',
11
+ 'diagnosis/hypothesis',
12
+ 'diagnosis/check',
13
+ 'diagnosis/failure-mode',
14
+ 'diagnosis/case',
15
+ ];
16
+ /** 不是 wiki 卡片、但仍属于同一张图的节点类型。校验不按卡片规则要求它们。 */
17
+ export const NON_CARD_KINDS = ['asset', 'evidence', 'cause', 'unknown'];
18
+ /** 所有类型共有的信封字段。 */
19
+ export const DIAGNOSIS_ENVELOPE = [
20
+ { name: 'id', note: '稳定标识,如 H1 / T1.1 / CASE-001' },
21
+ { name: 'title', note: '界面上的标题' },
22
+ { name: 'status', note: 'unreviewed | draft | reviewed | active | deprecated | problem' },
23
+ { name: 'owner', note: '负责人' },
24
+ { name: 'source_refs', note: '必填,可追溯' },
25
+ { name: 'stats', system: true, note: 'prior / lastHitAt / refutesCount / caseCount,只由系统回填' },
26
+ ];
27
+ export const DIAGNOSIS_ENTITIES = [
28
+ {
29
+ entityType: 'diagnosis/symptom',
30
+ kind: 'symptom',
31
+ layer: 'type',
32
+ label: '现象类型',
33
+ fields: [
34
+ { name: 'observable', note: '可观测口径:指标 + 维度 + 时间窗' },
35
+ { name: 'entry_when', note: '什么条件下适用' },
36
+ { name: 'problem_class', note: '问题大类:mandatory,取值只能来自 §4.5 的四个大类' },
37
+ { name: 'problem_subclass', note: '问题子类:必须属于所选大类;它同时决定 §5.1 的 shape / time_pattern' },
38
+ ],
39
+ sections: ['观测口径', '典型信号', '不适用的情况', '关联假设'],
40
+ },
41
+ {
42
+ entityType: 'diagnosis/hypothesis',
43
+ kind: 'hypothesis',
44
+ layer: 'type',
45
+ label: '假设',
46
+ fields: [
47
+ { name: 'discriminator', note: '**一句可判真假的话** —— 它同时是查重的比对对象' },
48
+ { name: 'not_when', note: '**反例边界**:什么情况下这个假设不成立。refutes 边在文档层的表达' },
49
+ { name: 'failure_mode', note: '切面:upstream-missing | spec-change | data-processing | consumption | permission' },
50
+ { name: 'verified_by', note: '引用的检查 id 列表' },
51
+ { name: 'assets', note: '关联资产(表 / 指标 / 任务)' },
52
+ { name: 'stats', system: true, note: 'prior / last_hit_at / refutes_count / case_count' },
53
+ ],
54
+ sections: ['判据', '反例边界', '典型信号', '关联检查', '案例索引'],
55
+ },
56
+ {
57
+ entityType: 'diagnosis/check',
58
+ kind: 'check',
59
+ layer: 'type',
60
+ label: '检查',
61
+ fields: [
62
+ { name: 'cost_minutes', note: '耗时(分钟),优先分的分母' },
63
+ { name: 'automation', note: 'auto | manual' },
64
+ { name: 'owner', note: '执行人或角色' },
65
+ { name: 'verdict_true', note: '**看到什么算真**' },
66
+ { name: 'verdict_false', note: '**看到什么算假** —— 只写「算真」就无法否定假设' },
67
+ { name: 'runbook', note: '怎么跑:SQL / 工具 / 找谁' },
68
+ { name: 'side_effect', note: '是否有副作用(只读 / 会写)' },
69
+ ],
70
+ sections: ['怎么跑', '判定阈值', '有结论与无结论的区分'],
71
+ },
72
+ {
73
+ entityType: 'diagnosis/failure-mode',
74
+ kind: 'failure-mode',
75
+ layer: 'type',
76
+ label: '失败模式(切面)',
77
+ fields: [
78
+ { name: 'code', note: '稳定编码' },
79
+ { name: 'label', note: '界面词' },
80
+ { name: 'boundary', note: '与相邻切面的边界 —— 缺了它切面会互相吞' },
81
+ ],
82
+ sections: ['定义', '与相邻切面的边界', '包含哪些假设'],
83
+ },
84
+ {
85
+ entityType: 'diagnosis/case',
86
+ kind: 'case',
87
+ layer: 'instance',
88
+ label: '案例',
89
+ fields: [
90
+ { name: 'symptom', note: '入口现象 id' },
91
+ { name: 'path', note: '**有序**节点序列:现象 → 假设 → 检查 → 证据 → 根因' },
92
+ { name: 'duration_minutes', note: '总耗时' },
93
+ { name: 'misleading_edges', note: '误导边:节点 + 浪费的分钟数 + 为什么' },
94
+ { name: 'root_cause', note: '根因一句话' },
95
+ { name: 'impact', note: '影响面' },
96
+ { name: 'prevention', note: '防复发措施' },
97
+ ],
98
+ sections: ['现象', '影响面', '排查过程', '根因', '修复与防复发'],
99
+ },
100
+ ];
101
+ /** 语义校验用的判据:check 的标题必须**可执行**。 */
102
+ const VAGUE_CHECK_TITLES = /^(检查|看看|排查|确认)?\s*(一下)?\s*(数据质量|是不是|有没有问题|上游|下游)/;
103
+ function fieldIssue(node, field, message) {
104
+ return { level: 'format', entityId: node.id, field, message };
105
+ }
106
+ export function specOf(kind) {
107
+ return DIAGNOSIS_ENTITIES.find(entity => entity.kind === kind);
108
+ }
109
+ /**
110
+ * 三层校验。
111
+ *
112
+ * 分开报错不是洁癖:**格式错说明卡片没填完,引用错说明图断了,语义错说明这条知识
113
+ * 本身没用**。三者对应的动作完全不同(补字段 / 修边 / 重写),混在一起就只能靠猜。
114
+ */
115
+ export function validateDiagnosis(graph) {
116
+ const issues = [];
117
+ const byId = new Map(graph.nodes.map(node => [node.id, node]));
118
+ // ── 第一层:格式 ──────────────────────────────────────────────────────────
119
+ for (const node of graph.nodes) {
120
+ const isCard = specOf(node.kind) !== undefined;
121
+ if (!isCard && !NON_CARD_KINDS.includes(node.kind)) {
122
+ issues.push(fieldIssue(node, 'kind', `未知的归因节点类型 ${node.kind}`));
123
+ }
124
+ if (node.kind === 'hypothesis') {
125
+ if (!node.discriminator?.trim())
126
+ issues.push(fieldIssue(node, 'discriminator', '假设必须有一句可判真假的判据'));
127
+ if (!node.notWhen?.trim())
128
+ issues.push(fieldIssue(node, 'notWhen', '假设必须写明反例边界 —— 否则查重会把相似情形并成一条'));
129
+ if (!node.failureMode)
130
+ issues.push(fieldIssue(node, 'failureMode', '假设必须归属一个失败模式切面'));
131
+ }
132
+ if (node.kind === 'symptom') {
133
+ // 问题侧的分类是**必填**:留空的后果不是「少个字段」,而是这个现象在按问题筛选时
134
+ // 永远不出现 —— 那是一种静默的缺失,比报错更难发现。
135
+ if (!node.problemClass) {
136
+ issues.push(fieldIssue(node, 'problemClass', `现象必须归属一个问题大类(${problemClassIds().join(' | ')})`));
137
+ }
138
+ else if (!problemClassIds().includes(node.problemClass)) {
139
+ issues.push(fieldIssue(node, 'problemClass', `未知的问题大类 ${node.problemClass}`));
140
+ }
141
+ if (!node.problemSubclass?.trim()) {
142
+ issues.push(fieldIssue(node, 'problemSubclass', '现象必须有一个问题子类 —— 它同时是 recall 里 shape / time_pattern 的来源'));
143
+ }
144
+ else if (problemSubclassOf(node.problemSubclass) === undefined) {
145
+ issues.push(fieldIssue(node, 'problemSubclass', `未知的问题子类 ${node.problemSubclass}`));
146
+ }
147
+ else if (node.problemClass && problemSubclassOf(node.problemSubclass).classId !== node.problemClass) {
148
+ issues.push(fieldIssue(node, 'problemSubclass', `子类 ${node.problemSubclass} 属于「${PROBLEM_CLASS_LABEL[problemSubclassOf(node.problemSubclass).classId]}」,与所选大类「${PROBLEM_CLASS_LABEL[node.problemClass]}」不一致`));
149
+ }
150
+ }
151
+ else if (node.problemClass ?? node.problemSubclass) {
152
+ // 分类字段只属于现象。假设上挂问题大类,会把「问题」和「原因」两根轴搅在一起。
153
+ issues.push(fieldIssue(node, 'problemClass', '问题分类只能写在现象(symptom)上,不能挂在原因侧'));
154
+ }
155
+ if (node.kind === 'check') {
156
+ for (const [field, value] of [['costMinutes', node.costMinutes], ['automation', node.automation], ['owner', node.owner], ['verdictTrue', node.verdictTrue], ['verdictFalse', node.verdictFalse]]) {
157
+ if (value === undefined || value === '')
158
+ issues.push(fieldIssue(node, field, `检查缺少 ${field} —— 缺了它这一步就无法被自动化或复核`));
159
+ }
160
+ }
161
+ // `case` 节点只是图上的桩:案例的正文与路径住在 `cases.json` 里,由
162
+ // DiagnosisSnapshot.cases 校验,不在节点上重复要求。
163
+ }
164
+ // ── 第二层:引用完整性 ────────────────────────────────────────────────────
165
+ for (const edge of graph.edges) {
166
+ if (!byId.has(edge.source))
167
+ issues.push({ level: 'reference', entityId: edge.id, field: 'source', message: `边的起点 ${edge.source} 不存在` });
168
+ if (!byId.has(edge.target))
169
+ issues.push({ level: 'reference', entityId: edge.id, field: 'target', message: `边的终点 ${edge.target} 不存在` });
170
+ }
171
+ for (const node of graph.nodes) {
172
+ if (node.kind !== 'hypothesis')
173
+ continue;
174
+ const hasCheck = graph.edges.some(edge => edge.kind === 'verified_by' && edge.source === node.id);
175
+ // 空区不是错,是**待办**:它是一条信息(这张图哪里还没建完),所以只提示不报错。
176
+ if (!hasCheck)
177
+ issues.push({ level: 'semantic', entityId: node.id, message: '空区:有假设但没有任何检查,拿不出成本,因此进不了排序' });
178
+ }
179
+ // ── 第三层:语义 ──────────────────────────────────────────────────────────
180
+ for (const node of graph.nodes) {
181
+ if (node.kind !== 'check')
182
+ continue;
183
+ if (VAGUE_CHECK_TITLES.test(node.title.trim())) {
184
+ issues.push({
185
+ level: 'semantic',
186
+ entityId: node.id,
187
+ field: 'title',
188
+ message: `检查标题不可执行:「${node.title}」。必须能回答「谁、用什么、多久、看到什么算真、看到什么算假」`,
189
+ });
190
+ }
191
+ }
192
+ return issues;
193
+ }
194
+ /** 空的模板卡:新人写卡片时看的是它,不是 schema。 */
195
+ export function templateCard(spec) {
196
+ const front = [
197
+ `entity_type: ${spec.entityType}`,
198
+ 'id: ',
199
+ 'title: ',
200
+ 'status: unreviewed',
201
+ 'owner: ',
202
+ 'source_refs: []',
203
+ ...spec.fields.filter(field => !field.system).map(field => `${field.name}: `),
204
+ ];
205
+ const body = spec.sections.map(section => `## ${section}\n\n`).join('');
206
+ return `---\n${front.join('\n')}\n---\n\n${body}`;
207
+ }
208
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/diagnosis/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface SeedSource {
2
+ /** 稳定 id,用作 `external_id`,迁移与重跑都靠它幂等。 */
3
+ id: string;
4
+ title: string;
5
+ /** 来源分类。排查手册与复盘都属于既有的 `question`(「问题排查文档」)。 */
6
+ sourceType: 'question';
7
+ content: string;
8
+ }
9
+ /**
10
+ * 排查手册:**类型层知识的出处**。
11
+ *
12
+ * 这份文本刻意写得比卡片「松」一些(讲判断顺序、讲纪律、讲坑),因为散文的职责是让人学会,
13
+ * 卡片的职责是让机器算得出来。把两者写成同一份东西,就会重演 §6.3 那句警告:
14
+ * 序和枚举一旦进了散文,归并算法就再也读不到它们了。
15
+ */
16
+ export declare const SEED_HANDBOOK = "# \u65E5\u62A5\u6307\u6807\u5F02\u5E38\u6392\u67E5\u624B\u518C\uFF08\u5185\u90E8\u7248\uFF09\n\n## \u8FD9\u4EFD\u624B\u518C\u89E3\u51B3\u4EC0\u4E48\n\n\u65E5\u62A5\u6307\u6807\u51FA\u73B0\u5F02\u5E38\u6CE2\u52A8\u65F6\uFF0C\u503C\u73ED\u540C\u5B66\u7684\u7B2C\u4E00\u53CD\u5E94\u901A\u5E38\u662F\u300C\u5148\u770B\u770B\u4E0A\u6E38\u300D\u3002\u8FD9\u53E5\u8BDD\u6CA1\u9519\uFF0C\u4F46\u5B83\u4E0D\u662F\u6D41\u7A0B\u3002\n\u624B\u518C\u628A\u300C\u5148\u770B\u4EC0\u4E48\u300D\u56FA\u5B9A\u4E0B\u6765\uFF1A**\u6BCF\u4E00\u8F6E\u53EA\u505A\u6210\u672C\u6700\u4F4E\u7684\u90A3\u4E2A\u68C0\u67E5**\uFF0C\u7528\u5B83\u7684\u7ED3\u8BBA\u53BB\u780D\u5019\u9009\uFF0C\u800C\u4E0D\u662F\n\u51ED\u5370\u8C61\u6311\u4E00\u4E2A\u65B9\u5411\u6DF1\u6316\u3002\n\n## \u73B0\u8C61\u5148\u5206\u56DB\u7C7B\n\n\u770B\u5230\u5F02\u5E38\u5148\u5224\u65AD\u5B83\u5C5E\u4E8E\u54EA\u4E00\u7C7B\uFF0C\u8FD9\u51B3\u5B9A\u4E86\u540E\u9762\u5F80\u54EA\u4E2A\u65B9\u5411\u627E\uFF1A\n\n- **\u7F3A\u5931**\uFF1A\u8BE5\u6709\u7684\u6CA1\u6709 \u2014\u2014 \u5168\u91CF\u4E3A 0\u3001\u5206\u533A\u6216\u8868\u672A\u4EA7\u51FA\u3001\u4EFB\u52A1\u62A5\u9519\u672A\u4EA7\u51FA\uFF1B\n- **\u504F\u5DEE**\uFF1A\u6709\uFF0C\u4F46\u5E45\u5EA6\u4E0D\u5BF9 \u2014\u2014 \u7A81\u964D\u3001\u7F13\u964D\u3001\u7A81\u589E\u3001\u7F13\u5347\uFF1B\n- **\u4E0D\u4E00\u81F4**\uFF1A\u6709\uFF0C\u4F46\u5BF9\u4E0D\u4E0A \u2014\u2014 \u4E0E\u6E90\u7CFB\u7EDF\u5BF9\u4E0D\u4E0A\u3001\u8DE8\u62A5\u8868\u52FE\u7A3D\u4E0D\u5E73\u3001\u53E3\u5F84\u53D8\u66F4\u540E\u4E0D\u4E00\u81F4\uFF1B\n- **\u7C92\u5EA6**\uFF1A\u6709\uFF0C\u4F46\u5207\u5206\u4E0D\u5BF9 \u2014\u2014 \u7EF4\u5EA6\u503C\u7F3A\u5931\u3001\u91CD\u590D\u8BA1\u6570\u3001\u6620\u5C04\u9519\u4F4D\u3002\n\n\u4E3A 0 \u548C\u7A81\u589E\u770B\u8D77\u6765\u76F8\u53CD\uFF0C\u4F46\u5B83\u4EEC\u7684\u5019\u9009\u539F\u56E0**\u6709\u91CD\u53E0**\uFF1A\u91CD\u590D / \u56DE\u5237\u65E2\u80FD\u9020\u6210\u653E\u5927\uFF0C\u4E5F\u80FD\u5728\u53BB\u91CD\u903B\u8F91\n\u4ECB\u5165\u540E\u9020\u6210\u9AA4\u964D\uFF1B\u4E0B\u6E38\u7F13\u5B58\u65E2\u80FD\u63A9\u76D6\u66F4\u65B0\uFF08\u770B\u8D77\u6765\u964D\u4E86\uFF09\uFF0C\u4E5F\u80FD\u91CD\u590D\u5C55\u793A\uFF08\u770B\u8D77\u6765\u6DA8\u4E86\uFF09\u3002\u6240\u4EE5\u4E0D\u8981\n\u6309\u300C\u6DA8\u8FD8\u662F\u8DCC\u300D\u53BB\u6392\u9664\u5047\u8BBE\uFF0C\u8981\u6309\u68C0\u67E5\u7ED3\u8BBA\u53BB\u780D\u3002\n\n## \u5019\u9009\u539F\u56E0\uFF08\u7C7B\u578B\u5C42\uFF09\n\n1. **\u4E0A\u6E38\u5206\u533A\u672A\u4EA7\u51FA** \u2014\u2014 \u5F53\u65E5 dwd / ods \u5206\u533A\u4E0D\u5B58\u5728 \u2192 \u6307\u6807\u5FC5\u7136\u4E3A 0\u3002\n \u53CD\u4F8B\uFF1A\u5206\u533A\u5B58\u5728\u4F46\u884C\u6570\u4E3A 0\uFF08\u90A3\u662F\u91CD\u590D / \u56DE\u5237\u7684\u53E6\u4E00\u9762\uFF09\uFF0C\u6216\u8005\u5206\u533A\u6B63\u5E38\u800C\u6307\u6807\u4ECD\u4E3A 0\uFF08\u90A3\u662F\u53E3\u5F84\u6216\u6D88\u8D39\u4FA7\uFF09\u3002\n2. **\u53E3\u5F84 / \u7248\u672C\u53D8\u66F4** \u2014\u2014 \u53E3\u5F84\u7248\u672C\u5207\u6362\u540E\uFF0C\u540C\u540D\u8BCD\u6307\u6807\u5728\u4E24\u7248\u5B9A\u4E49\u4E0B\u53E3\u5F84\u4E0D\u4E00\u81F4\u3002\n \u53CD\u4F8B\uFF1A\u53E3\u5F84\u672A\u53D8\u66F4\u65F6\u672C\u5047\u8BBE\u4E0D\u6210\u7ACB \u2014\u2014 \u4E0D\u8981\u7528\u300C\u540D\u5B57\u4E00\u6837\u300D\u5F53\u4F5C\u53E3\u5F84\u4E00\u81F4\u7684\u8BC1\u636E\u3002\n3. **\u7EF4\u8868\u6620\u5C04\u4E22\u5931** \u2014\u2014 \u7EF4\u8868 join \u540E unknown \u5360\u6BD4\u663E\u8457\u5347\u9AD8\uFF0C\u4E14\u7F3A\u53E3\u96C6\u4E2D\u5728\u65B0\u589E\u7EF4\u5EA6\u6210\u5458\u4E0A\u3002\n \u53CD\u4F8B\uFF1Aunknown \u5360\u6BD4\u6B63\u5E38\u65F6\u672C\u5047\u8BBE\u4E0D\u6210\u7ACB\uFF1B\u7F3A\u53E3\u5747\u5300\u5206\u5E03\u65F6\u5E94\u8F6C\u65F6\u95F4\u7A97\u53E3\u6216\u91CD\u590D / \u56DE\u5237\u3002\n4. **\u91CD\u590D / \u56DE\u5237** \u2014\u2014 \u4E3B\u952E\u4E0D\u552F\u4E00\uFF0C\u6216\u5206\u533A\u884C\u6570\u540C\u6BD4\u653E\u5927\u3002\u4E0A\u6E38\u91CD\u8DD1\u5199\u5165\u91CD\u590D\u884C \u2192 \u8BA1\u6570\u7C7B\u6307\u6807\u653E\u5927\u3002\n \u53CD\u4F8B\uFF1A\u4E3B\u952E\u552F\u4E00\u6027\u68C0\u67E5\u901A\u8FC7\u65F6\u672C\u5047\u8BBE\u4E0D\u6210\u7ACB \u2014\u2014 \u8FD9\u662F\u6700\u5E38\u88AB\u8BEF\u5224\u7684\u4E00\u6761\u3002\n5. **\u65F6\u95F4\u7A97\u53E3 / \u65F6\u533A** \u2014\u2014 \u5206\u533A\u5185\u4E8B\u4EF6\u65F6\u95F4\u8DE8\u51FA T-1 \u5355\u65E5\u7A97\u53E3\uFF0C\u4E14\u53EA\u6709\u5355\u65E5\u5F02\u5E38\u3002\n \u53CD\u4F8B\uFF1A\u76F8\u90BB\u65E5\u671F\u540C\u65F6\u5F02\u5E38\u65F6\u5E94\u8F6C\u53E3\u5F84\u53D8\u66F4\u3002\n6. **\u6743\u9650 / \u8FC7\u6EE4\u6761\u4EF6** \u2014\u2014 \u7ED3\u679C\u96C6\u88AB\u884C\u7EA7\u6743\u9650\u6216 where \u6761\u4EF6\u9759\u9ED8\u6536\u7A84\u3002\n \u53CD\u4F8B\uFF1A\u6743\u9650\u4E0E\u8FC7\u6EE4\u6761\u4EF6\u5728\u672C\u5468\u671F\u672A\u53D8\u66F4\u65F6\u672C\u5047\u8BBE\u4E0D\u6210\u7ACB\u3002\n7. **\u4E0B\u6E38 BI \u7F13\u5B58 / \u589E\u91CF** \u2014\u2014 BI \u5C55\u793A\u4FA7\u6EDE\u540E\uFF0C\u4F46\u76F4\u8FDE\u660E\u7EC6\u7684\u6570\u5B57\u6B63\u5E38\u3002\n \u53CD\u4F8B\uFF1A\u660E\u7EC6\u5BF9\u8D26\u4E00\u81F4\u65F6\u672C\u5047\u8BBE\u4E0D\u6210\u7ACB\u3002**\u6CE8\u610F\uFF1A\u67E5\u7F13\u5B58\u65F6\u95F4\u6233\u53EA\u8981 2 \u5206\u949F\uFF0C\u4F46\u5B83\u8FD4\u56DE\u300C\u6B63\u5E38\u300D\n \u5E76\u4E0D\u80FD\u5426\u5B9A\u8FD9\u6761\u5047\u8BBE** \u2014\u2014 \u8981\u5426\u5B9A\u5B83\u5FC5\u987B\u505A 35 \u5206\u949F\u7684\u4EBA\u5DE5\u660E\u7EC6\u5BF9\u8D26\u3002\n\n## \u68C0\u67E5\u7684\u6210\u672C\u610F\u8BC6\n\n\u6BCF\u4E2A\u5047\u8BBE\u4E0B\u9762\u6302\u7684\u68C0\u67E5\u8981\u5199\u6E05\u4E09\u4EF6\u4E8B\uFF1A\u591A\u4E45\u3001\u80FD\u4E0D\u80FD\u81EA\u52A8\u8DD1\u3001\u770B\u5230\u4EC0\u4E48\u7B97\u771F\u3001\u770B\u5230\u4EC0\u4E48\u7B97\u5047\u3002\n\u53EA\u5199\u300C\u7B97\u771F\u300D\u4E0D\u5199\u300C\u7B97\u5047\u300D\u7684\u68C0\u67E5\uFF0C\u7B49\u4E8E\u6CA1\u6709\u529E\u6CD5\u5426\u5B9A\u4EFB\u4F55\u5047\u8BBE\u3002\n\n\u6700\u8D35\u7684\u90A3\u6761\u77E5\u8BC6\u4E0D\u662F\u300C\u54EA\u4E2A\u68C0\u67E5\u6700\u51C6\u300D\uFF0C\u800C\u662F**\u54EA\u4E2A\u68C0\u67E5\u770B\u8D77\u6765\u4FBF\u5B9C\u5374\u6CA1\u6709\u7ED3\u8BBA**\u3002\n\u300C\u67E5\u7F13\u5B58\u65F6\u95F4\u6233\u300D\u5C31\u662F\u5178\u578B\uFF1A2 \u5206\u949F\u3001\u81EA\u52A8\u3001\u8FD4\u56DE\u6B63\u5E38 \u2014\u2014 \u7136\u540E\u503C\u73ED\u540C\u5B66\u4F1A\u4EE5\u4E3A\u6392\u9664\u4E86\u7F13\u5B58\uFF0C\n\u63A5\u7740\u5728\u522B\u7684\u65B9\u5411\u4E0A\u518D\u70E7\u56DB\u5341\u5206\u949F\u3002\u8FD9\u7C7B\u68C0\u67E5\u8981\u4E48\u6807\u6CE8\u300C\u65E0\u7ED3\u8BBA\u300D\uFF0C\u8981\u4E48\u8865\u4E00\u6B21\u771F\u6B63\u80FD\u8BC1\u4F2A\u7684\u68C0\u67E5\u3002\n\n## \u4E00\u6761\u7EAA\u5F8B\n\n**\u5426\u5B9A\u4E5F\u662F\u77E5\u8BC6\u3002** \u6BCF\u6B21\u6392\u67E5\u90FD\u8981\u628A\u300C\u5426\u5B9A\u4E86\u54EA\u6761\u5047\u8BBE\u3001\u56E0\u4E3A\u4EC0\u4E48\u300D\u8BB0\u4E0B\u6765\u3002\u53EA\u8BB0\u6210\u529F\u7684\u6392\u67E5\u4F1A\u8BA9\n\u540C\u4E00\u6279\u5047\u8BBE\u88AB\u53CD\u590D\u9A8C\u8BC1\uFF0C\u800C\u6C38\u8FDC\u4E0D\u4F1A\u88AB\u526A\u6389 \u2014\u2014 \u56FE\u4E0A\u4F1A\u957F\u51FA\u4E00\u5806\u50F5\u5C38\u8FB9\u3002\n";
17
+ /** 三篇复盘:案例卡片的出处。正文就是案例的散文段(现象 / 影响面 / 排查过程 / 根因 / 修复)。 */
18
+ export declare function seedCaseSources(): SeedSource[];
19
+ export declare function seedSources(): SeedSource[];
20
+ //# sourceMappingURL=seed-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-source.d.ts","sourceRoot":"","sources":["../../../src/diagnosis/seed-source.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,+CAA+C;IAC/C,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,69NAoDzB,CAAA;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAY9C;AAED,wBAAgB,WAAW,IAAI,UAAU,EAAE,CAK1C"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Seed 的**原始材料**:一份排查手册 + 三篇复盘。
3
+ *
4
+ * 这一层存在的理由,正是 v0.7 修掉的那处架构缺口:排查思路如果只以 TypeScript 字面量存在,
5
+ * 它就**不是 wiki 内容** —— 不会进 `01_source_truth`、不会被编译、永远召不回来。
6
+ * 所以 seed 也走完整条动线:
7
+ *
8
+ * ```
9
+ * 这两份文本(SourceRaw,sourceType=question) → 五类卡片 → 编译 → 图
10
+ * ```
11
+ *
12
+ * 手册与复盘是**人写的散文**(就是下面这些字面量),卡片是从它们编译出来的结构化提取。
13
+ * 两者内容会有重叠 —— 那是正常的:卡片是散文的投影,不是它的替代品。
14
+ */
15
+ import { SEED_CASES } from './seed.js';
16
+ /**
17
+ * 排查手册:**类型层知识的出处**。
18
+ *
19
+ * 这份文本刻意写得比卡片「松」一些(讲判断顺序、讲纪律、讲坑),因为散文的职责是让人学会,
20
+ * 卡片的职责是让机器算得出来。把两者写成同一份东西,就会重演 §6.3 那句警告:
21
+ * 序和枚举一旦进了散文,归并算法就再也读不到它们了。
22
+ */
23
+ export const SEED_HANDBOOK = `# 日报指标异常排查手册(内部版)
24
+
25
+ ## 这份手册解决什么
26
+
27
+ 日报指标出现异常波动时,值班同学的第一反应通常是「先看看上游」。这句话没错,但它不是流程。
28
+ 手册把「先看什么」固定下来:**每一轮只做成本最低的那个检查**,用它的结论去砍候选,而不是
29
+ 凭印象挑一个方向深挖。
30
+
31
+ ## 现象先分四类
32
+
33
+ 看到异常先判断它属于哪一类,这决定了后面往哪个方向找:
34
+
35
+ - **缺失**:该有的没有 —— 全量为 0、分区或表未产出、任务报错未产出;
36
+ - **偏差**:有,但幅度不对 —— 突降、缓降、突增、缓升;
37
+ - **不一致**:有,但对不上 —— 与源系统对不上、跨报表勾稽不平、口径变更后不一致;
38
+ - **粒度**:有,但切分不对 —— 维度值缺失、重复计数、映射错位。
39
+
40
+ 为 0 和突增看起来相反,但它们的候选原因**有重叠**:重复 / 回刷既能造成放大,也能在去重逻辑
41
+ 介入后造成骤降;下游缓存既能掩盖更新(看起来降了),也能重复展示(看起来涨了)。所以不要
42
+ 按「涨还是跌」去排除假设,要按检查结论去砍。
43
+
44
+ ## 候选原因(类型层)
45
+
46
+ 1. **上游分区未产出** —— 当日 dwd / ods 分区不存在 → 指标必然为 0。
47
+ 反例:分区存在但行数为 0(那是重复 / 回刷的另一面),或者分区正常而指标仍为 0(那是口径或消费侧)。
48
+ 2. **口径 / 版本变更** —— 口径版本切换后,同名词指标在两版定义下口径不一致。
49
+ 反例:口径未变更时本假设不成立 —— 不要用「名字一样」当作口径一致的证据。
50
+ 3. **维表映射丢失** —— 维表 join 后 unknown 占比显著升高,且缺口集中在新增维度成员上。
51
+ 反例:unknown 占比正常时本假设不成立;缺口均匀分布时应转时间窗口或重复 / 回刷。
52
+ 4. **重复 / 回刷** —— 主键不唯一,或分区行数同比放大。上游重跑写入重复行 → 计数类指标放大。
53
+ 反例:主键唯一性检查通过时本假设不成立 —— 这是最常被误判的一条。
54
+ 5. **时间窗口 / 时区** —— 分区内事件时间跨出 T-1 单日窗口,且只有单日异常。
55
+ 反例:相邻日期同时异常时应转口径变更。
56
+ 6. **权限 / 过滤条件** —— 结果集被行级权限或 where 条件静默收窄。
57
+ 反例:权限与过滤条件在本周期未变更时本假设不成立。
58
+ 7. **下游 BI 缓存 / 增量** —— BI 展示侧滞后,但直连明细的数字正常。
59
+ 反例:明细对账一致时本假设不成立。**注意:查缓存时间戳只要 2 分钟,但它返回「正常」
60
+ 并不能否定这条假设** —— 要否定它必须做 35 分钟的人工明细对账。
61
+
62
+ ## 检查的成本意识
63
+
64
+ 每个假设下面挂的检查要写清三件事:多久、能不能自动跑、看到什么算真、看到什么算假。
65
+ 只写「算真」不写「算假」的检查,等于没有办法否定任何假设。
66
+
67
+ 最贵的那条知识不是「哪个检查最准」,而是**哪个检查看起来便宜却没有结论**。
68
+ 「查缓存时间戳」就是典型:2 分钟、自动、返回正常 —— 然后值班同学会以为排除了缓存,
69
+ 接着在别的方向上再烧四十分钟。这类检查要么标注「无结论」,要么补一次真正能证伪的检查。
70
+
71
+ ## 一条纪律
72
+
73
+ **否定也是知识。** 每次排查都要把「否定了哪条假设、因为什么」记下来。只记成功的排查会让
74
+ 同一批假设被反复验证,而永远不会被剪掉 —— 图上会长出一堆僵尸边。
75
+ `;
76
+ /** 三篇复盘:案例卡片的出处。正文就是案例的散文段(现象 / 影响面 / 排查过程 / 根因 / 修复)。 */
77
+ export function seedCaseSources() {
78
+ return SEED_CASES.map(item => ({
79
+ id: item.id,
80
+ title: `${item.id} ${item.title}`,
81
+ sourceType: 'question',
82
+ content: [
83
+ `# ${item.id} ${item.title}`,
84
+ '',
85
+ ...item.sections.flatMap(section => [`## ${section.heading}`, '', section.body, '']),
86
+ `排查耗时 ${item.durationMinutes} 分钟。`,
87
+ ].join('\n'),
88
+ }));
89
+ }
90
+ export function seedSources() {
91
+ return [
92
+ { id: 'handbook', title: '日报指标异常排查手册(内部版)', sourceType: 'question', content: SEED_HANDBOOK },
93
+ ...seedCaseSources(),
94
+ ];
95
+ }
96
+ //# sourceMappingURL=seed-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed-source.js","sourceRoot":"","sources":["../../../src/diagnosis/seed-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAWtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoD5B,CAAA;AAED,0DAA0D;AAC1D,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;QACjC,UAAU,EAAE,UAAU;QACtB,OAAO,EAAE;YACP,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;YAC5B,EAAE;YACF,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACpF,QAAQ,IAAI,CAAC,eAAe,MAAM;SACnC,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC,CAAC,CAAA;AACL,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE;QAC5F,GAAG,eAAe,EAAE;KACrB,CAAA;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { AttributionGraphData } from './types.js';
2
+ /**
3
+ * 案例 = **一篇 wiki 定义 + 一条有序排查路径**。
4
+ *
5
+ * 两段各有明确消费者,不能合并:
6
+ * - `sections` 是给人读、给向量召回的散文(可 diff、可评审、可追溯);
7
+ * - `path` 是给图和剪枝用的结构(有序、可判真假、带被否定的分支)。
8
+ *
9
+ * 序和枚举一旦写进散文,归并算法就再也读不到它们了 —— 所以路径单独成段。
10
+ */
11
+ export interface CaseSection {
12
+ heading: string;
13
+ body: string;
14
+ }
15
+ export interface CasePathStep {
16
+ nodeId: string;
17
+ label: string;
18
+ note: string;
19
+ /** 这一步的结论是「否定」:它把某个假设置于死地,而不是坐实。 */
20
+ refuted?: boolean;
21
+ }
22
+ export interface AttributionCase {
23
+ id: string;
24
+ title: string;
25
+ symptomId: string;
26
+ sections: CaseSection[];
27
+ path: CasePathStep[];
28
+ durationMinutes: number;
29
+ /** 误导段:最贵的那条知识。没有它,下次还会有人在同一个假设上烧掉四十分钟。 */
30
+ misleading?: {
31
+ nodeId: string;
32
+ label: string;
33
+ wastedMinutes: number;
34
+ why: string;
35
+ };
36
+ rootCause: string;
37
+ }
38
+ /**
39
+ * Seed 图谱:与 0021 §11 的三个案例同源,用来说明「同一现象有多个根因、否定边有用、
40
+ * 误导边昂贵」。
41
+ *
42
+ * 它现在有两重身份:
43
+ * 1. **首次启动的起点** —— `DiagnosisStore.ensure()` 在 `05_diagnosis/` 为空时把它写成
44
+ * 真实的 jsonl,之后用户可以手改,不会被覆盖回去;
45
+ * 2. **回归样本** —— 上面那三条结论需要一个稳定的夹具,所以它不会被删除。
46
+ */
47
+ export declare const SEED_GRAPH: AttributionGraphData;
48
+ /** 三个 seed 案例,与上面图谱里的节点 id 对齐(0021 §11)。 */
49
+ export declare const SEED_CASES: AttributionCase[];
50
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/diagnosis/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,IAAI,EAAE,YAAY,EAAE,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,2CAA2C;IAC3C,UAAU,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAClF,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,EAAE,oBAsKxB,CAAA;AAED,4CAA4C;AAC5C,eAAO,MAAM,UAAU,EAAE,eAAe,EA4EvC,CAAA"}