{
    "rules": [
        {
            "id": "reqNationValue(gennum)>=N -> reqNationGeneralCount(N)",
            "noteTemplate": "gennum >= {min}",
            "php": {
                "name": "reqNationValue",
                "equals": [
                    { "index": 0, "value": "gennum", "transform": "field" },
                    { "index": 2, "value": ">=", "transform": "comp" }
                ],
                "numberBinds": [{ "index": 3, "bind": "min" }]
            },
            "ts": {
                "name": "reqNationGeneralCount",
                "numberBinds": [{ "index": 0, "bind": "min" }]
            }
        },
        {
            "id": "reqGeneralValue(officer_level==12) -> beLord/beMonarch",
            "noteTemplate": "officer_level == 12",
            "php": {
                "name": "reqGeneralValue",
                "equals": [
                    { "index": 0, "value": "officer_level", "transform": "field" },
                    { "index": 2, "value": "==", "transform": "comp" }
                ],
                "numberEquals": [{ "index": 3, "value": 12 }]
            },
            "ts": {
                "nameAny": ["beLord", "beMonarch"]
            }
        },
        {
            "id": "reqGeneralValue(officer_level!=12) -> notLord",
            "noteTemplate": "officer_level != 12",
            "php": {
                "name": "reqGeneralValue",
                "equals": [
                    { "index": 0, "value": "officer_level", "transform": "field" },
                    { "index": 2, "value": "!=", "transform": "comp" }
                ],
                "numberEquals": [{ "index": 3, "value": 12 }]
            },
            "ts": {
                "name": "notLord"
            }
        },
        {
            "id": "reqGeneralValue(nation==0) -> beNeutral",
            "noteTemplate": "nation == 0",
            "php": {
                "name": "reqGeneralValue",
                "equals": [
                    { "index": 0, "valueAny": ["nation", "nation_id"], "transform": "field" },
                    { "index": 2, "value": "==", "transform": "comp" }
                ],
                "numberEquals": [{ "index": 3, "value": 0 }]
            },
            "ts": {
                "name": "beNeutral"
            }
        },
        {
            "id": "reqGeneralValue(nation!=0) -> notBeNeutral",
            "noteTemplate": "nation != 0",
            "php": {
                "name": "reqGeneralValue",
                "equals": [
                    { "index": 0, "valueAny": ["nation", "nation_id"], "transform": "field" },
                    { "index": 2, "value": "!=", "transform": "comp" }
                ],
                "numberEquals": [{ "index": 3, "value": 0 }]
            },
            "ts": {
                "name": "notBeNeutral"
            }
        },
        {
            "id": "reqDestNationValue(nation==destGeneral.nation) -> destGeneralBelongsToDestNation",
            "noteTemplate": "destination general belongs to destination nation",
            "php": {
                "name": "reqDestNationValue",
                "equals": [
                    { "index": 0, "value": "nation", "transform": "field" },
                    { "index": 2, "value": "==", "transform": "comp" }
                ]
            },
            "ts": {
                "name": "destGeneralBelongsToDestNation"
            }
        }
    ],
    "oneSidedRules": [
        {
            "id": "npc-active destination loaded by legacy argTest",
            "command": "General/che_NPC능동",
            "kind": "full",
            "side": "ts",
            "name": "existsDestCity",
            "note": "legacy argTest loads and rejects a missing destination; core exposes the equivalent constraint"
        },
        {
            "id": "recruit-accept self target checked outside legacy constraint array",
            "command": "General/che_등용수락",
            "kind": "full",
            "side": "ts",
            "name": "differentDestGeneral",
            "note": "legacy argTest rejects self before building constraints"
        },
        {
            "id": "abdication self target checked outside legacy constraint array",
            "command": "General/che_선양",
            "kind": "full",
            "side": "ts",
            "name": "differentDestGeneral",
            "note": "legacy argTest rejects self before building constraints"
        },
        {
            "id": "gift self target checked outside legacy constraint array",
            "command": "General/che_증여",
            "kind": "full",
            "side": "ts",
            "name": "alwaysFail",
            "note": "legacy argTest rejects self before building constraints"
        },
        {
            "id": "assignment self target becomes legacy dynamic AlwaysFail",
            "command": "Nation/che_발령",
            "kind": "full",
            "side": "php",
            "name": "alwaysFail",
            "note": "core preserves the legacy completed-false action in resolve-time handling"
        },
        {
            "id": "troop-kick self target becomes legacy dynamic AlwaysFail",
            "command": "Nation/che_부대탈퇴지시",
            "kind": "full",
            "side": "php",
            "name": "alwaysFail",
            "note": "core preserves the legacy completed-false action in resolve-time handling"
        }
    ]
}
