from __future__ import annotations import json from investibook.core.context_debug import build_context_debug_report def _category(report: dict, key: str) -> dict: for item in report["categories"]: if item["key"] == key: return item raise AssertionError(f"missing category {key}") def test_context_debug_report_splits_context_sources(tmp_path, monkeypatch): workspace_dir = tmp_path / "workspaces" / "ws-test" workspace_dir.mkdir(parents=True) prompt_dir = tmp_path / "prompts" prompt_dir.mkdir() instruction_file = prompt_dir / "legacy_instruction.md" instruction_file.write_text("static instruction text", encoding="utf-8") monkeypatch.setattr("investibook.config.AGENTKIT_PROMPTS_DIR", prompt_dir) opencode_dir = workspace_dir / ".opencode" opencode_dir.mkdir() (opencode_dir / "opencode.json").write_text( json.dumps({"instructions": [str(instruction_file)]}), encoding="utf-8", ) enabled = opencode_dir / "skills" / "builtin" / "demo" enabled.mkdir(parents=True) (enabled / "SKILL.md").write_text("skill instructions", encoding="utf-8") knowledge = enabled / "knowledge" knowledge.mkdir() (knowledge / "pitfalls.md").write_text("knowledge text", encoding="utf-8") all_skills = opencode_dir / ".all-skills" / "huge" all_skills.mkdir(parents=True) (all_skills / "SKILL.md").write_text("x" * 10000, encoding="utf-8") issue_dir = workspace_dir / "issues" / "O11Y-1" issue_dir.mkdir(parents=True) (issue_dir / "cluster_meta.json").write_text( json.dumps( { "cluster_id": "c1", "org_id": "o1", "tidb_version": "v8.5.0", "alert_time": "2026-05-09T07:00:00+00:00", } ), encoding="utf-8", ) evidence_dir = workspace_dir / "evidences" evidence_dir.mkdir() (evidence_dir / "evidence_summary_for_agent.txt").write_text( "important evidence summary", encoding="utf-8", ) messages = [ {"id": "u1", "role": "user", "content": "diagnose", "timestamp": "t1"}, { "id": "issue-info-O11Y-1", "role": "system", "content": "O11Y-1 cluster c1 alert metadata", "timestamp": "t1", "issueInfo": {"id": "O11Y-1", "cluster_id": "c1"}, }, { "id": "a1", "role": "assistant", "content": "answer", "timestamp": "t2", "parts": [ { "type": "tool", "tool": "skill", "state": { "title": "Loaded skill: demo", "input": {"name": "demo"}, "output": "skill instructions", }, }, { "type": "tool", "tool": "read", "state": { "input": {"filePath": str(knowledge / "pitfalls.md")}, "output": "knowledge text", }, }, { "type": "tool", "tool": "Read", "state": { "input": {"path": "evidences/evidence_summary_for_agent.txt"}, "output": "important evidence summary", }, }, { "type": "reasoning", "text": "visible thinking text", } ], }, ] usage_records = [ { "session_id": "evidence-postpass:a1", "channel": "evidence-postpass", "model_tier": "evidence-postpass", "context_used": 0, "context_size": 0, }, { "session_id": "ses-real", "channel": "web", "model_tier": "standard", "context_used": 30000, "context_size": 100000, "created_at": "2026-05-09T07:17:21+00:00", "reasoning_tokens": 1234, "cache_read_tokens": 29900, }, ] report = build_context_debug_report( "ws-test", workspace_dir=workspace_dir, usage_records=usage_records, messages=messages, ) assert report["actual_context"]["context_used"] == 30000 assert report["actual_context"]["context_size"] == 100000 assert report["actual_context"]["percent"] == 30.0 assert report["actual_context"]["reasoning_tokens"] == 1234 assert _category(report, "agent_runtime_instructions")["included_in_context_estimate"] is True assert _category(report, "skills")["included_in_context_estimate"] is True assert _category(report, "evidence")["included_in_context_estimate"] is True assert _category(report, "cluster_alert_meta")["included_in_context_estimate"] is True assert _category(report, "conversation")["included_in_context_estimate"] is True assert "assistant_thinking" not in {row["key"] for row in report["categories"]} evidence_files = _category(report, "evidence_available") assert evidence_files["scope"] == "available-file" assert evidence_files["scaled_context_tokens"] is None evidence_examples = _category(report, "evidence")["examples"] assert evidence_examples[0]["label"] == "Read evidence summary: evidence_summary_for_agent.txt" assert evidence_examples[0]["detail"] == "assistant message part #3" assert evidence_examples[0]["source_ref"] == "messages_v2/a1/parts/2" assert evidence_examples[0]["percent_of_used_context"] is not None assert evidence_examples[0]["scaled_context_tokens"] is not None skill_examples = _category(report, "skills")["examples"] skill_labels = {example["label"] for example in skill_examples} assert "Loaded skill: demo" in skill_labels assert "Read skill knowledge: demo/knowledge/pitfalls.md" in skill_labels assert not any(example["label"] == "SKILL.md" for example in skill_examples) meta_examples = _category(report, "cluster_alert_meta")["examples"] assert any(example["label"] == "Jira issue metadata: O11Y-1" for example in meta_examples) knowledge_files = _category(report, "skills_available") assert knowledge_files["scope"] == "available-file" assert knowledge_files["scaled_context_tokens"] is None assert any(example["label"] == "SKILL.md" for example in knowledge_files["examples"]) cluster_files = _category(report, "cluster_alert_meta_available") assert cluster_files["scope"] == "available-file" assert cluster_files["scaled_context_tokens"] is None category_keys = {item["key"] for item in report["categories"]} assert "skill_support_files_available" not in category_keys assert "chat_tool_evidence_payloads" not in category_keys assert not any( "huge" in example["path"] for item in report["categories"] for example in item["examples"] )