Що я вмію — і чим саме до цього дотягуюсь¶
Читати згори: спершу про дві поверхні, бо половина розчарувань тут — не «застосунок не вміє», а «я стукав не в ті двері».
🔴 Твоя поверхня — командний рядок¶
Операцій у реєстрі 191, і командний рядок дістає усі:
nysh op workspace.info # без аргументів
nysh op pages.status --args '{"case": "230-1-4"}' # з аргументами
nysh op search.run --args '{"q": "Іваненко", "where": "decode"}'
| поверхня | скільки операцій | як звертатись |
|---|---|---|
| командний рядок | усі 191 | nysh op <ім'я> --args '<json>' або дружня команда (nysh search …) |
браузер (nysh serve) |
ті самі, що ввімкнені секцією | кнопки людини |
Застосунок (nysh serve) один на Майстерню. Проєкт кожен запит несе сам: вкладка — в адресі (?p=<ім'я>), HTTP-клієнт — заголовком X-Nysh-Project; без нього — проєкт, з якого застосунок запустили.
Простір, де рід лежить у корені (старого типу), переводиться в Майстерню з проєктом роду командою nysh project adopt <ім'я>: спершу план, потім --apply --archive <тека>, відкат — --rollback.
Стартовий перелік (nysh ops --agent) — 25 операцій ядра, з яких починають
дослідження. Це карта входу, а не межа: решта реєстру так само доступна через
nysh op, і серед неї geog.find (де взагалі є метрики цього села по ВСІХ
фондах), church.find (чи була в селі церква ~1772, чия, і де тепер її книги),
archive.fond (чи входить опис у ключ справи), parish.in_case (які села
всередині зведеної книги — до того, як її читати), read.plan, library.list.
Ядро і пошук: якою командою це робиться¶
Кожна дія має рівень: ядро — те, з чого складається звичайний день
дослідження; ситуативне — потрібне під конкретну задачу; рідкісне —
службове, людське, лабораторне. До ядра входять і друковані команди поза
реєстром (nysh read, nysh cloud go, nysh cloud state, nysh doctor).
nysh ops --map # карта ядра «команда — коли брати», групами
nysh ops find зупинити оренду карти # яка команда під цю ситуацію
nysh ops find метрики села --json # те саме машинно: tier, when, skill, scope
Карту ядра хук старту сесії друкує сам (nysh project status --agent), тож її
не треба вчити напам'ять. Решту не перебирай --help по черзі: ops find
шукає по «коли брати», підпису й докстрінгу і відповідає друкованою командою.
Карта й пошук показують лише те, що в цьому просторі виконається: вимкнена
секція, проєкт, відкритий лише для читання, і проєктний шар у чистій Майстерні
відсіяні (--all — показати все).
Ситуацію, яку веде процедура, а не одна команда («куди ще копати», «прийняти
куплену зйомку»), ops find відповідає ще й скілом: ▶ скіл <ім'я> — його
вантажать цілим, перш ніж діяти. Вимкнений у проєкті скіл (skillOverrides)
пошук не радить. Самі скіли переліків команд не тримають: команди — з карти й
ops find, у скілі лишаються порядок кроків, ворота й приймачі.
До ядра входять і cases.build (реєстр після будь-якої дії), share.pull
(взяти прочитане з Супряги замість прогону), share.pack і share.push
(віддати прочитане), share.card (картка справи в пулі) — скіли pull-case і
share-case.
Браузер і командний рядок — тонкі обгортки одного реєстру: та сама валідація,
той самий конверт відповіді, ті самі попередження. Розійтись вони не можуть —
це перевіряється тестом (test_triptych_parity.py), а не домовленістю.
⚠ MCP-сервера (nysh mcp) більше немає — прибрано в 0.19. Якщо в
конфігу агента ще прописаний сервер nyshporka, його треба прибрати
(claude mcp remove nyshporka або рядок у .mcp.json); порядок переходу —
nysh migrate.
🧭 Після оновлення пакета — міграція агента. Якщо workspace.info чи
дашборд кажуть agent_migration, частина того, що ти знаєш про Нишпорку,
застаріла: nysh migrate (що змінилось і які кроки ще не зелені),
nysh migrate --scan (застарілі тези у твоїй пам'яті й нотатках),
nysh migrate --done. Операції — migrate.status, migrate.scan,
migrate.done; порядок — скіл migrate.
Розвідка: імена, аргументи, причини¶
Найдорожче тут — вгадувати назви полів. Не вгадуй, питай:
nysh ops # перелік для ока: ✎ пише · ⏳ довга · 🤖 стартовий
nysh ops --agent # лише стартовий перелік
nysh ops --json # усе разом зі схемами аргументів, машинно
nysh op pages.note --describe # одна операція: схема + ПОВНИЙ докстрінг
--describe нічого не виконує — навіть у мутації. Це важливо: інакше єдиним
способом дізнатись аргументи запису лишався б виклик «щоб подивитись, що
відповість», тобто запис у чуже сховище заради довідки.
🔴 --describe віддає те, чого немає більше ніде. У переліку nysh ops до
тебе доїжджає однорядковий підпис; у докстрінгу операції лежить причина, чому
вона така, — із замірами й ціною помилки («дефолт — рядок, бо сторінка коштує
моделі вчетверо дорожче», «позиційний розбір уже віддав 2944 справи з нулем
аркушів, і за числом рядків це виглядало успіхом»). Якщо поведінка здається
дивною — причина майже напевно там, і прочитати її дешевше, ніж здогадуватись.
🔴 Довга робота: два режими, і вибір робиться ДО виклику¶
Читання справи й завантаження кадрів — години. Такі операції не повертають результат, вони повертають посилання на завдання, а завдання живе в черзі. Черга є тільки в піднятому застосунку.
| що робиш | черги немає (типово) | черга є (nysh serve в іншому вікні) |
|---|---|---|
| прочитати справу | nysh read <тека> — читає в процесі, друкує прогрес |
nysh op read.start → стан через nysh op job.query |
| завантажити кадри | nysh get <джерело> <ref> --out <тека> — маніфест ДО качання |
nysh op acquire.start → nysh op job.query |
| перезібрати реєстр | nysh cases build |
кнопка в застосунку |
| кілька справ поспіль | nysh queue add <справи> → nysh queue run — кадри, паспорт, каталог, пул, читання, облік, віддача; стан — nysh queue |
nysh queue start — той самий виконавець у фоні |
Синхронний шлях — не запасний, а основний: прогін ставлять на ніч, часто по ssh, і вимагати для найдовшої роботи піднятого браузера означало б зробити її найкрихкішою.
Викликана без черги, довга операція відповідає відмовою «підніміть nysh
serve» — чесно, але дізнається про це той, хто вже витратив хід. Тому режим
названо в докстрінгу: nysh op read.start --describe каже це перед тим, як
ти щось запустиш.
⚠ nysh read не має ідемпотентності. Повторний запуск = другий прогін по
тій самій теці, який б'ється з першим за карту. Перед запуском перевір, чи
читання вже не йде (nysh op runs.list).
Чотири кроки, які роблять раз на сесію¶
У стартовому переліку їх немає навмисно — це не робота дослідження, а
орієнтація в чужому просторі. Через nysh op вони теж доступні (setup.check,
profile.show, sections.show), але дружня команда друкує їх зрозуміліше.
| потрібно | команда | чому це важливо |
|---|---|---|
| стан машини | nysh doctor --json |
хмарна тека й CPU-збірка torch — усе, що потім виглядатиме як «зависло» |
| чий рід шукаємо | nysh profile |
без профілю всі написання прізвища доводиться пригадувати самому — і нуль виходить із неповного набору |
| увімкнені частини | nysh sections |
вимкнена секція відмовить посеред роботи, а не на початку |
| перезібрати реєстр | nysh cases build |
після твоїх же записів реєстр застаріває |
Карта дій¶
Колонка «команда» — як дістати операцію з командного рядка; nysh op <ім'я>
працює для будь-якої, дружня команда там, де вона є, друкує зрозуміліше.
Орієнтація¶
| операція | команда | що прочитати у відповіді |
|---|---|---|
workspace.info |
nysh op workspace.info |
locked_by: не null — людина працює в браузері просто зараз |
cases.list |
nysh op cases.list |
stale — якщо is: true, числам вірити не можна |
material.look |
nysh op material.look |
чи взагалі придатне до читання: скільки кадрів, одна справа чи багато |
sources.list |
nysh op sources.list |
caps — не кожне джерело вміє все; about — клас, межі (scope) і що доводить нуль (zero_means); undeclared — хто без опису |
library.list |
nysh op library.list |
що вже на руках і який вердикт винесла людина |
runs.list |
nysh op runs.list |
що вже прочитано і чим |
Знайти матеріал¶
| операція | команда | що прочитати |
|---|---|---|
catalog.search |
nysh op catalog.search |
coverage і попередження: у яких каталогах шукали. Без source іменні бази (martyrolog) не питаються — coverage.not_asked; з source=martyrolog покриття бази по архівах — coverage.basis[].by_archive. Шифра в запиті («127-1078-1662») веде адресним маршрутом: address у відповіді, address_route у попередженнях, каталоги при цьому НЕ прочісувались |
catalog.browse |
nysh op catalog.browse |
— |
catalog.manifest |
nysh op catalog.manifest |
обсяг у байтах: справа буває 30 ГБ |
geog.find, geog.card |
nysh op geog.find · nysh op geog.card |
де є метрики села по всіх фондах, а не лише в православному розділі; картка несе location (точка з пака places, how=ambiguous — однойменних в області кілька) |
geog.near |
nysh op geog.near |
сусідні села газетира в колі, одразу з числом справ; знаменник — лише села з точкою |
church.find, church.card, church.near |
nysh op church.find · nysh op church.card · nysh op church.near |
чи була в селі церква ~1772 (Кольбук, Socjografia), якого деканату, з якою присвятою — і, через зшивку з газетиром, де тепер її книги; near — коло сусідніх парафій того ж часу. 🪤 Однойменне село в іншому воєводстві зшивається теж, з позначкою region=mismatch |
catalog.search з --source sks / sks-osoby |
nysh find "<село>" · nysh find "<прізвище> [ім'я]" --source sks-osoby |
покажчики гродських книг XVII–XVIII ст. (пак courtbooks): місце чи особа з роллю в акті, книгою ЦДІАК ф.44/ф.40 або загубленою KAC і адресою акта на сторінці укладача; parish.find показує згадки села окремим блоком. 🪤 Покажчик, не звірений текст — [?] укладача лишається сумнівом |
archive.fond |
nysh op archive.fond |
🔴 чи входить ОПИС у ключ справи цього архіву — недогляд тут уже злив дві книги в одну справу |
fond.list, fond.rows |
nysh op fond.list · nysh op fond.rows |
що описано й що з того вже в нас |
Читати й дивитись¶
| операція | команда | що прочитати |
|---|---|---|
page.text |
nysh op page.text |
lines — готовий перелік рядків; geometry.has |
page.view |
nysh op page.view |
note — чи не підмінили рядок сторінкою |
page.lines |
nysh op page.lines |
рамки рядків, коли треба клікати по знімку |
read.plan |
nysh op read.plan |
чим і як читатимемо — до запуску: письмо, модель, скільки кадрів |
🔴 Дефолт page.view — рядок, і не міняй його без потреби. Ціла сторінка
коштує моделі приблизно вчетверо дорожче за вирізку рядка, а звірок за сеанс
бувають десятки. Сторінку бери свідомо: коли потрібен контекст навколо запису
(заголовок, ліва колонка формуляра, сусідні акти).
Навколо рядка домальовується рамка. Без неї ти бачиш кілька рядків і не знаєш, який із них оцінюєш, — і чесно оцінюєш не той.
Подивитись на рядок із термінала можна — перевірено:
nysh op page.view --args '{"run": "…", "page": "0012.jpg", "line": 3}'
Поле image — data URL (data:image/png;base64,…); розкодуй base64 у файл і
відкрий його засобами свого середовища. 🔴 Це не обхідний маневр, а нормальний
шлях: якщо ти вирішив, що без окремого інструмента звірка неможлива, ти закриєш КРОК 4 —
єдиний, на якому кандидат стає знахідкою, — і подаси людині текстовий здогад
замість зображення.
Шукати й записувати¶
| операція | команда | що прочитати |
|---|---|---|
search.run |
nysh op search.run |
знаменник у попередженні + line_index кожного хіта; role/rtype/axis звужують і потрапляють у coverage. Кожен хіт каже, ЯКИМ написанням знайдений (stem_origin) і чи опущений чужим словом (rank_why) — опущений НЕ зникає. anchors додає другий канал (ім'я + по батькові поруч) окремим списком, record — третій (ознаки родини з різних колонок одного запису), selfcheck — recall на тому, що вже виписало око; усі три в межах справи. family — чий рід (ключ профілю); порожньо — рід, написанням якого є запит, серед усіх профілів файла |
text.grep |
nysh text grep <регекс> --case <справа> |
регекс по СИРОМУ тексту прочитаного замість rg по теці прогонів: та тека в .gitignore (ripgrep мовчки віддає нуль) і тримає мільйон файлів (обхід — хвилини). coverage.prefiltered каже, чи звужено корпус літералами регексу; нуль — зі знаменником |
text.grep --where canon|opys|notes|pages|all |
— (nysh text grep <регекс> --where all) |
той самий регекс по канону, реєстрах опису, нотатках reports/ (без теки прогонів) і сховищу сторінок разом із нотатником справи (pages) — «ми це вже знаємо?» одним запитом; layers.coverage каже, скільки файлів прочесано в кожному шарі |
text.state, text.index |
nysh text state · nysh text index |
скільки прогонів у сторі і скільки застаріло; після нових прогонів — index; index --accept-rules — прийняти відбиток правил без перебудови, коли мінявся лише спосіб його рахувати. Пошук прізвища (search.run) бере стор сам, щойно той покриває область: coverage.backend. state --verify [--sample N] [--case X] — ДОКАЗ однорідності замість заяви відбитка: кандидати звірених сторінок перераховуються чинним кодом і порівнюються з блобами; verify.differ[].rules_same=true означає, що відбиток бреше і index цього прогону не побачить — лікує index --rebuild --case <прогін>. Код виходу 1 на розбіжності |
text.ctx, text.voices |
nysh text ctx <справа> <скан> [--line N] · nysh text voices |
сторінка навколо рядка з УСІМА голосами, сусіди за геометрією (geo_next/geo_prev), роки справи, чи бачило око; voices — рядок до рядка, agree означає надійне ЧИТАННЯ, не приналежність |
text.crop |
nysh text crop <справа> <скан> <рядок> |
PNG рядка з кадру за рамкою рушія, з поворотом і масштабом; типово разом із наступним рядком (перенос). Відповідь несе frame, orient, scale_k, out |
text.coverage, text.whatis |
nysh text coverage [--unsearched] · nysh text whatis <справа> |
«що не дивились»: кадри → прочитано → у сторі → чим шукали → око, по справах; картка справи з реєстру, паспорта, прогонів і найчастіших слів тексту |
text.find |
nysh text find <прізвище> [--case <справа>] [--family <ключ>] |
усі канали пакета разом: прізвище всіма написаннями роду (склейки через рядок і колонку вже в кандидатах стору), якорі імен роду у вікні років справи, запис (ознаки родини з колонок одного запису за геометрією), самоперевірка на аркушах ока. Рід — будь-який профіль файла: названий або впізнаний за запитом. ledger називає кожен канал: ганяли — з числами, не ганяли — з причиною; нуль без журналу не друкується |
text.sheet, text.verdicts ✎ |
nysh text sheet <прізвище> --case <справа> · nysh text verdicts <json> --case <справа> |
HTML-гортач кандидатів із контекстом, другим голосом і кропом; вердикт («наш рід», «уже в каноні», «інше прізвище», «не прізвище», «не читається») виносить ЛЮДИНА в полі картки, кнопка збирає JSON; verdicts заносить його у сховище сторінок як partial — і негативні теж, щоб той самий аркуш не дивились двічі |
pages.status |
nysh op pages.status |
перед переглядом, не після |
pages.note ✎ |
nysh op pages.note |
— |
note.read, note.add ✎ |
nysh note read <справа> <скан> --line N --text … · nysh note add <справа> --kind about\|catalog-error\|copy\|note |
нотатник справи (той самий файл сховища): звірене оком читання РЯДКА з рамкою й читанням рушія; опис справи, помилка опису архіву, копія деінде; особисте — note. НЕ голос прогону: у знаменник не йде, нуля не дає. Скіл case-notebook |
note.push, note.pull ✎ |
nysh note push <справа> [--dry-run] · nysh note pull <справа> |
у Супрягу їде лише позначене --share загальне знання + переглянуті аркуші без коментарів; push — дія від імені людини, лише з її згоди |
records.add ✎ |
nysh op records.add |
replace стирає всю справу й вимагає confirm числом |
export.case |
nysh op export.case |
кожен рядок несе скан |
pages.show |
nysh op pages.show |
сховище як воно є: agent, noted, один запис за rid |
case.register ✎ |
nysh op case.register |
— |
⚠ line_no і line_index — різні числа. Перше для людини (з одиниці),
друге — індекс рамки для page.view (з нуля). Передаси не те — побачиш
сусідній рядок і не помітиш цього.
Канон роду¶
Канон — картки осіб, родин, місць і джерел у data/canonical/** (MD з
YAML-шапкою). Правиш його ти, файлами: команд «додай особу» немає навмисно,
бо текст картки ти правиш краще за будь-яку форму. Операції нижче — механіка
навколо правки. Порядок, формат і рубрика впевненості — canon.md, скіл
keep-canon. У git-просторі nysh canon hook --install ставить pre-commit, що не
пускає аркуш замість вирізки й помилку в картці, яка комітиться.
| операція | команда | що прочитати |
|---|---|---|
canon.check |
nysh canon check [--hash] [--info] |
після КОЖНОЇ правки: схема, зв'язки в обидва боки, хронологія, місця й джерела, докази на диску й у маніфесті. Помилки — дані, а не збій: errors у відповіді, код виходу 1 |
canon.index ✎ |
nysh canon index |
перебудувати базу роду (data/derived), з якої читають дашборд, реєстр справ і сайт; дописує в маніфест доказів, хто їх цитує |
canon.next |
nysh canon next [--limit 3] |
що людині вирішити першим: відкриті гіпотези роду (data/canonical/hypotheses/) за вагою, з командами кропу хітів. Показуй не більше трьох рішень за раз |
canon.new_id |
— (nysh canon new-id person\|family\|place\|hypothesis) |
ID нової картки. Не вгадуй: вгаданий ID перетирає чужу картку. Нічого не резервує — пиши картку одразу |
canon.import ✎ |
nysh canon import <файл.ged> [--dry-run] |
засіяти ПОРОЖНІЙ канон із GEDCOM іншої програми; злиття немає. Факти приходять як hypothesis з цитатою на сам файл; --trust-tree — лише якщо людина сказала вірити дереву |
site.build ✎ |
nysh site build [--public] · nysh site serve |
сайт роду з канону: приватний (живі з датами до десятиліття) або відкритий (живих немає, HTML перевіряє сторож — витік видаляє HTML). Скіл build-site |
evidence.add ✎ |
nysh evidence add <кроп> -p <походження> |
доказ у постійний стор ДО факту в каноні: сірий JPEG ≤ 2 МБ, хеш, маніфест. Шлях із відповіді йде в media[] і в цитату |
⚠ Твої записи нічим не стримані¶
Мутації (pages.note, records.add, case.register, evidence.add, правка карток канону) пишуть на диск
одразу: без підтвердження, без токена, без блокування. Якщо людина працює в
браузері паралельно, ви пишете в те саме сховище.
І кожен твій успішний запис застарює реєстр людини — вона побачить у себе
«⚠ зріз застарів». Це нормально й задумано, але означає: після партії записів
виконай nysh cases build, інакше і твій наступний cases.list, і її екран
показуватимуть учорашню картину.
Позначку «пише на диск» видно до виклику: ✎ у nysh ops, поле
"mutates": true у --describe.
🛑 Чого немає навмисно¶
Тут різниця принципова: стартовий перелік — про те, з чого почати; цей розділ — про те, чого для тебе немає ніде.
| немає | чому |
|---|---|
cases.bind серед агентних |
прив'язка «нічийого» прогону до справи — рішення людини, яке перебиває всі автоматичні канали. Правдоподібна прив'язка = чужий декод під правильною шифрою, з якого потім цитують знахідки |
library.verdict серед агентних |
вердикт «наше / не наше» виносить дослідник. Твоя частина — покласти кандидата з кропом |
sections.set, sample.install серед агентних |
переналаштування застосунку й розгортання зразка — не робота дослідження |
Ці операції існують і доступні nysh op, але виконує їх людина, а не ти:
побачивши їх у переліку, не роби з цього дозволу.
Якщо тебе питають, чого бракує¶
Не канону: він є, і вести його — твоя робота (canon.md). Знахідка йде з
прочитаного в канон у такому порядку: запис аркуша (pages.note, records.add)
→ кроп (text.crop) → доказ у стор (evidence.add) → картка → canon.check →
canon.index. Вердикт «це наш рід» при цьому виносить людина; ти вносиш те,
що вона підтвердила, або кладеш гіпотезу з позначкою hypothesis.