{
  "claim": "Nothing in AgentJev's weights knows how many options a question has. Every limit the model appears to have is a `raise ValueError` in one 90-line file, `jev_service/contract.py`, plus one argparse default. The 64-candidate load the README times is a workload, not a ceiling — the contract accepts 255, the same number TypeSafe's Choice accepts, and the scoring head has no parameter that depends on the count at all.",
  "method": "Read every bound in jev_service/contract.py at commit HEAD of github.com/malevrigns/agent-jev, then checked each against the weights. Parameter shapes come from the safetensors header of aimeigaoshou/agent-jev, pulled with HTTP range requests and summed: the scorer ends in `scorer.fc2.weight [1, 256]` and the candidate-set transformer carries no positional embedding table, so neither has a dimension indexed by the option count. The 2,048-token path limit is `--max-tokens`, an argparse default on jev_service/server.py; the published config.json declares max_position_embeddings 32,768.",
  "source": "https://github.com/malevrigns/agent-jev",
  "captured": "2026-09-22",
  "note": "Two open decision models have now been found with an option count welded into an export — N=25 in an ONNX graph, K=32 in a Core ML bundle. This is the third one I have looked for it in and the first where it is genuinely absent, so 'decision models cap out at N options' remains a claim about particular files rather than about the shape. The one bound that is not in this file is the training distribution: the typed-decisions fine-tune saw questions with 2, 4 and 5 candidates and nothing wider, so 255 is what the contract accepts, not what the checkpoint has been shown.",
  "columns": [
    { "key": "limit", "label": "limit" },
    { "key": "value", "label": "value", "align": "right" },
    { "key": "where", "label": "enforced by" },
    { "key": "weights", "label": "in the weights?" }
  ],
  "rows": [
    {
      "limit": "choice candidates",
      "value": "2–255",
      "where": "contract.py — `if not 2 <= len(keys) <= 255`",
      "weights": "no"
    },
    {
      "limit": "score levels",
      "value": "2–10",
      "where": "contract.py — `if not 2 <= len(levels) <= 10`",
      "weights": "no"
    },
    {
      "limit": "boolean candidates",
      "value": "exactly 2",
      "where": "contract.py — `keys = ['true', 'false']`",
      "weights": "no"
    },
    {
      "limit": "candidate paths per call",
      "value": "1024",
      "where": "contract.py — `total_paths > 1024`",
      "weights": "no"
    },
    {
      "limit": "questions per call",
      "value": "128",
      "where": "contract.py — `total_questions > 128`",
      "weights": "no"
    },
    {
      "limit": "states per call",
      "value": "1–32",
      "where": "contract.py — `not 1 <= len(requests) <= 32`",
      "weights": "no"
    },
    {
      "limit": "tokens per candidate path",
      "value": "2048",
      "where": "server.py — `--max-tokens` default",
      "weights": "no — config says 32,768"
    },
    {
      "limit": "candidates per backbone microbatch",
      "value": "16",
      "where": "engine.py — `path_batch=16`",
      "weights": "no"
    }
  ]
}
