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.
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.claude-plugin/plugin.json +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.mcp.json +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/PKG-INFO +25 -15
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/README-CN.md +22 -14
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/README.md +23 -13
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/RELEASE_NOTES.md +39 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/openclaw.plugin.json +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/package.json +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/pyproject.toml +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/server.json +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/SKILL.md +37 -37
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/agent-guardrails.md +4 -4
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/capabilities.md +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/cli-reference.md +4 -4
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/event-envelope.md +4 -4
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/routing.md +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/setup-guide.md +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_family.py +78 -63
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_scores.json +30 -30
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_skill.py +3 -3
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_entity_reachability.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_case_id_non_ascii.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_case_plan_max_steps.py +23 -23
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_classification_against_vsphere_vocabulary.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_debug_regressions.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_environment_resolver_isolation.py +3 -3
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_every_tool_parameter_is_documented.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_evidence_payload_contract.py +8 -8
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_real_alert_titles_classify.py +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_skill_name_aliases.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_tool_annotations.py +7 -7
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_grading_per_hypothesis.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_hypotheses.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_ids.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_ledger_concurrency.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_plan.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_readiness.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_store.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_timeline_close.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_tools.py +24 -24
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_mcp_audit.py +38 -38
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_safe_error_passthrough.py +11 -11
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/uv.lock +5 -5
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/__init__.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/cli.py +4 -4
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/envelope.py +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp/tools.py +27 -27
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp_server/server.py +87 -86
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/api.py +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/evidence.py +2 -2
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/grading.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/hypotheses.py +5 -5
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/ids.py +5 -5
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/payloads.py +8 -8
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/plan.py +7 -7
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/readiness.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/store.py +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/timeline.py +3 -3
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/skill_names.py +1 -1
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/timeline.py +6 -6
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/rules/evidence_sources.yaml +22 -22
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.clawhubignore +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/.gitignore +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/SECURITY.md +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/docs/plans/2026-08-28-investigation-layer-design.md +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/conftest.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/_scoring.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/conftest.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_error_actionability.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_tool_description_quality.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/capability/test_tool_manifest_budget.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/_vsphere_event_vocabulary.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_audit_isolation.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_capability_grader.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_host_lifecycle_classification.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_investigation_metrics.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_result_envelope.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/eval/regression/test_spike_resolution.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_conclusion.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_evidence.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_case_grading.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_knowledge.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/tests/test_timeline.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/mcp_server/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/__init__.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/conclusion.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/knowledge.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/model.py +0 -0
- {vmware_debug-1.13.2 → vmware_debug-2.0.0}/vmware_debug/ops/cases/sources.py +0 -0
- {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": "
|
|
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",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: vmware-debug
|
|
3
|
-
Version:
|
|
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.
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
61
|
-
| `
|
|
62
|
-
| `
|
|
63
|
-
| `
|
|
64
|
-
| `
|
|
65
|
-
| `
|
|
66
|
-
| `
|
|
67
|
-
| `
|
|
68
|
-
| `
|
|
69
|
-
| `
|
|
70
|
-
| `
|
|
71
|
-
| `
|
|
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(把 `
|
|
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
|
-
- `
|
|
44
|
+
- `build_incident_timeline`:[READ] 把已取到的事件关联成 时间线 + 突刺 + 排序后的根因假设 + 下一步检查建议
|
|
37
45
|
- `list_symptom_categories`:[READ] 症状类别及对应的排查路由(不知道查什么时用它)
|
|
38
46
|
|
|
39
47
|
**调查案卷**——需要持续推理的事件:
|
|
40
48
|
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
46
|
-
- `
|
|
47
|
-
- `
|
|
48
|
-
- `
|
|
49
|
-
- `
|
|
50
|
-
- `
|
|
51
|
-
- `
|
|
52
|
-
- `
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
38
|
-
| `
|
|
39
|
-
| `
|
|
40
|
-
| `
|
|
41
|
-
| `
|
|
42
|
-
| `
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
48
|
-
| `
|
|
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.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "vmware-debug"
|
|
7
|
-
version = "
|
|
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.
|
|
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": "
|
|
10
|
+
"version": "2.0.0",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "pypi",
|
|
14
14
|
"identifier": "vmware-debug",
|
|
15
|
-
"version": "
|
|
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==
|
|
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.
|
|
86
|
-
2. Pass them all to **`
|
|
87
|
-
3. Follow `next_checks` to pull more targeted data; re-run `
|
|
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 → `
|
|
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 `
|
|
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
|
-
| `
|
|
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
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
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 `
|
|
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 `
|
|
164
|
-
and `
|
|
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.** `
|
|
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 `
|
|
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
|
-
`
|
|
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
|
-
`
|
|
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 `
|
|
193
|
+
source, so it agrees with what `grade_case` will actually award.
|
|
194
194
|
|
|
195
195
|
### Mounting a knowledge library
|
|
196
196
|
|
|
197
|
-
`
|
|
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 — `
|
|
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 `
|
|
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
|
-
(`
|
|
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
|
-
- **`
|
|
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
|
-
- **`
|
|
279
|
-
- **`
|
|
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
|
-
`
|
|
296
|
-
`
|
|
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: `
|
|
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
|
{vmware_debug-1.13.2 → vmware_debug-2.0.0}/skills/vmware-debug/references/agent-guardrails.md
RENAMED
|
@@ -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: `
|
|
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" | **`
|
|
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 `
|
|
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
|
-
|
|
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
|
|
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
|
-
| `
|
|
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
|
|
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 `
|
|
46
|
-
vmware-log-insight `
|
|
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 `
|
|
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 `
|
|
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 — `
|
|
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 `
|
|
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 `
|
|
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 (
|
|
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)
|