eduevidence 6.0.0 → 6.2.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 (189) hide show
  1. package/CONTRIBUTING.md +105 -0
  2. package/README.md +93 -38
  3. package/README.zh-CN.md +26 -6
  4. package/SKILL.md +11 -2
  5. package/assets/readme/landing-tour.gif +0 -0
  6. package/assets/readme/studio-tour.gif +0 -0
  7. package/bin/eduevidence.js +2 -1
  8. package/docs/architecture.md +319 -43
  9. package/docs/demo-workplace-ai.md +1 -1
  10. package/docs/install-guide.md +1 -1
  11. package/docs/orchestration-role-model.md +1 -1
  12. package/docs/release-closeout/README.md +1 -1
  13. package/docs/sciverse-api.md +125 -0
  14. package/eduevidence_cli.py +10 -0
  15. package/engine/decision_policy.py +96 -0
  16. package/engine/evidence_graph.py +14 -10
  17. package/engine/gaps.py +42 -22
  18. package/engine/ids.py +2 -0
  19. package/engine/library.py +6 -2
  20. package/engine/living.py +34 -4
  21. package/engine/migration.py +88 -3
  22. package/engine/orchestration.py +5 -5
  23. package/engine/paths.py +2 -0
  24. package/engine/pilot.py +34 -32
  25. package/engine/taxonomy.py +211 -0
  26. package/engine/tribunal.py +43 -31
  27. package/engine/versions.py +1 -1
  28. package/examples/ai-coding-assistant-evidence/EduEvidence_Report.html +1360 -146
  29. package/examples/ai-coding-assistant-evidence/artifact_manifest.json +3 -3
  30. package/examples/ai-coding-assistant-evidence/citation_check.json +1 -1
  31. package/examples/ai-coding-assistant-evidence/final_verdict.json +107 -0
  32. package/examples/ai-coding-assistant-evidence/gate_report.json +101 -0
  33. package/examples/ai-coding-assistant-evidence/report_spec.json +23 -12
  34. package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_academic.html +447 -127
  35. package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_claude.html +447 -127
  36. package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_datalab-dark.html +447 -127
  37. package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_datalab.html +447 -127
  38. package/examples/ai-coding-assistant-evidence/reports-5themes/EduEvidence_Report_presentation.html +447 -127
  39. package/examples/ai-coding-assistant-evidence/reports-5themes/report_academic.html +1360 -146
  40. package/examples/ai-coding-assistant-evidence/reports-5themes/report_claude.html +1360 -146
  41. package/examples/ai-coding-assistant-evidence/reports-5themes/report_datalab-dark.html +1360 -146
  42. package/examples/ai-coding-assistant-evidence/reports-5themes/report_datalab.html +1360 -146
  43. package/examples/ai-coding-assistant-evidence/reports-5themes/report_presentation.html +1360 -146
  44. package/examples/ai-coding-assistant-evidence/result.json +13 -9
  45. package/examples/ai-coding-assistant-evidence/result.zh.json +45 -41
  46. package/examples/ai-coding-assistant-evidence/skeptic.json +72 -0
  47. package/examples/ai-coding-assistant-evidence/verdict.json +6 -2
  48. package/examples/spaced-retrieval-practice/applicability.json +14 -0
  49. package/examples/spaced-retrieval-practice/artifact_manifest.json +15 -0
  50. package/examples/spaced-retrieval-practice/claims.jsonl +3 -0
  51. package/examples/spaced-retrieval-practice/evidence.jsonl +6 -0
  52. package/examples/spaced-retrieval-practice/final_verdict.json +93 -0
  53. package/examples/spaced-retrieval-practice/frame.json +58 -0
  54. package/examples/spaced-retrieval-practice/gate_report.json +101 -0
  55. package/examples/spaced-retrieval-practice/methodology.json +78 -0
  56. package/examples/spaced-retrieval-practice/report_spec.json +212 -0
  57. package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_academic.html +2728 -0
  58. package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_claude.html +2728 -0
  59. package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_datalab-dark.html +2728 -0
  60. package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_datalab.html +2728 -0
  61. package/examples/spaced-retrieval-practice/reports-5themes/EduEvidence_Report_presentation.html +2728 -0
  62. package/examples/spaced-retrieval-practice/reports-5themes/report_academic.html +2728 -0
  63. package/examples/spaced-retrieval-practice/reports-5themes/report_claude.html +2728 -0
  64. package/examples/spaced-retrieval-practice/reports-5themes/report_datalab-dark.html +2728 -0
  65. package/examples/spaced-retrieval-practice/reports-5themes/report_datalab.html +2728 -0
  66. package/examples/spaced-retrieval-practice/reports-5themes/report_presentation.html +2728 -0
  67. package/examples/spaced-retrieval-practice/result.json +942 -0
  68. package/examples/spaced-retrieval-practice/result.zh.json +942 -0
  69. package/examples/spaced-retrieval-practice/skeptic.json +70 -0
  70. package/examples/spaced-retrieval-practice/sources.jsonl +7 -0
  71. package/examples/spaced-retrieval-practice/verdict.json +93 -0
  72. package/examples/workplace-ai-assistant/artifact_manifest.json +15 -0
  73. package/examples/workplace-ai-assistant/claims.jsonl +4 -4
  74. package/examples/workplace-ai-assistant/evidence.jsonl +4 -4
  75. package/examples/workplace-ai-assistant/evidence_graph.json +15 -15
  76. package/examples/workplace-ai-assistant/final_verdict.json +78 -0
  77. package/examples/workplace-ai-assistant/gate_report.json +101 -0
  78. package/examples/workplace-ai-assistant/report_spec.json +209 -40
  79. package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_academic.html +435 -105
  80. package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_claude.html +435 -105
  81. package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_datalab-dark.html +435 -105
  82. package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_datalab.html +435 -105
  83. package/examples/workplace-ai-assistant/reports-5themes/EduEvidence_Report_presentation.html +435 -105
  84. package/examples/workplace-ai-assistant/reports-5themes/report_academic.html +2814 -0
  85. package/examples/workplace-ai-assistant/reports-5themes/report_claude.html +2814 -0
  86. package/examples/workplace-ai-assistant/reports-5themes/report_datalab-dark.html +2814 -0
  87. package/examples/workplace-ai-assistant/reports-5themes/report_datalab.html +2814 -0
  88. package/examples/workplace-ai-assistant/reports-5themes/report_presentation.html +2814 -0
  89. package/examples/workplace-ai-assistant/result.json +82 -20
  90. package/examples/workplace-ai-assistant/result.zh.json +82 -20
  91. package/examples/workplace-ai-assistant/skeptic.json +72 -0
  92. package/examples/workplace-ai-assistant/verdict.json +36 -10
  93. package/integrations/agent_mcp.py +2 -2
  94. package/package.json +12 -3
  95. package/pyproject.toml +4 -3
  96. package/references/report-copy-style.md +67 -0
  97. package/references/retrieval-compliance.md +75 -0
  98. package/references/retrieval-protocol.md +20 -0
  99. package/retrieval/audit.py +27 -3
  100. package/retrieval/fetch.py +96 -0
  101. package/retrieval/sciverse.py +398 -0
  102. package/retrieval/search.py +47 -7
  103. package/schemas/applicability.schema.json +94 -0
  104. package/schemas/chart-spec.schema.json +10 -3
  105. package/schemas/evidence.schema.json +316 -43
  106. package/schemas/fetch-result.schema.json +2 -1
  107. package/schemas/report-result.schema.json +3 -3
  108. package/schemas/report-spec.schema.json +98 -100
  109. package/schemas/skeptic.schema.json +86 -0
  110. package/schemas/source.schema.json +21 -2
  111. package/schemas/v2/finding.schema.json +5 -1
  112. package/schemas/v2/methodology-audit.schema.json +5 -1
  113. package/schemas/v2/outcome.schema.json +28 -5
  114. package/schemas/v2/study.schema.json +5 -1
  115. package/schemas/vNext/autoevolve-session.schema.json +34 -1
  116. package/schemas/vNext/eval-snapshot.schema.json +77 -1
  117. package/schemas/vNext/execution-plan.schema.json +50 -1
  118. package/schemas/vNext/gap-priority.schema.json +54 -1
  119. package/schemas/vNext/negative-search-record.schema.json +68 -1
  120. package/schemas/vNext/research-iteration.schema.json +87 -1
  121. package/schemas/vNext/research-strategy.schema.json +62 -1
  122. package/schemas/vNext/skill-experiment.schema.json +90 -1
  123. package/schemas/vNext/task-spec.schema.json +156 -1
  124. package/schemas/vNext/worker-result.schema.json +60 -1
  125. package/schemas/verdict.schema.json +164 -28
  126. package/scripts/build_esl_artifacts.py +2 -2
  127. package/scripts/build_report_variants.py +18 -2
  128. package/scripts/build_result.py +74 -9
  129. package/scripts/check_package_parity.py +85 -0
  130. package/scripts/check_protocol_alignment.py +375 -0
  131. package/scripts/check_versioned_schemas.py +254 -0
  132. package/scripts/claim_audit.py +13 -8
  133. package/scripts/compute_confidence.py +10 -0
  134. package/scripts/did_regression.py +12 -2
  135. package/scripts/evidence_score.py +5 -2
  136. package/scripts/generate_new_projects.py +4 -4
  137. package/scripts/orchestrator.py +120 -24
  138. package/scripts/pre_verdict_gate.py +224 -26
  139. package/scripts/quickstart.py +18 -2
  140. package/scripts/run_workspace.py +7 -1
  141. package/scripts/skill_payload.py +4 -1
  142. package/scripts/test_adversarial_empirical.py +26 -19
  143. package/scripts/validate_schema.py +31 -1
  144. package/skill/agents/evaluation-designer.md +20 -4
  145. package/skill/agents/evidence-analyst.md +19 -3
  146. package/skill/agents/evidence-judge.md +50 -2
  147. package/skill/agents/evidence-retriever.md +20 -3
  148. package/skill/agents/intervention-designer.md +20 -4
  149. package/skill/agents/method-reviewer.md +18 -2
  150. package/skill/agents/{education-planner.md → research-planner.md} +19 -3
  151. package/skill/agents/skeptic.md +18 -2
  152. package/skill/roles/registry.yaml +11 -11
  153. package/skill/sub-skills/aihot-trend-analysis/SKILL.md +28 -9
  154. package/skill/sub-skills/contradiction-analysis/SKILL.md +31 -11
  155. package/skill/sub-skills/data-analysis/SKILL.md +34 -15
  156. package/skill/sub-skills/ethics-review/SKILL.md +33 -10
  157. package/skill/sub-skills/evidence-extraction/SKILL.md +29 -11
  158. package/skill/sub-skills/evidence-review/SKILL.md +31 -12
  159. package/skill/sub-skills/gap-analysis/SKILL.md +31 -9
  160. package/skill/sub-skills/literature-review/SKILL.md +35 -14
  161. package/skill/sub-skills/methodology-audit/SKILL.md +29 -12
  162. package/skill/sub-skills/report-generation/SKILL.md +28 -0
  163. package/skill/sub-skills/research-planning/SKILL.md +41 -14
  164. package/skill/sub-skills/study-design/SKILL.md +30 -9
  165. package/skill/task-briefs/adjudicate.md +32 -7
  166. package/skill/task-briefs/applicability.md +37 -2
  167. package/skill/task-briefs/audit.md +32 -7
  168. package/skill/task-briefs/challenge.md +34 -5
  169. package/skill/task-briefs/evaluate.md +30 -5
  170. package/skill/task-briefs/extract.md +31 -8
  171. package/skill/task-briefs/frame.md +39 -10
  172. package/skill/task-briefs/intervene.md +32 -6
  173. package/skill/task-briefs/present.md +32 -8
  174. package/skill/task-briefs/projection.md +36 -2
  175. package/skill/task-briefs/retrieve.md +36 -6
  176. package/skill/workflows/decision-and-pilot.md +76 -1
  177. package/skill/workflows/evaluate-and-update.md +83 -0
  178. package/skill/workflows/evidence-review.md +104 -0
  179. package/visualization/eduevidence-report/scripts/build_figures.py +25 -3
  180. package/visualization/eduevidence-report/scripts/build_infographics.py +5 -1
  181. package/visualization/eduevidence-report/scripts/build_report.py +512 -65
  182. package/visualization/eduevidence-report/scripts/charts_data.py +2 -0
  183. package/visualization/eduevidence-report/scripts/lieflat_engine.py +349 -38
  184. package/visualization/eduevidence-report/scripts/zh_labels.py +80 -1
  185. package/web/architecture.html +14885 -0
  186. package/web/studio/assets/index-B8tkF44Q.css +1 -0
  187. package/web/studio/index.html +2 -2
  188. package/web/studio/assets/index-CzXocaGv.css +0 -1
  189. /package/web/studio/assets/{index-pa7jD7n4.js → index-CQ6Keoyc.js} +0 -0
