feat: online verification, node removals, and knowledge browser
CI / quality (push) Canceled after 0s

Adds claim-bound online evidence records and citation verification scripts,
node removal transport/adapter, retrieval benchmark and owner-review tooling,
GraphCanvas/SourceDetail knowledge browser UI, and the ingest handoff helper.
Bumps the agents/gewu pack to the online-verification branch.
This commit is contained in:
vasily committed 2026-10-16 20:02:29 +08:00
1 parent a3156f4e08
commit 78033bb830
83 files changed
+13476 -1051

No files matched your search

+65 -8
View File
@@ -257,9 +257,7 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
{"proposal_json": prepared_payload["proposal_json"][:-1]},
)
assert not truncated_evaluation.is_error, truncated_evaluation.content
truncated_evaluation_payload = json.loads(
_text_payload(truncated_evaluation)
)
truncated_evaluation_payload = json.loads(_text_payload(truncated_evaluation))
assert truncated_evaluation_payload["proposal_id"] == (
prepared_proposal.proposal_id
)
@@ -277,9 +275,7 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
"proposal_evaluate", {"proposal_json": '{"schema_version":'}
)
assert not malformed_evaluation.is_error, malformed_evaluation.content
malformed_evaluation_payload = json.loads(
_text_payload(malformed_evaluation)
)
malformed_evaluation_payload = json.loads(_text_payload(malformed_evaluation))
assert malformed_evaluation_payload["status"] == "invalid"
assert malformed_evaluation_payload["findings"][0]["code"] == (
"PROPOSAL_JSON_INVALID"
@@ -298,8 +294,7 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
invalid_payload = json.loads(_text_payload(invalid_result))
assert invalid_payload["status"] == "invalid"
assert any(
issue["path"].endswith("locator")
and "PDF locators" in issue["message"]
issue["path"].endswith("locator") and "PDF locators" in issue["message"]
for issue in invalid_payload["issues"]
)
invalid_review = await mcp.call_tool(
@@ -313,6 +308,41 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
"extraction_id",
"relevance_rationale",
}
project_only_token = identities.provision(
credential_id="project-only-source-agent-key",
principal_id="agent-project-only",
roles=("agent",),
project_ids=("dome-performance",),
)
project_only_draft = json.loads(json.dumps(draft))
project_only_draft["proposal_id"] = "proposal-project-only-source"
project_only_draft["scope"]["include_shared"] = False
project_only_draft["proposer_id"] = "agent-project-only"
project_only_draft["operations"] = [project_only_draft["operations"][0]]
async with httpx2.AsyncClient(
transport=httpx2.ASGITransport(app=app),
base_url="http://localhost",
headers={"Authorization": f"Bearer {project_only_token}"},
) as project_only_http:
async with Client(
streamable_http_client(
"http://localhost/mcp", http_client=project_only_http
)
) as project_only_mcp:
project_source = await project_only_mcp.call_tool(
"proposal_prepare",
{"proposal_json": json.dumps(project_only_draft)},
)
assert not project_source.is_error, project_source.content
assert json.loads(_text_payload(project_source))["status"] == "prepared"
shared_draft = json.loads(json.dumps(project_only_draft))
shared_draft["proposal_id"] = "proposal-project-only-shared-source"
shared_draft["operations"][0]["source"]["ingested_for"] = ["shared"]
shared_source = await project_only_mcp.call_tool(
"proposal_prepare",
{"proposal_json": json.dumps(shared_draft)},
)
assert shared_source.is_error
denied_lens = await mcp.call_tool(
"get_project_context", {"project_id": "interactive-video"}
)
@@ -387,6 +417,11 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
}
],
}
invalid_run = await mcp.call_tool("run_create", {"request_json": "{}"})
assert not invalid_run.is_error
invalid_run_result = json.loads(_text_payload(invalid_run))
assert invalid_run_result["status"] == "invalid"
assert "run_id" in {issue["path"] for issue in invalid_run_result["issues"]}
created_run = await mcp.call_tool(
"run_create", {"request_json": json.dumps(run_request)}
)
@@ -403,6 +438,23 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
)
assert not saved_run.is_error
assert json.loads(_text_payload(saved_run))["revision"] == 1
invalid_checkpoint = await mcp.call_tool(
"run_checkpoint",
{
"request_json": json.dumps(
{
**checkpoint,
"expected_revision": 1,
"coverage": {"skipped": ["pending source"]},
}
)
},
)
assert not invalid_checkpoint.is_error
invalid_result = json.loads(_text_payload(invalid_checkpoint))
assert invalid_result["status"] == "invalid"
assert invalid_result["issues"][0]["path"] == "coverage.skipped[0]"
assert "pending source" not in _text_payload(invalid_checkpoint)
read_run = await mcp.call_tool("run_status", {"run_id": "mcp-run-pilot"})
assert not read_run.is_error
assert json.loads(_text_payload(read_run))["revision"] == 1
@@ -647,6 +699,7 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
)
assert not html_block_result.is_error
html_block = json.loads(_text_payload(html_block_result))
assert html_block["normalization_profile"] == "unicode-nfc-lf-v1"
assert "Exact HTML statement." in html_block["normalized_text"]
assert "original_text" not in html_block
assert "normalization_map" not in html_block
@@ -663,6 +716,9 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
)
assert not mapped_html_result.is_error
mapped_html = json.loads(_text_payload(mapped_html_result))
assert (
mapped_html["normalization_profile"] == html_block["normalization_profile"]
)
assert mapped_html["original_text"]
assert len(mapped_html["normalization_map"]) == len(
mapped_html["normalized_text"]
@@ -705,6 +761,7 @@ def test_mcp_source_to_citation_vertical_slice(tmp_path: Path) -> None:
)
assert not pdf_block_result.is_error
pdf_block = json.loads(_text_payload(pdf_block_result))
assert pdf_block["normalization_profile"] == "unicode-nfc-lf-v1"
assert pdf_block["page"] == 1
assert "Archived PDF evidence." in pdf_block["normalized_text"]
assert "normalization_map" not in pdf_block