SMA Dashboard
Interactive dashboard for Snowflake Migration Accelerator (SMA) analysis results.
Modules
| Module | Description |
|---|---|
| EWI Tracker | Track and manage EWI (Errors, Warnings, Issues) from conversion |
| File Tracker | Track files and their EWIs with line-level status |
| Dependency Tracker | View artifact dependencies with island visualization |
Requirements
The script expects the Reports/ folder to be in the root of the workload directory with at least one of:
Reports/Issues.csv(with data rows)Reports/ArtifactDependencyInventory.csv(with data rows)
IMPORTANT:
sma-output/Reports/is NOT supported. TheReports/folder must be directly in the root.- This tool ONLY creates/uses
sma_storage.sqlite3. It will NOT modify any other SQLite files.
Note: The dashboard will be generated with only the modules for which data is available:
- EWI Tracker and File Tracker: Require Issues.csv with data rows
- Dependency Tracker: Requires ArtifactDependencyInventory.csv with data rows
If a CSV file exists but only contains the header (no data rows), that module will show "No data available".
Output Format
Every time you begin a step, sub-step, or significant action, prefix the message with a timestamp in the format [YYYY-MM-DD HH:MM:SS]. Obtain the current time by running date '+%Y-%m-%d %H:%M:%S' in bash.
Example:
[2026-03-24 14:05:32] Starting Step 1: Detect SMA output path...
[2026-03-24 14:05:33] Found SMA output at /path/to/output
[2026-03-24 14:05:34] Step 1 complete.
Usage
Step 0: Initialize Git
Ensure the workload directory has a git repository on the sma/migration-process branch. This is idempotent — if the orchestrator already initialized git, this is a no-op.
result = sma_api.git_ensure_ready("<workload_path>")
Step 1: Ask User for Workload Path
Ask user for the path to the SMA output directory:
- Use
ask_user_questiontool with type "text" - Question: "Path to SMA output directory (containing Output, Reports, Logs folders)"
- This directory contains:
Output/- Converted .py/.ipynb filesReports/- Issues.csv or IssuesConnect.csvLogs/- Conversion logs
Step 2: Verify Requirements
Once you have the workload path, verify the data source exists:
# Check for Reports/ folder in root (NOT sma-output/Reports/)
ls "<workload_path>/Reports/Issues.csv" 2>/dev/null || \
ls "<workload_path>/Reports/ArtifactDependencyInventory.csv" 2>/dev/null
If none exist, inform the user that no valid data source was found. Remind them that Reports/ must be in the root directory.
Step 3: Run the SMA Dashboard Manager
cd "<workload_path>" && python3 "<skill_directory>/scripts/sma_manager.py" --template-dir "<skill_directory>/templates"
Where:
<workload_path>is the path provided by the user<skill_directory>is the directory where this SKILL.md file is located
IMPORTANT: Do NOT pass a csv_path argument. Let the script find data sources automatically.
The script will:
- Auto-detect the data source (SQLite or CSV)
- Parse and extract unique EWI codes
- Process ArtifactDependencyInventory.csv if available
- Calculate dependency islands (connected components)
- Create
sma-dashboard/folder with:manifest.json- Dashboard configuration and module statusindex.html- Main dashboard with side panel navigationserver/sma_server.py- Standalone server scriptassets/styles.css- Stylesheetewi-tracker/- EWI tracker, File tracker, and Dependency tracker modules
- Print the summary
- Start the dashboard server and open in browser
The server will keep running until the user presses Ctrl+C. While running:
- Changes to status/notes are saved automatically to SQLite
- The dashboard stays in sync with the database
Step 4: Report results
The script outputs a complete summary including:
- List of generated files
- Total EWIs and occurrences
- Breakdown by category
- Dependency islands found
- Status information
Note: The EWI Fixer can be invoked separately via the spark-migration skill (which loads snowpark-api/dvp/dvp-ewi-fixer/SKILL.md as a bundled sub-skill). It uses the same database, so any changes will be reflected when you refresh the dashboard.
Step 5: Commit Changes to Git
After the dashboard is generated, commit the changes:
result = sma_api.git_commit("<workload_path>", """DVP SMA Dashboard: Generated interactive dashboard
Dashboard: sma-dashboard/
Modules: EWI Tracker, File Tracker, Dependency Tracker
Database: sma_storage.sqlite3""")
Verify branches:
result = sma_api.git_verify_branches("<workload_path>")
Script Options
| Argument | Description |
|---|---|
--output-base <path> |
Override auto-detected output files location |
--template-dir <dir> |
Directory containing HTML templates (required) |
--no-open |
Don't open dashboard in browser |
Output Structure
sma-dashboard/
├── manifest.json # Dashboard configuration
├── index.html # Main dashboard with side panel
├── server/
│ └── sma_server.py # Standalone server script
├── assets/
│ └── styles.css # Stylesheet
└── ewi-tracker/
├── ewi_tracker.html # EWI Tracker view
├── file_tracker.html # File Tracker view
├── dependency_tracker.html # Dependency Tracker view
└── content/
├── files_*.html # Detail pages per EWI
└── file_ewis_*.html # Detail pages per File
The folder is standalone - you can share it and run the server later with:
cd sma-dashboard
python3 server/sma_server.py .
Database Tables
issues
Main table storing EWI data from Issues.csv with status tracking.
artifact_dependency_inventory
Stores all artifact dependencies from ArtifactDependencyInventory.csv.
artifact_dependency_summary
Aggregated view of dependencies per file with island assignment.
artifact_dependency_graph
Stores edges for the dependency graph visualization.
Status Values
| Status | Description |
|---|---|
pending |
Not yet reviewed |
in_progress |
Currently being worked on |
manual_resolved |
Issue has been manually addressed |
auto_resolved |
Issue was automatically resolved |
not_auto_resolved |
Auto-resolver could not resolve this issue |
wont_fix |
Decided not to fix |
Database Access Module
A shared Python module provides programmatic access to sma_storage.sqlite3 so AI agents can query and update dashboard data conversationally, without needing the browser UI.
Module location: skills/spark-migration/snowpark-api/scripts/sma_api.py
All functions receive workload_path: str as their first parameter (the directory containing sma_storage.sqlite3).
Available Functions
All functions receive workload_path: str as first parameter.
Initialization
| Function | Description |
|---|---|
initialize_database |
Create/load sma_storage.sqlite3, import Issues.csv, create tables |
create_artifact_dependency_tables |
Import ArtifactDependencyInventory.csv and build dependency graph |
create_input_files_table |
Import InputFilesInventory.csv |
Read — EWI
| Function | Description |
|---|---|
get_migration_summary |
High-level readiness summary (files, EWIs, blockers, readiness) |
list_ewis |
List EWIs with optional category/status filters |
get_blockers |
List critical blocker EWIs that prevent migration |
get_pending_ewi_codes |
Distinct pending EWI codes with descriptions |
get_ewis_by_code |
EWIs for a specific code, optionally filtered by status |
get_ewis_by_file |
EWIs for a specific file, optionally filtered by status |
get_summary_stats |
Status counts across all EWIs |
get_ewi_code_stats |
Per-code statistics |
Read — Files
| Function | Description |
|---|---|
list_files |
List files with their EWI summary |
get_file_details |
Detailed EWI info for a specific file |
get_ewi_descriptions |
All unique EWI code → description mappings |
Read — Dependencies
| Function | Description |
|---|---|
get_dependency_summary |
Dependency islands overview |
get_file_dependencies |
Dependencies for a specific file |
get_dependency_inventory |
Full artifact dependency inventory |
get_dependency_graph |
Dependency graph edges |
Write — Status
| Function | Description |
|---|---|
update_ewi_status |
Update status/notes for an EWI code (cascading to all rows) |
update_file_status |
Update status for all EWIs in a file (cascading) |
update_line_status |
Update status for a specific line in a file |
bulk_update_ewi_status |
Update status for multiple EWI codes at once |
update_ewi_notes |
Update only notes for an EWI code |
update_ewi_status_single |
Update status for a single EWI row (code + file_id + line) |
update_dependency_status |
Update status for a dependency edge |
update_file_validation |
Mark a file as validated |
update_recommended_actions |
Set recommended actions for a file |
EWI Fixer
| Function | Description |
|---|---|
generate_fix_id |
Generate a new fix session ID |
insert_fix_result |
Record a single fix attempt |
batch_insert_fix_results |
Batch insert multiple fix results |
get_fix_results |
Get fix results for a session |
get_fix_results_stats |
Get success/failed counts for a session |
insert_summary_start |
Create summary record with start time |
update_summary_end |
Complete summary record with final results |
get_fix_summary |
Get summary record for a session |
Reset
| Function | Description |
|---|---|
reset_not_resolved_to_pending |
Reset not_auto_resolved EWIs back to pending |
reset_all_to_pending |
Reset ALL EWIs to pending |
Overview
| Function | Description |
|---|---|
save_overview_stats |
Persist overview statistics to the database |
Final Summary
MANDATORY: After completing all steps (whether running standalone or invoked from the orchestrator), ALWAYS present this summary table:
SMA Dashboard Complete
┌───────────────────┬──────────┬──────────────────────────────────────────────────────┐
│ Step │ Status │ Details │
├───────────────────┼──────────┼──────────────────────────────────────────────────────┤
│ SMA Dashboard │ Done │ Generated dashboard at sma-dashboard/ │
└───────────────────┴──────────┴──────────────────────────────────────────────────────┘
Output location: <output>/sma-dashboard/
Git branches:
• main — original code (unmodified)
• sma/migration-process — dashboard generation changes applied
Rules:
- Status is
Done,Skipped, orFailed - If dashboard generation failed, show
Failedwith brief error - The git branches section uses
sma_api.git_verify_branches()to confirm both branches exist