Files

1 line
35 KiB
JSON

{"repo": "aubakirovarman/agenthub", "files": {"src/product_cli/tests/readiness_support.rs": {"64a6756d7b28ac6450619b019a5ea2be423235f4": {"t": 1785746257.9588857, "n": 7844, "h": "5bdee6adffb0ff31", "c": "use anyhow::Result;\n\nuse super::support::with_env_vars;\n\npub(super) struct ReadinessFixture {\n pub root: tempfile::TempDir,\n pub plan: std::path::PathBuf,\n pub after: std::path::PathBuf,\n pub roadmap: std::path::PathBuf,\n pub evidence: std::path::PathBuf,\n pub history: std::path::PathBuf,\n pub kimi: std::path::PathBuf,\n}\n\nimpl ReadinessFixture {\n pub(super) fn ready() -> Result<Self> {\n Self::new(false)\n }\n\n pub(super) fn blocked_kimi() -> Result<Self> {\n Self::new(true)\n }\n\n fn new(blocked: bool) -> Result<Self> {\n let root = tempfile::tempdir()?;\n let plan = root.path().join(\"agenthub_v04_api_native.md\");\n let after = root.path().join(\"agenthub_after_10_roadmap.md\");\n let roadmap = root.path().join(\"roadmap-after-1.0.ru.md\");\n let evidence = root.path().join(\"rc-evidence.jsonl\");\n let history = root.path().join(\"history\");\n let kimi = root.path().join(\"kimi-auth-report.json\");\n std::fs::create_dir_all(history.join(\"runs/suite-1\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-2\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-3\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-deepseek\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-kimi\"))?;\n for path in [&plan, &after, &roadmap] {\n std::fs::write(path, \"fixture\\n\")?;\n }\n for path in [\n history.join(\"runs/suite-1/dogfood-report.json\"),\n history.join(\"runs/suite-2/dogfood-report.json\"),\n history.join(\"runs/suite-3/dogfood-report.json\"),\n history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n ] {\n std::fs::write(path, \"{}\\n\")?;\n }\n std::fs::write(history.join(\"index.jsonl\"), history_index(&history))?;\n std::fs::write(&evidence, evidence_jsonl(blocked))?;\n let kimi_report = if blocked {\n r#\"{\"provider\":\"kimi\",\"status\":\"blocked\",\"auth_key_sha256_12\":\"f117c7b5fb4e\",\"auth_key_source\":\"file:/tmp/.kimi\",\"credential_warning\":\"Kimi Code CLI OAuth credentials are not Moonshot OpenAI-compatible API keys; create a plain Moonshot API key instead\",\"next_action\":\"replace or rotate the Kimi/Moonshot API key with a plain Moonshot OpenAI-compatible API key\"}\"#\n } else {\n r#\"{\"provider\":\"kimi\",\"status\":\"passed\",\"auth_key_sha256_12\":\"abc123\"}\"#\n };\n std::fs::write(&kimi, kimi_report)?;\n Ok(Self {\n root,\n plan,\n after,\n roadmap,\n evidence,\n history,\n kimi,\n })\n }\n}\n\npub(super) fn with_readiness_fixture(\n fixture: &ReadinessFixture,\n run: impl FnOnce() -> Result<()>,\n) -> Result<()> {\n with_env_vars(\n &[\n (\n \"AGENTHUB_API_AUDIT_EVIDENCE\",\n Some(fixture.evidence.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_HISTORY_DIR\",\n Some(fixture.history.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_KIMI_REPORT\",\n Some(fixture.kimi.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_V04_PLAN\",\n Some(fixture.plan.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_AFTER_PLAN\",\n Some(fixture.after.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_ROADMAP_DOC\",\n Some(fixture.roadmap.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_PROVIDER_STATUS\",\n Some(\n \"deepseek\\tok\\tdefault\\thttps://api.deepseek.com/v1\\nkimi\\tok\\t-\\thttps://api.moonshot.ai/v1\"\n .to_string(),\n ),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_REAL_SESSIONS\",\n Some(\"3\".to_string()),\n ),\n (\"AGENTHUB_API_AUDIT_MIN_OPS_FLOWS\", Some(\"1\".to_string())),\n (\n \"AGENTHUB_API_AUDIT_MIN_PROJECT_EDIT_FLOWS\",\n Some(\"1\".to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_COST_RECEIPTS\",\n Some(\"3\".to_string()),\n ),\n ],\n run,\n )\n}\n\nfn history_index(history: &std::path::Path) -> String {\n [\n serde_json::json!({\n \"run_id\": \"suite-1\",\n \"archived_at\": \"2026-05-14T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-1/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-2\",\n \"archived_at\": \"2026-05-15T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-2/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-3\",\n \"archived_at\": \"2026-05-16T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-3/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-deepseek\",\n \"archived_at\": \"2026-05-16T01:00:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n \"provider\": \"deepseek\",\n \"provider_status\": \"passed\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-kimi\",\n \"archived_at\": \"2026-05-16T01:30:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n \"provider\": \"kimi\",\n \"provider_status\": \"passed\",\n }),\n ]\n .into_iter()\n .map(|entry| format!(\"{entry}\\n\"))\n .collect()\n}\n\nfn evidence_jsonl(blocked: bool) -> String {\n let mut evidence = String::from(\n \"{\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"chat-1\\\",\\\"mode\\\":\\\"chat\\\",\\\"flow\\\":\\\"chat\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"ops-1\\\",\\\"mode\\\":\\\"ops\\\",\\\"flow\\\":\\\"ops\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"project-1\\\",\\\"mode\\\":\\\"project\\\",\\\"flow\\\":\\\"project_edit\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"deepseek\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"kimi\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"chat_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"resume\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"rewind\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"stats\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"cost_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"approval_ux\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"long_session_latency\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"shell_ux_aliases\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"kimi_unblock_rehearsal\\\",\\\"status\\\":\\\"passed\\\"}\\n\",\n );\n if blocked {\n evidence.push_str(\n \"{\\\"kind\\\":\\\"blocker\\\",\\\"id\\\":\\\"kimi-auth\\\",\\\"severity\\\":\\\"critical\\\",\\\"status\\\":\\\"open\\\"}\\n\",\n );\n }\n evidence\n}\n"}, "52114ca146cd2330fa684aa0d796d5579ca31c1d": {"t": 1785761183.6514232, "n": 7844, "h": "5bdee6adffb0ff31", "c": "use anyhow::Result;\n\nuse super::support::with_env_vars;\n\npub(super) struct ReadinessFixture {\n pub root: tempfile::TempDir,\n pub plan: std::path::PathBuf,\n pub after: std::path::PathBuf,\n pub roadmap: std::path::PathBuf,\n pub evidence: std::path::PathBuf,\n pub history: std::path::PathBuf,\n pub kimi: std::path::PathBuf,\n}\n\nimpl ReadinessFixture {\n pub(super) fn ready() -> Result<Self> {\n Self::new(false)\n }\n\n pub(super) fn blocked_kimi() -> Result<Self> {\n Self::new(true)\n }\n\n fn new(blocked: bool) -> Result<Self> {\n let root = tempfile::tempdir()?;\n let plan = root.path().join(\"agenthub_v04_api_native.md\");\n let after = root.path().join(\"agenthub_after_10_roadmap.md\");\n let roadmap = root.path().join(\"roadmap-after-1.0.ru.md\");\n let evidence = root.path().join(\"rc-evidence.jsonl\");\n let history = root.path().join(\"history\");\n let kimi = root.path().join(\"kimi-auth-report.json\");\n std::fs::create_dir_all(history.join(\"runs/suite-1\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-2\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-3\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-deepseek\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-kimi\"))?;\n for path in [&plan, &after, &roadmap] {\n std::fs::write(path, \"fixture\\n\")?;\n }\n for path in [\n history.join(\"runs/suite-1/dogfood-report.json\"),\n history.join(\"runs/suite-2/dogfood-report.json\"),\n history.join(\"runs/suite-3/dogfood-report.json\"),\n history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n ] {\n std::fs::write(path, \"{}\\n\")?;\n }\n std::fs::write(history.join(\"index.jsonl\"), history_index(&history))?;\n std::fs::write(&evidence, evidence_jsonl(blocked))?;\n let kimi_report = if blocked {\n r#\"{\"provider\":\"kimi\",\"status\":\"blocked\",\"auth_key_sha256_12\":\"f117c7b5fb4e\",\"auth_key_source\":\"file:/tmp/.kimi\",\"credential_warning\":\"Kimi Code CLI OAuth credentials are not Moonshot OpenAI-compatible API keys; create a plain Moonshot API key instead\",\"next_action\":\"replace or rotate the Kimi/Moonshot API key with a plain Moonshot OpenAI-compatible API key\"}\"#\n } else {\n r#\"{\"provider\":\"kimi\",\"status\":\"passed\",\"auth_key_sha256_12\":\"abc123\"}\"#\n };\n std::fs::write(&kimi, kimi_report)?;\n Ok(Self {\n root,\n plan,\n after,\n roadmap,\n evidence,\n history,\n kimi,\n })\n }\n}\n\npub(super) fn with_readiness_fixture(\n fixture: &ReadinessFixture,\n run: impl FnOnce() -> Result<()>,\n) -> Result<()> {\n with_env_vars(\n &[\n (\n \"AGENTHUB_API_AUDIT_EVIDENCE\",\n Some(fixture.evidence.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_HISTORY_DIR\",\n Some(fixture.history.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_KIMI_REPORT\",\n Some(fixture.kimi.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_V04_PLAN\",\n Some(fixture.plan.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_AFTER_PLAN\",\n Some(fixture.after.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_ROADMAP_DOC\",\n Some(fixture.roadmap.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_PROVIDER_STATUS\",\n Some(\n \"deepseek\\tok\\tdefault\\thttps://api.deepseek.com/v1\\nkimi\\tok\\t-\\thttps://api.moonshot.ai/v1\"\n .to_string(),\n ),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_REAL_SESSIONS\",\n Some(\"3\".to_string()),\n ),\n (\"AGENTHUB_API_AUDIT_MIN_OPS_FLOWS\", Some(\"1\".to_string())),\n (\n \"AGENTHUB_API_AUDIT_MIN_PROJECT_EDIT_FLOWS\",\n Some(\"1\".to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_COST_RECEIPTS\",\n Some(\"3\".to_string()),\n ),\n ],\n run,\n )\n}\n\nfn history_index(history: &std::path::Path) -> String {\n [\n serde_json::json!({\n \"run_id\": \"suite-1\",\n \"archived_at\": \"2026-05-14T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-1/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-2\",\n \"archived_at\": \"2026-05-15T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-2/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-3\",\n \"archived_at\": \"2026-05-16T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-3/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-deepseek\",\n \"archived_at\": \"2026-05-16T01:00:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n \"provider\": \"deepseek\",\n \"provider_status\": \"passed\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-kimi\",\n \"archived_at\": \"2026-05-16T01:30:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n \"provider\": \"kimi\",\n \"provider_status\": \"passed\",\n }),\n ]\n .into_iter()\n .map(|entry| format!(\"{entry}\\n\"))\n .collect()\n}\n\nfn evidence_jsonl(blocked: bool) -> String {\n let mut evidence = String::from(\n \"{\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"chat-1\\\",\\\"mode\\\":\\\"chat\\\",\\\"flow\\\":\\\"chat\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"ops-1\\\",\\\"mode\\\":\\\"ops\\\",\\\"flow\\\":\\\"ops\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"project-1\\\",\\\"mode\\\":\\\"project\\\",\\\"flow\\\":\\\"project_edit\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"deepseek\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"kimi\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"chat_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"resume\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"rewind\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"stats\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"cost_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"approval_ux\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"long_session_latency\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"shell_ux_aliases\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"kimi_unblock_rehearsal\\\",\\\"status\\\":\\\"passed\\\"}\\n\",\n );\n if blocked {\n evidence.push_str(\n \"{\\\"kind\\\":\\\"blocker\\\",\\\"id\\\":\\\"kimi-auth\\\",\\\"severity\\\":\\\"critical\\\",\\\"status\\\":\\\"open\\\"}\\n\",\n );\n }\n evidence\n}\n"}, "f405a258c7aea5c61b8e3d91db4960ddbdf2c309": {"t": 1785761184.9218998, "n": 7755, "h": "7d310238a8609f51", "c": "use anyhow::Result;\n\nuse super::support::with_env_vars;\n\npub(super) struct ReadinessFixture {\n pub root: tempfile::TempDir,\n pub plan: std::path::PathBuf,\n pub after: std::path::PathBuf,\n pub roadmap: std::path::PathBuf,\n pub evidence: std::path::PathBuf,\n pub history: std::path::PathBuf,\n pub kimi: std::path::PathBuf,\n}\n\nimpl ReadinessFixture {\n pub(super) fn ready() -> Result<Self> {\n Self::new(false)\n }\n\n pub(super) fn blocked_kimi() -> Result<Self> {\n Self::new(true)\n }\n\n fn new(blocked: bool) -> Result<Self> {\n let root = tempfile::tempdir()?;\n let plan = root.path().join(\"agenthub_v04_api_native.md\");\n let after = root.path().join(\"agenthub_after_10_roadmap.md\");\n let roadmap = root.path().join(\"roadmap-after-1.0.ru.md\");\n let evidence = root.path().join(\"rc-evidence.jsonl\");\n let history = root.path().join(\"history\");\n let kimi = root.path().join(\"kimi-auth-report.json\");\n std::fs::create_dir_all(history.join(\"runs/suite-1\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-2\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-3\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-deepseek\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-kimi\"))?;\n for path in [&plan, &after, &roadmap] {\n std::fs::write(path, \"fixture\\n\")?;\n }\n for path in [\n history.join(\"runs/suite-1/dogfood-report.json\"),\n history.join(\"runs/suite-2/dogfood-report.json\"),\n history.join(\"runs/suite-3/dogfood-report.json\"),\n history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n ] {\n std::fs::write(path, \"{}\\n\")?;\n }\n std::fs::write(history.join(\"index.jsonl\"), history_index(&history))?;\n std::fs::write(&evidence, evidence_jsonl(blocked))?;\n let kimi_report = if blocked {\n r#\"{\"provider\":\"kimi\",\"status\":\"blocked\",\"auth_key_sha256_12\":\"f117c7b5fb4e\",\"auth_key_source\":\"file:/tmp/.kimi\",\"credential_warning\":\"Kimi Code CLI OAuth credentials are not Moonshot OpenAI-compatible API keys; create a plain Moonshot API key instead\",\"next_action\":\"replace or rotate the Kimi/Moonshot API key with a plain Moonshot OpenAI-compatible API key\"}\"#\n } else {\n r#\"{\"provider\":\"kimi\",\"status\":\"passed\",\"auth_key_sha256_12\":\"abc123\"}\"#\n };\n std::fs::write(&kimi, kimi_report)?;\n Ok(Self {\n root,\n plan,\n after,\n roadmap,\n evidence,\n history,\n kimi,\n })\n }\n}\n\npub(super) fn with_readiness_fixture(\n fixture: &ReadinessFixture,\n run: impl FnOnce() -> Result<()>,\n) -> Result<()> {\n with_env_vars(\n &[\n (\n \"AGENTHUB_API_AUDIT_EVIDENCE\",\n Some(fixture.evidence.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_HISTORY_DIR\",\n Some(fixture.history.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_KIMI_REPORT\",\n Some(fixture.kimi.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_V04_PLAN\",\n Some(fixture.plan.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_AFTER_PLAN\",\n Some(fixture.after.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_ROADMAP_DOC\",\n Some(fixture.roadmap.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_PROVIDER_STATUS\",\n Some(\n \"deepseek\\tok\\tdefault\\thttps://api.deepseek.com/v1\\nkimi\\tok\\t-\\thttps://api.moonshot.ai/v1\"\n .to_string(),\n ),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_REAL_SESSIONS\",\n Some(\"3\".to_string()),\n ),\n (\"AGENTHUB_API_AUDIT_MIN_OPS_FLOWS\", Some(\"1\".to_string())),\n (\n \"AGENTHUB_API_AUDIT_MIN_PROJECT_EDIT_FLOWS\",\n Some(\"1\".to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_COST_RECEIPTS\",\n Some(\"3\".to_string()),\n ),\n ],\n run,\n )\n}\n\nfn history_index(history: &std::path::Path) -> String {\n [\n serde_json::json!({\n \"run_id\": \"suite-1\",\n \"archived_at\": \"2026-05-14T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-1/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-2\",\n \"archived_at\": \"2026-05-15T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-2/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-3\",\n \"archived_at\": \"2026-05-16T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-3/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-deepseek\",\n \"archived_at\": \"2026-05-16T01:00:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n \"provider\": \"deepseek\",\n \"provider_status\": \"passed\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-kimi\",\n \"archived_at\": \"2026-05-16T01:30:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n \"provider\": \"kimi\",\n \"provider_status\": \"passed\",\n }),\n ]\n .into_iter()\n .map(|entry| format!(\"{entry}\\n\"))\n .collect()\n}\n\nfn evidence_jsonl(blocked: bool) -> String {\n let mut evidence = String::from(\n \"{\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"chat-1\\\",\\\"mode\\\":\\\"chat\\\",\\\"flow\\\":\\\"chat\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"ops-1\\\",\\\"mode\\\":\\\"ops\\\",\\\"flow\\\":\\\"ops\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"project-1\\\",\\\"mode\\\":\\\"project\\\",\\\"flow\\\":\\\"project_edit\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"deepseek\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"kimi\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"chat_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"resume\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"rewind\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"stats\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"cost_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"approval_ux\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"long_session_latency\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"shell_ux_aliases\\\",\\\"status\\\":\\\"passed\\\"}\\n\",\n );\n if blocked {\n evidence.push_str(\n \"{\\\"kind\\\":\\\"blocker\\\",\\\"id\\\":\\\"kimi-auth\\\",\\\"severity\\\":\\\"critical\\\",\\\"status\\\":\\\"open\\\"}\\n\",\n );\n }\n evidence\n}\n"}, "adb03b4d232ed96bf23540b8b37bd54aa6ddc461": {"t": 1785761186.134087, "n": 7672, "h": "d8ad73cdc404b7c7", "c": "use anyhow::Result;\n\nuse super::support::with_env_vars;\n\npub(super) struct ReadinessFixture {\n pub root: tempfile::TempDir,\n pub plan: std::path::PathBuf,\n pub after: std::path::PathBuf,\n pub roadmap: std::path::PathBuf,\n pub evidence: std::path::PathBuf,\n pub history: std::path::PathBuf,\n pub kimi: std::path::PathBuf,\n}\n\nimpl ReadinessFixture {\n pub(super) fn ready() -> Result<Self> {\n Self::new(false)\n }\n\n pub(super) fn blocked_kimi() -> Result<Self> {\n Self::new(true)\n }\n\n fn new(blocked: bool) -> Result<Self> {\n let root = tempfile::tempdir()?;\n let plan = root.path().join(\"agenthub_v04_api_native.md\");\n let after = root.path().join(\"agenthub_after_10_roadmap.md\");\n let roadmap = root.path().join(\"roadmap-after-1.0.ru.md\");\n let evidence = root.path().join(\"rc-evidence.jsonl\");\n let history = root.path().join(\"history\");\n let kimi = root.path().join(\"kimi-auth-report.json\");\n std::fs::create_dir_all(history.join(\"runs/suite-1\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-2\"))?;\n std::fs::create_dir_all(history.join(\"runs/suite-3\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-deepseek\"))?;\n std::fs::create_dir_all(history.join(\"runs/provider-kimi\"))?;\n for path in [&plan, &after, &roadmap] {\n std::fs::write(path, \"fixture\\n\")?;\n }\n for path in [\n history.join(\"runs/suite-1/dogfood-report.json\"),\n history.join(\"runs/suite-2/dogfood-report.json\"),\n history.join(\"runs/suite-3/dogfood-report.json\"),\n history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n ] {\n std::fs::write(path, \"{}\\n\")?;\n }\n std::fs::write(history.join(\"index.jsonl\"), history_index(&history))?;\n std::fs::write(&evidence, evidence_jsonl(blocked))?;\n let kimi_report = if blocked {\n r#\"{\"provider\":\"kimi\",\"status\":\"blocked\",\"auth_key_sha256_12\":\"f117c7b5fb4e\",\"auth_key_source\":\"file:/tmp/.kimi\",\"credential_warning\":\"Kimi Code CLI OAuth credentials are not Moonshot OpenAI-compatible API keys; create a plain Moonshot API key instead\",\"next_action\":\"replace or rotate the Kimi/Moonshot API key with a plain Moonshot OpenAI-compatible API key\"}\"#\n } else {\n r#\"{\"provider\":\"kimi\",\"status\":\"passed\",\"auth_key_sha256_12\":\"abc123\"}\"#\n };\n std::fs::write(&kimi, kimi_report)?;\n Ok(Self {\n root,\n plan,\n after,\n roadmap,\n evidence,\n history,\n kimi,\n })\n }\n}\n\npub(super) fn with_readiness_fixture(\n fixture: &ReadinessFixture,\n run: impl FnOnce() -> Result<()>,\n) -> Result<()> {\n with_env_vars(\n &[\n (\n \"AGENTHUB_API_AUDIT_EVIDENCE\",\n Some(fixture.evidence.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_HISTORY_DIR\",\n Some(fixture.history.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_KIMI_REPORT\",\n Some(fixture.kimi.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_V04_PLAN\",\n Some(fixture.plan.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_AFTER_PLAN\",\n Some(fixture.after.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_ROADMAP_DOC\",\n Some(fixture.roadmap.display().to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_PROVIDER_STATUS\",\n Some(\n \"deepseek\\tok\\tdefault\\thttps://api.deepseek.com/v1\\nkimi\\tok\\t-\\thttps://api.moonshot.ai/v1\"\n .to_string(),\n ),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_REAL_SESSIONS\",\n Some(\"3\".to_string()),\n ),\n (\"AGENTHUB_API_AUDIT_MIN_OPS_FLOWS\", Some(\"1\".to_string())),\n (\n \"AGENTHUB_API_AUDIT_MIN_PROJECT_EDIT_FLOWS\",\n Some(\"1\".to_string()),\n ),\n (\n \"AGENTHUB_API_AUDIT_MIN_COST_RECEIPTS\",\n Some(\"3\".to_string()),\n ),\n ],\n run,\n )\n}\n\nfn history_index(history: &std::path::Path) -> String {\n [\n serde_json::json!({\n \"run_id\": \"suite-1\",\n \"archived_at\": \"2026-05-14T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-1/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-2\",\n \"archived_at\": \"2026-05-15T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-2/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"suite-3\",\n \"archived_at\": \"2026-05-16T00:00:00Z\",\n \"kind\": \"suite\",\n \"report\": history.join(\"runs/suite-3/dogfood-report.json\"),\n \"provider_status\": \"skipped\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-deepseek\",\n \"archived_at\": \"2026-05-16T01:00:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-deepseek/provider-dogfood-report.json\"),\n \"provider\": \"deepseek\",\n \"provider_status\": \"passed\",\n }),\n serde_json::json!({\n \"run_id\": \"provider-kimi\",\n \"archived_at\": \"2026-05-16T01:30:00Z\",\n \"kind\": \"provider\",\n \"report\": history.join(\"runs/provider-kimi/provider-dogfood-report.json\"),\n \"provider\": \"kimi\",\n \"provider_status\": \"passed\",\n }),\n ]\n .into_iter()\n .map(|entry| format!(\"{entry}\\n\"))\n .collect()\n}\n\nfn evidence_jsonl(blocked: bool) -> String {\n let mut evidence = String::from(\n \"{\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"chat-1\\\",\\\"mode\\\":\\\"chat\\\",\\\"flow\\\":\\\"chat\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"ops-1\\\",\\\"mode\\\":\\\"ops\\\",\\\"flow\\\":\\\"ops\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"session\\\",\\\"session_id\\\":\\\"project-1\\\",\\\"mode\\\":\\\"project\\\",\\\"flow\\\":\\\"project_edit\\\",\\\"status\\\":\\\"passed\\\",\\\"cost_receipt\\\":true}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"deepseek\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"provider\\\",\\\"provider\\\":\\\"kimi\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"chat_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_no_bootstrap\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"resume\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"rewind\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"stats\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"cost_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"ops_receipts\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"approval_ux\\\",\\\"status\\\":\\\"passed\\\"}\\n\\\n {\\\"kind\\\":\\\"check\\\",\\\"id\\\":\\\"long_session_latency\\\",\\\"status\\\":\\\"passed\\\"}\\n\",\n );\n if blocked {\n evidence.push_str(\n \"{\\\"kind\\\":\\\"blocker\\\",\\\"id\\\":\\\"kimi-auth\\\",\\\"severity\\\":\\\"critical\\\",\\\"status\\\":\\\"open\\\"}\\n\",\n );\n }\n evidence\n}\n"}}}}