@rsconcept/rstool 0.4.0 → 0.5.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 CHANGED
@@ -4,7 +4,7 @@ Agent-facing library for **incremental RSForm construction**, **RSLang expressio
4
4
 
5
5
  ## Agent skill
6
6
 
7
- RS language + rstool workflows for agents: `skills/rstool-helper/` (`GUIDE.md`, `REFERENCE.md`, `EXAMPLES.md`) and `docs/` (`DOMAIN.md`, `SYNTAX.md`, …). A **thin** entry skill is installed into the project’s agent skills folder; see [Installing the agent skill](#installing-the-agent-skill) below.
7
+ RS language + rstool workflows for agents: `skills/rstool-helper/` (`GUIDE.md`, `REFERENCE.md`, `EXAMPLES.md`) and `docs/` (`DOMAIN.md`, `CONCEPTUAL-SCHEMA.md` for relation-first KS design, `SYNTAX.md`, …). A **thin** entry skill is installed into the project’s agent skills folder; see [Installing the agent skill](#installing-the-agent-skill) below.
8
8
 
9
9
  ## Install
10
10
 
@@ -9,15 +9,7 @@
9
9
  - Добавляй понятие, если оно дает новый критерий, роль, отношение, инвариант или правило.
10
10
  - Если пользователь постоянно переформулирует одно различие, введи отдельную конституенту.
11
11
 
12
- ## Текстовые поля
13
-
14
- `term`, `definitionText`, `convention` держи в языке схемы и в ее словаре.
15
-
16
- - `term` — короткое имя понятия.
17
- - `definitionText` — текстовая интерпретация формального определения.
18
- - `convention` — соглашение для неопределяемого понятия.
19
-
20
- Перед записью `definitionText` проверь существительные: важный предметный термин должен быть введен как `N#`, `X#`, `C#`, `S#` или `D#`.
12
+ Подробнее про структуру и поля конституент см. в [CONSTITUENTA.md](./CONSTITUENTA.md).
21
13
 
22
14
  ## Номиноиды и атрибутирование
23
15
 
@@ -25,7 +17,7 @@
25
17
 
26
18
  Атрибутирование связывает номиноид с другими конституентами через атрибуты. Это отдельная атрибутивная экспликация, не замена `S#`, `D#`, `A#` в родоструктурной экспликации.
27
19
 
28
- Правило для `rstool`: не смешивай атрибутивную и родоструктурную экспликацию. Используй `N#` как словарную опору, но не превращай атрибуты в RS-формулы и не добавляй атрибутивные связи, если пользователь явно не просит совместить эти способы.
20
+ Правило для `rstool`: не смешивай атрибутивную и родоструктурную экспликацию если явно не указано пользователем.
29
21
 
30
22
  ## Родовые структуры
31
23
 
@@ -34,19 +26,64 @@
34
26
  Паттерн для отношения:
35
27
 
36
28
  1. `X1` — базисное множество.
37
- 2. `S1: ℬ(X1×X1)` — отношение; порядок пары описан в `convention`.
29
+ 2. `S1: ℬ(X1×X1)` — отношение; предметное пояснение в `convention`.
38
30
  3. `D# := Pr1(S1)`, `D# := Pr2(S1)` — именованные компоненты.
39
- 4. Сложные термы строятся поверх этих `D#`.
31
+ 4. Сложные термы строятся поверх этих `D#` и `S#`.
32
+
33
+ Если повторяется цепочка вроде `Pr2(Fi1[D](S7))`, введи промежуточный терм или функцию `F#`.
34
+
35
+ ## Подход relation-first
36
+
37
+ Используй при объединении нескольких исходных КС в одну предметную модель и при появлении длинных цепочек `∃d1…∃dn` в разных термах.
38
+
39
+ ### Семантическая лестница
40
+
41
+ Строй схему слоями; каждый следующий слой ссылается только на предыдущие:
42
+
43
+ | Слой | Роль | Что вводить |
44
+ | :--- | :--------------------- | :------------------------------------------------------------------------------------------- |
45
+ | 1 | Базис | `X#`, `C#` — пустой `definitionFormal`, смысл в `convention` / `definitionText` из источника |
46
+ | 2 | Структуры | `S#` — типизация `ℬ(…×…)` и конвенция на кортеж |
47
+ | 3 | Инварианты | `A#` — короткие ограничения (см. ниже про `card`) |
48
+ | 4 | Параметрический доступ | `F#` — «локальный API»: `[α∈…] Pr*(Fi*[…](S#))` |
49
+ | 5 | Центральное отношение | один `D#` (или `S#` с конвенцией), задающий полную траекторию синтеза |
50
+ | 6 | Витрина понятий | `D#` через `Pr*`, `Fi*`, `card`, `red`; узкие `F#` для аналитики |
51
+
52
+ ### Центральное отношение
53
+
54
+ Когда в тексте описан единый сценарий, зафиксируй его **одним** объектом:
55
+
56
+ ```text
57
+ D13 ::= I{(α, ξ1, τ, ξ2, β1, β2, ρ, ξ3) |
58
+ α∈S6; ξ1∈X2; τ∈F7[α,ξ1]; …; ξ3∈S3
59
+ }
60
+ ```
61
+
62
+ (Имена и арность — по предметной области; важна форма: кортеж + ограничения через уже введённые `F#` и `S#`.)
63
+
64
+ Далее можешь дать название необходимым частям кортежа с помощью `D#` через `Pr#`
65
+
66
+ ### Инварианты: `card` вместо длинных `∀`
67
+
68
+ Для функциональности отношения удобно:
69
+
70
+ ```text
71
+ card(S1) = card(Pr1,2(S1))
72
+ ```
73
+
74
+ Эквивалентно идее `∀d1,d2∈S1 ...`
75
+
76
+ Оставляй `∀`/`∃`, когда не получается заменить на теоретико-множественные и структурные конструкции.
40
77
 
41
- Если повторяется цепочка вроде `Pr2(Fi1[D](S7))`, введи промежуточный терм или уточни конвенцию/аксиому для `S7`.
78
+ ### Проекции вместо повторных кванторов
42
79
 
43
- ## Аксиомы
80
+ Если условие уже задано на `S#` или центральном `D#`, производный терм — это почти всегда:
44
81
 
45
- `A#` логическое требование к модели. Используй аксиомы, чтобы:
82
+ - `Prk(…)` / `Pri,j(…)`;
83
+ - `Fi*k[{…}](…)`;
84
+ - `D{ξ∈… | F[ξ] = …}` или `card(F[ξ]) = 1`.
46
85
 
47
- - фиксировать смысл `S#`;
48
- - задавать уникальность, тотальность, непересечение, порядок, область и диапазон;
49
- - оправдывать `debool(...)`: внутреннее множество должно быть гарантированно одноэлементным.
86
+ Перед тем как писать `D{x∈… | ∃d1∈… ∃d2∈…}`, проверь: нельзя ли выразить через `Pr` от уже введённого отношения.
50
87
 
51
88
  ## Проверка на маленькой модели
52
89
 
@@ -61,18 +98,19 @@
61
98
  - Атрибутивная экспликация не смешана с родоструктурной без явного запроса пользователя.
62
99
  - Не добавляй проверки принадлежности к собственной типизации: если `x` уже объявлен в `X1`, `x ∈ X1` избыточно.
63
100
  - Покрыты главные предметные сущности, роли, отношения и утверждения.
64
- - Слои идут так: `X#`/`C#` `S#` простые `D#` сложные `D#`/`F#`/`P#` → `A#`/`T#`.
65
- - У каждой аксиомы понятная цель.
101
+ - Повторяющиеся отборы вынесены в `F#`, а не размазаны по термам.
102
+ - У каждой аксиомы понятна цель.
66
103
  - Частые падения аксиом в модели указывают на ошибку данных или семантики схемы.
67
104
  - Сомнительные выражения проверены на маленькой КМ, если есть показательные тестовые данные.
68
105
 
69
106
  ## Рабочий порядок
70
107
 
71
- 1. Собери словарь предметной области.
72
- 2. Добавь `X#` и `C#` с конвенциями.
73
- 3. Добавь ключевые `S#` с типизацией и конвенцией.
74
- 4. Назови важные компоненты через `D#`: `Pr*`, `pr*`, `red`.
75
- 5. Добавляй выводимые `D#`, `F#`, `P#` маленькими шагами.
76
- 6. Добавь `A#` и `T#` по необходимости.
77
- 7. Перед upsert проверяй `analyzeExpression`.
78
- 8. Для сомнительной семантики собери маленькую КМ и вычисли ожидаемые значения.
108
+ 1. Собери словарь предметной области (базисы, ключевые отношения, сценарий синтеза).
109
+ 2. Добавь `X#` и `C#` с конвенциями из источника.
110
+ 3. Добавь базовые `S#` (трансформация, перевод, допускание, выбор, цели, субъекты).
111
+ 4. Добавь `A#` на структуры (`card`, покрытие `Pr1,2(S#)=…`, принадлежность выбора).
112
+ 5. Введи `F#` для типовых запросов.
113
+ 6. Производные понятия — `Pr*` / `Fi*` / `F#` от центрального `D#` и базовых `S#`.
114
+ 7. Узкие классификаторы (`для любой обстановки`, `для одного индивида`) — через `F#` и `card`/`=` с `X#`, не новые монолиты.
115
+ 8. Перед каждым upsert `analyzeExpression`.
116
+ 9. Для сомнительной семантики — маленькая КМ (`MODEL-TESTING.md`).
@@ -2,21 +2,23 @@
2
2
 
3
3
  Читай перед `addOrUpdateConstituenta`.
4
4
 
5
- ## Поля черновика
5
+ ## Поля
6
6
 
7
7
  - `id` — стабильный id внутри сессии.
8
8
  - `alias` — имя вида `X1`, `D5`, `F2`; префикс должен совпадать с `cstType`.
9
9
  - `cstType` — роль конституенты.
10
10
  - `definitionFormal` — формальное определение; для `basic` и `constant` строго `''`.
11
- - `term` — естественно-языковое имя.
12
- - `definitionText` — текстовая интерпретация формулы.
13
- - `convention` — соглашение для неопределяемого понятия.
11
+ - `term` — термин в естественном языке, используется в текстовых определениях. Если обозначаются элементы множества, то пишется с маленькой буквы во множественном числе. Иначе с большой буквы в единственном.
12
+ - `definitionText` — текстовое определение, соответствующее формальному определению. Для простых выражений не указывается если совпадает с термином. Каждый используемый термин должен быть введен в схеме.
13
+ - `convention` — соглашение для неопределяемого понятия. Может использовать термины, не определенные в схеме.
14
14
 
15
15
  Пропущенные текстовые поля сохраняются как `''`. Пиши `term`, `definitionText`, `convention` на одном языке: в языке схемы или, для новой схемы, в языке запроса.
16
16
 
17
+ Не добавляй точку в конце текстовых полей.
18
+
17
19
  ## `cstType`
18
20
 
19
- - `nominal` / `N#` — номиноид. В родоструктурной экспликации не используется.
21
+ - `nominal` / `N#` — номиноид. В родоструктурной экспликации и формальных определениях не используется.
20
22
  - `basic` / `X#` — базисное множество; формула пустая.
21
23
  - `constant` / `C#` — константное множество; формула пустая.
22
24
  - `structure` / `S#` — родовая структура; формула задает типизацию.
@@ -26,13 +28,13 @@
26
28
  - `axiom` / `A#` — аксиома; нужна типизация `Logic`.
27
29
  - `statement` / `T#` — высказывание; нужна типизация `Logic`.
28
30
 
29
- `basic`, `constant`, `structure` можно интерпретировать через `setConstituentaValue`. `term`, `axiom`, `statement` вычисляются и напрямую не задаются.
31
+ В модели `basic`, `constant`, `structure` можно интерпретировать через `setConstituentaValue`. `term`, `axiom`, `statement` вычисляются и напрямую не задаются.
30
32
 
31
- ## `S#` и `D#`
33
+ ## Различие родовой структуры и терма
32
34
 
33
- `S#` — неопределяемая родовая структура. `definitionFormal: 'ℬ(X1×X1)'` описывает ступень элемента: множество пар над `X1`.
35
+ `S#` — неопределяемое понятие - родовая структура. Пример: `definitionFormal: 'ℬ(X1×X1)'` описывает ступень элемента: множество пар над `X1`.
34
36
 
35
- `D#` — терм. `definitionFormal: 'X1×X1'` строит полный декартов продукт.
37
+ `D#` — производное понятие - терм. Пример: `definitionFormal: 'X1×X1'` строит полный декартов продукт.
36
38
 
37
39
  Для бинарного отношения обычно нужно:
38
40
 
@@ -28,4 +28,5 @@
28
28
 
29
29
  - Не парси HTML SPA.
30
30
  - Не переноси UI query/hash вроде `?tab=editor` в REST.
31
+ - Не запрашивай UI напрямую, используй преобразованные API запросы.
31
32
  - Не запрашивай `/details`, если нужны только метаданные.
@@ -29,16 +29,10 @@
29
29
 
30
30
  ## `AnalysisResult.type`
31
31
 
32
- `type` приходит как JSON анализатора: `Record<string, unknown> | null`.
33
-
34
- Правила:
35
-
36
32
  1. Сначала проверь `analysis.success === true` и `analysis.type !== null`.
37
33
  2. Не разбирай объект вручную; используй helpers из `@rsconcept/domain`.
38
34
  3. `valueClass` уточняет вычислимость: `Value`, `Property`, `Invalid`.
39
35
 
40
- Полезные API: `TypeID`, `TypePath`, `makeTypePath`, `parseTypeText(...)`.
41
-
42
36
  ## `S#` и `D#`
43
37
 
44
38
  - У `structure` (`S#`) `definitionFormal` читается как типизация. `ℬ(X1×X1)` описывает множество пар.
@@ -52,14 +46,14 @@
52
46
 
53
47
  Требуют подходящую ступень:
54
48
 
55
- - `red(S)` — нужно `S : (ℬ(H))`.
49
+ - `red(S)` — нужно `S : ℬℬ(H)`.
56
50
  - `debool(S)` — нужно одноэлементное множество.
57
51
  - `pr1(tuple)`, `Pr1(S)` — нужна достаточная арность.
58
- - `Fi1[D](S)` — `D` должен соответствовать выбранной проекции.
52
+ - `Fi1[a](S)` — `a` должен соответствовать выбранной проекции.
59
53
 
60
54
  ## Частые ошибки
61
55
 
62
56
  - `debool(S)` без гарантии синглетона.
63
57
  - `pr3((a, b))`: индекс вне арности.
64
- - `Fi1,2[D](S)`: параметр `D` не совпал с двумя проекциями.
58
+ - `Fi1,2[a](S)`: параметр `a` не совпал с двумя проекциями.
65
59
  - `A#` и `T#` не имеют `Logic`: будет `expectedLogic`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsconcept/rstool",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract and stdio wrapper.",
5
5
  "license": "MIT",
6
6
  "author": "IRBorisov",
@@ -162,6 +162,52 @@ if (!result.success || result.status !== EvalStatus.HAS_DATA || JSON.stringify(r
162
162
 
163
163
  Use this pattern for tests that protect important definitions. Full kinship model: `../../examples/build-kinship-rsmodel.ts`. More notes: `../../docs/MODEL-TESTING.md`.
164
164
 
165
+ ## Relation-first synthesis (layered KS)
166
+
167
+ Pattern for merging sub-schemas (transformation + transition + choice → stimulation). Reference: Portal `D01B03` / rsform `843`.
168
+
169
+ 1. **Structures** — one `S#` per mechanism, typification only:
170
+
171
+ ```text
172
+ S1: ℬ(X1×X2×X1) // transformation
173
+ S2: ℬ(X2×X3×X2) // transition
174
+ S4: ℬ(X2×X1×X3) // allowance (flat triple, not ℬ(X2×X1×ℬ(X3)))
175
+ S5: ℬ(X1×ℬ(X3)×X3) // choice
176
+ ```
177
+
178
+ 2. **Axioms** — short invariants:
179
+
180
+ ```text
181
+ A1: Pr1,2(S1) = X1×X2
182
+ A2: card(S1) = card(Pr1,2(S1))
183
+ A4: card(S5) = card(Pr1,2(S5))
184
+ A5: ∀d∈S5 pr3(d)∈pr2(d)
185
+ ```
186
+
187
+ 3. **Functions** — parameterized access (reuse everywhere):
188
+
189
+ ```text
190
+ F5[α,β] := Pr3(Fi1,2[{(β,α)}](S4)) // possible actions
191
+ F7[α,ξ] := F6[α, F5[α,ξ]] // chosen action in situation
192
+ ```
193
+
194
+ 4. **Central term** — one tuple relation, then projections:
195
+
196
+ ```text
197
+ D13 ::= I{(α,ξ1,τ,ξ2,β1,β2,ρ,ξ3) | α∈S6; ξ1∈X2; τ∈F7[α,ξ1]; …; ξ3∈S3}
198
+ D14 := Pr3(D13) // stimuli
199
+ D18 := Pr2(D13) // initial situations
200
+ ```
201
+
202
+ 5. **Classifiers** — filter via `F#`, not a new `∃` chain:
203
+
204
+ ```text
205
+ F8[α] := Pr2(Fi3[{α}](D13))
206
+ D22 := D{ξ∈D14 | F8[ξ] = X2} // stimulus valid in any situation
207
+ ```
208
+
209
+ Upsert in dependency order; run `analyzeExpression` on `I{…}` before committing the central `D#`.
210
+
165
211
  ## Common mistakes
166
212
 
167
213
  - `definitionFormal: 'Z'` on `basic` / `constant` → `definitionNotAllowed`.
@@ -169,6 +215,10 @@ Use this pattern for tests that protect important definitions. Full kinship mode
169
215
  - Wrong `cstType` in `analyzeExpression` → role-specific errors.
170
216
  - `term` with `X1×X1` for a relation → full Cartesian product, not relation typification.
171
217
  - `structure` with `Pr1(S1)` → wrong role; projections belong on `term` / `function`.
218
+ - Same long `∃d1…∃dn` chain in many `D#` → define one central `D#` and use `Pr*` / `F#`.
219
+ - `S4: ℬ(X2×X1×ℬ(X3))` when you only need «individual allows actions» → prefer `ℬ(X2×X1×X3)` + `F5`.
220
+ - `∀x∈A, ∀y∈B` → invalid; nest: `∀x∈A (∀y∈B (…))`.
221
+ - Functional relation axiom as huge `∀⇒` → prefer `card(S)=card(Pr1,2(S))` when equivalent.
172
222
  - `setConstituentaValue` on `term`, `axiom`, or `statement` → cannot set computed constituents directly.
173
223
  - Evaluation before base bindings → missing value, empty result, or evaluation failure.
174
224
 
@@ -29,6 +29,8 @@ Paths are relative to this file.
29
29
 
30
30
  ## Workflow
31
31
 
32
+ Use this when editing or checking schemas and models.
33
+
32
34
  1. `createSession`.
33
35
  2. Add `basic` (`X#`) and `constant` (`C#`) with `definitionFormal: ''`.
34
36
  3. Add dependencies before dependents.
@@ -41,26 +43,6 @@ Paths are relative to this file.
41
43
  10. Persist with `exportSession` / `importSession`.
42
44
  11. For user-uploadable Portal files, use `exportPortalSchema` for schema JSON or `exportPortalModel` for model JSON.
43
45
 
44
- ## Portal REST
45
-
46
- rstool never calls Portal REST itself. Fetch live data outside rstool, then import constituents with `addOrUpdateConstituenta`.
47
-
48
- - UI host: `https://portal.acconcept.ru`.
49
- - API host: `https://api.portal.acconcept.ru`.
50
- - Useful reads: `/api/rsforms/{id}`, `/api/rsforms/{id}/details`, `/api/library/{id}/versions/{v}`, `/api/oss/{id}`, `/api/models/{id}`, `/schema`.
51
- - Do not scrape SPA HTML or reuse UI query params like `?tab=`.
52
-
53
- ## Syntax Cheatsheet
54
-
55
- - Globals: `X1`, `C1`, `S1`, `D1`, `F1`, `P1`, `A1`, `T1`, `N1`, `R1`.
56
- - Locals: `x`, `ξ`, `μ2`.
57
- - Literals: `42`, `Z`, `∅`.
58
- - Set expressions: `∪`, `∩`, `\`, `∆`, `×`, `ℬ(...)`, tuples, `Pr*`, `Fi*`.
59
- - Logic: `¬`, `&`, `∨`, `⇒`, `⇔`, `∀`, `∃`, `=`, `≠`, `<`, `∈`, `⊆`.
60
- - Parameterized expressions: `[arg1∈H1, arg2∈H2] body`.
61
-
62
- Read tool output; do not infer types by inspection.
63
-
64
46
  ## Diagnostics Loop
65
47
 
66
48
  1. Check `analysis.success`.
@@ -76,19 +58,11 @@ Read tool output; do not infer types by inspection.
76
58
  3. Derived constituents in topological order.
77
59
  4. Axioms and statements after their references.
78
60
 
79
- ## Natural-Language Fields
80
-
81
- Keep `term`, `definitionText`, and `convention` in one language.
82
-
83
- - Extending a schema: use the schema's existing language.
84
- - New schema: use the user's request language.
85
-
86
61
  ## Checklist
87
62
 
88
63
  - [ ] `sessionId` tracked.
89
- - [ ] `basic` / `constant` formals are empty.
90
- - [ ] Dependencies exist before upsert.
91
64
  - [ ] `cstType` matches the role.
65
+ - [ ] Check schema and fix errors before showing result.
92
66
  - [ ] Diagnostics handled before commit/export.
93
- - [ ] Ambiguous semantics checked on a small model when data examples are available.
67
+ - [ ] Ambiguous semantics checked on a small model.
94
68
  - [ ] Base values set before evaluation.