@rsconcept/rstool 1.9.0 → 2.0.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 (105) hide show
  1. package/README.md +3 -3
  2. package/dist/mappers/model-adapter.d.ts +1 -2
  3. package/dist/mappers/schema-adapter.d.ts +1 -2
  4. package/dist/mappers/types.d.ts +4 -5
  5. package/dist/models/rstool-agent.js +1 -2
  6. package/dist/session/session-store.d.ts +3 -3
  7. package/dist/session/session-store.js +1 -2
  8. package/dist/wrapper/client.d.ts +3 -4
  9. package/docs/BRIEF.md +93 -0
  10. package/docs/CONCEPTUAL-SCHEMA.md +16 -1
  11. package/docs/CONSTRUCTIONS.md +14 -2
  12. package/docs/DIAGNOSTICS.md +3 -2
  13. package/docs/DOMAIN.md +12 -0
  14. package/docs/METHOD.md +208 -0
  15. package/docs/PORTAL-API.md +38 -285
  16. package/docs/PORTAL-MODELS.md +24 -0
  17. package/docs/PORTAL-OSS.md +56 -0
  18. package/docs/PORTAL-PUBLISH.md +39 -0
  19. package/docs/PORTAL-READ.md +301 -0
  20. package/docs/README.md +7 -4
  21. package/docs/REQUIREMENTS.md +61 -0
  22. package/docs/SYNTAX.md +4 -3
  23. package/docs/TYPIFICATION.md +1 -1
  24. package/docs/brief.schema.json +173 -0
  25. package/examples/README.md +16 -2
  26. package/examples/access-control/NOTES.md +23 -0
  27. package/examples/access-control/anti/collapsed.json +439 -0
  28. package/examples/access-control/anti/weakened.json +439 -0
  29. package/examples/access-control/brief-v1.json +231 -0
  30. package/examples/access-control/brief.json +310 -0
  31. package/examples/access-control/build-rsform.ts +151 -0
  32. package/examples/access-control/requirements-v1.md +9 -0
  33. package/examples/access-control/requirements-v2.md +4 -0
  34. package/examples/access-control/rsform-session-v1.json +439 -0
  35. package/examples/access-control/rsform-session.json +523 -0
  36. package/examples/audit-diagnostics.ts +9 -1
  37. package/examples/briefs.test.ts +126 -0
  38. package/examples/clinic-booking/NOTES.md +24 -0
  39. package/examples/clinic-booking/anti/collapsed.json +615 -0
  40. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  41. package/examples/clinic-booking/brief-v1.json +332 -0
  42. package/examples/clinic-booking/brief.json +405 -0
  43. package/examples/clinic-booking/build-rsform.ts +174 -0
  44. package/examples/clinic-booking/requirements-v1.md +9 -0
  45. package/examples/clinic-booking/requirements-v2.md +4 -0
  46. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  47. package/examples/clinic-booking/rsform-session.json +700 -0
  48. package/examples/diagnostics-utils.ts +26 -0
  49. package/examples/kinship/brief.json +337 -0
  50. package/examples/kinship/build-rsform.ts +7 -4
  51. package/examples/kinship/rsform-session.json +20 -63
  52. package/examples/kinship/rsmodel-session.json +14 -14
  53. package/examples/kinship-subordination/NOTES.md +49 -0
  54. package/examples/kinship-subordination/brief.json +161 -0
  55. package/examples/kinship-subordination/build-rsform.ts +100 -0
  56. package/examples/kinship-subordination/rsform-session.json +795 -0
  57. package/examples/library-loans/NOTES.md +46 -0
  58. package/examples/library-loans/anti/collapsed.json +481 -0
  59. package/examples/library-loans/anti/species-as-genus.json +334 -0
  60. package/examples/library-loans/anti/uncovered.json +406 -0
  61. package/examples/library-loans/anti/weakened.json +464 -0
  62. package/examples/library-loans/brief-v1.json +340 -0
  63. package/examples/library-loans/brief.json +502 -0
  64. package/examples/library-loans/build-rsform.ts +239 -0
  65. package/examples/library-loans/requirements-v1.md +11 -0
  66. package/examples/library-loans/requirements-v2.md +5 -0
  67. package/examples/library-loans/rsform-session-v1.json +481 -0
  68. package/examples/library-loans/rsform-session.json +652 -0
  69. package/examples/library-loans/source-markup.md +18 -0
  70. package/examples/movd/brief.json +220 -0
  71. package/examples/movd/build-rsform.ts +5 -2
  72. package/examples/movd/rsform-session.json +14 -46
  73. package/examples/subordination/NOTES.md +59 -0
  74. package/examples/subordination/anti/collapsed.json +556 -0
  75. package/examples/subordination/anti/single-relation.json +125 -0
  76. package/examples/subordination/anti/transitive.json +573 -0
  77. package/examples/subordination/anti/weakened.json +539 -0
  78. package/examples/subordination/brief.json +386 -0
  79. package/examples/subordination/build-rsform.ts +63 -0
  80. package/examples/subordination/constants.ts +115 -0
  81. package/examples/subordination/rsform-session.json +556 -0
  82. package/examples/subordination/source-markup.md +19 -0
  83. package/examples/subordination/source.md +40 -0
  84. package/package.json +18 -10
  85. package/skills/INSTALL.md +28 -29
  86. package/skills/README.md +25 -10
  87. package/skills/rs-core/SKILL.md +56 -0
  88. package/skills/rs-explain/SKILL.md +28 -0
  89. package/skills/rs-explicate/SKILL.md +71 -0
  90. package/skills/rs-interpret/SKILL.md +67 -0
  91. package/skills/rs-portal/SKILL.md +51 -0
  92. package/skills/rs-review/SKILL.md +79 -0
  93. package/skills/rs-scope/SKILL.md +67 -0
  94. package/skills/rs-synthesis/SKILL.md +52 -0
  95. package/skills/rstool/SKILL.md +70 -0
  96. package/skills/rstool-helper/GUIDE.md +18 -299
  97. package/skills/rstool-helper/SKILL.md +8 -58
  98. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +16 -12
  99. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +7 -5
  100. package/skills/rstool-runtime/SKILL.md +96 -0
  101. package/skills/scripts/brief-check.test.ts +165 -0
  102. package/skills/scripts/brief-check.ts +826 -0
  103. package/skills/scripts/check-brief.ts +94 -0
  104. package/skills/scripts/rstool-skills.mjs +119 -0
  105. package/skills/scripts/skill-stubs.test.ts +48 -0
