/* * ★ **보는 사람이 없어도 창이 닫힌다** — 아무도 안 보는 트윈일수록 기록이 없었다. * * ── 실측 (2026-09-05) ────────────────────────────────────────────────────── * mes-miratek 사실 46건 · 62분에 흩어짐 창 1개 * mes-line-a 사실 11건 창 48개 * * **사실 수와 창 수가 거꾸로다.** 창은 「다음 사건이 왔을 때」와 「누가 물어볼 때」만 굴렀고, * `ingestHealthOf()` 가 굴리는 쪽이 실제로 창을 만들고 있었다 — 점검표·화면이 계속 묻는 트윈만 * 기록이 쌓였다. * * 그래서 **아무도 안 보는 트윈일수록 기록이 없었다.** 사실이 조용히 사라지는 것을 잡으려고 만든 * 장부가 정확히 그 반대로 돌았다. 실제로 137봉투가 장부 없이 지나갔다(인티그레이션 레인 실측). * * ── 왜 주기인가 ──────────────────────────────────────────────────────────── * 창이 닫히는 이유는 **시간이 지난 것**이다. 사건도 질의도 그것을 알려 주는 신호일 뿐이고 둘 다 * 안 올 수 있다. 시간은 늘 지나므로 주기가 그 사실에 맞는 신호다. */ import { test } from 'node:test' import assert from 'node:assert/strict' import { INGEST_WINDOW_MS, newIngestLedger, recordJournalWrite, rollIngestWindow } from '../server/engine/ingest-health.js' const T0 = 1_757_000_000_000 test('★ 사건도 질의도 없이 시간만 지나면 창이 닫힌다', () => { const ledger = newIngestLedger() const closed: any[] = [] /* 사실 하나가 들어와 창이 열린다. */ recordJournalWrite(ledger, 1, T0, w => closed.push(w)) assert.equal(closed.length, 0, '열리자마자 닫히면 안 된다') /* 그 뒤로 아무 일도 없다 — 주기만 온다. */ rollIngestWindow(ledger, T0 + INGEST_WINDOW_MS + 1, INGEST_WINDOW_MS, w => closed.push(w)) assert.equal(closed.length, 1, '시간이 지났는데 창이 안 닫혔다 — 기록이 안 남는다') assert.equal(closed[0].rows, 1, '닫힌 창이 그 사실을 안 들었다') }) test('★ 창 길이 전에는 안 닫는다 — 주기가 창을 잘게 쪼개면 안 된다', () => { const ledger = newIngestLedger() const closed: any[] = [] recordJournalWrite(ledger, 1, T0) /* 주기(30초)가 창 길이(10분)보다 짧다 — 여러 번 와도 안 닫혀야 한다. */ for (let i = 1; i <= 10; i++) rollIngestWindow(ledger, T0 + i * 30_000, INGEST_WINDOW_MS, w => closed.push(w)) assert.equal(closed.length, 0, `주기가 창을 ${closed.length}개로 쪼갰다`) }) test('★ 조용한 구간도 창으로 남는다 — expected-quiet 판정이 그 기록 위에 선다', () => { /* * 사실이 하나도 안 온 구간이 표에 남아야 「조용한 것이 정상인가」를 판정할 수 있다. 그 구간이 * 아예 기록되지 않으면 조용함과 기록 없음이 구별되지 않는다. */ const ledger = newIngestLedger() const closed: any[] = [] recordJournalWrite(ledger, 1, T0, w => closed.push(w)) /* 두 창을 통째로 건너뛴다 — 그 사이 아무 사실도 없었다. */ rollIngestWindow(ledger, T0 + INGEST_WINDOW_MS * 2 + 1, INGEST_WINDOW_MS, w => closed.push(w)) assert.ok(closed.length >= 1, '건너뛴 구간이 하나도 안 남았다') }) test('★ 이 검사가 실제로 무언가를 잰다 — 견준 것이 0이면 빨강', () => { assert.ok(INGEST_WINDOW_MS > 0, `창 길이가 ${INGEST_WINDOW_MS} 다`) const ledger = newIngestLedger() recordJournalWrite(ledger, 3, T0) assert.equal(ledger.window.rows, 3, '장부가 사실을 안 세고 있다 — 이 검사가 아무것도 안 잰다') })