@@ -5,77 +5,350 @@
5
5
  "description": "Claim-level evidence object. MANDATORY fields (schema v1.1): evidence_id, source_id, study_id, sample_id, claim_id, claim, outcome_type, relation_to_claim, effect_direction, source_location. Missing any mandatory field marks the object as UNSUPPORTED. 三种方向语义严格分开:relation_to_claim(支持/反驳某条 claim)、effect_direction(研究观察到的效应方向)、decision_relation(对最终教学决策的意义)。direction 为旧契约字段,仅向后兼容,已废弃(deprecated)。扩展字段一律放在 extensions 内。",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
- "required": ["evidence_id", "source_id", "study_id", "sample_id", "claim_id", "claim", "outcome_type", "relation_to_claim", "effect_direction", "source_location"],
8
+ "required": [
9
+ "evidence_id",
10
+ "source_id",
11
+ "study_id",
12
+ "sample_id",
13
+ "claim_id",
14
+ "claim",
15
+ "outcome_type",
16
+ "relation_to_claim",
17
+ "effect_direction",
18
+ "source_location"
19
+ ],
9
20
  "properties": {
10
- "evidence_id": { "type": "string", "examples": ["E-001"] },
11
- "source_id": { "type": "string", "examples": ["S-2023-kazemitabaar"] },
12
- "study_id": { "type": "string", "description": "所属研究的稳定标识,用于独立研究计数(独立于 evidence_id,防止同一研究的多条 Evidence Object 重复放大信心)。" },
13
- "sample_id": { "type": "string", "description": "所属样本的稳定标识,用于独立样本计数。无法区分样本时可显式使用 UNKNOWN-SAMPLE-<study_id>,但不能静默缺失。" },
14
- "claim_id": { "type": "string", "description": "该证据所绑定 Claim 的稳定标识(Claim Registry 一等字段,Claim -> Evidence -> Source 不再依赖渲染阶段临时编号)。", "examples": ["C-003"] },
15
- "title": { "type": "string" },
16
- "year": { "type": ["integer", "null"] },
21
+ "evidence_id": {
22
+ "type": "string",
23
+ "examples": [
24
+ "E-001"
25
+ ]
26
+ },
27
+ "source_id": {
28
+ "type": "string",
29
+ "examples": [
30
+ "S-2023-kazemitabaar"
31
+ ]
32
+ },
33
+ "study_id": {
34
+ "type": "string",
35
+ "description": "所属研究的稳定标识,用于独立研究计数(独立于 evidence_id,防止同一研究的多条 Evidence Object 重复放大信心)。"
36
+ },
37
+ "sample_id": {
38
+ "type": "string",
39
+ "description": "所属样本的稳定标识,用于独立样本计数。无法区分样本时可显式使用 UNKNOWN-SAMPLE-<study_id>,但不能静默缺失。"
40
+ },
41
+ "claim_id": {
42
+ "type": "string",
43
+ "description": "该证据所绑定 Claim 的稳定标识(Claim Registry 一等字段,Claim -> Evidence -> Source 不再依赖渲染阶段临时编号)。",
44
+ "examples": [
45
+ "C-003"
46
+ ]
47
+ },
48
+ "title": {
49
+ "type": "string"
50
+ },
51
+ "year": {
52
+ "type": [
53
+ "integer",
54
+ "null"
55
+ ]
56
+ },
17
57
  "study_type": {
18
58
  "type": "string",
19
- "enum": ["rct", "quasi_experimental", "observational", "survey", "qualitative", "meta_analysis", "literature_review", "case_study", "mixed_methods"]
59
+ "enum": [
60
+ "rct",
61
+ "quasi_experimental",
62
+ "observational",
63
+ "survey",
64
+ "qualitative",
65
+ "meta_analysis",
66
+ "literature_review",
67
+ "case_study",
68
+ "mixed_methods"
69
+ ]
70
+ },
71
+ "education_level": {
72
+ "type": "string",
73
+ "examples": [
74
+ "undergraduate",
75
+ "k12",
76
+ "graduate"
77
+ ]
78
+ },
79
+ "subject": {
80
+ "type": "string",
81
+ "examples": [
82
+ "programming",
83
+ "mathematics",
84
+ "writing"
85
+ ]
86
+ },
87
+ "population": {
88
+ "type": "string",
89
+ "examples": [
90
+ "first_year_CS_students"
91
+ ]
92
+ },
93
+ "sample_size": {
94
+ "type": [
95
+ "integer",
96
+ "null"
97
+ ],
98
+ "minimum": 0
99
+ },
100
+ "intervention": {
101
+ "type": "string",
102
+ "examples": [
103
+ "copilot_allowed_in_lab"
104
+ ]
105
+ },
106
+ "comparison": {
107
+ "type": "string",
108
+ "examples": [
109
+ "no_ai_control_group"
110
+ ]
20
111
  },
21
- "education_level": { "type": "string", "examples": ["undergraduate", "k12", "graduate"] },
22
- "subject": { "type": "string", "examples": ["programming", "mathematics", "writing"] },
23
- "population": { "type": "string", "examples": ["first_year_CS_students"] },
24
- "sample_size": { "type": ["integer", "null"], "minimum": 0 },
25
- "intervention": { "type": "string", "examples": ["copilot_allowed_in_lab"] },
26
- "comparison": { "type": "string", "examples": ["no_ai_control_group"] },
27
112
  "outcome_type": {
28
113
  "type": "string",
29
114
  "enum": [
30
- "knowledge_gain", "concept_understanding", "retention", "transfer",
31
- "independent_problem_solving", "completion_time", "accuracy",
32
- "code_quality", "assignment_score", "engagement", "motivation",
33
- "cognitive_load", "help_seeking", "metacognition", "ai_dependency",
34
- "over_reliance", "reduced_effort", "reduced_transfer",
35
- "academic_integrity_risk", "false_confidence"
115
+ "knowledge_gain",
116
+ "concept_understanding",
117
+ "retention",
118
+ "transfer",
119
+ "independent_problem_solving",
120
+ "completion_time",
121
+ "accuracy",
122
+ "code_quality",
123
+ "assignment_score",
124
+ "engagement",
125
+ "motivation",
126
+ "cognitive_load",
127
+ "help_seeking",
128
+ "metacognition",
129
+ "ai_dependency",
130
+ "over_reliance",
131
+ "reduced_effort",
132
+ "reduced_transfer",
133
+ "academic_integrity_risk",
134
+ "false_confidence",
135
+ "policy_effectiveness",
136
+ "cost_effectiveness",
137
+ "equity",
138
+ "feasibility",
139
+ "implementation_risk"
140
+ ],
141
+ "description": "Outcome Taxonomy token, as registered in domains/<id>/outcome_taxonomy.json. Education registers the first 20 tokens (learning / task_performance / process / risk categories); policy registers the remaining 5 (effectiveness / cost / equity / feasibility / risk). The registry is the authority - scripts/check_protocol_alignment.py fails if this enum and the registry disagree."
142
+ },
143
+ "outcome_measure": {
144
+ "type": "string",
145
+ "examples": [
146
+ "final_exam_score",
147
+ "post_test_transfer_task"
148
+ ]
149
+ },
150
+ "claim": {
151
+ "type": "string",
152
+ "description": "The specific claim this evidence supports or contradicts."
153
+ },
154
+ "direction": {
155
+ "type": "string",
156
+ "enum": [
157
+ "support",
158
+ "contradict",
159
+ "neutral"
160
+ ],
161
+ "description": "DEPRECATED: legacy direction field, kept for backward compatibility only. Use relation_to_claim instead."
162
+ },
163
+ "relation_to_claim": {
164
+ "type": "string",
165
+ "enum": [
166
+ "support",
167
+ "contradict",
168
+ "neutral"
169
+ ],
170
+ "description": "该证据与 claim 的关系(支持/反驳/中性)。Claim Audit 只依据此字段判断支持/反驳,不得用 effect_direction 或 legacy direction 替代。"
171
+ },
172
+ "effect_direction": {
173
+ "type": "string",
174
+ "enum": [
175
+ "positive",
176
+ "negative",
177
+ "null"
178
+ ],
179
+ "description": "研究观察到的效应方向。Outcome 可视化 / 聚合只依据此字段。"
180
+ },
181
+ "decision_relation": {
182
+ "type": "string",
183
+ "enum": [
184
+ "support_adoption",
185
+ "oppose_adoption",
186
+ "conditional",
187
+ "neutral"
188
+ ],
189
+ "description": "该证据对最终教学决策的意义(支持采纳/反对采纳/有条件采纳/中性)。跨研究一致性(Consistency)与 Tribunal 依据此字段计算。"
190
+ },
191
+ "effect": {
192
+ "type": "string",
193
+ "examples": [
194
+ "positive_medium",
195
+ "null",
196
+ "negative_small"
197
+ ]
198
+ },
199
+ "duration": {
200
+ "type": "string",
201
+ "examples": [
202
+ "8_weeks"
36
203
  ]
37
204
  },
38
- "outcome_measure": { "type": "string", "examples": ["final_exam_score", "post_test_transfer_task"] },
39
- "claim": { "type": "string", "description": "The specific claim this evidence supports or contradicts." },
40
- "direction": { "type": "string", "enum": ["support", "contradict", "neutral"], "description": "DEPRECATED: legacy direction field, kept for backward compatibility only. Use relation_to_claim instead." },
41
- "relation_to_claim": { "type": "string", "enum": ["support", "contradict", "neutral"], "description": "该证据与 claim 的关系(支持/反驳/中性)。Claim Audit 只依据此字段判断支持/反驳,不得用 effect_direction 或 legacy direction 替代。" },
42
- "effect_direction": { "type": "string", "enum": ["positive", "negative", "null"], "description": "研究观察到的效应方向。Outcome 可视化 / 聚合只依据此字段。" },
43
- "decision_relation": { "type": "string", "enum": ["support_adoption", "oppose_adoption", "conditional", "neutral"], "description": "该证据对最终教学决策的意义(支持采纳/反对采纳/有条件采纳/中性)。跨研究一致性(Consistency)与 Tribunal 依据此字段计算。" },
44
- "effect": { "type": "string", "examples": ["positive_medium", "null", "negative_small"] },
45
- "duration": { "type": "string", "examples": ["8_weeks"] },
46
- "method": { "type": "string", "examples": ["quasi_experimental_pre_post"] },
47
- "strengths": { "type": "array", "items": { "type": "string" } },
48
- "limitations": { "type": "array", "items": { "type": "string" } },
49
- "confounders": { "type": "array", "items": { "type": "string" } },
50
- "source_location": { "type": "string", "description": "Verifiable pointer to the source (DOI / URL / database identifier / page)." },
205
+ "method": {
206
+ "type": "string",
207
+ "examples": [
208
+ "quasi_experimental_pre_post"
209
+ ]
210
+ },
211
+ "strengths": {
212
+ "type": "array",
213
+ "items": {
214
+ "type": "string"
215
+ }
216
+ },
217
+ "limitations": {
218
+ "type": "array",
219
+ "items": {
220
+ "type": "string"
221
+ }
222
+ },
223
+ "confounders": {
224
+ "type": "array",
225
+ "items": {
226
+ "type": "string"
227
+ }
228
+ },
229
+ "source_location": {
230
+ "type": "string",
231
+ "description": "Verifiable pointer to the source (DOI / URL / database identifier / page)."
232
+ },
51
233
  "quality_dimensions": {
52
234
  "type": "object",
53
235
  "additionalProperties": true,
54
236
  "description": "D1 Study Design, D2 Sample Quality, D3 Measurement Validity, D4 Temporal Strength, D5 Directness. Each scored 0/1/2.",
55
237
  "properties": {
56
- "D1_study_design": { "type": "integer", "minimum": 0, "maximum": 2 },
57
- "D2_sample_quality": { "type": "integer", "minimum": 0, "maximum": 2 },
58
- "D3_measurement_validity": { "type": "integer", "minimum": 0, "maximum": 2 },
59
- "D4_temporal_strength": { "type": "integer", "minimum": 0, "maximum": 2 },
60
- "D5_directness": { "type": "integer", "minimum": 0, "maximum": 2 }
238
+ "D1_study_design": {
239
+ "type": "integer",
240
+ "minimum": 0,
241
+ "maximum": 2
242
+ },
243
+ "D2_sample_quality": {
244
+ "type": "integer",
245
+ "minimum": 0,
246
+ "maximum": 2
247
+ },
248
+ "D3_measurement_validity": {
249
+ "type": "integer",
250
+ "minimum": 0,
251
+ "maximum": 2
252
+ },
253
+ "D4_temporal_strength": {
254
+ "type": "integer",
255
+ "minimum": 0,
256
+ "maximum": 2
257
+ },
258
+ "D5_directness": {
259
+ "type": "integer",
260
+ "minimum": 0,
261
+ "maximum": 2
262
+ }
61
263
  }
62
264
  },
63
- "quality_score": { "type": ["number", "null"], "minimum": 0, "maximum": 10 },
265
+ "quality_score": {
266
+ "type": [
267
+ "number",
268
+ "null"
269
+ ],
270
+ "minimum": 0,
271
+ "maximum": 10
272
+ },
64
273
  "evidence_level": {
65
274
  "type": "string",
66
- "enum": ["strong", "moderate", "weak", "very_weak"]
275
+ "enum": [
276
+ "strong",
277
+ "moderate",
278
+ "weak",
279
+ "very_weak"
280
+ ]
67
281
  },
68
282
  "applicability": {
69
283
  "type": "object",
70
284
  "additionalProperties": true,
71
285
  "description": "Match against the target context: learner match, subject match, tool match, usage match, teacher support match."
72
286
  },
73
- "confidence": { "type": ["number", "null"], "minimum": 0, "maximum": 1 },
74
- "status": { "type": "string", "enum": ["SUPPORTED", "UNSUPPORTED", "DOWNGRADE_CONFIDENCE", "CONTRADICT"], "default": "SUPPORTED" },
287
+ "confidence": {
288
+ "type": [
289
+ "number",
290
+ "null"
291
+ ],
292
+ "minimum": 0,
293
+ "maximum": 1
294
+ },
295
+ "status": {
296
+ "type": "string",
297
+ "enum": [
298
+ "SUPPORTED",
299
+ "UNSUPPORTED",
300
+ "DOWNGRADE_CONFIDENCE",
301
+ "CONTRADICT"
302
+ ],
303
+ "default": "SUPPORTED"
304
+ },
75
305
  "extensions": {
76
306
  "type": "object",
77
307
  "description": "结构化扩展字段的统一容器(P1-01)。未列入本 schema 的字段必须放在这里,禁止在顶层新增属性。",
78
308
  "additionalProperties": true
309
+ },
310
+ "effect_size": {
311
+ "type": [
312
+ "number",
313
+ "object",
314
+ "null"
315
+ ],
316
+ "description": "Standardized effect size for this finding: a bare number for g, or an object such as {metric, value, ci_lower, ci_upper, p_value}. Read by the forest-plot and cascade extractors; rendering is suppressed when absent rather than approximated."
317
+ },
318
+ "effect_estimate": {
319
+ "type": [
320
+ "number",
321
+ "object",
322
+ "null"
323
+ ],
324
+ "description": "Raw effect estimate carried through V1 -> V2 migration so magnitudes survive the hop."
325
+ },
326
+ "wwc_rating": {
327
+ "type": [
328
+ "string",
329
+ "null"
330
+ ],
331
+ "enum": [
332
+ "meets_without_reservations",
333
+ "meets_with_reservations",
334
+ "does_not_meet",
335
+ null
336
+ ],
337
+ "description": "WWC 5.0 study rating, when the auditor assigned one."
338
+ },
339
+ "outcome_dimension": {
340
+ "type": [
341
+ "string",
342
+ "null"
343
+ ],
344
+ "description": "Coarse outcome dimension used for grouping (falls back to outcome_type)."
345
+ },
346
+ "study_label": {
347
+ "type": [
348
+ "string",
349
+ "null"
350
+ ],
351
+ "description": "Human-readable study label used on chart axes."
79
352
  }
80
353
  }
