关于 FIDE Laws of Chess
FIDE Laws of Chess 是基于 2023 年 FIDE Laws 的固定版本可执行模型,附有虚构裁判案例和可检查的答案。它面向教学与研究,覆盖部分裁决问题,并将未解决的判断留给裁判。
主要功能
- 01基于 2023 年 FIDE Laws 的模型
- 02保留十个虚构案例
- 03明确事实与所需裁判判断
- 04可检查的规则证据
- 05Node.js SDK 与原生 MCP 封装
适用场景
- 01研究非法着法与旗落案例
- 02比较快棋和闪电棋处罚
- 03识别需要裁判判断的问题
MCP 相关
独立的 `@arxo/[email protected]` 封装通过 stdio 将同一固定版本模型作为 MCP 服务运行,要求 Node.js 20+。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://mcp.arxo.io/mcp/fide-chessclaude mcp add --transport http io-arxo-fide-chess https://mcp.arxo.io/mcp/fide-chess{"mcpServers":{"io-arxo-fide-chess":{"type":"http","url":"https://mcp.arxo.io/mcp/fide-chess"}}}在 Cursor 中打开{"servers":{"io-arxo-fide-chess":{"type":"http","url":"https://mcp.arxo.io/mcp/fide-chess"}}}在 VS Code 中打开{"mcpServers":{"io-arxo-fide-chess":{"type":"http","url":"https://mcp.arxo.io/mcp/fide-chess"}}}{"mcpServers":{"io-arxo-fide-chess":{"serverUrl":"https://mcp.arxo.io/mcp/fide-chess"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
16| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| kinds | array | 否 | 缩小候选项类型范围 |
| limit | integer | 否 | 候选项数量(8,最多 25 个) |
| query | string | 是 | 用自己的话提出问题或描述概念 |
| package | string | 否 | 仅在此文书内搜索 |
详细介绍
Arxo 上的 FIDE 国际象棋规则
通过固定版本的模型、明确的事实和可检查的答案,探究国际象棋裁判的判定。 十个保留的虚构案例涵盖非法着法、超时、快棋/闪电战例外、记录和裁判判断。
Node.js 20+ · ESM · canon package 0.1.0 · model 0.1.1 · 自 2023 年 1 月 1 日起生效的 FIDE 版本
在 Node.js 中开始 · 案例 · 证据 · 形式化深度 · 提交案例 · 源代码仓库
这是一个独立的开源教学与研究演示。对于实际的国际象棋裁决,请参考正版 FIDE 国际象棋规则,并咨询有管辖权的裁判。源文本和模型范围均已固定;该软件包不声称具备通用的国际象棋引擎能力或完整的形式化能力。
在 Node.js 中开始
要求:Node.js 20+。示例使用 ES 模块;请保留 .mjs
扩展名。本步骤已于 2026 年 10 月 14 日在搭载 Node.js 20.20.2 的 macOS arm64 上验证。此方式无需全局 CLI、Git 克隆或 MCP 客户端。
创建一个新目录,在其中打开终端,然后运行:
npm init -y
npm install --ignore-scripts @arxo/[email protected] @arxo/[email protected]
将其保存为 example.mjs,然后运行 node example.mjs:
import { open } from '@arxo/law';
import { loadModel } from '@arxo/canon-fide-chess/chess';
import { game, white, getCaseInput } from '@arxo/canon-fide-chess/examples/arbiter';
const model = await loadModel();
const chess = await open(model.spec, {
offline: true,
local: { packages: { [model.spec]: model.package } },
});
const input = getCaseInput('SecondIllegal');
const loss = await chess.truth('game_lost_by', [game, white], input);
const draw = await chess.truth('game_drawn', [game], input);
console.log(loss.evaluationStatus, loss.truthStatus); // COMPUTED, TRUE_ONLY
console.log(draw.evaluationStatus, draw.truthStatus); // COMPUTED, NEITHER
两行输出依次为负方获胜,然后是和棋:
COMPUTED TRUE_ONLY
COMPUTED NEITHER
COMPUTED 表示查询已求值。TRUE_ONLY 表示该查询有正向支持,且没有负向支持。NEITHER 表示两种极性都没有支持;这并不能证明命题为假。
现在只将 getCaseInput('SecondIllegal') 替换为
getCaseInput('SecondIllegalNoMate'),然后再次运行 node example.mjs:
REQUIRES_JUDGMENT NEITHER
COMPUTED TRUE_ONLY
第二行现在可以确定为和棋。此案例提供了这样一条事实:对手无法通过任何合法着法序列将对方将死。单独的负方获胜查询仍要求裁判作出评估,因为其他可能导致负方获胜的依据尚未解决。请同时查看两个状态字段;REQUIRES_JUDGMENT 表示该评估并非由模型自行判定。
若要试用其他保留案例,请从案例表中选择名称。若要提交自己的案例,请新建 issue,附上案例事实、适用日期、查询、软件包/运行时版本、输出,以及你认为应产生不同答案的 FIDE 条款或模型规则。请使用虚构或匿名化案例。
SDK 通过 @arxo/[email protected] 执行规则。仅安装并不会在 SDK 的自动 canon 解析器中注册此发行包:请保留上文明确的 local.packages 传递步骤。加载器不实现任何国际象棋判定或公式。
用作 MCP 服务
独立的原生 MCP 封装会通过 stdio 运行同一固定版本的模型:
npx -y @arxo/[email protected]
Node.js 20+,Linux x64 或 macOS arm64。客户端配置、HTTP 端点、输入项和限制 · OCI 配方 · npm 配方 · 已接受的交付版本。此 MCP 交付与上文的 Node.js 使用方式相互独立。
选择案例
getCaseInput(name) | 局面 | 已检验的问题和结果 |
|---|---|---|
TouchIntentUnknown | 可移动的己方棋子;未裁定是否故意触子 | must_move_first_touched_piece:REQUIRES_JUDGMENT / NEITHER |
FirstIllegal | 完成了一步非法着法 | 判负:REQUIRES_JUDGMENT / NEITHER;和棋:COMPUTED / NEITHER |
SecondIllegal | 按模型指定的闭包,出现两步非法着法 | 判负:COMPUTED / TRUE_ONLY |
SecondIllegalNoMate | 出现两步非法着法;已确定无法将死 | 和棋:COMPUTED / TRUE_ONLY |
FlagFall | 观察到超时,时限尚未结束,仍有可能将死 | 判负:COMPUTED / TRUE_ONLY |
FlagFallNoMate | 同样的超时情况;已确定无法将死 | 和棋:COMPUTED / TRUE_ONLY |
RapidFirstIllegal | 快棋 15+10;第一步非法着法 | 对手获得 60 秒;关于 120 秒的查询结果为 NEITHER |
BlitzFirstIllegalCompetitive | 按竞技规则 B.2 进行的闪电棋 3+2 | 对手获得 120 秒;关于 60 秒的查询结果为 NEITHER |
ShortOfTimeRecording | 标准棋,无加秒,剩余 240 秒 | must_record_moves:COMPUTED / FALSE_ONLY |
DeviceWarning | 发现电子设备;裁判已给予警告 | 判负和不同处罚查询:COMPUTED / TRUE_ONLY |
所有 18 项原始案例/查询预期均予以保留并进行检验。测试样例导出提供 caseNames、game、white、black、king、CaseName 和 getCaseInput(name)。每次调用都会返回独立副本;名称未知时会抛出 RangeError。
事实与裁判判断
getCaseInput 保留 CLI 的规范断言、常量、上下文和选项。加载器不会补充缺失的事实或裁定。模型明确声明的闭包属于其规则;这并不意味着可以普遍假设缺失的事实为假。
对于触子规则,请使用声明的两个参数——棋手和棋子:
import { open } from '@arxo/law';
import { loadModel } from '@arxo/canon-fide-chess/chess';
import { white, king, getCaseInput } from '@arxo/canon-fide-chess/examples/arbiter';
const model = await loadModel();
const chess = await open(model.spec, {
offline: true, local: { packages: { [model.spec]: model.package } },
});
const answer = await chess.truth(
'must_move_first_touched_piece', [white, king], getCaseInput('TouchIntentUnknown'),
);
const document = JSON.parse(new TextDecoder().decode(answer.document));
console.log(answer.evaluationStatus, answer.truthStatus); // REQUIRES_JUDGMENT, NEITHER
console.log(document.results[0].judgmentRequests);
肯定且明确标记为 adjudicated 的故意触子断言,足以确立本模型中的义务;该路径会单独检验。原始的缺失裁判判断测试样例保持不变。
缺失的经验事实、否定事实和相互矛盾的支持分别保留 NEITHER、FALSE_ONLY 和 BOTH。对于已检验的经验事实冲突,SDK 0.4.3 返回 COMPUTED / BOTH:查询已计算,且正反两方均有支持。请读取两个字段;不要将它们合并为布尔值。精确的 Decimal 输入(例如记录的分数)以字符串表示('0.75')。
SecondIllegal 的完整规范输入
{
"legalTime": "2023-06-01",
"assertions": [
{
"contentHash": "sha256:696ba690ec316ad1654c94c94886b3d6e9764573460a0ed89f76280496c904fa",
"evidence": [],
"id": "urn:law:examples:chess:arbiter#player",
"kind": "assertion",
"literal": {
"args": [
{
"id": "urn:example:chess:game",
"kind": "entity_ref"
},
{
"id": "urn:example:chess:white",
"kind": "entity_ref"
}
],
"kind": "literal",
"polarity": "positive",
"predicate": "urn:fide:laws:clir:chess#player_of"
},
"origin": "case_input",
"package": "urn:law:examples:chess:arbiter"
},
{
"contentHash": "sha256:9f7706ed8482cd04f869afdd849b90eea3c2e42ca246bf932c8a20f77a1fcc15",
"evidence": [],
"id": "urn:law:examples:chess:arbiter#complete-mate-facts",
"kind": "assertion",
"literal": {
"args": [
{
"id": "urn:example:chess:white",
"kind": "entity_ref"
}
],
"kind": "literal",
"polarity": "positive",
"predicate": "urn:fide:laws:clir:chess#checked_player"
},
"origin": "case_input",
"package": "urn:law:examples:chess:arbiter"
},
{
"contentHash": "sha256:cd688c83624c70688f10ead443e5c46c32ad7d3310696caf6dad9b80be7c1cb0",
"evidence": [],
"id": "urn:law:examples:chess:arbiter#illegal-count",
"kind": "assertion",
"literal": {
"args": [
{
"id": "urn:example:chess:white",
"kind": "entity_ref"
},
{
"kind": "value",
"type": {
"name": "urn:law:std#Integer"
},
"value": 2
}
],
"kind": "literal",
"polarity": "positive",
"predicate": "urn:fide:laws:clir:chess#completed_illegal_move_count"
},
"origin": "case_input",
"package": "urn:law:examples:chess:arbiter"
}
],
"context": {
"decisionTime": "2026-09-08T12:00:00Z",
"knowledgeTime": "2026-09-08T12:00:00Z",
"legalTime": "2023-06-01",
"timezone": "UTC"
},
"options": {}
}
此输入由已发布的 CLI 0.2.3 从保留的 .lawcase 中捕获;测试样例生成器不会复现国际象棋语义。测试样例字节 · 捕获来源。
将 answer.document 保留为 Arxo 返回的规范字节。在运行时版本、固定模型和依赖项相同的情况下,对完全相同的完整输入(查询、事实、判断、时间上下文和选项)重复执行,会得到相同的字节及其哈希值。answer.proof.nodes 标识所应用的规则及其前提。
对于这些查询,当前 SDK 的 answer.sources 和证明节点的来源锚点数组为空。下方的来源链接是将已执行的生产者 ID 与经哈希校验的模型中的锚点进行的显式静态关联;它们不是评估器额外生成的引文。固定版本的出版物为 FIDE 手册,《2023 年国际象棋规则》。
此完整示例会保存关于认输的答案,并打印其模型锚点链接:
import { writeFile } from 'node:fs/promises';
import { open } from '@arxo/law';
import { loadModel } from '@arxo/canon-fide-chess/chess';
import { game, white, getCaseInput } from '@arxo/canon-fide-chess/examples/arbiter';
const model = await loadModel();
const chess = await open(model.spec, {
offline: true, local: { packages: { [model.spec]: model.package } },
});
const answer = await chess.truth('game_lost_by', [game, white], getCaseInput('SecondIllegal'));
await writeFile('answer.json', answer.document);
const nodes = new Map(model.package.ir.nodes.map(node => [node.id, node]));
const sourceLinks = answer.proof.nodes.filter(node => node.rule).map(node => ({
rule: node.rule,
anchors: (nodes.get(node.rule)?.anchors ?? []).map(id => ({
id, locator: nodes.get(id)?.locator,
})),
}));
console.log(answer.hashes, sourceLinks); // includes SecondIllegalMoveLoses → article/7
模型所知:原生触摸走子生产者树
由 chess.unfold('must_move_first_touched_piece', { depth: 2, lang: 'en', quote: 0 }) 生成,未选择任何案例。完整原生树和文本。递归深度与形式化深度相互独立。
模型和加载器 API
| 导入项 | 精确模型规格 | 导出项 |
|---|---|---|
@arxo/canon-fide-chess | [email protected] | models、loadModel(exactSpec)、错误类 |
@arxo/canon-fide-chess/chess | [email protected] | spec、loadModel() |
@arxo/canon-fide-chess/examples/arbiter | 保留的案例输入 | 标识符、案例名称和独立输入副本 |
loadModel 返回 { spec, package, descriptor, pin, questionCatalog }。根导入只读取目录和元数据。加载时会在解析所选世界及其目录之前验证原始字节,然后返回独立的模型对象。描述符保持独立:package.meta.contentHash 是关联世界的哈希值;packageContentHash 是原始包的哈希值。此版本中没有模型导入项。
未知或未指定版本的规格会触发 ModelNotFoundError.code === 'MODEL_NOT_FOUND'。模型资源缺失、损坏或不一致时,会触发 ModelIntegrityError.code === 'MODEL_INTEGRITY'。不会回退到网络。TypeScript 声明涵盖精确规格、关系名称、限定关系名称和测试样例名称;参数数量和取值类型由 SDK 在运行时验证。
形式化深度
| 模型 | 固定版本 | 测量单位 / 分母 | 可执行 | 其他测量级别 | 状态 |
|---|---|---|---|---|---|
[email protected] | 2023 年 1 月 1 日生效 | en_article / 12 条规则 | 12 | 已解释:0、已锚定:0、仅来源:0、无:0 | 部分 |
现有的 boundaries.depth 测量针对本包节点,不包括导入项,并以原始条款划分声明为准。全部 12 条规则均有推导规则;这一粗略测量并不能证明每个条款都已完整形式化。按此条款测量口径,仍有 28 个锚点引用未能解析,且已记录在报告中。
前言和附录 A–D 不计入此分母。A 和 B 中有可执行规则,快速棋和闪电战案例会用到这些规则;本演示不会执行 C 中的记号说明和 D 中的组织材料。指南不属于保留的规则出版物。这些部分未纳入条款报告的测量。
按单位划分的报告记录了分母、版本、来源 / 包 / 世界哈希值、原始测量实现哈希值和适配器哈希值。可执行、来源是否存在、完整性、声明的场景和成功运行情况是彼此独立的主张。该模型公开了制度谓词和一套流程;它未声明任何道义规范或完整的义务生命周期立场。
范围与验证
此软件包评估给定的对局。大多数棋盘/历史条件仍是明确的协议事实。它对已观察局面的有限处理范围涵盖完整且已知的四子王/后/车局面,以及一种特定的无法将死情况;其他局面不在此范围内。它不验证局面的一般可达性,不解析 PGN,也不构建锦标赛配对。等级分、棋手称号、决胜规则和瑞士制配对模型属于独立软件包,不包含在此软件包中。
Model 0.1.1 修正了四项准备缺陷,同时保留原有预期结果:测试夹具中的作用域过程谓词,以及在半分舍入前使用精确的 Decimal 中间值。所选软件包通过了 103 个源场景,其中包括 6 个新增数值边界测试,覆盖构建、重放和重建流程。已安装的演示验证了全部 18 个保留问题、加载器故障/隔离、明确与缺失的判断、缺失/负值/冲突事实、分数边界、规范化的重复性、README 示例以及严格 TypeScript 检查。
这些检查针对的是此分发版本。完整语料库:not_checked;releaseVerified: false。交付检查不能证明内容准确或完整。
来源固定与复现
来源固定记录将原始模型/描述符/世界/目录字节及用例输入固定到不可变的公开来源修订版本。来源说明另行记录语料库来源及已处理的修正。英文源文本是固定的可见文本提取内容(PINNED_UNOFFICIAL_COPY),并非声称来自官方 PDF 出版物。FIDE 署名和出版者条款保留在 NOTICE 中;Apache-2.0 适用于 Arxo 编写的代码,不取代这些条款。
要使用仓库中的固定输入重新构建封装:
git clone https://github.com/arxohq/arxo-fide-chess.git
cd arxo-fide-chess/npm
npm ci --ignore-scripts
npm run build -- --canon ..
npm test
npm run test:types
npm run candidate -- --out /absolute/new-candidate-directory
候选脚本会准备一个本地 tarball 和现有的 arxo.npm-candidate/1 清单;它不会发布。交付通过 arxo-io/law 中既有的 CI 完成。发布与验证流程 · 交付记录。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。