Skip to content
docs
Arxo ↗

Queries: pitfalls

For LLMs8 sections

Wrong forms, silent outcomes, diagnostics, typical mistakes of formalizers and AI agents, how to detect them. Items marked “confirmed by run” were reproduced during this research on the installed law (semantics law.core/0.2).

1. when not P instead of when not_known(P) (confirmed by run)

Section titled “1. when not P instead of when not_known(P) (confirmed by run)”

Strict not requires a refutation: a missing fact gives NEITHER, and the rule stays silent even in the “positive” case. During this research the first version of the research.queries.truth_why_not package with when not has_debt(r) gave NEITHER in case 01:

Output
FAIL [research.queries.truth_why_not#authored] tests/01-borrow-granted.lawtest / urn:query:research-queries-01
truth_status == TRUE_ONLY: в документе NEITHER

The “unless otherwise established” form is only not_known(P) (only in a rule body). Detection: a TRUE_ONLY positive test next to a NEITHER negative — a vacuous positive turns red at once instead of staying silent.

2. Wrong-arity question — QUERY_INVALID, not NEITHER

Section titled “2. Wrong-arity question — QUERY_INVALID, not NEITHER”

A question literal is checked against the presented program’s signature at any depth — in literal kinds, in a formula, in a collect generator, in a nested question. A mismatch is rejected BEFORE computation with an error object {"error": {"code": "QUERY_INVALID", …}}. A predicate the program does NOT declare is not judged: open world — the question is legal, NEITHER is the answer. An AI agent seeing NEITHER fixes facts when the argument count in the question needs fixing. Detection: a short-arity conformance scenario; the refusal text names the predicate and the declared vs given arity.

3. focused_truth in 0.2 — a refusal without a result

Section titled “3. focused_truth in 0.2 — a refusal without a result”

The kind executes in 0.3 semantics; in 0.1 and 0.2 the question is rejected with a FOCUS_UNSUPPORTED_SEMANTICS issue (fatal) without a result, and the answer document is a separate focused-evaluation form, which the full audit-document consumer does not accept. The AI mistake is substituting the neighbouring truth “until better times”: implementations must not substitute a non-marginal kind with a neighbour, and the same binds the author. Detection: a conformance test pins the 0.2 refusal.

4. position_count with two arguments (confirmed by run)

Section titled “4. position_count with two arguments (confirmed by run)”

The observation takes two names and an integer — position_count(Template, Status, N). The short position_count(ReturnOnTime, 0) form does not lower:

Output
SKIP ... tests/04-no-member.lawtest
тест не лоуверится (LDC-E1316: position_count(Шаблон, Статус, N) принимает два имени и целое (§267.4))

A SKIP-status step walks past the report as “not executed” (code 2), not as a failure — the skip is easy to miss. Detection: require code 0 and zero “not executed” in the law test total, not just no FAIL.

5. Expecting truth_status on positions() and collect

Section titled “5. Expecting truth_status on positions() and collect”

The NORM_POSITION and COLLECTION kinds have no truth_status axis: mandatory dimensions are applicability_status + normative_status (+ supports) and the value collection respectively. A missing dimension is absent, not equal to NEITHER. Expecting another axis is an observation mistake, and reading a missing truth_status as “the law’s silence” is a conclusion mistake. Detection: the observation dictionary is closed; correct expectation specimens are an activation-with-judgment scenario (four position axes) and a minutes-between scenario (two collection axes).

6. Uppercase bearer/holder — lowercase only

Section titled “6. Uppercase bearer/holder — lowercase only”

The examples write bearer/holder only as lowercase keywords. Older material keeps the capital form in places — that is data, not a model for new examples.

7. Silent COMPUTED instead of a cause: a term error visible only in the status

Section titled “7. Silent COMPUTED instead of a cause: a term error visible only in the status”

A truth/why_not result with NEITHER backed by a candidate-rule term error carries a status (MISSING_INPUT, MISSING_POLICY, NON_EXECUTABLE, EXTERNAL_UNAVAILABLE, TYPE_ERROR, RUNTIME_ERROR, RESOURCE_LIMIT) and missing_inputs — while a test checking one truth_status stays green even on “law not computed”. Earlier builds answered COMPUTED with empty missing_inputs. Detection: positive tests always as a triple (result_kind, truth_status, evaluation_status); on why_not the same plus reading termErrors. The opposite-signed exception: MISSING_PARAMETER_VALUE is the law’s own silence, the status stays COMPUTED, the cause is a warning issue; an error level here would be a computation refusal.

  • Writing a question “from memory” about a predicate missing from the program and reading NEITHER as a model refusal — that is the open-world answer; predicate absence is checked against sources, not against the status.
  • Inventing question-literal values past the value reader (1/0 in a Decimal slot) — a QUERY_INVALID refusal, indistinguishable in the report from an arity refusal without reading the message.
  • Asking duties/liberties/powers/immunities instead of positions() “for precision” without checking the kind executes — a non-executed kind is rejected with a diagnostic, not substituted by a neighbour; what executes in 0.2 is pinned by conformance scenarios, not by the kind list.
  • Losing queryId: two forms of one question under one ID give one canonical query; an ID mismatch is LDC-E1356, not “another answer”.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.