Skip to content

Working session: ask the question

The question is law_ask. It has five kinds, and the first, truth, answers “is it established”. We assemble the call from what the previous pages gave: the predicate, its arguments, and two facts from factsTemplate. Legal time is explicit.

{
"kind": "truth",
"package": "kz-labour-code",
"predicate": "feeding_break_too_short",
"args": ["Айгуль", "Работодатель"],
"facts": [
{ "predicate": "child_feeding_break_minutes", "args": ["Айгуль", "Работодатель", 20] },
{ "predicate": "children_under_eighteen_months", "args": ["Айгуль", 1] }
],
"legalTime": "2026-09-01"
}

We asked it three times, changing only the facts. That is the shortest exercise that explains the four-status scale better than any text.

Twenty minutes, one child. The answer is TRUE_ONLY, “established”. derived holds the derived fact, rulesApplied the thirty-minute rule, whyNot is empty. The break is shorter than the minimum.

No facts. The answer is NEITHER, and in meaning the server itself says how to read it: “not established: neither confirmation nor refutation — this is not ‘no’”. whyNot is full: both rules are named, and each premise has status DEPENDS marked “depends on an unbound variable”. The law is not silent — it has nothing to read.

Forty-five minutes, one child. NEITHER again. And whyNot again, but now different: the premises about minutes and about the number of children are TRUE_ONLY, and the guard “45 is less than 30” is FALSE_ONLY. The rule read the facts and did not fire.

The third answer is the main one. Intuition expects “no, the break is not too short”. But the formalization has no norm “the break is sufficient”: the article says only when it is shorter than the minimum. Nobody can refute the predicate, and the honest answer is “not established”. Collapsing it to “no” would attribute to the law a norm it does not contain. The difference between NEITHER and FALSE_ONLY is in How to read an answer; here it is visible on one predicate.

collect enumerates: the same arguments, but a variable instead of one entity, and the answer is a list of substitutions for which the predicate is established.

calc computes from normative values of the corpus. An operation tree with a lookup leaf takes the value from an act, not from your head:

{ "kind": "calc", "calc": { "op": "mul", "left": { "lookup": "mrp", "args": [2026] }, "right": 2 }, "legalTime": "2026-09-01" }

The answer is an amount in tenge and a normativeValues field naming the budget act the monthly calculation index for that year was taken from. Do not copy the amount from here by hand: it comes from the budget act and changes with it.

deadline computes a period under the rules of time computation on the official calendar:

{ "kind": "deadline", "after": "2026-03-06", "days": 10, "unit": "business_day" }

The answer is a date and a because field: from which day the count started, which days dropped out and why (in March, holidays and transferred weekends, each with a citation of the holidays act), which computation rules applied. The period is transparent to the day. In the provenance of this answer the time-computation package is named as a teaching stand-in for Civil Code articles — an honest mark of formalization depth, and it must be passed along with the date.

positions is not “is it true” but “which duties arose and in what state they are”. Second plot of the session: an advocate sent an inquiry to an akimat; the law allows ten business days for a reply.

{
"kind": "positions", "package": "kz-advocacy",
"facts": [
{ "predicate": "inquiry_by", "args": ["Запрос-1", "Адвокат"] },
{ "predicate": "inquiry_to", "args": ["Запрос-1", "Акимат"] },
{ "predicate": "inquiry_sent_on", "args": ["Запрос-1", "2026-03-06"] }
],
"legalTime": "2026-03-20",
"deadlinePolicy": { "start_count": "next_day", "include_end": true, "roll": "next_working_day" }
}

The answer is a position with a template, modality duty, bearer (the akimat), beneficiary (the advocate), and status ACTIVE: “the duty arose, the period has not expired, performance is not recorded”. The same question on a date after the period with the fact “no reply was given” (the same predicate with negated: true) yields VIOLATED, and statusSupports shows which fact established that. A question after the period without that fact yields not a violation but indeterminacy: a violation is proved, it does not follow from silence.

Two traps of this mode. First: without a time-computation policy, a norm with a period in days answers with a warning and does not compute — the policy is set by the law of procedure, the server does not imply it. Second: an empty positions list with summary UNDETERMINED is not “there are no duties”, it is “facts were missing for a position to arise”. In our session the first call gave exactly that, until we submitted who sent the inquiry and to whom.

selectedInterpretations — a choice of reading where the act admits several and the formalization keeps them; without a choice the contested part is silent. proof: true — return evaluation with the proof graph in the answer; without it only the address proofRef arrives. It will be needed on explain and doubt.

First — take silence apart: three kinds of “not established” and how to tell them apart.

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

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