Skip to content

Knowledge Agent qualification — 2026-10-09

Status: Native public-corpus workflow qualified and published; broader release criteria remain open
Last reviewed: 2026-10-09

This records the implemented Vanguard slice. It does not close every exit criterion in the delivery plan, or qualify future cloud, Salesforce, external-destination or full-media adapters.

Persistent demonstration

The local Vanguard agent is Public Policy Knowledge Lab, knowledge-public-policy-lab, at /agents/knowledge-public-policy-lab/knowledge. It uses the 12 core sources in the public corpus. The baseline contains 12 acquired documents and 917 verified evidence units. The separate corpus inspection also parsed the four extension documents; those extensions are not part of the baseline's answer-accuracy denominator.

Artifact Identity / result
Baseline build 7195b2de-7068-4940-9295-16dc6b938cc5
Baseline evaluation fabb0281-e457-4a7a-8b86-b0dde0738220
Post-recovery baseline evaluation 6366b6b0-beab-4fba-9fb2-6ad8961b1723: 8/8, required-source recall 1.0
Baseline publication Agent version 1, retained in publication history
Graph candidate 64841c12-c64c-4e66-bfc0-9b84b5503849
Final graph evaluation 00ac8c49-4e77-4388-be78-aebc5c23fc0a: 8/8, required-source recall 1.0
Current publication Graph build, agent version 2
Complete graph 3,254 entities / 5,418 relations / all 917 native documents

The baseline uses native hybrid retrieval with vector weight 0.5, similarity threshold 0.05, 200 candidates and up to 12 initial evidence units. Rewriting and reranking are disabled. It uses text-embedding-3-small@OpenAI in RAGFlow and the tenant's gpt-4.1-mini integration for answers and the evaluation judge. Its frozen reviewed vocabulary is empty.

Reviewed corpus expectations

Eight source-backed engineering cases cover allowability versus allocation, sponsored hospitality, Fly America cost exceptions, the Department of Defense qualification, Boston seasonal rates, first-day meal arithmetic, the travel-expense appendix, and an unrelated employer whose private policy is absent.

The baseline judge reported 8/8 passing, with mean required-source recall 1.0 across the seven cases declaring required sources. The eighth case correctly remained unresolved. The expected claims and answers were checked against frozen acquired originals and source locations, and the resulting answers were reviewed as engineering fixtures. These are not institution- approved policy advice or a statistically representative corpus-wide score. The same model family generated and judged the answers; independent domain review remains necessary. The post-recovery run repeated that automated score. Manual reading found unnecessary missing-information entries and an overbroad parenthetical about the Open Skies restriction. These wording concerns remain separate from the judge's passing result; the score does not certify every generated sentence.

The completed graph was evaluated three times. The first run, 3080904a-6d77-4764-bae2-6a33edcc128d, passed automatically but added unnecessary detail and information gaps. The shared answer contract now limits gaps to facts needed for the question and asks for direct, scoped answers. The judge now receives numbered evidence and citations and checks added claims. A second run, 855471be-0d18-431c-be9e-34a47f8a1db3, removed the unnecessary gaps but overstated the sponsor-approval condition; it was not selected for publication.

The hospitality fixture was strengthened at revision 2 to reject a universal separate sponsor-approval requirement. The answer contract explicitly preserves modal and conditional language. The final eight-case run retained the conditional approval wording, the DoD restriction, seasonal rates, first-day arithmetic, the appendix's negative reimbursement value, and the unresolved employer-policy gap. Its source-linked answers were manually reviewed before publishing the demonstration. The first-day answer states the 75% rule without a departure-time restriction but does not repeat the source's “irrespective of time” wording. Some extra detail and inconsistent inline citation notation remain. These three runs are a development sequence, not independent held-out replications.

All 400 returned evidence entries across the final eight answers matched their frozen original text, retrieval text, native identities and source locators. Every citation number was within its returned evidence list. Required-source recall is source presence, not proof that each material claim was supported. Graph expansion produced 364–901 additional candidate units; a scoped native ranking pass selected 38 alongside the 12 initial hits. This broad graph needs further relevance and ontology-quality work; graph membership alone is not used as factual support.

