@rsconcept/rstool 1.7.1 → 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 (126) hide show
  1. package/README.md +7 -7
  2. package/dist/index.js +1 -1
  3. package/dist/mappers/model-adapter.d.ts +6 -2
  4. package/dist/mappers/model-adapter.js +28 -3
  5. package/dist/mappers/model-adapter.js.map +1 -1
  6. package/dist/mappers/schema-adapter.d.ts +1 -2
  7. package/dist/mappers/schema-adapter.js +1 -1
  8. package/dist/mappers/types.d.ts +4 -5
  9. package/dist/models/index.js +1 -1
  10. package/dist/models/rstool-agent.js +1 -2
  11. package/dist/{models-DG2uTaV_.js → models-D06g8LId.js} +6 -5
  12. package/dist/{models-DG2uTaV_.js.map → models-D06g8LId.js.map} +1 -1
  13. package/dist/{rsform-builder-DKwZfJvN.js → rsform-builder-BlXEe5Ow.js} +2 -2
  14. package/dist/{rsform-builder-DKwZfJvN.js.map → rsform-builder-BlXEe5Ow.js.map} +1 -1
  15. package/dist/session/session-store.d.ts +3 -3
  16. package/dist/session/session-store.js +1 -2
  17. package/dist/wrapper/client.d.ts +15 -9
  18. package/dist/wrapper/client.js +79 -12
  19. package/dist/wrapper/client.js.map +1 -1
  20. package/dist/wrapper/stdio-wrapper.d.ts +1 -1
  21. package/dist/wrapper/stdio-wrapper.js +18 -10
  22. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  23. package/docs/BRIEF.md +93 -0
  24. package/docs/CONCEPTUAL-SCHEMA.md +17 -2
  25. package/docs/CONSTRUCTIONS.md +384 -0
  26. package/docs/DIAGNOSTICS.md +9 -8
  27. package/docs/DOMAIN.md +12 -0
  28. package/docs/METHOD.md +208 -0
  29. package/docs/MODEL-TESTING.md +48 -0
  30. package/docs/PORTAL-API.md +38 -285
  31. package/docs/PORTAL-MODELS.md +24 -0
  32. package/docs/PORTAL-OSS.md +56 -0
  33. package/docs/PORTAL-PUBLISH.md +39 -0
  34. package/docs/PORTAL-READ.md +301 -0
  35. package/docs/README.md +8 -4
  36. package/docs/REQUIREMENTS.md +61 -0
  37. package/docs/SYNTAX.md +5 -4
  38. package/docs/TYPIFICATION.md +12 -3
  39. package/docs/brief.schema.json +173 -0
  40. package/examples/README.md +16 -2
  41. package/examples/access-control/NOTES.md +23 -0
  42. package/examples/access-control/anti/collapsed.json +439 -0
  43. package/examples/access-control/anti/weakened.json +439 -0
  44. package/examples/access-control/brief-v1.json +231 -0
  45. package/examples/access-control/brief.json +310 -0
  46. package/examples/access-control/build-rsform.ts +151 -0
  47. package/examples/access-control/requirements-v1.md +9 -0
  48. package/examples/access-control/requirements-v2.md +4 -0
  49. package/examples/access-control/rsform-session-v1.json +439 -0
  50. package/examples/access-control/rsform-session.json +523 -0
  51. package/examples/audit-diagnostics.ts +9 -1
  52. package/examples/briefs.test.ts +126 -0
  53. package/examples/clinic-booking/NOTES.md +24 -0
  54. package/examples/clinic-booking/anti/collapsed.json +615 -0
  55. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  56. package/examples/clinic-booking/brief-v1.json +332 -0
  57. package/examples/clinic-booking/brief.json +405 -0
  58. package/examples/clinic-booking/build-rsform.ts +174 -0
  59. package/examples/clinic-booking/requirements-v1.md +9 -0
  60. package/examples/clinic-booking/requirements-v2.md +4 -0
  61. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  62. package/examples/clinic-booking/rsform-session.json +700 -0
  63. package/examples/diagnostics-utils.ts +26 -0
  64. package/examples/kinship/brief.json +337 -0
  65. package/examples/kinship/build-rsform.ts +7 -4
  66. package/examples/kinship/rsform-session.json +20 -63
  67. package/examples/kinship/rsmodel-session.json +14 -14
  68. package/examples/kinship-subordination/NOTES.md +49 -0
  69. package/examples/kinship-subordination/brief.json +161 -0
  70. package/examples/kinship-subordination/build-rsform.ts +100 -0
  71. package/examples/kinship-subordination/rsform-session.json +795 -0
  72. package/examples/library-loans/NOTES.md +46 -0
  73. package/examples/library-loans/anti/collapsed.json +481 -0
  74. package/examples/library-loans/anti/species-as-genus.json +334 -0
  75. package/examples/library-loans/anti/uncovered.json +406 -0
  76. package/examples/library-loans/anti/weakened.json +464 -0
  77. package/examples/library-loans/brief-v1.json +340 -0
  78. package/examples/library-loans/brief.json +502 -0
  79. package/examples/library-loans/build-rsform.ts +239 -0
  80. package/examples/library-loans/requirements-v1.md +11 -0
  81. package/examples/library-loans/requirements-v2.md +5 -0
  82. package/examples/library-loans/rsform-session-v1.json +481 -0
  83. package/examples/library-loans/rsform-session.json +652 -0
  84. package/examples/library-loans/source-markup.md +18 -0
  85. package/examples/movd/brief.json +220 -0
  86. package/examples/movd/build-rsform.ts +5 -2
  87. package/examples/movd/rsform-session.json +14 -46
  88. package/examples/subordination/NOTES.md +59 -0
  89. package/examples/subordination/anti/collapsed.json +556 -0
  90. package/examples/subordination/anti/single-relation.json +125 -0
  91. package/examples/subordination/anti/transitive.json +573 -0
  92. package/examples/subordination/anti/weakened.json +539 -0
  93. package/examples/subordination/brief.json +386 -0
  94. package/examples/subordination/build-rsform.ts +63 -0
  95. package/examples/subordination/constants.ts +115 -0
  96. package/examples/subordination/rsform-session.json +556 -0
  97. package/examples/subordination/source-markup.md +19 -0
  98. package/examples/subordination/source.md +40 -0
  99. package/package.json +29 -20
  100. package/skills/INSTALL.md +28 -29
  101. package/skills/README.md +25 -10
  102. package/skills/rs-core/SKILL.md +56 -0
  103. package/skills/rs-explain/SKILL.md +28 -0
  104. package/skills/rs-explicate/SKILL.md +71 -0
  105. package/skills/rs-interpret/SKILL.md +67 -0
  106. package/skills/rs-portal/SKILL.md +51 -0
  107. package/skills/rs-review/SKILL.md +79 -0
  108. package/skills/rs-scope/SKILL.md +67 -0
  109. package/skills/rs-synthesis/SKILL.md +52 -0
  110. package/skills/rstool/SKILL.md +70 -0
  111. package/skills/rstool-helper/GUIDE.md +18 -272
  112. package/skills/rstool-helper/SKILL.md +8 -55
  113. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +40 -12
  114. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +28 -7
  115. package/skills/rstool-runtime/SKILL.md +96 -0
  116. package/skills/scripts/brief-check.test.ts +165 -0
  117. package/skills/scripts/brief-check.ts +826 -0
  118. package/skills/scripts/check-brief.ts +94 -0
  119. package/skills/scripts/rstool-skills.mjs +119 -0
  120. package/skills/scripts/skill-stubs.test.ts +48 -0
  121. package/src/mappers/model-adapter.ts +34 -1
  122. package/src/models/rstool-agent.test.ts +95 -0
  123. package/src/wrapper/client.test.ts +43 -4
  124. package/src/wrapper/client.ts +95 -16
  125. package/src/wrapper/stdio-handler.test.ts +43 -0
  126. package/src/wrapper/stdio-handler.ts +19 -5
