/* * ★ 커넥터의 **근거 수준** — 목으로 확인한 것을 확인으로 부르지 않는다. * * ── 왜 이 축이 생겼나 (2026-08-23, 토대 릴리즈 준비) ──────────────────────── * 등록된 커넥터 열넷 중 실 시스템에 붙어 본 것은 **하나**다(첫 실 연동). 나머지는 목에 대고 만들었다. * 그런데 화면의 커넥터 목록에 그 구분이 없어서 **목으로 확인한 것이 확인으로 보인다.** * * 이 저장소는 같은 모양을 능력 축에서 이미 거절했다 — 「선언만 있는 능력은 사용자에게 거짓말이 된다」 * (§`capabilitiesOf`). 그 규율을 근거에도 세운다. * * ── 무엇을 검증할 수 있고 무엇을 못 하나 ──────────────────────────────────── * 능력은 구현이 있는지 보아 선언을 검증할 수 있다. **근거는 볼 수 없다** — 사람이 아는 사실이다. * 그래서 검증할 수 있는 하나만 검증한다: **실 시스템을 주장하면 무엇에 대고인지 말해야 한다.** * 가리키는 대상이 없는 주장은 주장이 아니고, 그런 주장은 낡아도 아무도 알 수 없다. */ import { test } from 'node:test' import assert from 'node:assert/strict' import { groundingOf, type ReferenceAdapter } from '../server/service/reference/reference-adapter.ts' const adapter = (grounding?: any) => ({ type: 't', grounding } as unknown as ReferenceAdapter) test('선언이 없으면 「모른다」다 — 「목이다」가 아니다', () => { /* * 둘을 같게 두면 아직 선언하지 않은 새 커넥터가 목으로 낙인찍힌다 — 그것도 없는 사실이다. * 화면은 `unknown` 을 「아직 밝히지 않았다」로 말해야 한다. */ assert.deepEqual(groundingOf(adapter()), { level: 'unknown' }) assert.deepEqual(groundingOf(undefined), { level: 'unknown' }) }) test('실 시스템을 주장하면 무엇에 대고인지 말해야 한다 — 아니면 주장이 내려간다', () => { /* ★ 이 가드의 핵심. 대상 없는 주장은 낡아도 아무도 모른다. */ for (const level of ['instance', 'product'] as const) { const g = groundingOf(adapter({ level })) assert.equal(g.level, 'unknown', `${level} 주장이 대상 없이 통과하면 안 된다`) assert.match(g.downgraded ?? '', /does not say what it was verified against/) assert.match(g.downgraded ?? '', new RegExp(level), '무엇을 주장했는지 함께 말한다') } /* 여백만 있는 것도 비어 있는 것이다 — 형식을 채워 통과하지 못하게. */ assert.equal(groundingOf(adapter({ level: 'instance', verifiedAgainst: ' ' })).level, 'unknown') }) test('대상을 말하면 그 주장이 선다', () => { const g = groundingOf(adapter({ level: 'instance', verifiedAgainst: 'chef v1 · jejoup / pocheon' })) assert.equal(g.level, 'instance') assert.equal(g.verifiedAgainst, 'chef v1 · jejoup / pocheon') assert.equal(g.downgraded, undefined) }) test('목과 가상은 대상 없이도 선다 — 그 자체가 사실이다', () => { /* * `mock` 은 「실 시스템에 붙어 본 적이 없다」는 사실이고 그것을 말하는 데 대상이 필요하지 않다. * `synthetic` 은 한계가 아니라 **성질**이다 — 가상 원본은 스스로 만들어 낸다. */ assert.equal(groundingOf(adapter({ level: 'mock' })).level, 'mock') assert.equal(groundingOf(adapter({ level: 'synthetic' })).level, 'synthetic') }) test('instance 와 product 를 가른다 — 그 구분이 이 어휘의 요점이다', () => { /* * 첫 실 연동에서 그 배포만의 성질이 넷 드러났는데(관계 리솔버가 다른 테넌트의 행을 답한다 · 모르는 * 필터를 알리지 않고 무시한다 · 지워진 품목의 BOM 이 남아 있다 · 사실상 무한을 뜻하는 표식) **그것이 * 제품의 성질인지 그 인스턴스의 성질인지 아무도 모른다.** 두 번째 배포가 붙는 날 갈린다. * * 그래서 하나로 확인한 것을 `product` 라 부르면 안 되고, 어휘가 그 구분을 담는다. */ const one = groundingOf(adapter({ level: 'instance', verifiedAgainst: '한 배포' })) const many = groundingOf(adapter({ level: 'product', verifiedAgainst: '세 배포' })) assert.notEqual(one.level, many.level, '두 수준이 같은 값으로 뭉개지지 않는다') })