The baseline and graph builds contain the same 917 source units, but their prepared text is not byte-identical. An offline comparison matched every unit by source, document and section/row: 648 differ only by HTML entity decoding (& becomes &), comprising 642 spreadsheet rows and six Word units. One Word unit's paragraph-end offsets also reflect the decoded text lengths. No other text differences were found. Both frozen builds remain unchanged. The paired case results therefore qualify the two saved configurations; they are not a controlled measurement of the graph's isolated effect.

Executed boundaries

Boundary Result
Native prepared-unit contract Exact content and typed string/number/boolean/array metadata read back; repeat writes kept identifiers; retrieval found the fixture; fixture deleted
Native graph contract fixture Real graph task completed; complete-export marker returned; temporary dataset deleted
Repeatable native conformance test Initial opt-in run passed; repeated runs exposed empty retrieval and metadata-write failures during an Infinity outage. Post-recovery runs passed in 63 and 33 seconds; the latter verified distinct initial/resumed graph tasks, complete receipts, unchanged evidence, and fixture cleanup
Connected graph answer fixture Nine native entities/twelve relations across two original documents; one initial hybrid hit expanded to both policy and exception; excluding the exception produced an explicit information gap; source-support inspection passed in the browser; fixture deleted
Native compatibility regression Duplicate-folder children preserved; complete 300-node export; cross-tenant denial
Baseline publication Matching build and reviewed evaluation published through the real API
MCP authorization agents:run token answered from the publication; draft preview and dataset override rejected; temporary token revoked
MCP SDK transport Initialize, tool discovery and query passed; empty scope unresolved; untrusted Origin rejected; temporary token revoked
Browser authoring Create agent/source, edit Split, reject stale save, edit reviewed claims, import quoted CSV, reject anonymous reads and oversized reservation
Real corpus browser inspection Saved parsed operation and paginated original/prepared evidence opened; completed graph showed Boston entities with original spreadsheet rows and working source links
Corpus graph integrity 917 original full-field hashes unchanged; all 917 native documents covered; zero references outside that inventory; zero pending graph writes
Graph publication Final reviewed evaluation and matching graph build published as agent version 2
Published graph MCP Initialize/discovery/query passed; run-only draft preview and dataset override rejected; a metadata scope matching no units remained unresolved; temporary tokens revoked
Publication lifecycle fixture Real uploaded policy indexed/evaluated; unchanged-config refresh published after draft deletion; prior publication restored; source disable blocked answers and restoration; fixture datasets and encrypted upload deleted
Scanned PDF fixture Real vision extraction preserved both pages, the tail-page exception, written-approval qualifier, negation and footnote; missing OCR configuration rejected
Worker lease integration Replaced/expired/cancelled leases could not commit; current lease could; other-tenant and disabled-source checks rejected
Worker concurrency Two real discovery jobs held separate leases concurrently and both completed while the corpus graph continued; fixture deleted
Corpus graph observation retry The one-hour observer timeout resumed through the real API in 2.1 seconds; all 917 native unit identifiers and 60 saved artifacts were unchanged, and the existing native graph task continued
Worker process recovery After a forced exit, the replacement claimed the expired lease in 245 seconds; all 917 units and 60 artifacts were unchanged and the native merge task continued. Parser version 4 retained the frozen version 3 index
Change-impact integration Changed content/units selected dependent cases and mappings; changed query configuration selected all cases; other-tenant and revoked snapshots rejected
Deterministic tests DAG rules, document and unit routing, cache invalidation, parsing/locators, typed filters, graph references, incomplete graph receipts, imports and feature gates
Database Migration 075 applied repeatedly; isolated fresh-boot schema drift check passed
Generated configuration Descriptions complete; generated schemas match source
Global route audit Knowledge routes accepted; six existing findings remain in Access Manager, Allianz review and Takeda embed routes

