clearai-dsh 0.1.0

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 (154) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +201 -0
  3. package/README.md +138 -0
  4. package/README.zh-CN.md +138 -0
  5. package/bin/clearai.mjs +224 -0
  6. package/brand/README.md +41 -0
  7. package/brand/logo-512-dark.png +0 -0
  8. package/brand/logo-512.png +0 -0
  9. package/brand/logo-lockup-dark.png +0 -0
  10. package/brand/logo-lockup.png +0 -0
  11. package/brand/logo-lockup.svg +12 -0
  12. package/brand/logo-wordmark.svg +6 -0
  13. package/brand/logo.svg +19 -0
  14. package/cordis.patch.yml +39 -0
  15. package/lib/client.js +3071 -0
  16. package/lib/fold.js +1576 -0
  17. package/lib/host.js +605 -0
  18. package/package.json +65 -0
  19. package/presets/clearai/agent.cordis.yml +226 -0
  20. package/presets/clearai/plugins/brain.js +547 -0
  21. package/presets/clearai/plugins/clearai-kernel.js +5485 -0
  22. package/presets/clearai/plugins/ontology.js +306 -0
  23. package/presets/clearai/plugins/prompts.js +312 -0
  24. package/presets/clearai/preset.yml +5 -0
  25. package/presets/clearai/skills/clearai-loop/SKILL.md +89 -0
  26. package/presets/clearai/template/knowledge/README.md +25 -0
  27. package/presets/clearai/template/memory/README.md +34 -0
  28. package/presets/clearai/template/project.md +49 -0
  29. package/presets/clearai/template/skills/README.md +37 -0
  30. package/presets/clearai/template/skills/chart-diagram-qa/SKILL.md +43 -0
  31. package/presets/clearai/template/skills/citation-management/SKILL.md +73 -0
  32. package/presets/clearai/template/skills/citation-management/references/bibtex_formatting.md +908 -0
  33. package/presets/clearai/template/skills/citation-management/references/citation_validation.md +794 -0
  34. package/presets/clearai/template/skills/citation-management/references/google_scholar_search.md +725 -0
  35. package/presets/clearai/template/skills/citation-management/references/metadata_extraction.md +870 -0
  36. package/presets/clearai/template/skills/citation-management/references/pubmed_search.md +839 -0
  37. package/presets/clearai/template/skills/citation-management/scripts/doi_to_bibtex.py +204 -0
  38. package/presets/clearai/template/skills/citation-management/scripts/extract_metadata.py +569 -0
  39. package/presets/clearai/template/skills/citation-management/scripts/format_bibtex.py +349 -0
  40. package/presets/clearai/template/skills/citation-management/scripts/generate_schematic.py +139 -0
  41. package/presets/clearai/template/skills/citation-management/scripts/generate_schematic_ai.py +817 -0
  42. package/presets/clearai/template/skills/citation-management/scripts/search_google_scholar.py +282 -0
  43. package/presets/clearai/template/skills/citation-management/scripts/search_pubmed.py +398 -0
  44. package/presets/clearai/template/skills/citation-management/scripts/validate_citations.py +497 -0
  45. package/presets/clearai/template/skills/data-analysis/SKILL.md +92 -0
  46. package/presets/clearai/template/skills/data-analysis/checklists/readiness_check.md +23 -0
  47. package/presets/clearai/template/skills/data-analysis/templates/analysis_report.md.tpl +63 -0
  48. package/presets/clearai/template/skills/data-analysis/templates/cleaning_rules_draft.yaml.tpl +32 -0
  49. package/presets/clearai/template/skills/data-analysis/templates/data_dictionary.md.tpl +12 -0
  50. package/presets/clearai/template/skills/data-analysis/templates/domain_knowledge_template.md.tpl +316 -0
  51. package/presets/clearai/template/skills/data-analysis/templates/feature_candidates.json.tpl +20 -0
  52. package/presets/clearai/template/skills/data-analysis/templates/quality_scorecard.md.tpl +30 -0
  53. package/presets/clearai/template/skills/data-analysis/workflows/01-data-profiling.md +42 -0
  54. package/presets/clearai/template/skills/data-analysis/workflows/02-quality-audit.md +36 -0
  55. package/presets/clearai/template/skills/data-analysis/workflows/03-physical-correlation.md +25 -0
  56. package/presets/clearai/template/skills/data-analysis/workflows/04-unstructured-mining.md +26 -0
  57. package/presets/clearai/template/skills/data-qa-analysis/SKILL.md +102 -0
  58. package/presets/clearai/template/skills/data-qa-analysis/checklists/readiness_check.md +62 -0
  59. package/presets/clearai/template/skills/data-qa-analysis/templates/best_in_class_report.md.tpl +56 -0
  60. package/presets/clearai/template/skills/data-qa-analysis/templates/cleaning_rules_draft.yaml.tpl +56 -0
  61. package/presets/clearai/template/skills/data-qa-analysis/templates/data_dictionary.md.tpl +13 -0
  62. package/presets/clearai/template/skills/data-qa-analysis/templates/data_source_inventory_and_lineage.md.tpl +146 -0
  63. package/presets/clearai/template/skills/data-qa-analysis/templates/data_status_report.md.tpl +60 -0
  64. package/presets/clearai/template/skills/data-qa-analysis/templates/steady_state_rules.yaml.tpl +41 -0
  65. package/presets/clearai/template/skills/data-qa-analysis/templates/subsystem_registry.md.tpl +101 -0
  66. package/presets/clearai/template/skills/data-qa-analysis/templates/unified_execution_plan.md.tpl +100 -0
  67. package/presets/clearai/template/skills/data-qa-analysis/workflows/01-data-source-inventory-and-lineage.md +194 -0
  68. package/presets/clearai/template/skills/data-qa-analysis/workflows/02-data-alignment-and-tag-semantics.md +122 -0
  69. package/presets/clearai/template/skills/data-qa-analysis/workflows/03-steady-state-identification.md +126 -0
  70. package/presets/clearai/template/skills/data-qa-analysis/workflows/04-consumption-analysis.md +152 -0
  71. package/presets/clearai/template/skills/data-qa-analysis/workflows/05-best-in-class-and-optimization-space.md +78 -0
  72. package/presets/clearai/template/skills/domain-presearch/SKILL.md +131 -0
  73. package/presets/clearai/template/skills/domain-presearch/checklists/domain_checklist.md +24 -0
  74. package/presets/clearai/template/skills/domain-presearch/references/figure_code.md +78 -0
  75. package/presets/clearai/template/skills/domain-presearch/references/strategic_frameworks.md +38 -0
  76. package/presets/clearai/template/skills/exploration-loop/SKILL.md +81 -0
  77. package/presets/clearai/template/skills/exploratory-data-analysis/SKILL.md +77 -0
  78. package/presets/clearai/template/skills/exploratory-data-analysis/references/bioinformatics_genomics_formats.md +664 -0
  79. package/presets/clearai/template/skills/exploratory-data-analysis/references/chemistry_molecular_formats.md +664 -0
  80. package/presets/clearai/template/skills/exploratory-data-analysis/references/general_scientific_formats.md +518 -0
  81. package/presets/clearai/template/skills/exploratory-data-analysis/references/microscopy_imaging_formats.md +620 -0
  82. package/presets/clearai/template/skills/exploratory-data-analysis/references/proteomics_metabolomics_formats.md +517 -0
  83. package/presets/clearai/template/skills/exploratory-data-analysis/references/spectroscopy_analytical_formats.md +633 -0
  84. package/presets/clearai/template/skills/exploratory-data-analysis/scripts/eda_analyzer.py +547 -0
  85. package/presets/clearai/template/skills/hypothesis-generation/SKILL.md +73 -0
  86. package/presets/clearai/template/skills/hypothesis-generation/references/experimental_design_patterns.md +329 -0
  87. package/presets/clearai/template/skills/hypothesis-generation/references/hypothesis_quality_criteria.md +198 -0
  88. package/presets/clearai/template/skills/hypothesis-generation/references/literature_search_strategies.md +622 -0
  89. package/presets/clearai/template/skills/hypothesis-generation/scripts/generate_schematic.py +139 -0
  90. package/presets/clearai/template/skills/hypothesis-generation/scripts/generate_schematic_ai.py +817 -0
  91. package/presets/clearai/template/skills/literature-review/SKILL.md +72 -0
  92. package/presets/clearai/template/skills/literature-review/references/citation_styles.md +166 -0
  93. package/presets/clearai/template/skills/literature-review/references/database_strategies.md +455 -0
  94. package/presets/clearai/template/skills/literature-review/scripts/generate_pdf.py +176 -0
  95. package/presets/clearai/template/skills/literature-review/scripts/generate_schematic.py +139 -0
  96. package/presets/clearai/template/skills/literature-review/scripts/generate_schematic_ai.py +817 -0
  97. package/presets/clearai/template/skills/literature-review/scripts/search_databases.py +303 -0
  98. package/presets/clearai/template/skills/literature-review/scripts/verify_citations.py +221 -0
  99. package/presets/clearai/template/skills/paper-lookup/SKILL.md +59 -0
  100. package/presets/clearai/template/skills/paper-lookup/references/arxiv.md +161 -0
  101. package/presets/clearai/template/skills/paper-lookup/references/biorxiv.md +118 -0
  102. package/presets/clearai/template/skills/paper-lookup/references/core.md +150 -0
  103. package/presets/clearai/template/skills/paper-lookup/references/crossref.md +181 -0
  104. package/presets/clearai/template/skills/paper-lookup/references/medrxiv.md +104 -0
  105. package/presets/clearai/template/skills/paper-lookup/references/openalex.md +174 -0
  106. package/presets/clearai/template/skills/paper-lookup/references/pmc.md +152 -0
  107. package/presets/clearai/template/skills/paper-lookup/references/pubmed.md +124 -0
  108. package/presets/clearai/template/skills/paper-lookup/references/semantic-scholar.md +203 -0
  109. package/presets/clearai/template/skills/paper-lookup/references/unpaywall.md +127 -0
  110. package/presets/clearai/template/skills/process-presearch/SKILL.md +196 -0
  111. package/presets/clearai/template/skills/process-presearch/checklists/process_checklist.md +18 -0
  112. package/presets/clearai/template/skills/process-presearch/references/figure_code.md +107 -0
  113. package/presets/clearai/template/skills/process-presearch/references/source_attribution_example.md +22 -0
  114. package/presets/clearai/template/skills/process-understanding-extraction/SKILL.md +69 -0
  115. package/presets/clearai/template/skills/process-understanding-extraction/checklists/readiness_check.md +34 -0
  116. package/presets/clearai/template/skills/process-understanding-extraction/templates/docx_raw_dump_extractor.py.tpl +132 -0
  117. package/presets/clearai/template/skills/process-understanding-extraction/templates/entity_map_unit_topology.json.tpl +86 -0
  118. package/presets/clearai/template/skills/process-understanding-extraction/templates/process_brief.md.tpl +89 -0
  119. package/presets/clearai/template/skills/process-understanding-extraction/templates/process_brief_builder_from_raw_dump.py.tpl +203 -0
  120. package/presets/clearai/template/skills/process-understanding-extraction/templates/process_flow_mermaid.md.tpl +41 -0
  121. package/presets/clearai/template/skills/process-understanding-extraction/templates/unified_execution_plan.md.tpl +53 -0
  122. package/presets/clearai/template/skills/process-understanding-extraction/workflows/01-process-doc-discovery.md +173 -0
  123. package/presets/clearai/template/skills/process-understanding-extraction/workflows/02-process-understanding-and-diagramming.md +106 -0
  124. package/presets/clearai/template/skills/scientific-brainstorming/SKILL.md +64 -0
  125. package/presets/clearai/template/skills/scientific-brainstorming/references/brainstorming_methods.md +326 -0
  126. package/presets/clearai/template/skills/scientific-critical-thinking/SKILL.md +72 -0
  127. package/presets/clearai/template/skills/scientific-critical-thinking/references/common_biases.md +364 -0
  128. package/presets/clearai/template/skills/scientific-critical-thinking/references/evidence_hierarchy.md +485 -0
  129. package/presets/clearai/template/skills/scientific-critical-thinking/references/experimental_design.md +496 -0
  130. package/presets/clearai/template/skills/scientific-critical-thinking/references/logical_fallacies.md +478 -0
  131. package/presets/clearai/template/skills/scientific-critical-thinking/references/scientific_method.md +169 -0
  132. package/presets/clearai/template/skills/scientific-critical-thinking/references/statistical_pitfalls.md +506 -0
  133. package/presets/clearai/template/skills/skill-creator/SKILL.md +109 -0
  134. package/presets/clearai/template/skills/skill-creator/references/authoring-guide.md +89 -0
  135. package/presets/clearai/template/skills/statistical-analysis/SKILL.md +79 -0
  136. package/presets/clearai/template/skills/statistical-analysis/references/assumptions_and_diagnostics.md +369 -0
  137. package/presets/clearai/template/skills/statistical-analysis/references/bayesian_statistics.md +653 -0
  138. package/presets/clearai/template/skills/statistical-analysis/references/effect_sizes_and_power.md +578 -0
  139. package/presets/clearai/template/skills/statistical-analysis/references/reporting_standards.md +469 -0
  140. package/presets/clearai/template/skills/statistical-analysis/references/test_selection_guide.md +129 -0
  141. package/presets/clearai/template/skills/statistical-analysis/scripts/assumption_checks.py +538 -0
  142. package/presets/clearai/template/skills/web-artifact/SKILL.md +165 -0
  143. package/presets/clearai/template/skills/web-artifact/assets/renderer/renderer.css +229 -0
  144. package/presets/clearai/template/skills/web-artifact/assets/renderer/renderer.js +373 -0
  145. package/presets/clearai/template/skills/web-artifact/assets/vendor/elkjs/LICENSE +263 -0
  146. package/presets/clearai/template/skills/web-artifact/assets/vendor/elkjs/UPSTREAM.md +26 -0
  147. package/presets/clearai/template/skills/web-artifact/assets/vendor/elkjs/elk.bundled.js +6605 -0
  148. package/presets/clearai/template/skills/web-artifact/references/when-drawing-a-topology.md +150 -0
  149. package/presets/clearai/template/skills/web-artifact/references/when-the-page-must-work-offline.md +62 -0
  150. package/presets/clearai/template/skills/web-artifact/scripts/check_artifact.py +167 -0
  151. package/presets/clearai/template/skills/web-artifact/scripts/render_topology.js +272 -0
  152. package/presets/clearai/template/skills/what-if-oracle/LICENSE.txt +5 -0
  153. package/presets/clearai/template/skills/what-if-oracle/SKILL.md +72 -0
  154. package/presets/clearai/template/skills/what-if-oracle/references/scenario-templates.md +154 -0
