Price index - agents that find market prices, and are not allowed to write one

A closed system, built for a jewellery wholesaler. Their catalogue goes in - tens of thousands of articles, each with a material, an assay and a measured weight. The question the system answers, continuously, is the one a price list cannot: where is this exact article actually being sold right now, by whom, and for how much.

The client is not named here and neither is the deployment. What follows is the architecture, and the numbers the running system reports about itself.

Scale, as the system reported it on 17 September 2026

Agents propose. They may not write a price.

The system runs four agent lanes, and each one carries two explicit lists: what it is permitted to do, and what it is forbidden to do. The forbidden lists are the interesting half. Across the lanes they rule out logging in, bypassing a captcha, evading bot detection, approving a new source, claiming to be a marketplace seller - and, in every lane without exception, writing a price.

Price authority belongs to deterministic validators and append-only snapshots. An agent's output is a candidate; a validator decides whether it becomes a number. This is the whole design: the probabilistic component is allowed to look, read and suggest, and is structurally unable to put a wrong figure into the record.

A lane that cannot prove it is fresh blocks itself

Two of the four lanes were blocked when this page was written, and each said why in a sentence: no fresh browser receipt has been published; no fresh real-capture parser receipt has been published. A third was unavailable because a worker identity was not configured. Every one of them also published the list of actions that would legitimately unblock it.

That is three states, not two - running, blocked, and unavailable - and none of them is silence. A lane that cannot demonstrate freshness does not quietly serve yesterday's answer.

Staleness is a value the system publishes about itself

The index does not present old numbers as current. When the controller's last report was 509 minutes old against a 15-minute threshold, the page said so, in those terms, and marked itself stale. The counters carry a note defining exactly which window they cover and which clock measured them. The client's own storefronts sit in the index and are counted separately, with a line stating that they are not market prices.

The same restraint applies to derived figures. A theoretical metal-content estimate is computed only for a simple declared alloy with a single assay, and the field carries its own warning that stones and non-metal components inflate it. For plated and mixed compositions it is deliberately left uncomputed rather than approximated.

What I built

The agent permission model and the lane state machine. The capture fleet and its per-host budget, interval and cooling logic. The feed importer and the material grouping. The validator boundary that separates proposal from record. The freshness accounting, and the decision that an unproven number is displayed as unproven.

Elsewhere on this site

Anastasiia Butova - ML engineer, Belgrade, Serbia. Email [email protected] · LinkedIn · GitHub · Telegram · Hugging Face