The lifecycle check exposed and corrected an API/worker preparation-version import problem and publication paths that attempted to update a deleted draft. The final lifecycle run used the real API after refreshing the local development server. All 750 pre-existing baseline schema constraints remain present.

Question discovery produced seven candidates from a declared two-unit sample after a retry resumed its completed window. A separate two-unit terminology sample produced twelve unreviewed candidates. Some candidates lose qualifiers or confuse a category with a synonym; they must not be activated automatically. The review UI retains their source quotations.

A synthetic 120-turn transcript retained needs after turn 100, including a context-dependent follow-up. The supplied incorrect spoken answer did not become a reference answer, and a synthetic email was redacted before job storage. The initial classifier produced reviewable account/action mistakes. This is a discovery diagnostic, not a claim of complete extraction or semantic grouping.

Native service change and observed limits

Tooling remains on RAGFlow 0.26.4, now with the tested Infinity 0.7.4 engine and matching client pair. A checked overlay fixes the duplicate-folder connection-close defect and adds an authorized full graph export. The matching Tooling chart templates and compatibility notes are present. The engine/client restoration completed with one ready replica for each service. Existing datasets were retained. The six-file graph-resume and resolution overlay passed its native contract fixture and completed the corpus with 917 successful documents and zero failures.

One graph-candidate indexing attempt was interrupted by a local database deadlock while the migration ran. Its completed units were retained and verified again on retry. The corpus graph uses native per-document extraction over the synthetic unit containers. Native progress 0.6 is a stage marker, not overall corpus completion; graph compilation is substantially slower than indexing. The worker additionally checks final per-document completion totals, because this RAGFlow version can mark a task complete after individual failures. The corpus task exceeded the worker's one-hour observation window. Retry resumed observation without acquiring, preparing or indexing the corpus again.

The full corpus finished per-unit extraction and reached global graph merging. A partial-graph diagnostic exposed 64–82 candidate units for several questions, exceeding the original answer window. Graph links now form a candidate pool; large pools receive scoped native ranking, with candidate/selected counts shown in the answer. All selected evidence remains intact during synthesis.

At 18:52 UTC, Tooling's Infinity container was OOM-killed at its 4 GiB limit. It had 45 recorded restarts and lost its ready service endpoint; the graph candidate correctly failed without publication. The host had about 15 GiB available memory. The image and existing PVC were preserved while the deployment limits changed to 8 GiB / 2 CPU, with 2 GiB / 500m requests. Helm rendering and server dry-run checks passed, and the operational rollback snapshot was saved privately on Tooling. Recovery initially scanned 250,457 WAL files, with advancing read counters. The Infinity chart now includes a startup probe allowing up to 60 minutes before normal readiness/liveness checks. The rendered chart and server dry run passed; host security scanning remains enabled.

The next startup failed with exit 139 during WAL replay, without an OOM event. Infinity was then quiesced and its active data archived with a recorded SHA-256 digest. The original PVC and an older quarantine directory were preserved. An isolated physical upgrade copy also failed on Infinity 0.7.4, ruling out an image-only upgrade of the old files. Binary WAL inspection found 207 transactions after the latest checkpoint: graph-candidate operations, temporary-fixture operations, and six metadata operations for the fixture's two documents. Recovery experiments run on copies; the original archive remains the rollback source. The published baseline has no transactions in this recovery window, but still requires readback and query verification after service restoration.

Recovery on the original engine succeeded after excluding the completed temporary fixture's 54 table operations and six metadata operations from an isolated replay copy. All 147 graph-candidate transactions were retained. The fixture was positively identified by its synthetic Northbank payload; its dataset and documents were already absent from RAGFlow. The original PVC and immutable archive were not edited during these trials.

Both 917-unit inventories matched their saved identifiers and exact content hashes. A subsequent logical migration to a fresh Infinity 0.7.4 store compared every field of all 6,645 live records across five tables, including both pre-existing datasets, embedding vectors and 1,870 metadata records. All 194 indexes were recreated. A synthetic JSON write was acknowledged at commit 510, beyond checkpoint 503, before an abrupt process kill. Its typed metadata survived replay, and all five table digests still matched afterward. The coordinated restoration preserved the existing PVC and service address. All five table digests and 194 indexes matched again in the live deployment. The first native API conformance run then passed exact evidence, typed metadata, scoped retrieval, full graph export, and temporary-dataset cleanup.