@@ -0,0 +1,306 @@
1
+ /**
2
+ * 本体声明(§22):把「有哪些对象、哪些状态、谁能发起哪条转移、每一级谁来判」
3
+ * 从散文变成**装配期可校验的数据**。
4
+ *
5
+ * 为什么它得进插件:本体以**声明数据**的形式进入插件平面,插件里那堆散在
6
+ * `fold.js` 与内核里的状态语义第一次有了**一处可校验的出处**:
7
+ * · 装机时(`apply`)就校验形状:初始态在状态表里、终态零出边、非终态至少一条出边、
8
+ * 边不重复、等级的前缀单调性;
9
+ * · 每个对象声明的 `event_kind` 必须是**折法真认识的变更类型**(见 `test/ontology.test.mjs`
10
+ * 的交叉校验)——于是「声明了却没接线」不可能悄悄存在;
11
+ * · 守卫写**具名标识**,名字必须在核心里真的存在(交叉校验同上)——「挂了一条不存在的法」
12
+ * 同样是装配期的错,不是运行期的惊喜。
13
+ *
14
+ * ## 声明必须描述**派生的真实语义**,不是理想化
15
+ *
16
+ * 1. **对象是八个**:目标 / 计划 / 步骤是折法里的一等对象(goal / plan / step),
17
+ * 与假设、观测、评估、证据、事实并列声明。
18
+ * 2. **`step` 承载验证**:一个步骤最多承载一次验证(`step.tests`),
19
+ * 这是「一步一验」的落地形态。
20
+ * 3. **降级不可表示**:折法的秩
21
+ * (`open/blocked=0 < advanced/void=1`)明令**降级不可表示**,所以不存在「驳回重做」的边——
22
+ * 与其补一条边,不如不给这条路。
23
+ * 4. **`hypothesis.refuted` 是黏性终态**:折法确保「被推翻」不会被下一版假设清单
24
+ * 改写成「已被替代」(先黏住)。
25
+ */
26
+
27
+ /** 一个字段的声明。`values` 给了就是枚举。 */
28
+ export function field(name, options = {}) {
29
+ return { name, note: options.note ?? '', required: options.required !== false, values: options.values ?? null }
30
+ }
31
+
32
+ /**
33
+ * 一条合法转移。
34
+ * `actor` 是能发起它的身份(`system` = 内核按事实推进 / `model` = 模型的工具动作 /
35
+ * `human` = 只有人的结构化动作,如原生审批栈的放行);`guards` 是守卫的**具名标识**。
36
+ */
37
+ export function transition(from, to, actor, on, guards = [], note = '', event = '') {
38
+ return { from, to, actor, on, guards, note, event }
39
+ }
40
+
41
+ /** 一种本体对象的声明。**没有 current_state** —— 状态由事实算出来,没有住处。 */
42
+ export function object(name, declaration) {
43
+ return {
44
+ name,
45
+ states: declaration.states,
46
+ initial: declaration.initial,
47
+ terminal: declaration.terminal ?? [],
48
+ transitions: declaration.transitions ?? [],
49
+ fields: declaration.fields ?? [],
50
+ /** 落点:它存在哪(指向既有落点,**不新建存储**)。 */
51
+ persistence: declaration.persistence ?? '',
52
+ /**
53
+ * 这个对象**诞生**时落的那条变更(`fold.js` 词汇表里的那一个)。
54
+ * 转移各自的 `event` 在边上——这一平面一条边一种变更类型,与 Python 那一侧
55
+ * 「一个对象一个 event_kind」不同(见文件头)。
56
+ */
57
+ event_kind: declaration.event_kind ?? '',
58
+ note: declaration.note ?? '',
59
+ }
60
+ }
61
+
62
+ /** 一级验证的语义:谁来判、认什么来源、开始前要求什么。 */
63
+ export function level(id, declaration) {
64
+ return {
65
+ id,
66
+ judge: declaration.judge,
67
+ sources: declaration.sources,
68
+ gate: declaration.gate ?? 'none',
69
+ note: declaration.note ?? '',
70
+ }
71
+ }
72
+
73
+ /** 一份本体:对象 + 等级。一个进程一份(见 `validateOntology` 的调用方)。 */
74
+ export function ontology(id, declaration) {
75
+ return { id, objects: declaration.objects, levels: declaration.levels ?? [], note: declaration.note ?? '' }
76
+ }
77
+
78
+ /**
79
+ * 装配期不变式。**只检查声明自身的形状**——它与折法/内核的交叉校验在测试里
80
+ * (那一侧要同时 import 折法与内核,不能放进预设的装配期)。
81
+ *
82
+ * 返回问题清单(空 = 通过);抛错留给调用方决定(这里只回答「有没有问题」)。
83
+ */
84
+ export function validateOntology(spec) {
85
+ const problems = []
86
+ if (spec === null || typeof spec !== 'object') return ['ontology: 不是一份声明']
87
+ if (typeof spec.id !== 'string' || spec.id.trim() === '') problems.push('ontology: 缺 id')
88
+ if (!Array.isArray(spec.objects) || spec.objects.length === 0) problems.push('ontology: 一个对象都没有')
89
+ const seen = new Set()
90
+ for (const obj of spec.objects ?? []) {
91
+ const at = `object ${obj?.name ?? '(无名)'}`
92
+ if (typeof obj?.name !== 'string' || obj.name.trim() === '') problems.push(`${at}: 缺 name`)
93
+ if (seen.has(obj?.name)) problems.push(`${at}: 对象重名`)
94
+ seen.add(obj?.name)
95
+ const states = Array.isArray(obj?.states) ? obj.states : []
96
+ if (states.length === 0) problems.push(`${at}: 一个状态都没有`)
97
+ if (new Set(states).size !== states.length) problems.push(`${at}: 状态重名`)
98
+ if (!states.includes(obj?.initial)) problems.push(`${at}: 初始态 ${String(obj?.initial)} 不在状态表里`)
99
+ for (const terminal of obj?.terminal ?? []) {
100
+ if (!states.includes(terminal)) problems.push(`${at}: 终态 ${terminal} 不在状态表里`)
101
+ }
102
+ const edges = new Map()
103
+ for (const edge of obj?.transitions ?? []) {
104
+ const key = `${edge?.from}→${edge?.to}`
105
+ if (!states.includes(edge?.from)) problems.push(`${at}: 边 ${key} 的起点不在状态表里`)
106
+ if (!states.includes(edge?.to)) problems.push(`${at}: 边 ${key} 的终点不在状态表里`)
107
+ if (edges.has(key)) problems.push(`${at}: 边 ${key} 重复`)
108
+ edges.set(key, edge)
109
+ if (!['system', 'model', 'human'].includes(edge?.actor)) problems.push(`${at}: 边 ${key} 的身份 ${String(edge?.actor)} 不认识`)
110
+ if (typeof edge?.on !== 'string' || edge.on.trim() === '') problems.push(`${at}: 边 ${key} 缺 on(这件事的名字)`)
111
+ }
112
+ // 终态零出边;非终态至少一条出边(否则那条路是死的)。
113
+ for (const state of states) {
114
+ const out = (obj.transitions ?? []).filter((edge) => edge.from === state).length
115
+ const isTerminal = (obj.terminal ?? []).includes(state)
116
+ if (isTerminal && out > 0) problems.push(`${at}: 终态 ${state} 还有出边(${out} 条)`)
117
+ if (!isTerminal && out === 0) problems.push(`${at}: 非终态 ${state} 没有出边(那是一条死路)`)
118
+ }
119
+ // 每个状态都必须从初始态走得到(否则声明了一条没人走的路)。
120
+ const reachable = new Set([obj?.initial])
121
+ for (let round = 0; round < states.length; round += 1) {
122
+ for (const edge of obj?.transitions ?? []) {
123
+ if (reachable.has(edge.from)) reachable.add(edge.to)
124
+ }
125
+ }
126
+ for (const state of states) {
127
+ if (!reachable.has(state)) problems.push(`${at}: 状态 ${state} 从初始态走不到`)
128
+ }
129
+ if (typeof obj?.event_kind !== 'string' || obj.event_kind.trim() === '') problems.push(`${at}: 缺 event_kind(它每一次转移要发的那条变更)`)
130
+ }
131
+ // 等级:前缀单调——判的人只会越来越外部,来源只会越来越宽,门只会越来越严。
132
+ const JUDGE_RANK = { self: 0, independent: 1 }
133
+ const GATE_RANK = { none: 0, registered_criteria: 1, human_release: 2 }
134
+ const levels = Array.isArray(spec.levels) ? spec.levels : []
135
+ levels.forEach((item, index) => {
136
+ if (item?.id !== `L${index}`) problems.push(`levels: 第 ${index} 项的 id 是 ${String(item?.id)},应为 L${index}`)
137
+ if (!(item?.judge in JUDGE_RANK)) problems.push(`levels: ${String(item?.id)} 的 judge ${String(item?.judge)} 不认识`)
138
+ if (!Array.isArray(item?.sources) || item.sources.length === 0) problems.push(`levels: ${String(item?.id)} 没有声明来源`)
139
+ if (!(item?.gate in GATE_RANK)) problems.push(`levels: ${String(item?.id)} 的 gate ${String(item?.gate)} 不认识`)
140
+ if (index === 0) return
141
+ const previous = levels[index - 1]
142
+ if (JUDGE_RANK[item?.judge] < JUDGE_RANK[previous?.judge]) problems.push(`levels: ${item.id} 的判者比 ${previous.id} 更内部(前缀必须单调)`)
143
+ if (GATE_RANK[item?.gate] < GATE_RANK[previous?.gate]) problems.push(`levels: ${item.id} 的门比 ${previous.id} 更松(前缀必须单调)`)
144
+ })
145
+ return problems
146
+ }
147
+
148
+ /** 一份给人/给模型读的说明(markdown)。货架写的就是它。 */
149
+ export function describeOntology(spec) {
150
+ const lines = [`# 本体:${spec.id}`, '', spec.note, '', '## 对象']
151
+ for (const obj of spec.objects) {
152
+ lines.push('', `### ${obj.name}`, `- 状态:${obj.states.join(' → ')}`, `- 初始:${obj.initial} · 终态:${obj.terminal.length === 0 ? '(无)' : obj.terminal.join('、')}`)
153
+ if (obj.persistence !== '') lines.push(`- 落点:${obj.persistence}(不新建存储)`)
154
+ if (obj.event_kind !== '') lines.push(`- 每次转移发:${obj.event_kind}`)
155
+ for (const edge of obj.transitions) {
156
+ lines.push(` - ${edge.from} → ${edge.to}:由 **${edge.actor}** 发起,当 ${edge.on}${edge.guards.length === 0 ? '' : `(守卫:${edge.guards.join('、')})`}`)
157
+ }
158
+ if (obj.fields.length > 0) lines.push(`- 字段:${obj.fields.map((item) => `${item.name}${item.values === null ? '' : `(${item.values.join('|')})`}`).join('、')}`)
159
+ if (obj.note !== '') lines.push(`- 说明:${obj.note}`)
160
+ }
161
+ if (spec.levels.length > 0) {
162
+ lines.push('', '## 五级')
163
+ for (const item of spec.levels) {
164
+ lines.push(`- **${item.id}** 判者 ${item.judge} · 来源 ${item.sources.join('、')} · 门 ${item.gate} —— ${item.note}`)
165
+ }
166
+ }
167
+ return `${lines.join('\n')}\n`
168
+ }
169
+
170
+ /**
171
+ * **这一平面的本体**(逐条转录自 `fold.js` 的词汇表与内核的门,不是抄 Python 那份文本;
172
+ * 四处差异见文件头)。
173
+ */
174
+ export const VERIFICATION_LOOP = ontology('verification-loop', {
175
+ note: '八个对象 + 五级验证。声明是数据;实例状态由事实算出来(见文件头那条红线)。',
176
+ levels: [
177
+ level('L0', { judge: 'self', sources: ['self'], note: '只靠推理的快速合理性检查;依据必须可复查' }),
178
+ level('L1', { judge: 'self', sources: ['self'], note: '已有知识:文献、数据库是否已回答或已否定' }),
179
+ level('L2', { judge: 'self', sources: ['self'], note: '已有数据或小规模计算' }),
180
+ level('L3', { judge: 'independent', sources: ['self'], gate: 'registered_criteria', note: '新产生且可重跑的证据;判据先写后做,裁决由独立评估者写' }),
181
+ level('L4', { judge: 'independent', sources: ['human_upload', 'file_drop', 'callback', 'pull'], gate: 'human_release', note: '不可重复或来自外部的证据;先登记标准,人放行(原生审批栈的权威记录)' }),
182
+ ],
183
+ objects: [
184
+ object('goal', {
185
+ states: ['open', 'achieved', 'abandoned', 'superseded'],
186
+ initial: 'open',
187
+ terminal: ['achieved', 'abandoned', 'superseded'],
188
+ transitions: [
189
+ transition('open', 'achieved', 'system', 'goal_verified', ['independent_verdict_support'], '独立评估者裁 support 才结案', 'goal/closed'),
190
+ transition('open', 'abandoned', 'model', 'goal_abandoned', ['independent_verdict_written'], '如实放弃要写清阻塞;记录保留', 'goal/closed'),
191
+ transition('open', 'superseded', 'model', 'new_goal_set', [], '同一条线只开一个目标;开新的把旧的置为被替代', 'goal/set'),
192
+ ],
193
+ fields: [field('claim'), field('done_criteria'), field('promote_at_level', { values: ['L0', 'L1', 'L2', 'L3', 'L4'] }), field('revision')],
194
+ persistence: 'fold.goal + clear/goals/',
195
+ event_kind: 'goal/set',
196
+ note: '这一平面的一等对象(那一侧记在 goal 文档里);status 是派生值,声明里没有它的住处',
197
+ }),
198
+ object('hypothesis', {
199
+ states: ['proposed', 'alive', 'confirmed', 'refuted', 'superseded'],
200
+ initial: 'proposed',
201
+ terminal: ['refuted', 'superseded'],
202
+ transitions: [
203
+ transition('proposed', 'alive', 'system', 'evidence_appended', [], '第一条证据到达', 'evidence/recorded'),
204
+ transition('proposed', 'confirmed', 'system', 'promotion_threshold', [], '捷径:单条达门槛的支持证据可直接确认(与那一侧同一条边)', 'fact/promoted'),
205
+ transition('alive', 'confirmed', 'system', 'promotion_threshold', [], '最高支持等级达到 promote_at_level ⇒ 升格为事实', 'fact/promoted'),
206
+ transition('confirmed', 'refuted', 'system', 'refuting_evidence', [], '已确认的假设后来被新证据推翻——状态由证据算,不因「已确认」而豁免', 'evidence/recorded'),
207
+ transition('alive', 'refuted', 'system', 'refuting_evidence', [], '有推翻裁决;被推翻的假设保留', 'evidence/recorded'),
208
+ transition('proposed', 'refuted', 'system', 'refuting_evidence', [], '第一条证据就是推翻(L3 以上由独立评估者写)', 'evidence/recorded'),
209
+ transition('proposed', 'superseded', 'model', 'hypothesis_revised', [], '还没证据就被下一版清单换掉', 'hypothesis/superseded'),
210
+ transition('alive', 'superseded', 'model', 'hypothesis_revised', [], '同上,已经活着的也算', 'hypothesis/superseded'),
211
+ ],
212
+ fields: [field('claim'), field('refute_when')],
213
+ persistence: 'fold.hypotheses(goal/set 一起落)',
214
+ event_kind: 'hypothesis/superseded',
215
+ note: '状态由证据算:**confirmed 那条边的落账在 fact 对象那边**(升格成事实 ⇒ 面板把它读成已确认),假设自己没有这条变更;refuted 是黏性终态(§22 与那一侧 P3 同一个病同一个修法);不声明 status',
216
+ }),
217
+ object('plan', {
218
+ states: ['active', 'closed'],
219
+ initial: 'active',
220
+ terminal: ['closed'],
221
+ transitions: [
222
+ transition('active', 'closed', 'model', 'plan_closed', [], '一份计划只承载一个阶段,收尾由模型发起', 'plan/closed'),
223
+ // 「受阻」是**字段**不是状态:一条自环把它记在计划上(折法里 `plan.blocked` 就是这个落点)。
224
+ transition('active', 'active', 'system', 'gate_failed_repeatedly', ['block_threshold'], '某一步连拦达阈值 ⇒ 计划置受阻等人(状态不变,事实加一条)', 'plan/blocked'),
225
+ ],
226
+ fields: [field('brief'), field('steps'), field('confirmed_at', { required: false }), field('confirmed_by', { required: false, values: ['user', 'autonomy', 'progress'] }), field('blocked', { required: false })],
227
+ persistence: 'fold.plans + clear/goals/plans/',
228
+ event_kind: 'plan/created',
229
+ note: '「受阻」是字段不是状态(它会被清掉);授权记号也是字段——有记号或已推进过都算授权',
230
+ }),
231
+ object('step', {
232
+ states: ['open', 'advanced', 'void'],
233
+ initial: 'open',
234
+ terminal: ['advanced', 'void'],
235
+ transitions: [
236
+ transition('open', 'advanced', 'system', 'step_delivered', ['admission_passed', 'level_judge_split', 'external_source_for_l4', 'human_release_for_l4'], '唯一完成动词的落点:证据、裁决、门都过了才升', 'step/advanced'),
237
+ transition('open', 'void', 'model', 'step_voided', [], '计划改了,这一步作废(留缘由)', 'plan/voided'),
238
+ ],
239
+ fields: [field('do'), field('done_criteria'), field('artifacts'), field('tests', { required: false })],
240
+ persistence: 'fold.plans[].steps',
241
+ event_kind: 'step/advanced',
242
+ note: '这一平面上它同时就是「一次验证」(step.tests = hypothesis + level);没有「降级重做」那条边:秩明令降级不可表示;「受阻」不在步的状态里——它是计划上的字段(见 plan 的自环)',
243
+ }),
244
+ object('observation', {
245
+ states: ['received', 'accepted', 'rejected'],
246
+ initial: 'received',
247
+ terminal: ['accepted', 'rejected'],
248
+ transitions: [
249
+ transition('received', 'accepted', 'system', 'source_admissible', ['admission_passed'], '准入只回答「收不收」,不回答「说明了什么」;收下的落一条观测', 'observation/recorded'),
250
+ transition('received', 'rejected', 'system', 'source_not_admissible', [], '不收:只在准入账(`admission/checked`)上留痕,不落观测对象', 'admission/checked'),
251
+ ],
252
+ fields: [field('content'), field('source', { values: ['self', 'human_upload', 'file_drop', 'callback', 'pull'] }), field('ref')],
253
+ persistence: 'fold.materials(收下的)+ 准入账(不收的)',
254
+ event_kind: 'observation/recorded',
255
+ note: '`received` 活在一次交付调用之内(候选观测):收下的才成为对象,不收的只留一条准入事实——「不收」不是对象的终态,是账本上的一行',
256
+ }),
257
+ object('evaluation', {
258
+ states: ['recorded'],
259
+ initial: 'recorded',
260
+ terminal: ['recorded'],
261
+ transitions: [],
262
+ fields: [field('evaluator', { values: ['self', 'independent', 'machine'] }), field('verdict', { values: ['support', 'refute', 'inconclusive'] }), field('basis'), field('shortfalls', { required: false })],
263
+ persistence: 'fold.audits + clear/evidence/audits/',
264
+ event_kind: 'audit/settled',
265
+ note: '写下就不改;重评产生新的一条。做的人与判的人按等级分开(L3 以上只能由独立评估者写)',
266
+ }),
267
+ object('evidence', {
268
+ states: ['recorded'],
269
+ initial: 'recorded',
270
+ terminal: ['recorded'],
271
+ transitions: [],
272
+ fields: [field('verdict', { values: ['support', 'refute', 'inconclusive'] }), field('level', { values: ['L0', 'L1', 'L2', 'L3', 'L4'] }), field('refs'), field('anchor', { values: ['auditor', 'artifact'] })],
273
+ persistence: 'fold.evidence',
274
+ event_kind: 'evidence/recorded',
275
+ note: '与步骤上的收敛记录分开;anchor 说这条证据钉在哪(独立裁决 / 物证)',
276
+ }),
277
+ object('fact', {
278
+ states: ['promoted'],
279
+ initial: 'promoted',
280
+ terminal: ['promoted'],
281
+ transitions: [],
282
+ fields: [
283
+ field('text', { note: '一句话陈述' }),
284
+ /** 边界:没有边界的事实没人敢用——下一轮引用它之前先看这条。 */
285
+ field('scope', { note: '边界(推翻条件):什么情况下它作废' }),
286
+ field('level', { note: '被支持到哪一级(判者可查)' }),
287
+ field('evidence'),
288
+ field('path'),
289
+ field('last_verified', { required: false, note: '升格时间(派生,不另存)' }),
290
+ ],
291
+ persistence: 'clear/knowledge/facts/',
292
+ event_kind: 'fact/promoted',
293
+ note: '升格由系统做;每条带边界(scope)与等级,下一轮作为「已知」引用时先看边界。货架在 clear/knowledge/facts/INDEX.md(面板「事实」那一格读的是同一张表)。「被推翻先标记、由人决定撤回」这一层这一平面**还没有**——如实记着(那一侧 P9 有)',
294
+ }),
295
+ object('release', {
296
+ states: ['granted'],
297
+ initial: 'granted',
298
+ terminal: ['granted'],
299
+ transitions: [],
300
+ fields: [field('step', { required: false }), field('branch', { required: false }), field('call'), field('via', { values: ['approval'] })],
301
+ persistence: 'fold.releases(原生审批栈的审计对是权威记录)',
302
+ event_kind: 'human/released',
303
+ note: 'L4 的人放行:一次一放行;步级的事实一落,同一步重试不再问人(§19-B)',
304
+ }),
305
+ ],
306
+ })