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.
- package/LICENSE +21 -0
- package/README.md +360 -0
- package/cordis.patch.yml +410 -0
- package/eval/README.md +76 -0
- package/eval/evaluate-retrieval.mjs +121 -0
- package/eval/queries.example.jsonl +2 -0
- package/lib/client.js +111415 -0
- package/lib/types/config-schema.d.ts +35 -0
- package/lib/types/config-schema.d.ts.map +1 -0
- package/lib/types/config-schema.js +34 -0
- package/lib/types/config-schema.js.map +1 -0
- package/lib/types/convert/core-loader.d.ts +32 -0
- package/lib/types/convert/core-loader.d.ts.map +1 -0
- package/lib/types/convert/core-loader.js +60 -0
- package/lib/types/convert/core-loader.js.map +1 -0
- package/lib/types/convert/host.d.ts +88 -0
- package/lib/types/convert/host.d.ts.map +1 -0
- package/lib/types/convert/host.js +479 -0
- package/lib/types/convert/host.js.map +1 -0
- package/lib/types/convert/ingest.d.ts +125 -0
- package/lib/types/convert/ingest.d.ts.map +1 -0
- package/lib/types/convert/ingest.js +228 -0
- package/lib/types/convert/ingest.js.map +1 -0
- package/lib/types/convert/settings-schema.d.ts +18 -0
- package/lib/types/convert/settings-schema.d.ts.map +1 -0
- package/lib/types/convert/settings-schema.js +26 -0
- package/lib/types/convert/settings-schema.js.map +1 -0
- package/lib/types/convert/types.d.ts +46 -0
- package/lib/types/convert/types.d.ts.map +1 -0
- package/lib/types/convert/types.js +41 -0
- package/lib/types/convert/types.js.map +1 -0
- package/lib/types/diagnosis/cards.d.ts +71 -0
- package/lib/types/diagnosis/cards.d.ts.map +1 -0
- package/lib/types/diagnosis/cards.js +482 -0
- package/lib/types/diagnosis/cards.js.map +1 -0
- package/lib/types/diagnosis/problem-classes.d.ts +51 -0
- package/lib/types/diagnosis/problem-classes.d.ts.map +1 -0
- package/lib/types/diagnosis/problem-classes.js +66 -0
- package/lib/types/diagnosis/problem-classes.js.map +1 -0
- package/lib/types/diagnosis/schema.d.ts +65 -0
- package/lib/types/diagnosis/schema.d.ts.map +1 -0
- package/lib/types/diagnosis/schema.js +208 -0
- package/lib/types/diagnosis/schema.js.map +1 -0
- package/lib/types/diagnosis/seed-source.d.ts +20 -0
- package/lib/types/diagnosis/seed-source.d.ts.map +1 -0
- package/lib/types/diagnosis/seed-source.js +96 -0
- package/lib/types/diagnosis/seed-source.js.map +1 -0
- package/lib/types/diagnosis/seed.d.ts +50 -0
- package/lib/types/diagnosis/seed.d.ts.map +1 -0
- package/lib/types/diagnosis/seed.js +242 -0
- package/lib/types/diagnosis/seed.js.map +1 -0
- package/lib/types/diagnosis/store.d.ts +81 -0
- package/lib/types/diagnosis/store.d.ts.map +1 -0
- package/lib/types/diagnosis/store.js +409 -0
- package/lib/types/diagnosis/store.js.map +1 -0
- package/lib/types/diagnosis/types.d.ts +124 -0
- package/lib/types/diagnosis/types.d.ts.map +1 -0
- package/lib/types/diagnosis/types.js +13 -0
- package/lib/types/diagnosis/types.js.map +1 -0
- package/lib/types/directory-picker.d.ts +94 -0
- package/lib/types/directory-picker.d.ts.map +1 -0
- package/lib/types/directory-picker.js +110 -0
- package/lib/types/directory-picker.js.map +1 -0
- package/lib/types/extract-model.d.ts +76 -0
- package/lib/types/extract-model.d.ts.map +1 -0
- package/lib/types/extract-model.js +193 -0
- package/lib/types/extract-model.js.map +1 -0
- package/lib/types/extract.d.ts +121 -0
- package/lib/types/extract.d.ts.map +1 -0
- package/lib/types/extract.js +549 -0
- package/lib/types/extract.js.map +1 -0
- package/lib/types/fts.d.ts +96 -0
- package/lib/types/fts.d.ts.map +1 -0
- package/lib/types/fts.js +184 -0
- package/lib/types/fts.js.map +1 -0
- package/lib/types/index.d.ts +39 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +1112 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/intent/engine.d.ts +108 -0
- package/lib/types/intent/engine.d.ts.map +1 -0
- package/lib/types/intent/engine.js +501 -0
- package/lib/types/intent/engine.js.map +1 -0
- package/lib/types/intent/host.d.ts +88 -0
- package/lib/types/intent/host.d.ts.map +1 -0
- package/lib/types/intent/host.js +389 -0
- package/lib/types/intent/host.js.map +1 -0
- package/lib/types/intent/preset-tools.d.ts +37 -0
- package/lib/types/intent/preset-tools.d.ts.map +1 -0
- package/lib/types/intent/preset-tools.js +45 -0
- package/lib/types/intent/preset-tools.js.map +1 -0
- package/lib/types/intent/settings-schema.d.ts +59 -0
- package/lib/types/intent/settings-schema.d.ts.map +1 -0
- package/lib/types/intent/settings-schema.js +57 -0
- package/lib/types/intent/settings-schema.js.map +1 -0
- package/lib/types/intent/store.d.ts +75 -0
- package/lib/types/intent/store.d.ts.map +1 -0
- package/lib/types/intent/store.js +139 -0
- package/lib/types/intent/store.js.map +1 -0
- package/lib/types/intent/tools.d.ts +63 -0
- package/lib/types/intent/tools.d.ts.map +1 -0
- package/lib/types/intent/tools.js +108 -0
- package/lib/types/intent/tools.js.map +1 -0
- package/lib/types/intent/types.d.ts +189 -0
- package/lib/types/intent/types.d.ts.map +1 -0
- package/lib/types/intent/types.js +62 -0
- package/lib/types/intent/types.js.map +1 -0
- package/lib/types/knowledge-bases.d.ts +266 -0
- package/lib/types/knowledge-bases.d.ts.map +1 -0
- package/lib/types/knowledge-bases.js +1107 -0
- package/lib/types/knowledge-bases.js.map +1 -0
- package/lib/types/layout.d.ts +262 -0
- package/lib/types/layout.d.ts.map +1 -0
- package/lib/types/layout.js +312 -0
- package/lib/types/layout.js.map +1 -0
- package/lib/types/migrate.d.ts +110 -0
- package/lib/types/migrate.d.ts.map +1 -0
- package/lib/types/migrate.js +280 -0
- package/lib/types/migrate.js.map +1 -0
- package/lib/types/recall-rank.d.ts +158 -0
- package/lib/types/recall-rank.d.ts.map +1 -0
- package/lib/types/recall-rank.js +261 -0
- package/lib/types/recall-rank.js.map +1 -0
- package/lib/types/runtime.d.ts +568 -0
- package/lib/types/runtime.d.ts.map +1 -0
- package/lib/types/runtime.js +3045 -0
- package/lib/types/runtime.js.map +1 -0
- package/lib/types/settings-schema.d.ts +117 -0
- package/lib/types/settings-schema.d.ts.map +1 -0
- package/lib/types/settings-schema.js +92 -0
- package/lib/types/settings-schema.js.map +1 -0
- package/lib/types/settings-volatile.d.ts +102 -0
- package/lib/types/settings-volatile.d.ts.map +1 -0
- package/lib/types/settings-volatile.js +114 -0
- package/lib/types/settings-volatile.js.map +1 -0
- package/lib/types/types.d.ts +799 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/types.js +387 -0
- package/lib/types/types.js.map +1 -0
- package/lib/types/wiki-types.d.ts +68 -0
- package/lib/types/wiki-types.d.ts.map +1 -0
- package/lib/types/wiki-types.js +322 -0
- package/lib/types/wiki-types.js.map +1 -0
- package/package.json +101 -0
- package/preset/tita-data-agent/agent.cordis.yml +376 -0
- package/preset/tita-data-agent/preset.yml +3 -0
- package/python/requirements.txt +8 -0
- package/scripts/doctor.mjs +70 -0
- package/scripts/e2e-pipeline.mjs +355 -0
- package/scripts/install-agent-preset.mjs +92 -0
- package/scripts/setup-embedding.sh +34 -0
- package/scripts/sync-agent-preset.mjs +188 -0
- package/src/client/AgentPresetCard.tsx +247 -0
- package/src/client/DirectoryPicker.tsx +357 -0
- package/src/client/InfoHint.tsx +65 -0
- package/src/client/IntentLogicTab.tsx +185 -0
- package/src/client/IntentTab.tsx +715 -0
- package/src/client/KnowledgeBaseTab.tsx +1454 -0
- package/src/client/KnowledgeGraphView.tsx +306 -0
- package/src/client/KnowledgePanel.tsx +381 -0
- package/src/client/KnowledgeStepRail.tsx +60 -0
- package/src/client/NodeSettings.tsx +392 -0
- package/src/client/PreviewSections.tsx +116 -0
- package/src/client/RecallPanel.tsx +399 -0
- package/src/client/TypeDefinitionDrawer.tsx +215 -0
- package/src/client/WikiFlowCard.tsx +226 -0
- package/src/client/WikiTypeEditor.tsx +332 -0
- package/src/client/agent-preset.ts +121 -0
- package/src/client/arch/AgentArchitectureGraph.tsx +219 -0
- package/src/client/arch/NodeLogicPanel.tsx +133 -0
- package/src/client/arch/ProblemDetailPanel.tsx +88 -0
- package/src/client/arch/model.ts +691 -0
- package/src/client/architecture.css +191 -0
- package/src/client/architecture.tsx +530 -0
- package/src/client/attribution/AttributionGraph.tsx +104 -0
- package/src/client/attribution/AttributionTab.tsx +332 -0
- package/src/client/attribution/CaseView.tsx +102 -0
- package/src/client/attribution/GraphStage.tsx +87 -0
- package/src/client/attribution/RunView.tsx +184 -0
- package/src/client/attribution/StageChrome.tsx +403 -0
- package/src/client/attribution/ViewSwitch.tsx +107 -0
- package/src/client/attribution/graph-options.ts +381 -0
- package/src/client/attribution/model.ts +462 -0
- package/src/client/config-scope.ts +119 -0
- package/src/client/convert/ConvertPanel.tsx +594 -0
- package/src/client/convert/styles.css +138 -0
- package/src/client/convert/styles.ts +49 -0
- package/src/client/format.ts +39 -0
- package/src/client/graph/layout.ts +181 -0
- package/src/client/graph.css +113 -0
- package/src/client/index.ts +98 -0
- package/src/client/problem-domains.ts +114 -0
- package/src/client/styles.css +940 -0
- package/src/client/styles.ts +11 -0
- package/src/client/useFitScale.ts +68 -0
- package/src/config-schema.ts +45 -0
- package/src/convert/core-loader.ts +68 -0
- package/src/convert/host.ts +579 -0
- package/src/convert/ingest.ts +367 -0
- package/src/convert/settings-schema.ts +27 -0
- package/src/convert/types.ts +65 -0
- package/src/diagnosis/cards.ts +498 -0
- package/src/diagnosis/problem-classes.ts +117 -0
- package/src/diagnosis/schema.ts +260 -0
- package/src/diagnosis/seed-source.ts +107 -0
- package/src/diagnosis/seed.ts +291 -0
- package/src/diagnosis/store.ts +432 -0
- package/src/diagnosis/types.ts +152 -0
- package/src/directory-picker.ts +164 -0
- package/src/extract-model.ts +227 -0
- package/src/extract.ts +632 -0
- package/src/fts.ts +203 -0
- package/src/index.ts +1091 -0
- package/src/intent/README.md +63 -0
- package/src/intent/engine.ts +527 -0
- package/src/intent/host.ts +462 -0
- package/src/intent/preset-tools.ts +48 -0
- package/src/intent/settings-schema.ts +63 -0
- package/src/intent/store.ts +143 -0
- package/src/intent/tools.ts +139 -0
- package/src/intent/types.ts +245 -0
- package/src/knowledge-bases.ts +1160 -0
- package/src/layout.ts +350 -0
- package/src/migrate.ts +262 -0
- package/src/python/embedding_worker.py +471 -0
- package/src/recall-rank.ts +299 -0
- package/src/runtime.ts +3069 -0
- package/src/settings-schema.ts +94 -0
- package/src/settings-volatile.ts +122 -0
- package/src/types.ts +1140 -0
- package/src/wiki-types.ts +357 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { DIAGNOSIS_ENTITIES } from './schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* 诊断卡片的**编解码**:markdown 卡片 ⇄ 图上的节点与边(0021 §6.3)。
|
|
4
|
+
*
|
|
5
|
+
* ## 为什么这一层必须存在
|
|
6
|
+
*
|
|
7
|
+
* 在它之前,智能归因的图只有一条来源:`seed.ts` 里的 TypeScript 字面量,被
|
|
8
|
+
* `DiagnosisStore.ensure()` 直接写成 `05_diagnosis/*.jsonl`。那意味着**排查思路从来没有
|
|
9
|
+
* 进过 wiki**:它不在 `01_source_truth` 里、不是 `02_wiki` 的卡片、编译器连
|
|
10
|
+
* `diagnosis/hypothesis` 这个 entity_type 都不认 —— 于是它既不会被 wikiNote 化,
|
|
11
|
+
* 也不会进向量索引,**召回永远召不到它**。而「遇到类似问题先召回」正是这个产品的主张。
|
|
12
|
+
*
|
|
13
|
+
* 这一层把图变成卡片的**投影**:卡片是手写的(人写、Agent 写、从 SourceRaw 编译而来),
|
|
14
|
+
* 图是算出来的。§4「存图、显树」讲的是同一件事 —— 存的是知识,图是它的一种读法。
|
|
15
|
+
*
|
|
16
|
+
* ## 卡片三段式与「谁由卡片定义」的边界
|
|
17
|
+
*
|
|
18
|
+
* ```
|
|
19
|
+
* front matter ── 信封:id / entity_type / title / summary / status / owner / source_refs
|
|
20
|
+
* 正文小节 ────── 人读、给向量召回(可 diff、可评审)
|
|
21
|
+
* 结构化块 ────── 机器读:枚举、引用、**顺序**、逐边属性
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* 边界要说清楚,否则「为什么这张图里有东西不在卡片里」会变成一个反复出现的疑问:
|
|
25
|
+
*
|
|
26
|
+
* | 图上的东西 | 谁定义 | 为什么 |
|
|
27
|
+
* | --- | --- | --- |
|
|
28
|
+
* | symptom / hypothesis / check / failure-mode / case 节点 | **卡片** | 这五类是人写的知识(§6.4) |
|
|
29
|
+
* | asset 节点 | 引用反推 | 它随数据目录同步,不手写;卡片里只留 id |
|
|
30
|
+
* | 现象→假设 / 假设→检查 / 假设→失败模式 / 资产→假设 / 案例→现象 边 | **卡片** | 都是卡片字段的确定性投影 |
|
|
31
|
+
* | evidence / cause 节点,produces / supports / refutes / confirmed_as 边 | **一次排查** | 它们是一次执行的结果,不是知识;由排查自动写入(§6.4) |
|
|
32
|
+
*
|
|
33
|
+
* 最后一行不是妥协,是分层:把「上次查到什么」写进卡片,等于让一份可复用的知识
|
|
34
|
+
* 绑死在一次具体的执行上。
|
|
35
|
+
*/
|
|
36
|
+
/** 卡片正文里那个机器可读块的围栏标记。用带名字的围栏,方便人和编辑器识别。 */
|
|
37
|
+
const BLOCK_FENCE = 'json diagnosis';
|
|
38
|
+
/** 卡片不声明状态时的默认值:它已经被人写过一遍,只是还没走评审流程。 */
|
|
39
|
+
export const DEFAULT_CARD_STATUS = 'reviewed';
|
|
40
|
+
/**
|
|
41
|
+
* 每种卡片:结构化块里放哪些字段,以及哪个字段是「节点的一句话说明」。
|
|
42
|
+
*
|
|
43
|
+
* 这张表是**唯一的映射声明**。校验、序列化、反序列化都读它 —— 三处各写一份字段清单,
|
|
44
|
+
* 迟早会出现「校验要求 A、写盘漏了 B、读回来又不认识 C」。
|
|
45
|
+
*/
|
|
46
|
+
const CARD_LAYOUT = {
|
|
47
|
+
'diagnosis/symptom': {
|
|
48
|
+
// 现象的「一句话说明」就是它的可观测口径 —— §6.4 把 observable 定成必填正因如此。
|
|
49
|
+
block: ['observable', 'entry_when', 'problem_class', 'problem_subclass', 'candidates'],
|
|
50
|
+
summaryFrom: 'observable',
|
|
51
|
+
},
|
|
52
|
+
'diagnosis/hypothesis': {
|
|
53
|
+
block: ['discriminator', 'not_when', 'failure_mode', 'verified_by', 'assets', 'reuse_count', 'stale'],
|
|
54
|
+
summaryFrom: 'summary',
|
|
55
|
+
},
|
|
56
|
+
'diagnosis/check': {
|
|
57
|
+
block: ['cost_minutes', 'automation', 'verdict_true', 'verdict_false', 'stale'],
|
|
58
|
+
summaryFrom: 'summary',
|
|
59
|
+
},
|
|
60
|
+
'diagnosis/failure-mode': {
|
|
61
|
+
block: ['code', 'label', 'boundary'],
|
|
62
|
+
summaryFrom: 'summary',
|
|
63
|
+
},
|
|
64
|
+
'diagnosis/case': {
|
|
65
|
+
block: ['symptom', 'path', 'duration_minutes', 'misleading', 'root_cause', 'impact', 'prevention'],
|
|
66
|
+
summaryFrom: 'summary',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/** 反向查表:节点 kind → 卡片 entity_type。`asset` 与执行产物没有卡片。 */
|
|
70
|
+
export function entityTypeOf(kind) {
|
|
71
|
+
return DIAGNOSIS_ENTITIES.find(spec => spec.kind === kind)?.entityType;
|
|
72
|
+
}
|
|
73
|
+
/** 卡片能定义的节点类型。其余(asset / evidence / cause / unknown)不走卡片。 */
|
|
74
|
+
export const CARD_NODE_KINDS = DIAGNOSIS_ENTITIES.map(spec => spec.kind);
|
|
75
|
+
/** 卡片能定义的边:全部是卡片字段的确定性投影。 */
|
|
76
|
+
export const CARD_EDGE_KINDS = [
|
|
77
|
+
'may_be_caused_by', 'verified_by', 'categorized_as', 'indexed_from', 'instance_of',
|
|
78
|
+
];
|
|
79
|
+
/** 一次排查写下的边。它们不属于任何卡片,见文件头的边界表。 */
|
|
80
|
+
export const RUN_EDGE_KINDS = ['produces', 'supports', 'refutes', 'confirmed_as'];
|
|
81
|
+
/* ─────────────────────────────────────────────── 序列化:卡片 → markdown ── */
|
|
82
|
+
function frontMatterValue(value) {
|
|
83
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 卡片 → markdown 文本。
|
|
87
|
+
*
|
|
88
|
+
* 结构化块放在**正文里**而不是 front matter 的 JSON 里:改一个字段就从「一个几百字符的
|
|
89
|
+
* 长行整体重写」变成「一行改动」,review 时才看得出改了哪条判据、哪一步顺序。
|
|
90
|
+
* 这正是 §6.3 把三段分开的理由。
|
|
91
|
+
*/
|
|
92
|
+
export function serializeCard(card) {
|
|
93
|
+
const front = [
|
|
94
|
+
['entity_id', card.entityId],
|
|
95
|
+
['entity_type', card.entityType],
|
|
96
|
+
['title', card.title],
|
|
97
|
+
...(card.summary ? [['summary', card.summary]] : []),
|
|
98
|
+
['status', card.status],
|
|
99
|
+
...(card.owner ? [['owner', card.owner]] : []),
|
|
100
|
+
['source_refs', card.sourceRefs],
|
|
101
|
+
...(card.updatedAt ? [['updated_at', card.updatedAt]] : []),
|
|
102
|
+
];
|
|
103
|
+
const body = card.sections
|
|
104
|
+
.filter(section => section.body.trim() !== '')
|
|
105
|
+
.map(section => `## ${section.heading}\n\n${section.body.trim()}`)
|
|
106
|
+
.join('\n\n');
|
|
107
|
+
const block = JSON.stringify(card.block, null, 2);
|
|
108
|
+
return `---\n${front.map(([key, value]) => `${key}: ${frontMatterValue(value)}`).join('\n')}\n---\n\n${body}\n\n\`\`\`${BLOCK_FENCE}\n${block}\n\`\`\`\n`;
|
|
109
|
+
}
|
|
110
|
+
/* ─────────────────────────────────────────────── 反序列化:markdown → 卡片 ── */
|
|
111
|
+
export function parseCard(source) {
|
|
112
|
+
// 复用运行时的 front matter 解析(同一个 yaml 子集),不另写一套。
|
|
113
|
+
const parsed = parseFrontmatter(source);
|
|
114
|
+
const entityType = String(parsed.frontmatter.entity_type ?? '');
|
|
115
|
+
if (!isEntityType(entityType))
|
|
116
|
+
return undefined;
|
|
117
|
+
const entityId = String(parsed.frontmatter.entity_id ?? '').trim();
|
|
118
|
+
if (!entityId)
|
|
119
|
+
return undefined;
|
|
120
|
+
const match = parsed.content.match(new RegExp('```' + BLOCK_FENCE + '\\s*\\n([\\s\\S]*?)```'));
|
|
121
|
+
let block = {};
|
|
122
|
+
if (match) {
|
|
123
|
+
try {
|
|
124
|
+
const value = JSON.parse(match[1]);
|
|
125
|
+
if (value && typeof value === 'object' && !Array.isArray(value))
|
|
126
|
+
block = value;
|
|
127
|
+
}
|
|
128
|
+
catch { /* 块坏了不静默降级成空对象:留空之后由三层校验的「格式层」报缺字段。 */ }
|
|
129
|
+
}
|
|
130
|
+
const body = match ? parsed.content.replace(match[0], '') : parsed.content;
|
|
131
|
+
const refs = parsed.frontmatter.source_refs;
|
|
132
|
+
return {
|
|
133
|
+
entityId,
|
|
134
|
+
entityType,
|
|
135
|
+
title: String(parsed.frontmatter.title ?? entityId),
|
|
136
|
+
...(parsed.frontmatter.summary ? { summary: String(parsed.frontmatter.summary) } : {}),
|
|
137
|
+
status: String(parsed.frontmatter.status ?? DEFAULT_CARD_STATUS),
|
|
138
|
+
...(parsed.frontmatter.owner ? { owner: String(parsed.frontmatter.owner) } : {}),
|
|
139
|
+
sourceRefs: Array.isArray(refs) ? refs.map(String) : [],
|
|
140
|
+
...(parsed.frontmatter.updated_at ? { updatedAt: String(parsed.frontmatter.updated_at) } : {}),
|
|
141
|
+
sections: splitSections(body),
|
|
142
|
+
block,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 只解析 front matter 与正文。
|
|
147
|
+
*
|
|
148
|
+
* 与 `runtime.ts` 里的 `parseMarkdown` 是同一条规则(同一个 yaml 子集),这里保留一份
|
|
149
|
+
* 只读副本是为了让 `diagnosis/` 不反向依赖宿主的运行时 —— 领域模块被 runtime 依赖,
|
|
150
|
+
* 不能形成环。
|
|
151
|
+
*/
|
|
152
|
+
function parseFrontmatter(source) {
|
|
153
|
+
if (!source.startsWith('---'))
|
|
154
|
+
return { frontmatter: {}, content: source.trim() };
|
|
155
|
+
const end = source.indexOf('\n---', 3);
|
|
156
|
+
if (end < 0)
|
|
157
|
+
return { frontmatter: {}, content: source.trim() };
|
|
158
|
+
const frontmatter = {};
|
|
159
|
+
for (const line of source.slice(3, end).replace(/^\n/, '').split(/\r?\n/)) {
|
|
160
|
+
const separator = line.indexOf(':');
|
|
161
|
+
if (separator <= 0)
|
|
162
|
+
continue;
|
|
163
|
+
const key = line.slice(0, separator).trim();
|
|
164
|
+
const text = line.slice(separator + 1).trim();
|
|
165
|
+
if (text === 'true')
|
|
166
|
+
frontmatter[key] = true;
|
|
167
|
+
else if (text === 'false')
|
|
168
|
+
frontmatter[key] = false;
|
|
169
|
+
else if (text === 'null')
|
|
170
|
+
frontmatter[key] = null;
|
|
171
|
+
else if (/^-?\d+(\.\d+)?$/.test(text))
|
|
172
|
+
frontmatter[key] = Number(text);
|
|
173
|
+
else if ((text.startsWith('[') && text.endsWith(']')) || (text.startsWith('{') && text.endsWith('}'))) {
|
|
174
|
+
try {
|
|
175
|
+
frontmatter[key] = JSON.parse(text);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
frontmatter[key] = text.replace(/^['"]|['"]$/g, '');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else
|
|
182
|
+
frontmatter[key] = text.replace(/^['"]|['"]$/g, '');
|
|
183
|
+
}
|
|
184
|
+
return { frontmatter, content: source.slice(end + 4).trim() };
|
|
185
|
+
}
|
|
186
|
+
function splitSections(body) {
|
|
187
|
+
const sections = [];
|
|
188
|
+
let heading;
|
|
189
|
+
let lines = [];
|
|
190
|
+
const flush = () => {
|
|
191
|
+
if (heading !== undefined)
|
|
192
|
+
sections.push({ heading, body: lines.join('\n').trim() });
|
|
193
|
+
lines = [];
|
|
194
|
+
};
|
|
195
|
+
for (const line of body.split(/\r?\n/)) {
|
|
196
|
+
const match = /^##\s+(.+)$/.exec(line);
|
|
197
|
+
if (match) {
|
|
198
|
+
flush();
|
|
199
|
+
heading = match[1].trim();
|
|
200
|
+
}
|
|
201
|
+
else if (heading !== undefined)
|
|
202
|
+
lines.push(line);
|
|
203
|
+
}
|
|
204
|
+
flush();
|
|
205
|
+
return sections.filter(section => section.body !== '');
|
|
206
|
+
}
|
|
207
|
+
function isEntityType(value) {
|
|
208
|
+
return DIAGNOSIS_ENTITIES.some(spec => spec.entityType === value);
|
|
209
|
+
}
|
|
210
|
+
/* ─────────────────────────────────────────────── 图 → 卡片 ── */
|
|
211
|
+
/**
|
|
212
|
+
* 类型层与案例 → 卡片。
|
|
213
|
+
*
|
|
214
|
+
* `asset` / `evidence` / `cause` 节点**不产出卡片**:它们不是手写的知识(§6.4)。
|
|
215
|
+
* 被假设引用的资产会在反序列化时按 id 补一个最小节点回来。
|
|
216
|
+
*/
|
|
217
|
+
export function graphToCards(graph, cases = []) {
|
|
218
|
+
const cards = [];
|
|
219
|
+
for (const node of graph.nodes) {
|
|
220
|
+
// 案例节点只是图上的**桩**:它的正文与有序路径住在 `cases` 里(§6.4)。图上的桩不单独成卡,
|
|
221
|
+
// 否则同一个 CASE-001 会有两张卡 —— 一张带路径、一张空壳,读图时看谁先被遍历到。
|
|
222
|
+
if (node.kind === 'case')
|
|
223
|
+
continue;
|
|
224
|
+
const entityType = entityTypeOf(node.kind);
|
|
225
|
+
if (!entityType)
|
|
226
|
+
continue;
|
|
227
|
+
const layout = CARD_LAYOUT[entityType];
|
|
228
|
+
const block = {};
|
|
229
|
+
if (node.kind === 'symptom') {
|
|
230
|
+
block.observable = node.summary ?? '';
|
|
231
|
+
block.entry_when = '';
|
|
232
|
+
block.problem_class = node.problemClass ?? null;
|
|
233
|
+
block.problem_subclass = node.problemSubclass ?? null;
|
|
234
|
+
// 现象 → 假设:**逐边属性必须落在边上**(stale_days 属于「这个现象 × 这个假设」这一对),
|
|
235
|
+
// 所以它跟着现象卡片走,而不是跟着假设卡片走。
|
|
236
|
+
block.candidates = graph.edges
|
|
237
|
+
.filter(edge => edge.kind === 'may_be_caused_by' && edge.source === node.id)
|
|
238
|
+
.map(edge => ({
|
|
239
|
+
id: edge.target,
|
|
240
|
+
...(edge.staleDays === undefined ? {} : { stale_days: edge.staleDays }),
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
else if (node.kind === 'hypothesis') {
|
|
244
|
+
block.discriminator = node.discriminator ?? '';
|
|
245
|
+
block.not_when = node.notWhen ?? '';
|
|
246
|
+
block.failure_mode = node.failureMode ?? null;
|
|
247
|
+
block.verified_by = graph.edges.filter(edge => edge.kind === 'verified_by' && edge.source === node.id).map(edge => edge.target);
|
|
248
|
+
block.assets = graph.edges.filter(edge => edge.kind === 'indexed_from' && edge.target === node.id).map(edge => edge.source);
|
|
249
|
+
block.reuse_count = node.reuseCount ?? 0;
|
|
250
|
+
if (node.stale !== undefined)
|
|
251
|
+
block.stale = node.stale;
|
|
252
|
+
}
|
|
253
|
+
else if (node.kind === 'check') {
|
|
254
|
+
block.cost_minutes = node.costMinutes ?? null;
|
|
255
|
+
block.automation = node.automation ?? null;
|
|
256
|
+
block.verdict_true = node.verdictTrue ?? '';
|
|
257
|
+
block.verdict_false = node.verdictFalse ?? '';
|
|
258
|
+
if (node.stale !== undefined)
|
|
259
|
+
block.stale = node.stale;
|
|
260
|
+
}
|
|
261
|
+
else if (node.kind === 'failure-mode') {
|
|
262
|
+
block.code = node.code ?? null;
|
|
263
|
+
block.label = node.title;
|
|
264
|
+
block.boundary = '';
|
|
265
|
+
}
|
|
266
|
+
cards.push({
|
|
267
|
+
entityId: node.id,
|
|
268
|
+
entityType,
|
|
269
|
+
title: node.title,
|
|
270
|
+
...(layout.summaryFrom === 'summary' && node.summary ? { summary: node.summary } : {}),
|
|
271
|
+
status: DEFAULT_CARD_STATUS,
|
|
272
|
+
...(node.owner ? { owner: node.owner } : {}),
|
|
273
|
+
sourceRefs: [],
|
|
274
|
+
sections: [],
|
|
275
|
+
block,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
for (const item of cases) {
|
|
279
|
+
cards.push({
|
|
280
|
+
entityId: item.id,
|
|
281
|
+
entityType: 'diagnosis/case',
|
|
282
|
+
title: item.title,
|
|
283
|
+
status: DEFAULT_CARD_STATUS,
|
|
284
|
+
sourceRefs: [],
|
|
285
|
+
sections: item.sections.map(section => ({ heading: section.heading, body: section.body })),
|
|
286
|
+
block: {
|
|
287
|
+
// 案例必须从一个现象进入 —— 这条信息在图上就是 `instance_of` 边,在卡片上是这一个字段。
|
|
288
|
+
symptom: item.symptomId,
|
|
289
|
+
path: item.path,
|
|
290
|
+
duration_minutes: item.durationMinutes,
|
|
291
|
+
...(item.misleading ? { misleading: item.misleading } : {}),
|
|
292
|
+
root_cause: item.rootCause,
|
|
293
|
+
},
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
return cards;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* 卡片 → 图。
|
|
300
|
+
*
|
|
301
|
+
* 只产出「卡片定义得了」的那部分(类型层 + 引用层的资产 + 案例,以及五种卡片边);
|
|
302
|
+
* `evidence` / `cause` 与四条执行边由一次排查写入,不在这里合成 —— 否则一次执行的结果
|
|
303
|
+
* 会被伪装成可复用的知识。
|
|
304
|
+
*/
|
|
305
|
+
export function cardsToGraph(cards) {
|
|
306
|
+
const nodes = [];
|
|
307
|
+
const edges = [];
|
|
308
|
+
const cases = [];
|
|
309
|
+
const problems = [];
|
|
310
|
+
const seen = new Set();
|
|
311
|
+
for (const card of cards) {
|
|
312
|
+
if (seen.has(card.entityId))
|
|
313
|
+
problems.push(`卡片 ${card.entityId} 被定义了多次 —— 同一份知识只能有一张卡片`);
|
|
314
|
+
seen.add(card.entityId);
|
|
315
|
+
}
|
|
316
|
+
/** 资产节点按引用反推:引用层随数据目录同步,卡片里只留 id。 */
|
|
317
|
+
const assetIds = new Set();
|
|
318
|
+
const modeIdByCode = new Map();
|
|
319
|
+
for (const card of cards) {
|
|
320
|
+
if (card.entityType === 'diagnosis/failure-mode' && typeof card.block.code === 'string') {
|
|
321
|
+
modeIdByCode.set(card.block.code, card.entityId);
|
|
322
|
+
}
|
|
323
|
+
if (card.entityType === 'diagnosis/hypothesis' && Array.isArray(card.block.assets)) {
|
|
324
|
+
for (const id of card.block.assets)
|
|
325
|
+
assetIds.add(String(id));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
for (const card of cards) {
|
|
329
|
+
const spec = DIAGNOSIS_ENTITIES.find(candidate => candidate.entityType === card.entityType);
|
|
330
|
+
if (!spec)
|
|
331
|
+
continue;
|
|
332
|
+
const layout = CARD_LAYOUT[card.entityType];
|
|
333
|
+
const summary = layout.summaryFrom === 'observable' ? stringOf(card.block.observable) : card.summary;
|
|
334
|
+
const node = {
|
|
335
|
+
id: card.entityId,
|
|
336
|
+
kind: spec.kind,
|
|
337
|
+
layer: spec.layer,
|
|
338
|
+
title: card.title,
|
|
339
|
+
...(summary ? { summary } : {}),
|
|
340
|
+
...(card.owner ? { owner: card.owner } : {}),
|
|
341
|
+
};
|
|
342
|
+
if (card.entityType === 'diagnosis/symptom') {
|
|
343
|
+
const problemClass = stringOf(card.block.problem_class);
|
|
344
|
+
if (problemClass)
|
|
345
|
+
node.problemClass = problemClass;
|
|
346
|
+
const subclass = stringOf(card.block.problem_subclass);
|
|
347
|
+
if (subclass)
|
|
348
|
+
node.problemSubclass = subclass;
|
|
349
|
+
const candidates = Array.isArray(card.block.candidates) ? card.block.candidates : [];
|
|
350
|
+
candidates.forEach((entry, index) => {
|
|
351
|
+
const target = stringOf(entry?.id);
|
|
352
|
+
if (!target)
|
|
353
|
+
return;
|
|
354
|
+
const staleDays = numberOf(entry?.stale_days);
|
|
355
|
+
edges.push({
|
|
356
|
+
id: `e-${card.entityId.toLowerCase()}-${target.toLowerCase()}-${index}`,
|
|
357
|
+
source: card.entityId,
|
|
358
|
+
target,
|
|
359
|
+
kind: 'may_be_caused_by',
|
|
360
|
+
...(staleDays === undefined ? {} : { staleDays }),
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
else if (card.entityType === 'diagnosis/hypothesis') {
|
|
365
|
+
const discriminator = stringOf(card.block.discriminator);
|
|
366
|
+
if (discriminator)
|
|
367
|
+
node.discriminator = discriminator;
|
|
368
|
+
const notWhen = stringOf(card.block.not_when);
|
|
369
|
+
if (notWhen)
|
|
370
|
+
node.notWhen = notWhen;
|
|
371
|
+
const failureMode = stringOf(card.block.failure_mode);
|
|
372
|
+
if (failureMode)
|
|
373
|
+
node.failureMode = failureMode;
|
|
374
|
+
const reuse = numberOf(card.block.reuse_count);
|
|
375
|
+
if (reuse !== undefined)
|
|
376
|
+
node.reuseCount = reuse;
|
|
377
|
+
if (typeof card.block.stale === 'boolean')
|
|
378
|
+
node.stale = card.block.stale;
|
|
379
|
+
for (const [index, target] of listOf(card.block.verified_by).entries()) {
|
|
380
|
+
edges.push({ id: `e-${card.entityId.toLowerCase()}-${String(target).toLowerCase()}-${index}`, source: card.entityId, target: String(target), kind: 'verified_by' });
|
|
381
|
+
}
|
|
382
|
+
for (const [index, asset] of listOf(card.block.assets).entries()) {
|
|
383
|
+
edges.push({ id: `e-${String(asset).toLowerCase()}-${card.entityId.toLowerCase()}-${index}`, source: String(asset), target: card.entityId, kind: 'indexed_from' });
|
|
384
|
+
}
|
|
385
|
+
if (failureMode) {
|
|
386
|
+
const modeNode = modeIdByCode.get(failureMode);
|
|
387
|
+
if (modeNode)
|
|
388
|
+
edges.push({ id: `e-${card.entityId.toLowerCase()}-${modeNode.toLowerCase()}`, source: card.entityId, target: modeNode, kind: 'categorized_as' });
|
|
389
|
+
else
|
|
390
|
+
problems.push(`${card.entityId} 的 failure_mode=${failureMode} 找不到对应的失败模式卡片 —— categorized_as 边无从建立`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
else if (card.entityType === 'diagnosis/check') {
|
|
394
|
+
const cost = numberOf(card.block.cost_minutes);
|
|
395
|
+
if (cost !== undefined)
|
|
396
|
+
node.costMinutes = cost;
|
|
397
|
+
const automation = stringOf(card.block.automation);
|
|
398
|
+
if (automation === 'auto' || automation === 'manual')
|
|
399
|
+
node.automation = automation;
|
|
400
|
+
const verdictTrue = stringOf(card.block.verdict_true);
|
|
401
|
+
if (verdictTrue)
|
|
402
|
+
node.verdictTrue = verdictTrue;
|
|
403
|
+
const verdictFalse = stringOf(card.block.verdict_false);
|
|
404
|
+
if (verdictFalse)
|
|
405
|
+
node.verdictFalse = verdictFalse;
|
|
406
|
+
if (typeof card.block.stale === 'boolean')
|
|
407
|
+
node.stale = card.block.stale;
|
|
408
|
+
}
|
|
409
|
+
else if (card.entityType === 'diagnosis/failure-mode') {
|
|
410
|
+
const code = stringOf(card.block.code);
|
|
411
|
+
if (code)
|
|
412
|
+
node.code = code;
|
|
413
|
+
}
|
|
414
|
+
else if (card.entityType === 'diagnosis/case') {
|
|
415
|
+
const symptom = stringOf(card.block.symptom);
|
|
416
|
+
if (!symptom)
|
|
417
|
+
problems.push(`${card.entityId} 没有 symptom —— 案例必须从一个现象进入`);
|
|
418
|
+
else {
|
|
419
|
+
edges.push({ id: `e-${card.entityId.toLowerCase()}-${symptom.toLowerCase()}`, source: card.entityId, target: symptom, kind: 'instance_of' });
|
|
420
|
+
const path = Array.isArray(card.block.path) ? card.block.path : [];
|
|
421
|
+
cases.push({
|
|
422
|
+
id: card.entityId,
|
|
423
|
+
title: card.title,
|
|
424
|
+
symptomId: symptom,
|
|
425
|
+
sections: card.sections.map(section => ({ heading: section.heading, body: section.body })),
|
|
426
|
+
path,
|
|
427
|
+
durationMinutes: numberOf(card.block.duration_minutes) ?? 0,
|
|
428
|
+
...(card.block.misleading ? { misleading: card.block.misleading } : {}),
|
|
429
|
+
rootCause: stringOf(card.block.root_cause) ?? '',
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
nodes.push(node);
|
|
434
|
+
}
|
|
435
|
+
for (const id of assetIds) {
|
|
436
|
+
if (nodes.some(node => node.id === id))
|
|
437
|
+
continue;
|
|
438
|
+
nodes.push({ id, kind: 'asset', layer: 'reference', title: id });
|
|
439
|
+
}
|
|
440
|
+
// 引用完整性:卡片引用了不存在的卡片时,必须报出来(否则图上会出现悬空边,
|
|
441
|
+
// 而 `validateDiagnosis` 只在读图之后才看得到)。
|
|
442
|
+
const ids = new Set(nodes.map(node => node.id));
|
|
443
|
+
for (const edge of edges) {
|
|
444
|
+
if (!ids.has(edge.source))
|
|
445
|
+
problems.push(`边 ${edge.id} 的起点 ${edge.source} 没有对应卡片`);
|
|
446
|
+
if (!ids.has(edge.target))
|
|
447
|
+
problems.push(`边 ${edge.id} 的终点 ${edge.target} 没有对应卡片`);
|
|
448
|
+
}
|
|
449
|
+
return { graph: { nodes, edges }, cases, problems };
|
|
450
|
+
}
|
|
451
|
+
function stringOf(value) {
|
|
452
|
+
return typeof value === 'string' && value.trim() !== '' ? value : undefined;
|
|
453
|
+
}
|
|
454
|
+
function numberOf(value) {
|
|
455
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
456
|
+
}
|
|
457
|
+
function listOf(value) {
|
|
458
|
+
return Array.isArray(value) ? value : [];
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* 路径片段规范化。**必须与 `KnowledgeRuntime` 里那份逐字相同** —— 差一个字符,
|
|
462
|
+
* 「写进去的卡片」和「编译器去读的路径」就永远对不上,而且失败方式是静默的(读不到 = 图上少几条边)。
|
|
463
|
+
*
|
|
464
|
+
* 之所以在这里重复三行而不是把它从 runtime 里 import 出来:`diagnosis/` 是领域子模块,
|
|
465
|
+
* 反向依赖宿主运行时会把分层倒过来。取而代之的是一条测试,拿同一批 id 比对两边的输出 ——
|
|
466
|
+
* 规则漂移时测试会失败,而不是靠人记得同时改两处。
|
|
467
|
+
*/
|
|
468
|
+
function slugSegment(value) {
|
|
469
|
+
const normalized = value.trim().replace(/[^\p{L}\p{N}._-]+/gu, '-').replace(/^-+|-+$/g, '');
|
|
470
|
+
return normalized.slice(0, 120) || 'item';
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* 卡片在磁盘上的相对路径:`02_wiki/<entity_type>/<slug(entity_id)>.md`。
|
|
474
|
+
*
|
|
475
|
+
* `entity_type` 里的斜杠是**目录层级**(五类排查卡片因此落在 `02_wiki/diagnosis/` 下,
|
|
476
|
+
* 与其它 wiki 子树分开),不是要压成横杠 —— 我一开始压了,结果写进去的卡片和编译器去读的
|
|
477
|
+
* 路径差一层目录,而失败是静默的:读不到,就只是图上少几条边。
|
|
478
|
+
*/
|
|
479
|
+
export function cardPathOf(card) {
|
|
480
|
+
return `02_wiki/${card.entityType}/${slugSegment(card.entityId)}.md`;
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/diagnosis/cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 问题侧的分类表(0021 §4.5)。
|
|
3
|
+
*
|
|
4
|
+
* **为什么是一张表,而不是让每个现象随手写一个字符串。** 分类的价值来自「同一批大类
|
|
5
|
+
* 被反复用」;一旦允许自由书写,两周后就会出现「上游未产出」「上游没产出」「上游未输出」
|
|
6
|
+
* 三个大类各挂一个现象 —— 那等于没分类,而且图上看不出来。所以大类只能从这张表里取。
|
|
7
|
+
*
|
|
8
|
+
* **两级就够了。** 第三层「详细问题」在图上是 symptom 节点本身(带它的资产、时间窗、
|
|
9
|
+
* 维度),不再是目录里的一层。理由见 §4.5:把实例塞进类型层,正是 §4.1 明令要分开的事。
|
|
10
|
+
*
|
|
11
|
+
* **子类同时是召回特征的来源。** §5.1 的 `shape` / `time_pattern` 由前端从告警载荷里
|
|
12
|
+
* 提取,这里把两者的对应关系**写死在数据里**:`deviation-drop-sharp` 就是「偏低 × 突降」。
|
|
13
|
+
* 这样「分类」与「召回权重」不可能各说各话 —— 它们读的是同一份表,而不是两份逐渐漂移的清单。
|
|
14
|
+
*/
|
|
15
|
+
export type ProblemClassId = 'missing' | 'deviation' | 'inconsistency' | 'granularity';
|
|
16
|
+
/** 差异形态(§5.1 召回权重里的 .30 项)。 */
|
|
17
|
+
export type SymptomShape = 'zero' | 'low' | 'high' | 'mismatch' | 'error' | 'granularity';
|
|
18
|
+
/** 时间模式(§5.1 召回权重里的 .20 项)。缺席表示这条子类不携带时间语义。 */
|
|
19
|
+
export type SymptomTimePattern = 'drop-sharp' | 'drop-slow' | 'rise-sharp' | 'rise-slow' | 'periodic' | 'single-day';
|
|
20
|
+
export interface ProblemSubclassSpec {
|
|
21
|
+
/** 全局唯一,形如 `missing-zero`。落盘的是它,不是中文标签。 */
|
|
22
|
+
id: string;
|
|
23
|
+
label: string;
|
|
24
|
+
shape: SymptomShape;
|
|
25
|
+
timePattern?: SymptomTimePattern;
|
|
26
|
+
}
|
|
27
|
+
export interface ProblemClassSpec {
|
|
28
|
+
id: ProblemClassId;
|
|
29
|
+
label: string;
|
|
30
|
+
/** 「第一眼看到什么」—— 大类是按值班同学的判断顺序切的,这句话就是那个判断。 */
|
|
31
|
+
cue: string;
|
|
32
|
+
subclasses: ProblemSubclassSpec[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 四个大类,按「看到异常之后的第一眼判断」排序:
|
|
36
|
+
* 该有的有没有 → 有的话幅度对不对 → 对不对得上 → 粒度对不对。
|
|
37
|
+
*/
|
|
38
|
+
export declare const PROBLEM_CLASSES: ProblemClassSpec[];
|
|
39
|
+
export declare const PROBLEM_CLASS_LABEL: Record<ProblemClassId, string>;
|
|
40
|
+
/** 子类表项 + 它属于哪个大类 —— 有了它,界面和校验都不用再自己反查归属。 */
|
|
41
|
+
export interface IndexedProblemSubclass extends ProblemSubclassSpec {
|
|
42
|
+
classId: ProblemClassId;
|
|
43
|
+
}
|
|
44
|
+
/** 子类 id → 表项。查一次就够,落盘的 jsonl 里只写 id。 */
|
|
45
|
+
export declare const PROBLEM_SUBCLASS_INDEX: Record<string, IndexedProblemSubclass>;
|
|
46
|
+
export declare function problemClassOf(subclassId: string | undefined): ProblemClassId | undefined;
|
|
47
|
+
export declare function problemSubclassOf(subclassId: string | undefined): IndexedProblemSubclass | undefined;
|
|
48
|
+
/** 子类是否真的属于该大类 —— 校验和界面联动都用它,不再各写一遍包含判断。 */
|
|
49
|
+
export declare function subclassBelongsTo(subclassId: string | undefined, classId: ProblemClassId): boolean;
|
|
50
|
+
export declare function problemClassIds(): ProblemClassId[];
|
|
51
|
+
//# sourceMappingURL=problem-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"problem-classes.d.ts","sourceRoot":"","sources":["../../../src/diagnosis/problem-classes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,eAAe,GAAG,aAAa,CAAA;AAEtF,+BAA+B;AAC/B,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,aAAa,CAAA;AAEzF,+CAA+C;AAC/C,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAA;AAEpH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,YAAY,CAAA;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,cAAc,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,gBAAgB,EA4C7C,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAE5B,CAAA;AAEnC,6CAA6C;AAC7C,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAAG,OAAO,EAAE,cAAc,CAAA;CAAE;AAE/F,yCAAyC;AACzC,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAGtE,CAAA;AAEJ,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAEzF;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,sBAAsB,GAAG,SAAS,CAEpG;AAED,4CAA4C;AAC5C,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAElG;AAED,wBAAgB,eAAe,IAAI,cAAc,EAAE,CAElD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 四个大类,按「看到异常之后的第一眼判断」排序:
|
|
3
|
+
* 该有的有没有 → 有的话幅度对不对 → 对不对得上 → 粒度对不对。
|
|
4
|
+
*/
|
|
5
|
+
export const PROBLEM_CLASSES = [
|
|
6
|
+
{
|
|
7
|
+
id: 'missing',
|
|
8
|
+
label: '缺失',
|
|
9
|
+
cue: '该有的没有',
|
|
10
|
+
subclasses: [
|
|
11
|
+
{ id: 'missing-zero', label: '全量为 0', shape: 'zero' },
|
|
12
|
+
{ id: 'missing-no-partition', label: '分区 / 表未产出', shape: 'zero' },
|
|
13
|
+
{ id: 'missing-job-failed', label: '任务报错未产出', shape: 'error' },
|
|
14
|
+
],
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: 'deviation',
|
|
18
|
+
label: '偏差',
|
|
19
|
+
cue: '有,但幅度不对',
|
|
20
|
+
subclasses: [
|
|
21
|
+
{ id: 'deviation-drop-sharp', label: '突降', shape: 'low', timePattern: 'drop-sharp' },
|
|
22
|
+
{ id: 'deviation-drop-slow', label: '缓降', shape: 'low', timePattern: 'drop-slow' },
|
|
23
|
+
{ id: 'deviation-rise-sharp', label: '突增', shape: 'high', timePattern: 'rise-sharp' },
|
|
24
|
+
{ id: 'deviation-rise-slow', label: '缓升', shape: 'high', timePattern: 'rise-slow' },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'inconsistency',
|
|
29
|
+
label: '不一致',
|
|
30
|
+
cue: '有,但对不上',
|
|
31
|
+
subclasses: [
|
|
32
|
+
{ id: 'inconsistency-vs-source', label: '与源系统对不上', shape: 'mismatch' },
|
|
33
|
+
{ id: 'inconsistency-cross-report', label: '跨报表勾稽不平', shape: 'mismatch' },
|
|
34
|
+
{ id: 'inconsistency-spec-change', label: '口径变更后不一致', shape: 'mismatch', timePattern: 'periodic' },
|
|
35
|
+
{ id: 'inconsistency-tz-boundary', label: '跨天 / 时区边界', shape: 'mismatch', timePattern: 'single-day' },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'granularity',
|
|
40
|
+
label: '粒度',
|
|
41
|
+
cue: '有,但切分不对',
|
|
42
|
+
subclasses: [
|
|
43
|
+
{ id: 'granularity-dim-missing', label: '维度值缺失', shape: 'granularity' },
|
|
44
|
+
{ id: 'granularity-dim-empty', label: '部分维度为空', shape: 'granularity' },
|
|
45
|
+
{ id: 'granularity-dup-count', label: '重复计数', shape: 'granularity', timePattern: 'rise-sharp' },
|
|
46
|
+
{ id: 'granularity-mapping-shift', label: '映射错位', shape: 'granularity' },
|
|
47
|
+
],
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
export const PROBLEM_CLASS_LABEL = Object.fromEntries(PROBLEM_CLASSES.map(item => [item.id, item.label]));
|
|
51
|
+
/** 子类 id → 表项。查一次就够,落盘的 jsonl 里只写 id。 */
|
|
52
|
+
export const PROBLEM_SUBCLASS_INDEX = Object.fromEntries(PROBLEM_CLASSES.flatMap(item => item.subclasses.map(subclass => [subclass.id, { ...subclass, classId: item.id }])));
|
|
53
|
+
export function problemClassOf(subclassId) {
|
|
54
|
+
return subclassId === undefined ? undefined : PROBLEM_SUBCLASS_INDEX[subclassId]?.classId;
|
|
55
|
+
}
|
|
56
|
+
export function problemSubclassOf(subclassId) {
|
|
57
|
+
return subclassId === undefined ? undefined : PROBLEM_SUBCLASS_INDEX[subclassId];
|
|
58
|
+
}
|
|
59
|
+
/** 子类是否真的属于该大类 —— 校验和界面联动都用它,不再各写一遍包含判断。 */
|
|
60
|
+
export function subclassBelongsTo(subclassId, classId) {
|
|
61
|
+
return problemClassOf(subclassId) === classId;
|
|
62
|
+
}
|
|
63
|
+
export function problemClassIds() {
|
|
64
|
+
return PROBLEM_CLASSES.map(item => item.id);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=problem-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"problem-classes.js","sourceRoot":"","sources":["../../../src/diagnosis/problem-classes.ts"],"names":[],"mappings":"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"}
|