81
354
  }
@@ -33,7 +33,8 @@
33
33
  "markdown_new",
34
34
  "defuddle",
35
35
  "raw_html",
36
- "pdf_parser"
36
+ "pdf_parser",
37
+ "sciverse_content"
37
38
  ]
38
39
  },
39
40
  "fetch_status": {
@@ -232,9 +232,9 @@
232
232
  "required": [
233
233
  "evidence_id",
234
234
  "source_id",
235
- "outcome_type",
236
- "direction"
237
- ]
235
+ "outcome_type"
236
+ ],
237
+ "description": "Evidence row as embedded in a rendered result. `direction` is NOT required: it is deprecated in schemas/evidence.schema.json, and consumers must read relation_to_claim (claim support) and effect_direction (observed effect) instead."
238
238
  },
239
239
  "description": "Evidence rows (projection of evidence.schema.json; stage-level gate enforces the full contract)."
240
240
  },
@@ -2,129 +2,127 @@
2
2
  "$schema": "http://json-schema.org/draft-07/schema#",
3
3
  "$id": "https://github.com/37chengshan/eduevidence/schemas/report-spec.schema.json",
4
4
  "title": "ReportSpec",
5
- "description": "report_spec.json — the Visualization Planner output (v5 方案 §9-10, §36). Declares sections and components from the frozen Component Catalog; the deterministic renderer turns it into HTML. No free-form DOM. 扩展字段一律放在各对象 extensions 内。",
5
+ "description": "Build record emitted next to every rendered report by visualization/eduevidence-report/scripts/build_report.py. It records which theme was baked, which charts the gallery selected or suppressed (with reasons), the integrity-gate result, and the chapter outline. It is a projection record, never a research fact store. Legacy packs that predate this contract carry a smaller shape (mode/title/theme/sections) which is accepted for compatibility.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
- "required": [
9
- "title",
10
- "theme",
11
- "sections"
12
- ],
8
+ "required": [],
13
9
  "properties": {
14
- "title": {
10
+ "generated_by": {
15
11
  "type": "string"
16
12
  },
17
- "theme": {
18
- "type": "string",
19
- "enum": [
20
- "claude",
21
- "academic",
22
- "datalab",
23
- "datalab-dark",
24
- "presentation"
25
- ]
13
+ "source": {
14
+ "type": "string"
26
15
  },
27
- "mode": {
28
- "type": "string",
29
- "enum": [
30
- "research",
31
- "demo"
32
- ],
33
- "default": "research"
16
+ "question": {
17
+ "type": "string"
34
18
  },
35
- "generated_at": {
36
- "type": "string",
37
- "format": "date-time"
19
+ "theme_selected": {
20
+ "type": "string"
38
21
  },
39
- "sections": {
22
+ "theme_display": {
23
+ "type": "string"
24
+ },
25
+ "theme_available": {
40
26
  "type": "array",
41
27
  "items": {
42
- "type": "object",
43
- "additionalProperties": false,
44
- "required": [
45
- "id",
46
- "title",
47
- "component"
48
- ],
49
- "properties": {
50
- "id": {
51
- "type": "string",
52
- "examples": [
53
- "01-executive-decision"
54
- ]
55
- },
56
- "title": {
57
- "type": "string"
58
- },
59
- "component": {
60
- "type": "string",
61
- "enum": [
62
- "ReportShell",
63
- "Section",
64
- "DecisionCard",
65
- "ConfidenceBadge",
66
- "OutcomeSummary",
67
- "InteractiveChart",
68
- "AcademicFigure",
69
- "InfographicBlock",
70
- "EvidenceMatrix",
71
- "EvidenceRow",
72
- "TribunalView",
73
- "MethodologyPanel",
74
- "ConflictCard",
75
- "ClaimTrace",
76
- "ApplicabilityCard",
77
- "InterventionTimeline",
78
- "EvaluationFlow",
79
- "BenchmarkPanel",
80
- "SourceList",
81
- "ProvenancePanel",
82
- "Footnote"
83
- ]
84
- },
85
- "data_ref": {
86
- "type": "string",
87
- "description": "Pointer into result.json (e.g. 'decision', 'evidence', 'sources')."
88
- },
89
- "props": {
90
- "type": "object",
91
- "additionalProperties": true,
92
- "description": "Component props (theme-agnostic)."
93
- }
94
- }
28
+ "type": "string"
29
+ }
30
+ },
31
+ "theme_selection": {
32
+ "type": "string"
33
+ },
34
+ "lang_default": {
35
+ "type": "string"
36
+ },
37
+ "lang_switchable": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "string"
41
+ }
42
+ },
43
+ "report_pages": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "string"
95
47
  }
96
48
  },
49
+ "full_report_outline": {
50
+ "type": "object",
51
+ "additionalProperties": true,
52
+ "description": "Chapter plan actually rendered, plus the source it was resolved from (result.report_outline, or safe_fallback)."
53
+ },
54
+ "visualization_decisions": {
55
+ "type": "object",
56
+ "additionalProperties": true
57
+ },
58
+ "lieflat_gallery": {
59
+ "type": "object",
60
+ "additionalProperties": true,
61
+ "description": "Selected / suppressed / rejected gallery entries with reasons, and the layout_source (visual_layout or deterministic_fallback)."
62
+ },
97
63
  "charts": {
98
64
  "type": "array",
99
- "description": "Chart declarations (see chart-spec.schema.json).",
100
65
  "items": {
101
66
  "$ref": "chart-spec.schema.json"
67
+ },
68
+ "description": "Chart records; each one must satisfy schemas/chart-spec.schema.json."
69
+ },
70
+ "infographics": {
71
+ "type": "array",
72
+ "items": {
73
+ "type": "object",
74
+ "additionalProperties": true
75
+ }
76
+ },
77
+ "academic_figures": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "object",
81
+ "additionalProperties": true
102
82
  }
103
83
  },
