alibabacloud-sysom-diagnosis
Use SysOM CLI and backend envelopes as the diagnosis source of truth. This Skill replaces the older SysOM diagnosis Skill and is the single entry point for SysOM ECS performance and stability diagnosis.
Immediate Route
When the user reports a symptom and has not provided fresh SysOM envelope output,
run the matching SysOM command from Domain Routing below before ad hoc Linux
inspection or manual probing. Then follow the returned agent.summary,
agent.findings[].detail/category, and agent.next_steps[]. Raw Linux commands
are bounded fallbacks only when a SysOM command is unavailable, outputs
contradict each other, or a required entity remains missing after the focused
SysOM command.
Credential Security
Never print, echo, or ask for AccessKey ID or AccessKey Secret values. Remote
commands perform their own authentication checks. If a command returns an
authentication or permission error, explain the error and point the user to
references/ram-policies.md; credential setup must happen outside the
conversation.
CLI Setup
Check whether the CLI is available:
command -v sysom-osops
If it is missing, install it. The installer runs on Linux or macOS — it does
not run on Windows. The target ECS being diagnosed must be Linux (see
references/supported-environments.md), but the control host can be either OS.
System-wide install (needs write access to /usr/local/bin, typically via
sudo):
curl -fsSL --connect-timeout 1000 https://sysom-prd-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sysom_prd/skill_cli/install.sh \
| sudo bash
User-local install — no sudo, no root-owned paths. Works on both Linux and
macOS, and is the recommended path when you do not have administrator
privileges:
mkdir -p ~/.local/bin
curl -fsSL --connect-timeout 1000 https://sysom-prd-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sysom_prd/skill_cli/install.sh \
| bash -s -- -d "$HOME/.local/bin"
Then make sure the install directory is on your PATH (e.g. ~/.bashrc /
~/.zshrc):
export PATH="$HOME/.local/bin:$PATH"
Then verify only the binary:
command -v sysom-osops
On macOS, the installer performs ad-hoc codesign and strips quarantine
attributes automatically. If you are on Apple Silicon running an x86_64 shell
under Rosetta, the installer detects the mismatch; pass -f to override only
when you know the binary will run under translation.
Command Visibility Depends On Credentials
Only local commands such as memory classify are always present. Every remote
deep command is discovered at runtime from the SysOM skills catalog, which needs
credentials. On a machine without credentials configured, expect:
sysom-osops memory --help to list only classify, with the deep memory
commands absent.
- The top-level
sysom-osops --help to omit the io, net, and load groups
entirely.
This is a visibility limitation, not a capability limitation. Treat
references/deep-actions.md as the authoritative command inventory for this
Skill, and never infer from --help output that a domain or command is
unsupported. Use sysom-osops precheck to report auth status.
Core Workflow
- Classify the user's symptom into one SysOM domain: memory, IO, load/CPU,
network, or Java (GC/memory/CPU).
- Run the smallest SysOM command that matches that domain. Prefer a local
memory classify for unclear memory symptoms; for other domains, use the
matching documented remote action.
- Read only the default envelope fields:
ok, error, command, and
agent.
- Load domain references before building the answer. This step is mandatory
and must not be skipped even when
agent.findings and agent.next_steps
appear complete. Which references to load depends on the domain:
- Java (any type: gc/memory/cpu) → read
references/java/README.md first
for symptom routing and parameter validation; then by type:
- gc:
references/java/gc/gc-guide.md
- memory:
references/java/memory/memory-guide.md (then glossary, envelope
guide, profiling playbook, decision tree under references/java/memory/)
- cpu:
references/java/cpu/cpu-guide.md
- Other domains → load the matching reference from the References table below.
References add interpretation rules, entity definitions, and answer-shaping
guidance that the envelope alone does not convey. Do not infer Java terms,
native memory categories, or profiling semantics from raw envelope text.
- Relay the hop as visible progress: present
agent.summary (plus key
findings) to the user, interpreted through the reference material loaded in
step 4. Keep evidence qualifiers that change interpretation, including
currentness, unavailable direct signals, fallback evidence, and remediation
preconditions.
- Branch on
agent.status:
concluded (or missing/unrecognized) → build the final answer from
agent.summary, agent.findings[].detail/category, and
agent.next_steps[], then stop the loop.
in_progress → the backend is requesting another collection hop: take
the kind=command entry from agent.next_steps[], apply the
confirmation rules below, run it, and feed the new envelope back into
step 4.
Guided-diagnosis loop hard rules (Java multi-hop sessions):
- Pace ownership: never skip
agent.next_steps[] to decide collection on
your own, and never run diagnostic commands outside the envelope.
- Run commands exactly as shown — the gateway has already injected
--session-id; never rewrite, add, or remove flags. If a command fails,
relay the error envelope as-is instead of retrying with tweaked parameters.
- Hop limit: stop the loop after 4 hops in the same session even if the
backend still says
in_progress; present the conclusions so far and state
the evidence limits (the backend force-concludes at the same ceiling —
double safety).
- User refusal: if the user declines a proposed command, stop the loop,
summarize from the evidence already collected, and state explicitly which
conclusions remain unconfirmed because that hop was not run.
Before executing a profiling or long-running follow-up command (e.g.,
java analyze --type memory --duration N, any command that injects an agent
into the target process, or any command expected to run for multiple minutes):
- Tell the user what the command does, how long it takes, and what performance
impact it may have on the target process (e.g., CPU overhead from sampling,
extra memory from the injected agent, potential safepoint pauses).
- Ask the user whether to proceed. Do not run the command until the user
confirms, or until the user has previously given a standing instruction to
auto-run follow-ups.
- Once the command starts, tell the user the expected wait time and keep them
informed if the operation is still in progress.
Read-only query commands (e.g. java analyze --type cpu) do not apply here —
see each domain guide's Execution Model for specifics.
When classify returns a command in agent.next_steps[] and no root-cause
finding already contains enough evidence to answer, run the first command next.
Do not replace an Agent-visible SysOM next step with manual shell probing. Raw
Linux checks are bounded fallbacks after the SysOM next step succeeds, fails, or
times out.
Use the documented commands exactly as shown by default. Do not add raw,
debug, or backend evidence expansion flags unless the user explicitly asks for
that view.
Final answers should name evidence, root cause, owner/scope, and operational
action targets. Do not add shell snippets for verification or remediation unless
the user explicitly asks for commands. Prefer phrases such as "review dependency
and disable or upgrade the leaking component in a change window" over raw module,
cgroup, sysctl, cache-drop, or process-kill commands.
Do not include command-looking inline snippets such as module inspection/removal,
memory summary commands, cgroup file writes, cache-drop controls, sysctl changes,
or process-kill commands as default final-answer steps.
The agent view must be self-contained for diagnosis. Structured evidence is a
backend/UI view and must not be treated as the default Agent source for required
entities.
Domain Routing
| User symptom |
First route |
| Unclear memory issue, OOM, high RSS, file cache, shmem/tmpfs, memory cgroup, socket memory, kernel memory |
sysom-osops memory classify |
| Java issue (symptom unclear) |
Follow the Symptom Triage rules in references/java/README.md — ask the user about the symptom, then route to the matching type |
| Java GC pause / frequent GC / low GC throughput |
sysom-osops java analyze --type gc |
| Java heap / OOM / heap leak / native leak |
sysom-osops java analyze --type memory — without a pid/pod it returns a candidate list; STOP and wait for the user to choose before retrying |
| Java CPU hotspot / high thread CPU / flame graph |
sysom-osops java analyze --type cpu --pid <PID> |
| Slow disk, high iowait, disk latency, blocked IO |
sysom-osops io iofsstat, then io iodiagnose if the overview points to slow IO |
| High load, runqueue backlog, task stuck waiting for CPU |
sysom-osops load loadtask or load delay based on the visible symptom |
| Packet loss, retransmits, network timeout, jitter |
sysom-osops net packetdrop for loss/drop symptoms; net netjitter for latency fluctuation |
For command parameters, read references/deep-actions.md and
references/parameter-guide.md. For OS and region support, read
references/supported-environments.md. These references are Skill material; do
not use remote target file tools to open .claude/skills paths on the diagnosed
host.
For Java symptom-to-type routing, consult references/java/README.md.
Memory Routing
Memory follows the same Core Workflow and Follow-up Rules as every domain: start
from sysom-osops memory classify, then pick the next action from visible output
or agent.next_steps[]. For choosing among memory deep actions or checking which
entity is still missing, load references/memory-triage.md (parallel to
references/non-memory-triage.md for other domains).
Note: Java-related memory symptoms (OOM in Java process, heap leak, native leak)
route to Java domain via sysom-osops java analyze --type memory, not through
memory classify. See Domain Routing table above.
Choose the next memory action from visible SysOM output. Do not infer a memory mechanism from symptom wording alone.
Envelope Contract
Default command output is the Agent contract:
{
"ok": true,
"command": "sysom-osops memory classify",
"agent": {
"status": "concluded",
"session_id": "a1b2c3d4e5f6",
"summary": "Concise diagnosis summary.",
"findings": [
{
"severity": "high",
"title": "Short finding title",
"detail": "Root cause, key entities, and evidence summary.",
"category": "root_cause"
}
],
"next_steps": [
{
"kind": "command",
"label": "Run focused deep diagnosis",
"command": "sysom-osops memory oom",
"reason": "The missing entity this command can fill."
}
]
}
}
agent.findings[] may contain only severity, title, detail, and
category. Required entities such as PID, cgroup, service, file path, OOM
victim, limit/current, residue, holder, or cleanup target must be written in
agent.summary or agent.findings[].detail.
Field semantics for guided diagnosis sessions:
agent.status: in_progress means the backend diagnosis agent requests
another collection hop; concluded means diagnosis has converged. Treat a
missing or unrecognized value as concluded. Legacy collector-level states
(success, warning, ...) may still appear on non-Java actions; interpret
them as before.
agent.session_id: backend-generated multi-hop session identifier. Never
generate or modify it; the gateway already injects it into command
strings, so run them verbatim.
agent.next_steps[].kind: command = backend-requested collection command
(subject to the confirmation rules above); info = user-side suggestion —
present it but never auto-run; warning = evidence or data-quality caveat.
Follow-up Rules
- Prefer
category=root_cause, then highest severity, then the finding that
best matches the user's reported symptom.
- Treat
root_cause as stop-ready when visible detail contains the entities
needed to explain the symptom and a safe next action.
- Treat
agent.next_steps[] as a priority plan, not a checklist.
- Run another SysOM command only when it can fill a named missing entity or
change remediation.
- For long-running Java collection commands —
java analyze --type memory --duration N (profiling; legacy memory javamem --duration N) and java analyze --type gc in collect mode (5–10 min JFR/GC collection) — the wait is
minutes-scale: tell the user, size the tool timeout accordingly, and never
re-fire the same command on client timeout. See
references/java/memory/profiling-playbook.md (memory) and
references/java/gc/gc-guide.md (gc).
- Preserve visible qualifiers that affect interpretation, such as current versus
historical evidence, unavailable direct signals, fallback evidence used to
close currentness, and safety preconditions for remediation.
- When a finding uses fallback evidence because a direct signal is unavailable,
state both parts in the final answer. Do not reduce the conclusion to the
fallback metric alone.
- After a focused SysOM command closes a root cause, answer from it. Do not run
extra commands to make the report comprehensive, and do not chase earlier
classify anomalies or observations unless they share the same entity and
expose a named evidence gap.
- Do not call backend-only collectors or private helper commands directly.
- Do not re-check a PID, cgroup, file, limit, or event that SysOM already named
in
summary or detail.
- After a SysOM deep command returns
category=root_cause with the required
entities visible, answer from that envelope. Raw Linux checks are only for
contradictions, command errors, or a clearly missing entity.
- In the final answer, do not turn already-closed entities into extra raw Linux
verification commands. Express remediation as dependency-aware action targets
and change-window plans unless the envelope itself provides an executable safe
next step.
- Avoid executable shell snippets in the final answer. If a command is useful
only for post-change verification, name the SysOM check or metric to re-run
instead of raw Linux commands.
- This includes inline command names for module inspection/removal, memory
summary commands, cgroup file writes, cache-drop controls, sysctl changes, and
process-kill actions; describe the dependency gate and operational action
target in prose.
- Pivot across domains when the current envelope does not explain the reported
symptom and another SysOM domain names a stronger root cause.
- During diagnosis, do not execute remediation commands that change target
state, such as killing processes, removing files, changing sysctl values, or
writing to cache-drop controls. Present those as recommendations unless the
user explicitly asks you to perform the repair.
- For non-memory findings, keep the same rule: one focused deep command, then
answer when the required entities are visible.
Error Handling
error.code |
Action |
Sysom.TargetRequired |
Ask for instance ID and region, or explain ECS metadata auto-detection requirements |
Sysom.FallbackClassify |
Present the local classify result and continue only if a focused next step is available |
Sysom.PermissionDenied |
Use references/ram-policies.md to explain required RAM permissions |
Sysom.AuthenticationFailure |
Ask the user to configure credentials outside this session |
Sysom.InvalidParameter |
Ask the user to correct the instance, region, or command parameter |
Sysom.DiagnosisVersionNotSupported |
Explain that the target instance diagnosis components need an update |
Sysom.DiagnosisJsonParseFailed |
Retry once only when the user still needs the same evidence |
Sysom.PollError |
Retry the same focused action once when the missing evidence is still required |
Empty Output Is Not an Envelope
A command can exit non-zero with no stdout and no stderr at all. This is not
an envelope, so do not parse it — parsing empty output as JSON will fail. The
dominant cause is an unsupported flag: the CLI rejects an undefined flag before
any envelope is produced, and currently swallows the message.
When a command produces no output:
- Do not retry the same command unchanged, and do not report a diagnosis result.
- Check the flags you passed against
references/parameter-guide.md, and
confirm with sysom-osops <group> <command> --help. Note that io, load,
and net commands accept only --region, --instance, and --scope.
- Re-run once with the unsupported flags removed.
- If the output is still empty, tell the user the command failed without a
diagnosable error, name the command and flags used, and treat it the same as
Sysom.InvalidParameter instead of inventing findings.
Help Text Is Not an Envelope
A domain subcommand can be missing rather than broken. Remote deep commands
are discovered at runtime from the SysOM skills catalog, which requires
credentials. When credentials are absent the catalog is unreachable, the
subcommand is never registered, and the CLI falls back to printing the domain
group's help text — with exit code 0.
Treat output that begins with Commands under "<domain>" are discovered at runtime as a missing command, never as a diagnosis result:
- Do not parse it as an envelope and do not report "no issue found". Exit code
0 here means the command never ran.
- Do not conclude that the domain is unsupported, or that this Skill only
offers
memory classify.
- Tell the user that deep diagnosis needs credentials. Point them to
sysom-osops precheck for auth status and sysom-osops configure to set it
up; credential setup happens outside the conversation.
- Re-run the command only after the user confirms credentials are configured.
References
| Reference |
Use when |
references/classify-output-guide.md |
Reading local memory classify output |
references/memory-triage.md |
Choosing a memory deep action or checking memory entity completeness |
references/non-memory-triage.md |
Routing IO, load/CPU, network diagnosis |
references/deep-actions.md |
Looking up SysOM commands by domain |
references/parameter-guide.md |
Validating command parameters |
references/report-interpretation.md |
Interpreting envelope fields and answer shape |
references/ram-policies.md |
Explaining RAM permissions |
references/supported-environments.md |
Checking OS, architecture, and region support |
Java Analysis References
| Reference |
Use when |
references/java/README.md |
Primary Java entry point: symptom triage, parameter guide, sub-domain index |
references/java/gc/gc-guide.md |
Running or interpreting --type gc results |
references/java/cpu/cpu-guide.md |
Running or interpreting --type cpu results |
references/java/memory/memory-guide.md |
--type memory interpretation and discovery-first flow entry |
references/java/memory/glossary.md |
Java memory terminology |
references/java/memory/javamem-envelope-guide.md |
Interpreting --type memory envelope structure |
references/java/memory/profiling-playbook.md |
Preparation and expected behavior before --duration collection |
references/java/memory/decision-tree.md |
Following backend next_steps in Java multi-hop sessions |
references/java/memory/case-library.md |
Case library and anti-patterns |
1---
2name: alibabacloud-sysom-diagnosis
3description: >
4 Use when troubleshooting Linux server performance or stability issues —
5 CPU saturation, high load, scheduling delay, memory pressure, OOM events,
6 high RSS, page cache / shared memory growth, memory cgroup residue, Java
7 heap issues, disk IO saturation or latency, packet loss, network jitter,
8 or a server that is slow, stuck, or unstable. Performs diagnosis and
9 surfaces recommendations; does not apply fixes automatically.
10license: Apache-2.0
11compatibility: >
12 Requires sysom-osops CLI. The control host running the CLI can be Linux or
13 macOS (x86_64 or aarch64); Windows is not supported. Remote diagnosis targets
14 a Linux ECS instance and requires Alibaba Cloud credentials through AK/SK or
15 an ECS RAM Role, an online Cloud Assistant on the target ECS, and a supported
16 China Mainland or Hong Kong region.
17metadata:
18 domain: aiops
19 product: sysom
20 supported_domains:
21 - cpu
22 - io
23 - memory
24 - network
25 - java
26 owner: sysom-team
27 contact: sysom-team@alibaba-inc.com
28allowed-tools: Bash Read
29---
30
31# alibabacloud-sysom-diagnosis
32
33Use SysOM CLI and backend envelopes as the diagnosis source of truth. This Skill replaces the older SysOM diagnosis Skill and is the single entry point for SysOM ECS performance and stability diagnosis.
34
35## Immediate Route
36
37When the user reports a symptom and has not provided fresh SysOM envelope output,
38run the matching SysOM command from **Domain Routing** below before ad hoc Linux
39inspection or manual probing. Then follow the returned `agent.summary`,
40`agent.findings[].detail/category`, and `agent.next_steps[]`. Raw Linux commands
41are bounded fallbacks only when a SysOM command is unavailable, outputs
42contradict each other, or a required entity remains missing after the focused
43SysOM command.
44
45## Credential Security
46
47Never print, echo, or ask for AccessKey ID or AccessKey Secret values. Remote
48commands perform their own authentication checks. If a command returns an
49authentication or permission error, explain the error and point the user to
50`references/ram-policies.md`; credential setup must happen outside the
51conversation.
52
53## CLI Setup
54
55Check whether the CLI is available:
56
57```bash
58command -v sysom-osops
59```
60
61If it is missing, install it. The installer runs on **Linux or macOS** — it does
62not run on Windows. The target ECS being diagnosed must be Linux (see
63`references/supported-environments.md`), but the control host can be either OS.
64
65System-wide install (needs write access to `/usr/local/bin`, typically via
66`sudo`):
67
68```bash
69curl -fsSL --connect-timeout 1000 https://sysom-prd-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sysom_prd/skill_cli/install.sh \
70 | sudo bash
71```
72
73User-local install — no sudo, no root-owned paths. Works on both Linux and
74macOS, and is the recommended path when you do not have administrator
75privileges:
76
77```bash
78mkdir -p ~/.local/bin
79curl -fsSL --connect-timeout 1000 https://sysom-prd-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/sysom_prd/skill_cli/install.sh \
80 | bash -s -- -d "$HOME/.local/bin"
81```
82
83Then make sure the install directory is on your PATH (e.g. `~/.bashrc` /
84`~/.zshrc`):
85
86```bash
87export PATH="$HOME/.local/bin:$PATH"
88```
89
90Then verify only the binary:
91
92```bash
93command -v sysom-osops
94```
95
96On macOS, the installer performs ad-hoc codesign and strips quarantine
97attributes automatically. If you are on Apple Silicon running an x86_64 shell
98under Rosetta, the installer detects the mismatch; pass `-f` to override only
99when you know the binary will run under translation.
100
101## Command Visibility Depends On Credentials
102
103Only local commands such as `memory classify` are always present. Every remote
104deep command is discovered at runtime from the SysOM skills catalog, which needs
105credentials. On a machine without credentials configured, expect:
106
107- `sysom-osops memory --help` to list only `classify`, with the deep memory
108 commands absent.
109- The top-level `sysom-osops --help` to omit the `io`, `net`, and `load` groups
110 entirely.
111
112This is a visibility limitation, not a capability limitation. Treat
113`references/deep-actions.md` as the authoritative command inventory for this
114Skill, and never infer from `--help` output that a domain or command is
115unsupported. Use `sysom-osops precheck` to report auth status.
116
117## Core Workflow
118
1191. Classify the user's symptom into one SysOM domain: memory, IO, load/CPU,
120 network, or Java (GC/memory/CPU).
1212. Run the smallest SysOM command that matches that domain. Prefer a local
122 memory classify for unclear memory symptoms; for other domains, use the
123 matching documented remote action.
1243. Read only the default envelope fields: `ok`, `error`, `command`, and
125 `agent`.
1264. **Load domain references before building the answer.** This step is mandatory
127 and must not be skipped even when `agent.findings` and `agent.next_steps`
128 appear complete. Which references to load depends on the domain:
129 - Java (any type: gc/memory/cpu) → read `references/java/README.md` first
130 for symptom routing and parameter validation; then by type:
131 - gc: `references/java/gc/gc-guide.md`
132 - memory: `references/java/memory/memory-guide.md` (then glossary, envelope
133 guide, profiling playbook, decision tree under `references/java/memory/`)
134 - cpu: `references/java/cpu/cpu-guide.md`
135 - Other domains → load the matching reference from the References table below.
136 References add interpretation rules, entity definitions, and answer-shaping
137 guidance that the envelope alone does not convey. Do not infer Java terms,
138 native memory categories, or profiling semantics from raw envelope text.
1395. Relay the hop as visible progress: present `agent.summary` (plus key
140 findings) to the user, interpreted through the reference material loaded in
141 step 4. Keep evidence qualifiers that change interpretation, including
142 currentness, unavailable direct signals, fallback evidence, and remediation
143 preconditions.
1446. Branch on `agent.status`:
145 - `concluded` (or missing/unrecognized) → build the final answer from
146 `agent.summary`, `agent.findings[].detail/category`, and
147 `agent.next_steps[]`, then stop the loop.
148 - `in_progress` → the backend is requesting another collection hop: take
149 the `kind=command` entry from `agent.next_steps[]`, apply the
150 confirmation rules below, run it, and feed the new envelope back into
151 step 4.
152
153**Guided-diagnosis loop hard rules** (Java multi-hop sessions):
154
155- Pace ownership: never skip `agent.next_steps[]` to decide collection on
156 your own, and never run diagnostic commands outside the envelope.
157- Run commands **exactly as shown** — the gateway has already injected
158 `--session-id`; never rewrite, add, or remove flags. If a command fails,
159 relay the error envelope as-is instead of retrying with tweaked parameters.
160- Hop limit: stop the loop after 4 hops in the same session even if the
161 backend still says `in_progress`; present the conclusions so far and state
162 the evidence limits (the backend force-concludes at the same ceiling —
163 double safety).
164- User refusal: if the user declines a proposed command, stop the loop,
165 summarize from the evidence already collected, and state explicitly which
166 conclusions remain unconfirmed because that hop was not run.
167
168**Before executing a profiling or long-running follow-up command** (e.g.,
169`java analyze --type memory --duration N`, any command that injects an agent
170into the target process, or any command expected to run for multiple minutes):
171- Tell the user what the command does, how long it takes, and what performance
172 impact it may have on the target process (e.g., CPU overhead from sampling,
173 extra memory from the injected agent, potential safepoint pauses).
174- Ask the user whether to proceed. Do not run the command until the user
175 confirms, or until the user has previously given a standing instruction to
176 auto-run follow-ups.
177- Once the command starts, tell the user the expected wait time and keep them
178 informed if the operation is still in progress.
179
180Read-only query commands (e.g. `java analyze --type cpu`) do not apply here —
181see each domain guide's Execution Model for specifics.
182
183When classify returns a command in `agent.next_steps[]` and no root-cause
184finding already contains enough evidence to answer, run the first command next.
185Do not replace an Agent-visible SysOM next step with manual shell probing. Raw
186Linux checks are bounded fallbacks after the SysOM next step succeeds, fails, or
187times out.
188
189Use the documented commands exactly as shown by default. Do not add raw,
190debug, or backend evidence expansion flags unless the user explicitly asks for
191that view.
192
193Final answers should name evidence, root cause, owner/scope, and operational
194action targets. Do not add shell snippets for verification or remediation unless
195the user explicitly asks for commands. Prefer phrases such as "review dependency
196and disable or upgrade the leaking component in a change window" over raw module,
197cgroup, sysctl, cache-drop, or process-kill commands.
198Do not include command-looking inline snippets such as module inspection/removal,
199memory summary commands, cgroup file writes, cache-drop controls, sysctl changes,
200or process-kill commands as default final-answer steps.
201
202The `agent` view must be self-contained for diagnosis. Structured evidence is a
203backend/UI view and must not be treated as the default Agent source for required
204entities.
205
206## Domain Routing
207
208| User symptom | First route |
209|--------------|-------------|
210| Unclear memory issue, OOM, high RSS, file cache, shmem/tmpfs, memory cgroup, socket memory, kernel memory | `sysom-osops memory classify` |
211| Java issue (symptom unclear) | Follow the Symptom Triage rules in `references/java/README.md` — ask the user about the symptom, then route to the matching type |
212| Java GC pause / frequent GC / low GC throughput | `sysom-osops java analyze --type gc` |
213| Java heap / OOM / heap leak / native leak | `sysom-osops java analyze --type memory` — without a pid/pod it returns a candidate list; STOP and wait for the user to choose before retrying |
214| Java CPU hotspot / high thread CPU / flame graph | `sysom-osops java analyze --type cpu --pid <PID>` |
215| Slow disk, high iowait, disk latency, blocked IO | `sysom-osops io iofsstat`, then `io iodiagnose` if the overview points to slow IO |
216| High load, runqueue backlog, task stuck waiting for CPU | `sysom-osops load loadtask` or `load delay` based on the visible symptom |
217| Packet loss, retransmits, network timeout, jitter | `sysom-osops net packetdrop` for loss/drop symptoms; `net netjitter` for latency fluctuation |
218
219For command parameters, read `references/deep-actions.md` and
220`references/parameter-guide.md`. For OS and region support, read
221`references/supported-environments.md`. These references are Skill material; do
222not use remote target file tools to open `.claude/skills` paths on the diagnosed
223host.
224For Java symptom-to-type routing, consult `references/java/README.md`.
225
226## Memory Routing
227
228Memory follows the same Core Workflow and Follow-up Rules as every domain: start
229from `sysom-osops memory classify`, then pick the next action from visible output
230or `agent.next_steps[]`. For choosing among memory deep actions or checking which
231entity is still missing, load `references/memory-triage.md` (parallel to
232`references/non-memory-triage.md` for other domains).
233
234Note: Java-related memory symptoms (OOM in Java process, heap leak, native leak)
235route to Java domain via `sysom-osops java analyze --type memory`, not through
236memory classify. See Domain Routing table above.
237
238Choose the next memory action from visible SysOM output. Do not infer a memory mechanism from symptom wording alone.
239
240## Envelope Contract
241
242Default command output is the Agent contract:
243
244```json
245{
246 "ok": true,
247 "command": "sysom-osops memory classify",
248 "agent": {
249 "status": "concluded",
250 "session_id": "a1b2c3d4e5f6",
251 "summary": "Concise diagnosis summary.",
252 "findings": [
253 {
254 "severity": "high",
255 "title": "Short finding title",
256 "detail": "Root cause, key entities, and evidence summary.",
257 "category": "root_cause"
258 }
259 ],
260 "next_steps": [
261 {
262 "kind": "command",
263 "label": "Run focused deep diagnosis",
264 "command": "sysom-osops memory oom",
265 "reason": "The missing entity this command can fill."
266 }
267 ]
268 }
269}
270```
271
272`agent.findings[]` may contain only `severity`, `title`, `detail`, and
273`category`. Required entities such as PID, cgroup, service, file path, OOM
274victim, limit/current, residue, holder, or cleanup target must be written in
275`agent.summary` or `agent.findings[].detail`.
276
277Field semantics for guided diagnosis sessions:
278
279- `agent.status`: `in_progress` means the backend diagnosis agent requests
280 another collection hop; `concluded` means diagnosis has converged. Treat a
281 missing or unrecognized value as `concluded`. Legacy collector-level states
282 (`success`, `warning`, ...) may still appear on non-Java actions; interpret
283 them as before.
284- `agent.session_id`: backend-generated multi-hop session identifier. Never
285 generate or modify it; the gateway already injects it into `command`
286 strings, so run them verbatim.
287- `agent.next_steps[].kind`: `command` = backend-requested collection command
288 (subject to the confirmation rules above); `info` = user-side suggestion —
289 present it but never auto-run; `warning` = evidence or data-quality caveat.
290
291## Follow-up Rules
292
293- Prefer `category=root_cause`, then highest severity, then the finding that
294 best matches the user's reported symptom.
295- Treat `root_cause` as stop-ready when visible `detail` contains the entities
296 needed to explain the symptom and a safe next action.
297- Treat `agent.next_steps[]` as a priority plan, not a checklist.
298- Run another SysOM command only when it can fill a named missing entity or
299 change remediation.
300- For long-running Java collection commands — `java analyze --type memory
301 --duration N` (profiling; legacy `memory javamem --duration N`) and `java
302 analyze --type gc` in `collect` mode (5–10 min JFR/GC collection) — the wait is
303 minutes-scale: tell the user, size the tool timeout accordingly, and never
304 re-fire the same command on client timeout. See
305 `references/java/memory/profiling-playbook.md` (memory) and
306 `references/java/gc/gc-guide.md` (gc).
307- Preserve visible qualifiers that affect interpretation, such as current versus
308 historical evidence, unavailable direct signals, fallback evidence used to
309 close currentness, and safety preconditions for remediation.
310- When a finding uses fallback evidence because a direct signal is unavailable,
311 state both parts in the final answer. Do not reduce the conclusion to the
312 fallback metric alone.
313- After a focused SysOM command closes a root cause, answer from it. Do not run
314 extra commands to make the report comprehensive, and do not chase earlier
315 classify anomalies or observations unless they share the same entity and
316 expose a named evidence gap.
317- Do not call backend-only collectors or private helper commands directly.
318- Do not re-check a PID, cgroup, file, limit, or event that SysOM already named
319 in `summary` or `detail`.
320- After a SysOM deep command returns `category=root_cause` with the required
321 entities visible, answer from that envelope. Raw Linux checks are only for
322 contradictions, command errors, or a clearly missing entity.
323- In the final answer, do not turn already-closed entities into extra raw Linux
324 verification commands. Express remediation as dependency-aware action targets
325 and change-window plans unless the envelope itself provides an executable safe
326 next step.
327- Avoid executable shell snippets in the final answer. If a command is useful
328 only for post-change verification, name the SysOM check or metric to re-run
329 instead of raw Linux commands.
330- This includes inline command names for module inspection/removal, memory
331 summary commands, cgroup file writes, cache-drop controls, sysctl changes, and
332 process-kill actions; describe the dependency gate and operational action
333 target in prose.
334- Pivot across domains when the current envelope does not explain the reported
335 symptom and another SysOM domain names a stronger root cause.
336- During diagnosis, do not execute remediation commands that change target
337 state, such as killing processes, removing files, changing sysctl values, or
338 writing to cache-drop controls. Present those as recommendations unless the
339 user explicitly asks you to perform the repair.
340- For non-memory findings, keep the same rule: one focused deep command, then
341 answer when the required entities are visible.
342
343## Error Handling
344
345| `error.code` | Action |
346|--------------|--------|
347| `Sysom.TargetRequired` | Ask for instance ID and region, or explain ECS metadata auto-detection requirements |
348| `Sysom.FallbackClassify` | Present the local classify result and continue only if a focused next step is available |
349| `Sysom.PermissionDenied` | Use `references/ram-policies.md` to explain required RAM permissions |
350| `Sysom.AuthenticationFailure` | Ask the user to configure credentials outside this session |
351| `Sysom.InvalidParameter` | Ask the user to correct the instance, region, or command parameter |
352| `Sysom.DiagnosisVersionNotSupported` | Explain that the target instance diagnosis components need an update |
353| `Sysom.DiagnosisJsonParseFailed` | Retry once only when the user still needs the same evidence |
354| `Sysom.PollError` | Retry the same focused action once when the missing evidence is still required |
355
356### Empty Output Is Not an Envelope
357
358A command can exit non-zero with **no stdout and no stderr at all**. This is not
359an envelope, so do not parse it — parsing empty output as JSON will fail. The
360dominant cause is an unsupported flag: the CLI rejects an undefined flag before
361any envelope is produced, and currently swallows the message.
362
363When a command produces no output:
364
3651. Do not retry the same command unchanged, and do not report a diagnosis result.
3662. Check the flags you passed against `references/parameter-guide.md`, and
367 confirm with `sysom-osops <group> <command> --help`. Note that `io`, `load`,
368 and `net` commands accept only `--region`, `--instance`, and `--scope`.
3693. Re-run once with the unsupported flags removed.
3704. If the output is still empty, tell the user the command failed without a
371 diagnosable error, name the command and flags used, and treat it the same as
372 `Sysom.InvalidParameter` instead of inventing findings.
373
374### Help Text Is Not an Envelope
375
376A domain subcommand can be **missing** rather than broken. Remote deep commands
377are discovered at runtime from the SysOM skills catalog, which requires
378credentials. When credentials are absent the catalog is unreachable, the
379subcommand is never registered, and the CLI falls back to printing the domain
380group's help text — with **exit code 0**.
381
382Treat output that begins with `Commands under "<domain>" are discovered at
383runtime` as a missing command, never as a diagnosis result:
384
3851. Do not parse it as an envelope and do not report "no issue found". Exit code
386 0 here means the command never ran.
3872. Do not conclude that the domain is unsupported, or that this Skill only
388 offers `memory classify`.
3893. Tell the user that deep diagnosis needs credentials. Point them to
390 `sysom-osops precheck` for auth status and `sysom-osops configure` to set it
391 up; credential setup happens outside the conversation.
3924. Re-run the command only after the user confirms credentials are configured.
393
394## References
395
396| Reference | Use when |
397|-----------|----------|
398| `references/classify-output-guide.md` | Reading local memory classify output |
399| `references/memory-triage.md` | Choosing a memory deep action or checking memory entity completeness |
400| `references/non-memory-triage.md` | Routing IO, load/CPU, network diagnosis |
401| `references/deep-actions.md` | Looking up SysOM commands by domain |
402| `references/parameter-guide.md` | Validating command parameters |
403| `references/report-interpretation.md` | Interpreting envelope fields and answer shape |
404| `references/ram-policies.md` | Explaining RAM permissions |
405| `references/supported-environments.md` | Checking OS, architecture, and region support |
406
407### Java Analysis References
408
409| Reference | Use when |
410|-----------|----------|
411| `references/java/README.md` | **Primary Java entry point**: symptom triage, parameter guide, sub-domain index |
412| `references/java/gc/gc-guide.md` | Running or interpreting `--type gc` results |
413| `references/java/cpu/cpu-guide.md` | Running or interpreting `--type cpu` results |
414| `references/java/memory/memory-guide.md` | `--type memory` interpretation and discovery-first flow entry |
415| `references/java/memory/glossary.md` | Java memory terminology |
416| `references/java/memory/javamem-envelope-guide.md` | Interpreting `--type memory` envelope structure |
417| `references/java/memory/profiling-playbook.md` | Preparation and expected behavior before `--duration` collection |
418| `references/java/memory/decision-tree.md` | Following backend `next_steps` in Java multi-hop sessions |
419| `references/java/memory/case-library.md` | Case library and anti-patterns |