vmware-debug 1.13.2__tar.gz → 2.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.claude-plugin/plugin.json +1 -1
  2. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.mcp.json +1 -1
  3. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/PKG-INFO +25 -15
  4. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/README-CN.md +22 -14
  5. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/README.md +23 -13
  6. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/RELEASE_NOTES.md +39 -0
  7. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/openclaw.plugin.json +1 -1
  8. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/package.json +1 -1
  9. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/pyproject.toml +2 -2
  10. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/server.json +2 -2
  11. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/SKILL.md +37 -37
  12. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/agent-guardrails.md +4 -4
  13. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/capabilities.md +2 -2
  14. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/cli-reference.md +4 -4
  15. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/event-envelope.md +4 -4
  16. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/routing.md +1 -1
  17. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/setup-guide.md +6 -6
  18. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_family.py +78 -63
  19. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_scores.json +30 -30
  20. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_skill.py +3 -3
  21. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_entity_reachability.py +2 -2
  22. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_case_id_non_ascii.py +1 -1
  23. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_case_plan_max_steps.py +23 -23
  24. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_classification_against_vsphere_vocabulary.py +2 -2
  25. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_debug_regressions.py +1 -1
  26. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_environment_resolver_isolation.py +3 -3
  27. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_every_tool_parameter_is_documented.py +1 -1
  28. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_evidence_payload_contract.py +8 -8
  29. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_real_alert_titles_classify.py +6 -6
  30. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_skill_name_aliases.py +1 -1
  31. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_tool_annotations.py +7 -7
  32. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_grading_per_hypothesis.py +1 -1
  33. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_hypotheses.py +2 -2
  34. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_ids.py +1 -1
  35. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_ledger_concurrency.py +1 -1
  36. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_plan.py +1 -1
  37. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_readiness.py +2 -2
  38. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_store.py +1 -1
  39. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_timeline_close.py +2 -2
  40. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_tools.py +24 -24
  41. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_mcp_audit.py +38 -38
  42. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_safe_error_passthrough.py +11 -11
  43. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/uv.lock +5 -5
  44. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/__init__.py +1 -1
  45. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/cli.py +4 -4
  46. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/envelope.py +6 -6
  47. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp/tools.py +27 -27
  48. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp_server/server.py +87 -86
  49. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/api.py +6 -6
  50. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/evidence.py +2 -2
  51. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/grading.py +1 -1
  52. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/hypotheses.py +5 -5
  53. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/ids.py +5 -5
  54. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/payloads.py +8 -8
  55. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/plan.py +7 -7
  56. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/readiness.py +1 -1
  57. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/store.py +6 -6
  58. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/timeline.py +3 -3
  59. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/skill_names.py +1 -1
  60. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/timeline.py +6 -6
  61. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/rules/evidence_sources.yaml +22 -22
  62. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.clawhubignore +0 -0
  63. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.gitignore +0 -0
  64. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/SECURITY.md +0 -0
  65. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/docs/plans/2026-08-28-investigation-layer-design.md +0 -0
  66. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/__init__.py +0 -0
  67. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/conftest.py +0 -0
  68. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/__init__.py +0 -0
  69. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/__init__.py +0 -0
  70. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_scoring.py +0 -0
  71. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/conftest.py +0 -0
  72. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_error_actionability.py +0 -0
  73. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
  74. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
  75. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/__init__.py +0 -0
  76. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/_vsphere_event_vocabulary.py +0 -0
  77. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_audit_isolation.py +0 -0
  78. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_capability_grader.py +0 -0
  79. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_host_lifecycle_classification.py +0 -0
  80. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_investigation_metrics.py +0 -0
  81. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_result_envelope.py +0 -0
  82. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_spike_resolution.py +0 -0
  83. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_conclusion.py +0 -0
  84. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_evidence.py +0 -0
  85. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_grading.py +0 -0
  86. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_knowledge.py +0 -0
  87. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_timeline.py +0 -0
  88. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp/__init__.py +0 -0
  89. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp_server/__init__.py +0 -0
  90. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/__init__.py +0 -0
  91. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/__init__.py +0 -0
  92. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/conclusion.py +0 -0
  93. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/knowledge.py +0 -0
  94. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/model.py +0 -0
  95. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/sources.py +0 -0
  96. {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/rules/grading_rules.yaml +0 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://anthropic.com/claude-code/plugin.schema.json",
3
3
  "name": "vmware-debug",
4
4
  "displayName": "VMware Debug",
5
- "version": "1.13.2",
5
+ "version": "2.0.0",
6
6
  "description": "VMware incident timeline, root-cause routing, local case ledger; no vSphere access. 14 MCP tools.",
7
7
  "author": {
8
8
  "name": "Wei Zhou",
@@ -5,7 +5,7 @@
5
5
  "command": "uvx",
6
6
  "args": [
7
7
  "--from",
8
- "vmware-debug==1.13.2",
8
+ "vmware-debug==2.0.0",
9
9
  "vmware-debug-mcp"
10
10
  ]
11
11
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vmware-debug
3
- Version: 1.13.2
3
+ Version: 2.0.0
4
4
  Summary: VMware diagnostic brain — offline incident triage, log/event correlation, and root-cause routing across the VMware skill family
5
5
  Project-URL: Homepage, https://github.com/vmware-skills/VMware-Debug
6
6
  Project-URL: Repository, https://github.com/vmware-skills/VMware-Debug
@@ -18,7 +18,7 @@ Requires-Dist: mcp[cli]<2.0,>=1.10
18
18
  Requires-Dist: pyyaml<7.0,>=6.0
19
19
  Requires-Dist: rich<15.0,>=13.0
20
20
  Requires-Dist: typer<1.0,>=0.12
21
- Requires-Dist: vmware-policy<2.0,>=1.16.0
21
+ Requires-Dist: vmware-policy<2.0,>=1.18.1
22
22
  Description-Content-Type: text/markdown
23
23
 
24
24
  <!-- mcp-name: io.github.vmware-skills/vmware-debug -->
@@ -42,6 +42,16 @@ advisor/executor split.
42
42
  See [`skills/vmware-debug/SKILL.md`](skills/vmware-debug/SKILL.md) for the full
43
43
  methodology, the event-envelope contract, and symptom routing.
44
44
 
45
+ ## Upgrading to 2.0
46
+
47
+ 2.0 renames 13 of its 14 MCP tools so every name starts with a verb (e.g. `case_close` → `close_case`, `case_get` → `get_case`, `case_grade` → `grade_case`). The full old → new table is in
48
+ [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first). Nothing else changes: same tools, parameters,
49
+ safety gates and CLI commands. If an agent prompt, script or `~/.vmware/rules.yaml` names a tool, update it — though deny
50
+ rules written with the old names keep working with vmware-policy ≥ 1.18.1 (`vmware-audit policy` lists any rule the
51
+ renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workflows.
52
+ If an install older than 2.0 shares that `rules.yaml`, give it vmware-policy ≥ 1.18.2 too: it matches each rule
53
+ against both the old and the new name, so one file serves both.
54
+
45
55
  ## MCP tools (14 — 7 read, 7 write)
46
56
 
47
57
  The seven writes go to the local case ledger only; none reaches a VMware system.
@@ -50,25 +60,25 @@ The seven writes go to the local case ledger only; none reaches a VMware system.
50
60
 
51
61
  | Tool | What |
52
62
  |---|---|
53
- | `incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
63
+ | `build_incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
54
64
  | `list_symptom_categories` | [READ] List recognised symptom categories + what to check for each |
55
65
 
56
66
  **Investigation ledger** — for an incident you will reason about over time:
57
67
 
58
68
  | Tool | What |
59
69
  |---|---|
60
- | `case_open` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
61
- | `case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
62
- | `case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
63
- | `case_plan` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
64
- | `case_list` | [READ] Cases, newest first |
65
- | `case_get` | [READ] One case: scope, ledger sizes, grade history |
66
- | `case_hypotheses` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
67
- | `case_submit_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
68
- | `case_record_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
69
- | `case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
70
- | `case_grade` | [WRITE] Recompute the conclusion grade from the ledger and record it |
71
- | `case_close` | [WRITE] Record the final grade, archive, and name what was left open |
70
+ | `open_case` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
71
+ | `get_case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
72
+ | `get_case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
73
+ | `plan_case` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
74
+ | `list_cases` | [READ] Cases, newest first |
75
+ | `get_case` | [READ] One case: scope, ledger sizes, grade history |
76
+ | `record_case_hypothesis` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
77
+ | `submit_case_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
78
+ | `record_case_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
79
+ | `record_case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
80
+ | `grade_case` | [WRITE] Recompute the conclusion grade from the ledger and record it |
81
+ | `close_case` | [WRITE] Record the final grade, archive, and name what was left open |
72
82
 
73
83
  ## Offline / Air-Gapped Install (from source)
74
84
 
@@ -10,12 +10,20 @@ VMware skill 家族的**诊断大脑**。你给出症状(报错、日志、变
10
10
  它**从不触碰 vSphere**——不连接任何东西,也从不执行修复;唯一的写入是 `$OPS_HOME` 下的本地案卷。修复一律路由给 vmware-aiops(单步)或
11
11
  vmware-pilot(多步、带审批门控),完全复刻 vmware-harden → vmware-pilot 的「顾问/执行」分工。
12
12
 
13
+ ## 升级到 2.0
14
+
15
+ 2.0 把 14 个 MCP 工具中的 13 个改成动词在前(例如 `case_close` → `close_case`, `case_get` → `get_case`, `case_grade` → `grade_case`),完整的新旧名对照表见
16
+ [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first)。其他都不变:工具、参数、安全确认门和 CLI 命令都一样。
17
+ 如果 agent 提示词、脚本或 `~/.vmware/rules.yaml` 里写了工具名,请改成新名——不过用旧名写的 deny 规则在
18
+ vmware-policy ≥ 1.18.1 下仍然生效(`vmware-audit policy` 会列出因改名而多匹配的规则),vmware-pilot ≥ 1.13 也会自动转换已保存工作流里的旧名。
19
+ 如果还有 2.0 之前的安装共用这个 `rules.yaml`,请把它的 vmware-policy 也升到 ≥ 1.18.2:它会按新旧两个名字匹配每条规则,一份文件两边都管用。
20
+
13
21
  ## 配套 Skill
14
22
 
15
23
  | 需求 | Skill |
16
24
  |---|---|
17
25
  | 故障关联 / 根因 | **vmware-debug**(本项目) |
18
- | 集中日志检索 | vmware-log-insight(把 `log_search` 结果喂给它) |
26
+ | 集中日志检索 | vmware-log-insight(把 `search_logs` 结果喂给它) |
19
27
  | vCenter 事件与告警 | vmware-monitor |
20
28
  | 指标 / 异常 | vmware-aria |
21
29
  | 执行修复 | vmware-aiops(单步)/ vmware-pilot(多步门控) |
@@ -33,23 +41,23 @@ vmware-debug categories # 看它能诊断哪些症状类别
33
41
 
34
42
  **关联**——无状态,看一眼用:
35
43
 
36
- - `incident_timeline`:[READ] 把已取到的事件关联成 时间线 + 突刺 + 排序后的根因假设 + 下一步检查建议
44
+ - `build_incident_timeline`:[READ] 把已取到的事件关联成 时间线 + 突刺 + 排序后的根因假设 + 下一步检查建议
37
45
  - `list_symptom_categories`:[READ] 症状类别及对应的排查路由(不知道查什么时用它)
38
46
 
39
47
  **调查案卷**——需要持续推理的事件:
40
48
 
41
- - `case_open`:[WRITE] 定义事件;返回案卷 id 和本环境能达到的结论等级
42
- - `case_readiness`:[READ] 开始**之前**,按症状类别说明本环境能达到的等级
43
- - `case_knowledge`:[READ] 接受哪些知识格式、挂载了什么、哪些条目适用于某个案卷
44
- - `case_plan`:[READ] 下一步该取什么——每步给出 skill、工具和目的;按案卷当前状态重算
45
- - `case_list`:[READ] 案卷列表,最新的在前
46
- - `case_get`:[READ] 单个案卷:范围、账本大小、等级历史
47
- - `case_hypotheses`:[WRITE] 登记一个候选解释,或读取各假设的支持/反驳账本
48
- - `case_submit_evidence`:[WRITE] 记录一条取到的事实,连同来源、查询和时间基准
49
- - `case_record_gap`:[WRITE] 记录**没能**取到的东西,以及如何补上
50
- - `case_timeline`:[WRITE] 把案卷收集到的一切关联成一条时间线
51
- - `case_grade`:[WRITE] 从账本重算结论等级并记录
52
- - `case_close`:[WRITE] 记录最终等级、归档,并写明留下了哪些未决项
49
+ - `open_case`:[WRITE] 定义事件;返回案卷 id 和本环境能达到的结论等级
50
+ - `get_case_readiness`:[READ] 开始**之前**,按症状类别说明本环境能达到的等级
51
+ - `get_case_knowledge`:[READ] 接受哪些知识格式、挂载了什么、哪些条目适用于某个案卷
52
+ - `plan_case`:[READ] 下一步该取什么——每步给出 skill、工具和目的;按案卷当前状态重算
53
+ - `list_cases`:[READ] 案卷列表,最新的在前
54
+ - `get_case`:[READ] 单个案卷:范围、账本大小、等级历史
55
+ - `record_case_hypothesis`:[WRITE] 登记一个候选解释,或读取各假设的支持/反驳账本
56
+ - `submit_case_evidence`:[WRITE] 记录一条取到的事实,连同来源、查询和时间基准
57
+ - `record_case_gap`:[WRITE] 记录**没能**取到的东西,以及如何补上
58
+ - `record_case_timeline`:[WRITE] 把案卷收集到的一切关联成一条时间线
59
+ - `grade_case`:[WRITE] 从账本重算结论等级并记录
60
+ - `close_case`:[WRITE] 记录最终等级、归档,并写明留下了哪些未决项
53
61
 
54
62
  **事件信封**:`{ts, source, severity, entity, text, fields}`。agent 把各源事件归一成此形状再交给
55
63
  debug;debug 因此与其它包零运行时依赖。**请把每条事件的 `event_type` 保留在 `fields` 里**——
@@ -19,6 +19,16 @@ advisor/executor split.
19
19
  See [`skills/vmware-debug/SKILL.md`](skills/vmware-debug/SKILL.md) for the full
20
20
  methodology, the event-envelope contract, and symptom routing.
21
21
 
22
+ ## Upgrading to 2.0
23
+
24
+ 2.0 renames 13 of its 14 MCP tools so every name starts with a verb (e.g. `case_close` → `close_case`, `case_get` → `get_case`, `case_grade` → `grade_case`). The full old → new table is in
25
+ [RELEASE_NOTES.md](RELEASE_NOTES.md#v200--mcp-tools-renamed-verb-first). Nothing else changes: same tools, parameters,
26
+ safety gates and CLI commands. If an agent prompt, script or `~/.vmware/rules.yaml` names a tool, update it — though deny
27
+ rules written with the old names keep working with vmware-policy ≥ 1.18.1 (`vmware-audit policy` lists any rule the
28
+ renames widened), and vmware-pilot ≥ 1.13 translates old names in saved workflows.
29
+ If an install older than 2.0 shares that `rules.yaml`, give it vmware-policy ≥ 1.18.2 too: it matches each rule
30
+ against both the old and the new name, so one file serves both.
31
+
22
32
  ## MCP tools (14 — 7 read, 7 write)
23
33
 
24
34
  The seven writes go to the local case ledger only; none reaches a VMware system.
@@ -27,25 +37,25 @@ The seven writes go to the local case ledger only; none reaches a VMware system.
27
37
 
28
38
  | Tool | What |
29
39
  |---|---|
30
- | `incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
40
+ | `build_incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
31
41
  | `list_symptom_categories` | [READ] List recognised symptom categories + what to check for each |
32
42
 
33
43
  **Investigation ledger** — for an incident you will reason about over time:
34
44
 
35
45
  | Tool | What |
36
46
  |---|---|
37
- | `case_open` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
38
- | `case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
39
- | `case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
40
- | `case_plan` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
41
- | `case_list` | [READ] Cases, newest first |
42
- | `case_get` | [READ] One case: scope, ledger sizes, grade history |
43
- | `case_hypotheses` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
44
- | `case_submit_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
45
- | `case_record_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
46
- | `case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
47
- | `case_grade` | [WRITE] Recompute the conclusion grade from the ledger and record it |
48
- | `case_close` | [WRITE] Record the final grade, archive, and name what was left open |
47
+ | `open_case` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
48
+ | `get_case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
49
+ | `get_case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
50
+ | `plan_case` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
51
+ | `list_cases` | [READ] Cases, newest first |
52
+ | `get_case` | [READ] One case: scope, ledger sizes, grade history |
53
+ | `record_case_hypothesis` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
54
+ | `submit_case_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
55
+ | `record_case_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
56
+ | `record_case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
57
+ | `grade_case` | [WRITE] Recompute the conclusion grade from the ledger and record it |
58
+ | `close_case` | [WRITE] Record the final grade, archive, and name what was left open |
49
59
 
50
60
  ## Offline / Air-Gapped Install (from source)
51
61
 
@@ -1,3 +1,42 @@
1
+ ## v2.0.0 — MCP tools renamed verb-first
2
+
3
+ Every MCP tool in the VMware skill family now follows one naming convention: the verb comes first
4
+ (`open_…`, `get_…`, `record_…`, `build_…`), followed by what it acts on. Where two skills would
5
+ otherwise expose the same name, the tool carries a domain word — here `case`, so the ledger tools read
6
+ `open_case`, `grade_case`, `record_case_gap`. 13 of this skill's 14 tools are renamed;
7
+ `list_symptom_categories` already led with its verb. Parameters, annotations, the `sensitive_params` /
8
+ `sensitive_result` declarations and behaviour are unchanged; only the names move.
9
+ `record_case_hypothesis` still reads the hypothesis ledger, writing nothing, when called without a
10
+ `statement` — its description now says so in its first sentence.
11
+
12
+ | Old name | New name |
13
+ |---|---|
14
+ | `case_close` | `close_case` |
15
+ | `case_get` | `get_case` |
16
+ | `case_grade` | `grade_case` |
17
+ | `case_hypotheses` | `record_case_hypothesis` |
18
+ | `case_knowledge` | `get_case_knowledge` |
19
+ | `case_list` | `list_cases` |
20
+ | `case_open` | `open_case` |
21
+ | `case_plan` | `plan_case` |
22
+ | `case_readiness` | `get_case_readiness` |
23
+ | `case_record_gap` | `record_case_gap` |
24
+ | `case_submit_evidence` | `submit_case_evidence` |
25
+ | `case_timeline` | `record_case_timeline` |
26
+ | `incident_timeline` | `build_incident_timeline` |
27
+
28
+ **Sibling tools are cited by their 2.0 names.** The evidence-source catalogue
29
+ (`rules/evidence_sources.yaml`), the symptom routing table, `plan_case` steps, teaching errors, and the
30
+ docs now name the other skills' tools by their new names (`get_events` → unchanged, `log_search` →
31
+ `search_logs`, `vsan_health` → `get_vsan_health`, `host_investigation_bundle` → `investigate_host`, …),
32
+ so a plan step is a tool the 2.0 servers actually register.
33
+
34
+ **CLI commands are unchanged** (`vmware-debug triage`, `vmware-debug categories`). `triage`'s audit row
35
+ records its MCP twin's name, so those rows now carry `build_incident_timeline`.
36
+
37
+ **Deny rules** in `~/.vmware/rules.yaml` written with old names keep working with vmware-policy ≥ 1.18.1 (1.18.1 carries `case_timeline` → `record_case_timeline`)
38
+ (it matches both names); `vmware-audit policy` lists any rule that now matches more.
39
+
1
40
  ## v1.13.2 — auth diagnosis never reads or records a secret
2
41
 
3
42
  Docs only; no code change.
@@ -11,7 +11,7 @@
11
11
  "command": "uvx",
12
12
  "args": [
13
13
  "--from",
14
- "vmware-debug==1.13.2",
14
+ "vmware-debug==2.0.0",
15
15
  "vmware-debug-mcp"
16
16
  ]
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zw008/vmware-debug",
3
- "version": "1.13.2",
3
+ "version": "2.0.0",
4
4
  "description": "VMware incident timeline, root-cause routing, local case ledger; no vSphere access. 14 MCP tools.",
5
5
  "private": true,
6
6
  "license": "MIT",
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "vmware-debug"
7
- version = "1.13.2"
7
+ version = "2.0.0"
8
8
  description = "VMware diagnostic brain — offline incident triage, log/event correlation, and root-cause routing across the VMware skill family"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -21,7 +21,7 @@ dependencies = [
21
21
  "typer>=0.12,<1.0",
22
22
  "rich>=13.0,<15.0",
23
23
  "mcp[cli]>=1.10,<2.0",
24
- "vmware-policy>=1.16.0,<2.0",
24
+ "vmware-policy>=1.18.1,<2.0",
25
25
  # Imported directly by ops/cases/grading.py for the rules file. It has
26
26
  # always arrived transitively via vmware-policy; a package should
27
27
  # declare what it imports rather than rely on a dependency's dependency.
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/vmware-skills/VMware-Debug",
8
8
  "source": "github"
9
9
  },
10
- "version": "1.13.2",
10
+ "version": "2.0.0",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "pypi",
14
14
  "identifier": "vmware-debug",
15
- "version": "1.13.2",
15
+ "version": "2.0.0",
16
16
  "runtimeHint": "uvx",
17
17
  "packageArguments": [
18
18
  {
@@ -51,7 +51,7 @@ write tools touch only the local case ledger.
51
51
  ## Quick Install
52
52
 
53
53
  ```bash
54
- uv tool install vmware-debug==1.13.2
54
+ uv tool install vmware-debug==2.0.0
55
55
  vmware-debug categories # see what it can diagnose
56
56
  ```
57
57
 
@@ -82,16 +82,16 @@ a recommended plan.
82
82
  ## Common Workflows
83
83
 
84
84
  ### 1. "Here's a pile of logs / alarms — what broke?"
85
- 1. Collect events with the data-source skills (e.g. `vmware-monitor event_list --vm web01 --since 1h`, `vmware-log-insight log_search ...`, `vmware-aria alert_query ...`).
86
- 2. Pass them all to **`incident_timeline`** (envelope below). Read the top hypothesis + `next_checks`.
87
- 3. Follow `next_checks` to pull more targeted data; re-run `incident_timeline` to confirm.
85
+ 1. Collect events with the data-source skills (e.g. MCP tools vmware-monitor `get_events`, vmware-log-insight `search_logs`, vmware-aria `list_alerts`).
86
+ 2. Pass them all to **`build_incident_timeline`** (envelope below). Read the top hypothesis + `next_checks`.
87
+ 3. Follow `next_checks` to pull more targeted data; re-run `build_incident_timeline` to confirm.
88
88
  4. **Failure branch — no events come back:** the affected target may be unreachable. Run the source skill's `doctor`/health first; a 503/timeout is a *signal* (platform not ready), not a dead end.
89
89
  5. Produce a diagnosis + recommended fix. Route execution to aiops/pilot. **Do not fix here.**
90
90
 
91
91
  ### 2. "I don't even know what to check"
92
92
  1. Run **`list_symptom_categories`** (or `vmware-debug categories`) to see the catalogue.
93
93
  2. Describe the symptom; map it to a category; the `suggested_check` tells you which skill/tool to run first.
94
- 3. Collect → `incident_timeline` → narrow. Loop until one hypothesis dominates.
94
+ 3. Collect → `build_incident_timeline` → narrow. Loop until one hypothesis dominates.
95
95
 
96
96
  ### 3. Hand off the fix (advisor → executor, like vmware-harden)
97
97
  1. Debug emits a structured diagnosis + a proposed remediation (steps).
@@ -101,7 +101,7 @@ a recommended plan.
101
101
 
102
102
  ## Usage Mode
103
103
 
104
- - **MCP** (in an agent): the agent calls the other skills' read tools, then `incident_timeline` to correlate. This is the primary mode — that's where the cross-skill "联动" happens.
104
+ - **MCP** (in an agent): the agent calls the other skills' read tools, then `build_incident_timeline` to correlate. This is the primary mode — that's where the cross-skill "联动" happens.
105
105
  - **CLI** (humans): `vmware-debug triage --events events.json` correlates a JSON array you collected yourself.
106
106
 
107
107
  ## MCP Tools (14 — 7 read, 7 write)
@@ -110,31 +110,31 @@ a recommended plan.
110
110
 
111
111
  | Tool | What |
112
112
  |---|---|
113
- | `incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
113
+ | `build_incident_timeline` | [READ] Correlate pre-fetched events → timeline + spikes + ranked hypotheses + next-check ideas |
114
114
  | `list_symptom_categories` | [READ] List recognised symptom categories + what to check for each |
115
115
 
116
116
  **Investigation ledger** — for an incident you will reason about over time:
117
117
 
118
118
  | Tool | What |
119
119
  |---|---|
120
- | `case_open` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
121
- | `case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
122
- | `case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
123
- | `case_plan` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
124
- | `case_list` | [READ] Cases, newest first |
125
- | `case_get` | [READ] One case: scope, ledger sizes, grade history |
126
- | `case_hypotheses` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
127
- | `case_submit_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
128
- | `case_record_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
129
- | `case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
130
- | `case_grade` | [WRITE] Recompute the conclusion grade from the ledger and record it |
131
- | `case_close` | [WRITE] Record the final grade, archive, and name what was left open |
120
+ | `open_case` | [WRITE] Define the event; returns a case id and the grade this environment can reach |
121
+ | `get_case_readiness` | [READ] What grade this environment can reach, per symptom category, **before** you start |
122
+ | `get_case_knowledge` | [READ] Which knowledge formats are accepted, what is mounted, and which entries apply to a case |
123
+ | `plan_case` | [READ] What to fetch next — skill, tool and purpose per step; recomputed from the case's current state |
124
+ | `list_cases` | [READ] Cases, newest first |
125
+ | `get_case` | [READ] One case: scope, ledger sizes, grade history |
126
+ | `record_case_hypothesis` | [WRITE] Register a candidate explanation, or read the ledger of what supports and refutes each |
127
+ | `submit_case_evidence` | [WRITE] Record one retrieved fact, with its source, query and time basis |
128
+ | `record_case_gap` | [WRITE] Record what could **not** be retrieved, and how to close it |
129
+ | `record_case_timeline` | [WRITE] Correlate everything the case has collected into one timeline |
130
+ | `grade_case` | [WRITE] Recompute the conclusion grade from the ledger and record it |
131
+ | `close_case` | [WRITE] Record the final grade, archive, and name what was left open |
132
132
 
133
133
  The seven writes go to `$OPS_HOME` (default `~/.vmware/cases/`) and nowhere else.
134
134
 
135
135
  **List envelope** (output of `list_symptom_categories`): `{items, returned, limit, total, truncated, hint}` — read the rows from `items`. `truncated` is always `false` here, which is the point: it states that the catalogue is complete instead of leaving you to infer it.
136
136
 
137
- **Event envelope** (input to `incident_timeline`): `{ts, source, severity, entity, text, fields}`.
137
+ **Event envelope** (input to `build_incident_timeline`): `{ts, source, severity, entity, text, fields}`.
138
138
  See `references/event-envelope.md`. The agent normalises each source's events into this
139
139
  shape; debug stays source-agnostic and has no dependency on the other packages.
140
140
  Keep each event's `event_type` in `fields` — the classifier matches it as well as
@@ -160,12 +160,12 @@ how a conclusion was reached with none of this installed:
160
160
  └── timeline.md · hypotheses.md · plan.jsonl · case.json
161
161
  ```
162
162
 
163
- Hypotheses get ids (H1, H2, …), and those ids are what `case_record_gap(blocks=…)`
164
- and `case_submit_evidence(falsifies=…)` refer to. **An id that was never
163
+ Hypotheses get ids (H1, H2, …), and those ids are what `record_case_gap(blocks=…)`
164
+ and `submit_case_evidence(falsifies=…)` refer to. **An id that was never
165
165
  registered is refused, not ignored** — a dangling reference blocks nothing and
166
166
  falsifies nothing, which quietly reports a stronger case than you have.
167
167
 
168
- **You cannot state a conclusion level.** `case_grade` has no parameter for one;
168
+ **You cannot state a conclusion level.** `grade_case` has no parameter for one;
169
169
  the grade is recomputed from the ledger on every call. To change it, change the
170
170
  ledger — submit the missing evidence, or record the gap that is blocking it.
171
171
 
@@ -178,23 +178,23 @@ ledger — submit the missing evidence, or record the gap that is blocking it.
178
178
  nothing" is a gap, not an exclusion. Exclusion is per hypothesis: two
179
179
  independent sources must falsify *that* hypothesis, and the case is Excluded
180
180
  only when every registered hypothesis is ruled out. A hypothesis contradicted
181
- by too few sources holds the case at Candidate. Otherwise `case_grade`
181
+ by too few sources holds the case at Candidate. Otherwise `grade_case`
182
182
  grades what remains, counting only evidence that falsifies nothing, and lists
183
183
  each hypothesis as `open` or `excluded` in `hypotheses`
184
184
 
185
- `case_plan` is not a checklist: submit evidence and the next plan is shorter,
185
+ `plan_case` is not a checklist: submit evidence and the next plan is shorter,
186
186
  lose a source and it routes around it. Its `unavailable` half is the important
187
187
  one — a source this install cannot reach is listed there with how to supply it,
188
188
  so the gap is visible now rather than when the conclusion refuses to firm up.
189
189
 
190
- `case_readiness` answers this per symptom category rather than as one number —
190
+ `get_case_readiness` answers this per symptom category rather than as one number —
191
191
  "storage reaches Probable, hardware reaches Candidate" can be acted on;
192
192
  "readiness 78%" cannot. Two classes served by the *same* skill count as one
193
- source, so it agrees with what `case_grade` will actually award.
193
+ source, so it agrees with what `grade_case` will actually award.
194
194
 
195
195
  ### Mounting a knowledge library
196
196
 
197
- `case_knowledge` answers "what can I add" without anyone reading this file.
197
+ `get_case_knowledge` answers "what can I add" without anyone reading this file.
198
198
  Entries go under `$OPS_HOME/knowledge/{kb,runbook,sr,cases}/`:
199
199
 
200
200
  | Format | How metadata travels |
@@ -206,7 +206,7 @@ Entries go under `$OPS_HOME/knowledge/{kb,runbook,sr,cases}/`:
206
206
  | `.csv` `.tsv` | one entry per row; use dotted columns (`driver.version`) for nested constraints |
207
207
  | `.txt` `.log` | a sibling `<name>.yaml` carries the metadata |
208
208
 
209
- PDF, DOCX, PPTX and HTML must be converted to Markdown first — `case_knowledge`
209
+ PDF, DOCX, PPTX and HTML must be converted to Markdown first — `get_case_knowledge`
210
210
  names them rather than ignoring them.
211
211
 
212
212
  **Every entry needs an `applies_to` block to be decisive:**
@@ -224,11 +224,11 @@ applies_to:
224
224
 
225
225
  `product`, `build`, `driver` and `firmware` are the constraints the checker
226
226
  evaluates. **Any other key leaves the entry non-decisive** — including a typo —
227
- because an unverified constraint is not a satisfied one, and `case_knowledge`
227
+ because an unverified constraint is not a satisfied one, and `get_case_knowledge`
228
228
  names the key it could not check.
229
229
 
230
230
  Knowledge evidence must say **which** entry it is
231
- (`case_submit_evidence(source_skill="knowledge-kb", knowledge_entry_id="KB-…")`)
231
+ (`submit_case_evidence(source_skill="knowledge-kb", knowledge_entry_id="KB-…")`)
232
232
  — "some applicable entry is mounted somewhere" is a different claim from "this
233
233
  one applies", and only the second can carry a conclusion.
234
234
 
@@ -272,11 +272,11 @@ vmware-debug mcp # start stdio MCP server (proxy-
272
272
 
273
273
  ## Troubleshooting
274
274
 
275
- - **`incident_timeline` raises "event[N] could not be normalised"** — event N is missing a timestamp or has an unparseable one. Every event needs `ts` (ISO-8601, epoch seconds, or millis).
275
+ - **`build_incident_timeline` raises "event[N] could not be normalised"** — event N is missing a timestamp or has an unparseable one. Every event needs `ts` (ISO-8601, epoch seconds, or millis).
276
276
  - **Most events come back "uncategorized"** — read `classification` in the result: it says how many, what share, and quotes the texts that matched nothing. Do **not** widen the window; a wider window adds baseline, not signal. The spikes still tell you *when*, which is answerable without a category. If the samples name a subsystem the taxonomy does not know, add a signature (see `references/routing.md`).
277
277
  - **No spikes detected on an obvious burst** — check `binning` for the resolution you were given. The width is chosen from event density so that bins average ≥4 events; a burst shorter than one bin can still be flattened by it. Pass `bin_seconds` to narrow. Below three bins there is no baseline at all and nothing is reported.
278
- - **`case_timeline` says zero events after you submitted results** — check `payload_events` in each `case_submit_evidence` reply. Events are read from a bare list, or from `items`/`events`/`rows`; a *summary* of a tool's result carries none. `note` names which items carried nothing and what keys they held instead.
279
- - **`case_readiness` says a skill you have is not installed** — both spellings are accepted (`monitor` and `vmware-monitor`). A name it did not recognise comes back in `unrecognised_skills` rather than being read as missing.
278
+ - **`record_case_timeline` says zero events after you submitted results** — check `payload_events` in each `submit_case_evidence` reply. Events are read from a bare list, or from `items`/`events`/`rows`; a *summary* of a tool's result carries none. `note` names which items carried nothing and what keys they held instead.
279
+ - **`get_case_readiness` says a skill you have is not installed** — both spellings are accepted (`monitor` and `vmware-monitor`). A name it did not recognise comes back in `unrecognised_skills` rather than being read as missing.
280
280
  - **It won't execute the fix** — by design. Route to vmware-aiops or vmware-pilot.
281
281
 
282
282
  ## Audit & Safety
@@ -292,8 +292,8 @@ row to `~/.vmware/audit.db` through `@vmware_tool`, as do the `categories` and `
292
292
  CLI commands under their MCP tools' names. The row records the tool, time, OS user,
293
293
  detected agent, arguments, status (`ok`, `error`, `denied`, `budget_exceeded`,
294
294
  `interrupted`) and a result. Two arguments are stored as `***`: evidence `payload` and
295
- `incident_timeline` `events`. Two results are not stored at all — `incident_timeline` and
296
- `case_timeline` quote event text (`sample_text`, `unmatched_samples`, `rejected`), which
295
+ `build_incident_timeline` `events`. Two results are not stored at all — `build_incident_timeline` and
296
+ `record_case_timeline` quote event text (`sample_text`, `unmatched_samples`, `rejected`), which
297
297
  can carry anything the source logged, so their row says
298
298
  `[redacted: return value declared sensitive]`. Every other result (ids, counts, grades,
299
299
  your own summaries and statements) is stored after credential scrubbing. The data itself
@@ -315,7 +315,7 @@ See `references/setup-guide.md`.
315
315
  **Case data is sensitive and is kept until you delete it.** Each case lives in
316
316
  `$OPS_HOME/cases/<case-id>/` (default `~/.vmware/cases/`), created owner-only (`0700`).
317
317
  It holds whatever evidence was submitted — host names, addresses, log and event text.
318
- Nothing is deleted automatically: `case_close` records the grade and marks the case
318
+ Nothing is deleted automatically: `close_case` records the grade and marks the case
319
319
  closed but keeps its files. Remove a case by deleting its folder.
320
320
 
321
321
  ## License
@@ -22,7 +22,7 @@ makes it the safest skill in the family to point a small model at — and the on
22
22
  most exposed to the model's reasoning, because its output *is* an
23
23
  interpretation.
24
24
 
25
- For a small model the ledger is more than bookkeeping: `case_grade` computes the
25
+ For a small model the ledger is more than bookkeeping: `grade_case` computes the
26
26
  conclusion level from recorded evidence rather than accepting one, so a model
27
27
  that would happily narrate "root cause confirmed" cannot record that unless the
28
28
  evidence for it is actually in the folder.
@@ -43,10 +43,10 @@ These are structural, so it cannot.
43
43
  |---|---|
44
44
  | "Work read-only and never modify anything" | **The tool surface itself.** No tool reaches a VMware system. The seven [WRITE] tools write only to this skill's own local case ledger, so there is nothing in vSphere to withhold and nothing to switch off. |
45
45
  | "Diagnose only — never apply the fix you propose" | **Structural.** This skill has no tool that changes anything outside its own ledger, and it holds no connection to vCenter, NSX or anything else. Remediation is routed to vmware-aiops or vmware-pilot by the calling agent. |
46
- | "Do not fabricate a timeline — build it from the events I gave you" | **`incident_timeline` correlates only its input.** It is source-agnostic and has no way to fetch anything, so the timeline cannot contain an event the agent did not supply. |
46
+ | "Do not fabricate a timeline — build it from the events I gave you" | **`build_incident_timeline` correlates only its input.** It is source-agnostic and has no way to fetch anything, so the timeline cannot contain an event the agent did not supply. |
47
47
  | "Tell me when the symptom is outside what you can recognise" | **`list_symptom_categories`** states the catalogue, and unmatched symptoms come back as `uncategorized` rather than being forced into the nearest signature. |
48
48
  | "Use explicit limits for queries that may return large amounts of data" | **The list envelope.** `list_symptom_categories` returns `{items, returned, limit, total, truncated, hint}` with `truncated` always `false` — which is the point: it states that the catalogue is complete instead of leaving you to infer it. |
49
- | "Log everything you looked at" | **`~/.vmware/audit.db` and the case ledger.** Every debug tool call, a failed one included, writes one audit row (tool, time, user, agent, arguments, status and result — evidence `payload` and `events` are stored as `***`, and the results of `incident_timeline` and `case_timeline`, which quote event text, are not stored at all). Evidence submitted to a case is also recorded in the ledger with its source skill, tool, query and fetch time — so pass the real fetch time, never a placeholder. |
49
+ | "Log everything you looked at" | **`~/.vmware/audit.db` and the case ledger.** Every debug tool call, a failed one included, writes one audit row (tool, time, user, agent, arguments, status and result — evidence `payload` and `events` are stored as `***`, and the results of `build_incident_timeline` and `record_case_timeline`, which quote event text, are not stored at all). Evidence submitted to a case is also recorded in the ledger with its source skill, tool, query and fetch time — so pass the real fetch time, never a placeholder. |
50
50
 
51
51
  ---
52
52
 
@@ -59,7 +59,7 @@ your agent's instruction block.
59
59
  ## Tool use
60
60
 
61
61
  - Gather real events with the companion skills' read tools before calling
62
- incident_timeline. Never answer from memory or assumption, and never
62
+ build_incident_timeline. Never answer from memory or assumption, and never
63
63
  hand-write events to represent what you believe happened.
64
64
  - Never describe a tool call, and never output a JSON example, instead of
65
65
  executing the tool. If you intend to call a tool, call it.
@@ -1,13 +1,13 @@
1
1
  # vmware-debug Capabilities
2
2
 
3
3
  Offline incident correlation. No network, no credentials, no writes to any VMware
4
- system. This table covers the two stateless correlation tools; the twelve `case_*`
4
+ system. This table covers the two stateless correlation tools; the twelve case
5
5
  investigation-ledger tools (seven of which write, to the local ledger only) are
6
6
  listed in `SKILL.md`, and their response sizes are not yet measured here.
7
7
 
8
8
  | Tool | What it returns | Typical response tokens |
9
9
  |---|---|---|
10
- | `incident_timeline` | `{event_count, window, spikes:[{start,end,count,zscore}], hypotheses:[{category, score, summary, evidence_count, first_seen, last_seen, sample_text, suggested_check}], next_checks:[...]}` | 300–2000 (scales with hypotheses) |
10
+ | `build_incident_timeline` | `{event_count, window, spikes:[{start,end,count,zscore}], hypotheses:[{category, score, summary, evidence_count, first_seen, last_seen, sample_text, suggested_check}], next_checks:[...]}` | 300–2000 (scales with hypotheses) |
11
11
  | `list_symptom_categories` | `{items: [{category, example_keywords, suggested_check}], returned, limit, total, truncated, hint}` | ~400 |
12
12
 
13
13
  `list_symptom_categories` returns the family list envelope — read the rows from
@@ -1,7 +1,7 @@
1
1
  # vmware-debug CLI Reference
2
2
 
3
3
  All commands are offline (no network, no credentials). All but `mcp` are
4
- read-only; `mcp` starts the MCP server, whose seven `case_*` write tools record
4
+ read-only; `mcp` starts the MCP server, whose seven case write tools record
5
5
  into the local case ledger.
6
6
 
7
7
  ## triage — correlate a set of collected events
@@ -42,9 +42,9 @@ vmware-debug mcp # start the stdio MCP server (no network at startup)
42
42
 
43
43
  In an agent, the cross-skill correlation happens at the agent layer:
44
44
 
45
- 1. Fetch events with the data-source skills (vmware-monitor `event_list`,
46
- vmware-log-insight `log_search`/`log_aggregate`, vmware-aria alerts/anomaly,
45
+ 1. Fetch events with the data-source skills (vmware-monitor `get_events`,
46
+ vmware-log-insight `search_logs`/`aggregate_logs`, vmware-aria alerts/anomaly,
47
47
  vmware-nsx).
48
48
  2. Normalise each into the event envelope.
49
- 3. Call the `incident_timeline` MCP tool to correlate and rank.
49
+ 3. Call the `build_incident_timeline` MCP tool to correlate and rank.
50
50
  4. Follow `next_checks`; route any fix to vmware-aiops / vmware-pilot.
@@ -2,7 +2,7 @@
2
2
 
3
3
  This is the contract between `vmware-debug` and every data-source skill. The
4
4
  orchestrating agent fetches events with each skill's own read tools, normalises
5
- each into this shape, and passes the list to `incident_timeline`. Debug has **no
5
+ each into this shape, and passes the list to `build_incident_timeline`. Debug has **no
6
6
  runtime dependency** on the other packages (no version lockstep, no heavy install).
7
7
 
8
8
  ## Shape
@@ -22,7 +22,7 @@ runtime dependency** on the other packages (no version lockstep, no heavy instal
22
22
  | Field | Type | Notes |
23
23
  |---|---|---|
24
24
  | `ts` | string \| number | ISO-8601, epoch **seconds**, or epoch **millis** (auto-detected). Required. |
25
- | `source` | string | `monitor` \| `aria` \| `loginsight` \| `nsx` \| `nsx-security` \| `storage` \| ... The catalogue in `rules/evidence_sources.yaml` spells the same skills `vmware-monitor`, `vmware-aria`, `vmware-log-insight`. Both spellings are understood wherever a skill is named — `case_readiness(available_skills=...)`, and the grader's count of independent sources, which treats two spellings of one skill as one source. |
25
+ | `source` | string | `monitor` \| `aria` \| `loginsight` \| `nsx` \| `nsx-security` \| `storage` \| ... The catalogue in `rules/evidence_sources.yaml` spells the same skills `vmware-monitor`, `vmware-aria`, `vmware-log-insight`. Both spellings are understood wherever a skill is named — `get_case_readiness(available_skills=...)`, and the grader's count of independent sources, which treats two spellings of one skill as one source. |
26
26
  | `severity` | string | Free text; normalised to `critical`/`error`/`warning`/`info`/`unknown`. |
27
27
  | `entity` | string | The object the event is about (VM/host/datastore). May be empty. |
28
28
  | `text` | string | Human-readable message. Matched by the symptom classifier. |
@@ -52,10 +52,10 @@ sources map with little or no adaptation.
52
52
 
53
53
  | Source tool (example) | ts | severity | entity | text |
54
54
  |---|---|---|---|---|
55
- | vmware-monitor `event_list` | `createdTime` | `severity` | `vm`/`host` | `fullFormattedMessage` |
55
+ | vmware-monitor `get_events` | `createdTime` | `severity` | `vm`/`host` | `fullFormattedMessage` |
56
56
  | vmware-aria `alert_query` | `startTimeUTC` | `criticality` | `resourceName` | `alertDefinitionName` |
57
57
  | vmware-aria `anomaly` | `timestamp` | (derive) | `resourceName` | stat + value |
58
- | vmware-log-insight `log_search` | `timestamp` | `severity`/derive | `hostname` | `text` |
58
+ | vmware-log-insight `search_logs` | `timestamp` | `severity`/derive | `hostname` | `text` |
59
59
  | vmware-nsx (firewall/traceflow) | `time` | (derive) | src/dst | rule/verdict |
60
60
 
61
61
  ## Why this design
@@ -15,7 +15,7 @@ Keep this in sync with `_CATEGORY_SIGNATURES` in `vmware_debug/ops/timeline.py`
15
15
  | **auth** | login, authentication, denied, 401, 403, token, certificate, tls, password | the owning skill's `doctor` (reports whether a credential is set and whether login works — never its value), target cert + time sync | config fix (by the user) |
16
16
  | **platform** | vpxd, hostd, service restart, crash, 503, not responding, disconnected | vmware-monitor (connection/service), vmware-log-insight (vpxd/hostd) | pilot |
17
17
  | **hardware** | tpm, attestation, ipmi, sensor, bmc | vmware-monitor (host sensors and the CIM Server that supplies them, host logs for ipmi/cim), the server's BMC | site / vendor |
18
- | **licensing** | license | vmware-monitor (license_status — which asset holds which key); an Aria alert on "Unlicensed Group" is Aria's own license | license portal |
18
+ | **licensing** | license | vmware-monitor (get_license_status — which asset holds which key); an Aria alert on "Unlicensed Group" is Aria's own license | license portal |
19
19
  | **data_collection** | adapter instance, not receiving data, collector group, cloud proxy | vmware-aria (adapters, collector groups, node health, objects that stopped reporting), vmware-monitor (is the source vCenter reachable) | aria admin |
20
20
 
21
21
  ## Remediation handoff (advisor → executor)