Перейти до змісту

Поділитися прочитаним (Супряга)

Одну й ту саму архівну книгу сьогодні розпізнає кожен окремо. Прогін коштує недорого, але коштує щоразу: справа на три тисячі аркушів — це години машинного часу, і за них платить кожен, хто до неї дійшов. Текст при цьому однаковий, і в когось він уже лежить готовий.

Супряга (nyshporka.online) — спільний банк прочитаних справ. Їде саме текст, не зображення: справа на 3772 аркуші важить у пакеті 3–4 мегабайти.

Зображення не входять у пакет ніколи

Пакет несе текст рушія й паспорт того, як його отримали. Самі скани лишаються в того, хто їх завантажив, а пакет лише називає джерело — щоб отримувач міг узяти їх там само й на тих само умовах.

Найкоротший шлях

nysh share login                                  # один раз: браузер, одна кнопка
nysh share setup --as "ваше імʼя"                 # один раз: профіль
nysh share pack "ДАХмО 315-1-1234"                # спакувати справу
nysh share publish data/share/outbox/DAHMO_315-1-1234.nyshtext

З того боку:

nysh share pull "ДАХмО 315-1-1234" --take         # знайти в пулі й прийняти
nysh share pull --repo RGIA --fond 592 --opys 25 --take   # уся серія одним викликом

Прийняті прогони лягають туди ж, де своє прочитане, і одразу йдуть у текстовий стор, тож nysh text find, grep і ctx бачать їх без окремого text index. Шукати можна по серії так само, як по справі: nysh text find <прізвище> --case "RGIA 592-25"; кілька справ — повторити --case.

Якщо ділитесь через агента

Скіл share-case веде агента цим самим шляхом і стереже місця, що ламаються тихо: шифру перевіряє в dry-run до заливки, роки каталогу FamilySearch не бере, а картку, задану share card, доводить до пулу повторною заливкою. Ставиться разом з рештою скілів: nysh skills install.

Вхід

nysh share login відкриває сторінку nyshporka.online: увійти поштою чи Google або анонімно. Ключ сам приходить у Нишпорку й лягає у сховище ключів системи — копіювати нічого не треба. Прибрати ключ із машини: nysh share logout. На сервері без браузера ключ кладеться у змінну NYSHPORKA_SUPRIAHA_TOKEN, а видається він у кабінеті.

Шукати, забирати й віддавати пакети пул дозволяє лише з ключем. Якщо його ще немає, pull, sync і publish самі запропонують під'єднатись.

Профіль

nysh share setup без прапорців питає по черзі; з будь-яким прапорцем — лише записує назване й нічого не питає (для скриптів і інсталятора).

поле прапорець типово
псевдонім у каталозі --as без імені
контакт (публічний) --contact, прибрати — --contact - немає
ліцензія тексту --license CC0-1.0
коли віддавати --consent nikoly \| pytaty \| zavzhdy pytaty — вести список і нагадувати
питати пул перед прогоном --lookup / --no-lookup ні
геометрія рядків --geometry / --no-geometry так

Контакт — публічні дані

Він їде в кожен ваш пакет і видний усім, хто його прийме. Ніколи не підставляється сам (ні з git config, ні з імені користувача системи) — лише з профілю, який ви заповнили, або з --contact. Для одного пакета без контакту — --contact -.

Питати пул перед прогоном (--lookup) означає: перед кожним nysh read Нишпорка шле на сервер шифру справи й кількість кадрів і, якщо текст уже є, друкує один рядок. Сервер при цьому бачить, яку справу ви збираєтесь читати, — тому типово вимкнено.

Картка справи: назва, роки, місця, жанр

Пакувальник складає картку сам — з паспорта теки, реєстру опису фонду й бібліотеки справ. Робочі позначки паспорта (дата звірки в дужках, «FS-тег: …», «⚠ …», позначки пріоритету) в картку не йдуть. Коли цього мало — безіменна справа, робоча назва замість справжньої — картку задає той, хто заливає:

nysh share card "ДАХмО 315-1-1234" --title "Сповідні розписи парафії …" \
  --years 1795-1797 --place "Слобідка" --place "Вербівка" --genre confession

Те саме прямо на пакуванні: nysh share pack … --title … --years …. Задане запам'ятовується (data/share/cards.json) і діє на кожне наступне пакування цієї справи — pack, suggest --all, автовіддачу. Подивитись — nysh share card <шифра>, стерти поле — --title "", усю картку — --clear.

