dev.to

Broadcast and Get Hit, Go Dark and Void $65M: I Built NAVI-SANCTION with Sanity to Break the Deadlock

AIS를 켜면 공격받고 끄면 보험이 무효가 됩니다 — Sanity로 만든 해상 규정 충돌 판정기

Sanity Challenge 제출작 NAVI-SANCTION은 해상 조약, 군사 권고, 보험 약관을 구조화해 AIS 운용 규정의 충돌을 판정하는 데모입니다. Sanity Content Lake와 GROQ로 관련 문서를 조회하고, 조건이 겹치면 생명 보호 조항을 근거로 한 대응 경로와 감사 기록을 만듭니다.

AI 요약

NAVI-SANCTION은 Sanity Challenge의 ‘실제 콘텐츠를 질의하는 에이전트’ 트랙에 제출한 해상 위험 판정 데모입니다. 글은 선박이 AIS를 계속 송신하면 드론 공격에 노출될 수 있고, 끄면 국제 규정 위반과 보험 무효 위험을 맞는 상황을 제시합니다. IMO SOLAS V/19의 AIS 송신 의무, UKMTO의 위협 구역에서 AIS를 끄라는 권고, Lloyd’s 전쟁 위험 보험 약관을 서로 충돌하는 규칙으로 모델링합니다.

문서를 유형별로 구조화

PDF를 잘게 나눠 검색하는 대신 Sanity Content Lake에 다섯 가지 문서 유형을 둡니다. 조약을 담는 maritimeTreaty, 군사 권고를 담는 operationalAdvisory, 보험 조건을 담는 insuranceWarranty, 해상 통로 정보를 담는 transitCorridor, 과거 판정 기록을 담는 adjudicatedDecision입니다. 각 유형에는 조항, 의무 수준, 위협 단계, 보험 예외, 호위 여부처럼 판정에 필요한 필드를 둡니다.

GROQ로 관련 규칙을 한 번에 조회

예시 GROQ 질의는 통과 구역 문서를 찾은 뒤 역참조를 따라 관련 조약과 활성 군사 권고, 보험 약관, 과거 판례를 가져옵니다. 결과를 한 번의 질의로 모아 규칙 엔진에 전달하는 구조입니다. 글은 이를 비정형 문서 검색과 대비합니다. 여러 관할 문서를 검색하고 재순위화하는 대신, 미리 연결한 관계를 따라 판정 자료를 묶습니다.

조건식으로 충돌 판정

TypeScript 판정 함수는 세 조건을 확인합니다. 조약이 AIS 상시 송신을 의무화하고, 군사 권고가 AIS 차단을 요구하며, 호위가 없으면 보험이 무음 운항을 허용하지 않을 때 TRI_LATERAL_DEADLOCK으로 분류합니다. 예시 결과에는 충돌 점수 94와 CRITICAL_LIFE_SAFETY 위험도가 들어갑니다. 대응 경로로는 SOLAS XI-2/8의 생명 보호 조항을 근거로 TACTICAL_DARKNESS_AUTHORIZED를 제안하고, 책임자의 승인을 요구합니다. 조건이 충족되지 않으면 CLEAR와 점수 12를 반환합니다.

판정 기록과 데모 구현

승인 콘솔에서 판정을 확정하면 선박 IMO 번호, 통과 구역, 근거 조항, 승인자, UTC 시각을 SHA-256으로 해시해 adjudicatedDecision 문서에 기록합니다. 글은 이 문서를 Sanity Content Lake에 저장하고, 이후 질의에서도 관련 선박이 과거 판정 기록을 조회하는 흐름을 설명합니다. 한편 데모 클라이언트는 브라우저 안에 동기화된 메모리 내 콘텐츠 표현을 두고 GROQ 평가와 즉시 변경을 처리한다고 밝힙니다.

프로젝트에는 Bab-el-Mandeb, 호르무즈 해협, 흑해 통로 선택, 위협 단계 변경, 2D 레이더와 3D 지구본 보기, GROQ 질의 실행, 이중 승인 콘솔이 포함됩니다. 구현에는 Next.js 16, TypeScript 5, Sanity Context MCP, GROQ, Web Crypto API, Playwright를 사용합니다. 저자는 시나리오 변경부터 SHA-256 검증까지 여덟 개의 Playwright 테스트가 모두 통과했다고 적었습니다. 이 글의 구현은 규칙을 구조화하고 조건을 결정론적으로 평가하는 데모이며, 법률·보험 판정의 실제 효력은 글의 시스템 설명만으로 확인되지 않습니다.

원문: dev.to / 번역·요약: Trawling