The matching client dependency profile in deploy/ragflow/knowledge-agent-compat/ uses Infinity SDK 0.7.4 and Thrift 0.24.0. An isolated staging check exposed both the original SDK's incompatible protocol version and its older Thrift runtime before changing the running RAGFlow application.

The recovered combined graph covered 110 of 917 native documents. Inspection confirmed that its writer deleted all subgraph rows while replacing that snapshot, including extraction checkpoints for documents not yet merged. Read-only inspection of the immutable transaction archive recovered 917 per-document graphs, with valid record checksums and exact source IDs. Those graphs were inserted as separate document_subgraph checkpoints; their contents and all 917 original evidence rows were verified afterward. The compatibility patch preserves these checkpoints across combined-graph writes, counts resumed chunks, recognizes already-merged documents, and clears checkpoints on an explicit graph wipe. Merges save groups of up to 32 documents, reducing repeated full-graph writes. A second scan explicitly selected the earliest transaction for each document. It found 31 later derived graphs in the first selection; all 31 belong to the 110 documents already present in the restored combined graph and were skipped during the resumed merge. The original archive was unchanged. Replacement of those cached records with the earliest extractions was verified across all 917 checkpoints after recovery. At that checkpoint, the corpus still required native completion, source-coverage verification and answer qualification. Those checks subsequently completed.

The initial graph profile was v4-batch32-sdk0.7.4. At 20:43 UTC, a native merge timed out after 180 seconds during record insertion. The task was cancelled without wiping evidence or checkpoints. The replacement v5-journal-batch32-sdk0.7.4 profile records a durable write journal, repairs unfinished writes before source-ID checks, replaces old entity/relation records, and saves the graph snapshot after derived records. Cancellation drains in-flight writes before releasing the dataset lock. The default batch timeout is 900 seconds. Seven tests against the pinned source pass, including interrupted insertion, lost completion acknowledgement, duplicate prevention and repeated cancellation. The deployed replacement passed the native fixture in 37 seconds, including distinct initial/resumed tasks and unchanged original evidence. The later corpus repair and answer qualification completed as recorded below. The chart's optional client override defaults off and is explicitly enabled for Tooling's 0.7.4 engine. The packaged RAGFlow chart retains its declared Bitnami MySQL 11.1.20 and MinIO 14.10.5 dependencies; both SDK-enabled/disabled renders and Helm lint passed.

During rollout, MySQL's one-second probes timed out under startup load and triggered a clean shutdown at 20:26 UTC. An all-database logical backup was saved privately before increasing the Tooling CPU allowance from 500m to one CPU and probe timeouts to five seconds. Liveness now requires six failures, and startup has a ten-minute allowance. Recreate deployment strategy prevents simultaneous writers to its single PVC. The MySQL 8.0.39 image, memory limit, and data volume were retained. MySQL, RAGFlow, and Infinity each reached one ready replica, and the expanded native conformance test passed afterward.

The corpus repair uses the earliest verified per-document extraction and the native graph_merge, PageRank and set_graph functions. It prepares one complete recovery write rather than replaying the failed sequence of partial writes. Preparation produced 3,675 nodes and 5,891 edges over all 917 documents. The candidate's 7,892 existing records were archived, copied outside the pod and hash-verified before mutation. This is a recovery procedure, not a measured fresh-corpus build benchmark. Post-write verification matched every entity and relationship attribute, all 917 extraction checkpoints, the planned graph hash, and full-field hashes of all 917 original evidence rows. No pending journal remained. The controller copied and hash-verified its archive outside the pod. Native entity resolution subsequently completed on this recovered graph. The native writer expands the 6,012,364-byte combined graph into 623,147,874 bytes of derived document-subgraph JSON before entity/relation records. Repeated relationship attributes account for this expansion. During insertion, Infinity used its two-CPU limit and continued disk writes while the client awaited index completion. This workload does not establish interactive graph build latency or a supported large-corpus limit. At 21:34 UTC, Kubernetes resized the existing Infinity pod's CPU limit from two to four for qualification. The pod UID, container ID and zero restart count were unchanged; the live cgroup showed the four-CPU allowance. The configured two-CPU limit was restored at 22:25 UTC after native qualification. The cgroup returned 200000 100000; the pod and container identities were unchanged, with zero restarts.

