eduevidence 6.2.0 → 6.3.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.
- package/CHANGELOG.md +395 -0
- package/README.md +22 -13
- package/README.zh-CN.md +15 -8
- package/SKILL.md +10 -9
- package/benchmarks/evidence-library.json +277 -1
- package/docs/architecture.md +6 -3
- package/docs/j-ev-experimental.md +250 -0
- package/docs/reproducibility.md +138 -0
- package/domains/_neutral/copy/few_shots.json +21 -0
- package/domains/_neutral/copy/framing_lexicon.json +19 -0
- package/domains/_neutral/copy/module_labels.json +5 -0
- package/domains/_neutral/copy/module_labels_footer.json +102 -0
- package/domains/_neutral/copy/module_labels_modules.json +204 -0
- package/domains/_neutral/copy/module_labels_nav.json +126 -0
- package/domains/_neutral/copy/module_labels_summary.json +98 -0
- package/domains/_neutral/copy/module_labels_tables.json +164 -0
- package/domains/_neutral/copy/module_labels_v2.json +90 -0
- package/domains/_neutral/copy/risk_constructs.json +20 -0
- package/domains/_neutral/copy/section_titles.json +66 -0
- package/domains/_neutral/copy/terminology.json +11 -0
- package/domains/check_copy_packs.py +103 -0
- package/domains/education/copy/few_shots.json +22 -0
- package/domains/education/copy/framing_enums.json +167 -0
- package/domains/education/copy/framing_lexicon.json +166 -0
- package/domains/education/copy/module_labels.json +169 -0
- package/domains/education/copy/risk_constructs.json +48 -0
- package/domains/education/copy/section_titles.json +186 -0
- package/domains/education/copy/terminology.json +70 -0
- package/domains/education/manifest.json +1 -1
- package/domains/education/outcome_taxonomy.json +2 -2
- package/domains/manifest.json +1 -1
- package/domains/policy/copy/few_shots.json +22 -0
- package/domains/policy/copy/framing_enums.json +94 -0
- package/domains/policy/copy/framing_lexicon.json +174 -0
- package/domains/policy/copy/module_labels.json +168 -0
- package/domains/policy/copy/risk_constructs.json +33 -0
- package/domains/policy/copy/section_titles.json +186 -0
- package/domains/policy/copy/terminology.json +64 -0
- package/engine/capabilities.py +57 -5
- package/engine/decision_policy.py +88 -17
- package/engine/library_builtin.py +7 -4
- package/engine/tribunal.py +17 -23
- package/engine/versions.py +1 -1
- package/examples/ai-coding-assistant-evidence/EduEvidence_Report.html +4 -4
- package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_academic.html +4 -4
- package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_claude.html +4 -4
- package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_datalab-dark.html +4 -4
- package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_datalab.html +4 -4
- package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_presentation.html +4 -4
- package/examples/spaced-retrieval-practice/EduEvidence_Report.html +2728 -0
- package/examples/spaced-retrieval-practice/report.html +2522 -0
- package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_academic.html +4 -4
- package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_claude.html +4 -4
- package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_datalab-dark.html +4 -4
- package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_datalab.html +4 -4
- package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_presentation.html +4 -4
- package/examples/workplace-ai-assistant/EduEvidence_Report.html +2814 -0
- package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_academic.html +36 -36
- package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_claude.html +36 -36
- package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_datalab-dark.html +36 -36
- package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_datalab.html +36 -36
- package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_presentation.html +36 -36
- package/integrations/jev/__init__.py +115 -0
- package/integrations/jev/approval.py +212 -0
- package/integrations/jev/cli.py +84 -0
- package/integrations/jev/config.py +112 -0
- package/integrations/jev/gateway.py +128 -0
- package/integrations/jev/modes.py +38 -0
- package/integrations/jev/tools_classify.py +88 -0
- package/integrations/jev/tools_extract.py +111 -0
- package/integrations/jev/tools_rerank.py +71 -0
- package/integrations/jev/tools_screen.py +87 -0
- package/integrations/jev/tools_verify.py +95 -0
- package/integrations/jev_mcp.py +22 -0
- package/integrations/semantic_decide.py +286 -0
- package/integrations/semdecide_cli.py +55 -0
- package/package.json +9 -1
- package/pyproject.toml +1 -1
- package/references/report-copy-style.md +43 -3
- package/schemas/v2/decision-snapshot.schema.json +20 -9
- package/schemas/v2/intake.schema.json +191 -0
- package/scripts/build_evidence_library.py +15 -5
- package/scripts/dashboard_server.py +13 -2
- package/scripts/intake/__init__.py +31 -0
- package/scripts/intake/__main__.py +18 -0
- package/scripts/intake/background.py +78 -0
- package/scripts/intake/browser.py +79 -0
- package/scripts/intake/cli.py +57 -0
- package/scripts/intake/constants.py +57 -0
- package/scripts/intake/depth.py +53 -0
- package/scripts/intake/enhancements.py +106 -0
- package/scripts/intake/hooks.py +90 -0
- package/scripts/intake/prefs.py +76 -0
- package/scripts/intake/prompts.py +85 -0
- package/scripts/intake/session.py +152 -0
- package/scripts/lint_file_layers.py +126 -0
- package/scripts/orchestrator.py +68 -17
- package/scripts/pre_verdict_gate.py +21 -7
- package/scripts/skill_lint.py +11 -1
- package/scripts/skill_payload.py +3 -3
- package/scripts/test_adversarial_empirical.py +70 -6
- package/skill/agents/evidence-judge.md +49 -7
- package/skill/workflows/experimental-jev.md +170 -0
- package/skill/workflows/intake.md +120 -0
- package/visualization/eduevidence-report/scripts/build_infographics.py +32 -14
- package/visualization/eduevidence-report/scripts/build_report.py +75 -662
- package/visualization/eduevidence-report/scripts/report_copy_pack.py +296 -0
- package/visualization/eduevidence-report/scripts/report_copy_policy_guard.py +47 -0
- package/visualization/eduevidence-report/scripts/zh_labels.py +61 -0
- package/scripts/build_esl_artifacts.py +0 -1921
- package/scripts/build_killer_demo.py +0 -295
- package/scripts/enrich_projects_human_and_lieflat.py +0 -315
- package/scripts/generate_new_projects.py +0 -686
- package/scripts/sync_killer_demo_report.py +0 -270
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "_neutral",
|
|
3
|
+
"purpose": "Neutral UI labels — module_labels_summary.",
|
|
4
|
+
"labels": {
|
|
5
|
+
"summary_title": {
|
|
6
|
+
"zh": "一句话结论",
|
|
7
|
+
"en": "Bottom line"
|
|
8
|
+
},
|
|
9
|
+
"summary_question": {
|
|
10
|
+
"zh": "问题",
|
|
11
|
+
"en": "Question"
|
|
12
|
+
},
|
|
13
|
+
"summary_evidence": {
|
|
14
|
+
"zh": "依据",
|
|
15
|
+
"en": "Evidence"
|
|
16
|
+
},
|
|
17
|
+
"summary_action": {
|
|
18
|
+
"zh": "行动",
|
|
19
|
+
"en": "Action"
|
|
20
|
+
},
|
|
21
|
+
"outcome_table": {
|
|
22
|
+
"zh": [
|
|
23
|
+
"结果类型",
|
|
24
|
+
"正向效应",
|
|
25
|
+
"负向效应",
|
|
26
|
+
"零效应",
|
|
27
|
+
"证据"
|
|
28
|
+
],
|
|
29
|
+
"en": [
|
|
30
|
+
"Outcome",
|
|
31
|
+
"Positive effect",
|
|
32
|
+
"Negative effect",
|
|
33
|
+
"Null effect",
|
|
34
|
+
"Evidence"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
"figure1_caption": {
|
|
38
|
+
"zh": "图 1. 各结果类型的正向 / 负向 / 零效应证据数量(基于 effect_direction,不等同于 Claim 是否被支持)。",
|
|
39
|
+
"en": "Fig. 1. Positive / negative / null effect counts per outcome (based on effect_direction, not claim support)."
|
|
40
|
+
},
|
|
41
|
+
"hero_action": {
|
|
42
|
+
"zh": "建议决策",
|
|
43
|
+
"en": "Recommended decision"
|
|
44
|
+
},
|
|
45
|
+
"hero_confidence": {
|
|
46
|
+
"zh": "置信度",
|
|
47
|
+
"en": "Confidence"
|
|
48
|
+
},
|
|
49
|
+
"hero_supported": {
|
|
50
|
+
"zh": "最强支持结论",
|
|
51
|
+
"en": "Strongest supported conclusion"
|
|
52
|
+
},
|
|
53
|
+
"hero_uncertain": {
|
|
54
|
+
"zh": "关键不确定性 / 反例",
|
|
55
|
+
"en": "Key uncertainty / contradiction"
|
|
56
|
+
},
|
|
57
|
+
"hero_risk": {
|
|
58
|
+
"zh": "主要风险",
|
|
59
|
+
"en": "Main risk"
|
|
60
|
+
},
|
|
61
|
+
"hero_next": {
|
|
62
|
+
"zh": "下一步",
|
|
63
|
+
"en": "Next action"
|
|
64
|
+
},
|
|
65
|
+
"hero_provenance": {
|
|
66
|
+
"zh": "证据 / 来源",
|
|
67
|
+
"en": "Evidence / sources"
|
|
68
|
+
},
|
|
69
|
+
"effect_positive": {
|
|
70
|
+
"zh": "正向效应",
|
|
71
|
+
"en": "Positive effect"
|
|
72
|
+
},
|
|
73
|
+
"effect_negative": {
|
|
74
|
+
"zh": "负向效应",
|
|
75
|
+
"en": "Negative effect"
|
|
76
|
+
},
|
|
77
|
+
"effect_null": {
|
|
78
|
+
"zh": "零效应",
|
|
79
|
+
"en": "Null effect"
|
|
80
|
+
},
|
|
81
|
+
"summary_tag_support": {
|
|
82
|
+
"zh": "支持",
|
|
83
|
+
"en": "Support"
|
|
84
|
+
},
|
|
85
|
+
"summary_tag_contradict": {
|
|
86
|
+
"zh": "反驳",
|
|
87
|
+
"en": "Contradict"
|
|
88
|
+
},
|
|
89
|
+
"summary_confidence_prefix": {
|
|
90
|
+
"zh": "(置信度:",
|
|
91
|
+
"en": " (confidence: "
|
|
92
|
+
},
|
|
93
|
+
"summary_confidence_suffix": {
|
|
94
|
+
"zh": ")",
|
|
95
|
+
"en": ")"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "_neutral",
|
|
3
|
+
"purpose": "Neutral UI labels — module_labels_tables.",
|
|
4
|
+
"labels": {
|
|
5
|
+
"matrix_filter": {
|
|
6
|
+
"zh": "筛选 / 搜索",
|
|
7
|
+
"en": "Filter / Search"
|
|
8
|
+
},
|
|
9
|
+
"matrix_search_ph": {
|
|
10
|
+
"zh": "搜索证据…",
|
|
11
|
+
"en": "Search evidence…"
|
|
12
|
+
},
|
|
13
|
+
"matrix_all_dir": {
|
|
14
|
+
"zh": "全部效应",
|
|
15
|
+
"en": "All effects"
|
|
16
|
+
},
|
|
17
|
+
"matrix_all_outcome": {
|
|
18
|
+
"zh": "全部结果",
|
|
19
|
+
"en": "All outcomes"
|
|
20
|
+
},
|
|
21
|
+
"matrix_heads": {
|
|
22
|
+
"zh": [
|
|
23
|
+
"ID",
|
|
24
|
+
"结果",
|
|
25
|
+
"效应",
|
|
26
|
+
"质量",
|
|
27
|
+
"主张",
|
|
28
|
+
"来源"
|
|
29
|
+
],
|
|
30
|
+
"en": [
|
|
31
|
+
"ID",
|
|
32
|
+
"Outcome",
|
|
33
|
+
"Effect",
|
|
34
|
+
"Quality",
|
|
35
|
+
"Claim",
|
|
36
|
+
"Source"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"matrix_details": {
|
|
40
|
+
"zh": "查看完整证据",
|
|
41
|
+
"en": "View full evidence"
|
|
42
|
+
},
|
|
43
|
+
"matrix_detail_labels": {
|
|
44
|
+
"zh": [
|
|
45
|
+
"研究标题",
|
|
46
|
+
"研究设计",
|
|
47
|
+
"人群",
|
|
48
|
+
"干预",
|
|
49
|
+
"直接性"
|
|
50
|
+
],
|
|
51
|
+
"en": [
|
|
52
|
+
"Study title",
|
|
53
|
+
"Design",
|
|
54
|
+
"Population",
|
|
55
|
+
"Intervention",
|
|
56
|
+
"Directness"
|
|
57
|
+
]
|
|
58
|
+
},
|
|
59
|
+
"matrix_source_missing": {
|
|
60
|
+
"zh": "无可验证来源",
|
|
61
|
+
"en": "No verifiable source"
|
|
62
|
+
},
|
|
63
|
+
"matrix_search_label": {
|
|
64
|
+
"zh": "筛选 / 搜索证据",
|
|
65
|
+
"en": "Filter / search evidence"
|
|
66
|
+
},
|
|
67
|
+
"matrix_dir_filter": {
|
|
68
|
+
"zh": "按效应方向筛选",
|
|
69
|
+
"en": "Filter by effect direction"
|
|
70
|
+
},
|
|
71
|
+
"matrix_outcome_filter": {
|
|
72
|
+
"zh": "按结果类型筛选",
|
|
73
|
+
"en": "Filter by outcome type"
|
|
74
|
+
},
|
|
75
|
+
"method_audit_heads": {
|
|
76
|
+
"zh": [
|
|
77
|
+
"检查项",
|
|
78
|
+
"状态",
|
|
79
|
+
"说明"
|
|
80
|
+
],
|
|
81
|
+
"en": [
|
|
82
|
+
"Item",
|
|
83
|
+
"Status",
|
|
84
|
+
"Note"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"conflict_verdict": {
|
|
88
|
+
"zh": "裁决说明",
|
|
89
|
+
"en": "Tribunal note"
|
|
90
|
+
},
|
|
91
|
+
"trace_decision": {
|
|
92
|
+
"zh": "决策",
|
|
93
|
+
"en": "Decision"
|
|
94
|
+
},
|
|
95
|
+
"trace_claim_prefix": {
|
|
96
|
+
"zh": "主张",
|
|
97
|
+
"en": "Claim"
|
|
98
|
+
},
|
|
99
|
+
"trace_no_source": {
|
|
100
|
+
"zh": "无来源",
|
|
101
|
+
"en": "No source"
|
|
102
|
+
},
|
|
103
|
+
"sources_title": {
|
|
104
|
+
"zh": "来源列表",
|
|
105
|
+
"en": "Source list"
|
|
106
|
+
},
|
|
107
|
+
"sources_heads": {
|
|
108
|
+
"zh": [
|
|
109
|
+
"ID",
|
|
110
|
+
"标题",
|
|
111
|
+
"年份",
|
|
112
|
+
"权威级别",
|
|
113
|
+
"可验证位置"
|
|
114
|
+
],
|
|
115
|
+
"en": [
|
|
116
|
+
"ID",
|
|
117
|
+
"Title",
|
|
118
|
+
"Year",
|
|
119
|
+
"Authority",
|
|
120
|
+
"Verifiable location"
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
"provenance_title": {
|
|
124
|
+
"zh": "Fetch 溯源",
|
|
125
|
+
"en": "Fetch provenance"
|
|
126
|
+
},
|
|
127
|
+
"provenance_heads": {
|
|
128
|
+
"zh": [
|
|
129
|
+
"来源",
|
|
130
|
+
"Fetch 方式",
|
|
131
|
+
"状态",
|
|
132
|
+
"降级",
|
|
133
|
+
"时间"
|
|
134
|
+
],
|
|
135
|
+
"en": [
|
|
136
|
+
"Source",
|
|
137
|
+
"Fetch method",
|
|
138
|
+
"Status",
|
|
139
|
+
"Fallback",
|
|
140
|
+
"Time"
|
|
141
|
+
]
|
|
142
|
+
},
|
|
143
|
+
"provenance_search": {
|
|
144
|
+
"zh": "搜索提供方",
|
|
145
|
+
"en": "Search provider"
|
|
146
|
+
},
|
|
147
|
+
"provenance_time": {
|
|
148
|
+
"zh": "检索时间",
|
|
149
|
+
"en": "Fetched at"
|
|
150
|
+
},
|
|
151
|
+
"provenance_empty": {
|
|
152
|
+
"zh": "无逐条 fetch 记录(来源由研究管线直接提供)。",
|
|
153
|
+
"en": "No per-source fetch records (sources provided directly by the research pipeline)."
|
|
154
|
+
},
|
|
155
|
+
"applicability_not_suitable": {
|
|
156
|
+
"zh": "不适用于",
|
|
157
|
+
"en": "Not suitable for"
|
|
158
|
+
},
|
|
159
|
+
"applicability_conditions": {
|
|
160
|
+
"zh": "适用条件",
|
|
161
|
+
"en": "Conditions"
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "_neutral",
|
|
3
|
+
"purpose": "Neutral UI labels — module_labels_v2.",
|
|
4
|
+
"labels": {
|
|
5
|
+
"v2_project_title": {
|
|
6
|
+
"zh": "项目与研究历史",
|
|
7
|
+
"en": "Project & Research History"
|
|
8
|
+
},
|
|
9
|
+
"v2_project_id": {
|
|
10
|
+
"zh": "项目 ID",
|
|
11
|
+
"en": "Project ID"
|
|
12
|
+
},
|
|
13
|
+
"v2_graph_revision": {
|
|
14
|
+
"zh": "证据图版本",
|
|
15
|
+
"en": "Graph revision"
|
|
16
|
+
},
|
|
17
|
+
"v2_decision_snapshot": {
|
|
18
|
+
"zh": "决策快照",
|
|
19
|
+
"en": "Decision snapshot"
|
|
20
|
+
},
|
|
21
|
+
"v2_timeline": {
|
|
22
|
+
"zh": "项目时间线",
|
|
23
|
+
"en": "Project timeline"
|
|
24
|
+
},
|
|
25
|
+
"v2_gaps_title": {
|
|
26
|
+
"zh": "知识缺口",
|
|
27
|
+
"en": "Knowledge gaps"
|
|
28
|
+
},
|
|
29
|
+
"v2_gap_type": {
|
|
30
|
+
"zh": "缺口类型",
|
|
31
|
+
"en": "Gap type"
|
|
32
|
+
},
|
|
33
|
+
"v2_gap_priority": {
|
|
34
|
+
"zh": "优先级",
|
|
35
|
+
"en": "Priority"
|
|
36
|
+
},
|
|
37
|
+
"v2_gap_reasoning": {
|
|
38
|
+
"zh": "依据",
|
|
39
|
+
"en": "Reasoning"
|
|
40
|
+
},
|
|
41
|
+
"v2_design_title": {
|
|
42
|
+
"zh": "研究设计",
|
|
43
|
+
"en": "Study design"
|
|
44
|
+
},
|
|
45
|
+
"v2_design_type": {
|
|
46
|
+
"zh": "设计类型",
|
|
47
|
+
"en": "Design type"
|
|
48
|
+
},
|
|
49
|
+
"v2_design_question": {
|
|
50
|
+
"zh": "研究问题",
|
|
51
|
+
"en": "Research question"
|
|
52
|
+
},
|
|
53
|
+
"v2_provenance_title": {
|
|
54
|
+
"zh": "数据集与分析溯源",
|
|
55
|
+
"en": "Dataset & analysis provenance"
|
|
56
|
+
},
|
|
57
|
+
"v2_diff_title": {
|
|
58
|
+
"zh": "决策变更",
|
|
59
|
+
"en": "Decision diff"
|
|
60
|
+
},
|
|
61
|
+
"v2_diff_action": {
|
|
62
|
+
"zh": "决策动作",
|
|
63
|
+
"en": "Decision action"
|
|
64
|
+
},
|
|
65
|
+
"v2_diff_confidence": {
|
|
66
|
+
"zh": "置信度",
|
|
67
|
+
"en": "Confidence"
|
|
68
|
+
},
|
|
69
|
+
"v2_diff_claims": {
|
|
70
|
+
"zh": "变更的主张",
|
|
71
|
+
"en": "Changed claims"
|
|
72
|
+
},
|
|
73
|
+
"v2_diff_gaps": {
|
|
74
|
+
"zh": "已解决/新增缺口",
|
|
75
|
+
"en": "Resolved/new gaps"
|
|
76
|
+
},
|
|
77
|
+
"v2_revision": {
|
|
78
|
+
"zh": "版本",
|
|
79
|
+
"en": "Revision"
|
|
80
|
+
},
|
|
81
|
+
"v2_decision": {
|
|
82
|
+
"zh": "决策",
|
|
83
|
+
"en": "Decision"
|
|
84
|
+
},
|
|
85
|
+
"v2_no_v2_data": {
|
|
86
|
+
"zh": "(无 V2 项目数据)",
|
|
87
|
+
"en": "(no V2 project data)"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "_neutral",
|
|
3
|
+
"outcome_groups": {},
|
|
4
|
+
"separation_title": {
|
|
5
|
+
"zh": "结果分离",
|
|
6
|
+
"en": "Outcome separation"
|
|
7
|
+
},
|
|
8
|
+
"separation_note": {
|
|
9
|
+
"zh": "将不同结果类型分开裁决。",
|
|
10
|
+
"en": "Outcomes are adjudicated separately."
|
|
11
|
+
},
|
|
12
|
+
"method_guard": {
|
|
13
|
+
"zh": "构念护栏",
|
|
14
|
+
"en": "Construct guard"
|
|
15
|
+
},
|
|
16
|
+
"guard_principle": {
|
|
17
|
+
"zh": "",
|
|
18
|
+
"en": ""
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "_neutral",
|
|
3
|
+
"section_titles": {
|
|
4
|
+
"zh": {},
|
|
5
|
+
"en": {}
|
|
6
|
+
},
|
|
7
|
+
"section_leads": {
|
|
8
|
+
"zh": {},
|
|
9
|
+
"en": {}
|
|
10
|
+
},
|
|
11
|
+
"default_chapters": [],
|
|
12
|
+
"brief_blocks": {
|
|
13
|
+
"zh": {
|
|
14
|
+
"decision": [
|
|
15
|
+
"先看结论",
|
|
16
|
+
"该不该做、把握多高、证据边界在哪里。"
|
|
17
|
+
],
|
|
18
|
+
"lieflat": [
|
|
19
|
+
"实证图表画廊",
|
|
20
|
+
"按数据形状选型编排;数字均可溯源到 result.json。"
|
|
21
|
+
],
|
|
22
|
+
"outcomes": [
|
|
23
|
+
"结果分离",
|
|
24
|
+
"不同构念的结果分开呈现;正向、负向与零效应分别编码。"
|
|
25
|
+
],
|
|
26
|
+
"tribunal": [
|
|
27
|
+
"证据裁决",
|
|
28
|
+
"支持、不确定、被反驳与缺失证据分开放置。"
|
|
29
|
+
],
|
|
30
|
+
"action": [
|
|
31
|
+
"从证据到行动",
|
|
32
|
+
"适用性、护栏、停止条件与评价连成可执行路径。"
|
|
33
|
+
],
|
|
34
|
+
"sources": [
|
|
35
|
+
"关键来源",
|
|
36
|
+
"摘要页只列最关键来源;完整溯源在完整报告展开。"
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"en": {
|
|
40
|
+
"decision": [
|
|
41
|
+
"Start with the decision",
|
|
42
|
+
"Whether to act, how confident, and where the evidence stops."
|
|
43
|
+
],
|
|
44
|
+
"lieflat": [
|
|
45
|
+
"Evidence figure gallery",
|
|
46
|
+
"Charts selected from the catalog; every number traces to result.json."
|
|
47
|
+
],
|
|
48
|
+
"outcomes": [
|
|
49
|
+
"Outcome separation",
|
|
50
|
+
"Distinct constructs shown separately; positive, negative, and null effects encoded apart."
|
|
51
|
+
],
|
|
52
|
+
"tribunal": [
|
|
53
|
+
"Evidence tribunal",
|
|
54
|
+
"Supported, uncertain, contradicted, and missing evidence kept apart."
|
|
55
|
+
],
|
|
56
|
+
"action": [
|
|
57
|
+
"Evidence to action",
|
|
58
|
+
"Applicability, guardrails, stop rules, and evaluation as one path."
|
|
59
|
+
],
|
|
60
|
+
"sources": [
|
|
61
|
+
"Key sources",
|
|
62
|
+
"Summary lists only critical sources; full provenance in the full report."
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Assert domain copy packs stay in-domain.
|
|
3
|
+
|
|
4
|
+
Requirement: the policy dictionary must not contain teaching vocabulary.
|
|
5
|
+
Run: python3 domains/check_copy_packs.py
|
|
6
|
+
Exit 0 = clean; exit 1 = violation (prints every hit).
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
# Reuse the report-layer ban list so load-time and CLI checks cannot drift.
|
|
14
|
+
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "visualization" / "eduevidence-report" / "scripts"))
|
|
15
|
+
from report_copy_pack import load_copy_pack # noqa: E402
|
|
16
|
+
from report_copy_policy_guard import ( # noqa: E402
|
|
17
|
+
TEACHING_WORDS_EN,
|
|
18
|
+
TEACHING_WORDS_ZH,
|
|
19
|
+
assert_policy_copy_clean,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
DOMAINS = Path(__file__).resolve().parent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _iter_strings(node, path="$"):
|
|
26
|
+
if isinstance(node, dict):
|
|
27
|
+
for key, value in node.items():
|
|
28
|
+
# Storage keys may be snake_case English (learning_metrics); the
|
|
29
|
+
# ban applies to reader-facing values.
|
|
30
|
+
yield from _iter_strings(value, f"{path}.{key}")
|
|
31
|
+
elif isinstance(node, list):
|
|
32
|
+
for index, value in enumerate(node):
|
|
33
|
+
yield from _iter_strings(value, f"{path}[{index}]")
|
|
34
|
+
elif isinstance(node, str):
|
|
35
|
+
yield path, node
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def load_pack(domain: str) -> dict:
|
|
39
|
+
return load_copy_pack(domain, strict=True)["files"]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def find_teaching_hits(domain: str) -> list[str]:
|
|
43
|
+
pack = load_pack(domain)
|
|
44
|
+
hits: list[str] = []
|
|
45
|
+
for name, data in pack.items():
|
|
46
|
+
for path, text in _iter_strings(data):
|
|
47
|
+
for word in TEACHING_WORDS_ZH:
|
|
48
|
+
if word in text:
|
|
49
|
+
hits.append(f"{domain}/{name} {path}: contains {word!r} in {text!r}")
|
|
50
|
+
lowered = text.lower()
|
|
51
|
+
for phrase in TEACHING_WORDS_EN:
|
|
52
|
+
if phrase.lower() in lowered:
|
|
53
|
+
hits.append(f"{domain}/{name} {path}: contains {phrase!r} in {text!r}")
|
|
54
|
+
return hits
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def main() -> int:
|
|
58
|
+
failures = 0
|
|
59
|
+
# Hard requirement: policy dictionary free of teaching words.
|
|
60
|
+
try:
|
|
61
|
+
assert_policy_copy_clean(load_pack("policy"))
|
|
62
|
+
print("OK policy copy pack: no teaching vocabulary")
|
|
63
|
+
except AssertionError as exc:
|
|
64
|
+
print(f"FAIL {exc}")
|
|
65
|
+
failures += 1
|
|
66
|
+
|
|
67
|
+
# Soft inventory: education pack is expected to carry teaching voice.
|
|
68
|
+
edu_hits = find_teaching_hits("education")
|
|
69
|
+
print(f"INFO education copy pack teaching-term hits: {len(edu_hits)}")
|
|
70
|
+
|
|
71
|
+
# Structural: every registered domain that has a copy/ dir is complete.
|
|
72
|
+
for domain_dir in sorted(DOMAINS.iterdir()):
|
|
73
|
+
if not domain_dir.is_dir() or domain_dir.name.startswith("_"):
|
|
74
|
+
continue
|
|
75
|
+
copy_dir = domain_dir / "copy"
|
|
76
|
+
if not copy_dir.is_dir():
|
|
77
|
+
continue
|
|
78
|
+
try:
|
|
79
|
+
pack = load_pack(domain_dir.name)
|
|
80
|
+
except FileNotFoundError as exc:
|
|
81
|
+
print(f"FAIL {exc}")
|
|
82
|
+
failures += 1
|
|
83
|
+
continue
|
|
84
|
+
for name, data in pack.items():
|
|
85
|
+
if data.get("domain") != domain_dir.name:
|
|
86
|
+
print(f"FAIL {domain_dir.name}/copy/{name}: domain field mismatch")
|
|
87
|
+
failures += 1
|
|
88
|
+
# four-state few-shots
|
|
89
|
+
states = set((pack.get("few_shots.json") or {}).get("states") or {})
|
|
90
|
+
required = {"adopt", "pilot", "reject", "insufficient_evidence"}
|
|
91
|
+
if not required <= states:
|
|
92
|
+
print(f"FAIL {domain_dir.name}/copy/few_shots.json: missing states {sorted(required - states)}")
|
|
93
|
+
failures += 1
|
|
94
|
+
|
|
95
|
+
if failures:
|
|
96
|
+
print(f"FAILED ({failures} problem(s))")
|
|
97
|
+
return 1
|
|
98
|
+
print("ALL COPY PACK CHECKS PASSED")
|
|
99
|
+
return 0
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
sys.exit(main())
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"domain": "education",
|
|
3
|
+
"purpose": "One written example per decision state (adopt / pilot / reject / insufficient_evidence), education voice.",
|
|
4
|
+
"states": {
|
|
5
|
+
"adopt": {
|
|
6
|
+
"zh": "延迟保持与迁移证据一致为正,独立后测无伤害信号 → 在目标课程中采用每周短时闭卷检索练习,并以统一延迟后测验收。",
|
|
7
|
+
"en": "Delayed retention and transfer evidence is consistently positive with no independent post-test harm → adopt weekly short closed-book retrieval practice in the target course, verified by a common delayed post-test."
|
|
8
|
+
},
|
|
9
|
+
"pilot": {
|
|
10
|
+
"zh": "任务表现证据强,但真实学习与保持证据不足或有护栏依赖 → 有界、分阶段、带独立后测的试点,而不是全面铺开。",
|
|
11
|
+
"en": "Task-performance evidence is strong, but independent learning and retention evidence is thin or guardrail-dependent → a bounded, phased pilot with independent post-tests rather than full rollout."
|
|
12
|
+
},
|
|
13
|
+
"reject": {
|
|
14
|
+
"zh": "无护栏使用已显示独立表现受损,且无补偿性学习收益证据 → 不建议采用,并明确替代方案的证据边界。",
|
|
15
|
+
"en": "Unguarded use already shows independent-performance harm with no compensatory learning gain → do not adopt, and state the evidence boundary of alternatives."
|
|
16
|
+
},
|
|
17
|
+
"insufficient_evidence": {
|
|
18
|
+
"zh": "现有研究未测量独立学习/保持/迁移,或人群与目标课程错位 → 证据不足,先补关键测量设计,再谈决策。",
|
|
19
|
+
"en": "Existing studies do not measure independent learning/retention/transfer, or the population mismatches the target course → insufficient evidence; fill the key measurement design before deciding."
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|