How to Use Sentinel DV - Complete Guide¶
Welcome to Sentinel DV! This guide will help you effectively use the MCP server for verification intelligence.
π Table of Contents¶
- Quick Start
- Understanding the Architecture
- Setting Up Your Environment
- Indexing Verification Artifacts
- Using MCP Tools
- Integration with AI Agents
- Common Workflows
- Troubleshooting
- Best Practices
Quick Start¶
Installation (5 minutes)¶
# 1. Clone the repository
git clone https://github.com/kiranreddi/sentinel-dv.git
cd sentinel-dv
# 2. Create virtual environment
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# 3. Install dependencies
pip install -e ".[dev]"
# 4. Verify installation
python -m sentinel_dv.server --help
First Index (10 minutes)¶
# 1. Create configuration
cp config.example.yaml config.yaml
# 2. Edit config.yaml to point to your artifacts
nano config.yaml
# Set artifact_roots to your verification directories
# 3. Index demo artifacts (test the system)
python -m sentinel_dv.indexing.indexer \
--config config.yaml \
--index-all
# 4. Check index was created
ls -lh sentinel_dv.db
Start Server (2 minutes)¶
# Start the MCP server
python -m sentinel_dv.server --config config.yaml
# Server is now ready for MCP clients!
Understanding the Architecture¶
Core Components¶
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Client β
β (Claude, Custom Agent, etc.) β
ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β MCP Protocol
ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Sentinel DV Server β
β ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β MCP Tools (runs, tests, failures, etc.) β β
β ββββββββββββββββ¬ββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββΌββββββββββββββββββββββββββββββββ β
β β DuckDB Index Store β β
β β - runs, tests, failures, coverage β β
β ββββββββββββββββ¬ββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββΌββββββββββββββββββββββββββββββββ β
β β Adapters (UVM, cocotb, coverage) β β
β ββββββββββββββββ¬ββββββββββββββββββββββββββββββββ β
βββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββ
β Verification Artifacts β
β - UVM logs β
β - cocotb JUnit XML β
β - Coverage reports β
β - Assertion definitions β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Data Flow¶
- Indexing Phase (offline)
- Adapters parse raw artifacts
- Data is normalized and classified
- IDs are generated deterministically
-
Everything stored in DuckDB
-
Query Phase (runtime)
- MCP client sends tool request
- Server queries DuckDB index
- Results are paginated and returned
- All responses are typed and validated
Setting Up Your Environment¶
Configuration File Explained¶
# config.yaml - Current configuration reference (matches `config.example.yaml`)
# 1. ARTIFACT ROOTS (Required)
artifact_roots:
- /path/to/nightly/regressions
- /path/to/uvm/logs
# 2. INDEX CONFIGURATION
index:
type: duckdb
path: ./sentinel_dv.db
# 3. ADAPTER CONFIGURATION
adapters:
uvm: true
cocotb: true
assertions: true
coverage: true
waveform_summary: false
# 4. SECURITY SETTINGS
security:
max_response_bytes: 2097152
max_page_size: 200
max_evidence_refs: 10
max_excerpt_length: 1024
max_message_length: 4096
max_tags_per_event: 20
max_coverage_metrics: 200
max_bins_missed: 50
# 5. REDACTION
redaction:
enabled: true
patterns: []
redact_emails: true
redact_ips: false
redact_paths: true
Directory Structure¶
Organize your artifacts like this:
verification/
βββ nightly_runs/
β βββ 2026-01-20/
β β βββ run_123/
β β β βββ test_axi_burst.log
β β β βββ coverage.xml
β β β βββ assertions.rpt
β β βββ run_124/
β βββ 2026-01-21/
βββ continuous_integration/
β βββ pr_456/
β βββ cocotb_results.xml
β βββ uvm_test.log
βββ regression_database/
βββ historical_data.db
Indexing Verification Artifacts¶
Full Indexing¶
# Index all configured artifact roots
python -m sentinel_dv.indexing.indexer \
--config config.yaml \
--index-all
# Expected output:
# Scanning artifacts...
# Found 1,234 files
# Parsing UVM logs: 500 files
# Parsing cocotb results: 234 files
# Parsing coverage: 500 files
# Generating IDs...
# Writing to DuckDB...
# Indexed 1,234 files in 45.3s
# Runs: 50
# Tests: 2,500
# Failures: 156
# Coverage summaries: 50
Incremental / Selective Indexing¶
Sentinel DV currently supports full indexing only: - Update artifact_roots in config.yaml - Re-run: python -m sentinel_dv.indexing.indexer --config config.yaml --index-all
Using MCP Tools¶
Sentinel DV provides 26 read-only MCP tools. The canonical referenceβwith parameters, JSON examples, and suggested tool chainsβis MCP tools reference.
For a visual walkthrough (SVG cards with real request/response payloads from the bundled demo/ index), see MCP tool gallery. Regenerate with python scripts/generate_mcp_tool_gallery.py.
| Category | Tools |
|---|---|
| Discovery | runs.list, tests.list, assertions.list, coverage.list |
| Detail | runs.get, tests.get, tests.topology, assertions.get |
| Analysis | failures.list, assertions.failures, coverage.summary |
| Regression | regressions.summary, runs.diff |
| Waveforms | wave.signals, wave.summary |
| v2.0 workflow | runs.submit, sim.status, assertions.sva_status, assertions.vacuity, tests.replay, coverage.gaps |
| v2.1 DV intelligence | coverage.trend, runs.cross_sim, tests.cluster, regression.health, coverage.advisor |
Category guides: Discovery Β· Detail Β· Analysis Β· Regression Β· Waveforms Β· Tool overview (v2.0 / v2.1 sections)
Waveform tools: enable adapters.waveform_summary: true, index *.wave.json and/or *.vcd, then call wave.signals / wave.summary with optional start_time_ns / end_time_ns (nanoseconds). See Waveform summaries and Verilator + VCD.
Integration with AI Agents¶
Claude Desktop Integration¶
Add to Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"sentinel-dv": {
"command": "python",
"args": [
"-m",
"sentinel_dv.server",
"--config",
"/full/path/to/config.yaml"
],
"env": {
"PYTHONPATH": "/full/path/to/sentinel-dv"
}
}
}
}
Restart Claude Desktop, and Sentinel DV tools will be available!
Custom MCP Client¶
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def query_sentinel_dv():
server_params = StdioServerParameters(
command="python",
args=["-m", "sentinel_dv.server", "--config", "config.yaml"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Initialize
await session.initialize()
# List failing tests
result = await session.call_tool("tests.list", {
"status": "fail",
"page": 1,
"page_size": 10
})
print(result)
API Client (HTTP/REST)¶
Sentinel DV currently exposes tools over stdio MCP (no HTTP endpoints are documented).
Common Workflows¶
Workflow 1: Daily Regression Triage¶
# 1. Index latest nightly run
python -m sentinel_dv.indexing.indexer \
--config config.yaml \
--index-all
# 2. Start server
python -m sentinel_dv.server --config config.yaml
Then in Claude:
"Show me the regression summary for the nightly suite from the past 7 days"
β Uses: regressions.summary
"List all assertion failures from last night's run"
β Uses: failures.list with category=assertion
"Compare coverage between yesterday and today"
β Uses: runs.diff
For deterministic replay across reruns, pass as_of (RFC3339):
Workflow 2: PR Validation¶
In Claude:
"Did PR #123 introduce any new failures?"
β Uses: runs.diff comparing main vs PR
"What's the coverage impact of this PR?"
β Uses: coverage.summary
Workflow 3: Top Failure Signatures¶
# Index (update `artifact_roots` in config.yaml to include the historical runs)
python -m sentinel_dv.indexing.indexer \
--config config.yaml \
--index-all
In Claude:
Workflow 4: Root Cause Analysis¶
In Claude:
"Why did test axi_burst_wr fail?"
β Uses: tests.get, failures.list
"Show me the scoreboard mismatches in the AXI agent"
β Uses: failures.list with component=axi_agent, category=scoreboard
"What assertions failed during this test?"
β Uses: assertions.failures
Workflow 5: Assertion and coverage intelligence¶
In Claude:
"List APB assertions and show failures in this run between 2us and 3us"
β Uses: assertions.list with protocol/tag filters, then assertions.failures with start_time_ns/end_time_ns
"Show bounded functional coverage with evidence for latest run"
β Uses: coverage.list, then coverage.summary with include_evidence=true
Tips: - assertions.list supports deterministic filtering by scope, name_pattern, protocol, and tag. - coverage.summary is bounded by security.max_coverage_metrics and security.max_bins_missed. - assertions.failures time windows require both start_time_ns and end_time_ns.
Workflow 6: Waveform time window¶
Index with waveforms enabled, then in your MCP client:
"List signals for test_counter_sim between 2 and 3 microseconds"
β Uses: tests.list β wave.signals with start_time_ns: 2000, end_time_ns: 3000
See MCP tools reference β Waveforms and Verilator example.
Troubleshooting¶
Issue: Indexing is slow¶
Solution:
# In config.yaml, increase parallelism
index:
workers: 8 # Use more CPU cores
performance:
duckdb_threads: 8
Issue: Server won't start¶
Check:
# 1. Verify Python version
python --version # Must be 3.10+
# 2. Check dependencies
pip list | grep fastmcp
pip list | grep duckdb
# 3. Verify config
python -c "from sentinel_dv.config import load_config; load_config('config.yaml')"
# 4. Check database
ls -lh sentinel_dv.db
Issue: No results from queries¶
Debug:
# 1. Check index contents
python -c "
from sentinel_dv.indexing.store import IndexStore
with IndexStore('sentinel_dv.db') as store:
print(f'Runs: {store.count_runs()}')
print(f'Tests: {store.count_tests()}')
print(f'Failures: {store.count_failures()}')
"
# 2. Re-index with verbose logging
python -m sentinel_dv.indexing.indexer \
--config config.yaml \
--index-all
Issue: Redaction too aggressive¶
Solution:
# In config.yaml, tune redaction
redaction:
enabled: true
redact_emails: false # Keep emails if needed
redact_paths: false # Keep paths if needed
# Remove aggressive patterns
patterns: []
Issue: MCP client can't connect¶
Check:
# 1. Test server manually
python -m sentinel_dv.server --config config.yaml
# 2. Check server logs
python -m sentinel_dv.server --config config.yaml
# 3. Verify MCP protocol version
python -c "import fastmcp; print(fastmcp.__version__)"
Best Practices¶
1. Regular Indexing¶
Schedule daily indexing:
# crontab -e
0 2 * * * cd /path/to/sentinel-dv && python -m sentinel_dv.indexing.indexer --config config.yaml --index-all
2. Organize Artifacts¶
Keep artifacts organized by suite/date:
3. Incremental Indexing¶
Incremental indexing flags are not currently exposed. For updates, re-run full indexing: python -m sentinel_dv.indexing.indexer --config config.yaml --index-all
4. Monitor Index Size¶
# Check database size
du -h sentinel_dv.db
# Vacuum if needed (reclaim space)
python -c "
from sentinel_dv.indexing.store import IndexStore
with IndexStore('sentinel_dv.db') as store:
store._conn.execute('VACUUM')
"
5. Version Control Config¶
6. Security Checklist¶
- β Enable redaction for production
- β Restrict artifact_roots to necessary paths
- β Set appropriate max_response_bytes
- β
Review
redaction.patternsfor your environment - β Never commit credentials in config.yaml
7. Performance Tuning¶
# For large scale (100K+ tests)
index:
workers: 16
performance:
cache_size_mb: 500
duckdb_threads: 16
max_connections: 20
# For small scale (<10K tests)
index:
workers: 4
performance:
cache_size_mb: 50
duckdb_threads: 4
max_connections: 5
Advanced Usage¶
Custom Taxonomy¶
# In config.yaml
taxonomy:
custom_categories:
- custom_axi_protocol_violation
- custom_ahb_timeout
custom_tags:
- my_dut_version_1_0
- my_protocol_xyz
Programmatic Access¶
from sentinel_dv.indexing.store import IndexStore
from sentinel_dv.adapters import UVMLogParser
# Direct adapter usage
parser = UVMLogParser()
result = parser.parse_log("test.log")
# Direct store access
with IndexStore("sentinel_dv.db") as store:
tests, total = store.query_tests(
status="fail",
framework="uvm"
)
for test in tests:
print(f"{test['name']}: {test['status']}")
Custom Adapters¶
# Create custom adapter for your tool
from sentinel_dv.adapters.base import BaseAdapter
class MyToolAdapter(BaseAdapter):
def parse(self, file_path):
# Your parsing logic
return {
"tests": [...],
"failures": [...]
}
# Register adapter
# In config.yaml:
adapters:
enabled:
- my_tool
my_tool:
patterns:
- "**/*.mytool"
Getting Help¶
Resources¶
- π Full Documentation
- π¬ GitHub Discussions
- π Issue Tracker
- π§ Email: support@sentinel-dv.io
Community¶
- Join our Discord: discord.gg/sentinel-dv
- Follow updates: @SentinelDV
- Weekly office hours: Wednesdays 2pm PST
Next Steps¶
- β Complete quick start
- β Index your first artifacts
- β Try example queries in Claude
- π Read Architecture Overview
- π§ Explore Tool Reference
- π Set up production deployment
Happy debugging! π‘οΈ