@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,301 @@
|
|
|
1
|
+
# Portal: чтение схем
|
|
2
|
+
|
|
3
|
+
Как по ссылке Portal получить КС (или её метаданные) и перенести её в `rstool`. `rstool` сам не ходит в REST API: он работает с in-memory сессиями. Агент получает JSON Portal отдельно, затем импортирует его.
|
|
4
|
+
|
|
5
|
+
Карта всех маршрутов — [PORTAL-API.md](PORTAL-API.md). Публикация — [PORTAL-PUBLISH.md](PORTAL-PUBLISH.md), модели — [PORTAL-MODELS.md](PORTAL-MODELS.md), ОСС — [PORTAL-OSS.md](PORTAL-OSS.md).
|
|
6
|
+
|
|
7
|
+
## Хосты
|
|
8
|
+
|
|
9
|
+
- UI: `https://portal.acconcept.ru/`
|
|
10
|
+
- REST API: `https://api.portal.acconcept.ru/`
|
|
11
|
+
|
|
12
|
+
## Пути
|
|
13
|
+
|
|
14
|
+
- `/rsforms/:id` в UI → `GET /api/rsforms/:id` для метаданных.
|
|
15
|
+
- Полная КС → `GET /api/rsforms/:id/details`.
|
|
16
|
+
- Версия КС → `GET /api/library/:id/versions/:version`.
|
|
17
|
+
- Список доступных объектов → `GET /api/library/active`.
|
|
18
|
+
- Поиск по тексту в схемах/ОСС/моделях → `GET /api/library/context-search?q=...`.
|
|
19
|
+
- Метаданные объектов по id → `GET /api/library/by-ids?ids=856,1203`.
|
|
20
|
+
- ОСС → `GET /api/oss/:id` и соседние routes viewset.
|
|
21
|
+
- Модель → `GET /api/models/:id`.
|
|
22
|
+
- OpenAPI JSON → `GET https://api.portal.acconcept.ru/schema`.
|
|
23
|
+
|
|
24
|
+
Для UI-ссылки `https://portal.acconcept.ru/rsforms/856` агент должен ходить на:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
GET https://api.portal.acconcept.ru/api/rsforms/856
|
|
28
|
+
GET https://api.portal.acconcept.ru/api/rsforms/856/details
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Не переноси UI query/hash вроде `?tab=editor`.
|
|
32
|
+
|
|
33
|
+
## Доступ
|
|
34
|
+
|
|
35
|
+
**Для агентов** есть выделенный API под `/api/agents/*` с авторизацией по **API-ключу**
|
|
36
|
+
(`Authorization: Bearer rcp_…`). Ключи выдаёт пользователь в профиле Portal (вкладка «API keys»).
|
|
37
|
+
Ключи **не** открывают обычные UI-маршруты (`/api/rsforms`, `/api/library`, …) — те по-прежнему
|
|
38
|
+
требуют сессию браузера и CSRF.
|
|
39
|
+
|
|
40
|
+
Запросы **без** авторизации к публичному REST видят только объекты с `access_policy: "public"`
|
|
41
|
+
в общих разделах (`/S`, `/L`). Это касается `context-search`, `by-ids`, `GET /api/rsforms/:id`
|
|
42
|
+
и `/details`.
|
|
43
|
+
|
|
44
|
+
- Недоступная схема → `403` на прямой запрос; в `by-ids` такой id **пропускается**.
|
|
45
|
+
- Личные (`/U`) и проектные (`/P`) объекты через анонимный API **не читаются**, даже если
|
|
46
|
+
пользователь дал UI-ссылку.
|
|
47
|
+
- Если нужны только `title`, `alias`, `description`, `owner`, `access_policy`, не запрашивай `/details`.
|
|
48
|
+
|
|
49
|
+
В браузере Portal использует Django session (`SessionAuthentication`). **Не предлагай
|
|
50
|
+
пользователю передавать session cookie агенту** — для curl/скриптов это нерабочий путь
|
|
51
|
+
(cookie привязан к браузеру, истекает, не предназначен для машинного доступа).
|
|
52
|
+
|
|
53
|
+
### API-ключи (рекомендуемый путь для агентов)
|
|
54
|
+
|
|
55
|
+
1. Пользователь создаёт ключ в профиле → получает секрет `rcp_<prefix>_<secret>` **один раз**.
|
|
56
|
+
2. Агент передаёт `Authorization: Bearer <секрет>` на маршруты `/api/agents/...`.
|
|
57
|
+
3. Ключ действует от имени пользователя (те же права Owner/Editor на объекты библиотеки).
|
|
58
|
+
Отключённый аккаунт ключ не принимает.
|
|
59
|
+
4. Мутации пишутся в журнал в профиле: код действия, статус и текст запроса, обрезанный до 4000 символов. Секрет ключа в журнал не попадает. Отказы `429` и чтения не пишутся. Строки старше 30 дней удаляются, сама очистка запускается не чаще раза в 7 дней. Оба срока задаются окружением: `AGENT_LOG_RETENTION_DAYS` и `AGENT_LOG_CLEANUP_INTERVAL_DAYS`.
|
|
60
|
+
|
|
61
|
+
Если КС не публичная и **нет** API-ключа, варианты для агента:
|
|
62
|
+
|
|
63
|
+
1. Пользователь временно делает схему публичной (`access_policy: public`).
|
|
64
|
+
2. Пользователь экспортирует JSON (`GET /api/rsforms/:id/details` из своей сессии в UI
|
|
65
|
+
или экспорт из Portal) и передаёт JSON в чат или файл — агент переносит в `rstool`.
|
|
66
|
+
3. Работа с личной библиотекой остаётся в UI Portal; агент помогает с публичными схемами
|
|
67
|
+
и с JSON, который пользователь явно предоставил.
|
|
68
|
+
|
|
69
|
+
## Список и контекстный поиск в библиотеке
|
|
70
|
+
|
|
71
|
+
Чтобы найти схему по термину, формуле или названию, не перебирай все id подряд.
|
|
72
|
+
Бэкенд и UI используют контекстный поиск по вложенным текстовым полям.
|
|
73
|
+
|
|
74
|
+
### Полный список доступных объектов
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
GET /api/library/active
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Возвращает массив метаданных (`id`, `item_type`, `title`, `alias`, `description`, `location`,
|
|
81
|
+
`access_policy`, `visible`, …) для объектов, доступных текущему пользователю: публичные в `/S` и
|
|
82
|
+
`/L`, собственные и те, где пользователь редактор. Анониму — только публичные в общих разделах.
|
|
83
|
+
|
|
84
|
+
Для агентов обычно достаточно `context-search`; полный `active` нужен, если требуется обойти
|
|
85
|
+
все объекты без текстового фильтра.
|
|
86
|
+
|
|
87
|
+
### Контекстный поиск
|
|
88
|
+
|
|
89
|
+
```text
|
|
90
|
+
GET /api/library/context-search?q=<текст>&search_fields=<поля>&location=<путь>&subfolders=0|1&item_type=<тип>&admin=0|1
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Ответ: `{ "ids": [856, 1203, ...] }` — id объектов библиотеки (КС, ОСС, RSModel), у которых
|
|
94
|
+
совпал хотя бы один из запрошенных текстовых фрагментов. Пустой или пробельный `q` → `ids: []`.
|
|
95
|
+
Регистр не важен; кириллица поддерживается.
|
|
96
|
+
|
|
97
|
+
| Параметр | Обязателен | Описание |
|
|
98
|
+
| --------------- | ---------- | ------------------------------------------------------- |
|
|
99
|
+
| `q` | да\* | Подстрока для поиска (\*пустой → пустой ответ) |
|
|
100
|
+
| `search_fields` | нет | Список полей через запятую; по умолчанию — все |
|
|
101
|
+
| `location` | нет | Путь папки (`/S`, `/U/Проект`, …); см. ниже |
|
|
102
|
+
| `subfolders` | нет | `1`/`true` — включать вложенные папки; по умолчанию `0` |
|
|
103
|
+
| `item_type` | нет | `rsform`, `oss` или `rsmodel` — ограничить тип объекта |
|
|
104
|
+
| `admin` | нет | `1`/`true` — искать по всей библиотеке (только staff) |
|
|
105
|
+
|
|
106
|
+
Допустимые значения `search_fields`:
|
|
107
|
+
|
|
108
|
+
| Поле | Где ищет |
|
|
109
|
+
| ------------------- | ------------------------------------------------- |
|
|
110
|
+
| `alias` | Шифр объекта и конституент |
|
|
111
|
+
| `title` | Название объекта |
|
|
112
|
+
| `description` | Описание объекта |
|
|
113
|
+
| `term` | Термин конституенты (`term_raw`, `term_resolved`) |
|
|
114
|
+
| `definition_formal` | Формальное определение, ручная типизация |
|
|
115
|
+
| `definition_text` | Текстовое определение конституенты |
|
|
116
|
+
| `convention` | Соглашение конституенты |
|
|
117
|
+
| `operation` | Операции ОСС (alias, title, description) |
|
|
118
|
+
| `block` | Блоки ОСС (title, description) |
|
|
119
|
+
|
|
120
|
+
Для КС по термину или формуле обычно не указывай `search_fields` (все поля) или явно:
|
|
121
|
+
`search_fields=term,definition_formal,title`.
|
|
122
|
+
|
|
123
|
+
### Префиксы `location`
|
|
124
|
+
|
|
125
|
+
Путь хранится в поле `location` каждого объекта. Корневые префиксы:
|
|
126
|
+
|
|
127
|
+
| Префикс | Значение |
|
|
128
|
+
| ------- | -------------------------------------------- |
|
|
129
|
+
| `/S` | Общие (COMMON), публичные схемы для анонимов |
|
|
130
|
+
| `/L` | Библиотека (LIBRARY), staff |
|
|
131
|
+
| `/U` | Личное пространство пользователя |
|
|
132
|
+
| `/P` | Проекты |
|
|
133
|
+
|
|
134
|
+
Вложенные папки: `/U/Мой проект/Подпапка`.
|
|
135
|
+
|
|
136
|
+
- без `subfolders` (по умолчанию) — только объекты с точным совпадением `location`;
|
|
137
|
+
- с `subfolders=1` — объекты в папке и во всех вложенных (`/U/Проект`, `/U/Проект/Подпапка`, …).
|
|
138
|
+
|
|
139
|
+
Параметр `item_type` сужает поиск до КС (`rsform`), ОСС (`oss`) или моделей (`rsmodel`).
|
|
140
|
+
Для поиска только концептуальных схем удобно: `item_type=rsform`.
|
|
141
|
+
|
|
142
|
+
### Метаданные по списку id
|
|
143
|
+
|
|
144
|
+
После `context-search` не нужно запрашивать всю библиотеку (`/active`) или каждый объект отдельно.
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
GET /api/library/by-ids?ids=<id1>,<id2>,...
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Ответ — массив метаданных в том же формате, что и `GET /api/library/active`:
|
|
151
|
+
`id`, `item_type`, `title`, `alias`, `description`, `location`, `access_policy`, `visible`, …
|
|
152
|
+
|
|
153
|
+
| Параметр | Описание |
|
|
154
|
+
| -------- | ----------------------- |
|
|
155
|
+
| `ids` | Список id через запятую |
|
|
156
|
+
|
|
157
|
+
Правила доступа те же, что у `context-search` и `active`: недоступные id **пропускаются**
|
|
158
|
+
(не ошибка, не `403` на весь запрос). Порядок элементов в ответе совпадает с порядком id
|
|
159
|
+
в запросе. Пустой `ids` → `[]`.
|
|
160
|
+
|
|
161
|
+
Для одной КС по-прежнему можно `GET /api/rsforms/:id`; для нескольких результатов поиска
|
|
162
|
+
удобнее `by-ids`, затем `GET /api/rsforms/:id/details` только для выбранных КС.
|
|
163
|
+
|
|
164
|
+
### Примеры curl
|
|
165
|
+
|
|
166
|
+
Публичный поиск по термину (без авторизации):
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Только в названиях и шифрах:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=логика&search_fields=title,alias"
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Только КС в общем разделе и подпапках:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество&location=/S&subfolders=1&item_type=rsform"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Типичный пайплайн агента — найти id, затем метаданные и при необходимости полную КС:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# 1. Поиск
|
|
188
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/library/context-search?q=множество"
|
|
189
|
+
|
|
190
|
+
# 2. Метаданные найденных объектов (подставь ids из шага 1)
|
|
191
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/library/by-ids?ids=856,1203"
|
|
192
|
+
|
|
193
|
+
# 3. Полная КС для переноса в rstool (только для выбранной схемы)
|
|
194
|
+
curl.exe -s "https://api.portal.acconcept.ru/api/rsforms/856/details"
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Формат `GET /api/rsforms/:id/details`
|
|
198
|
+
|
|
199
|
+
Ответ содержит метаданные объекта библиотеки и массив `items[]` с конституентами.
|
|
200
|
+
Для анализа КС обычно нужны только корневые `title`, `alias`, `description` и поля каждой конституенты.
|
|
201
|
+
|
|
202
|
+
| Portal JSON | `rstool` | Примечание |
|
|
203
|
+
| --------------------- | ------------------------ | ----------------------------------------------------- |
|
|
204
|
+
| `id` | `draft.id` | Стабильный id внутри сессии |
|
|
205
|
+
| `alias` | `draft.alias` | `X1`, `C1`, `S1`, `D1`, `F1`, `P1`, `A1`, `T1` |
|
|
206
|
+
| `cst_type` | `draft.cstType` | Значения совпадают с `CstType` |
|
|
207
|
+
| `definition_formal` | `draft.definitionFormal` | Пустая строка допустима только для `basic`/`constant` |
|
|
208
|
+
| `term_raw` | `draft.term` | Для редактирования сохраняй raw, не resolved |
|
|
209
|
+
| `definition_raw` | `draft.definitionText` | Для редактирования сохраняй raw, не resolved |
|
|
210
|
+
| `convention` | `draft.convention` | Соглашение, не формальная проверка |
|
|
211
|
+
| `term_resolved` | не переносить | Только отображение после resolver |
|
|
212
|
+
| `definition_resolved` | не переносить | Только отображение после resolver |
|
|
213
|
+
| `typification_manual` | обычно не переносить | Переопределение типизации |
|
|
214
|
+
| `term_forms` | обычно не переносить | Словоформы термина |
|
|
215
|
+
| `crucial` | обычно не переносить | UI/Portal-флаг |
|
|
216
|
+
| `value_is_property` | обычно не переносить | Переопределение класса интерпретируемости |
|
|
217
|
+
|
|
218
|
+
`inheritance`, `attribution`, `oss`, `models`, `versions`, `editors` полезны для контекста Portal, но не нужны для базовой проверки ЯРЭ в `rstool`.
|
|
219
|
+
|
|
220
|
+
## Как перенести КС в rstool
|
|
221
|
+
|
|
222
|
+
1. Получи `GET /api/rsforms/:id/details`.
|
|
223
|
+
2. Вызови `importData(JSON.stringify(payload))` — auto определит `portal-details`; для Load from JSON — `importData(payload, 'portal-schema')`.
|
|
224
|
+
3. Проверь `listDiagnostics()` (после `importData` сессия уже текущая).
|
|
225
|
+
4. Работай локально: анализ, правки, вычисления, маленькая КМ.
|
|
226
|
+
5. Для сохранения рабочей сессии используй `exportSession`.
|
|
227
|
+
6. Для загрузки схемы обратно в Portal используй `exportPortal({ kind: 'schema' })`.
|
|
228
|
+
|
|
229
|
+
Альтернатива: `createSession` + `applySchemaPatch` с массивом `items`.
|
|
230
|
+
|
|
231
|
+
Portal JSON из `/details` **не является** форматом `exportSession`; используй `importData`, не передавай его как session export.
|
|
232
|
+
|
|
233
|
+
Минимальный импорт:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
const session = tool.importData(JSON.stringify(portal));
|
|
237
|
+
tool.listDiagnostics();
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Пакетный маппинг через `applySchemaPatch`:
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
const session = tool.createSession({
|
|
244
|
+
title: portal.title,
|
|
245
|
+
alias: portal.alias,
|
|
246
|
+
comment: portal.description
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
tool.applySchemaPatch(
|
|
250
|
+
{
|
|
251
|
+
items: portal.items.map(item => ({
|
|
252
|
+
id: item.id,
|
|
253
|
+
alias: item.alias,
|
|
254
|
+
cstType: item.cst_type,
|
|
255
|
+
definitionFormal: item.definition_formal ?? '',
|
|
256
|
+
term: item.term_raw ?? '',
|
|
257
|
+
definitionText: item.definition_raw ?? '',
|
|
258
|
+
convention: item.convention ?? ''
|
|
259
|
+
}))
|
|
260
|
+
},
|
|
261
|
+
session.sessionId
|
|
262
|
+
);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## Практика для агентов
|
|
266
|
+
|
|
267
|
+
- Запрашивай API host, а не UI host: `https://api.portal.acconcept.ru/api/...`.
|
|
268
|
+
- Для чтения от имени пользователя используй `/api/agents/...` и Bearer API-ключ.
|
|
269
|
+
- Без ключа REST анонима = только **публичные** схемы в `/S` и `/L`.
|
|
270
|
+
- Для непубличной КС без ключа проси JSON (`/details`) или публикацию схемы — не cookie.
|
|
271
|
+
- Сначала бери метаданные, если нужно только название или доступность схемы.
|
|
272
|
+
- Для больших схем используй увеличенный таймаут. В PowerShell вызывай `curl.exe`,
|
|
273
|
+
а не alias `curl` (`Invoke-WebRequest`), если нужен CLI-синтаксис curl.
|
|
274
|
+
|
|
275
|
+
### Windows: кодировка в скриптах пайплайна
|
|
276
|
+
|
|
277
|
+
На Windows консоль по умолчанию часто **cp1251**; Python `print` падает с `UnicodeEncodeError`
|
|
278
|
+
на символах вне этой таблицы (стрелки `→`, математика в логах и т.п.). Если `print` стоит
|
|
279
|
+
**до** следующего шага пайплайна (например вызова `npx tsx`), скрипт оборвётся и артефакт
|
|
280
|
+
не обновится.
|
|
281
|
+
|
|
282
|
+
- **Запись JSON** — всегда UTF-8; для символов ЯРЭ в формулах не экранируй Unicode в JSON:
|
|
283
|
+
|
|
284
|
+
```python
|
|
285
|
+
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding='utf-8')
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
- **Чтение** — `encoding='utf-8'`; для fetch API предпочитай `urllib` / `requests`, не
|
|
289
|
+
`Out-File` без явной UTF-8 в PowerShell.
|
|
290
|
+
- **Логи в `print`** — ASCII (`->`, `...`) или только id/alias без математики; не полагайся
|
|
291
|
+
на то, что консоль UTF-8.
|
|
292
|
+
- При необходимости Unicode в stdout: `PYTHONIOENCODING=utf-8` или `sys.stdout.reconfigure(encoding='utf-8')`
|
|
293
|
+
(Python 3.7+), но для агентских скриптов проще держать вывод в ASCII.
|
|
294
|
+
|
|
295
|
+
## Не делай
|
|
296
|
+
|
|
297
|
+
- Не парси HTML SPA.
|
|
298
|
+
- Не запрашивай UI напрямую, используй преобразованные API запросы.
|
|
299
|
+
- Не предлагай авторизацию через session cookie или `sessionid` в curl.
|
|
300
|
+
- Не передавай `/details` JSON в `importData` с `kind: 'session'`.
|
|
301
|
+
- Не запрашивай `/details`, если нужны только метаданные.
|
package/docs/README.md
CHANGED
|
@@ -2,12 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Краткая справка для агентов.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Процесс работы** — скилл-маршрутизатор `../skills/rstool/SKILL.md`: он определяет сценарий и этап и называет скилл этапа. Здесь — метод, правила языка и предметной области.
|
|
6
6
|
|
|
7
7
|
## Какой файл читать
|
|
8
8
|
|
|
9
|
+
- **METHOD.md** — метод концептуализации: этапы, гейты, вопросы пользователю, защита от подгонки, синтез; соответствие терминов учебника и Portal.
|
|
10
|
+
- **REQUIREMENTS.md** — как превращать требования к ПО и запросы на изменение в бриф: расчистка пунктов ТЗ, различения, инварианты, типичные решения ядра.
|
|
11
|
+
- **BRIEF.md** — бриф схемы: поля, сценарии подписями, проверка `check-brief`. JSON-схема — **brief.schema.json**.
|
|
9
12
|
- **DOMAIN.md** — термины Portal: конституента, неопределяемые и производные понятия, ядро/тело КС, интерпретация, синтез / встраивание, ОСС.
|
|
10
|
-
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем (в т.ч. терм-функция вместо множества
|
|
13
|
+
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем (в т.ч. терм-функция вместо множества пар, (не)пустота через `∅`).
|
|
11
14
|
- **CONSTITUENTA.md** — структура и правила конституент.
|
|
12
15
|
- **BASE-SELECTION.md** — выбор основания: `X#`, `C#` или `Z`.
|
|
13
16
|
- **SYNTAX.md** — синтаксис ЯРЭ: операторы, генераторы `D{}`/`I{}`/`R{}`, кванторы, `F#`/`P#`.
|
|
@@ -15,6 +18,6 @@
|
|
|
15
18
|
- **TYPIFICATION.md** — типизация (`AnalysisResult.type`, `valueClass`).
|
|
16
19
|
- **MODEL-TESTING.md** — проверка семантики определений на маленьких концептуальных моделях.
|
|
17
20
|
- **DIAGNOSTICS.md** — диагностики анализа и способы исправления ошибок.
|
|
18
|
-
- **PORTAL-API.md** —
|
|
21
|
+
- **PORTAL-API.md** — указатель REST Portal: **PORTAL-READ.md** (ссылка → API, доступ, поиск, импорт), **PORTAL-PUBLISH.md** (протокол публикации, лимиты), **PORTAL-MODELS.md** (интерпретации), **PORTAL-OSS.md** (граф ОСС).
|
|
19
22
|
|
|
20
|
-
Контракт агента `rstool` (library / stdio / MCP) и примеры — `../skills/rstool-
|
|
23
|
+
Контракт агента `rstool` (library / stdio / MCP) и примеры — `../skills/rstool-runtime/REFERENCE.md`, `EXAMPLES.md` (на русском).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Требования к ПО → бриф схемы
|
|
2
|
+
|
|
3
|
+
Как превратить ТЗ или запрос на изменение в требования к выразительным средствам, различения и инварианты брифа ([BRIEF.md](BRIEF.md)). Метод — [METHOD.md](METHOD.md). Выдержки — из примеров [`library-loans`](../examples/library-loans/NOTES.md), [`access-control`](../examples/access-control/NOTES.md), [`clinic-booking`](../examples/clinic-booking/NOTES.md).
|
|
4
|
+
|
|
5
|
+
Назначение такой схемы — `approach: project`: основа для модели данных и проверок. Строгость максимальная: у каждого инварианта позитивный и негативный сценарий, в сценариях — реальные объекты, «сироты» — ошибка.
|
|
6
|
+
|
|
7
|
+
## 1. Расчистка пунктов ТЗ
|
|
8
|
+
|
|
9
|
+
Каждый пункт — в одну из категорий:
|
|
10
|
+
|
|
11
|
+
| Вид пункта ТЗ | Пример | Куда |
|
|
12
|
+
| :----------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------------- |
|
|
13
|
+
| сущность или отношение | «экземпляр — копия одного издания» | ядро (этап 2) и, если есть «один», «каждый», — инвариант |
|
|
14
|
+
| правило «не может», «не больше», «только» | «экземпляр не выдан двоим», «не больше 5 на руках» | инвариант → аксиома |
|
|
15
|
+
| «система показывает / находит / считает …» | «показывает доступные экземпляры» | требование к выразительным средствам: **понятие**, а не функция |
|
|
16
|
+
| состояние, статус, вид | «первичная или повторная запись», «лекция или практика» | классификация: структуры и аксиомы разбиения, не коды `C#` |
|
|
17
|
+
| время, история, журнал | «история выдач», «журнал изменений 3 года» | обычно ограничение `restrictions` с невыразимым |
|
|
18
|
+
| оплата, уведомления, интеграции | «SMS за сутки», «оплата онлайн» | ограничение (вне предметной области задачи) |
|
|
19
|
+
| интерфейс и качество | «удобный поиск», «выгрузка в Excel» | нерелевантно; в схему не идёт, в разметке отмечено |
|
|
20
|
+
| процедура (кто что делает) | «председатель назначает рецензентов» | действие вне схемы состояния; роль — только если нужна правилам |
|
|
21
|
+
|
|
22
|
+
Пункт про действие («система показывает должников») превращается в понятие («должники»). Пункт про процедуру, если он задаёт ограничение («нельзя выдавать должнику»), — решение: аксиома состояния или «без аксиомы — правило процедуры» (`library-loans`, `DC6`).
|
|
23
|
+
|
|
24
|
+
## 2. Различения из ТЗ
|
|
25
|
+
|
|
26
|
+
Ищи пары, которые ТЗ называет одним словом или которые легко склеить при реализации:
|
|
27
|
+
|
|
28
|
+
- сущность и её экземпляр: **издание ≠ экземпляр**;
|
|
29
|
+
- назначенное и действующее: **назначенные права ≠ эффективные**, **прямая роль ≠ унаследованная**;
|
|
30
|
+
- план и факт: **запись ≠ приём**, **назначение ≠ написанная рецензия**;
|
|
31
|
+
- «есть свойство» и «доступно для действия»: **свободный слот ≠ доступный пациенту**;
|
|
32
|
+
- множество и подмножество по правилу: **читатели с выдачами ≠ должники**.
|
|
33
|
+
|
|
34
|
+
Для каждого различения — сценарий-свидетель, где значения различаются. Если свидетеля не придумать — возможно, различения нет.
|
|
35
|
+
|
|
36
|
+
## 3. Инварианты
|
|
37
|
+
|
|
38
|
+
- Формулировка из ТЗ, ссылка `ref`, будущая аксиома.
|
|
39
|
+
- Позитивный сценарий: нормальные данные, правило выполнено. Негативный: нарушено **только это** правило.
|
|
40
|
+
- Числа и пороги («не больше 5», «не больше двух продлений») — граничный сценарий на пороге и за ним.
|
|
41
|
+
- Правила «через» («в том числе через иерархию») — негатив именно на косвенный случай (`access-control`, `SC3`): иначе проверка только прямого случая выглядит «зелёной».
|
|
42
|
+
|
|
43
|
+
## 4. Типичные решения ядра для ПО
|
|
44
|
+
|
|
45
|
+
| Ситуация в ТЗ | Решение | Пример |
|
|
46
|
+
| :------------------------------------------------------- | :-------------------------------------------------------- | :------------------------- |
|
|
47
|
+
| «у X один Y» | отношение + аксиома однозначности, не функция в типе | `library-loans` `A1`, `A3` |
|
|
48
|
+
| на объект ссылаются из нескольких мест | сущность `X#` с отношениями, а не кортеж | `clinic-booking` слот |
|
|
49
|
+
| роли и иерархии | одно множество и отношения; замыкание через `R{}` | `access-control` `F1` |
|
|
50
|
+
| текущее состояние без истории | структуры состояния + «текущий день» `S#: Z` | `library-loans` `S3` |
|
|
51
|
+
| производное значение («права пользователя», «просрочка») | вывод через `D#` / `F#`, не `S#` «задаётся вручную» | `access-control` `DC2` |
|
|
52
|
+
| запрос на изменение меняет смысл понятия | новое решение с `supersedes`; старые сценарии — регрессия | `library-loans` `DC8` |
|
|
53
|
+
| новая информация к старой структуре | отдельная структура, не новая компонента кортежа | `library-loans` `DC7` |
|
|
54
|
+
|
|
55
|
+
## 5. Запрос на изменение (v2)
|
|
56
|
+
|
|
57
|
+
1. Восстанови бриф v1 (или возьми готовый) и сохрани сессию v1 как базу.
|
|
58
|
+
2. Спроси, что должно остаться неизменным (раунд 1).
|
|
59
|
+
3. Новые пункты — новые требования и инварианты; затронутые старые — новые решения с `supersedes`.
|
|
60
|
+
4. `check-brief --base <v1>`: удалённые и ослабленные понятия без нового решения — блокеры.
|
|
61
|
+
5. В отчёте — сводка изменений относительно v1.
|
package/docs/SYNTAX.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
10
|
- Целые: `0`, `42`; отрицательного литерала нет, пиши `0 - 5`.
|
|
11
11
|
- `Z` — встроенная ступень целых (не конституента; отдельной записи `C#` для «целых» не нужно). Сравнение с `C#` — [BASE-SELECTION.md](BASE-SELECTION.md).
|
|
12
|
-
- `∅` — пустое множество с типизацией `ℬ(R0)`.
|
|
12
|
+
- `∅` — пустое множество с типизацией `ℬ(R0)`. В `=` / `≠` подстраивается под ступень сравниваемого множества (`S ≠ ∅`, `S = ∅`). Не используй как нейтральный элемент операций (`X1 ∪ ∅` → `invalidEmptySetUsage`).
|
|
13
13
|
- Скобки и разделители: `()`, `[]`, `{}`, `,`, `;`, `|`.
|
|
14
14
|
- Комментариев в формальных выражениях нет.
|
|
15
15
|
|
|
@@ -103,7 +103,7 @@ R{(ξ, σ) := (STE1, STE2) | LE(ξ, σ) | (STE3, STE4)}
|
|
|
103
103
|
|
|
104
104
|
## Логические выражения (LE)
|
|
105
105
|
|
|
106
|
-
- Предикаты множеств: `ξ ∈ S`, `ξ ∉ S`, `S1 = S2`, `S1 ≠ S2`, `S1 ⊆ S2`, `S1 ⊂ S2`, `S1 ⊄ S2`.
|
|
106
|
+
- Предикаты множеств: `ξ ∈ S`, `ξ ∉ S`, `S1 = S2`, `S1 ≠ S2`, `S1 ⊆ S2`, `S1 ⊂ S2`, `S1 ⊄ S2`. (Не)пустота: `S ≠ ∅`, `S = ∅`, `A ∩ B ≠ ∅` — не через `card(S) > 0`.
|
|
107
107
|
- Арифметические предикаты: `=`, `≠`, `<`, `≤`, `>`, `≥` над `Z`.
|
|
108
108
|
- Связки: `¬A`, `A & B`, `A ∨ B`, `A ⇒ B`, `A ⇔ B`.
|
|
109
109
|
|
|
@@ -120,7 +120,7 @@ R{(ξ, σ) := (STE1, STE2) | LE(ξ, σ) | (STE3, STE4)}
|
|
|
120
120
|
|
|
121
121
|
## Арифметика
|
|
122
122
|
|
|
123
|
-
`a + b`, `a - b`, `a * b` дают `Z`. `card(S)` возвращает мощность конечного множества.
|
|
123
|
+
`a + b`, `a - b`, `a * b` дают `Z`. `card(S)` возвращает мощность конечного множества. Для (не)пустоты пиши `S ≠ ∅` / `S = ∅`; `card` — когда нужна численность (`card(S) = 1`, `card(S1) = card(S2)`, `card(X1) > 5`).
|
|
124
124
|
|
|
125
125
|
## Параметризованные выражения
|
|
126
126
|
|
|
@@ -152,6 +152,7 @@ F2 ::= [α1∈R1×R2, α2∈R1] α2 = pr1(α1)
|
|
|
152
152
|
- `¬α ∈ S1`
|
|
153
153
|
- `D1 ⊆ D2 ⇔ ∀x∈D1 x∈D2`
|
|
154
154
|
- `∀x∈D1 ∃y∈D2 (x, y)∈S1 & (x, x)∈S1`
|
|
155
|
+
- `D1 ≠ ∅`, `F1[a] ∩ F1[b] ≠ ∅`
|
|
155
156
|
- `(4 + 5) * 3`, `card(X1) > 5`
|
|
156
157
|
- `pr2((5, 4, 3, 2, 1)) = 4`
|
|
157
158
|
- `red({{1, 2, 3}, {3, 4}}) = {1, 2, 3, 4}`
|
package/docs/TYPIFICATION.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- `(H1 × H2 × ... × Hn)` — кортеж.
|
|
12
12
|
- `ℬ(H)` — множество значений ступени `H`.
|
|
13
13
|
|
|
14
|
-
`∅` имеет типизацию `ℬ(R0)`: пустое множество подстраивается под контекст.
|
|
14
|
+
`∅` имеет типизацию `ℬ(R0)`: пустое множество подстраивается под контекст. В `S = ∅` / `S ≠ ∅` этого достаточно; `X1 ∪ ∅` анализатор отсекает (`invalidEmptySetUsage`).
|
|
15
15
|
|
|
16
16
|
## Дополнительные типизации
|
|
17
17
|
|
|
@@ -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
|
+
}
|