eyeling 1.12.12 → 1.12.13

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.
@@ -0,0 +1,439 @@
1
+ # =======================================================================================
2
+ # Notation3 (N3) + ODRL Risk Assessment Demo
3
+ #
4
+ # Purpose
5
+ # - Represent an agreement as an ODRL policy graph (odrl:Policy with
6
+ # odrl:permission / odrl:prohibition / odrl:duty / odrl:constraint).
7
+ # - Detect potentially unfair or risky terms using N3 rules (antecedent => consequent).
8
+ # - Infer risk triples (:Risk instances) with:
9
+ # * :score / :severity
10
+ # * :aboutClause / :issue
11
+ # * :explanation (human-readable justification)
12
+ # - Rank risks highest->lowest and print an explainable report via log:outputString.
13
+ # - Make scoring needs-aware (consumer profile requirements raise/lower scores).
14
+ #
15
+ # Data Shape
16
+ # :Agreement
17
+ # :policyGraph { ...ODRL triples... } # quoted formula (N3 graph term)
18
+ #
19
+ # Rules
20
+ # - Use log:includes / log:notIncludes to pattern-match inside the quoted policyGraph.
21
+ # - Generate stable risk IRIs using log:skolem.
22
+ # - Compute scores using math:* builtins; format explanations with string:format.
23
+ #
24
+ # Ranking / Reporting
25
+ # - Collect (score risk) pairs with log:collectAllIn.
26
+ # - Sort with list:sort, reverse with list:reverse, iterate with list:iterate.
27
+ # - Emit lines with log:outputString (run Eyeling in strings-output mode).
28
+ #
29
+ # Notes
30
+ # - This is a heuristic compliance/risk checker, not legal advice.
31
+ # - Extend by adding more unfair-term rules and more consumer needs.
32
+ #
33
+ # References
34
+ # - N3 specification: https://w3c.github.io/N3/spec/
35
+ # - Eyeling builtins handbook: https://eyereasoner.github.io/eyeling/HANDBOOK#ch11
36
+ # - ODRL model/vocabulary: https://www.w3.org/TR/odrl-model/
37
+ # =======================================================================================
38
+
39
+ @prefix : <https://example.org/agreement#>.
40
+ @prefix odrl: <http://www.w3.org/ns/odrl/2/> .
41
+ @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
42
+ @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
43
+ @prefix log: <http://www.w3.org/2000/10/swap/log#>.
44
+ @prefix list: <http://www.w3.org/2000/10/swap/list#>.
45
+ @prefix math: <http://www.w3.org/2000/10/swap/math#>.
46
+ @prefix string:<http://www.w3.org/2000/10/swap/string#>.
47
+
48
+ # -------------------------------------------------------------
49
+ # 1) Consumer profile (needs) — tweak these to drive assessment
50
+ # -------------------------------------------------------------
51
+
52
+ :ConsumerAlice a :ConsumerProfile;
53
+ :label "Alice (example consumer)";
54
+ :hasNeed :Need_DataNotRemoved,
55
+ :Need_ChangeOnlyWithPriorNotice,
56
+ :Need_NoDataSharingWithoutConsent.
57
+
58
+ :Need_DataNotRemoved a :Need;
59
+ :label "Provider must not remove my data";
60
+ :importance 20.
61
+
62
+ :Need_ChangeOnlyWithPriorNotice a :Need;
63
+ :label "Agreement may change only with prior notice";
64
+ :importance 15;
65
+ :minNoticeDays 30.
66
+
67
+ :Need_NoDataSharingWithoutConsent a :Need;
68
+ :label "No data sharing without consent";
69
+ :importance 10.
70
+
71
+ # -------------------------------------------------------------
72
+ # 2) Agreement model in ODRL (quoted formula as the “document”)
73
+ # -------------------------------------------------------------
74
+
75
+ :Agreement1 a :Agreement;
76
+ :label "Example SaaS Agreement";
77
+ :policyGraph {
78
+ :Policy1 a odrl:Policy;
79
+ odrl:permission :PermChangeTerms,
80
+ :PermDeleteUserData,
81
+ :PermShareUserData;
82
+ odrl:prohibition :ProhibitCourtAccess.
83
+
84
+ # Clause C1: change terms, but NO prior notice duty (risky vs Need_ChangeOnlyWithPriorNotice)
85
+ :PermChangeTerms a odrl:Permission;
86
+ odrl:action :changeTerms;
87
+ odrl:target :AgreementText;
88
+ :clause :ClauseC1.
89
+
90
+ :ClauseC1 a :Clause;
91
+ :clauseId "C1";
92
+ :text "We may change these terms at any time. Continued use means acceptance.".
93
+
94
+ # Clause C2: provider may delete user data (risky vs Need_DataNotRemoved)
95
+ :PermDeleteUserData a odrl:Permission;
96
+ odrl:action :deleteUserData;
97
+ odrl:target :UserData;
98
+ :clause :ClauseC2.
99
+
100
+ :ClauseC2 a :Clause;
101
+ :clauseId "C2";
102
+ :text "We may delete your data at our discretion, with or without notice.".
103
+
104
+ # Clause C3: provider may share user data, no consent constraint (risky vs Need_NoDataSharingWithoutConsent)
105
+ :PermShareUserData a odrl:Permission;
106
+ odrl:action :shareUserData;
107
+ odrl:target :UserData;
108
+ :clause :ClauseC3.
109
+
110
+ :ClauseC3 a :Clause;
111
+ :clauseId "C3";
112
+ :text "We may share your data with partners for any purpose.".
113
+
114
+ # Clause C4: prohibits going to court (mandatory arbitration / waiver) — general risk example
115
+ :ProhibitCourtAccess a odrl:Prohibition;
116
+ odrl:action :goToCourt;
117
+ odrl:target :Dispute;
118
+ :clause :ClauseC4.
119
+
120
+ :ClauseC4 a :Clause;
121
+ :clauseId "C4";
122
+ :text "You waive your right to go to court; disputes must be arbitrated.".
123
+ }.
124
+
125
+ # ------------------------------------------------------------------
126
+ # 3) Risk inference rules (unfair-term heuristics + needs-aware)
127
+ #
128
+ # Output model:
129
+ # ?risk a :Risk ;
130
+ # :aboutAgreement, :forProfile, :aboutClause, :issue, :rawScore,
131
+ # :score, :severity, :explanation, ...
132
+ # ------------------------------------------------------------------
133
+
134
+ # Helper: create deterministic risk IDs (so ranking works nicely)
135
+ # (groundTerm) log:skolem ?iri
136
+ # Eyeling supports log:skolem :contentReference[oaicite:3]{index=3}.
137
+
138
+ # -------------------------------------------
139
+ # R1 — Unilateral change WITHOUT prior notice
140
+ # -------------------------------------------
141
+ {
142
+ ?profile a :ConsumerProfile; :hasNeed :Need_ChangeOnlyWithPriorNotice.
143
+ :Need_ChangeOnlyWithPriorNotice :importance ?w.
144
+
145
+ ?agreement a :Agreement; :policyGraph ?G.
146
+
147
+ ?G log:includes {
148
+ ?P a odrl:Policy.
149
+ ?P odrl:permission ?perm.
150
+ ?perm odrl:action :changeTerms.
151
+ ?perm :clause ?clause.
152
+ ?clause :clauseId ?cid; :text ?txt.
153
+ }.
154
+
155
+ # Closed-world-ish check inside the agreement graph:
156
+ ?G log:notIncludes {
157
+ ?perm odrl:duty ?d.
158
+ ?d odrl:action :notifyPriorNotice.
159
+ }.
160
+
161
+ # score = base + need-weight
162
+ (80 ?w) math:sum ?raw.
163
+ ( ?agreement ?profile :UnilateralChangeNoNotice ?clause ) log:skolem ?risk.
164
+
165
+ ( "This clause is risky because it allows unilateral changes without any prior notice. Clause %s: %s"
166
+ ?cid ?txt
167
+ ) string:format ?why.
168
+ }
169
+ =>
170
+ {
171
+ ?risk a :Risk;
172
+ :aboutAgreement ?agreement;
173
+ :forProfile ?profile;
174
+ :aboutClause ?clause;
175
+ :clauseId ?cid;
176
+ :issue :UnilateralChangeNoNotice;
177
+ :baseScore 80;
178
+ :needWeight ?w;
179
+ :rawScore ?raw;
180
+ :title "Unilateral change without notice";
181
+ :explanation ?why;
182
+ :violatesNeed :Need_ChangeOnlyWithPriorNotice.
183
+ }.
184
+
185
+ # ---------------------------------------------------------
186
+ # R2 — Changes WITH notice duty but notice period too short
187
+ # (uses Need_ChangeOnlyWithPriorNotice :minNoticeDays)
188
+ # ---------------------------------------------------------
189
+ {
190
+ ?profile a :ConsumerProfile; :hasNeed :Need_ChangeOnlyWithPriorNotice.
191
+ :Need_ChangeOnlyWithPriorNotice :importance ?w; :minNoticeDays ?minDays.
192
+
193
+ ?agreement a :Agreement; :policyGraph ?G.
194
+
195
+ ?G log:includes {
196
+ ?P a odrl:Policy.
197
+ ?P odrl:permission ?perm.
198
+ ?perm odrl:action :changeTerms.
199
+ ?perm :clause ?clause.
200
+ ?clause :clauseId ?cid; :text ?txt.
201
+
202
+ ?perm odrl:duty ?d.
203
+ ?d odrl:action :notifyPriorNotice.
204
+ ?d odrl:constraint ?c.
205
+ ?c odrl:leftOperand :noticeDays;
206
+ odrl:operator odrl:gteq;
207
+ odrl:rightOperand ?days.
208
+ }.
209
+
210
+ # If stated noticeDays is less than what the consumer needs, flag risk.
211
+ ?days math:lessThan ?minDays.
212
+
213
+ (70 ?w) math:sum ?raw.
214
+ ( ?agreement ?profile :NoticeTooShort ?clause ) log:skolem ?risk.
215
+
216
+ ( "This clause is risky because the notice period (%s days) is below the consumer requirement (%s days). Clause %s: %s"
217
+ ?days ?minDays ?cid ?txt
218
+ ) string:format ?why.
219
+ }
220
+ =>
221
+ {
222
+ ?risk a :Risk;
223
+ :aboutAgreement ?agreement;
224
+ :forProfile ?profile;
225
+ :aboutClause ?clause;
226
+ :clauseId ?cid;
227
+ :issue :NoticeTooShort;
228
+ :baseScore 70;
229
+ :needWeight ?w;
230
+ :rawScore ?raw;
231
+ :title "Notice period too short";
232
+ :explanation ?why;
233
+ :violatesNeed :Need_ChangeOnlyWithPriorNotice.
234
+ }.
235
+
236
+ # ----------------------------------
237
+ # R3 — Provider may delete user data
238
+ # ----------------------------------
239
+ {
240
+ ?profile a :ConsumerProfile; :hasNeed :Need_DataNotRemoved.
241
+ :Need_DataNotRemoved :importance ?w.
242
+
243
+ ?agreement a :Agreement; :policyGraph ?G.
244
+
245
+ ?G log:includes {
246
+ ?P a odrl:Policy.
247
+ ?P odrl:permission ?perm.
248
+ ?perm odrl:action :deleteUserData.
249
+ ?perm :clause ?clause.
250
+ ?clause :clauseId ?cid; :text ?txt.
251
+ }.
252
+
253
+ (90 ?w) math:sum ?raw.
254
+ ( ?agreement ?profile :ProviderMayDeleteData ?clause ) log:skolem ?risk.
255
+
256
+ ( "This clause is risky because it allows the provider to remove (delete) the consumer’s data. Clause %s: %s"
257
+ ?cid ?txt
258
+ ) string:format ?why.
259
+ }
260
+ =>
261
+ {
262
+ ?risk a :Risk;
263
+ :aboutAgreement ?agreement;
264
+ :forProfile ?profile;
265
+ :aboutClause ?clause;
266
+ :clauseId ?cid;
267
+ :issue :ProviderMayDeleteData;
268
+ :baseScore 90;
269
+ :needWeight ?w;
270
+ :rawScore ?raw;
271
+ :title "Provider can delete user data";
272
+ :explanation ?why;
273
+ :violatesNeed :Need_DataNotRemoved.
274
+ }.
275
+
276
+ # ------------------------------------------
277
+ # R4 — Share data without consent constraint
278
+ # ------------------------------------------
279
+ {
280
+ ?profile a :ConsumerProfile; :hasNeed :Need_NoDataSharingWithoutConsent.
281
+ :Need_NoDataSharingWithoutConsent :importance ?w.
282
+
283
+ ?agreement a :Agreement; :policyGraph ?G.
284
+
285
+ ?G log:includes {
286
+ ?P a odrl:Policy.
287
+ ?P odrl:permission ?perm.
288
+ ?perm odrl:action :shareUserData.
289
+ ?perm :clause ?clause.
290
+ ?clause :clauseId ?cid; :text ?txt.
291
+ }.
292
+
293
+ # Missing consent constraint inside the agreement graph:
294
+ ?G log:notIncludes {
295
+ ?perm odrl:constraint ?c.
296
+ ?c odrl:leftOperand :consent;
297
+ odrl:operator odrl:eq;
298
+ odrl:rightOperand true.
299
+ }.
300
+
301
+ (85 ?w) math:sum ?raw.
302
+ ( ?agreement ?profile :ShareDataNoConsent ?clause ) log:skolem ?risk.
303
+
304
+ ( "This clause is risky because it permits data sharing without an explicit consent requirement. Clause %s: %s"
305
+ ?cid ?txt
306
+ ) string:format ?why.
307
+ }
308
+ =>
309
+ {
310
+ ?risk a :Risk;
311
+ :aboutAgreement ?agreement;
312
+ :forProfile ?profile;
313
+ :aboutClause ?clause;
314
+ :clauseId ?cid;
315
+ :issue :ShareDataNoConsent;
316
+ :baseScore 85;
317
+ :needWeight ?w;
318
+ :rawScore ?raw;
319
+ :title "Data sharing without consent";
320
+ :explanation ?why;
321
+ :violatesNeed :Need_NoDataSharingWithoutConsent.
322
+ }.
323
+
324
+ # ----------------------------------------------------
325
+ # R5 — Waiver of going to court (general risk example)
326
+ # (Not tied to a specific consumer need here.)
327
+ # ----------------------------------------------------
328
+ {
329
+ ?profile a :ConsumerProfile.
330
+ ?agreement a :Agreement; :policyGraph ?G.
331
+
332
+ ?G log:includes {
333
+ ?P a odrl:Policy.
334
+ ?P odrl:prohibition ?proh.
335
+ ?proh odrl:action :goToCourt.
336
+ ?proh :clause ?clause.
337
+ ?clause :clauseId ?cid; :text ?txt.
338
+ }.
339
+
340
+ 60 log:equalTo ?base.
341
+ ( ?agreement ?profile :CourtAccessWaiver ?clause ) log:skolem ?risk.
342
+
343
+ ( "This clause is risky because it restricts access to court (mandatory arbitration / waiver). Clause %s: %s"
344
+ ?cid ?txt
345
+ ) string:format ?why.
346
+ }
347
+ =>
348
+ {
349
+ ?risk a :Risk;
350
+ :aboutAgreement ?agreement;
351
+ :forProfile ?profile;
352
+ :aboutClause ?clause;
353
+ :clauseId ?cid;
354
+ :issue :CourtAccessWaiver;
355
+ :baseScore 60;
356
+ :needWeight 0;
357
+ :rawScore 60;
358
+ :title "Court access waiver / mandatory arbitration";
359
+ :explanation ?why.
360
+ }.
361
+
362
+ # ---------------------------------------------------
363
+ # 4) Normalize score (clamp at 100) + severity labels
364
+ # ---------------------------------------------------
365
+
366
+ { ?r a :Risk; :rawScore ?raw. ?raw math:greaterThan 100. }
367
+ => { ?r :score 100. }.
368
+
369
+ { ?r a :Risk; :rawScore ?raw. 100 math:greaterThan ?raw. }
370
+ => { ?r :score ?raw. }.
371
+
372
+ { ?r a :Risk; :rawScore ?raw. ?raw math:equalTo 100. }
373
+ => { ?r :score 100. }.
374
+
375
+ # Severity from score
376
+ { ?r a :Risk; :score ?s. ?s math:notLessThan 80. } => { ?r :severity :High. }.
377
+ { ?r a :Risk; :score ?s. ?s math:lessThan 80. ?s math:notLessThan 50. } => { ?r :severity :Medium. }.
378
+ { ?r a :Risk; :score ?s. ?s math:lessThan 50. } => { ?r :severity :Low. }.
379
+
380
+ # -------------------------------------------------------------------------------------
381
+ # 5) Ranked risk list (highest->lowest) + explainable report
382
+ #
383
+ # Uses Eyeling:
384
+ # log:collectAllIn (findall-like list builder) :contentReference[oaicite:4]{index=4}
385
+ # list:sort / list:reverse / list:iterate :contentReference[oaicite:5]{index=5}
386
+ # log:outputString for printing in --strings :contentReference[oaicite:6]{index=6}
387
+ # -------------------------------------------------------------------------------------
388
+
389
+ # Header line
390
+ {
391
+ ?agreement a :Agreement; :label ?alabel.
392
+ ?profile a :ConsumerProfile; :label ?plabel.
393
+
394
+ ( "\n=== Risk report for %s (profile: %s) ===\n" ?alabel ?plabel ) string:format ?hdr.
395
+ }
396
+ =>
397
+ {
398
+ ( ?agreement ?profile 0 ) log:outputString ?hdr.
399
+ }.
400
+
401
+ # Produce ranked lines
402
+ {
403
+ ?agreement a :Agreement.
404
+ ?profile a :ConsumerProfile.
405
+
406
+ # Collect (score risk) pairs from the global snapshot at priority 1
407
+ ( ( ?score ?risk )
408
+ { ?risk a :Risk;
409
+ :aboutAgreement ?agreement;
410
+ :forProfile ?profile;
411
+ :score ?score. }
412
+ ?pairs
413
+ ) log:collectAllIn 1.
414
+
415
+ ?pairs list:sort ?sortedAsc.
416
+ ?sortedAsc list:reverse ?sortedDesc.
417
+
418
+ # Iterate over sorted pairs
419
+ ?sortedDesc list:iterate ( ?i ?pair ).
420
+ ( ?i 1 ) math:sum ?rank.
421
+
422
+ # Extract pair elements
423
+ ( ?pair 0 ) list:memberAt ?score.
424
+ ( ?pair 1 ) list:memberAt ?risk.
425
+
426
+ ?risk :severity ?sev;
427
+ :clauseId ?cid;
428
+ :title ?title;
429
+ :explanation ?why.
430
+
431
+ ( "%s) score=%s (%s), clause %s — %s. %s\n"
432
+ ?rank ?score ?sev ?cid ?title ?why
433
+ ) string:format ?line.
434
+ }
435
+ =>
436
+ {
437
+ ( ?agreement ?profile ?rank ) log:outputString ?line.
438
+ }.
439
+
@@ -0,0 +1,64 @@
1
+ @prefix : <https://example.org/agreement#> .
2
+ @prefix genid: <https://eyereasoner.github.io/.well-known/genid/> .
3
+ @prefix log: <http://www.w3.org/2000/10/swap/log#> .
4
+
5
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c a :Risk .
6
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :aboutAgreement :Agreement1 .
7
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :forProfile :ConsumerAlice .
8
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :aboutClause :ClauseC1 .
9
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :clauseId "C1" .
10
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :issue :UnilateralChangeNoNotice .
11
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :baseScore 80 .
12
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :needWeight 15 .
13
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :rawScore 95 .
14
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :title "Unilateral change without notice" .
15
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :explanation "This clause is risky because it allows unilateral changes without any prior notice. Clause C1: We may change these terms at any time. Continued use means acceptance." .
16
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :violatesNeed :Need_ChangeOnlyWithPriorNotice .
17
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 a :Risk .
18
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :aboutAgreement :Agreement1 .
19
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :forProfile :ConsumerAlice .
20
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :aboutClause :ClauseC2 .
21
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :clauseId "C2" .
22
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :issue :ProviderMayDeleteData .
23
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :baseScore 90 .
24
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :needWeight 20 .
25
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :rawScore 110 .
26
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :title "Provider can delete user data" .
27
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :explanation "This clause is risky because it allows the provider to remove (delete) the consumer’s data. Clause C2: We may delete your data at our discretion, with or without notice." .
28
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :violatesNeed :Need_DataNotRemoved .
29
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c a :Risk .
30
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :aboutAgreement :Agreement1 .
31
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :forProfile :ConsumerAlice .
32
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :aboutClause :ClauseC3 .
33
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :clauseId "C3" .
34
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :issue :ShareDataNoConsent .
35
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :baseScore 85 .
36
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :needWeight 10 .
37
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :rawScore 95 .
38
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :title "Data sharing without consent" .
39
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :explanation "This clause is risky because it permits data sharing without an explicit consent requirement. Clause C3: We may share your data with partners for any purpose." .
40
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :violatesNeed :Need_NoDataSharingWithoutConsent .
41
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac a :Risk .
42
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :aboutAgreement :Agreement1 .
43
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :forProfile :ConsumerAlice .
44
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :aboutClause :ClauseC4 .
45
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :clauseId "C4" .
46
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :issue :CourtAccessWaiver .
47
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :baseScore 60 .
48
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :needWeight 0 .
49
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :rawScore 60 .
50
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :title "Court access waiver / mandatory arbitration" .
51
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :explanation "This clause is risky because it restricts access to court (mandatory arbitration / waiver). Clause C4: You waive your right to go to court; disputes must be arbitrated." .
52
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :score 100 .
53
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :score 95 .
54
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :score 95 .
55
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :score 60 .
56
+ genid:9e402628-fc3c-e85a-350e-f368732d4b0c :severity :High .
57
+ genid:0d0c3c78-2199-4018-1033-0b0c76a92e40 :severity :High .
58
+ genid:ebe89ac4-7141-3050-6326-e52c9c7bc26c :severity :High .
59
+ genid:17ae61d8-580b-ff0e-b030-955c75047eac :severity :Medium .
60
+ (:Agreement1 :ConsumerAlice 0) log:outputString "\n=== Risk report for Example SaaS Agreement (profile: Alice (example consumer)) ===\n" .
61
+ (:Agreement1 :ConsumerAlice 1) log:outputString "1) score=100 (https://example.org/agreement#High), clause C2 — Provider can delete user data. This clause is risky because it allows the provider to remove (delete) the consumer’s data. Clause C2: We may delete your data at our discretion, with or without notice.\n" .
62
+ (:Agreement1 :ConsumerAlice 2) log:outputString "2) score=95 (https://example.org/agreement#High), clause C3 — Data sharing without consent. This clause is risky because it permits data sharing without an explicit consent requirement. Clause C3: We may share your data with partners for any purpose.\n" .
63
+ (:Agreement1 :ConsumerAlice 3) log:outputString "3) score=95 (https://example.org/agreement#High), clause C1 — Unilateral change without notice. This clause is risky because it allows unilateral changes without any prior notice. Clause C1: We may change these terms at any time. Continued use means acceptance.\n" .
64
+ (:Agreement1 :ConsumerAlice 4) log:outputString "4) score=60 (https://example.org/agreement#Medium), clause C4 — Court access waiver / mandatory arbitration. This clause is risky because it restricts access to court (mandatory arbitration / waiver). Clause C4: You waive your right to go to court; disputes must be arbitrated.\n" .
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eyeling",
3
- "version": "1.12.12",
3
+ "version": "1.12.13",
4
4
  "description": "A minimal Notation3 (N3) reasoner in JavaScript.",
5
5
  "main": "./index.js",
6
6
  "keywords": [