84
+ "integrity_gate": {
85
+ "type": "object",
86
+ "additionalProperties": true
87
+ },
88
+ "mode": {
89
+ "type": "string"
90
+ },
91
+ "title": {
92
+ "type": "string"
93
+ },
94
+ "theme": {
95
+ "type": "string"
96
+ },
97
+ "sections": {
98
+ "type": "array"
99
+ },
100
+ "generated_at": {
101
+ "type": "string"
102
+ },
104
103
  "integrity": {
105
104
  "type": "object",
106
- "additionalProperties": false,
107
- "description": "Scientific Integrity Gate result (v5 方案 §27).",
108
- "properties": {
109
- "status": {
110
- "type": "string",
111
- "enum": [
112
- "VALID",
113
- "REPORT_INVALID"
114
- ]
115
- },
116
- "checks": {
117
- "type": "array",
118
- "items": {
119
- "type": "string"
120
- }
121
- }
122
- }
105
+ "additionalProperties": true
123
106
  },
124
107
  "extensions": {
125
108
  "type": "object",
126
- "description": "结构化扩展字段的统一容器(P1-01)。未列入本 schema 的字段必须放在这里,禁止在顶层新增属性。",
127
109
  "additionalProperties": true
128
110
  }
129
- }
111
+ },
112
+ "anyOf": [
113
+ {
114
+ "required": [
115
+ "theme_selected",
116
+ "integrity_gate"
117
+ ]
118
+ },
119
+ {
120
+ "required": [
121
+ "mode",
122
+ "title",
123
+ "theme",
124
+ "sections"
125
+ ]
126
+ }
127
+ ]
130
128
  }