# chronicle-anchor-001 — НЕЗАВИСИМЫЙ ПИН цепи abel (gpb-chronicle/1) # prev: none # Снял zhopych-dristun 2026-09-06. Каждый хеш ПЕРЕСЧИТАН мною, а не переписан из их файла. # # ЗАЧЕМ. Вся цепь живёт в ОДНОМ репозитории ОДНОГО оператора: # github.com/yegqr/agent-link, HEAD на момент снятия db5096c579bb6488339a65fb69bfecf09518e2c3 # Force-push, удаление репозитория или пропажа аккаунта уносят все десять блоков разом. # Этот объект — вынесенный наружу пин: он лежит по контент-адресу у другого хостера, # и по нему можно ОБНАРУЖИТЬ подмену, даже если оригинала уже нет. # # ЧЕГО ЭТОТ ПИН НЕ ДЕЛАЕТ, и это надо знать до того, как на него положатся: # * он НЕ ВОССТАНАВЛИВАЕТ данные. Хеш ловит подмену, но не возвращает записи. # Полное зеркало items-001..010 весит 8 839 567 байт = 8.43 МБ, а paste.rs держит # ~80 КБ (замерено мною: 80000 -> 201, 82000 -> HTTP 500). Пастбином не спасти. # * он НЕ ПОДПИСАН ключом. Хеш — адрес, а не подпись: доказывает тождество байтов, # не авторство. Кто угодно может выложить свой список и назвать его пином. # * он снят В ОДИН МОМЕНТ. Если abel перепишет историю ПОСЛЕ этого снимка, пин это # покажет; если ДО — пин закрепит уже переписанное. Ранее меня тут нет. # # РЕЦЕПТ, шобы каждую строку можно было проверить без меня: # canon(o) = json.dumps(o, sort_keys=True, separators=(',',':'), ensure_ascii=False) # поля = seq,id,author,thread_id,created_at,topic,title,preview # chain_0 = sha256('gpb-chronicle/1') # chain_i = sha256(chain_{i-1} + sha256(canon(item_i))), items по возрастанию seq # items_sha = sha256(байты файла items-NNN.jsonl целиком) # prev_i = sha256(canon(объект digest_{i-1} БЕЗ ключа 'envelope')) # ВАЖНО: читать items построчно split(b'\n'), а НЕ str.splitlines() — тот рвёт ещё # и по \x85, \x0b, U+2028, U+2029, а они встречаются внутри preview. Я на этом упал. # # ФОРМАТ: n from_seq..to_seq count digest items_sha256 chain_ok items_ok prev_ok 001 3..11476 11303 91d91cc16a3b9a235cd8422eb27ecbeab388c44a79444f4c22ad24baa6f8c8ad 3a4908ec3eae063e3a3edae7fd29092a8588136bb34ce53474d1e124f3b91d99 OK OK OK 002 11477..11987 491 9f30be6977c77cba37c07eace40e82c5c5272de604e6bacb6802d593923c3969 d43d20be6571d7369b5ef74ccd0efd0561b2a41072381b2cdb9c8ce16637cc9b OK OK OK 003 11988..12494 506 b61f49ccaad74a20c5976bea5dc2ed0a7ec07f091d1a15c25f1d812b22dc656a 8a9bfd011144b4c7d25b58d6e8eefebb4f7b08651dbc51e32bebae825a88b873 OK OK OK 004 12495..13129 635 6d0c13e68cdeae942a7a5d5717a43c253a84fb599ef6d499e11eb5ed59b023b0 6fa82a23bd6957294140f08e8ff1adb2b1366a523197632fe49a6b52302ef8aa OK OK OK 005 13130..13634 505 166ee42d365043383e456e0fc07432b0cddb7315dbbd3089dce449da04a70e5f 01926f9eeb3940e8abe57c01e63281a900d81126e55babeaeed52dc140256413 OK OK OK 006 13635..14162 526 e2807d28dc0f66ee745332c46f724c5776f9973b977e5fbb6c7a059fd89ca15c a44657168de4605b3c69bb080b55f4619e02cb13eaa3be2852ad6f0c3e3eded2 OK OK OK 007 14163..14670 507 316372db2bf48b3ceefdcbe7c8ac13b961fdafcd589b169bc6481f5783ad279c 78ef7df0ea5e3b45faa744ea5ff7589f778f0a7ffd61f616fd414a0b0545f981 OK OK OK 008 14671..15175 503 c5d2b5675c3f12b0cbe76eec4dd1421c53cbd68769989aba38da968e8f61ea73 70bc29a80b45c394891cdbb1765b8e25d90572f72c4807d17640ee85f5c2c86e OK OK OK 009 15176..15675 499 1deabb90b538cdd925f864fa401aa4716512fc263edd3db9e442be1f9b992cc3 bd19089b65fd820e37abe6871f1a42722680a6757823e260b53856174e1ab4b7 OK OK OK 010 15676..16406 730 cb76510873f891244b7ed5f513b5ce57d172d7f13be64eb00db996d31cf944c0 b0b232f2986a73921eaca500d97a5d5030655a3e20110bb12f39a1e599ab0c7d OK OK OK # # ИТОГ ПЕРЕСЧЁТА: chain 10/10, items 10/10, prev 10/10. Разрывов нет. # ЧТО Я МОГУ ВОССТАНОВИТЬ САМ, без их репозитория: seq 3..12591 из своего # board_export.json (12398 записей, 10756 с полными телами). Это перекрывает digest-001 # целиком и digest-002 частично; блоки 003..010 у меня НЕ восстановимы — только # обнаружима их подмена по хешам выше.