Жанри: birth, marriage, death, confession, revision, clergy_list, gazette, finding_aid, other (можна й підписом: «сповідні»).

Де кадри. Коли справу читано з приватної зйомки — колекції дослідника, купленої чи замовленої, — у FamilySearch і Commons отримувачу її не знайти. Картка називає, хто кадри тримає:

nysh share card "ДАХмО 230-1-1234" --scans "Колекція дослідника=https://…"

Посилання їде першим серед посилань пакета, з позначкою role: scans, і в пулі стоїть поруч із текстом: по зображення людина піде саме туди. Як і решта картки, воно запам'ятовується; стерти — --scans "".

Що прочитано, але ще не віддано

nysh share suggest                   # перелік зі статусами
nysh share push --ready              # спакувати й віддати все готове
nysh share suggest --skip "ДАХмО 315-1-1234" --why "платна зйомка"

Статуси: готова, у пулі без рамок, неповна (прочитано менше 80 % кадрів — віддається лише з --partial), без кадрів. Що вже в пулі, вирішує зріз пулу (nysh share sync); справи, яких зріз не охоплює, — за журналом пакувань. Відмова запам'ятовується поштучно: про справу, яку ви вирішили не віддавати, більше не питають.

Багато справ одним заходом

nysh share push пакує й заливає кожну справу, кілька одночасно, і друкує рядок на справу. Пакується --jobs справ одразу (типово 4, не більше 8), а в пул одночасно йдуть не більше трьох: стільки незавершених заливань пул тримає на людину.

nysh share push --ready                          # усе, що suggest --ready показує готовим
nysh share push "ДАХмО 315-1-1234" "ДАХмО 315-1-1235"
nysh share push --from perelik.txt --jobs 6      # перелік із файлу
nysh share push --ready --notes                  # і нотатник кожної справи (note push)
nysh share push --ready --wait                   # на стелі пулу дочекатись і віддати решту

У файлі переліку на рядок — шифра справи або JSON-об'єкт тих самих полів, що приймає pack: так неповну справу віддають із причиною, а зайвий голос лишають удома.

ДАХмО 315-1-1234
{"case": "ДАХмО 315-1-1235", "partial": "прочитано 290 із 408 кадрів"}
{"case": "ДАХмО 315-1-1236", "skip_run": ["315-1-1236-diak_v7"]}

Справа, що не спакувалась чи не залилась, решти не зупиняє: причину видно в її рядку й у підсумку. Відповідь пулу «завершіть попередні заливання» пачка перечікує сама. Стеля, що не минає за кілька хвилин (година, доба), пачку зупиняє, і підсумок називає, коли можна продовжити. З --wait пачка сама спить до цього часу (пул називає його в кожній такій відмові, до доби) і віддає решту: так сотні справ заливаються за ніч без нагляду. Ту саму команду можна повторити: уже віддане пул упізнає за хешем змісту й не заведе вдруге.

Для десятків справ це в рази швидше, ніж pack і publish по одній. Там кожен крок запускає Нишпорку заново, і справи йдуть строго одна за одною.

Що всередині пакета

manifest.json    шифра, картка, джерело сканів, знаменник, ваші поля
frames.jsonl     перелік кадрів справи
runs/<прогін>/   NNNN.txt — сторінка, рядок у рядок; плюс паспорт прогону
README.md        пояснення для того, хто відкриє пакет без Нишпорки

Геометрія рядків (*.lines.json) їде окремим файлом ….geom.nyshtext: вона важить ×10 від тексту й потрібна лише тому, у кого ті самі кадри.

Які прогони їдуть

Голоси пакета — прочитання справи, а не все, що лежить поруч. Лишаються вдома, і pack називає кожен із причиною:

  • вимірювальні прогони (позначка control_run у паспорті прогону);
  • проби: прогін, усі сторінки якого є в повнішому прогоні тієї самої моделі (частини справи, прочитані однією моделлю, їдуть обидві);
  • прогони іншої справи з подібним іменем;
  • чужі прийняті прогони — їх віддає автор, не ви;
  • названі вами: --skip-run <прогін>.

Знаменник — головне поле

Маніфест каже, скільки кадрів має справа й скільки з них прочитано, якою моделлю й чи перевірялася орієнтація. Без цього чужий декод виробляє хибні нулі оптом: людина грепне три сторінки, прийняті за три тисячі, не знайде прізвища — і чесно закриє напрям, зробивши все правильно.

Тому пакет із неповним декодом або без назви моделі просто не збереться. Прочитали шматок навмисно — скажіть, чому:

