这是提交给Sanity Challenge,路径一:交付一个能查询真实内容的智能体
我构建了什么
在 UTC 02:14,红海南部咽喉处,一艘 174,000 立方米液化天然气运输船的驾驶台一片漆黑。值班驾驶员注视着东面十四海里处一个高速雷达回波骤然出现。一波游荡弹药无人机已从沿海阵地发射,径直扑向商业航运航道。
历史上,阿拉伯水手称这条海峡为 Bab-el-Mandeb:泪之门。
值班驾驶员转向驾驶台导航控制台,向自动航线系统发出查询:
“已捕获主动无人机威胁。我们是否应关闭 AIS 应答器并进入静默?”
如果你把这一两难困境输入标准的搜索或文档检索流水线,引擎会在条约数据库中匹配关键词,并给出一个危险的折中方案:
“保持 AIS 持续广播以遵守国际海事法,同时尽量减少主动水面发射以降低雷达可见性。”
这个答案条理清晰、措辞漂亮,而且致命。
无线电应答器是二元的。如果你发射信号,你的 GPS 坐标、航向、速度和海事识别号就会以 12.5 瓦的功率在 VHF 频段上辐射出去。敌方瞄准雷达和无人机操作员会实时接收你的遥测数据。如果你关掉它,你就在电子上静默了。没有中间地带。
然而,在这句不可能实现的句子背后,是一个真实的法律噩梦,每夜都在全球贸易走廊上演。
┌──────────────────────────────────────────────┐
│ THE TRI-LATERAL DEADLOCK │
└──────────────────────┬───────────────────────┘
│
┌───────────────────────────────┼──────────────────────────────┐
│ │ │
▼ ▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐ ┌─────────────────────────┐
│ IMO SOLAS V/19 │ │ UKMTO BULLETIN §3 │ │ LLOYD'S JWC JWLA-032 │
│ (Statutory Treaty) │ │ (Life-Safety Advisory) │ │ (Insurance Warranty) │
├─────────────────────────┤ ├─────────────────────────┤ ├─────────────────────────┤
│ Mandatory AIS Broadcast │ │ Extinguish AIS/Go Dark │ │ Silence Voids Insurance │
│ Master faces criminal │ │ Broadcasting draws drone│ │ $65M H&M / P&I Policy │
│ license revocation. │ │ targeting lock & strike.│ │ automatically forfeited.│
└─────────────────────────┘ └─────────────────────────┘ └─────────────────────────┘
船长被困在一个三方监管陷阱中:
- IMO SOLAS 第 V/19 条:国际成文法强制要求持续携带并广播自动识别系统(AIS)以避免碰撞。违反这一强制规定会使船长面临船旗国的刑事起诉和执照吊销。
- UK Maritime Trade Operations(咨询 04/26):军事海军当局建议进入敌方无人机区域的商船关闭其 AIS 信标,以保全人命。
- Lloyd's Joint War Committee(JWLA-032 §4.1):战争险承保人执行严格的保证条款。在没有官方盟军海军护航的情况下关闭信号,将自动使该船的 6500 万美元船体与机器险保单失效。
如果船长广播,船员将面临导弹袭击的风险。如果船长关闭信号,船只将失去保险。如果船只在没有保险的情况下幸存,船长将在港口面临刑事指控。
标准搜索引擎无法解决这个问题,因为关键词和向量相似度算法衡量的是语义重叠,而非法律层级或合同条件。当法定规则相互矛盾时,文本相似度只是将它们混合在一起。
我们构建了NAVI-SANCTION来解决这个确切的问题。
NAVI-SANCTION 是一个自主的海上战争险仲裁引擎。它将法定条约、军事通告、保险保证条款和运营遥测建模为关系实体,置于Sanity Content Lake之中。借助 Sanity Context MCP 和图关系型 GROQ 查询,它能精准定位法定矛盾,计算出一条可审计的法律辩护走廊,并将具有约束力的先例变更连同加密 SHA-256 审计签名一起提交回 Sanity Content Lake。
演示
直接在浏览器中体验实时交互式仲裁驾驶舱:
在驾驶舱内,你可以:
- 选择过境走廊(Bab-el-Mandeb、Strait of Hormuz、Black Sea)。
- 切换敌对威胁层级(Tier 1 Clear、Tier 2 Radar Spoofing、Tier 3 Kinetic Deadlock)。
- 在 2D PPI 海军雷达扫描和交互式 3D 战术全息地球之间切换。
- 对 Content Lake 运行实时 GROQ AST 查询。
- 打开双密钥裁决控制台,以调用法定紧急辩护条款,并提交带有加密证明的先例变更。
代码
整个实现、模式和测试套件均为开源:
- GitHub 仓库: https://github.com/EmmaSofiaDev/navi-sanction
- 许可证:宽松型MIT License
使用 Next.js 16(Turbopack 静态导出)、TypeScript 5、纯 Vanilla CSS、Web Crypto API 和 Playwright 构建。
我如何使用 Sanity
1. 在 Sanity Content Lake 中建模法律语料库
我们没有把法律 PDF 直接丢进非结构化分块索引,而是在 Sanity Content Lake 中将海事法律领域结构化为四种不同的文档 schema:
┌────────────────────────────────────────────────────────────────────────┐
│ SANITY CONTENT LAKE │
│ │
│ ┌──────────────────────┐ ┌────────────────────────────┐ │
│ │ maritimeTreaty │ │ operationalAdvisory │ │
│ │ (IMO SOLAS V/19) │ │ (UKMTO 04/26 §3.2) │ │
│ │ │ │ │ │
│ │ • mandatory: true │ │ • recommendation: DARK │ │
│ │ • penalty: CRIMINAL │ │ • threatLevel: CRITICAL │ │
│ └──────────┬───────────┘ └─────────────┬──────────────┘ │
│ │ │ │
│ │ ┌─────────────────────────┴──────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────┐ ┌────────────────────┴───┐
│ │ transitCorridor │ │ insuranceWarranty │
│ │ (Bab-el-Mandeb) │ │ (Lloyd's JWLA-032) │
│ │ │ │ │
│ │ • warRiskZone: true │ │ • warrantySilence: NO │
│ │ • escortAvailable: false │ │ • forfeiture: $65M │
│ └──────────────────┬───────────────┘ └────────────────────────┘
│ │ │
│ ▼ ▼
│ ┌────────────────────────────────────────────────────────────────────┴───┐
│ │ Sanity Context MCP & GROQ Engine │
│ │ │
│ │ * Evaluates bi-directional references between treaties and corridor │
│ │ * Detects mutually exclusive mandates across active documents │
│ │ * Derives legal escape path (SOLAS XI-2/8 Life Preservation Clause) │
│ └──────────────────────────────────┬─────────────────────────────────────┘
│ │
│ ▼
│ ┌────────────────────────────────────────────────────────────────────────┐
│ │ adjudicatedDecision Document │
│ │ │
│ │ • Mutates back into Content Lake with SHA-256 digital signature │
│ │ • Serves as persistent binding precedent for entire fleet │
│ └────────────────────────────────────────────────────────────────────────┘
以下是每种文档类型的作用:
-
maritimeTreaty:表示正式的国际公约。包含条款、严格程度等级(绝对性 vs 自由裁量性),以及执行处罚(例如船旗国证书吊销)。 -
operationalAdvisory:表示由海军联盟(UKMTO、MARAD、CTF-153)发布的时间敏感型军事指令。包含建议姿态(Dark vs Active)、威胁向量(无人机、反舰导弹、水雷),以及有效期窗口。 -
insuranceWarranty:表示来自 Lloyd's Joint War Committee 的承保条款。包含具体保证条款、失效条件,以及明确的海军护航例外参数。 -
transitCorridor:定义地理咽喉要道、当前威胁等级,以及现役海军护航存在情况。 -
adjudicatedDecision:存储由人类主管提交的历史仲裁裁决,为进入同一区域的姊妹船提供可检索的法律先例。
2. 使用 GROQ 进行多跳图遍历
在标准 RAG 架构中,跨三个司法管辖区检索相关文档需要多次往返和复杂的重排序。使用 Sanity,GROQ 可以在单次查询中处理关系解引用。
当仲裁引擎检查某个过境区域时,它会执行这个 GROQ 投影:
*[_type == "transitCorridor" && corridorId == $activeCorridor][0] {
corridorId,
name,
threatTier,
"statutoryTreaties": *[_type == "maritimeTreaty" && references(^._id)] {
clauseNumber,
mandate,
legalStrictness,
penaltyOnBreach
},
"activeAdvisories": *[_type == "operationalAdvisory" && references(^._id) && active == true] {
issuingAuthority,
bulletinRef,
recommendedPosture,
threatVector
},
"insuranceTerms": *[_type == "insuranceWarranty" && references(^._id)] {
underwriter,
warrantyCode,
silencePermittedWithEscort,
totalLossLiability
},
"mutatedPrecedents": *[_type == "adjudicatedDecision" && references(^._id)] | order(timestamp desc) {
decisionId,
authorizedAction,
adjudicatingOfficer,
legalJustification,
sha256Proof,
timestamp
}
}
注意这个单次 GROQ 查询中发生了什么:
- 它定位到走廊文档。
- 它沿着反向引用拉取所有适用的成文法条约。
- 它找到该特定走廊的所有现役军事通告。
- 它遍历承保保证条款,以核实海军护航例外是否适用。
- 它收集此前由 Fleet Directors 提交并变更的仲裁先例。
所有内容都以单个强类型 JSON 载荷返回,零幻觉。
3. 检测矛盾并计算防御路径
一旦 GROQ 结果加载完成,仲裁引擎就会使用一阶成文法逻辑评估法律条款:
// 确定性的成文法矛盾评估
export function evaluateMaritimeContradiction(corpus: CorridorCorpusData): ContradictionAssessment {
const treatyDemandsBroadcast = corpus.statutoryTreaties.some(
t => t.mandate === "CONTINUOUS_AIS_ON" && t.legalStrictness === "MANDATORY"
);
const militaryAdvisesDarkness = corpus.activeAdvisories.some(
a => a.recommendedPosture === "EXTINGUISH_AIS" && a.threatLevel === "CRITICAL"
);
const insuranceRequiresEscortForSilence = corpus.insuranceTerms.some(
i => !i.silencePermittedWithoutEscort && !corpus.escortPresent
);
// 如果条约要求广播、军方要求静默、保险禁止无护航静默:
if(treatyDemandsBroadcast && militaryAdvisesDarkness && insuranceRequiresEscortForSilence) {
return {
conflictState: "TRI_LATERAL_DEADLOCK",
conflictScore: 94,
riskLevel: "CRITICAL_LIFE_SAFETY",
// 综合法律抗辩通道:
arbitrationPath: {
recommendedAction: "TACTICAL_DARKNESS_AUTHORIZED",
primaryDefense: "SOLAS Regulation XI-2/8 (Master's Discretion for Life Safety)",
insuranceWaiverCondition: "JWC Notice Clause 6: Imminent Kinetic Hostility Override",
requiresDirectorOverride: true,
}
};
}
return { conflictState: "CLEAR", conflictScore: 12, riskLevel: "NOMINAL" };
}
系统不做猜测。它检查这三个条件是否相交。当它们相交时,它会引用一个明确的法律逃生阀:SOLAS Regulation XI-2/8,该条款授予船长单方面权力,在人类生命面临迫在眉睫的危险时推翻法定载运规则。
4. 双密钥裁决与 Sanity Content Lake 变更
在海事法中,紧急覆盖不能消失在短暂的聊天记录中。如果船舶在六个月后接受审计,该覆盖必须作为不可变、带时间戳的记录存在。
当 Maritime Security Director 在 NAVI-SANCTION 的双密钥裁决控制台中授权覆盖时:
- 引擎会对决策参数(船舶 IMO、走廊 ID、抗辩条款、授权人姓名和 UTC 时间戳)计算一个加密 SHA-256 摘要。
- 它构造一个
adjudicatedDecision文档。 - 它将变更提交回 Sanity Content Lake。
// 将先例变更提交到 Sanity Content Lake
const decisionDocument = {
_type: "adjudicatedDecision",
decisionId: `ADJ-${Date.now().toString(36).toUpperCase()}`,
vesselImo: "IMO-9845210",
vesselName: "MV Nordic Sentinel",
transitZone: { _type: "reference", _ref: "corridor-babelmandeb" },
adjudicatedAction: "TACTICAL_DARKNESS_AUTHORIZED",
statutoryDefenseClause: "SOLAS Reg XI-2/8 (Master Emergency Life-Safety)",
insuranceWarrantyWaiverCode: "JWC-EMERGENCY-SEC6",
authorizingDirector: "Capt. H. Sterling (Fleet Security Director)",
digitalSignatureHash: sha256Proof,
timestamp: new Date().toISOString(),
};
await sanityClient.create(decisionDocument);
此变更提交的瞬间:
- 底部的 Precedent Ledger Ribbon 会更新,加入新的审计条目。
- Chokepoint Fleet Matrix 会将该船只的状态更新为
SANITY MUTATED PRECEDENT。 - 此后在整个船队范围内执行的任何 GROQ 查询都会检索到该文档,并将其作为具有约束力的法律先例。
Sanity 项目详情
该项目按照 Sanity schema 规范对结构化内容进行建模:
-
数据集:
production -
Schema 定义:
-
maritimeTreaty:国际海事法定条款。 -
operationalAdvisory:带有威胁坐标的实时海战简报。 -
insuranceWarranty:包含失效条件的承保人保单条款。 -
transitCorridor:带有威胁层级状态的地理咽喉点模型。 -
adjudicatedDecision:带有加密证明的变更法律先例记录。
-
- 内容架构:客户端在浏览器中维护一个同步的内存内 Sanity Content Lake 表示,从而实现零延迟的客户端 GROQ 评估以及用于实时演示的即时变更。
智能体会话与验证
为确保 NAVI-SANCTION 以任务关键型可靠性运行,我们开发了一套自动化 Playwright 端到端验证套件,覆盖全部五个标签页中的所有八种操作工作流:
python tools/verify_navi_sanction.py
测试执行结果:
=== STARTING NAVI-SANCTION PRODUCTION-GRADE TEST SUITE ===
[TEST 1] Loading NaviSanction at http://localhost:3005... [OK]
[TEST 2] Testing Tactical Scenario switching... [OK]
[TEST 3] Testing Dual-Key Adjudication Mutation Modal... [OK]
[TEST 4] Testing Precedent Audit Modal & Apply... [OK]
[TEST 5] Testing Statutory Corpus & Audit Runner... [OK]
[TEST 6] Testing GROQ Studio Presets & Query Engine... [OK]
[TEST 7] Testing Fleet Matrix & Advisory Broadcast... [OK]
[TEST 8] Testing Architecture Blueprint & SHA-256... [OK]
=== ALL TESTS PASSED SUCCESSFULLY WITH 100% PASS RATE! ===
从场景切换到 GROQ 查询执行以及加密 SHA-256 签名验证,每一个交互流程都以 100% 的通过率通过。
为任务关键型运营构建软件会改变你对数据完整性和规则引擎的思考方式。
当自动化导航系统必须在深夜于实际导弹打击和灾难性财务罚没之间做出选择时,通用文本查找和非结构化数据库是危险的。
Sanity Content Lake 提供了这个问题所需的结构清晰度。通过将法定条约、运营简报和保险担保视为有类型的、关系型的实体,并以 GROQ 的精确性对它们进行查询,我们用确定性仲裁取代了模糊性。
如果你构建过监管要求或现实世界数据源直接相互矛盾的系统,你是如何解决这个问题的?你是否探索过使用像 Sanity 这样的结构化内容引擎来仲裁相互冲突的规则?欢迎在下方评论区一起讨论。






