48 KiB
R2 · K1 — несущие утверждения трёх проектов, проверенные исполнением
Консилиум 35. Роль K1 — опровергатель фактов кода исполнением. 16.09.2026.
Приборы:
- Код —
5dbb5cb(/home/ubuntu/tm-verify-1509). - Пробы с новыми тестами — tar-копия
S/k1-copy. - Пробы, которым нужна правка кода, — ОТДЕЛЬНАЯ tar-копия
S/k1-mut.- В ней две правки, обе под переменными окружения:
K1_A2— проектная A-2,K1_DROP— фильтр кандидатов вместо предиката A-1. diff -rq … backend→diff files: 2.
- В ней две правки, обе под переменными окружения:
- S =
/tmp/claude-1000/-home-ubuntu-projects-textmachine-main/82fde8aa-b52b-41ef-b579-3e857a884242/scratchpad. - Провайдер — только $0-стаб пакета
newJSONProvider. Базы —mode=ro&immutable=1. - Пробы ничего не утверждают: каждый шаг печатает, что сделал настоящий код, и вердикт читается из текста.
Сводка
- A — ОПРОВЕРГНУТО 1, УТОЧНЕНО 5.
- Механизм A-1 и порядок «до перекроя» подтверждены исполнением: детерминированному фильтру адрес по содержимому не нужен (q8).
- Неверна посылка «
freqиsince_chрастут с покупкой» (q1). - A-2 не трогает ловушку резюма, но нарушает формулу петли онтологии 18 шире, чем названо (q6).
- Взять: A-1 (убирать решённых из батчей), A-4 и довод против предиката B (q3).
- B — ОПРОВЕРГНУТО 4, УТОЧНЕНО 3.
- Три блокера:
- «
族長/族长— два кандидата»: это уже один кандидат, механизм B построен; - «
方正решён контекстом»: ключ бьёт по обычному слову; - «свёртки — данные»: таблица вшита в ядро.
- «
- Предикат «черновики согласны с банком» для строк движка неинформирован: черновики этих строк не видят (q3).
- Взять:
hiddenв словарь классификатора как вопрос владельцу;$0-проба резюма (исполнена в q8).
- Три блокера:
- C — ОПРОВЕРГНУТО 5, УТОЧНЕНО 2.
- Цена «с главы N» подтверждена сквозь (q2).
- Не держатся:
- «
freqрастёт»; - «адрес по содержимому работает»: позиция входит в хеш;
- «воспроизводится тем же чекпойнтом»:
drafts: ×Nдвигает байты на каждой покупке; - «N1 нужен для подписанных строк»: двухходовка выражает преемника (q7).
- «
- Взять: форму A «с главы N» и её цену, N3 журнал, N4.
- q10 (центральное):
- Смены 12/69 и 14/66 пришли НЕ от новой улики: собственный блок кандидата не менялся у 25 из 26.
- Во всех 26 батчах сменился запрос. У A — состав и якорь. У B в 13 случаях из 14 для модели добавилось только сообщение-якорь.
- В батчах B «соседи те же, добавлен только якорь» словом сменились 11 из 43 терминов, в самом чистом — 6 из 20.
- Тела запросов не сохранены, поэтому влияние якоря от стохастики не отделено.
Часть 1. Вопросы ведущего q1–q10
Логи:
S/k1-probe/r2-copy.log— 604 строки: 340 лога движка, 264 строки проб;S/k1-probe/r2-mut.log— 690: 561 и 129;S/k1-probe/r2b-copy.log— 57: 22 и 35.
Строки проб прочитаны целиком.
Прогоны — все ok, GO_EXIT=0:
cd S/k1-copy/backend && go test -count=1 -v -run 'TestK1R2' ./internal/membank/ ./internal/text/ ./internal/pipeline/;cd S/k1-mut/backend && go test -count=1 -v -run 'TestK1M' ./internal/pipeline/;cd S/k1-copy/backend && go test -count=1 -v -run 'TestK1R2A0|TestK1R2B2' ./internal/terminology/ ./internal/pipeline/.
q1. Какие байты батча терминолога меняются между покупками при неизменном кандидате
Цепь:
- Кандидаты собираются по кускам ВСЕЙ книги (
bookrun.go:182→waverun.go:179→mining.go:80-83). RenderBatch(terminology.go:771-800:key · type · origin · freq · since_ch · aliases · related · evidence · drafts · ctx).- Упаковка и сортировка батчей по убыванию частоты (
terminology.go:1206-1241). - Адрес —
Chunk{Chapter: 0, ChunkIdx: i}(terminologist.go:974,:1011).ChunkIdxвходит вRequestHash(render.go:366). - Якорь
⟦TM-CANON⟧— отдельное сообщение (terminologist.go:639-643).
Проба: S/k1-copy/backend/internal/pipeline/k1_r2_probe_test.go, TestK1R2Q1BatchBytesAcrossPurchases.
- Майнинг и терминолог включены,
batch_runes: 1, покупки через--max-units 1. - LOW (5 глав): черновик гл. 2 впервые предлагает
青茅山(частота ниже); гл. 3 не предлагает ничего; перед P4 дверью подписан方正. - HIGH (3 главы): черновик гл. 2 впервые предлагает
蛊虫с САМОЙ высокой частотой.
Вывод (дословно):
[LOW] === P1 … pos=0 hash=fa1e248e8067 tm_hit=0 · pos=1 hash=65f4fc1e70c1 tm_hit=0
PAID pos=0 heads=[方源] canon="" 方源: freq=20 since_ch=1 drafts="Фан Юань ×1"
[LOW] === P2 … pos=0 hash=99a17fbc435f tm_hit=0 · pos=1 hash=65f4fc1e70c1 tm_hit=1 · pos=2 hash=927669802594 tm_hit=0
WATCH 方源: field diff vs its previous PAID sighting = [drafts: "Фан Юань ×1" -> "Фан Юань ×2"] (fields compared: 10)
PAID pos=2 heads=[青茅山] 青茅山: freq=10 since_ch=0 drafts="гора Цинмао ×1"
[LOW] === P3 (ch3 draft proposes nothing) … pos=0,1,2 tm_hit=1 ; provider terminologist calls this run=0
[LOW] === P4 (after signing 方正) … pos=0 hash=662f699d3a78 tm_hit=0 · pos=1 tm_hit=1 · pos=2 tm_hit=1
PAID pos=0 heads=[方源] canon="⟦TM-CANON⟧\n方正\\tФан Чжэн" WATCH 方源: … = [drafts: "Фан Юань ×2" -> "Фан Юань ×3"] (fields compared: 10)
[HIGH] === P1 … PAID pos=0 [方源] freq=12 drafts="Фан Юань ×1" · PAID pos=1 [花家] freq=12 drafts="" (hash 68fc2d8c05a4)
[HIGH] === P2 … PAID pos=0 [蛊虫] freq=18 · PAID pos=1 [方源] diff=[drafts ×1 -> ×2] · PAID pos=2 [花家] freq=12 since_ch=1 drafts="" (hash cd783460d7ba)
Контроль: P3 LOW, где новых вариантов нет, — 3 of 3 строк tm_hit=1, провайдер не вызван.
Вердикт (а) — состав и порядок:
- Новый кандидат с меньшей частотой встаёт в хвост, неизменный батч отдаётся за $0:
花家tm_hit=1на P2–P4. - Новый кандидат с большей частотой встаёт вперёд. Батч с ТЕМИ ЖЕ байтами перекупается из-за сдвига позиции: HIGH
花家68fc2d8c05a4→cd783460d7ba. - Подпись родственного термина добавляет
⟦TM-CANON⟧в его батч.
Вердикт (б): из 10 полей блока неизменного кандидата меняется ТОЛЬКО drafts: ×N. freq, since_ch, evidence и
ctx1..3 постоянны. Байты батча двигают ещё соседи, позиция и якорь.
«freq растёт с покупкой» — ОПРОВЕРГНУТО у A (§5.2) и C (§2 П1 п.2, N2).
- Условие, при котором вывод перестанет держаться: растёт сам исходник. Платформа этого не допускает (q9).
«Раз на книгу» (D39.226 п.4, D39.89) против «полной консолидации на каждой покупке» (D39.170 (2)) — формулировки по отметке ведущего:
- по коду каждая покупка запрашивает весь набор кандидатов (
terminologist.go:973-983) и платит за батчи со сменившимися байтами или позицией; ×Nрастёт у каждого кандидата, встреченного заново;- ⇒ верна D39.170 (2). «Раз на книгу» — лишь нижняя граница: покупка без новых встреч, P3 — 0 оплаченных.
- Тот же вывод записан в
backend/configs/pipeline-c1.yaml:161-162: «книга, проданная десятью покупками, платит десять книжных консолидаций».
q2. Окно не рендерится ⇒ при преемнике главы < N байт-идентичны
Юнит: S/k1-copy/backend/internal/membank/k1_r2_probe_test.go, TestK1R2Q2WindowIsNotRendered.
memory Version: one=7930e2e062fbe7a6 succDst=7972e721033101ad succGender=a3aa7e053cdc7c9c
ch=1..4: succDst: draft-equal=true editor-equal=true | succGender: draft-equal=true editor-equal=true
ch=5,6: draft-equal=false editor-equal=false ; ch=5 editor succGender="…\n- 白凝冰 → «Бай Нинбин» (жен. — женские родовые формы)"
Сквозь: TestK1R2Q2Q7WindowsThroughTheDoorEndToEnd, плечо «q2 SUCCESSOR».
- Книга 6 глав, без майнинга.
- Дверью
approve (0,0)→ RUN1 →decline→approve (0,4) «Бай Нинбин»+approve (5,0) «Бай Нинбин-после»→ RUN2.
RUN2 … rebill_units=2 rebill_usd=0.003640
RUN2 … unit re-pinned at $0: the bank moved but this unit's injected bytes did not stage=edit chapter=1 …
RUN2 provider calls=map[EDIT 昏六:1 EDIT 晓五:1] (total 2) ; edit ch1..ch4:[hit=1 $0.000000] edit ch5:[hit=0 $0.001820] edit ch6:[hit=0 $0.001820]
D1 … decline ID:2175b12788d00e05 … D2 … approve ID:1193aa93062828e2 …
Контроль: в RUN1 перекуплены все 6 правок, у каждой в запросе закон.
Вердикт: ПОДТВЕРЖДЕНО — цена формы A у C (§2 П7, §6.1):
- главы < N — репин $0, в том числе при смене рода;
- главы ≥ N — перекупка под согласием.
Попутно ПОДТВЕРЖДЕНО C §6.1: у старой строки после смены окна меняется TermID (2175… → 1193…).
q3. Черновая волна не видит строк движка
Цепь: базовый банк черновой волны отбрасывает Source=="mined" (bankmaterialize.go:318-333). mined — это и
авто-банк (mining.go:734), и дельта из двери (вывод ниже: source=mined).
Проба: TestK1R2Q3DraftWaveNeverSeesMinedRows. Сид — 祠堂; P1 → дверью approve 花家 → P2.
P2 store: 方源=[{… status=draft source=mined …}] 花家=[{… "род Хуа-подписанный" status=approved source=mined …}] 祠堂=[{… approved source=seed …}]
P2 req 0 DRAFT 午二 law: 祠堂=["祠堂 → родовой храм…"] 方源=[] 花家=[]
P2 req 2 EDIT 午二 law: 祠堂=["- 祠堂 → «родовой храм»"] 方源=["- 方源 → «Фан Юань»…"] 花家=["- 花家 → «род Хуа-подписанный»"]
Вердикт: ПОДТВЕРЖДЕНО, и шире:
- черновики не видят ни строк движка, ни подписей владельца из двери; видят только сид (контроль);
- ⇒ согласие черновиков со строкой движка неинформировано;
- строка INVENTED не встанет «решённой» по правилу
bankSettles(terminologist.go:1243-1247) никогда.
Довод A против B держится.
q4. Таблица трад.→упрощ.: ядро или данные пары
Проба: TestK1R2Q4FoldsAreCoreAndLanguageBlind.
NormalizeSourceKey("族長")="族长" · ("發見")="发见" · ("発見")="発见" · ("國家")="国家" · ("スズキ")="すずき" · ("ABC")="abc"
NormVersion() = memnorm-v3-…+trad+kana+lower…-a6c1259543b1 ; parsed trad2simp entries = 500
go list -f '{{.EmbedFiles}}' ./internal/text → textmachine/backend/internal/text embed=[data/trad2simp.txt]
Контроль:
trad2simp.txtв5dbb5cbлежит по двум путям:backend/internal/text/data/иeval/pilot/, при 1711 tracked-файлах.- В
backend/configsодно упоминание «traditional» —langpacks/zh-ru/dc-checkers.txt:11-13, классы числительных, не таблица свёрток.
Вердикт:
- B §2 П8 «данные, не код» — ОПРОВЕРГНУТО. Таблица вшита в ядро (
norm.go:47) и применяется к любому языку: японский見→见. - A, C и заказ — ПОДТВЕРЖДЕНО.
q5. Срабатывает ли ключ 方正 на обычном слове
Проба: TestK1R2Q5NameKeyFiresOnOrdinaryWord, кусок 此人为人方正,从不说谎。.
[type=name status=draft] editor block="…\n- 方正 → «Фан Чжэн»" ; [type=term] — то же
[type=name status=approved gender=male] editor block="…\n- 方正 → «Фан Чжэн» (муж. — мужские родовые формы)"
[type=name since_ch=2, read at chapter 1] injected=[REJECTED(window) …] editor block=""
CONTROL chunk without the key: injected=[] (все 4) ; strings.Contains(editor header, область)=false
Вердикт:
- B §3 класс 4 «УЖЕ РЕШЕНО контекстом» — ОПРОВЕРГНУТО.
- A и C — ПОДТВЕРЖДЕНО: до первого появления держит окно, после — ничего.
- Контроль данных:
injection.txt— 13 строк, 0 хитовобласт|игра слов|буквальн|разбор знаков.
q6. A-2: стоп пишет авто-банк без seedGlossary
Проба: k1-mut, TestK1MQ6StopWritesTheAutoBank. Правка A-2 стоит после r.lastBankStopRows = rows
(mining.go:266).
[BASE] RUN1 stopped=true … auto-bank file: … no such file or directory rows=0 ; store glossary rows=0 ; bank.json terms=0 (…signature-stop terms=0 … awaiting_signature_outside_the_bank=3)
[BASE] RUN2 (resume) provider calls=map[edit:1] ; terminology rows=1 tm_hits=1 ; run-start/seeded terms=0
[A2] RUN1 stopped=true … auto-bank file: readErr=<nil> rows=3 ; store glossary rows=0 ; bank.json terms=0
[A2] RUN2 (resume) provider calls=map[edit:1] ; terminology rows=1 tm_hits=1 ; glossary materialized entries=3 ; run-start/seeded terms=3
Вердикт:
- Ловушку резюма (
terminologist.go:1158-1172) A-2 не задевает — ПОДТВЕРЖДЕНО. Строки движка не входят в «решённые» поверхности (:1181). - УТОЧНЕНО — онтология:
- На стопе источник (3 строки) расходится с видом (0 строк). Это против
18-bank-ontology.md:17и против формулы петли:24-25(«пере-сидит вид В ТОЙ ЖЕ границе»). - Эррата нужна к обеим строкам.
bank.jsonна стопе при A-2 по-прежнемуterms=0: платформа ничего нового не видит.
- На стопе источник (3 строки) расходится с видом (0 строк). Это против
- Не исполнено:
statusмежду стопом и резюмом при A-2 сворачивает файлы (bankmaterialize.go:336-345) и покажет 3 строки приbank.json= 0. Это чтение.
q7. Преемник для ПОДПИСАННОЙ строки (C N1 (i)–(iii))
Проба А, дверь (TestK1R2Q7SignedSuccessorThroughTheDoor):
(i) approve (5,0) NEW dst over SIGNED (0,0): refused=[{… firing key "方正" is shared by different terms … (livelock …)} {… term "方正" (sense ""): spoiler windows [0,0] and [5,0] overlap with different dst … — a term has ONE rendering per chapter}]
(ii) decline … then approve (5,0): delta=[{src=方正 dst=Фан Чжэн-младший status=approved since=5 until=0}] ; chapter 3: injected=[REJECTED(window) …] editor=""
(iii) two approves (0,4)+(5,0) in ONE request over an ENGINE row: refused=[] … delta=[{… since=0 until=4} {… since=5 until=0}]
(iii-b) the same two approves over the SIGNED (0,0): refused=[… те же два текста …]
Проба Б, сквозь:
[q7(i)] D1 … err=the decision document was refused; nothing was written ; RUN2 provider calls=map[] (total 0)
[q7(ii)] RUN2 rebill_units=6 rebill_usd=0.010920 ; PAID EDIT 晨一 law=[] · 午二 law=[] · 暮三 law=[] · 夜四 law=[] · 晓五/昏六 law=["- 白凝冰 → «Бай Нинбин-после»…"]
[q2 SUCCESSOR: decline; затем approve (0,4) прежняя + (5,0) новая] RUN2 provider calls=map[EDIT 昏六:1 EDIT 晓五:1] ; edit ch1..ch4 hit=1 $0
Вердикт:
- (i), (ii), (iii) — ПОДТВЕРЖДЕНО.
- C §5 N1 «две двухходовки не выражают форму A … N1 нужен для подписанных строк» — ОПРОВЕРГНУТО.
declineплюс ОДНИМ документомapprove (0,N-1)с прежней передачей иapprove (N,0)с новой выражают преемника и для подписанной строки, с верной ценой: главы 1–4 на репине $0.- Это и есть «two-call operation» из
decisions.go:90-92. - Третий глагол покупает атомарность, а не выразимость.
q8. Работает ли A-1 без адреса батча по содержимому
Проба: k1-mut, TestK1MQ8FilteredCompositionRebuys.
K1_DROPснимает названного кандидата вdropBankSettled, то есть там, где встал бы предикат A-1.- Плечи ×
batch_runes1 и 900; в каждом плече свежая книга, run1 полный, run2 с фильтром.
batch_runes=1: DISCOVERY pos0 方源 · pos1 白凝冰 · pos2 花家 · pos3 祠堂 · pos4 青茅山
CONTROL: paid 0 of 5
DROP 方源 (FIRST): pos=0 PAID 白凝冰 | bytes IDENTICAL to run-1 pos=1 · pos=1 花家 IDENTICAL to pos=2 · pos=2 祠堂 IDENTICAL to pos=3 · pos=3 青茅山 IDENTICAL to pos=4 — paid 4 of 4
DROP 花家 (MIDDLE): pos=0,1 TM-HIT ($0) · pos=2,3 PAID, IDENTICAL to run-1 pos=3,4 — paid 2 of 4
DROP 青茅山 (LAST): paid 0 of 4
batch_runes=900: DISCOVERY pos0 方源,白凝冰 · pos1 祠堂,花家 · pos2 青茅山
CONTROL: paid 0 of 3 ; DROP 方源: paid 2 of 2 (heads 白凝冰,祠堂 · 花家,青茅山 — новые составы) ; DROP 祠堂: pos=0 TM-HIT · pos=1 PAID — paid 1 of 2 ; DROP 青茅山: paid 0 of 2
Вердикт:
- Детерминированный фильтр ловушку резюма не открывает (CONTROL: 0 оплаченных).
terminologist.go:1158-1164описывает фильтр, решающий по-разному на двух прогонах. - Снятие кандидата перекупает его батч и все батчи после него.
- При одном кандидате на батч перекупленные батчи байт-идентичны — их спас бы адрес по содержимому.
- При упаковке хвост переупаковывается, и адрес по содержимому не спасает ничего.
- Боевое умолчание — 6000 рун (
terminologist.go:74); у A 4 батча на 69 кандидатов.
- ⇒ Пак A ставится до перекроя — ПОДТВЕРЖДЕНО.
- ⇒ «Предусловие — адрес по содержимому» (B §2 П1, C N2 (а)) — УТОЧНЕНО: для детерминизма он не нужен и экономит мало.
q9. Отдаёт ли платформа движку исходник всей книги
Цепь:
- Интейк пишет загрузку ОДНИМ файлом:
platform/internal/books/books.go:217s.receive(filepath.Join(dir, SourceName+extensionOf(in.Filename)), in.File)→:396-397os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o640). - Имя уходит в
source_file:render.go:88-96,:188-196;book.yamlпишется один раз,O_EXCLна:109. - Движку передаются только
--configи--max-units(runner/engine.go:116-135).
Контроль второго писателя: в не-тестовом коде internal/books и internal/httpapi хитов os.Create|os.OpenFile| os.WriteFile|Rename( — 3:
books.go:397— загрузка;books.go:540— маркер хранилища;render.go:109—book.yaml.
Исполнено в замороженном дереве:
--- PASS: TestTheRenderFillsInWhatThePlatformKnowsAndCarriesTheRestThrough
render_test.go:177: TM_PLATFORM_TEST_DSN not set: the intake's statuses need a live Postgres
--- SKIP: TestAnUploadedBookIsProvisionedFromTheDeploymentTemplate
--- PASS: TestTheSourceFileIsFoundNextToTheConfiguration
Вердикт: движок получает ВСЮ загруженную книгу, объём ограничивает только --max-units.
- R1 p5 «контексты и частоты по всей книге с первой покупки» держится.
- Посылка A-5 «видит раскрытие на первой покупке» — тоже.
- Слепо:
- интейк с Postgres (SKIP);
- книга, загруженная частями: на месте расти не может, продолжение — это другая книга.
q10. От чего поменялись передачи у 12/69 и 14/66 между проходами терминолога
Где лежат тела запросов — нигде.
request_log— без тела.checkpoints— толькоresponse_text.- Файлы с
Термины книги/TM-CANON/"messages": A 0 из 2+72+69 (logs/evidence/stand), B 0 из 5+114+137. LOG_LLM_BODIESвenv.shA и B — 0 строк. Движок пишет тела только приLOG_LLM_BODIES=1иLOG_LEVEL=debug(backend/cmd/tmctl/main.go:211-214).
Что сохранено:
- тексты ответов всех вызовов терминологии (длина > 0; у B пуст только
id 14— обрыв классификатора); - позиции батчей;
- между проходами черновики не пере-делывались: A
id 17-22и Bid 19-24—banknote_export,tm_hit=1, $0.
Прибор: python по checkpoints.response_text. Ключи ответов равны множеству спрошенных: unanswered = 0 в обоих
проходах.
- Контроль: A — отвечено 69 из 69 в проходе 1 и 68 в проходе 2; B — 66 и 65.
- Не спрошен в проходе 2
方源. Подписанный古月山寨спрошен и в проходе 2.
Общие хеши между проходами — утверждение баннера 06 подтверждено:
- A: классификатор 0 из 3; терминолог 0 при 4 батчах в проходе 1 и 3 в проходе 2;
- B: классификатор 0 из 3; терминолог 1 — поз. 3,
id 31,tm_hit=1.
Разбор по строкам:
A (12): у всех 12 — comp_same=False (упаковка 4→3 батча), anchor_p2=True ; тип в запросе сменился у 1 (宗祖祠堂 place→term) ; stop dst == ответ прохода 1 у 12
A батчи прохода 2: pos0 (21) WORD change=8 · pos1 (24) WORD=1 form-only=2 · pos2 (23) WORD=1 — все COMPOSITION changed
B (14): comp_same=True у 13 (соседи те же, сменились позиция и якорь), False у 九族 ; тип в запросе сменился у 0 из 14 ; stop dst == ответ прохода 1 у 14
B батчи прохода 2: pos0 (23) ANCHOR+POSITION only: WORD=5 form-only=2 (тип сменился у 3 термов батча) · pos1 (20) ANCHOR+POSITION only: WORD=6 (тип сменился у 0) · pos2 (20) COMPOSITION changed: WORD=1 · pos3 (2) REPLAYED: WORD=0
TOTALS B: anchor_only n=43 word=11 form=2 ; composition n=20 word=1 ; replayed n=2 word=0
Классы по 26 строкам:
- (г) «тот же вход, другой ответ» — 0 по построению. Ни один батч сменившихся строк не совпал по хешу, а при совпавшем хеше ответ отдаётся из чекпойнта.
- (в) собственная улика не менялась у 25 из 26:
freq,since_ch,ctx— исходник целиком и тот же;drafts— черновики из кэша;- единственное исключение — тип
宗祖祠堂(A).
- A, 12 строк — (б) соседи + (а) якорь одновременно. Развести нельзя.
- B, 13 строк — только (а) якорь для модели; позиция влияет на кэш, модель её не видит.
九族— соседи + якорь. - Якорь реконструирован правилом
CanonFor(terminology.go:856-880) по ключам батча и подписанным方源/古月山寨— это чтение, тел нет. По содержанию он родственен только古月族长(B) и方老魔/熊家寨/白家寨(A).
Смена словом, а не кавычками или регистром, в ответе модели прохода 2:
- A — 10 из 12 (только форма:
咏梅,方老魔); - B — 12 из 14 (только форма:
咏梅,将敬酒).
Популяция и контроль — как в F1: 69/66 строк.
Вывод:
- Смены не пришли от новой улики о книге.
- В самом чистом батче B (соседи и типы те же, добавлено только сообщение-якорь, по содержанию не относящееся к ним) словом сменились 6 из 20 терминов.
- Это лучшая доступная улика «пере-решение = чувствительность к составу запроса, а не знание».
- Причинно она не доказана: не отделены влияние якоря и стохастика.
- Слепое звено: тела запросов. Закрывается включением
LOG_LLM_BODIES=1на следующем платном прогоне — $0 сверху — или платным повтором входа прохода 2 N раз (М4 у A, санкция).
Утверждение 06:920 «В прогоне B у 52 из 58 терминов с одним вариантом этот вариант пришёл из одного куска» —
ПОДТВЕРЖДЕНО двумя приборами:
bank.json:with exactly one variant: 58 ; one variant AND ×1: 52, распределение{1: 52, 3: 2, 2: 2, 4: 1, 5: 1};bank-stop.txt:single-variant lines: 58 ; single AND ×1: 52.
Часть 2. Несущие утверждения по проектам
Серьёзность — по общему брифу.
Всего проверено несущих утверждений: A — 20, B — 17, C — 21. Ниже:
- отдельно — все ОПРОВЕРГНУТЫЕ и УТОЧНЁННЫЕ;
- списком — ПОДТВЕРЖДЁННЫЕ с прибором.
Проект A — ОПРОВЕРГНУТО 1 · УТОЧНЕНО 5
| # | серьёзность | раздел | утверждение | проверка → вывод | вердикт |
|---|---|---|---|---|---|
| A1 | минор | §5.2 A-1 | «Не входят freq, since_ch и счётчики «×N», которые растут с каждой покупкой» |
q1: freq=20/since_ch=1 постоянны на P1–P4; меняется только drafts ×N. Исключение полей из отпечатка безвредно, довод неверен |
ОПРОВЕРГНУТО (для freq/since_ch) |
| A2 | минор | §2 П1 | «Пере-спрошенные попадают потому, что сменились их байты, и их батч перекупается при любом адресе» | q8: батчи ПОСЛЕ первой снятой позиции перекупаются и при тех же байтах (br=1: 4 из 4 идентичны). Вывод «вторичная экономия» при боевой упаковке верен (br=900) | УТОЧНЕНО |
| A3 | серьёзное | §2 П1 «Вывод, не замер» | «большинство смен — это новый бросок на той же улике» | q10: собственная улика та же у 25/26 — да; но запрос сменился у всех 12 A (состав + якорь), «бросок» не отделён. Лучшая улика в пользу тезиса — батч B «только якорь»: 6/20 | УТОЧНЕНО |
| A4 | серьёзное | §5.3 A-2 | «Цена. Эррата к 18-bank-ontology.md:17» |
q6: нарушена и формула петли :24-25 («пере-сидит вид в той же границе»). На стопе bank.json terms=0 и при A-2 |
УТОЧНЕНО |
| A5 | минор | §2 П2 | путь двойника (1): «Сид с 族長 и строка 族长 в mined-delta … хранилище принимает обе» |
Дверь отказывает решению по поверхности сида (R1 TestK1P3PairThroughTheDoor R2/R3; нормализация decisions.go:401). Сборка отказывает approved×approved (R1 «both approved» → glossary shared-key collisions). Проходит только ручная правка файла с неподписанной стороной |
УТОЧНЕНО |
| A6 | минор | §3 проба под A-5 | «368/3 … 180/343 … 146/142»; «378 из 1404 (27 %)» | Пере-снято описанным прибором (guzhenren-utf8.txt, 2308 маркеров): 白凝冰 375/16 · 174/330 · 148/143; 方源 372/1423 (26.1 %); 方正 корзина 2100 6/8 — точно. Направление сходится, числа нет |
УТОЧНЕНО |
ПОДТВЕРЖДЕНО у A (14):
- П3 п.4, отказ прозой:
TestK1R2A0ProseRefusalBecomesARendering→"家族":"не термин","族长":"90". Контроль:—/?→Bad:2. - §5.1: стоп получает все чанки (
bookrun.go:182);scope.allows— 2 хита (waverun.go:144,:238); плюс q9. - A-0: протухшие комментарии
miner_emit.go:224-227(«an auto term is outside the CONFIRMED-only injection») иterminologist.go:33(«declines emitsauto, inert») — против R1 p1. - П2:
trad2simp.txt563 строки,:434 長 长,:432 發 发,髮— 0. - П2: писатели движка двойников не порождают —
mining.go:82,miner_emit.go:106,mining.go:612, плюс проба B2. - П1: смены, делящие знак с подписанными, — 3/12 (
方老魔,熊家寨,白家寨) и 1/14 (古月族长). - П1: терминолог A — 4 вызова против 3.
- §3: 7 778 990 знаков, 2308 маркеров,
方正2529,古月方正313. - П6:
emissionEligibleminer_emit.go:345-349. - §5.1: фильтр до первого платного —
terminologist.go:371против:405; якорь — только approved (:325-330). - Довод против B (q3).
- Порядок «пак до перекроя» (q8).
- Классификатору
hiddenзапрещён (classifier.md:54-55). - A-2 не трогает ловушку резюма (q6).
Проект B — ОПРОВЕРГНУТО 4 · УТОЧНЕНО 3
| # | серьёзность | раздел | утверждение | проверка → вывод | вердикт |
|---|---|---|---|---|---|
| B1 | блокер | §2 П2 | «Сегодня 族長 и 族长 — это ДВА разных кандидата (сырой ключ) … терминолог решает их НЕЗАВИСИМО, двумя батчами». Новое: «давать терминологу оба написания как ОДИН кандидат» | TestK1R2B2TradSimpAreOneCandidate (оба написания в исходнике и в банкноте): heads=[方源 族长], 族长 … drafts:глава клана ×1 | глава рода ×1 … key:族长, 族長 block=map[]; авто-банк — одна строка src: 族长. Кандидат ключуется нормализованно (terminologist.go:1052-1056). Механизм B уже построен |
ОПРОВЕРГНУТО |
| B2 | блокер | §3 класс 4 | «方正 УЖЕ РЕШЕНО контекстом, не строкой» |
q5: ключ бьёт по «为人方正» при type=name и type=term, у подписанного — с родовым приказом |
ОПРОВЕРГНУТО |
| B3 | блокер | §2 П8 | «Свёртки написания исходника — данные, не код (internal/text/norm.go:47)» |
q4: embed=[data/trad2simp.txt] в пакете ядра, без параметра языка; японский 見→见 |
ОПРОВЕРГНУТО |
| B4 | серьёзное | §2 П1 (а) | для строк движка «та же логика, что уже держит фильтр для сида … все наблюдаемые рендеринги равны банку» | q3: сид черновики ВИДЯТ (祠堂 в черновом запросе), строки движка и подписи двери — НЕТ. Согласие неинформировано; INVENTED (A 11/69, B 17/66) по построению не сойдётся никогда (terminologist.go:1243-1247) |
ОПРОВЕРГНУТО |
| B5 | серьёзное | §2 П1 | «предусловие моего расширения — контент-адресуемый чекпойнт … Без этого фикса расширение фильтра просто СОЗДАСТ вторую версию того же провала» | q8: детерминированный фильтр отдаёт за $0 (CONTROL 0/5, 0/3); ловушка :1158-1164 — про фильтр, решающий по-разному. Адрес по содержимому экономит только несдвинутую упаковку |
УТОЧНЕНО |
| B6 | минор | §2 П2 | «три независимых стража» сравнивают сырую строку | Верно для трёх названных. Опущен нормализующий отказ approved×approved (ApprovedSharedKeyCollisions: firing key "族长" is shared …, R1) |
УТОЧНЕНО |
| B7 | минор | §4(б) | «потолок эмиссии майнера (200/книга, miner_emit.go:31)» |
emitRankCap = 200 на miner_emit.go:33 |
УТОЧНЕНО |
ПОДТВЕРЖДЕНО у B (10):
- «Analyst» — 0 файлов из 466 tracked в
backend. classifier.md:54-55дословно.proposedпуст на не-стоп границах:bankexport.go:62«Empty at every boundary that is not a stop» и лог q6awaiting_signature_outside_the_bank=0наauto-continue.- Family co-batching построен:
series.go:199,:333;family-morphology.txt:28family_affix han name prefix 2;bccf2d8 2026-08-08 Land the bank cluster fixpack…. - Пропуски якоря
terminology.go:872-873,:941. pipeline-c1.yaml:173budget_usd: 1.00.InjectVoice—bankmaterialize.go:295.- П3 —
miner_emit.go:262-268(R1 p1). - §8 строка 1, $0-проба «число пере-купленных батчей должно СОВПАСТЬ на резюме без изменений» — исполнена в q8 CONTROL.
- §6 п.3 цена сплит-окна — репин $0 (q2).
Отрицание «сплит-детектор не построен»: sense_split_candidate — 0 файлов из 466; контроль DetectFamilies — 3.
Проект C — ОПРОВЕРГНУТО 5 · УТОЧНЕНО 2
| # | серьёзность | раздел | утверждение | проверка → вывод | вердикт |
|---|---|---|---|---|---|
| C1 | серьёзное | §2 П1 п.2, N2 | «Покупка глав меняет freq старых терминов ⇒ батч с изменёнными байтами пере-покупается»; «сырой freq … меняются на каждой покупке» |
q1: freq/since_ch постоянны, меняется drafts ×N. Противоречит собственному п.3 C |
ОПРОВЕРГНУТО |
| C2 | серьёзное | §2 П1 п.2 | «Значит адрес по содержимому работает — не хватает лишь того, чтобы содержимое старого термина не менялось» | Адрес включает позицию (render.go:366 req.ChunkIdx, terminologist.go:1011). q1 HIGH: 花家 с теми же байтами перекуплен после сдвига |
ОПРОВЕРГНУТО |
| C3 | серьёзное | §2 П1, N2 | «Иначе решение воспроизводится: батч с тем же содержимым — тот же чекпойнт» | q1 (б): у повторяющегося термина drafts ×N меняется на каждой покупке ⇒ «тот же» батч не повторится. Работает только снятие решённых из батча (форма A-1) или рендер без счётчиков |
ОПРОВЕРГНУТО |
| C4 | серьёзное | §5 N1 | «две существующие двухходовки не выражают форму A П7 … N1 нужен для подписанных строк» | q7 и плечо q2: decline + approve (0,N-1) + approve (N,0) выражают преемника подписанной строки; главы < N — репин $0 |
ОПРОВЕРГНУТО |
| C5 | минор | §2 П2 | «сырое написание живёт только у строк сида и майнера» | terminologist.go:1052-1056: «A mined candidate lands with the MINER's surface, which is a substring of already-normalized chunk text». Проба B2: исходник с 族長, в авто-банке src: 族长 |
ОПРОВЕРГНУТО («и майнера») |
| C6 | серьёзное | N2 предпосылка (а) | «адрес батча по содержимому, а не по позиции … иначе «не спрашивать» не останавливает «платить»» | q8: как B5 | УТОЧНЕНО |
| C7 | минор | §5 | читатель журнала «вне тестов не вызывается (греп … — 6 строк, все в store/)» |
Вывод верен: GlossaryRevisionsForBook — 2 не-тестовые строки (определение и комментарий), 0 вызовов; glossary_revisions — 4 строки, все в store/. Число 6 не воспроизведено |
УТОЧНЕНО |
ПОДТВЕРЖДЕНО у C (14):
- Цена формы A «с главы N» — сквозь (q2).
TermIDстарой строки меняется (q2).- N1 (i), (ii), (iii) на двери (q7).
- §2 П1 п.3: растёт только
drafts:(q1). - §3.4
方正(q5). - §1:
genderпуст 58/50, female 4/7, male 7/9;sense0/0; голос 0/0; сайдкар A — 67 термов, 65 «banknote-only»,since_ch{0:65, 2:1, 3:1}. - «Нормализации глава 1 → 0 нет»: 0 хитов при 33 строках с
SinceChвmemseed.go. chunker.go:481-based.injection.txt— 13 строк, 0 хитов «област…».mempostcheck.go:297«the stranger».00016_read_surface.sql:180-181unique nulls not distinct (book_id, src, sense, since_chapter, until_chapter).terminology.go:1154-1157— ранг, не порог.- §10 (а):
editor_unverified_header— мёртвые данные (читает толькоlang/embedded.go:450, рендера нет;embedded.go:389«RETIRED»). - Отрицание §3.2 «
sense_split_candidateне построен»: 0 из 466.
Часть 3. Противоречия с R1 (r1-facts-K1.md)
| проект | утверждение | R1 | итог R2 |
|---|---|---|---|
| A §5.2 | freq, since_ch растут с покупкой |
p5: частота и контексты — по исходнику всей книги с первой покупки | противоречие; исполнено q1 → ОПРОВЕРГНУТО |
| C §2 П1 п.2, N2 | покупка меняет freq |
p5 | противоречие; q1 → ОПРОВЕРГНУТО |
| B §2 П8 | свёртки — данные | F2 #13: norm.go:47 //go:embed в ядре |
противоречие; q4 → ОПРОВЕРГНУТО |
| C §2 П2 | сырое написание у строк майнера | F2 #11: mining.go:612 пишет нормализованный ключ |
расширено: и майнер нормализован (C5) |
| B §3 класс 4 | 方正 решён |
R1 p3 (два закона по нормализованному ключу), F1.4 (окно 方正=2) |
противоречие; q5 → ОПРОВЕРГНУТО |
Согласуются с R1:
- A §6 «
volume.go:351— WARN, а не гейт»; - A «34 платных из 35»;
- B «
proposedпуст на дефолтном пути» — R1 p6 мерил границу стопа, противоречия нет; - C «7 платных из 8», «30 из 32 и 22 из 24», «регистр/кавычки/число»;
- A «косметических 2 из 12 и 2 из 14» — собственная свёртка A с кавычками; R1: движковая свёртка 1/12 и 0/14.
Часть 4. Что не проверено и почему
| что | почему | чем закрывается |
|---|---|---|
| Причина пере-решения q10 при изменённом якоре | тел запросов нет нигде: 0 файлов из 399 прочитанных; LOG_LLM_BODIES не задан. Якорь реконструирован правилом CanonFor |
LOG_LLM_BODIES=1 + LOG_LEVEL=debug на следующем платном прогоне ($0 сверху) или платный повтор входа прохода 2 ×N (санкция) |
A-2: status между стопом и резюмом |
не исполнял read-only свёртку при A-2 | проба tmctl status --json на копии стенда после стопа, $0 |
| q9: интейк с Postgres | TM_PLATFORM_TEST_DSN не задан — SKIP |
тест internal/books на стенде с базой |
| q1/q8 на реальной упаковке | пробы на 2–5 кандидатах; 69-кандидатная упаковка по 6000 рун не исполнена | реплей buildBankCandidates + Batch по базам A/B на копии, $0 |
| Предикат A-1 и цена переходной покупки | предиката нет; K1_DROP — заместитель |
М1 у A |
| N4 у C: $0 для редакторской волны | по построению, не исполнено (M2 у C) | M2, $0 |
| Сплит-детектор B, стратифицированный KWIC | не построены — исполнять нечего | замеры проектов |
| Доковые утверждения (research/24, CSD §2.2-бис «11.4 %», тела D-нот) | вне линзы K1 | K2 |
| Жаккар 0.63 (ряд 439) у C | не пере-снимал | retrieval_state.banknote_detail A/B, $0 |
Сквозное, найдено попутно:
- Протухший текст на проводе. Заголовок ЧЕРНОВОГО блока —
backend/internal/lang/data/injection.txt:6, рендерится вmemory.go:784. Он до сих пор говорит «утверждённые переводы… строки с пометкой ⟨проверить⟩ — неподтверждённые кандидаты», хотя пометки нет (memory.go:762). Правка двигаетRequestHashкаждого чернового запроса пары. - Подписанный
古月山寨снова спрошен у терминолога во втором проходе A и B (оплачен; ответ уходит на эмиссии).
Где проекты сходятся и по чему (моя линза):
- «Не пере-спрашивать решённое» — у всех трёх. Держится только форма со СНЯТИЕМ решённых из батчей (A-1, фильтр B).
- «Воспроизведение тем же чекпойнтом» (C N2) не работает при
drafts ×Nв рендере (C3). - Спор об адресе по содержимому решён в сторону A (q8).
- Тождество
族長/族长: вход модели уже один (B1). Открыты сборка банка (A-4) и загрузчик (C (1)). - Окна «с главы N»: выразимы дверью сегодня (q7). Порядок авторских окон относительно перекроя — по CSD §4.1, это не мой предмет.
Печать git -C /home/ubuntu/tm-verify-1509 status --short
После всех прогонов R2, последний — sense_split_candidate и DetectFamilies: … | wc -l → 0. Замороженное дерево
не менялось. Мутации — только в S/k1-mut (2 файла, под переменными окружения); пробы — в S/k1-copy.