Skip to content
docs
Arxo ↗

Pin context, editions and time

For LLMs10 sections

Every answer belongs to a context: a pinned version of the canon, one fixed set of case facts, and a date on which the law is read. Change any of the three and the old answer stops speaking for the case. This page states what the agent must pin, where each pin comes from, and what to do when time itself is part of the question.

The through-example is the feeding-break question over package kz-labour-code (Labour Code of the Republic of Kazakhstan), predicate feeding_break_too_short.

This is an obligation of the agent contract, not a style tip:

  1. The date of law comes from the human — the user, or a case file the user supplies. The agent does not choose it.
  2. The agent never defaults it to today. “Today” is a date like any other: if the user says “as of today”, the agent writes the actual calendar date into the request and the report.
  3. The agent never omits it. If the human has not named a date and the story does not fix one, the agent asks before the first ask: “Which date should the law be read on — the date of the event, or another date?”
  4. Every request and every report carries the date. “Established under the law as of 2026-09-01” is a finding; “established” alone hides its temporal scope.

Why the obligation is strict: the server accepts a request without legalTime and silently substitutes a default. That default is a fixed date compiled into the server build (the server source sets it to 2026-09-03 at the time of writing), not the current date and not the date of the case. An answer computed under it is an answer about a day nobody chose. The default exists so the server is deterministic, not so the agent can lean on it.

JSON
// fragment of each verified law_ask request in this section
{ "package": "kz-labour-code", "legalTime": "2026-09-01", "...": "..." }

Status: the call shape ran via the public MCP endpoint (root route) on 2026-10-04; the default constant was read in the server source, not exercised in this pass.

A predicate name means nothing without the package that defines it. The agent pins the package identity, the exact version it asked, and the programHash from the answer provenance, because a later version of the same act may model the norm differently.

The through-example pins kz-labour-code, formal name kz.corpus.labour_code, version 0.1.0. The package question catalog entry feeding-break-too-short binds the asked predicate to its task.

Rule and fact counts are not a fingerprint. A threshold change from 30 to 45 minutes inside one rule keeps the rule count while changing what the canon says: counts can hint that a package moved, never certify that it did not. The fingerprint is the version together with the returned programHash.

Multi-package work pins a world, not one act. The measurement-uncertainty task guide (package jcgm.gum 0.1.0, a scientific methodology, not state law) pins three packages at fixed versions: jcgm.gum 0.1.0, jcgm.vim 0.1.0 and units.si 0.1.0. The agent records the same kind of world for every case: each package with its version, so any answer can be re-run against the identical set.

An answer also belongs to one exact fact set. The snapshot is named by the caseHash from the provenance together with the fact list and its origins — never by the resultHash. The pair programHash + caseHash is the input, resultHash the outcome, codeHash the engine that computed it. See How to read an answer for the four-hash split.

The date of law is part of the input. The same two facts asked at 2026-09-01 and at 2025-06-01 return different caseHash values (sha256:718dbd60… and sha256:cb56ea8e…) under the same programHash. A report that quotes a hash without the date it was computed for quotes half a context.

Three cautions:

  • A hash identifies bytes, not access: it proves nothing about who may see the case data.
  • Replay determinism covers the engine, not the language model that wraps it.
  • An unchanged resultHash says nothing about the agent’s model or instructions. The agent never borrows the engine’s hashes to vouch for its own text.

Event time, knowledge time, decision time, timezone

Section titled “Event time, knowledge time, decision time, timezone”

The date of law is not the only clock. Committed case files distinguish three moments plus a timezone:

Arxo Law
// context block, as committed in the Labour Code threshold fixtures
context {
decision_time @2026-09-01T12:00:00+06:00;
knowledge_time @2026-09-01T12:00:00+06:00;
legal_time @2026-09-01;
timezone "Asia/Almaty";
}

The measurement-uncertainty cases use legal_time @2026-09-06 with knowledge and decision times at noon UTC and timezone UTC.

ClockMeaning for the agentWho names it
Legal timeWhich day’s law governs the questionthe human
Knowledge timeAs of when the stated facts are taken to be knownthe human or the case file
Decision timeThe moment the modeled decision is madethe human or the case file
TimezoneHow to read wall-clock times in the factsthe case file; ask if absent

Timezones are literal: 12:00 in Asia/Almaty is a different instant from 12:00 in UTC, and the agent converts before comparing. When a story gives times without a zone, the agent asks for the zone rather than assuming its own.

Some packages keep several named readings of one provision; the selected reading is then part of the context just as the date is. The feeding-break rules list no named readings (law_rules answers “Применимые толкования: не перечислено.”), so there is nothing to select. Where readings exist, the agent names its pick in the report and never blends two readings into one answer. Choosing among readings — and who may choose — is in Human decisions, interpretations and scenarios.

A user asks about an event from last year. The agent sets the date of law to the date the human names for that event and asks again — never reuses an answer computed for another date.

The re-ask was observed on 2026-10-04 via the public MCP endpoint (root route), same two facts (25 minutes, one child):