@@ -0,0 +1,439 @@
1
+ {
2
+ "contractVersion": "3.3.0",
3
+ "state": {
4
+ "sessionId": "df70b738-a08e-4810-89ea-971f3a19e2e0",
5
+ "alias": "RBAC",
6
+ "title": "Ролевой доступ",
7
+ "comment": "Ролевое управление доступом. Эксплицировать роли, иерархию и эффективные права для проектирования подсистемы доступа и проверок при назначении ролей.\nL1. Исключено: журнал изменений и сроки хранения (п. 6); невыразимо: кто и когда выдал право, права на прошлую дату.\nL2. Исключено: аутентификация (п. 7); невыразимо: способ входа, учётная запись SSO.\nL3. Исключено: ресурсы как объекты: право — неделимый элемент; невыразимо: права на конкретный документ.\nDC1. иерархия ролей: отношение S3 — п. 2; роль может входить в несколько старших — дерево избыточно ограничивает.\nDC2. права пользователя: вывод через роли (F5, F6) — права пользователя не задаются отдельно — иначе разойдутся с ролями.\nDC3. разделение обязанностей: по эффективным ролям (A2) — п. 4: «в том числе через иерархию».\nDC4. симметричность несовместимости: без аксиомы — A2 запрещает пару в любом порядке; достаточно записать пару один раз.\nDC5. ацикличность иерархии: аксиома A1 через замыкание F1 — п. 2.",
8
+ "createdAt": "2026-10-25T18:34:35.417Z",
9
+ "updatedAt": "2026-10-25T18:34:35.437Z",
10
+ "revisions": [
11
+ {
12
+ "revisionId": "05d1b5e3-3960-4eec-9cfb-addc8c423709",
13
+ "at": "2026-10-25T18:34:35.437Z",
14
+ "message": "Ролевой доступ: шаг 1"
15
+ }
16
+ ],
17
+ "items": [
18
+ {
19
+ "id": 1,
20
+ "alias": "X1",
21
+ "cstType": "basic",
22
+ "definitionFormal": "",
23
+ "term": "пользователи",
24
+ "definitionText": "",
25
+ "convention": "Учётные записи пользователей системы.",
26
+ "analysis": {
27
+ "success": true,
28
+ "type": {
29
+ "typeID": 5,
30
+ "base": {
31
+ "typeID": 3,
32
+ "baseID": "X1"
33
+ }
34
+ },
35
+ "valueClass": "value",
36
+ "diagnostics": []
37
+ }
38
+ },
39
+ {
40
+ "id": 2,
41
+ "alias": "X2",
42
+ "cstType": "basic",
43
+ "definitionFormal": "",
44
+ "term": "роли",
45
+ "definitionText": "",
46
+ "convention": "Роли доступа (администратор, редактор, …).",
47
+ "analysis": {
48
+ "success": true,
49
+ "type": {
50
+ "typeID": 5,
51
+ "base": {
52
+ "typeID": 3,
53
+ "baseID": "X2"
54
+ }
55
+ },
56
+ "valueClass": "value",
57
+ "diagnostics": []
58
+ }
59
+ },
60
+ {
61
+ "id": 3,
62
+ "alias": "X3",
63
+ "cstType": "basic",
64
+ "definitionFormal": "",
65
+ "term": "права",
66
+ "definitionText": "",
67
+ "convention": "Элементарные права: действие над видом ресурса (чтение документов, …).",
68
+ "analysis": {
69
+ "success": true,
70
+ "type": {
71
+ "typeID": 5,
72
+ "base": {
73
+ "typeID": 3,
74
+ "baseID": "X3"
75
+ }
76
+ },
77
+ "valueClass": "value",
78
+ "diagnostics": []
79
+ }
80
+ },
81
+ {
82
+ "id": 4,
83
+ "alias": "S1",
84
+ "cstType": "structure",
85
+ "definitionFormal": "ℬ(X1×X2)",
86
+ "term": "назначения ролей",
87
+ "definitionText": "",
88
+ "convention": "Пара (пользователь, роль): роль назначена пользователю напрямую.",
89
+ "analysis": {
90
+ "success": true,
91
+ "type": {
92
+ "typeID": 5,
93
+ "base": {
94
+ "typeID": 4,
95
+ "factors": [
96
+ {
97
+ "typeID": 3,
98
+ "baseID": "X1"
99
+ },
100
+ {
101
+ "typeID": 3,
102
+ "baseID": "X2"
103
+ }
104
+ ]
105
+ }
106
+ },
107
+ "valueClass": "value",
108
+ "diagnostics": []
109
+ }
110
+ },
111
+ {
112
+ "id": 5,
113
+ "alias": "S2",
114
+ "cstType": "structure",
115
+ "definitionFormal": "ℬ(X2×X3)",
116
+ "term": "права роли",
117
+ "definitionText": "",
118
+ "convention": "Пара (роль, право): право дано роли напрямую.",
119
+ "analysis": {
120
+ "success": true,
121
+ "type": {
122
+ "typeID": 5,
123
+ "base": {
124
+ "typeID": 4,
125
+ "factors": [
126
+ {
127
+ "typeID": 3,
128
+ "baseID": "X2"
129
+ },
130
+ {
131
+ "typeID": 3,
132
+ "baseID": "X3"
133
+ }
134
+ ]
135
+ }
136
+ },
137
+ "valueClass": "value",
138
+ "diagnostics": []
139
+ }
140
+ },
141
+ {
142
+ "id": 6,
143
+ "alias": "S3",
144
+ "cstType": "structure",
145
+ "definitionFormal": "ℬ(X2×X2)",
146
+ "term": "иерархия ролей",
147
+ "definitionText": "",
148
+ "convention": "Пара (старшая, младшая): старшая роль включает права младшей.",
149
+ "analysis": {
150
+ "success": true,
151
+ "type": {
152
+ "typeID": 5,
153
+ "base": {
154
+ "typeID": 4,
155
+ "factors": [
156
+ {
157
+ "typeID": 3,
158
+ "baseID": "X2"
159
+ },
160
+ {
161
+ "typeID": 3,
162
+ "baseID": "X2"
163
+ }
164
+ ]
165
+ }
166
+ },
167
+ "valueClass": "value",
168
+ "diagnostics": []
169
+ }
170
+ },
171
+ {
172
+ "id": 7,
173
+ "alias": "S4",
174
+ "cstType": "structure",
175
+ "definitionFormal": "ℬ(X2×X2)",
176
+ "term": "несовместимые роли",
177
+ "definitionText": "",
178
+ "convention": "Пара ролей, которые нельзя иметь одному пользователю (разделение обязанностей).",
179
+ "analysis": {
180
+ "success": true,
181
+ "type": {
182
+ "typeID": 5,
183
+ "base": {
184
+ "typeID": 4,
185
+ "factors": [
186
+ {
187
+ "typeID": 3,
188
+ "baseID": "X2"
189
+ },
190
+ {
191
+ "typeID": 3,
192
+ "baseID": "X2"
193
+ }
194
+ ]
195
+ }
196
+ },
197
+ "valueClass": "value",
198
+ "diagnostics": []
199
+ }
200
+ },
201
+ {
202
+ "id": 8,
203
+ "alias": "F1",
204
+ "cstType": "function",
205
+ "definitionFormal": "[ρ∈X2] R{σ:=Pr2(Fi1[{ρ}](S3)) | σ∪Pr2(Fi1[σ](S3))}",
206
+ "term": "младшие роли",
207
+ "definitionText": "Роли, которые данная роль включает напрямую или через цепочку.",
208
+ "convention": "",
209
+ "analysis": {
210
+ "success": true,
211
+ "type": {
212
+ "typeID": 7,
213
+ "result": {
214
+ "typeID": 5,
215
+ "base": {
216
+ "typeID": 3,
217
+ "baseID": "X2"
218
+ }
219
+ },
220
+ "args": [
221
+ {
222
+ "alias": "ρ",
223
+ "type": {
224
+ "typeID": 3,
225
+ "baseID": "X2"
226
+ }
227
+ }
228
+ ]
229
+ },
230
+ "valueClass": "value",
231
+ "diagnostics": []
232
+ }
233
+ },
234
+ {
235
+ "id": 9,
236
+ "alias": "F2",
237
+ "cstType": "function",
238
+ "definitionFormal": "[ξ∈X1] Pr2(Fi1[{ξ}](S1))",
239
+ "term": "прямые роли",
240
+ "definitionText": "Роли, назначенные пользователю напрямую.",
241
+ "convention": "",
242
+ "analysis": {
243
+ "success": true,
244
+ "type": {
245
+ "typeID": 7,
246
+ "result": {
247
+ "typeID": 5,
248
+ "base": {
249
+ "typeID": 3,
250
+ "baseID": "X2"
251
+ }
252
+ },
253
+ "args": [
254
+ {
255
+ "alias": "ξ",
256
+ "type": {
257
+ "typeID": 3,
258
+ "baseID": "X1"
259
+ }
260
+ }
261
+ ]
262
+ },
263
+ "valueClass": "value",
264
+ "diagnostics": []
265
+ }
266
+ },
267
+ {
268
+ "id": 10,
269
+ "alias": "F3",
270
+ "cstType": "function",
271
+ "definitionFormal": "[ξ∈X1] red(I{F1[ρ] | ρ:∈F2[ξ]})\\F2[ξ]",
272
+ "term": "унаследованные роли",
273
+ "definitionText": "Роли, которые пользователь получает только через иерархию.",
274
+ "convention": "",
275
+ "analysis": {
276
+ "success": true,
277
+ "type": {
278
+ "typeID": 7,
279
+ "result": {
280
+ "typeID": 5,
281
+ "base": {
282
+ "typeID": 3,
283
+ "baseID": "X2"
284
+ }
285
+ },
286
+ "args": [
287
+ {
288
+ "alias": "ξ",
289
+ "type": {
290
+ "typeID": 3,
291
+ "baseID": "X1"
292
+ }
293
+ }
294
+ ]
295
+ },
296
+ "valueClass": "value",
297
+ "diagnostics": []
298
+ }
299
+ },
300
+ {
301
+ "id": 11,
302
+ "alias": "F4",
303
+ "cstType": "function",
304
+ "definitionFormal": "[ξ∈X1] F2[ξ]∪F3[ξ]",
305
+ "term": "эффективные роли",
306
+ "definitionText": "Прямые и унаследованные роли пользователя.",
307
+ "convention": "",
308
+ "analysis": {
309
+ "success": true,
310
+ "type": {
311
+ "typeID": 7,
312
+ "result": {
313
+ "typeID": 5,
314
+ "base": {
315
+ "typeID": 3,
316
+ "baseID": "X2"
317
+ }
318
+ },
319
+ "args": [
320
+ {
321
+ "alias": "ξ",
322
+ "type": {
323
+ "typeID": 3,
324
+ "baseID": "X1"
325
+ }
326
+ }
327
+ ]
328
+ },
329
+ "valueClass": "value",
330
+ "diagnostics": []
331
+ }
332
+ },
333
+ {
334
+ "id": 12,
335
+ "alias": "F5",
336
+ "cstType": "function",
337
+ "definitionFormal": "[ξ∈X1] Pr2(Fi1[F2[ξ]](S2))",
338
+ "term": "назначенные права",
339
+ "definitionText": "Права прямых ролей пользователя.",
340
+ "convention": "",
341
+ "analysis": {
342
+ "success": true,
343
+ "type": {
344
+ "typeID": 7,
345
+ "result": {
346
+ "typeID": 5,
347
+ "base": {
348
+ "typeID": 3,
349
+ "baseID": "X3"
350
+ }
351
+ },
352
+ "args": [
353
+ {
354
+ "alias": "ξ",
355
+ "type": {
356
+ "typeID": 3,
357
+ "baseID": "X1"
358
+ }
359
+ }
360
+ ]
361
+ },
362
+ "valueClass": "value",
363
+ "diagnostics": []
364
+ }
365
+ },
366
+ {
367
+ "id": 13,
368
+ "alias": "F6",
369
+ "cstType": "function",
370
+ "definitionFormal": "[ξ∈X1] Pr2(Fi1[F4[ξ]](S2))",
371
+ "term": "эффективные права",
372
+ "definitionText": "Права всех ролей пользователя, включая унаследованные.",
373
+ "convention": "",
374
+ "analysis": {
375
+ "success": true,
376
+ "type": {
377
+ "typeID": 7,
378
+ "result": {
379
+ "typeID": 5,
380
+ "base": {
381
+ "typeID": 3,
382
+ "baseID": "X3"
383
+ }
384
+ },
385
+ "args": [
386
+ {
387
+ "alias": "ξ",
388
+ "type": {
389
+ "typeID": 3,
390
+ "baseID": "X1"
391
+ }
392
+ }
393
+ ]
394
+ },
395
+ "valueClass": "value",
396
+ "diagnostics": []
397
+ }
398
+ },
399
+ {
400
+ "id": 14,
401
+ "alias": "A1",
402
+ "cstType": "axiom",
403
+ "definitionFormal": "∀ρ∈X2 ρ∉F1[ρ]",
404
+ "term": "иерархия без циклов",
405
+ "definitionText": "Роль не включает саму себя ни напрямую, ни через цепочку.",
406
+ "convention": "",
407
+ "analysis": {
408
+ "success": true,
409
+ "type": {
410
+ "typeID": 6
411
+ },
412
+ "valueClass": "value",
413
+ "diagnostics": []
414
+ }
415
+ },
416
+ {
417
+ "id": 15,
418
+ "alias": "A2",
419
+ "cstType": "axiom",
420
+ "definitionFormal": "∀ξ∈X1 ∀(α,β)∈S4 ¬(α∈F4[ξ] & β∈F4[ξ])",
421
+ "term": "разделение обязанностей",
422
+ "definitionText": "Ни у одного пользователя нет обеих ролей несовместимой пары, в том числе через иерархию.",
423
+ "convention": "",
424
+ "analysis": {
425
+ "success": true,
426
+ "type": {
427
+ "typeID": 6
428
+ },
429
+ "valueClass": "value",
430
+ "diagnostics": []
431
+ }
432
+ }
433
+ ],
434
+ "model": {
435
+ "items": []
436
+ }
437
+ },
438
+ "diagnostics": []
439
+ }