@@ -0,0 +1,173 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://portal.acconcept.ru/schemas/rstool/brief-v1.json",
4
+ "title": "Бриф концептуальной схемы",
5
+ "description": "Постановка задачи концептуализации, журнал решений и исполнимые сценарии. Один формат для файла задачи, сессии rstool и Portal. Описание полей — docs/BRIEF.md.",
6
+ "type": "object",
7
+ "required": ["version", "status", "approach", "object", "task", "expressiveness"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "version": { "const": 1 },
11
+ "status": {
12
+ "enum": ["draft", "assumed", "confirmed"],
13
+ "description": "draft — составляется; assumed — пользователя спросить нельзя, ответы записаны в assumptions; confirmed — пользователь подтвердил бриф"
14
+ },
15
+ "approach": {
16
+ "enum": ["research", "education", "project"],
17
+ "description": "research — экспликация (исследовательский подход); education — обучение; project — основа для ПО / ОСС (проектный подход)"
18
+ },
19
+ "object": { "type": "string", "minLength": 1, "description": "Объект исследования" },
20
+ "task": { "type": "string", "minLength": 1, "description": "Задача, ради которой строится схема, и точка зрения" },
21
+ "source": { "type": "string", "description": "Источник: документ, разделы, ссылка на схему Portal" },
22
+ "restrictions": {
23
+ "type": "array",
24
+ "description": "Ограничения предметной области: что сознательно исключено и какие понятия из-за этого невыразимы",
25
+ "items": {
26
+ "type": "object",
27
+ "required": ["id", "excludes"],
28
+ "additionalProperties": false,
29
+ "properties": {
30
+ "id": { "type": "string", "pattern": "^L[0-9]+$" },
31
+ "excludes": { "type": "string", "minLength": 1 },
32
+ "inexpressible": { "type": "array", "items": { "type": "string" } }
33
+ }
34
+ }
35
+ },
36
+ "expressiveness": {
37
+ "type": "array",
38
+ "description": "Требования к выразительным средствам: понятия, которые схема обязана выразить",
39
+ "items": {
40
+ "type": "object",
41
+ "required": ["id", "concept", "constituent"],
42
+ "additionalProperties": false,
43
+ "properties": {
44
+ "id": { "type": "string", "pattern": "^E[0-9]+$" },
45
+ "concept": { "type": "string", "minLength": 1 },
46
+ "ref": { "type": "string", "description": "Место в источнике" },
47
+ "via": {
48
+ "type": "string",
49
+ "description": "Этап 2: одна строка — как требование выразится через ядро"
50
+ },
51
+ "constituent": {
52
+ "type": ["string", "null"],
53
+ "description": "Имя конституенты, которая выражает требование; null — ещё не выполнено"
54
+ }
55
+ }
56
+ }
57
+ },
58
+ "distinctions": {
59
+ "type": "array",
60
+ "description": "Различения: понятия, которые в запросе смешаны или легко смешиваются, а схема должна развести",
61
+ "items": {
62
+ "type": "object",
63
+ "required": ["id", "between"],
64
+ "additionalProperties": false,
65
+ "properties": {
66
+ "id": { "type": "string", "pattern": "^V[0-9]+$" },
67
+ "between": {
68
+ "type": "array",
69
+ "minItems": 2,
70
+ "maxItems": 2,
71
+ "items": { "type": "string" },
72
+ "description": "Два id требований (E#) или два имени конституент"
73
+ },
74
+ "text": { "type": "string" },
75
+ "witness": { "type": ["string", "null"], "description": "Сценарий, на котором значения различаются" }
76
+ }
77
+ }
78
+ },
79
+ "invariants": {
80
+ "type": "array",
81
+ "description": "Правила и ограничения, которые схема должна выражать",
82
+ "items": {
83
+ "type": "object",
84
+ "required": ["id", "text", "constituent"],
85
+ "additionalProperties": false,
86
+ "properties": {
87
+ "id": { "type": "string", "pattern": "^I[0-9]+$" },
88
+ "text": { "type": "string", "minLength": 1 },
89
+ "ref": { "type": "string" },
90
+ "constituent": { "type": ["string", "null"], "description": "Аксиома (A#), которая выражает правило" },
91
+ "positive": { "type": ["string", "null"], "description": "Сценарий, где правило выполнено" },
92
+ "negative": { "type": ["string", "null"], "description": "Сценарий, где правило нарушено" }
93
+ }
94
+ }
95
+ },
96
+ "decisions": {
97
+ "type": "array",
98
+ "description": "Журнал решений: выбор ядра, свойства отношений, наличие и отсутствие аксиом",
99
+ "items": {
100
+ "type": "object",
101
+ "required": ["id", "topic", "choice", "rationale"],
102
+ "additionalProperties": false,
103
+ "properties": {
104
+ "id": { "type": "string", "pattern": "^DC[0-9]+$" },
105
+ "topic": { "type": "string", "minLength": 1 },
106
+ "alternatives": { "type": "array", "items": { "type": "string" } },
107
+ "choice": { "type": "string", "minLength": 1 },
108
+ "rationale": { "type": "string", "minLength": 1 },
109
+ "supersedes": { "type": "string", "pattern": "^DC[0-9]+$", "description": "Решение, которое отменяется этим" }
110
+ }
111
+ }
112
+ },
113
+ "scenarios": {
114
+ "type": "array",
115
+ "description": "Маленькие интерпретации с ожиданиями: примеры и контрпримеры",
116
+ "items": {
117
+ "type": "object",
118
+ "required": ["id", "title", "values", "expect"],
119
+ "additionalProperties": false,
120
+ "properties": {
121
+ "id": { "type": "string", "pattern": "^SC[0-9]+$" },
122
+ "title": { "type": "string" },
123
+ "base": {
124
+ "type": "string",
125
+ "pattern": "^SC[0-9]+$",
126
+ "description": "Сценарий, значения которого наследуются"
127
+ },
128
+ "values": {
129
+ "type": "object",
130
+ "description": "Имя неопределяемого понятия → значение подписями элементов (X#/C#: массив подписей; S#: вложенные массивы подписей и целых)",
131
+ "additionalProperties": true
132
+ },
133
+ "expect": {
134
+ "type": "array",
135
+ "minItems": 1,
136
+ "items": {
137
+ "type": "object",
138
+ "additionalProperties": false,
139
+ "properties": {
140
+ "of": { "type": "string", "description": "Имя конституенты (D#, A#, T#)" },
141
+ "expr": { "type": "string", "description": "Выражение ЯРЭ вместо конституенты" },
142
+ "value": { "description": "Ожидаемое значение подписями" },
143
+ "holds": { "type": "boolean", "description": "Для A#/T# и логических выражений" },
144
+ "contains": { "type": "array", "description": "Элементы, которые должны входить в значение" },
145
+ "excludes": { "type": "array", "description": "Элементы, которые не должны входить в значение" },
146
+ "note": { "type": "string" }
147
+ },
148
+ "oneOf": [{ "required": ["of"] }, { "required": ["expr"] }]
149
+ }
150
+ }
151
+ }
152
+ }
153
+ },
154
+ "questions": {
155
+ "type": "array",
156
+ "description": "Вопросы пользователю: раунд 1 (постановка) и раунд 2 (решения по ядру)",
157
+ "items": {
158
+ "type": "object",
159
+ "required": ["round", "text"],
160
+ "additionalProperties": false,
161
+ "properties": {
162
+ "round": { "enum": [1, 2] },
163
+ "text": { "type": "string" },
164
+ "proposed": { "type": "string", "description": "Ответ, предложенный агентом" },
165
+ "consequence": { "type": "string", "description": "Что станет выразимо или невыразимо" },
166
+ "answer": { "type": ["string", "null"] }
167
+ }
168
+ }
169
+ },
170
+ "assumptions": { "type": "array", "items": { "type": "string" } },
171
+ "openQuestions": { "type": "array", "items": { "type": "string" } }
172
+ }
173
+ }
@@ -1,8 +1,8 @@
1
1
  # Примеры rstool
2
2
 
3
- Полные исполняемые сценарии поверх `RSToolWrapperClient` (stdio-обёртка) и готовые JSON-сессии для импорта. Короткие фрагменты кода для агентов — в [`../skills/rstool-helper/EXAMPLES.md`](../skills/rstool-helper/EXAMPLES.md); воркфлоу — [`../skills/rstool-helper/GUIDE.md`](../skills/rstool-helper/GUIDE.md).
3
+ Полные исполняемые сценарии поверх `RSToolWrapperClient` (stdio-обёртка) и готовые JSON-сессии для импорта. Короткие фрагменты кода для агентов — в [`../skills/rstool-runtime/EXAMPLES.md`](../skills/rstool-runtime/EXAMPLES.md); процесс работы — [`../skills/rstool/SKILL.md`](../skills/rstool/SKILL.md).
4
4
 
5
- **Агентам:** не добавляйте сюда разовые `build-*.ts` и папки по текущей задаче пользователя. Артефакты и скрипты — вне `rsconcept/rstool/` (см. «Границы правок» в GUIDE). В `examples/` — только сопровождаемые демо пакета.
5
+ **Агентам:** не добавляйте сюда разовые `build-*.ts` и папки по текущей задаче пользователя. Артефакты и скрипты — вне `rsconcept/rstool/` (см. «Границы правок» в `../skills/rstool/SKILL.md`). В `examples/` — только сопровождаемые демо пакета.
6
6
 
7
7
  ## Как запускать
8
8
 
@@ -60,6 +60,20 @@ npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
60
60
  - `build-rsform` скрипт: `example:build-template-apply-schema` (сборка + проверка на модели в скрипте)
61
61
  - только `rsform-session.json`
62
62
 
63
+ - **[`subordination/`](subordination/):**
64
+ - «Начальники и подчинённые» — учебная микротеория по методу (`docs/METHOD.md`): источник, расчистка, бриф с журналом решений и сценариями, антипримеры `anti/`, разбор `NOTES.md`
65
+ - `build-rsform` скрипт: `example:build-subordination-schema`
66
+
67
+ - **[`kinship-subordination/`](kinship-subordination/):**
68
+ - синтез родства и подчинения с синтетической аксиомой конфликта интересов
69
+ - `build-rsform` скрипт: `example:build-kinship-subordination-schema`
70
+
71
+ - **[`library-loans/`](library-loans/), [`access-control/`](access-control/), [`clinic-booking/`](clinic-booking/):**
72
+ - требования к ПО v1 и запрос на изменение v2: бриф каждой версии (`brief-v1.json`, `brief.json`), сессии v1 и v2, антипримеры `anti/`, разбор `NOTES.md` ([`docs/REQUIREMENTS.md`](../docs/REQUIREMENTS.md))
73
+ - `build-rsform` скрипты: `example:build-library-loans-schema`, `example:build-access-control-schema`, `example:build-clinic-booking-schema`
74
+
75
+ Брифы есть у `subordination/`, `kinship/`, `movd/`, `kinship-subordination/` и примеров по требованиям к ПО; сборки `kinship/` и `movd/` проверяют снимок по брифу (`assertReady`); [`briefs.test.ts`](briefs.test.ts) проверяет, что схемы им отвечают, а антипримеры ловятся (`pnpm run check-brief -- --session … --brief …`).
76
+
63
77
  В корне: [`agent-client.ts`](agent-client.ts) (`example:client`) — минимальный цикл через stdio без привязки к теме.
64
78
 
65
79
  ## Папка `kinship/`
@@ -0,0 +1,23 @@
1
+ # «Ролевой доступ»: иерархия ролей и разделение обязанностей
2
+
3
+ Пример по требованиям к ПО: v1 — роли, иерархия, назначенные и эффективные права, разделение обязанностей; v2 — временные роли. Метод — [`docs/METHOD.md`](../../docs/METHOD.md); требования → бриф — [`docs/REQUIREMENTS.md`](../../docs/REQUIREMENTS.md).
4
+
5
+ Файлы: [`requirements-v1.md`](requirements-v1.md), [`requirements-v2.md`](requirements-v2.md), [`brief-v1.json`](brief-v1.json), [`brief.json`](brief.json), [`build-rsform.ts`](build-rsform.ts), сессии v1 и v2, [`anti/`](anti/).
6
+
7
+ ## Главные решения
8
+
9
+ - **Иерархия — отношение, не дерево (`DC1`).** Роль может входить в несколько старших; дерево — вид вместо рода.
10
+ - **Права пользователя выводятся (`DC2`).** Структура «права пользователя» `S#` сделала бы схему «зелёной», но права разошлись бы с ролями. Назначенные (`F5`) и эффективные (`F6`) права — производные, и это главное различение (`V1`).
11
+ - **Разделение обязанностей — по эффективным ролям (`DC3`).** Требование говорит «в том числе через иерархию». Проверка только прямых ролей проще, но пропускает конфликт через наследование — антипример `weakened`.
12
+ - **Отсутствие аксиомы симметричности несовместимости (`DC4`)** — решение: `A2` проверяет пару в любом порядке.
13
+
14
+ ## v2
15
+
16
+ Временные назначения — отдельная структура `S5` с периодом и текущий день `S6` (`DC7`): `S1` и сценарии v1 не меняются. Прямые роли `F2` переопределены новым решением `DC6` (`supersedes: DC2`); без временных назначений формула совпадает с v1.
17
+
18
+ ## Антипримеры
19
+
20
+ | Снимок | Ошибка | Что ловит |
21
+ | :-------------------------------------- | :--------------------------------------------- | :----------------------------------------------- |
22
+ | [`weakened.json`](anti/weakened.json) | разделение обязанностей только по прямым ролям | негатив `SC3`: конфликт через иерархию не пойман |
23
+ | [`collapsed.json`](anti/collapsed.json) | эффективные права `F6 := F5` (назначенные) | `SC1`: права `ann`; различение `V1` |
@@ -0,0 +1,439 @@
1
+ {
2
+ "contractVersion": "3.3.0",
3
+ "state": {
4
+ "sessionId": "da60de87-a0fc-4ee0-aa5c-e47e8128af07",
5
+ "alias": "RBAC",
6
+ "title": "Антипример: collapsed",
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.456Z",
9
+ "updatedAt": "2026-10-25T18:34:35.461Z",
10
+ "revisions": [
11
+ {
12
+ "revisionId": "ffb7af2a-cf6f-4554-a7b6-402f3a7717b6",
13
+ "at": "2026-10-25T18:34:35.461Z",
14
+ "message": "Антипример: collapsed: шаг 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] F5[ξ]",
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
+ }