Date of lawtruthStatusprogramHashCited text
2026-09-01TRUE_ONLYsha256:c652f314…Article 82, consolidated text as of 12 July 2026
2025-06-01TRUE_ONLYsha256:c652f314…the same
2016-01-01TRUE_ONLYsha256:c652f314…the same

Read the table carefully. The engine answered every date, but each answer cites the 12 July 2026 consolidated text. The package holds one edition of this article, so an answer “as of 2016” applies that text to a 2016 date; it does not prove that the 2016 law said the same. Before presenting a historic answer as “the law at the time”, the agent checks what the package says about editions:

  • law_editions compares the act’s projections at two dates and reports whether the comparison is meaningful. An earlier observation on this package between 2025-01-01 and 2026-09-01 returned NOT-DATED — “nothing to date this with”, not “nothing changed”. (Pre-rework observation; not re-run for this page.)
  • law_sources names the edition and official text behind each norm.

If the package cannot date the provision, the report says so next to the historic answer: “computed at 2016-01-01 over the 12 July 2026 consolidated text; the package does not track earlier editions of Article 82.”

Facts change, dates change, versions change. The rule for all three: the old answer is frozen, the agent asks anew, and the report carries both.

Observed on 2026-10-04 via the public MCP endpoint (root route): minutes corrected from 25 to 30 with one child gives a new caseHash (sha256:33409922…), a new resultHash (sha256:0e8cb6ff…) and a new truth status, NEITHER — which is not a finding that the break was long enough. The report keeps the old TRUE_ONLY attached to the old fact set. A changed date or a changed package version is handled the same way: two contexts, two answers, both quoted with their pins.

When the answer leaves the agent — to a user, a reviewer or another system — its context travels with it: package versions, the fact snapshot named by its caseHash, the resultHash, the date of law, timezone and the selected reading. A bare verdict without its conditions is a rumor. Packing that record for another agent or person is an application concern; the platform provides no native handoff envelope.

Every answer the agent keeps gets one record in one shape. Below it is filled with the full-input feeding-break call, saved verbatim as sc5-ask-25.json; the hashes are copied from that file, never reconstructed.

  • Request: truth question feeding_break_too_short(Aigul, Employer) over kz-labour-code.
  • Date of law: 2026-09-01, named by the scenario’s user, not defaulted.
  • Inputs: child_feeding_break_minutes(Aigul, Employer, 25) and children_under_eighteen_months(Aigul, 1), origin case_input.
  • Canon: kz-labour-code, formal name kz.corpus.labour_code, version 0.1.0.
  • Clocks: knowledge and decision times as stated in the case; timezone Asia/Almaty.
  • Mode: audit, copied from the provenance.
  • Readings: none selected — the rules list none.
  • Outcome: COMPUTED, TRUE_ONLY.
  • Locations: the package manifest, the catalog entry feeding-break-too-short, and the full answer stored beside the record (with proofRef when requested).
Output
# returned hashes, verbatim from sc5-ask-25.json
programHash sha256:c652f314bb94995bc65b5ccb9f5d6a6ebc71a067375a80d555f7b971126ab197
caseHash sha256:718dbd60f84951dbbdb7eee6edacd81e0b091e32b9b2c6ac871c354b0a1b7168
resultHash sha256:119c9d63e56931e98dcde17594fce56ae5cfb8b11cb3a7ac44a9896881c1ae82
codeHash sha256:639caac5c0c016ccfd13e90d69316372dac07ab9cf601eea0e326fc44d38329d
Terminal
./law version
./law query producers \
--param predicate='urn:kz:corpus:clir:labour-code#feeding_break_too_short' \
--param pkg=kz.corpus.labour_code --format human

The producers query lists the two strict rules behind the predicate, both anchored on Article 82. Over MCP: repeat the full-input law_ask at legalTime 2026-09-01, 2025-06-01 and 2016-01-01 and compare caseHash, programHash and the cited edition; repeat law_editions between 2025-01-01 and 2026-09-01; call law_ask once without legalTime and read the date the provenance reports — then never do that in an agent.

Show commands, versions and results
CheckResult
Package manifest (kz.corpus.labour_code 0.1.0), catalog entry, fixture context blockRead 2026-10-04
Server default for an omitted legalTimeRead in server source 2026-10-04: fixed constant 2026-09-03; not exercised
law_ask at 2026-09-01, 2025-06-01, 2016-01-01 and the 25 → 30 correctionRan via public MCP endpoint (root route) 2026-10-04 in the recorded behavior pass; raw files sc5-*, sc6-*, sc6b-ask-2016
./law query producers, ./law versionRan locally 2026-10-04: 2 strict producers, Article 82; tool 0.1.1, semantics law.core/0.2
law_rules for feeding_break_too_short (no readings)Ran via public MCP endpoint (root route) 2026-10-04; raw file sc1-rules.json
law_editions 2025-01-01 → 2026-09-01 (NOT-DATED)Pre-rework observation; not re-run

Previous: Connect and discover Next: Collect facts and evidence

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

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