@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
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
|
|
3
|
+
import { type Brief, checkBrief } from '../skills/scripts/brief-check';
|
|
1
4
|
import { type Diagnostic, type RSToolWrapperClient } from '../src';
|
|
2
5
|
|
|
3
6
|
export type ExampleDiagnostic = Diagnostic;
|
|
@@ -24,3 +27,26 @@ export async function assertCleanDiagnostics(
|
|
|
24
27
|
}
|
|
25
28
|
throw new Error(`${context}: ${diags.length} diagnostic(s)\n${formatDiagnostics(diags)}`);
|
|
26
29
|
}
|
|
30
|
+
|
|
31
|
+
/** Throws unless the exported session answers its brief (no `check-brief` blockers). */
|
|
32
|
+
export async function assertReady(session: string, briefPath: string, context: string): Promise<void> {
|
|
33
|
+
const brief = JSON.parse(readFileSync(briefPath, 'utf8')) as Brief;
|
|
34
|
+
const { readiness } = await checkBrief({ session, brief });
|
|
35
|
+
if (!readiness.ready) {
|
|
36
|
+
throw new Error(`${context}: brief blockers\n${readiness.blockers.join('\n')}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Schema description built from a brief: purpose, restrictions with inexpressible concepts, decision log. */
|
|
41
|
+
export function describeBrief(briefPath: string): string {
|
|
42
|
+
const brief = JSON.parse(readFileSync(briefPath, 'utf8')) as Brief;
|
|
43
|
+
const lines = [`${brief.object}. ${brief.task}.`];
|
|
44
|
+
for (const item of brief.restrictions ?? []) {
|
|
45
|
+
const inexpressible = item.inexpressible?.length ? `; невыразимо: ${item.inexpressible.join(', ')}` : '';
|
|
46
|
+
lines.push(`${item.id}. Исключено: ${item.excludes}${inexpressible}.`);
|
|
47
|
+
}
|
|
48
|
+
for (const decision of brief.decisions ?? []) {
|
|
49
|
+
lines.push(`${decision.id}. ${decision.topic}: ${decision.choice} — ${decision.rationale}.`);
|
|
50
|
+
}
|
|
51
|
+
return lines.join('\n');
|
|
52
|
+
}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"status": "confirmed",
|
|
4
|
+
"approach": "education",
|
|
5
|
+
"object": "Родственные отношения в семье",
|
|
6
|
+
"task": "Учебная схема: вывести разнообразие видов родства из одного родового отношения «быть ребёнком» и пола; точка зрения — состояние семьи в один момент времени",
|
|
7
|
+
"source": "по мотивам «Генеалогического отношения двуполой популяции» (Т2 §4.2.3.2): «должны быть выразимы понятия типа двоюродное братство, общие дети, внучатый племянник»",
|
|
8
|
+
"restrictions": [
|
|
9
|
+
{
|
|
10
|
+
"id": "L1",
|
|
11
|
+
"excludes": "время: рождения, смерти, разводы",
|
|
12
|
+
"inexpressible": ["бывший супруг", "умерший родственник", "старший брат"]
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "L2",
|
|
16
|
+
"excludes": "юридический статус: усыновление, опека, признание отцовства",
|
|
17
|
+
"inexpressible": ["приёмный ребёнок", "опекун"]
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"expressiveness": [
|
|
21
|
+
{
|
|
22
|
+
"id": "E1",
|
|
23
|
+
"concept": "родители",
|
|
24
|
+
"via": "Pr1 отношения родитель–ребёнок",
|
|
25
|
+
"constituent": "D1"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "E2",
|
|
29
|
+
"concept": "потомки данного человека",
|
|
30
|
+
"via": "замыкание «детей» через R{}",
|
|
31
|
+
"constituent": "F2",
|
|
32
|
+
"ref": "Т2 §4.2.3.1.4"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "E3",
|
|
36
|
+
"concept": "братья и сёстры",
|
|
37
|
+
"via": "дети родителей, кроме самого человека",
|
|
38
|
+
"constituent": "F3"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "E4",
|
|
42
|
+
"concept": "племянники",
|
|
43
|
+
"via": "дети братьев и сестёр, не потомки",
|
|
44
|
+
"constituent": "F4",
|
|
45
|
+
"ref": "Т2 §4.2.3.2.2"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"id": "E5",
|
|
49
|
+
"concept": "двоюродные братья и сёстры",
|
|
50
|
+
"via": "дети братьев и сестёр родителей",
|
|
51
|
+
"constituent": "F28",
|
|
52
|
+
"ref": "Т2 §4.2.3.2.2"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "E6",
|
|
56
|
+
"concept": "законные дети",
|
|
57
|
+
"via": "родители ребёнка совпадают с супругами его родителей",
|
|
58
|
+
"constituent": "D10"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"id": "E7",
|
|
62
|
+
"concept": "дети вне брака",
|
|
63
|
+
"via": "потомки без E6",
|
|
64
|
+
"constituent": "D11"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "E8",
|
|
68
|
+
"concept": "бездетные люди",
|
|
69
|
+
"via": "люди вне Pr2",
|
|
70
|
+
"constituent": "D8"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "E9",
|
|
74
|
+
"concept": "отец данного человека",
|
|
75
|
+
"via": "родители ∩ мужчины",
|
|
76
|
+
"constituent": "F7"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "E10",
|
|
80
|
+
"concept": "дедушки",
|
|
81
|
+
"via": "отцы родителей",
|
|
82
|
+
"constituent": "F24"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"distinctions": [
|
|
86
|
+
{
|
|
87
|
+
"id": "V1",
|
|
88
|
+
"between": ["D2", "E6"],
|
|
89
|
+
"text": "дети (имеющие родителя) ≠ законные дети",
|
|
90
|
+
"witness": "SC1"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "V2",
|
|
94
|
+
"between": ["E4", "E5"],
|
|
95
|
+
"text": "племянники ≠ двоюродные братья и сёстры",
|
|
96
|
+
"witness": "SC1"
|
|
97
|
+
}
|
|
98
|
+
],
|
|
99
|
+
"invariants": [
|
|
100
|
+
{
|
|
101
|
+
"id": "I1",
|
|
102
|
+
"text": "Никто не является своим потомком",
|
|
103
|
+
"constituent": "A5",
|
|
104
|
+
"positive": "SC1",
|
|
105
|
+
"negative": "SC2"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "I2",
|
|
109
|
+
"text": "Не более одного отца и одной матери",
|
|
110
|
+
"constituent": "A3",
|
|
111
|
+
"positive": "SC1",
|
|
112
|
+
"negative": "SC3"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "I3",
|
|
116
|
+
"text": "Человек состоит не более чем в одном браке",
|
|
117
|
+
"constituent": "A4",
|
|
118
|
+
"positive": "SC1",
|
|
119
|
+
"negative": "SC4"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "I4",
|
|
123
|
+
"text": "Каждый человек — мужчина или женщина, но не оба",
|
|
124
|
+
"constituent": "A2",
|
|
125
|
+
"positive": "SC1",
|
|
126
|
+
"negative": "SC5"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"decisions": [
|
|
130
|
+
{
|
|
131
|
+
"id": "DC1",
|
|
132
|
+
"topic": "родовое отношение",
|
|
133
|
+
"alternatives": ["функции «отец» и «мать»", "отношение S1 «родитель–ребёнок» ℬ(X1×X1)"],
|
|
134
|
+
"choice": "отношение S1",
|
|
135
|
+
"rationale": "из одного родового отношения выводится всё разнообразие видов родства; «отец» и «мать» — его сужение по полу (F7, F8)"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "DC2",
|
|
139
|
+
"topic": "пол",
|
|
140
|
+
"alternatives": ["коды в константном множестве", "две структуры S2, S3 ℬ(X1) с аксиомой разбиения"],
|
|
141
|
+
"choice": "S2 мужчины, S3 женщины и аксиома разбиения A2",
|
|
142
|
+
"rationale": "классификация по одному основанию даёт пару аксиом полноты и непересекаемости, а не коды атрибута"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "DC3",
|
|
146
|
+
"topic": "брак",
|
|
147
|
+
"choice": "S4: ℬ(S2×S3), пара (муж, жена)",
|
|
148
|
+
"rationale": "учебная схема воспроизводит исходный разбор; это решение о типизации, а не свойство предметной области — при другой постановке брак типизируется ℬ(X1×X1) с аксиомами"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"id": "DC4",
|
|
152
|
+
"topic": "ацикличность родства",
|
|
153
|
+
"choice": "аксиома A5",
|
|
154
|
+
"rationale": "через замыкание F2"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"id": "DC5",
|
|
158
|
+
"topic": "однозначность отца и матери",
|
|
159
|
+
"choice": "аксиома A3",
|
|
160
|
+
"rationale": "биологическое родство (L2)"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": "DC6",
|
|
164
|
+
"topic": "единственность брака",
|
|
165
|
+
"choice": "аксиома A4",
|
|
166
|
+
"rationale": "моногамия в рассматриваемой культуре"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "DC7",
|
|
170
|
+
"topic": "размер модели",
|
|
171
|
+
"choice": "аксиома A1: не более десяти человек",
|
|
172
|
+
"rationale": "ограничение учебной модели, чтобы перебор по ℬ(X1) оставался быстрым"
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
"scenarios": [
|
|
176
|
+
{
|
|
177
|
+
"id": "SC1",
|
|
178
|
+
"title": "Три поколения: дед и бабушка, два сына, внуки и внучка",
|
|
179
|
+
"values": {
|
|
180
|
+
"X1": ["grandpa", "grandma", "dad", "mom", "uncle", "son", "daughter", "cousin"],
|
|
181
|
+
"S1": [
|
|
182
|
+
["grandpa", "dad"],
|
|
183
|
+
["grandma", "dad"],
|
|
184
|
+
["grandpa", "uncle"],
|
|
185
|
+
["grandma", "uncle"],
|
|
186
|
+
["dad", "son"],
|
|
187
|
+
["mom", "son"],
|
|
188
|
+
["dad", "daughter"],
|
|
189
|
+
["mom", "daughter"],
|
|
190
|
+
["uncle", "cousin"]
|
|
191
|
+
],
|
|
192
|
+
"S2": ["grandpa", "dad", "uncle", "son"],
|
|
193
|
+
"S3": ["grandma", "mom", "daughter", "cousin"],
|
|
194
|
+
"S4": [
|
|
195
|
+
["grandpa", "grandma"],
|
|
196
|
+
["dad", "mom"]
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
"expect": [
|
|
200
|
+
{
|
|
201
|
+
"of": "D1",
|
|
202
|
+
"value": ["grandpa", "grandma", "dad", "mom", "uncle"]
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"of": "F2",
|
|
206
|
+
"args": ["grandpa"],
|
|
207
|
+
"value": ["dad", "uncle", "son", "daughter", "cousin"]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"of": "F3",
|
|
211
|
+
"args": ["son"],
|
|
212
|
+
"value": ["daughter"]
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"of": "F3",
|
|
216
|
+
"args": ["dad"],
|
|
217
|
+
"value": ["uncle"]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"of": "F4",
|
|
221
|
+
"args": ["uncle"],
|
|
222
|
+
"value": ["son", "daughter"]
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"of": "F28",
|
|
226
|
+
"args": ["son"],
|
|
227
|
+
"value": ["cousin"]
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"of": "D10",
|
|
231
|
+
"value": ["dad", "uncle", "son", "daughter"]
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
"of": "D11",
|
|
235
|
+
"value": ["cousin"]
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"of": "D8",
|
|
239
|
+
"value": ["son", "daughter", "cousin"]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"of": "F7",
|
|
243
|
+
"args": ["son"],
|
|
244
|
+
"value": ["dad"]
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"of": "F24",
|
|
248
|
+
"args": ["son"],
|
|
249
|
+
"value": ["grandpa"]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"of": "A5",
|
|
253
|
+
"holds": true
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"of": "T1",
|
|
257
|
+
"holds": true
|
|
258
|
+
}
|
|
259
|
+
]
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "SC2",
|
|
263
|
+
"title": "Цикл: a — родитель b, b — родитель a",
|
|
264
|
+
"values": {
|
|
265
|
+
"X1": ["a", "b"],
|
|
266
|
+
"S1": [
|
|
267
|
+
["a", "b"],
|
|
268
|
+
["b", "a"]
|
|
269
|
+
],
|
|
270
|
+
"S2": ["a"],
|
|
271
|
+
"S3": ["b"]
|
|
272
|
+
},
|
|
273
|
+
"expect": [
|
|
274
|
+
{
|
|
275
|
+
"of": "A5",
|
|
276
|
+
"holds": false
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
"of": "T1",
|
|
280
|
+
"holds": false
|
|
281
|
+
}
|
|
282
|
+
]
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"id": "SC3",
|
|
286
|
+
"title": "Два отца у ребёнка",
|
|
287
|
+
"values": {
|
|
288
|
+
"X1": ["f1", "f2", "c"],
|
|
289
|
+
"S1": [
|
|
290
|
+
["f1", "c"],
|
|
291
|
+
["f2", "c"]
|
|
292
|
+
],
|
|
293
|
+
"S2": ["f1", "f2", "c"]
|
|
294
|
+
},
|
|
295
|
+
"expect": [
|
|
296
|
+
{
|
|
297
|
+
"of": "A3",
|
|
298
|
+
"holds": false
|
|
299
|
+
}
|
|
300
|
+
]
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
"id": "SC4",
|
|
304
|
+
"title": "Мужчина в двух браках",
|
|
305
|
+
"values": {
|
|
306
|
+
"X1": ["m", "w1", "w2"],
|
|
307
|
+
"S2": ["m"],
|
|
308
|
+
"S3": ["w1", "w2"],
|
|
309
|
+
"S4": [
|
|
310
|
+
["m", "w1"],
|
|
311
|
+
["m", "w2"]
|
|
312
|
+
]
|
|
313
|
+
},
|
|
314
|
+
"expect": [
|
|
315
|
+
{
|
|
316
|
+
"of": "A4",
|
|
317
|
+
"holds": false
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"id": "SC5",
|
|
323
|
+
"title": "Человек без пола",
|
|
324
|
+
"values": {
|
|
325
|
+
"X1": ["p"]
|
|
326
|
+
},
|
|
327
|
+
"expect": [
|
|
328
|
+
{
|
|
329
|
+
"of": "A2",
|
|
330
|
+
"holds": false
|
|
331
|
+
}
|
|
332
|
+
]
|
|
333
|
+
}
|
|
334
|
+
],
|
|
335
|
+
"assumptions": [],
|
|
336
|
+
"openQuestions": []
|
|
337
|
+
}
|
|
@@ -7,7 +7,7 @@ type DraftBatch = { draft: AgentConstituentaPatch };
|
|
|
7
7
|
|
|
8
8
|
import { DEFAULT_RSFORM_SESSION_PATH } from './constants';
|
|
9
9
|
import { KINSHIP_MODEL_SET } from './model-demo';
|
|
10
|
-
import { assertCleanDiagnostics } from '../diagnostics-utils';
|
|
10
|
+
import { assertCleanDiagnostics, assertReady, describeBrief } from '../diagnostics-utils';
|
|
11
11
|
|
|
12
12
|
async function run() {
|
|
13
13
|
const client = new RSToolWrapperClient({
|
|
@@ -16,7 +16,9 @@ async function run() {
|
|
|
16
16
|
|
|
17
17
|
try {
|
|
18
18
|
await client.waitUntilReady();
|
|
19
|
-
const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession'
|
|
19
|
+
const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession', {
|
|
20
|
+
initial: { comment: describeBrief(resolve(import.meta.dirname, 'brief.json')) }
|
|
21
|
+
});
|
|
20
22
|
|
|
21
23
|
const drafts: DraftBatch[] = [
|
|
22
24
|
{
|
|
@@ -304,9 +306,9 @@ async function run() {
|
|
|
304
306
|
id: 53,
|
|
305
307
|
alias: 'D8',
|
|
306
308
|
cstType: CstType.TERM,
|
|
307
|
-
definitionFormal: 'X1\\
|
|
309
|
+
definitionFormal: 'X1\\D1',
|
|
308
310
|
term: 'бездетные люди',
|
|
309
|
-
definitionText: 'Люди,
|
|
311
|
+
definitionText: 'Люди, у которых нет детей'
|
|
310
312
|
}
|
|
311
313
|
},
|
|
312
314
|
{
|
|
@@ -694,6 +696,7 @@ async function run() {
|
|
|
694
696
|
const exported = await client.call<string>('exportSession', {
|
|
695
697
|
sessionId: session.sessionId
|
|
696
698
|
});
|
|
699
|
+
await assertReady(exported, resolve(import.meta.dirname, 'brief.json'), 'kinship RSForm');
|
|
697
700
|
const outputPath = resolve(process.cwd(), DEFAULT_RSFORM_SESSION_PATH);
|
|
698
701
|
await writeFile(outputPath, exported, 'utf8');
|
|
699
702
|
console.log(`Exported: ${outputPath}`);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"contractVersion": "
|
|
2
|
+
"contractVersion": "3.3.0",
|
|
3
3
|
"state": {
|
|
4
|
-
"sessionId": "
|
|
4
|
+
"sessionId": "967c89ed-33f6-413f-b403-bfc2c12d5248",
|
|
5
5
|
"alias": "",
|
|
6
6
|
"title": "",
|
|
7
|
-
"comment": "",
|
|
8
|
-
"createdAt": "2026-
|
|
9
|
-
"updatedAt": "2026-
|
|
7
|
+
"comment": "Родственные отношения в семье. Учебная схема: вывести разнообразие видов родства из одного родового отношения «быть ребёнком» и пола; точка зрения — состояние семьи в один момент времени.\nL1. Исключено: время: рождения, смерти, разводы; невыразимо: бывший супруг, умерший родственник, старший брат.\nL2. Исключено: юридический статус: усыновление, опека, признание отцовства; невыразимо: приёмный ребёнок, опекун.\nDC1. родовое отношение: отношение S1 — из одного родового отношения выводится всё разнообразие видов родства; «отец» и «мать» — его сужение по полу (F7, F8).\nDC2. пол: S2 мужчины, S3 женщины и аксиома разбиения A2 — классификация по одному основанию даёт пару аксиом полноты и непересекаемости, а не коды атрибута.\nDC3. брак: S4: ℬ(S2×S3), пара (муж, жена) — учебная схема воспроизводит исходный разбор; это решение о типизации, а не свойство предметной области — при другой постановке брак типизируется ℬ(X1×X1) с аксиомами.\nDC4. ацикличность родства: аксиома A5 — через замыкание F2.\nDC5. однозначность отца и матери: аксиома A3 — биологическое родство (L2).\nDC6. единственность брака: аксиома A4 — моногамия в рассматриваемой культуре.\nDC7. размер модели: аксиома A1: не более десяти человек — ограничение учебной модели, чтобы перебор по ℬ(X1) оставался быстрым.",
|
|
8
|
+
"createdAt": "2026-10-25T18:35:06.101Z",
|
|
9
|
+
"updatedAt": "2026-10-25T18:35:06.246Z",
|
|
10
10
|
"revisions": [
|
|
11
11
|
{
|
|
12
|
-
"revisionId": "
|
|
13
|
-
"at": "2026-
|
|
12
|
+
"revisionId": "361ebc26-3632-4b42-b8c8-2c850ebcdb18",
|
|
13
|
+
"at": "2026-10-25T18:35:06.246Z",
|
|
14
14
|
"message": "КС «родственные отношения»: браки, пол, сиблинги; ∆ ⊆ ⊂ ⊄ ∨ ⇒ ⇔ bool red Pr1,2 Fi1,2 pr1,2, упакованные кванторы"
|
|
15
15
|
}
|
|
16
16
|
],
|
|
@@ -764,9 +764,9 @@
|
|
|
764
764
|
"id": 53,
|
|
765
765
|
"alias": "D8",
|
|
766
766
|
"cstType": "term",
|
|
767
|
-
"definitionFormal": "X1\\
|
|
767
|
+
"definitionFormal": "X1\\D1",
|
|
768
768
|
"term": "бездетные люди",
|
|
769
|
-
"definitionText": "Люди,
|
|
769
|
+
"definitionText": "Люди, у которых нет детей",
|
|
770
770
|
"convention": "",
|
|
771
771
|
"analysis": {
|
|
772
772
|
"success": true,
|
|
@@ -1796,75 +1796,32 @@
|
|
|
1796
1796
|
"id": 2,
|
|
1797
1797
|
"type": "ℬ(X1×X1)",
|
|
1798
1798
|
"value": [
|
|
1799
|
-
[
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
],
|
|
1804
|
-
[
|
|
1805
|
-
|
|
1806
|
-
1,
|
|
1807
|
-
2
|
|
1808
|
-
],
|
|
1809
|
-
[
|
|
1810
|
-
-111,
|
|
1811
|
-
0,
|
|
1812
|
-
3
|
|
1813
|
-
],
|
|
1814
|
-
[
|
|
1815
|
-
-111,
|
|
1816
|
-
1,
|
|
1817
|
-
3
|
|
1818
|
-
],
|
|
1819
|
-
[
|
|
1820
|
-
-111,
|
|
1821
|
-
2,
|
|
1822
|
-
4
|
|
1823
|
-
],
|
|
1824
|
-
[
|
|
1825
|
-
-111,
|
|
1826
|
-
3,
|
|
1827
|
-
5
|
|
1828
|
-
],
|
|
1829
|
-
[
|
|
1830
|
-
-111,
|
|
1831
|
-
5,
|
|
1832
|
-
6
|
|
1833
|
-
]
|
|
1799
|
+
[-111, 0, 2],
|
|
1800
|
+
[-111, 0, 3],
|
|
1801
|
+
[-111, 1, 2],
|
|
1802
|
+
[-111, 1, 3],
|
|
1803
|
+
[-111, 2, 4],
|
|
1804
|
+
[-111, 3, 5],
|
|
1805
|
+
[-111, 5, 6]
|
|
1834
1806
|
]
|
|
1835
1807
|
},
|
|
1836
1808
|
{
|
|
1837
1809
|
"id": 13,
|
|
1838
1810
|
"type": "ℬ(X1)",
|
|
1839
|
-
"value": [
|
|
1840
|
-
0,
|
|
1841
|
-
2,
|
|
1842
|
-
4,
|
|
1843
|
-
6
|
|
1844
|
-
]
|
|
1811
|
+
"value": [0, 2, 4, 6]
|
|
1845
1812
|
},
|
|
1846
1813
|
{
|
|
1847
1814
|
"id": 14,
|
|
1848
1815
|
"type": "ℬ(X1)",
|
|
1849
|
-
"value": [
|
|
1850
|
-
1,
|
|
1851
|
-
3,
|
|
1852
|
-
5
|
|
1853
|
-
]
|
|
1816
|
+
"value": [1, 3, 5]
|
|
1854
1817
|
},
|
|
1855
1818
|
{
|
|
1856
1819
|
"id": 41,
|
|
1857
1820
|
"type": "ℬ(X1×X1)",
|
|
1858
|
-
"value": [
|
|
1859
|
-
[
|
|
1860
|
-
-111,
|
|
1861
|
-
0,
|
|
1862
|
-
1
|
|
1863
|
-
]
|
|
1864
|
-
]
|
|
1821
|
+
"value": [[-111, 0, 1]]
|
|
1865
1822
|
}
|
|
1866
1823
|
]
|
|
1867
1824
|
}
|
|
1868
1825
|
},
|
|
1869
1826
|
"diagnostics": []
|
|
1870
|
-
}
|
|
1827
|
+
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"contractVersion": "
|
|
2
|
+
"contractVersion": "3.3.0",
|
|
3
3
|
"state": {
|
|
4
|
-
"sessionId": "
|
|
4
|
+
"sessionId": "e145ebfa-d9eb-4331-a426-65b8d34833e0",
|
|
5
5
|
"alias": "",
|
|
6
6
|
"title": "",
|
|
7
7
|
"comment": "",
|
|
8
|
-
"createdAt": "2026-
|
|
9
|
-
"updatedAt": "2026-
|
|
8
|
+
"createdAt": "2026-10-25T16:50:11.635Z",
|
|
9
|
+
"updatedAt": "2026-10-25T16:50:23.460Z",
|
|
10
10
|
"revisions": [
|
|
11
11
|
{
|
|
12
|
-
"revisionId": "
|
|
13
|
-
"at": "2026-
|
|
12
|
+
"revisionId": "57515329-08be-4e6e-9003-8dae26c6a7b5",
|
|
13
|
+
"at": "2026-10-25T16:50:11.792Z",
|
|
14
14
|
"message": "КС «родственные отношения»: браки, пол, сиблинги; ∆ ⊆ ⊂ ⊄ ∨ ⇒ ⇔ bool red Pr1,2 Fi1,2 pr1,2, упакованные кванторы"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
|
-
"revisionId": "
|
|
18
|
-
"at": "2026-
|
|
17
|
+
"revisionId": "efbe0fb6-2156-4734-b736-2458fa52e557",
|
|
18
|
+
"at": "2026-10-25T16:50:23.460Z",
|
|
19
19
|
"message": "Модель kinship: D3 непуст; A1 card(X1)≤10 выполняется"
|
|
20
20
|
}
|
|
21
21
|
],
|
|
@@ -769,9 +769,9 @@
|
|
|
769
769
|
"id": 53,
|
|
770
770
|
"alias": "D8",
|
|
771
771
|
"cstType": "term",
|
|
772
|
-
"definitionFormal": "X1\\
|
|
772
|
+
"definitionFormal": "X1\\D1",
|
|
773
773
|
"term": "бездетные люди",
|
|
774
|
-
"definitionText": "Люди,
|
|
774
|
+
"definitionText": "Люди, у которых нет детей",
|
|
775
775
|
"convention": "",
|
|
776
776
|
"analysis": {
|
|
777
777
|
"success": true,
|
|
@@ -1808,13 +1808,13 @@
|
|
|
1808
1808
|
],
|
|
1809
1809
|
[
|
|
1810
1810
|
-111,
|
|
1811
|
-
|
|
1812
|
-
|
|
1811
|
+
0,
|
|
1812
|
+
3
|
|
1813
1813
|
],
|
|
1814
1814
|
[
|
|
1815
1815
|
-111,
|
|
1816
|
-
|
|
1817
|
-
|
|
1816
|
+
1,
|
|
1817
|
+
2
|
|
1818
1818
|
],
|
|
1819
1819
|
[
|
|
1820
1820
|
-111,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# «Родство и подчинение»: синтез микротеорий
|
|
2
|
+
|
|
3
|
+
Учебный пример синтеза по Т1 §1.2.18. Метод — [`docs/METHOD.md`](../../docs/METHOD.md) §«Синтез микротеорий». Файлы: [`brief.json`](brief.json), [`build-rsform.ts`](build-rsform.ts), [`rsform-session.json`](rsform-session.json).
|
|
4
|
+
|
|
5
|
+
## Зачем синтез
|
|
6
|
+
|
|
7
|
+
В книге после синтеза генеалогических и брачных отношений «можно отождествить третью теорию “начальник – подчиненный” с полученными понятиями… Необходимо указать, что в прямом подчинении прямой родственник находиться не может, а затем перечислить варианты отношений, понимаемые нами как прямые родственные отношения: брат, сестра, сын, дочь… Запрет налагается только на прямое подчинение и родственные отношения 1 ранга» (Т1 §1.2.18). Пример там же: «директор предприятия не имеет права назначить начальником отдела своего сына, но рядовым сотрудником он (сын) может быть».
|
|
8
|
+
|
|
9
|
+
Это правило не выражается ни в одной исходной микротеории: в «Начальниках и подчинённых» нет родства, в «Родстве» нет подчинения. Расширять одну из них чужими понятиями — значит раздувать микротеорию сверх 3–6 отношений и смешивать аспекты. Вместо этого две схемы соединяются синтезом, а правило становится **синтетической аксиомой**.
|
|
10
|
+
|
|
11
|
+
## Таблица отождествлений (`DC1`)
|
|
12
|
+
|
|
13
|
+
| Родство (источник) | Подчинение (приёмник) | Вид отождествления |
|
|
14
|
+
| :----------------- | :-------------------- | :-------------------------- |
|
|
15
|
+
| `X1` люди | `X1` люди | исходное с исходным — можно |
|
|
16
|
+
|
|
17
|
+
«…эти отношения определены на одном и том же множестве, т.е. исследователь мысленно отождествляет людей одной конструкции с людьми другой. Эта операция лежит в основе соединения» (Т1 §1.2.18). Остальные конституенты родства встраиваются с перенумерацией: `S1 → S2`, `F1 → F5` (родители), `F2 → F6` (дети), `F3 → F7` (братья и сёстры), `F4 → F8` (прямые родственники). Ссылки брифа результата пишутся на новые имена.
|
|
18
|
+
|
|
19
|
+
Правила отождествления: «Не запрещено отождествлять производное понятие одной теории с исходным понятием другой… Запрещается отождествлять производные понятия с производными, за исключением… полного совпадения структуры понятий» (Т1 §1.2.18).
|
|
20
|
+
|
|
21
|
+
## Что даёт синтез
|
|
22
|
+
|
|
23
|
+
Бриф результата — новый, брифы аргументов в него не переносятся. В нём только то, чего не было ни в одной микротеории:
|
|
24
|
+
|
|
25
|
+
- **отождествление** людей двух схем (`DC1`);
|
|
26
|
+
- **синтетическая аксиома** и понятие нарушения:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
A3 ::= ∀(α,β)∈D1 β∉F8[α]
|
|
30
|
+
D11 ::= D{(α,β)∈D1 | β∈F8[α]}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
- **новое выводимое понятие** — косвенное подчинение родственнику, которое правило разрешает (`DC3`): «директор предприятия не имеет права назначить начальником отдела своего сына, но рядовым сотрудником он (сын) может быть».
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
D12 ::= D{(α,β)∈X1×X1 | β∈F3[α] & β∈F8[α]}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`D1` и `F3` — прямое и косвенное подчинение из микротеории подчинения, `F8` — родственники 1 ранга из микротеории родства. Различение `V1` (прямое ≠ косвенное подчинение родственнику) подтверждает сценарий `SC1`.
|
|
40
|
+
|
|
41
|
+
## Сценарии
|
|
42
|
+
|
|
43
|
+
`SC1` — директор — отец двух рядовых сотрудников в своей вертикали: прямого подчинения родственнику нет, косвенное есть; `SC2` — директор назначил сына начальником отдела; `SC3` — брат стал прямым начальником сестры: без братьев и сестёр в `F8` этот случай прошёл бы. Аксиомы аргументов (например, «сам себе не начальник») отдельно не перечисляются: в допустимых сценариях `check-brief` требует истинности всех аксиом схемы.
|
|
44
|
+
|
|
45
|
+
## Имена после синтеза
|
|
46
|
+
|
|
47
|
+
rstool даёт встроенным конституентам следующие свободные номера по типу (`aliasMapping`: `S1 → S2`, `F1 → F5`, …); синтез в ОСС на Portal ещё и перенумеровывает все имена подряд. Формулы и ссылки в терминах и текстовых определениях перенумеровываются автоматически, конвенции — нет. Поэтому конвенции обеих микротеорий не ссылаются ни на имена конституент, ни на решения своих брифов, а бриф результата пишется по итоговым именам.
|
|
48
|
+
|
|
49
|
+
`check-brief` показывает унаследованные конституенты как «сирот»: их требования живут в брифах аргументов, для схемы-результата это норма.
|