nysh share pack "ДАХмО 315-1-1234" --partial "лише аркуші з нашим селом"
nysh share pack "ДАХмО 315-1-1234" --frames 408        # число кадрів справи, якщо пакувальник його не знайшов

Ваші поля

nysh share pack "ДАХмО 315-1-1234" \
  --as "sergiy" --contact "t.me/…" \
  --note "читав Дяком, останні аркуші підмокли" \
  --link "звідки скани=https://…" \
  --extra "plivka=105208823"
  • --note — вільний текст, він доїжджає до читача й потрапляє в README пакета.
  • --link — «підпис=адреса» або саме посилання; найкорисніше те, що веде на скани. Адреса з = усередині (посилання FamilySearch) розбирається цілою.
  • --extra — пари «ключ=значення», які формат пронесе недоторканими. Пара без =, з порожнім ключем чи названа двічі — відмова, а не мовчазний пропуск.

Що в пакет не потрапляє

Пакувальник бере лише сторінки тексту й паспорт прогону — і з паспорта лише поля, потрібні отримувачу: модель, рушій, письмо, скільки сторінок зроблено. Не їдуть шляхи вашого диска, робочі нотатки (*_note, пояснення замірів, історія злиття), кропи рятунку, журнали, карантин, сховище сторінок, вердикти, канон.

Подивитися, що саме поїде, можна до збирання:

nysh share pack "ДАХмО 315-1-1234" --dry-run

Нотатник справи

Крім тексту, про справу часто відомо ще щось, корисне кожному, хто її відкриє: що в книзі насправді, де опис архіву помилився в назві чи роках, де лежить копія. Сюди ж — рядок, який рушій прочитав криво, а ви звірили зі сканом. Усе це — нотатник справи. Він лежить поруч із переглянутими аркушами й іде в Супрягу окремо від тексту: дописати його можна й до книги, яку віддав хтось інший.

nysh note add "ДАХмО 315-1-1234" --kind about --text "Метрична книга Покровської церкви, 1834–1836" --share
nysh note add "ДАХмО 315-1-1234" --kind catalog-error --field years --archive-says 1834 --actually "1834–1836" --share
nysh note add "ДАХмО 315-1-1234" --kind copy --other "ДАВіО 904-24-55" --text "копія в консисторії" --share
nysh note read "ДАХмО 315-1-1234" 0031 --line 153 --text "урожденная Прухницкая" --share

nysh note push "ДАХмО 315-1-1234" --dry-run   # що поїде
nysh note push "ДАХмО 315-1-1234"             # віддати
nysh note pull "ДАХмО 315-1-1234"             # що дописали інші

У Супрягу їде лише позначене --share і список переглянутих аркушів без ваших коментарів. Родинне — «тут записаний мій дід» — пишіть як --kind note: такий запис не їде ніколи, а запис із родинними словами пул не прийме, навіть позначений. На сторінці книги нотатник видно окремо від тексту, і в число прочитаних сторінок він не входить: звірене оком — це вибрані рядки, а не прочитана справа.

Звірений рядок їде в Супрягу разом із кропом — вирізкою цього рядка зі скану, сірим JPEG, якщо скан справи є на вашому комп'ютері (без нього рядок їде лише текстом). Поширюючи звірені рядки, ви погоджуєтесь, що власник Нишпорки може використати їх для навчання моделей розпізнавання. Іншим користувачам кропи не віддаються й на сторінці книги не показуються; текст звірки видно всім. Відкликаний запис (nysh note retract і note push) забирає з пулу й кроп.

Прийняти чужий пакет

Якщо берете через агента

Скіл pull-case веде агента від pull до пошуку по прийнятому й читає мітку прив'язки вголос: що з чужого тексту ляже на ваші кадри, а що — лише для пошуку.

nysh share inspect <файл або адреса>     # подивитись, нічого не розкладаючи
nysh share import <файл або адреса>      # прийняти
nysh share geometry <….geom.nyshtext>    # докласти рамки рядків

Пакет приходить від людини, якої ви не знаєте, і приймач йому не вірить на слово:

  • ворота міряють вміст, а не заяву: сторінки, рядки й хеш тексту рахуються з самого пакета, і пакет, що заявляє більше, ніж у ньому є, не проходить;
  • вада пакета — відмова до запису: шлях поза runs/<прогін>/<файл>, ім'я, недопустиме на Windows, посилання, завеликий файл — і на диск не лягає нічого;
  • розкладаються лише прогони, названі в маніфесті, і лише текст із паспортом; паспорт чиститься тим самим білим списком;
  • ваше прочитання не перезаписується ніколи — навіть із --force. Прогін із тим самим іменем (без огляду на регістр) — відмова. --force замінює лише пакет, прийнятий раніше;
  • пакет за адресою з каталогу звіряється з його sha256 (share pull --take робить це сам; для import і geometry за адресою — --sha256): файл, підмінений у сховищі вже після того, як пул його прийняв, не приймається.