The first recovery write reached a native Thrift recursion limit in a 100-name entity deletion filter. Direct serializer checks confirmed that 32 names also fail while 16 serialize. A smaller-filter trial then exposed entity names being interpreted as full-text query operators. Both failed processes retained the write journal without an OOM event. The v7-journal-literal-cleanup-sdk0.7.4 profile instead scans stored identities, matches literal names, and deletes record IDs in groups of 128. Tests cover pagination, duplicate records, operator-like names, literal separators, and preservation of unchanged graph records, original units and extraction checkpoints. The deployed profile passed native conformance in 33 seconds. Native ID-filter serialization also passed at 128 and 256 records. Full-corpus journal replay completed with zero OOM events.

A source audit also found that native entity resolution could suppress a failed provider batch and still report its candidates as resolved. The prepared v8-complete-resolution-sdk0.7.4 profile adds a sixth overlay, rag/graphrag/entity_resolution.py: provider failures and missing results fail the phase, and every pair requires one explicit yes/no judgment. Partial or duplicate judgments are rejected. Outstanding batches are cancelled and drained before retry. Graph locks now use unique execution tokens and renew every 30 seconds through long writes and cancellation cleanup; their previous 20-minute expiry was shorter than this observed write. Failed renewal cancels the owner and fails the phase. Eleven source tests pass, including a failed batch alongside two in-flight batches, a valid no-merge result, renewal during cancellation, and lost lock ownership. Both SDK-enabled/disabled chart renders, Helm lint, source compilation and server dry runs passed. Deployment generation 33 reached one ready replica after the recovery archive was verified. Native API conformance passed in 34 seconds. A separate live Redis check held a lock past its original expiry, then confirmed that lost ownership failed the operation and preserved the replacement owner's lock. Its first run had a test-only bytes/string comparison corrected for the configured decoded Redis client.

Native task dcc15c68c42b11f19b1705702f2de37b started at 21:53 UTC. It reused the recovered graph and judged all 13,287 entity candidate pairs. It selected 511 pairs for merging, removed 421 duplicate nodes and 2,521 edges, and began writing the resolved graph at 22:09 UTC. The framework observer resumed through its normal Retry API. The graph committed at 22:17 UTC, and the native task reported ok=917 failed=0 total_docs=917 total_chunks=917. Final verification found 3,254 nodes, 5,418 edges, all 917 source documents, no references outside the original inventory, and no pending write journal. Every original evidence row's full-field hash remained unchanged.

The final integrity probe also compared both pre-existing datasets and the published baseline against the recovery receipts; all hashes matched. Its first metadata-table check found twelve added rows and no changed or missing pre-existing rows. Each addition matched the exact source identity, unit hash, typed fields and 42/64-credit payload of one of six completed synthetic native fixtures. Their datasets, documents and dataset tables were already absent. The twelve rows were archived outside the pod, hash-verified, and removed by exact document/dataset identity. All 1,870 pre-existing metadata rows then matched the original table hash. Native dataset deletion can leave this metadata residue; automatic retention cleanup remains unfinished.

The first release still needs wider CDC/internal-policy domain qualification, semantic demand grouping, richer ontology/qualifier quality measures, external source ACL propagation, large-volume memory/query pagination, and automatic native/original-asset retention cleanup. Native embedding/graph usage remains in RAGFlow's provider accounting; framework answer/preparation calls use the shared usage recorder. Do not equate the tested sample limits with a scale or cost guarantee.