Queries: pitfalls
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:
FAIL [research.queries.truth_why_not#authored] tests/01-borrow-granted.lawtest / urn:query:research-queries-01 truth_status == TRUE_ONLY: в документе NEITHERThe “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:
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.
8. AI-agent traps in summary
Section titled “8. AI-agent traps in summary”- Writing a question “from memory” about a predicate missing from the program
and reading
NEITHERas 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/0in aDecimalslot) — aQUERY_INVALIDrefusal, indistinguishable in the report from an arity refusal without reading the message. - Asking
duties/liberties/powers/immunitiesinstead ofpositions()“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 canonicalquery; an ID mismatch isLDC-E1356, not “another answer”.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.