N3MO: The Impact Tracker
Project description
A structural code intelligence layer that transforms source code into a queryable knowledge graph for search, impact analysis, and AI-powered development.
Parse once. Query forever. Know exactly what breaks before it does.
๐ Licensed under PolyForm Noncommercial 1.0.0 โ Source available for noncommercial use. โข Need commercial use? Get a commercial license โ
What is N3MO โข Architecture โข Installation โข GitHub Integration โข Usage โข Benchmarks โข Roadmap
๐ฏ What is N3MO?
N3MO is a symbol-centric code intelligence layer. Instead of scanning raw text, it parses your source code's ASTs, maps call graphs, and models dependencies in a queryable relational database.
For engineering leaders and teams, N3MO acts as a structural insurance policy for your codebases.
๐ก Why N3MO?
- ๐ก๏ธ Eliminate Regression Risks: Utility functions are rarely refactored because developers fear unknown side effects. N3MO maps the transitive blast radius of any symbol to arbitrary depth, showing you exactly what will break before you make the edit.
- ๐๏ธ Rapid Developer Onboarding: Instead of senior engineers spending hours explaining codebase flow to new hires, developers can run one command to visualize complex call chains and parent-child dependencies interactively.
- ๐ค AI-Agent Ready Infrastructure: Modern LLM agents (Cursor, Claude Desktop) are limited by context windows and text search. N3MO's native MCP server lets AI agents query the actual code graph, enabling fast, hallucination-free refactoring.
๐ How N3MO Compares
| Capability | Grep / Text Search | IDE "Find References" | N3MO Code Graph |
|---|---|---|---|
| Analysis Basis | Substring matching | AST-based, direct refs only | Relational knowledge graph |
| Transitive Traversal | โ None | โ Manual, one level at a time | โก Instant to arbitrary depth |
| Blast Radius Mapping | โ None | โ Flat search-result list | ๐จ Interactive visual orbit map |
| CI/CD Integration | โ None | โ Bound to IDE runtime | โ๏ธ Dockerized CLI + CTE queries |
| AI Agent Integration | โ Injected file chunks | โ ๏ธ Manual context copy | ๐ค Native MCP server |
| Language Coverage | โ Any text file | โ ๏ธ Language-specific plugins | โ 27 languages via Tree-sitter |
๐ ๏ธ The Core Problem N3MO Solves
|
โ Without N3MO Developer: "Where does 'login' appear?"
Tool: grep -r "login" .
Result: 647 matches across 89 files
...now what?
|
โ With N3MO Developer: "What breaks if I change login?"
Tool: n3mo impact "login"
Result: 3 direct callers โ 5 ripple effects
Full blast radius in < 50ms
|
N3MO doesn't find text โ it understands structure. It traces the actual call graph, not string matches.
Questions N3MO answers instantly:
| Question | How | |
|---|---|---|
| ๐ | What functions and classes exist in this repo? | Full symbol index across 27 languages |
| ๐ฏ | Where is this symbol used โ directly and transitively? | Recursive CTE traversal to arbitrary depth |
| ๐ฅ | What is the blast radius of changing this function? | Interactive orbit map with depth slider |
| ๐ธ๏ธ | How do these components actually connect? | Call graph + parent-child hierarchy |
| ๐ค | Can my AI agent understand this codebase structurally? | Native MCP server for Cursor / Claude |
๐๏ธ Architecture
Knowledge graph model
N3MO builds a symbol-centric knowledge graph stored in PostgreSQL:
graph TD
A["๐ Source Code"] -->|Tree-sitter| B["๐ณ AST Parser"]
B --> C["๐ Symbol Extractor"]
D["๐ Git Hooks"] -->|post-commit| A
C --> E[("๐๏ธ PostgreSQL<br/>Projects ยท Symbols ยท Calls<br/>Imports ยท Files")]
E --> F["๐ฅ Impact Analysis"]
E --> G["๐ Call Graph"]
E --> H["๐ Dependency Graph"]
F --> I["๐จ Visualizer"]
G --> I
H --> I
F --> J["๐ค MCP Server"]
style A fill:#6c63ff,stroke:#4a3fbf,color:#fff
style B fill:#7c74ff,stroke:#4a3fbf,color:#fff
style C fill:#7c74ff,stroke:#4a3fbf,color:#fff
style D fill:#ffd93d,stroke:#d4b800,color:#1a202c
style E fill:#ff6b6b,stroke:#c53030,color:#fff,stroke-width:3px
style F fill:#45b7d1,stroke:#2c8ea8,color:#1a202c
style G fill:#45b7d1,stroke:#2c8ea8,color:#1a202c
style H fill:#45b7d1,stroke:#2c8ea8,color:#1a202c
style I fill:#9ae6b4,stroke:#2f855a,color:#1a202c
style J fill:#ffd93d,stroke:#d4b800,color:#1a202c
System flow
sequenceDiagram
participant User as User / CI
participant CLI as N3MO CLI
participant DB as PostgreSQL (Docker)
participant Viz as Graph Visualizer
rect rgb(26, 27, 46)
Note over User, DB: Indexing Flow (Local CLI)
User->>CLI: n3mo index
CLI->>DB: Start PostgreSQL container (if not running)
CLI->>CLI: Walk file tree (SHA-256 hash checks)
CLI->>CLI: Parse AST (Tree-sitter, multiprocessing)
CLI->>DB: Batch insert symbols, calls, imports
CLI->>DB: Resolve imports & call links
DB-->>CLI: Success
CLI-->>User: Complete summary
end
rect rgb(26, 27, 46)
Note over User, Viz: Query & Visualization Flow
User->>CLI: n3mo impact "symbol" --graph
CLI->>DB: Recursive CTE traversal (depth & file filters)
DB-->>CLI: Blast radius subgraph
CLI->>Viz: Generate orbital vis.js HTML
CLI->>User: Launch local web server & open browser
end
Data model
erDiagram
PROJECT ||--o{ SYMBOL : contains
PROJECT ||--o{ CALL : tracks
PROJECT ||--o{ IMPORT : tracks
PROJECT ||--o{ FILE : indexes
SYMBOL ||--o{ CALL : "source of"
SYMBOL ||--o{ CALL : "resolved to"
SYMBOL ||--o{ SYMBOL : "parent of"
PROJECT {
uuid id PK
text name
text repo_url
timestamp created_at
}
SYMBOL {
uuid id PK
uuid project_id FK
text name
text file_path
text kind "function|class|method"
text signature
int start_line
int end_line
uuid parent_id FK
}
CALL {
uuid id PK
uuid project_id FK
uuid source_symbol_id FK
text call_name
int line_number
uuid resolved_symbol_id FK
}
IMPORT {
uuid id PK
uuid project_id FK
text file_path
text module
text name
text alias
uuid resolved_symbol_id FK
}
FILE {
uuid project_id FK
text file_path PK
text sha256
}
โจ Core Capabilities
Ingestion & Parsing
- Multi-language support โ 27 languages via dynamic Tree-sitter grammar loading (Python, JS/TS, Go, Rust, Java, C/C++, C#, Kotlin, Swift, Scala, Ruby, PHP, Haskell, Perl, and more)
- Parallel AST ingestion โ
ProcessPoolExecutordistributes CPU-bound parsing across all available cores - Incremental re-indexing โ SHA-256 file hashing skips unchanged files automatically
- Idempotent operations โ re-indexing updates existing data without duplication
- Smart exclusions โ case-insensitive directory filters and camelCase-aware filename checks prevent false positives (e.g. allows
contest.pywhile skippingtest_*.py)
Analysis & Querying
- Symbol extraction โ functions, classes, methods with full file path + line context
- Hierarchical modeling โ parent-child relationships (Module โ Class โ Method)
- Call graph construction โ who calls whom, resolved at ingestion time
- Scope-aware resolution โ class scope > local file > imports > qualified dot paths > global
- Blast radius analysis โ recursive CTE traversal to arbitrary depth with cycle guards
Performance
- Connection pooling โ
ThreadedConnectionPooleliminates per-symbol DB round trips - Batch inserts โ symbols, imports, and calls batched per file in single transactions
- Optimized queries โ
SPLIT_PARTfix delivered a 2ร speedup on call resolution
Visualization & Integration
- Interactive graph โ vis.js orbit map with click-to-inspect nodes, sidebar, and depth slider
- Dark mode โ toggleable canvas dark mode with real-time node/edge updates, persisted in
localStorage - Premium styling โ sleek interactive dashboard landing page UI and graph visualizer styled with
Bricolage Grotesque,Inter, andJetBrains Monotypography - SKILL.md profile โ system instructions to configure Claude as an impact-aware coding agent
- Native MCP server โ first-class integration with Cursor, Claude Desktop, and Windsurf
- Git hooks โ automatic re-indexing on every commit
- CI pipeline โ GitHub Actions with linting (
ruff), type checking (mypy), andpytest
๐ Supported Languages
| โฆand more |
๐ Installation
Prerequisites
Quick start
Install N3MO directly from PyPI:
# Install the package
pip install n3mo
# Start Docker containers & initialize the database
n3mo setup
Alternatively, for contributors running in editable mode:
git clone https://github.com/RajX-dev/N3MO.git
cd N3MO
pip install -e .
n3mo setup
๐ค Model Context Protocol (MCP)
N3MO includes a native MCP server that exposes repository analysis and graph traversal tools to LLM agents (like Claude, Cursor, or Windsurf).
Automatic Claude Desktop Setup
To automatically configure N3MO in your local Claude Desktop:
# Navigate to the workspace you want Claude to analyze, then run:
n3mo mcp install
This registers N3MO and sets up the paths automatically. Restart Claude Desktop and you're ready!
๐ง Claude Skill (System Instructions)
To configure Claude to run N3MO impact queries proactively before changing code in the editor, import or copy-paste the custom instructions from the SKILL.md profile.
Cursor Setup
To use N3MO in Cursor:
- Go to Settings -> Models -> MCP.
- Click + Add New MCP Server.
- Set the configuration details:
- Name:
n3mo - Type:
command - Command:
n3mo mcp start(oruvx n3mo mcp startto run directly) - Environment Variables:
TARGET_CODE_DIR=/absolute/path/to/your/active/workspace
- Name:
- Click Save, and Cursor will instantly be able to index and query your workspace blast radius.
โ GitHub Webhook Integration
If you wish to use N3MO for team collaboration and automated pull-request analysis in your CI/CD pipeline, please visit n3mo.shop to get started with our GitHub Webhook integration.
๐ฐ Pricing & Licensing
N3MO is free under the PolyForm Noncommercial 1.0.0 License for local usage and single-developer MCP integrations.
- 100% Free & Local: Run CLI queries, local MCP integrations, and the visualizer with zero limits.
- Enterprise Licensing: For large-scale organization deployments or commercial licensing terms, please reach out to the author.
๐ป Usage
Index a repository
# Navigate to any repository
cd /path/to/your/project
# Run the indexer
n3mo index
What gets indexed:
- โ Source files in all 27 supported languages
- โ Virtual environments (
venv/,.venv/) - โ Dependencies (
node_modules/,site-packages/) - โ Build artifacts (
.git/,__pycache__/,dist/) - โ Test / fixture directories (
tests/,mocks/,specs/)
Visualizer
Dark Mode โ Radial Layout
Horizontal Tree View
Example terminal output:
โ IMPACT ANALYSIS
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Target: authenticate_user
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Direct Callers (3 symbols)
โธ login_endpoint api/auth.py:12
โธ refresh_token api/token.py:23
โธ validate_session middleware/auth.py:89
โ Ripple Effects (5 symbols)
โฐโโธ POST /login routes.py:67
โฐโโธ admin_login admin/views.py:34
โฐโโธ require_auth decorators.py:12
โฐโโธ dashboard_view views/dashboard.py:8
โฐโโธ settings_view views/settings.py:22
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Total impacted: 8 references โ depth โค 3
Dependency graph visualization
graph LR
A[main.py] --> B[auth.py::login]
A --> C[db.py::connect]
B --> D[utils.py::hash_password]
B --> E[models.py::User]
C --> F[config.py::DB_URI]
style A fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
style B fill:#4ecdc4,stroke:#0ca89e,stroke-width:2px,color:#000
style C fill:#45b7d1,stroke:#1098ad,stroke-width:2px,color:#000
style D fill:#96ceb4,stroke:#63b598,stroke-width:2px,color:#000
style E fill:#ffd93d,stroke:#f5c200,stroke-width:2px,color:#000
style F fill:#e0e0e0,stroke:#a0a0a0,stroke-width:2px,color:#000
๐ ๏ธ Technology Stack
| Component | Technology | Purpose |
|---|---|---|
| Parser | Error-tolerant syntax analysis across 27 languages | |
| Database | Relational graph storage + recursive CTE queries | |
| Runtime | Core logic + multiprocessing | |
| Infrastructure | Containerization | |
| Visualization | Interactive impact graph | |
| AI Integration | Native tool for LLM agents |
๐ Benchmarks
All benchmarks measured on Intel i5-13450HX, 24 GB RAM, NVMe SSD.
Django โ Optimization History
Django is the primary benchmark target: 3,021 files, ~43k symbols, ~181k calls.
Django Index Time (minutes)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
v0.3 Baseline โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ 23 min 1ร
SPLIT_PART Fix โโโโโโโโโโโโโโโโโโโโโโ 11 min 2ร
Batch Inserts โโโโโโโโโ 5 min 4.6ร
+ Multiprocessing โโโโ 2.5 min 9ร ๐
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Optimization | Index Time | Speedup | What Changed |
|---|---|---|---|
| v0.3 baseline | 23 min | 1ร | Per-symbol DB inserts, naive call resolution |
| + SPLIT_PART query fix | 11 min | 2ร | Eliminated redundant string splitting in call resolution |
| + Batch inserts | 5 min | 4.6ร | Symbols, imports, and calls batched per file (1 transaction) |
| + Multiprocessing | ~2.5 min | ~9ร | ProcessPoolExecutor distributes AST parsing across cores |
โ All results are real measurements on the Django repository. Multiprocessing gains scale with core count.
ScanCode Toolkit โ Large Codebase
Tested on ScanCode Toolkit โ ~600k lines of Python.
| Metric | Result |
|---|---|
| Lines of code | ~600,000 |
| Full index time | ~3 minutes |
| Processing mode | Single-threaded (v0.3) |
Incremental Re-Indexing
N3MO uses SHA-256 file hashing to skip unchanged files on subsequent runs.
| Scenario | Time | Notes |
|---|---|---|
| Full index (first run) | Baseline | All files parsed and inserted |
| No changes (re-run) | < 1 second | Hash comparison only, zero DB writes |
| 1 file modified | < 2 seconds | Only the changed file is re-parsed and upserted |
These results are from the built-in benchmark script on a 20-file synthetic repository. Real-world incremental performance is proportional to the number of changed files, not the total repository size.
Query Performance
Impact analysis uses PostgreSQL recursive CTEs with cycle guards. Query times are independent of repository size โ they depend only on the size of the result subgraph.
| Query Type | Typical Latency |
|---|---|
| Direct callers of a symbol | < 10 ms |
| Full blast radius (depth โค 5) | < 50 ms |
| Complete graph traversal | < 200 ms |
Running the Benchmark
python benchmarks/benchmark_indexing.py
๐บ๏ธ Roadmap
All four development phases have been completed. N3MO is stable and actively maintained.
Development Timeline
| Phase | Component | Status |
|---|---|---|
| Phase 1 โ Foundations | ||
| Docker setup | โ Complete | |
| Database schema | โ Complete | |
| Tree-sitter integration | โ Complete | |
| Symbol + call extraction | โ Complete | |
| Blast radius (recursive CTE) | โ Complete | |
| Interactive visualizer | โ Complete | |
| Phase 2 โ Performance | ||
| Connection pooling | โ Complete | |
| Batch DB operations (symbols/imports/calls) | โ Complete | |
| SPLIT_PART query optimization | โ Complete | |
--file / --depth CLI flags |
โ Complete | |
| Interactive depth slider | โ Complete | |
| Phase 3 โ Correctness & Scaling | ||
| Incremental re-index (file hashing) | โ Complete | |
| Multiprocessing (AST parsing) | โ Complete | |
| Scope-aware call resolution | โ Complete | |
| CTE cycle guard | โ Complete | |
| Full type annotations + mypy | โ Complete | |
| pytest suite + CI | โ Complete | |
| Multi-language support (27 languages) | โ Complete | |
| Phase 4 โ Distribution | ||
| MCP server (Cursor / Claude / Windsurf) | โ Complete | |
| Real-time git-hook indexing | โ Complete |
Phase 1: Foundations โ Complete
- Docker environment (PostgreSQL)
- Database schema โ Projects, Symbols, Calls, Imports tables
- Tree-sitter parser integration
- Symbol extractor with full AST traversal
- Idempotent upsert logic
- Blast radius via recursive CTE
- Interactive vis.js visualizer
Phase 2: Performance โ Complete
-
psycopg2.pool.ThreadedConnectionPoolโ replace per-call connections -
execute_values()batch inserts for symbols, imports, and calls โ 1 transaction per file - SPLIT_PART query optimization for call resolution
-
--fileand--depthCLI flags for targeted impact analysis - Interactive depth slider in visualizer
Results: Django (3,021 files, ~43k symbols, ~181k calls) โ 23min โ 5min (4.6ร faster)
Phase 3: Correctness + Scaling โ Complete
- SHA-256 file hashing for incremental re-index
-
ProcessPoolExecutorfor parallel AST parsing - Scope-aware call resolution using imports table
- CTE cycle guard (visited node tracking)
- Full type annotations,
mypyclean checking in CI - pytest unit + integration test suite
- GitHub Actions CI pipeline
- Multi-language support (27 languages)
Phase 4: Distribution โ Complete
- MCP server โ N3MO as a tool for Cursor, Claude Code, Windsurf
- Real-time incremental indexing via git hooks
๐ Design Principles
1. Structure before semantics Map the code skeleton (AST) before adding AI analysis. A correct graph is worth more than a smart but wrong one.
2. Database as source of truth All state lives in PostgreSQL, eliminating in-memory complexity and enabling graph queries that application-level traversal cannot match.
3. Correctness over speed The parser must handle syntax errors gracefully without corrupting the graph. A fast indexer that silently drops symbols is worse than a slow one that gets everything right.
4. Idempotent operations Re-running ingestion produces identical results, enabling safe incremental updates and CI/CD integration.
๐ค Contributing
Contributions are welcome! Please read the CONTRIBUTING.md guide to get started with setting up the project, coding standards, and running checks locally.
Development Setup
# Install with dev dependencies
pip install -e ".[dev]"
# Lint
ruff check n3mo/
# Type check
mypy n3mo/
# Tests
pytest tests/
๐ License
Licensed under the PolyForm Noncommercial 1.0.0 License.
- โ Free for personal projects, academic research, and hobby tools
- โ Source available โ view, modify, and distribute for noncommercial purposes
- โ ๏ธ Noncommercial โ you may not use it for commercial purposes
- โ ๏ธ Restrictions apply on offering it as a service
For commercial deployments or proprietary modifications, contact for licensing options.
See LICENSE for full legal details.
๐จโ๐ป Author
Raj Shekhar โ Delhi Technological University
๐ Acknowledgments
- Tree-sitter โ for robust, incremental, error-tolerant parsing
- PostgreSQL โ for making recursive graph queries possible without a graph database
- Docker โ for reproducible, single-command environments
- vis.js โ for the interactive graph visualization
- FastAPI โ for the high-performance REST layer
โญ Star this repo if you find it useful! thanks for visiting
Building tools for understanding code at scale.
โโโโ โโโ โโโโโโโ โโโโ โโโโ โโโโโโโ โโโโโ โโโ โโโโโโโโ โโโโโ โโโโโ โโโโโโโโโ โโโโโโ โโโ โโโโโโโ โโโโโโโโโโโ โโโ โโโ โโโโโโโโโโ โโโโโโโ โโโโโโโโโโโ โโโ โโโ โโโ โโโโโโ โโโโโโโโ โโโ โโโ โโโ โโโโโโโโโ โโโ โโโโโ โโโโโโโ โโโ โโโ โโโโโโโ C O D E I N T E L L I G E N C E L A Y E R
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file n3mo-2.0.0.tar.gz.
File metadata
- Download URL: n3mo-2.0.0.tar.gz
- Upload date:
- Size: 69.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1f4bfe65081ff8ea833606dfe860ce6ea5fd4f6c028a92f617bca4e7d8d7ac3
|
|
| MD5 |
7886984e450c20af2766d6461dc5bcb1
|
|
| BLAKE2b-256 |
4071a4371b467bd187c7640411e81d60dd0ada7a2dfadeccdcab286fede3ed17
|
Provenance
The following attestation bundles were made for n3mo-2.0.0.tar.gz:
Publisher:
publish.yml on RajX-dev/N3MO
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
n3mo-2.0.0.tar.gz -
Subject digest:
d1f4bfe65081ff8ea833606dfe860ce6ea5fd4f6c028a92f617bca4e7d8d7ac3 - Sigstore transparency entry: 2010056665
- Sigstore integration time:
-
Permalink:
RajX-dev/N3MO@9dc107a32f154d7a723050a1c3c63cf368519a88 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/RajX-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9dc107a32f154d7a723050a1c3c63cf368519a88 -
Trigger Event:
release
-
Statement type:
File details
Details for the file n3mo-2.0.0-py3-none-any.whl.
File metadata
- Download URL: n3mo-2.0.0-py3-none-any.whl
- Upload date:
- Size: 63.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc486c85208217d63d1a31fcd366e16078b4737cfe47aa733d9f1bd836e3dbdc
|
|
| MD5 |
138ca91953e4b83b2fd459ff44cd931d
|
|
| BLAKE2b-256 |
34d6c310a096053a6f01e91a33e16171a9aeb7d5bfc8ed7ff3bd9aa0ccf2ecd3
|
Provenance
The following attestation bundles were made for n3mo-2.0.0-py3-none-any.whl:
Publisher:
publish.yml on RajX-dev/N3MO
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
n3mo-2.0.0-py3-none-any.whl -
Subject digest:
cc486c85208217d63d1a31fcd366e16078b4737cfe47aa733d9f1bd836e3dbdc - Sigstore transparency entry: 2010056761
- Sigstore integration time:
-
Permalink:
RajX-dev/N3MO@9dc107a32f154d7a723050a1c3c63cf368519a88 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/RajX-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9dc107a32f154d7a723050a1c3c63cf368519a88 -
Trigger Event:
release
-
Statement type: