@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.
- package/README.md +3 -3
- package/dist/mappers/model-adapter.d.ts +1 -2
- package/dist/mappers/schema-adapter.d.ts +1 -2
- package/dist/mappers/types.d.ts +4 -5
- package/dist/models/rstool-agent.js +1 -2
- package/dist/session/session-store.d.ts +3 -3
- package/dist/session/session-store.js +1 -2
- package/dist/wrapper/client.d.ts +3 -4
- package/docs/BRIEF.md +93 -0
- package/docs/CONCEPTUAL-SCHEMA.md +16 -1
- package/docs/CONSTRUCTIONS.md +14 -2
- package/docs/DIAGNOSTICS.md +3 -2
- package/docs/DOMAIN.md +12 -0
- package/docs/METHOD.md +208 -0
- package/docs/PORTAL-API.md +38 -285
- package/docs/PORTAL-MODELS.md +24 -0
- package/docs/PORTAL-OSS.md +56 -0
- package/docs/PORTAL-PUBLISH.md +39 -0
- package/docs/PORTAL-READ.md +301 -0
- package/docs/README.md +7 -4
- package/docs/REQUIREMENTS.md +61 -0
- package/docs/SYNTAX.md +4 -3
- package/docs/TYPIFICATION.md +1 -1
- package/docs/brief.schema.json +173 -0
- package/examples/README.md +16 -2
- package/examples/access-control/NOTES.md +23 -0
- package/examples/access-control/anti/collapsed.json +439 -0
- package/examples/access-control/anti/weakened.json +439 -0
- package/examples/access-control/brief-v1.json +231 -0
- package/examples/access-control/brief.json +310 -0
- package/examples/access-control/build-rsform.ts +151 -0
- package/examples/access-control/requirements-v1.md +9 -0
- package/examples/access-control/requirements-v2.md +4 -0
- package/examples/access-control/rsform-session-v1.json +439 -0
- package/examples/access-control/rsform-session.json +523 -0
- package/examples/audit-diagnostics.ts +9 -1
- package/examples/briefs.test.ts +126 -0
- package/examples/clinic-booking/NOTES.md +24 -0
- package/examples/clinic-booking/anti/collapsed.json +615 -0
- package/examples/clinic-booking/anti/species-as-genus.json +568 -0
- package/examples/clinic-booking/brief-v1.json +332 -0
- package/examples/clinic-booking/brief.json +405 -0
- package/examples/clinic-booking/build-rsform.ts +174 -0
- package/examples/clinic-booking/requirements-v1.md +9 -0
- package/examples/clinic-booking/requirements-v2.md +4 -0
- package/examples/clinic-booking/rsform-session-v1.json +615 -0
- package/examples/clinic-booking/rsform-session.json +700 -0
- package/examples/diagnostics-utils.ts +26 -0
- package/examples/kinship/brief.json +337 -0
- package/examples/kinship/build-rsform.ts +7 -4
- package/examples/kinship/rsform-session.json +20 -63
- package/examples/kinship/rsmodel-session.json +14 -14
- package/examples/kinship-subordination/NOTES.md +49 -0
- package/examples/kinship-subordination/brief.json +161 -0
- package/examples/kinship-subordination/build-rsform.ts +100 -0
- package/examples/kinship-subordination/rsform-session.json +795 -0
- package/examples/library-loans/NOTES.md +46 -0
- package/examples/library-loans/anti/collapsed.json +481 -0
- package/examples/library-loans/anti/species-as-genus.json +334 -0
- package/examples/library-loans/anti/uncovered.json +406 -0
- package/examples/library-loans/anti/weakened.json +464 -0
- package/examples/library-loans/brief-v1.json +340 -0
- package/examples/library-loans/brief.json +502 -0
- package/examples/library-loans/build-rsform.ts +239 -0
- package/examples/library-loans/requirements-v1.md +11 -0
- package/examples/library-loans/requirements-v2.md +5 -0
- package/examples/library-loans/rsform-session-v1.json +481 -0
- package/examples/library-loans/rsform-session.json +652 -0
- package/examples/library-loans/source-markup.md +18 -0
- package/examples/movd/brief.json +220 -0
- package/examples/movd/build-rsform.ts +5 -2
- package/examples/movd/rsform-session.json +14 -46
- package/examples/subordination/NOTES.md +59 -0
- package/examples/subordination/anti/collapsed.json +556 -0
- package/examples/subordination/anti/single-relation.json +125 -0
- package/examples/subordination/anti/transitive.json +573 -0
- package/examples/subordination/anti/weakened.json +539 -0
- package/examples/subordination/brief.json +386 -0
- package/examples/subordination/build-rsform.ts +63 -0
- package/examples/subordination/constants.ts +115 -0
- package/examples/subordination/rsform-session.json +556 -0
- package/examples/subordination/source-markup.md +19 -0
- package/examples/subordination/source.md +40 -0
- package/package.json +18 -10
- package/skills/INSTALL.md +28 -29
- package/skills/README.md +25 -10
- package/skills/rs-core/SKILL.md +56 -0
- package/skills/rs-explain/SKILL.md +28 -0
- package/skills/rs-explicate/SKILL.md +71 -0
- package/skills/rs-interpret/SKILL.md +67 -0
- package/skills/rs-portal/SKILL.md +51 -0
- package/skills/rs-review/SKILL.md +79 -0
- package/skills/rs-scope/SKILL.md +67 -0
- package/skills/rs-synthesis/SKILL.md +52 -0
- package/skills/rstool/SKILL.md +70 -0
- package/skills/rstool-helper/GUIDE.md +18 -299
- package/skills/rstool-helper/SKILL.md +8 -58
- package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +16 -12
- package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +7 -5
- package/skills/rstool-runtime/SKILL.md +96 -0
- package/skills/scripts/brief-check.test.ts +165 -0
- package/skills/scripts/brief-check.ts +826 -0
- package/skills/scripts/check-brief.ts +94 -0
- package/skills/scripts/rstool-skills.mjs +119 -0
- package/skills/scripts/skill-stubs.test.ts +48 -0
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"status": "confirmed",
|
|
4
|
+
"approach": "project",
|
|
5
|
+
"object": "Запись пациентов на приём к врачу",
|
|
6
|
+
"task": "Эксплицировать слоты, записи и приёмы для проектирования модуля записи и его проверок",
|
|
7
|
+
"source": "requirements-v1.md",
|
|
8
|
+
"restrictions": [
|
|
9
|
+
{
|
|
10
|
+
"id": "L1",
|
|
11
|
+
"excludes": "уведомления (п. 6)",
|
|
12
|
+
"inexpressible": ["отправленное напоминание"]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "L2",
|
|
16
|
+
"excludes": "оплата (п. 7)",
|
|
17
|
+
"inexpressible": ["оплаченный приём", "стоимость"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "L3",
|
|
21
|
+
"excludes": "отмены и история записей",
|
|
22
|
+
"inexpressible": ["отменённая запись", "неявка в прошлом месяце"]
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"expressiveness": [
|
|
26
|
+
{
|
|
27
|
+
"id": "E1",
|
|
28
|
+
"concept": "свободные слоты",
|
|
29
|
+
"ref": "п. 3",
|
|
30
|
+
"via": "слоты вне Pr2 записей",
|
|
31
|
+
"constituent": "D1"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "E2",
|
|
35
|
+
"concept": "слоты, доступные пациенту",
|
|
36
|
+
"ref": "п. 4",
|
|
37
|
+
"via": "свободные без пересечения с записями пациента",
|
|
38
|
+
"constituent": "F4"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "E3",
|
|
42
|
+
"concept": "пересечение слотов",
|
|
43
|
+
"ref": "п. 2, 4",
|
|
44
|
+
"via": "тот же день и перекрытие отрезков",
|
|
45
|
+
"constituent": "P1"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "E4",
|
|
49
|
+
"concept": "состоявшиеся приёмы",
|
|
50
|
+
"ref": "п. 5",
|
|
51
|
+
"via": "родовая структура (пациент, слот) по DC3",
|
|
52
|
+
"constituent": "S5"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "E5",
|
|
56
|
+
"concept": "слоты врача",
|
|
57
|
+
"ref": "п. 2",
|
|
58
|
+
"via": "фильтр «врач слота»",
|
|
59
|
+
"constituent": "F2"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "E8",
|
|
63
|
+
"concept": "специальности врача",
|
|
64
|
+
"ref": "п. 1",
|
|
65
|
+
"via": "фильтр S1 по врачу",
|
|
66
|
+
"constituent": "F6"
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"distinctions": [
|
|
70
|
+
{
|
|
71
|
+
"id": "V1",
|
|
72
|
+
"between": ["E1", "E2"],
|
|
73
|
+
"text": "свободный слот ≠ доступный пациенту"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"id": "V2",
|
|
77
|
+
"between": ["S4", "S5"],
|
|
78
|
+
"text": "запись ≠ приём"
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
"invariants": [
|
|
82
|
+
{
|
|
83
|
+
"id": "I1",
|
|
84
|
+
"text": "На слот не больше одной записи",
|
|
85
|
+
"ref": "п. 3",
|
|
86
|
+
"constituent": "A1",
|
|
87
|
+
"positive": "SC1",
|
|
88
|
+
"negative": "SC2"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "I2",
|
|
92
|
+
"text": "Слоты одного врача не пересекаются",
|
|
93
|
+
"ref": "п. 2",
|
|
94
|
+
"constituent": "A2",
|
|
95
|
+
"positive": "SC1",
|
|
96
|
+
"negative": "SC3"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "I3",
|
|
100
|
+
"text": "У слота один врач и одно время",
|
|
101
|
+
"constituent": "A3",
|
|
102
|
+
"positive": "SC1",
|
|
103
|
+
"negative": "SC6"
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "I4",
|
|
107
|
+
"text": "Начало слота раньше конца",
|
|
108
|
+
"constituent": "A4",
|
|
109
|
+
"positive": "SC1",
|
|
110
|
+
"negative": "SC4"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"id": "I5",
|
|
114
|
+
"text": "Приём бывает только по записи",
|
|
115
|
+
"ref": "п. 5",
|
|
116
|
+
"constituent": "A5",
|
|
117
|
+
"positive": "SC1",
|
|
118
|
+
"negative": "SC5"
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "I7",
|
|
122
|
+
"text": "У врача есть хотя бы одна специальность",
|
|
123
|
+
"ref": "п. 1",
|
|
124
|
+
"constituent": "A7",
|
|
125
|
+
"positive": "SC1",
|
|
126
|
+
"negative": "SC9"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"decisions": [
|
|
130
|
+
{
|
|
131
|
+
"id": "DC1",
|
|
132
|
+
"topic": "слот",
|
|
133
|
+
"alternatives": ["слот как кортеж (врач, день, начало, конец)", "слот как сущность X4 с врачом и временем"],
|
|
134
|
+
"choice": "X4 и структуры S2, S3",
|
|
135
|
+
"rationale": "на слот ссылаются записи и приёмы; кортеж-слот пришлось бы повторять в каждой паре"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "DC2",
|
|
139
|
+
"topic": "время",
|
|
140
|
+
"choice": "день и минуты как Z",
|
|
141
|
+
"rationale": "пересечение требует порядка и сравнения; календарные даты исключены (L3)"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"id": "DC3",
|
|
145
|
+
"topic": "приём",
|
|
146
|
+
"alternatives": ["приём = запись", "отдельная структура S5 ⊆ записей"],
|
|
147
|
+
"choice": "S5 и аксиома A5",
|
|
148
|
+
"rationale": "запись ≠ приём (п. 5): пациент может не прийти"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": "DC4",
|
|
152
|
+
"topic": "специальность записи",
|
|
153
|
+
"choice": "без аксиомы",
|
|
154
|
+
"rationale": "в требованиях нет правила о специальности при записи"
|
|
155
|
+
}
|
|
156
|
+
],
|
|
157
|
+
"scenarios": [
|
|
158
|
+
{
|
|
159
|
+
"id": "SC1",
|
|
160
|
+
"title": "Два врача, пациент p1 записан на s1 и пришёл",
|
|
161
|
+
"values": {
|
|
162
|
+
"X1": ["house", "cuddy"],
|
|
163
|
+
"X2": ["therapy", "surgery"],
|
|
164
|
+
"X3": ["p1", "p2"],
|
|
165
|
+
"X4": ["s1", "s2", "s3", "s4"],
|
|
166
|
+
"S1": [
|
|
167
|
+
["house", "therapy"],
|
|
168
|
+
["cuddy", "surgery"],
|
|
169
|
+
["cuddy", "therapy"]
|
|
170
|
+
],
|
|
171
|
+
"S2": [
|
|
172
|
+
["s1", "house"],
|
|
173
|
+
["s2", "house"],
|
|
174
|
+
["s3", "cuddy"],
|
|
175
|
+
["s4", "cuddy"]
|
|
176
|
+
],
|
|
177
|
+
"S3": [
|
|
178
|
+
["s1", 1, 540, 570],
|
|
179
|
+
["s2", 1, 570, 600],
|
|
180
|
+
["s3", 1, 540, 600],
|
|
181
|
+
["s4", 2, 600, 630]
|
|
182
|
+
],
|
|
183
|
+
"S4": [["p1", "s1"]],
|
|
184
|
+
"S5": [["p1", "s1"]]
|
|
185
|
+
},
|
|
186
|
+
"expect": [
|
|
187
|
+
{
|
|
188
|
+
"of": "D1",
|
|
189
|
+
"value": ["s2", "s3", "s4"]
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"of": "F4",
|
|
193
|
+
"args": ["p1"],
|
|
194
|
+
"value": ["s2", "s4"],
|
|
195
|
+
"note": "s3 свободен, но пересекается с s1"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"of": "F4",
|
|
199
|
+
"args": ["p2"],
|
|
200
|
+
"value": ["s2", "s3", "s4"]
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"of": "P1",
|
|
204
|
+
"args": ["s1", "s3"],
|
|
205
|
+
"holds": true
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"of": "P1",
|
|
209
|
+
"args": ["s1", "s2"],
|
|
210
|
+
"holds": false,
|
|
211
|
+
"note": "стык 570 — не пересечение"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"of": "F2",
|
|
215
|
+
"args": ["house"],
|
|
216
|
+
"value": ["s1", "s2"]
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"of": "F6",
|
|
220
|
+
"args": ["cuddy"],
|
|
221
|
+
"value": ["therapy", "surgery"]
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "SC2",
|
|
227
|
+
"title": "Двойная запись на s1",
|
|
228
|
+
"base": "SC1",
|
|
229
|
+
"values": {
|
|
230
|
+
"S4": [
|
|
231
|
+
["p1", "s1"],
|
|
232
|
+
["p2", "s1"]
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
"expect": [
|
|
236
|
+
{
|
|
237
|
+
"of": "A1",
|
|
238
|
+
"holds": false
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"id": "SC3",
|
|
244
|
+
"title": "Пересечение слотов врача",
|
|
245
|
+
"base": "SC1",
|
|
246
|
+
"values": {
|
|
247
|
+
"S3": [
|
|
248
|
+
["s1", 1, 540, 570],
|
|
249
|
+
["s2", 1, 560, 600],
|
|
250
|
+
["s3", 1, 540, 600],
|
|
251
|
+
["s4", 2, 600, 630]
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
"expect": [
|
|
255
|
+
{
|
|
256
|
+
"of": "A2",
|
|
257
|
+
"holds": false
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "SC4",
|
|
263
|
+
"title": "Слот задом наперёд",
|
|
264
|
+
"base": "SC1",
|
|
265
|
+
"values": {
|
|
266
|
+
"S3": [
|
|
267
|
+
["s1", 1, 570, 540],
|
|
268
|
+
["s2", 1, 570, 600],
|
|
269
|
+
["s3", 1, 540, 600],
|
|
270
|
+
["s4", 2, 600, 630]
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
"expect": [
|
|
274
|
+
{
|
|
275
|
+
"of": "A4",
|
|
276
|
+
"holds": false
|
|
277
|
+
}
|
|
278
|
+
]
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "SC5",
|
|
282
|
+
"title": "Приём без записи",
|
|
283
|
+
"base": "SC1",
|
|
284
|
+
"values": {
|
|
285
|
+
"S5": [
|
|
286
|
+
["p1", "s1"],
|
|
287
|
+
["p2", "s3"]
|
|
288
|
+
]
|
|
289
|
+
},
|
|
290
|
+
"expect": [
|
|
291
|
+
{
|
|
292
|
+
"of": "A5",
|
|
293
|
+
"holds": false
|
|
294
|
+
}
|
|
295
|
+
]
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"id": "SC6",
|
|
299
|
+
"title": "Слот без врача",
|
|
300
|
+
"base": "SC1",
|
|
301
|
+
"values": {
|
|
302
|
+
"S2": [
|
|
303
|
+
["s1", "house"],
|
|
304
|
+
["s2", "house"],
|
|
305
|
+
["s3", "cuddy"]
|
|
306
|
+
]
|
|
307
|
+
},
|
|
308
|
+
"expect": [
|
|
309
|
+
{
|
|
310
|
+
"of": "A3",
|
|
311
|
+
"holds": false
|
|
312
|
+
}
|
|
313
|
+
]
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"id": "SC9",
|
|
317
|
+
"title": "Врач без специальности",
|
|
318
|
+
"base": "SC1",
|
|
319
|
+
"values": {
|
|
320
|
+
"S1": [["cuddy", "surgery"]]
|
|
321
|
+
},
|
|
322
|
+
"expect": [
|
|
323
|
+
{
|
|
324
|
+
"of": "A7",
|
|
325
|
+
"holds": false
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
}
|
|
329
|
+
],
|
|
330
|
+
"assumptions": ["у слота ровно один врач"],
|
|
331
|
+
"openQuestions": ["нужно ли правило «записываются к врачу нужной специальности»?"]
|
|
332
|
+
}
|