/* * ★ 저장본 뒤의 사건 — 계산했든 못 했든 **말한다**. * * ── 무엇이 침묵했나 (2026-08-28 실측) ─────────────────────────────────────── * 미러는 저장본에서 상태를 되세우고 그 뒤의 사건만 따라 계산한다. 그 자리가 이랬다. * * 10:34:37 found cached state → revision 3372228 * 10:34:37 resumed from the stored fold seed at revision 3372228 — items 2665 · orders 4794 * * 그 시각 저널의 머리는 3,374,894였다. 2,666건이 저장본보다 앞서 있었는데 **계산했다는 줄도, 못 * 했다는 줄도 없었다.** 갈래가 셋인데 말하는 갈래가 하나뿐이었기 때문이다. * * ① 계산해서 나아갔다 → 말한다 * ② 계산이 오류로 실패했다 → 말한다 * ③ 오류 없이 끝났는데 그대로 → **아무 말도 없었다** ← 여기 * ④ 저널 머리를 못 읽었다 → **아무 말도 없었다** ← 여기 * * ③④에서 트윈은 그 사건들의 결과 없이 뜨고, 화면은 그것을 「없는 사실」로 그린다. */ import { test } from 'node:test' import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import { join } from 'node:path' const engine = readFileSync(join(import.meta.dirname, '..', 'server', 'engine', 'twin-engine.ts'), 'utf8') test('★ 저널 머리를 못 읽었으면 그 사실을 말하고 그대로 뜬다', () => { assert.match(engine, /if \(!tip\) \{/, '못 읽은 갈래가 있어야 한다') assert.match(engine, /could not read the journal tip/, '무엇을 못 했는지 말해야 한다') assert.match(engine, /without folding what came after it/, '무엇을 잃는지 말해야 한다') }) test('★ 계산이 아무 일도 하지 않았으면 그것도 말한다', () => { assert.match(engine, /\} else if \(!failed\) \{/, '오류가 아닌데 나아가지 않은 갈래가 있어야 한다') assert.match(engine, /left the seed at revision/) /* 오류로 실패한 것을 두 번 말하지 않는다 — 이미 위에서 말했다. */ assert.match(engine, /let failed: string \| undefined/) }) test('★ 부팅마다 부르는 질의를 관계로 묻지 않는다 — 이 파일이 스스로 금지한 모양이다', () => { /* * `findOne({ where: { domain: { id } } })` 는 안쪽에 상한이 없는 두 단계 질의가 된다(실측 12초, * 저널 375만 행). `tipOf` 는 부팅마다 트윈마다 불리므로 그 한 번이 부팅을 붙잡는다. */ const from = engine.indexOf('private static async tipOf') assert.ok(from > 0, 'tipOf 가 있어야 한다') const tipOf = engine.slice(from, from + 2600) /* 주석에 인용된 나쁜 모양과 헷갈리지 않게, 실제 코드 모양만 본다. */ assert.doesNotMatch(tipOf, /findOne\(\{ where: \{ domain: \{ id: domainId \}/, '관계로 묻는 모양이 남아 있다') assert.match(tipOf, /createQueryBuilder\('e'\)/) assert.match(tipOf, /orderBy\('e\.revision', 'DESC'\)/) assert.match(tipOf, /\.limit\(1\)/) })