ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
This commit is contained in:
+93
@@ -0,0 +1,93 @@
|
||||
{
|
||||
"artifact_type": "agent_control_code_patch",
|
||||
"failure_cluster": [
|
||||
{
|
||||
"cluster_id": "charge_card:PAYMENT_DECLINED",
|
||||
"tool": "charge_card",
|
||||
"error_code": "PAYMENT_DECLINED",
|
||||
"source_case_ids": [
|
||||
"run-payment-001",
|
||||
"run-payment-002"
|
||||
],
|
||||
"cross_trajectory_support": 2,
|
||||
"total_redundant_calls": 5
|
||||
}
|
||||
],
|
||||
"source_trajectories": [
|
||||
{
|
||||
"id": "run-payment-001",
|
||||
"trajectory_sha256": "4a0b38498b006bf988279b0ff7984f04245db21ee0668986a49f3ca3f4969008",
|
||||
"evidence": "The same declined payment was submitted four times."
|
||||
},
|
||||
{
|
||||
"id": "run-payment-002",
|
||||
"trajectory_sha256": "6407eb8005fb39702005d553963405329607b34e67acbb18901c79060dbe1e59",
|
||||
"evidence": "A second task repeated the identical non-retryable call three times."
|
||||
}
|
||||
],
|
||||
"inferred_root_cause": "The deterministic control policy ignores retryable=false and does not open the circuit for permanent errors. The root cause belongs in retry/circuit-breaker code, not a prompt.",
|
||||
"target_component": "retry_and_circuit_breaker_control",
|
||||
"target_file": "stable/retry_policy.py",
|
||||
"code_diff": "--- stable/retry_policy.py\n+++ candidate/retry_policy.py\n@@ -1,16 +1,18 @@\n \"\"\"Stable version 1.0.0. It intentionally contains the reproduced bug.\"\"\"\n \n-VERSION = \"1.0.0\"\n+VERSION = \"1.0.1-rejected\"\n MAX_RETRIES = 3\n CIRCUIT_BREAKER_THRESHOLD = 5\n NON_RETRYABLE_CODES = {\"AUTH_DENIED\", \"INVALID_ARGUMENT\"}\n \n \n def should_retry(error_code, retryable, attempt):\n- \"\"\"Return whether another tool call should be attempted.\"\"\"\n- return attempt < MAX_RETRIES\n+ \"\"\"Incorrect over-broad fix retained as a rejected candidate.\"\"\"\n+ return False\n \n \n def should_open_circuit(consecutive_failures, *, error_code=\"\", retryable=True):\n- \"\"\"Open after repeated failures.\"\"\"\n+ \"\"\"Open immediately for permanent errors; otherwise use the threshold.\"\"\"\n+ if not retryable or error_code in NON_RETRYABLE_CODES:\n+ return consecutive_failures >= 1\n return consecutive_failures >= CIRCUIT_BREAKER_THRESHOLD\n",
|
||||
"impact_prediction": {
|
||||
"non_retryable_calls": {
|
||||
"after": 1
|
||||
},
|
||||
"temporary_timeout_recovery_rate": {
|
||||
"after": 0.0
|
||||
}
|
||||
},
|
||||
"expected_fix": [
|
||||
"non-retryable tool-call attempts fall to one",
|
||||
"the circuit opens on the first permanent failure"
|
||||
],
|
||||
"potential_regressions": [
|
||||
"temporary timeouts stop retrying",
|
||||
"the five-failure circuit threshold changes for retryable errors",
|
||||
"public function signatures change"
|
||||
],
|
||||
"stable_version": "fcd37db6ebb1",
|
||||
"stable_sha256": "fcd37db6ebb19ed2e2492f086365a9f8addfcc4410242151185a1481d130041a",
|
||||
"candidate_version": "824bbfb244a7",
|
||||
"candidate_sha256": "824bbfb244a7b17ac835706be588542a63ad03e0d737d6c9d5da719c969652d2",
|
||||
"rollback_version": "fcd37db6ebb1",
|
||||
"rollback_sha256": "fcd37db6ebb19ed2e2492f086365a9f8addfcc4410242151185a1481d130041a",
|
||||
"diff": "--- stable/retry_policy.py\n+++ candidate/retry_policy.py\n@@ -1,16 +1,18 @@\n \"\"\"Stable version 1.0.0. It intentionally contains the reproduced bug.\"\"\"\n \n-VERSION = \"1.0.0\"\n+VERSION = \"1.0.1-rejected\"\n MAX_RETRIES = 3\n CIRCUIT_BREAKER_THRESHOLD = 5\n NON_RETRYABLE_CODES = {\"AUTH_DENIED\", \"INVALID_ARGUMENT\"}\n \n \n def should_retry(error_code, retryable, attempt):\n- \"\"\"Return whether another tool call should be attempted.\"\"\"\n- return attempt < MAX_RETRIES\n+ \"\"\"Incorrect over-broad fix retained as a rejected candidate.\"\"\"\n+ return False\n \n \n def should_open_circuit(consecutive_failures, *, error_code=\"\", retryable=True):\n- \"\"\"Open after repeated failures.\"\"\"\n+ \"\"\"Open immediately for permanent errors; otherwise use the threshold.\"\"\"\n+ if not retryable or error_code in NON_RETRYABLE_CODES:\n+ return consecutive_failures >= 1\n return consecutive_failures >= CIRCUIT_BREAKER_THRESHOLD\n",
|
||||
"patch_size": {
|
||||
"added_lines": 6,
|
||||
"deleted_lines": 4,
|
||||
"changed_lines": 10
|
||||
},
|
||||
"checks": {
|
||||
"static_compile": true,
|
||||
"public_api_compatible": true,
|
||||
"security_scan": true,
|
||||
"failure_replay": true,
|
||||
"nonretryable_circuit": true,
|
||||
"temporary_recovery": false,
|
||||
"old_task_regression": false,
|
||||
"canary_ready": false,
|
||||
"rollback_ready": true,
|
||||
"protected_surfaces_unchanged": true
|
||||
},
|
||||
"failed_checks": [
|
||||
"temporary_recovery",
|
||||
"old_task_regression",
|
||||
"canary_ready"
|
||||
],
|
||||
"canary_gate": {
|
||||
"eligible": false,
|
||||
"scope": "shadow traffic only; stable remains unchanged",
|
||||
"rollback_trigger": "any non-retryable repeat or temporary-recovery regression"
|
||||
},
|
||||
"rollback_gate": {
|
||||
"artifact_hash_matches_stable": true,
|
||||
"rollback_version": "fcd37db6ebb1"
|
||||
},
|
||||
"provenance": {
|
||||
"generator": "negative_control",
|
||||
"api_calls": 0
|
||||
},
|
||||
"decision": "reject_candidate",
|
||||
"rejection_reason": "failed gates: temporary_recovery, old_task_regression, canary_ready"
|
||||
}
|
||||
Reference in New Issue
Block a user