SOC 직업 분류 기준
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill xwave명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
| name | xwave |
| description | > Use when this capability is needed. |
This skill is for AI agents using xwave ai ... as a structured waveform fact API. Prefer the AI JSON entry point over the human CLI whenever you need machine-readable output, deterministic errors, or multi-step debug evidence.
Human-oriented legacy CLI details were moved to references/cli-reference.md. Load that file only when the user explicitly asks about non-AI command syntax.
Use one of these forms:
tools/xwave-env ai query request.json
tools/xwave-env ai query -
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"value.at","target":{"fsdb":"waves.fsdb","auto_open":true},"args":{"signal":"top.clk","time":"10ns"}}'
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"cursor.set","target":{"session_id":"case_a"},"args":{"name":"deadlock","time":"120340ns","note":"stall start"}}'
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"value.at","target":{"session_id":"case_a"},"args":{"signal":"top.ready","at":"@deadlock-20ns","format":"hex"}}'
tools/xwave-env ai schema
tools/xwave-env ai actions
Important: xwave ai query defaults to compact output. Compact output deliberately omits tool, session, empty warnings, empty suggested_next_actions, and meta.elapsed_ms. Do not assume those fields exist unless you request them.
Use compact for normal AI workflows:
{"output":{"verbosity":"compact"}}
Use full when maintaining older scripts or discovering exact response fields:
{"output":{"verbosity":"full"}}
Use debug when diagnosing session/daemon/socket/FSDB fingerprint issues:
{"output":{"verbosity":"debug"}}
Errors still include structured error.code/message, and non-empty recovery hints remain present in compact output.
AI value objects are intentionally minimal everywhere: {"value":"...", "known":true|false}. Do not expect text, bits, hex, unsigned, signed, or unknown_reason; choose the string representation with request format.
For scripted extraction, pipe JSON output into python3 instead of parsing human text. This is the recommended way for AI agents to pull specific fields or compute custom statistics:
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"session.list"}' \
| python3 -c 'import json,sys; d=json.load(sys.stdin); print(d["ok"], d.get("summary", {}))'
For larger summaries, keep the xwave query bounded and do the aggregation in Python:
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"event.export","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && !ready","time_range":{"begin":"0ns","end":"100us"}},"limits":{"max_rows":1000}}' \
| python3 -c 'import json,sys; d=json.load(sys.stdin); rows=d.get("data",{}).get("events",[]); print(len(rows))'
For event counts or grouped counts, prefer built-in aggregation over exporting all rows:
tools/xwave-env ai query --json '{"api_version":"xwave.ai.v1","action":"event.export","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && ready","time_range":{"begin":"0ns","end":"100us"},"aggregate":{"count":true,"group_by":["qid"],"events":false}}}'
Request envelope:
{
"api_version": "xwave.ai.v1",
"request_id": "optional-id",
"action": "value.at",
"target": {
"fsdb": "/path/to/waves.fsdb",
"auto_open": true
},
"args": {},
"limits": {
"max_rows": 1000,
"max_events": 1000,
"max_samples": 1000000
},
"output": {
"verbosity": "compact"
}
}
Response envelope always contains:
compact: ok/action plus non-empty summary/data/findings/error/suggested_next_actions/meta.truncated
full/debug: ok/action/session/summary/data/findings/suggested_next_actions/warnings/error/meta
Only ok/action/error and action-specific key data should be treated as always relevant. Field presence depends on output.verbosity; compact output will not include session/meta/tool scaffolding. Field names inside summary, data, and findings are action-specific and may differ by action. Do not guess detailed keys such as latency subfields from memory. For a field dictionary and extraction guidance, see references/ai-response-dictionary.md. For exact fields on a specific build and FSDB, run tools/xwave-env ai schema when available, or issue a small bounded query and inspect the returned JSON before writing extraction code.
AI usage rules:
session.open for repeated work, then use target.session_id as a string.target.fsdb + auto_open:true.ok and error.code; do not parse human text.python3 -c 'import json,sys; ...' pipelines for extracting fields or computing statistics from xwave ai query output.cursor.set after finding an important event time, then use @name, @name-20ns, @name+5ns, @name-10cycle(top.clk), or active cursor forms such as @-10ns in later time fields.cycle(clk) means posedge, and posedge(clk) / negedge(clk) choose the edge explicitly.around/before/after when investigating context around a cursor, for example {"around":"@deadlock","before":"100cycle(top.clk)","after":"20cycle(top.clk)"}.known:false, status:"unknown", and pass:null as inconclusive waveform facts, not failures.scope.list after SIGNAL_NOT_FOUND.limits.max_rows/max_events/max_samples for broad scans.~/.xwave/: registry.json plus sessions/<hashed-session-dir>/session.json, endpoint.json, socket, debug.log, lists.json, apb.json, axi.json, events.json, and cursors.json.args.transport:"tcp" and a reachable bind_host; keep port:0 unless the user explicitly needs a fixed port. The daemon writes the actual auto-assigned TCP port to endpoint.json, so later AI requests still only need .session.openOpen a named session for an FSDB. The session name is required, is the real session id, and is reused by every later target.session_id field. Names may be up to 256 characters and may contain letters, digits, _, ., and -; duplicate names fail. Transport defaults to uds. Use args.transport:"tcp" for TCP; TCP ports are automatically assigned when port is omitted or 0, and the actual endpoint is stored in ~/.xwave/sessions/<hashed-session-dir>/endpoint.json.
{"api_version":"xwave.ai.v1","action":"session.open","target":{"fsdb":"/path/to/waves.fsdb"},"args":{"name":"case_a"}}
{"api_version":"xwave.ai.v1","action":"session.open","target":{"fsdb":"/path/to/waves.fsdb"},"args":{"name":"case_tcp","transport":"tcp","bind_host":"127.0.0.1","port":0}
session.listList known sessions. Use before reusing an existing session.
{"api_version":"xwave.ai.v1","action":"session.list"}
session.doctorCheck daemon, transport endpoint, socket/PID, FSDB fingerprint, and health for a session.
{"api_version":"xwave.ai.v1","action":"session.doctor","target":{"session_id":"case_a"}}
session.gcClean stale or idle sessions.
{"api_version":"xwave.ai.v1","action":"session.gc"}
session.killStop one session or all sessions.
{"api_version":"xwave.ai.v1","action":"session.kill","args":{"id":"all"}}
Cursor actions store named session-local times. Use them when a debug flow has a key event time and later queries need context before or after that point. All later time fields can use @name, @name-20ns, @name+5ns, @name-10cycle(top.clk), @-10ns, or @+5ns.
cursor.setCreate or replace a cursor. The response includes data.resolved_time, so use that as the canonical time for evidence.
{"api_version":"xwave.ai.v1","action":"cursor.set","target":{"session_id":"case_a"},"args":{"name":"deadlock","time":"120340ns","note":"rready stall starts"}}
cursor.getFetch one cursor.
{"api_version":"xwave.ai.v1","action":"cursor.get","target":{"session_id":"case_a"},"args":{"name":"deadlock"}}
cursor.listList cursors and the active cursor.
{"api_version":"xwave.ai.v1","action":"cursor.list","target":{"session_id":"case_a"}}
cursor.useSet the active cursor, enabling short forms such as @-20ns.
{"api_version":"xwave.ai.v1","action":"cursor.use","target":{"session_id":"case_a"},"args":{"name":"deadlock"}}
cursor.deleteDelete a cursor.
{"api_version":"xwave.ai.v1","action":"cursor.delete","target":{"session_id":"case_a"},"args":{"name":"deadlock"}}
scope.listList available FSDB signals under a scope. Use this to recover from missing or ambiguous paths.
{"api_version":"xwave.ai.v1","action":"scope.list","target":{"session_id":"case_a"},"args":{"path":"top.u_dut","recursive":true},"limits":{"max_rows":200}}
value.atRead one signal at one time. Use for point evidence.
{"api_version":"xwave.ai.v1","action":"value.at","target":{"session_id":"case_a"},"args":{"signal":"top.u_dut.ready","at":"@deadlock-20ns","format":"hex"}}
value.batch_atRead many signals at the same time. Prefer this over many value.at calls.
{"api_version":"xwave.ai.v1","action":"value.batch_at","target":{"session_id":"case_a"},"args":{"at":"@deadlock","signals":["top.u_dut.valid","top.u_dut.ready","top.u_dut.fifo_full"],"format":"hex"}}
list.createCreate a named signal list.
{"api_version":"xwave.ai.v1","action":"list.create","target":{"session_id":"case_a"},"args":{"name":"if0"}}
list.addAdd a signal after probing that it exists.
{"api_version":"xwave.ai.v1","action":"list.add","target":{"session_id":"case_a"},"args":{"name":"if0","signal":"top.u_dut.valid"}}
list.deleteRemove by signal path or list index.
{"api_version":"xwave.ai.v1","action":"list.delete","target":{"session_id":"case_a"},"args":{"name":"if0","index":"2"}}
list.showShow list members.
{"api_version":"xwave.ai.v1","action":"list.show","target":{"session_id":"case_a"},"args":{"name":"if0"}}
list.value_atRead all list signals at one time.
{"api_version":"xwave.ai.v1","action":"list.value_at","target":{"session_id":"case_a"},"args":{"name":"if0","time":"42us","format":"binary"}}
list.validateCheck whether every signal in a list exists in the current FSDB.
{"api_version":"xwave.ai.v1","action":"list.validate","target":{"session_id":"case_a"},"args":{"name":"if0"}}
list.diffFind the earliest time where list values are not all equal.
{"api_version":"xwave.ai.v1","action":"list.diff","target":{"session_id":"case_a"},"args":{"name":"if0","begin":"0ns","end":"100us"}}
apb.config.loadLoad and persist an APB config. config_path points to JSON, or config may inline the object.
{"api_version":"xwave.ai.v1","action":"apb.config.load","target":{"session_id":"case_a"},"args":{"name":"apb0","config_path":"apb.json"}}
apb.config.listReturn the saved APB config.
{"api_version":"xwave.ai.v1","action":"apb.config.list","target":{"session_id":"case_a"},"args":{"name":"apb0"}}
apb.queryQuery APB reads or writes. Use direction:"wr" or direction:"rd", with optional address, num, or last.
{"api_version":"xwave.ai.v1","action":"apb.query","target":{"session_id":"case_a"},"args":{"name":"apb0","direction":"wr","address":"0x100","num":1}}
apb.cursorIterate APB transactions with op:"begin", next, pre, or last.
{"api_version":"xwave.ai.v1","action":"apb.cursor","target":{"session_id":"case_a"},"args":{"name":"apb0","op":"begin","direction":"all"}}
apb.transfer_windowReturn APB transactions whose transfer time is inside a time range.
{"api_version":"xwave.ai.v1","action":"apb.transfer_window","target":{"session_id":"case_a"},"args":{"name":"apb0","time_range":{"begin":"40us","end":"45us"},"direction":"all","limit":50}}
axi.config.loadLoad and persist an AXI config. Use a full five-channel config with clk, rst_n, and optional edge.
{"api_version":"xwave.ai.v1","action":"axi.config.load","target":{"session_id":"case_a"},"args":{"name":"axi0","config_path":"axi.json"}}
axi.config.listReturn the saved AXI config.
{"api_version":"xwave.ai.v1","action":"axi.config.list","target":{"session_id":"case_a"},"args":{"name":"axi0"}}
axi.queryQuery AXI reads or writes. Use optional address, id, num, or last.
{"api_version":"xwave.ai.v1","action":"axi.query","target":{"session_id":"case_a"},"args":{"name":"axi0","direction":"rd","id":"0x3","num":1}}
axi.cursorIterate AXI transactions with op:"begin", next, pre, or last.
{"api_version":"xwave.ai.v1","action":"axi.cursor","target":{"session_id":"case_a"},"args":{"name":"axi0","op":"next","direction":"rd"}}
axi.analysisReturn AXI latency or outstanding statistics. Use analysis:"latency" or analysis:"osd" and optional direction or id.
{"api_version":"xwave.ai.v1","action":"axi.analysis","target":{"session_id":"case_a"},"args":{"name":"axi0","analysis":"latency","direction":"all"}}
axi.channel_stallInspect one AXI channel valid/ready stall behavior. Channels: aw, w, b, ar, r.
{"api_version":"xwave.ai.v1","action":"axi.channel_stall","target":{"session_id":"case_a"},"args":{"name":"axi0","channel":"r","time_range":{"begin":"40us","end":"45us"},"rules":{"max_wait_cycles":16}}}
axi.outstanding_timelineReturn outstanding samples over a window. Use for buildup/root-cause evidence.
{"api_version":"xwave.ai.v1","action":"axi.outstanding_timeline","target":{"session_id":"case_a"},"args":{"name":"axi0","time_range":{"begin":"40us","end":"45us"},"direction":"all","limit":100}}
axi.request_response_pairReturn AXI transactions whose request or response time is inside a window.
{"api_version":"xwave.ai.v1","action":"axi.request_response_pair","target":{"session_id":"case_a"},"args":{"name":"axi0","time_range":{"begin":"40us","end":"45us"},"direction":"rd","limit":20}}
axi.latency_outlierReturn transactions with largest request-response latency.
{"api_version":"xwave.ai.v1","action":"axi.latency_outlier","target":{"session_id":"case_a"},"args":{"name":"axi0","time_range":{"begin":"0ns","end":"100us"},"direction":"all","top_n":5,"limit":500}}
event.config.loadLoad and persist a generic event config bound to the current FSDB.
{"api_version":"xwave.ai.v1","action":"event.config.load","target":{"session_id":"case_a"},"args":{"name":"if0","config_path":"if0.event.json"}}
event.config.listList event configs or return one config.
{"api_version":"xwave.ai.v1","action":"event.config.list","target":{"session_id":"case_a"},"args":{"name":"if0"}}
event.findFind the first clock-sampled event matching an expression.
{"api_version":"xwave.ai.v1","action":"event.find","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && !ready","time_range":{"begin":"40us","end":"45us"}}}
With protocol context:
{"api_version":"xwave.ai.v1","action":"event.find","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && !ready","time_range":{"begin":"40us","end":"45us"},"context":{"window":"200ns","axi":"axi0","apb":"apb0"}}}
event.exportExport matching events. Always set a limit unless you intentionally need a large scan.
{"api_version":"xwave.ai.v1","action":"event.export","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && !ready","time_range":{"begin":"40us","end":"45us"},"limit":100}}
Use aggregate when you need counts instead of full event rows:
{"api_version":"xwave.ai.v1","action":"event.export","target":{"session_id":"case_a"},"args":{"name":"if0","expr":"valid && ready","time_range":{"begin":"0ns","end":"100us"},"aggregate":{"count":true,"group_by":["qid","val"],"events":false}}
Important: group_by names are not magic built-ins. Every group key must already be defined by the event config as either a signals alias or a fields entry. If qid is a standalone FSDB signal, define it under signals:
{
"clk": "xring_tb_top.clk",
"rst_n": "xring_tb_top.rst_n",
"signals": {
"valid": "xring_tb_top.credit_init_valid",
"ready": "xring_tb_top.credit_init_ready",
"qid": "xring_tb_top.credit_init_qid"
}
}
If qid is a bit slice inside a payload, define the payload signal and expose qid under fields:
{
"clk": "xring_tb_top.clk",
"rst_n": "xring_tb_top.rst_n",
"signals": {
"valid": "xring_tb_top.credit_init_valid",
"ready": "xring_tb_top.credit_init_ready",
"payload": "xring_tb_top.credit_init_payload"
},
"fields": {
"qid": {"signal": "payload", "left": 7, "right": 4},
"val": {"signal": "payload", "left": 2, "right": 0
After that, aggregate.group_by:["qid","val"] groups by those configured values. If a group key is missing, unreadable, or contains x/z, it is grouped as unknown.
verify.conditionsCheck point-time conditions. Use this to verify hypotheses generated from RTL or protocol reasoning.
{"api_version":"xwave.ai.v1","action":"verify.conditions","target":{"session_id":"case_a"},"args":{"time":"42us","conditions":[{"signal":"top.u_dut.fifo_full","op":"==","value":"1"},{"signal":"top.u_dut.state","op":"!=","value":"0"}]}}
expr.eval_atEvaluate a Boolean expression at one time using aliases.
{"api_version":"xwave.ai.v1","action":"expr.eval_at","target":{"session_id":"case_a"},"args":{"time":"42us","signals":{"valid":"top.u_dut.valid","ready":"top.u_dut.ready"},"expr":"valid && !ready"}}
window.verifyVerify expressions sampled on clock edges over a window. mode may be always, never, or eventually.
{"api_version":"xwave.ai.v1","action":"window.verify","target":{"session_id":"case_a"},"args":{"clock":"top.clk","sampling":"posedge","time_range":{"begin":"42us","end":"44us"},"conditions":[{"expr":"valid && !ready","signals":{"valid":"top.u_dut.valid","ready":"top.u_dut.ready"},"mode"
signal.changesReturn value changes for a signal in a range.
{"api_version":"xwave.ai.v1","action":"signal.changes","target":{"session_id":"case_a"},"args":{"signal":"top.u_dut.fifo_full","time_range":{"begin":"40us","end":"45us"},"limit":20,"format":"binary"}}
signal.stabilityCheck whether a signal remains stable in a range.
{"api_version":"xwave.ai.v1","action":"signal.stability","target":{"session_id":"case_a"},"args":{"signal":"top.u_dut.active_count","time_range":{"begin":"42us","end":"44us"}}}
signal.trendSample a numeric signal on clock edges and summarize monotonicity, min, max, and stable state.
{"api_version":"xwave.ai.v1","action":"signal.trend","target":{"session_id":"case_a"},"args":{"signal":"top.u_dut.active_count","clock":"top.clk","sampling":"posedge","time_range":{"begin":"40us","end":"45us"},"max_samples":10000}}
signal.statisticsCount sampled high/low/unknown cycles and numeric min/max/final values over a clocked range. Prefer this over manual event.export counting for signal-level statistics.
{"api_version":"xwave.ai.v1","action":"signal.statistics","target":{"session_id":"case_a"},"args":{"signal":"top.u_dut.ready","clock":"top.clk","sampling":"posedge","time_range":{"begin":"@stall-100cycle(top.clk)","end":"@stall+20cycle(top.clk)"},"max_samples":1000000}}
sampled_pulse.inspectCompare raw valid/payload transitions against DUT clock sampling. Use this when raw waveform activity exists but the DUT may not have sampled a valid pulse.
The returned raw_begin/raw_end or raw_time fields are real waveform transition times. previous_sample_edge, next_sample_edge, and nearest_sample_edge are DUT clock sampling edges that explain whether the pulse was visible to the DUT.
{"api_version":"xwave.ai.v1","action":"sampled_pulse.inspect","target":{"session_id":"case_a"},"args":{"clock":"xring_tb_top.clk","valid":"xring_tb_top.credit_init_vld","payload":"xring_tb_top.credit_init_pd","time_range":{"begin":"0ns","end":"200us"},"sampling":"posedge","format":"hex"},"limits":{"max_samples":1000000,
Typical use: inspect summary.risk_count; if nonzero, set a cursor at data.first_risk.raw_begin or data.first_risk.raw_time, then run value.batch_at or signal.statistics around that cursor.
inspect_signalSummarize signal transitions, period-like intervals, and glitches.
{"api_version":"xwave.ai.v1","action":"inspect_signal","target":{"session_id":"case_a"},"args":{"signal":"top.clk","time_range":{"begin":"0ns","end":"1us"},"glitch_threshold":"1ns","limit":1000}}
detect_anomalyFind waveform anomalies such as glitches, stuck values, and x/z.
{"api_version":"xwave.ai.v1","action":"detect_anomaly","target":{"session_id":"case_a"},"args":{"signals":["top.u_dut.ready","top.u_dut.valid","top.u_dut.data"],"time_range":{"begin":"0ns","end":"100us"},"checks":[{"type":"glitch","min_pulse_width":"1ns"},{"type":"stuck","min_duration"
handshake.inspectAnalyze a generic valid/ready interface sampled on a clock.
{"api_version":"xwave.ai.v1","action":"handshake.inspect","target":{"session_id":"case_a"},"args":{"clock":"top.clk","valid":"top.u_dut.valid","ready":"top.u_dut.ready","data":["top.u_dut.data"],"time_range":{"begin":"40us","end":"45us"},"rules":{"max_wait_cycles":100,"check_data_stable_when_stalled":true
session.openvalue.batch_atscope.listdata.values[] as evidence.handshake.inspect for generic interfaces, or axi.channel_stall for AXI channels.value.batch_at at stall begin/mid/end for related control signals.window.verify to prove the blocking condition persists.event.find or event.export when you need exact event samples.axi.config.load and/or apb.config.loadevent.config.loadevent.find with context.window plus context.axi and/or context.apbdelta_ps as evidence.Use bounded ranges and limits:
{"limits":{"max_rows":100,"max_events":100,"max_samples":100000}}
Prefer:
value.batch_at over repeated value.atevent.find before event.exportsignal.statistics before exporting events just to count high/low cyclesevent.export with aggregate.events:false before exporting full event rows for countsaxi.channel_stall before full AXI transaction inspectionsignal.stability before full signal.changesCommon error.code values:
| Code | AI response |
|---|---|
SIGNAL_NOT_FOUND | Run scope.list near the parent scope and retry with a candidate path. |
SESSION_NOT_FOUND / SESSION_UNHEALTHY | Run session.list, session.doctor, or reopen the FSDB. |
INVALID_REQUEST / MISSING_FIELD | Fix the JSON request shape before retrying. |
EXPR_PARSE_FAILED | Simplify or validate aliases in the expression. |
WAVE_QUERY_FAILED | Check FSDB, config binding, and time range. |
If ok:false, do not use data as evidence. If ok:true but a value has known:false, preserve it as unknown evidence rather than converting it to pass/fail.
Source: BLANK2077/xwave — distributed by TomeVault.
target.session_id