Skip to content

Asking about a period

What happened to the user in the week after they moved? A question like that asks for no single fact. It asks for the claims whose subject matter falls in an interval of the world's time, and the store can answer it only if it knows when each claim is about, which is a different thing from when it learned the claim. The window of --during and --on reads that, and nothing else about the ordinary query path changes.

uv run particles query "What happened in the week after the move?" --during 2026-10-10..2026-10-16
uv run particles query --during 2026-10-10..2026-10-16
uv run particles query "Where was the user staying?" --on 2026-10-08

The bounds are ISO-8601 dates, inclusive; either side of .. may be empty (2026-10-10.. is everything from that day on). The same parameter exists on all three surfaces: the CLI flags, QueryRequest.window on POST /query, and during_start / during_end / on on the MCP query tool.

What a window selects

Every claim may carry two fields beside the valid_until it already had: valid_from, when it begins to hold, and valid_kind, whether it is a moment (EVENT: "picked up the keys on 2026-10-10", about that day and no other) or a span (STATE: "lives in Pali Hill since 2026-10-10", holding from then until it closes). A window admits a claim under one of two readings, and the listing labels each:

  • began: its start lies in the window, whatever its kind. This is what "what happened in the week" asks.
  • in force: a span that started before the window and had not closed. This is the standing context: where the user lived, that they were on a trip.

An event before the window matches neither, so the store's dated past stays out of the week after the move. Two further labels mark a weaker anchor: held at, a span known to hold at a date with its start unknown ("as of 2026-10-08"), and within, a claim anchored to a month or a year and no finer ("published in 1999"), which sits in any window its unit meets and in no other. The point form --on admits an event on the date and a span whose interval covers it.

With a question, the window cuts the candidate set before ranking, where --subject cuts, so a dated claim competes only with the claims of its period; ranking, the answer and every disclosure are then as usual. Without a question the result is deterministic: the admitted claims in date order, no embedding, no language model.

Retired claims hold for their period

A claim the store has since retired was not false during the period it names. A window read therefore admits a retired claim for that period, marked with its retirement, and closes a retired span at the earliest of its own end, the start of the claim that superseded it, and its retirement instant. "Where was the user living on 2026-10-01?" returns the retired Delhi residence, closed on the day of the move; the week after the move does not show it as in force. When a retired claim's successor is in the window too, the successor stands in for it and names it: a restatement reads better than the original it restates. Outside a window every read is as it was.

Where the dates come from

The extractor emits a start when the source states one ("since March", "on 2026-10-10"). A present-tense state whose start the text does not give ("I'm staying at a hotel in Bandra") is anchored at the day it was said, marked as-of: known to hold then, start unknown, read as held from then on and never as having begun then. A past-tense claim with no date gets nothing, since when it was said is not when it happened, with one exception: in a session transcript the harness deposits (the Claude Code hooks), an act the session performed ("the tests passed", "the pull request was opened") is dated to the session's day as an event, marked session, because that is when it happened. A past event the session merely mentions is not. A session harvested before this rule existed carries no date of its own, so its claims were anchored at the day they were extracted; particles memory redate reads each such session's start from its transcript and moves those claims to that day, at no model cost. For the claims already in a store, particles validity reads the absolute dates the extractor writes into claim prose and sets a default from a short list of cues (on, since, from, as of, in <year>), at no model cost; a claim with two dates, or a date behind no listed cue, is skipped and counted. particles particle date sets one claim by hand. particle show prints the interval and how it was set.

An undated claim is never placed in a window; the footer says how many the read could not judge. Run particles validity --dry-run to see the coverage.

Resolving the anchor

"The week after the move" names a period by an event. The route takes absolute dates, so resolve the anchor first and ask with dates:

uv run particles query "When did the user move to Mumbai?"
uv run particles query "What happened in the week after the move?" --during 2026-10-10..2026-10-16

The first answer may hedge, and that hedge belongs in the open, in your turn, rather than inside a retrieval call. An agent over MCP does the same two steps.

Composing with as-of

--during selects by world time; --as-of keeps what the store believed at T (As-of time travel). Together they answer "what did the store believe on 2026-10-12 about the week of the move". Structural claim filters intersect with the window as they do with every other filter.