Last modified by Robert Schaub on 2025/12/24 20:35

From version 1.1
edited by Robert Schaub
on 2025/11/27 12:02
Change comment: There is no comment for this version
To version 2.2
edited by Robert Schaub
on 2025/11/27 12:08
Change comment: There is no comment for this version

Summary

Details

Page properties
Parent
... ... @@ -1,1 +1,1 @@
1 -FactHarbor.Specification.Data Model.WebHome
1 +FactHarbor.Playground.WebHome
Content
... ... @@ -41,10 +41,10 @@
41 41   (scenarios live at the *claim* level, not per individual phrasing).
42 42  * Verdicts and Scenario–Evidence links are always attached to **versions**:
43 43  * {{code}}SCENARIO_VERSION{{/code}} +
44 - {{code}}EVIDENCE_VERSION{{/code}} →
45 - {{code}}SCENARIO_EVIDENCE_LINK_VERSION{{/code}}
44 + {{code}}EVIDENCE_VERSION{{/code}} →
45 + {{code}}SCENARIO_EVIDENCE_LINK_VERSION{{/code}}
46 46  * {{code}}SCENARIO_VERSION{{/code}} →
47 - {{code}}VERDICT_VERSION{{/code}}
47 + {{code}}VERDICT_VERSION{{/code}}
48 48  
49 49  This ensures that when a Scenario or Evidence changes, old verdicts and links
50 50  remain intact as historical records and can be revisited.
... ... @@ -59,124 +59,95 @@
59 59  
60 60  {{mermaid}}
61 61  erDiagram
62 -
63 63   CLAIM_CLUSTER {
64 - string claimClusterId
65 - string theme
66 - string embeddingVectorRef
67 - string language
68 - datetime createdAt
63 + string ClusterID PK
64 + string EmbeddingVectorRef
65 + string Theme
69 69   }
70 70  
71 71   CLAIM {
72 - string claimId
73 - string claimClusterIdFk
74 - string status
75 - datetime createdAt
69 + string ClaimID PK
70 + string ClusterID FK
71 + string Status
72 + datetime CreatedAt
76 76   }
77 77  
78 78   CLAIM_VERSION {
79 - string claimVersionId
80 - string claimIdFk
81 - string text
82 - string language
83 - string claimType
84 - string domain
85 - string authorType
86 - datetime createdAt
76 + string ClaimVersionID PK
77 + string ClaimID FK
78 + string Text
79 + string ClaimType
80 + string Domain
81 + datetime CreatedAt
87 87   }
88 88  
89 89   SCENARIO {
90 - string scenarioId
91 - string claimIdFk
92 - string key
93 - string title
94 - boolean isDeprecated
85 + string ScenarioID PK
86 + string ClaimID FK
87 + string Name
88 + datetime CreatedAt
95 95   }
96 96  
97 97   SCENARIO_VERSION {
98 - string scenarioVersionId
99 - string scenarioIdFk
100 - string versionTag
101 - string definitionsJson
102 - string assumptionsJson
103 - string boundariesJson
104 - string notes
105 - datetime createdAt
92 + string ScenarioVersionID PK
93 + string ScenarioID FK
94 + string Definitions
95 + string Assumptions
96 + string Boundaries
97 + datetime CreatedAt
106 106   }
107 107  
108 108   EVIDENCE {
109 - string evidenceId
110 - string canonicalSourceId
111 - string mainUrl
112 - string evidenceType
113 - string language
101 + string EvidenceID PK
102 + string SourceType
103 + string URL
104 + float ReliabilityScore
114 114   }
115 115  
116 116   EVIDENCE_VERSION {
117 - string evidenceVersionId
118 - string evidenceIdFk
119 - string snapshotLocation
120 - string extractionSummary
121 - string reliabilityModel
122 - datetime collectedAt
123 - datetime createdAt
108 + string EvidenceVersionID PK
109 + string EvidenceID FK
110 + string Summary
111 + float ReliabilityScore
112 + datetime CreatedAt
124 124   }
125 125  
126 126   SCENARIO_EVIDENCE_LINK {
127 - string scenarioEvidenceLinkId
128 - string scenarioIdFk
129 - string evidenceIdFk
116 + string LinkID PK
117 + string ScenarioVersionID FK
118 + string EvidenceVersionID FK
119 + float Relevance
120 + string Direction
130 130   }
131 131  
132 - SCENARIO_EVIDENCE_LINK_VERSION {
133 - string scenarioEvidenceLinkVersionId
134 - string scenarioEvidenceLinkIdFk
135 - string scenarioVersionIdFk
136 - string evidenceVersionIdFk
137 - float relevance
138 - string direction %% SUPPORTS / CONTRADICTS / MIXED / CONTEXT
139 - string rationale
140 - datetime createdAt
141 - }
142 -
143 143   VERDICT {
144 - string verdictId
145 - string scenarioIdFk
146 - string verdictType %% e.g. likelihood, classification
124 + string VerdictID PK
125 + string ScenarioID FK
147 147   }
148 148  
149 149   VERDICT_VERSION {
150 - string verdictVersionId
151 - string verdictIdFk
152 - string scenarioVersionIdFk
153 - float probability
154 - float confidence
155 - string reasoningSummary
156 - string uncertaintyFactorsJson
157 - datetime createdAt
129 + string VerdictVersionID PK
130 + string VerdictID FK
131 + float Verdict
132 + float Confidence
133 + string Reasoning
134 + datetime CreatedAt
158 158   }
159 159  
160 - %% Relationships
161 -
162 162   CLAIM_CLUSTER ||--o{ CLAIM : contains
163 - CLAIM ||--o{ CLAIM_VERSION : has_versions
164 - CLAIM ||--o{ SCENARIO : has_scenarios
165 - SCENARIO ||--o{ SCENARIO_VERSION : has_versions
138 + CLAIM ||--o{ CLAIM_VERSION : versions
166 166  
167 - EVIDENCE ||--o{ EVIDENCE_VERSION : has_versions
140 + CLAIM ||--o{ SCENARIO : has
141 + SCENARIO ||--o{ SCENARIO_VERSION : versions
168 168  
169 - SCENARIO ||--o{ SCENARIO_EVIDENCE_LINK : may_link
170 - EVIDENCE ||--o{ SCENARIO_EVIDENCE_LINK : may_link
143 + EVIDENCE ||--o{ EVIDENCE_VERSION : versions
171 171  
172 - SCENARIO_EVIDENCE_LINK ||--o{ SCENARIO_EVIDENCE_LINK_VERSION : has_versions
145 + SCENARIO_VERSION ||--o{ SCENARIO_EVIDENCE_LINK : links
146 + EVIDENCE_VERSION ||--o{ SCENARIO_EVIDENCE_LINK : linked
173 173  
174 - SCENARIO_VERSION ||--o{ SCENARIO_EVIDENCE_LINK_VERSION : uses_evidence
175 - EVIDENCE_VERSION ||--o{ SCENARIO_EVIDENCE_LINK_VERSION : is_used_in
148 + SCENARIO ||--o{ VERDICT : assessed
149 + VERDICT ||--o{ VERDICT_VERSION : versions
176 176  
177 - SCENARIO ||--o{ VERDICT : has_verdicts
178 - VERDICT ||--o{ VERDICT_VERSION : has_versions
179 - SCENARIO_VERSION ||--o{ VERDICT_VERSION : assessed_in
180 180  {{/mermaid}}
181 181  
182 182  **Important points:**
... ... @@ -201,83 +201,145 @@
201 201  
202 202  {{mermaid}}
203 203  erDiagram
175 + %% Core clusters shown for context
176 + CLAIM_CLUSTER {
177 + string ClusterID PK
178 + string EmbeddingVectorRef
179 + string Theme
180 + }
204 204  
205 - USER {
206 - string userId
207 - string displayName
208 - string email
209 - string userType %% "human" or "technical"
210 - datetime createdAt
182 + CLAIM {
183 + string ClaimID PK
184 + string ClusterID FK
185 + string Status
186 + datetime CreatedAt
211 211   }
212 212  
213 - TECHNICAL_USER {
214 - string technicalUserId
215 - string userIdFk
216 - string description
217 - string systemIdentifier
189 + CLAIM_VERSION {
190 + string ClaimVersionID PK
191 + string ClaimID FK
192 + string Text
193 + string ClaimType
194 + string Domain
195 + datetime CreatedAt
218 218   }
219 219  
220 - ROLE {
221 - string roleId
222 - string code %% e.g. READER, CONTRIBUTOR, REVIEWER, TRUSTED_CONTRIBUTOR, MODERATOR, SYSTEM_ADMIN, FEDERATION_OPERATOR, FEDERATION_ADMIN
223 - string description
224 - boolean isFederationRole
198 + SCENARIO {
199 + string ScenarioID PK
200 + string ClaimID FK
201 + string Name
202 + datetime CreatedAt
225 225   }
226 226  
227 - USER_ROLE_MEMBERSHIP {
228 - string membershipId
229 - string userIdFk
230 - string roleIdFk
231 - datetime grantedAt
232 - string grantedByUserIdFk
205 + SCENARIO_VERSION {
206 + string ScenarioVersionID PK
207 + string ScenarioID FK
208 + string Definitions
209 + string Assumptions
210 + string Boundaries
211 + datetime CreatedAt
233 233   }
234 234  
235 - REVIEW_ACTION {
236 - string reviewActionId
237 - string subjectType %% e.g. CLAIM_VERSION, SCENARIO_VERSION...
238 - string subjectVersionId
239 - string actionType %% APPROVE, REJECT, FLAG, COMMENT, REQUEST_CHANGES...
240 - string outcome %% ACCEPTED, REJECTED, ESCALATED...
241 - string comment
242 - string createdByUserIdFk
243 - datetime createdAt
214 + EVIDENCE {
215 + string EvidenceID PK
216 + string SourceType
217 + string URL
218 + float ReliabilityScore
244 244   }
245 245  
246 - %% Versioned data entities (references from the core model)
221 + EVIDENCE_VERSION {
222 + string EvidenceVersionID PK
223 + string EvidenceID FK
224 + string Summary
225 + float ReliabilityScore
226 + datetime CreatedAt
227 + }
247 247  
248 - CLAIM_VERSION {
249 - string claimVersionId
229 + VERDICT {
230 + string VerdictID PK
231 + string ScenarioID FK
250 250   }
251 251  
252 - SCENARIO_VERSION {
253 - string scenarioVersionId
234 + VERDICT_VERSION {
235 + string VerdictVersionID PK
236 + string VerdictID FK
237 + float Verdict
238 + float Confidence
239 + string Reasoning
240 + datetime CreatedAt
254 254   }
255 255  
256 - EVIDENCE_VERSION {
257 - string evidenceVersionId
243 + %% Users and roles
244 + USER {
245 + string UserID PK
246 + string Handle
247 + string Email
258 258   }
259 259  
260 - SCENARIO_EVIDENCE_LINK_VERSION {
261 - string scenarioEvidenceLinkVersionId
250 + TECHNICAL_USER {
251 + string UserID PK
252 + string SystemName
262 262   }
263 263  
264 - VERDICT_VERSION {
265 - string verdictVersionId
255 + CONTRIBUTING_USER {
256 + string UserID PK
257 + string DisplayName
266 266   }
267 267  
268 - %% Relationships
260 + TRUSTED_CONTRIBUTOR {
261 + string UserID PK
262 + string TrustLevel
263 + }
269 269  
270 - USER ||--o{ TECHNICAL_USER : may_be
271 - USER ||--o{ USER_ROLE_MEMBERSHIP : has_role
272 - ROLE ||--o{ USER_ROLE_MEMBERSHIP : assigned_to
265 + REVIEWER {
266 + string UserID PK
267 + string Domain
268 + }
273 273  
270 + EXPERT {
271 + string UserID PK
272 + string ExpertiseArea
273 + }
274 +
275 + FEDERATION_NODE {
276 + string NodeID PK
277 + string Region
278 + }
279 +
280 + FEDERATION_ADMIN {
281 + string UserID PK
282 + string Permissions
283 + }
284 +
285 + REVIEW_ACTION {
286 + string ReviewActionID PK
287 + string UserID FK
288 + string TargetEntityType
289 + string TargetEntityVersionID
290 + string ActionType
291 + string Comment
292 + datetime Timestamp
293 + }
294 +
295 + %% Inheritance / specialization (modelled as relationships)
296 + USER ||--o{ TECHNICAL_USER : "is a"
297 + USER ||--o{ CONTRIBUTING_USER : "is a"
298 +
299 + CONTRIBUTING_USER ||--o{ TRUSTED_CONTRIBUTOR : "subset"
300 + CONTRIBUTING_USER ||--o{ REVIEWER : "subset"
301 + CONTRIBUTING_USER ||--o{ EXPERT : "subset"
302 +
303 + TECHNICAL_USER ||--o{ FEDERATION_NODE : "operates"
304 + TECHNICAL_USER ||--o{ FEDERATION_ADMIN : "administers"
305 +
306 + %% Review actions on versioned entities
274 274   USER ||--o{ REVIEW_ACTION : performs
275 275  
276 - CLAIM_VERSION ||--o{ REVIEW_ACTION : is_reviewed_in
277 - SCENARIO_VERSION ||--o{ REVIEW_ACTION : is_reviewed_in
278 - EVIDENCE_VERSION ||--o{ REVIEW_ACTION : is_reviewed_in
279 - SCENARIO_EVIDENCE_LINK_VERSION ||--o{ REVIEW_ACTION : is_reviewed_in
280 - VERDICT_VERSION ||--o{ REVIEW_ACTION : is_reviewed_in
309 + REVIEW_ACTION }o--|| CLAIM_VERSION : reviews
310 + REVIEW_ACTION }o--|| SCENARIO_VERSION : reviews
311 + REVIEW_ACTION }o--|| EVIDENCE_VERSION : reviews
312 + REVIEW_ACTION }o--|| VERDICT_VERSION : reviews
313 +
281 281  {{/mermaid}}
282 282  
283 283  Notes:
... ... @@ -309,7 +309,7 @@
309 309  * It may inherit some links from earlier scenarios, or start empty depending
310 310   on the change classification (cosmetic vs. conceptual).
311 311  * All verdicts for that scenario are recalculated and stored as new
312 - {{code}}VERDICT_VERSION{{/code}} entries.
345 + {{code}}VERDICT_VERSION{{/code}} entries.
313 313  
314 314  * REVIEW_ACTIONs are always attached to the **exact version** that was seen by
315 315   the reviewer. This preserves a faithful audit trail if data later changes.