textmachine/docs/archive/reports/BANK_CONSILIUM_2026-09-16/r2-critique-K1.md

48 KiB
Raw Blame History

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 … backenddiff 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. Вопросы ведущего q1q10

Логи:

  • 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. Какие байты батча терминолога меняются между покупками при неизменном кандидате

Цепь:

  1. Кандидаты собираются по кускам ВСЕЙ книги (bookrun.go:182waverun.go:179mining.go:80-83).
  2. RenderBatch (terminology.go:771-800: key · type · origin · freq · since_ch · aliases · related · evidence · drafts · ctx).
  3. Упаковка и сортировка батчей по убыванию частоты (terminology.go:1206-1241).
  4. Адрес — Chunk{Chapter: 0, ChunkIdx: i} (terminologist.go:974, :1011). ChunkIdx входит в RequestHash (render.go:366).
  5. Якорь ⟦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 на P2P4.
  • Новый кандидат с большей частотой встаёт вперёд. Батч с ТЕМИ ЖЕ байтами перекупается из-за сдвига позиции: HIGH 花家 68fc2d8c05a4cd783460d7ba.
  • Подпись родственного термина добавляет ⟦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 → declineapprove (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"
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: платформа ничего нового не видит.
  • Не исполнено: 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) с новой выражают преемника и для подписанной строки, с верной ценой: главы 14 на репине $0.
    • Это и есть «two-call operation» из decisions.go:90-92.
    • Третий глагол покупает атомарность, а не выразимость.

q8. Работает ли A-1 без адреса батча по содержимому

Проба: k1-mut, TestK1MQ8FilteredCompositionRebuys.

  • K1_DROP снимает названного кандидата в dropBankSettled, то есть там, где встал бы предикат A-1.
  • Плечи × batch_runes 1 и 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. Отдаёт ли платформа движку исходник всей книги

Цепь:

  1. Интейк пишет загрузку ОДНИМ файлом: platform/internal/books/books.go:217 s.receive(filepath.Join(dir, SourceName+extensionOf(in.Filename)), in.File):396-397 os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o640).
  2. Имя уходит в source_file: render.go:88-96, :188-196; book.yaml пишется один раз, O_EXCL на :109.
  3. Движку передаются только --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:109book.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.sh A и B — 0 строк. Движок пишет тела только при LOG_LLM_BODIES=1 и LOG_LEVEL=debug (backend/cmd/tmctl/main.go:211-214).

Что сохранено:

  • тексты ответов всех вызовов терминологии (длина > 0; у B пуст только id 14 — обрыв классификатора);
  • позиции батчей;
  • между проходами черновики не пере-делывались: A id 17-22 и B id 19-24banknote_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 постоянны на P1P4; меняется только 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 emits auto, inert») — против R1 p1.
  • П2: trad2simp.txt 563 строки, :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: emissionEligible miner_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» и лог q6 awaiting_signature_outside_the_bank=0 на auto-continue.
  • Family co-batching построен: series.go:199, :333; family-morphology.txt:28 family_affix han name prefix 2; bccf2d8 2026-08-08 Land the bank cluster fixpack….
  • Пропуски якоря terminology.go:872-873, :941.
  • pipeline-c1.yaml:173 budget_usd: 1.00.
  • InjectVoicebankmaterialize.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; sense 0/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:48 1-based.
  • injection.txt — 13 строк, 0 хитов «област…».
  • mempostcheck.go:297 «the stranger».
  • 00016_read_surface.sql:180-181 unique 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 на реальной упаковке пробы на 25 кандидатах; 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 -l0. Замороженное дерево не менялось. Мутации — только в S/k1-mut (2 файла, под переменными окружения); пробы — в S/k1-copy.