Наскільки чужий текст ляже на ваші кадри

Ключ справи для цього не годиться: він збирається з імені теки й вашого довідника архівів, тож у двох людей та сама книга дістає різні ключі. Тому пакет несе перелік кадрів і відбиток зйомки, а Нишпорка вимірює збіг і каже вголос:

мітка що це означає що працює
exact збіглися всі кадри (хеш чи ідентифікатор FamilySearch) або відбиток зйомки щонайменше на трьох кадрах усе, включно з кропами й чужою геометрією
by-name збіглися імена й кількість усе, крім чужої геометрії
by-position збіглася лише кількість або частина кадрів сторінка так, кроп під сумнівом
text-only кадрів немає або вони інші пошук, сторінка, шифра

Чужа геометрія лягає лише до тексту того самого внеску і лише при exact; інакше — відмова з поясненням (--force, якщо ви певні).

text-only — не поразка, а найчастіший сценарій користі: ви знаходите прізвище в чужому тексті, бачите справу й номер аркуша — і йдете дивитися сам скан у джерело.

Збіг імені файлу не означає той самий кадр

Плоский стейджинг перенумеровує сторінки, тож дві зйомки однієї книги легко дають однакові імена при різному вмісті. Саме тому мітка ніколи не підвищується здогадом.

Свій нуль і чужий нуль — різні відповіді

Прийняті прогони позначені, і пошук це називає:

знаменник: кадрів 3772 · прочитано 3770 · у сторі прогонів 2 із 2 …
з них чужий декод: прогонів 2 із 2 · сторінок 3770 · від oksana

Чужий текст читала інша модель, за його повноту тут ніхто не відповідає, а перечитати його можна лише попросивши в того, хто дав. Нуль на ньому важить менше, ніж нуль на своєму, — і це має бути видно.

Пул

nysh share pull                     # огляд пулу: архів · фонд · опис, справ і сторінок
nysh share pull "Слобідка"          # що є в каталозі
nysh share pull "ДАХмО 315-1-1234" --take
nysh share pull --repo RGIA --fond 592           # серія: що в ній є
nysh share pull --repo RGIA --fond 592 --take    # і прийняти всю
nysh share stats --catalog          # хто скільки вніс
nysh share sync --repo DAHMO --fond 315   # зріз для колонки «пул» у `cases fond`

Каталог — API https://api.nyshporka.online/v1. Своє дзеркало або тестовий сервер задається змінною NYSHPORKA_TOLOKA чи прапорцем --base; ключ Супряги на таку адресу не їде — ні зі сховища ключів, ні з NYSHPORKA_SUPRIAHA_TOKEN. Свій сервер треба назвати явно: NYSHPORKA_SUPRIAHA_TRUST=https://хост[:порт] — лише HTTPS і лише точний збіг адреси; тоді на нього їде ключ Супряги. Петля цієї машини (127.0.0.1, localhost) довірена й так.

sync із --repo/--fond дописує зріз одного фонду до наявного; про фонди, яких зріз не охоплює, колонка «пул» каже «не знаємо», а не «немає».

Відмову пулу (ворота, денна норма) Нишпорка друкує словами сервера, а на стелі — ще й час, після якого повторити. Коли той самий текст уже є в пулі, publish каже, чи він прийнятий, чи колись відхилений, чи ще не завершений, — «уже в Супрязі» означає лише перше.

Слід обміну

data/share/journal.jsonl пам'ятає, що звідки прийшло й що куди пішло, а прийняті пакети лишаються в data/share/inbox. Це не облік заради обліку: факт, узятий із чужого декоду й унесений у канон, мусить спиратися на постійний файл — інакше цитата провисне, щойно ви приберете завантаження.

nysh share list          # журнал
nysh share stats         # скільки віддано, скільки прийнято, від кого

Ліцензія

Пакет називає, на яких умовах віддається текст (--license, типово CC0-1.0), і окремо — умови джерела сканів (--source-terms), якщо вони є. Без ліцензії пакет не збереться: отримувач має знати, що з цим можна робити.