11. Core Concepts#
11.1. The five-agent pipeline#
Every metadata record passes through five agents in a fixed sequence. Candidate issues accumulate through the first two passes; the critic filters them; the categorizer labels the survivors; the severity scorer assigns impact and closes the pipeline.
Agent |
Receives |
Outputs |
Role |
|---|---|---|---|
primary |
The raw metadata record |
JSON array of candidate issues |
Independent first-pass scan for all issue types. Precision is preferred, but obvious errors must not be omitted. |
secondary |
The raw metadata record |
JSON array of candidate issues |
An independent re-scan that does not rely on the primary’s output, to surface issues the primary may have missed. |
critic |
Combined list from primary + secondary |
Filtered JSON array |
Removes false positives by applying the general, field-level, and data-state exclusion rules (see Advanced Usage). Only unambiguous issues pass. |
categorizer |
The critic’s filtered list |
Same array, with |
Annotates each surviving issue with exactly one category. Adds or removes nothing. |
severity_scorer |
The categorizer’s list |
Final array, with |
Assigns a 1–5 impact score to each issue and emits the termination signal that ends the run. |
Note
Why two detectors? Running two independent first-pass scans (primary and secondary) increases recall: a single pass tends to miss issues, while a second, independent pass catches them. The critic then trims the combined list back down to only the certain errors, trading a little extra LLM cost for higher coverage.
11.2. Issue categories#
The categorizer assigns exactly one label to each confirmed issue. The bundled default manifest uses these five categories:
Category |
Meaning |
|---|---|
Typo / Language |
Clear typos, spelling, grammar, punctuation, or wording errors. |
Formatting / Structure |
Malformed text, invalid format patterns, or broken structure. |
Missing / Redundant Information |
Unquestionably missing required information, or accidental duplication. |
Inconsistency / Conflict |
Direct contradictions across fields. |
Incorrect / Invalid Content |
Clearly wrong facts, values, units, methods, or invalid values. |
11.3. Severity scale#
The severity scorer assigns an integer from 1 to 5 based on impact, not certainty — every issue reaching this stage has already passed the certainty filter, so even minor issues are scored rather than dropped.
Score |
Label |
Meaning |
|---|---|---|
1 |
Trivial |
A clear error, but cosmetic with minimal practical impact. |
2 |
Low |
A minor confirmed quality issue; the meaning remains mostly clear. |
3 |
Moderate |
A confirmed issue that may confuse users or reduce trust. |
4 |
High |
A confirmed issue likely to mislead or to affect correct use. |
5 |
Critical |
A confirmed issue with serious risk of misuse or reputational harm. |
11.4. Output schema#
The pipeline returns a JSON array. Each element describes one detected issue using the following fields:
Field |
Description |
|---|---|
|
A brief description of the problem identified. |
|
One of the category labels from Issue categories. |
|
An integer 1–5 from the severity scale. |
|
A single-entry object mapping the problematic field’s key path to its current value. |
|
A single-entry object mapping the same key path to the proposed corrected value. |
Key paths use dot notation with array indices in brackets — for
example series_description.name or series_description.topics[0].name.
Both current_metadata and suggested_metadata contain exactly one item,
so an issue always points at one specific field.
11.5. Architecture: Client, Core, and Job#
The implementation is split across three classes with distinct responsibilities:
Class |
Responsibility |
|---|---|
|
The public entry point. Builds the model client, submits jobs (synchronously or asynchronously), tracks job state, and exposes cancellation and cleanup. This is the only class most users touch. |
|
The pipeline engine. On each run it loads the agent manifest, constructs the AutoGen agents, assembles the team, runs the conversation, and extracts the final JSON. It holds no provider-specific logic. |
|
A handle for one submitted request. Carries the |
The client owns the model_client (the LLM connection) and passes it down
to the core, which in turn passes it to every agent. This is what keeps
the design provider-agnostic: all LLM communication flows through that
single injected reference.