Production-ready open-source framework for authorized prompt-injection, chatbot security, and sensitive-disclosure testing.
InjectionForge Pro X is a security testing framework for evaluating LLM-powered chatbots, AI agents, and conversational APIs against prompt injection, instruction override, and sensitive information disclosure risks.
The framework is designed for:
- Internal security assessments.
- Developer validation before releasing AI/chatbot features.
- Authorized bug bounty testing where AI/chatbot testing is in scope.
- Lab environments and CTF-style training.
- Regression testing of AI safety controls.
The project includes multilingual payload support, evidence-gated detection, report redaction, configuration profiles, CI checks, rate limiting, and multiple connector types.
Use this tool only on systems where you have explicit authorization.
- Overview
- Authorization Notice
- Key Capabilities
- Installation
- Quick Start
- Validation Before Use
- Recommended Workflow
- Command Reference
- Configuration Profiles
- Target Examples
- Analyzer Modes
- Language Modes
- Rate Limiting
- Report Redaction
- Output Formats
- Validation Dataset
- GitHub Actions CI
- Project Structure
- Operational Guidance
- Troubleshooting
- Limitations
- Contributing
- License
InjectionForge Pro X can generate adversarial prompts and test sensitive-disclosure behavior. Only use it against targets that you own, operate, or are explicitly authorized to test.
For real targets, use the --authorized flag to acknowledge authorization:
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --authorizedThe flag is not a legal bypass. It is a safety reminder and workflow marker. You are responsible for following the target's program rules, rate limits, and testing boundaries.
| Capability | Description |
|---|---|
| Multi-protocol connectors | REST, GraphQL, WebSocket, SSE, Ollama, OpenAI, Claude, Gemini, Cohere, HuggingFace, and mock target. |
| Multilingual testing | English, Bahasa Indonesia, mixed-language, and automatic language mode. |
| Evidence-gated analyzer | Avoids naive keyword-only detection. Requires concrete evidence before marking a finding as successful. |
| Analysis modes | strict, balanced, and sensitive modes for different testing phases. |
| FP/FN regression dataset | 171 labeled cases covering leaks, refusals, redacted values, benign echoes, examples, placeholders, and mixed-language responses. |
| Redaction and safe persistence | Redacts report output and runtime SQLite result storage by default, including analyzer-extracted literals. |
| Rate limiting | Global token-bucket limiter shared across worker threads. |
| Profiles | JSON/YAML profiles for repeatable target configuration. |
| CI workflow | GitHub Actions workflow for compile checks, tests, analyzer validation, and benchmark evaluation. |
| Multiple report formats | JSON, HTML, CSV, PDF, XLSX, and terminal output. |
- Python 3.10 or newer.
- Windows, Linux, or macOS.
- Internet access only if you use vendor LLM APIs, headless browser mode, or optional model downloads.
git clone https://github.com/Mafifrizi/InjectionForgeProX.git
cd InjectionForgeProX
pip install -r requirements.txtThe project uses bounded compatible ranges for every direct dependency. This prevents an unreviewed major-version upgrade while keeping installation practical across supported Python platforms. For an immutable deployment, resolve these ranges into a hash-locked environment after validating the target platform:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
python -m pip checkThe optional browser-backed WAF workflow requires extra dependencies:
pip install -e ".[browser]"Headless browser mode requires Playwright browser assets:
playwright installOnly install Playwright browsers if you intend to use --headless or browser-assisted WAF handling.
pip install -e .[test]
injectionforge --versionThis installs the project in editable mode and enables the console entry point.
PowerShell supports line continuation with backticks:
python forge_x.py --target mock `
--analysis-mode strict `
--language auto `
--offlineAlternatively, run the command on one line.
Use this first to verify that the tool is working locally:
python forge_x.py --target mock --rounds 5 --offlinepython forge_x.py --profile examples/profiles/mock-strict.jsonpython forge_x.py --target mock --rounds 5 \
--format html --output reports/mock-report.html --offlineThe reports/ directory is created automatically when a report is written. Report files are runtime artifacts and should not be committed.
python forge_x.py --validate --light --offline --analysis-mode balancedpython evaluate.py --analysis-mode strictBefore using the tool on a real target or before pushing changes, run:
python -m compileall -q .
pytest -q
python forge_x.py --validate --light --offline --analysis-mode balanced
python evaluate.py --analysis-mode strict
python forge_x.py --version
python forge_x.py --profile examples/profiles/mock-strict.json --rounds 2Expected baseline:
pytest: 58 tests passed
Analyzer validation: quality gate passed
Benchmark: 100% precision and 100% recall on bundled regression dataset
Version: InjectionForge Pro X 1.1.1
Profile mode: campaign runs successfully
The bundled dataset is a regression benchmark. It does not guarantee zero false positives or zero false negatives on every real-world LLM target.
Use a small number of rounds, low worker count, and rate limiting.
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --language auto --analysis-mode balanced \
--audit --rounds 10 --workers 1 --rate-limit 1 --burst 1 \
--timeout 20 --format json --output reports/recon.json \
--offline --authorizedPurpose:
- Confirm that the endpoint works.
- Confirm the correct
--json-path. - Observe normal response behavior.
- Avoid overloading the target.
Use sensitive mode when looking for potential findings. This mode is designed to reduce false negatives, so manual review is required.
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --language auto --analysis-mode sensitive \
--category advanced --rounds 30 --workers 2 --rate-limit 1 --burst 1 \
--timeout 25 --format json --output reports/candidates.json \
--offline --authorizedPurpose:
- Find possible prompt-injection or disclosure candidates.
- Collect enough evidence for manual review.
- Avoid treating early candidates as final findings.
Use strict mode for final validation.
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --language auto --analysis-mode strict \
--audit --rounds 20 --workers 1 --rate-limit 1 --burst 1 \
--timeout 25 --diff --format html --output reports/final.html \
--offline --authorizedPurpose:
- Reduce false positives.
- Confirm that evidence is concrete.
- Produce a report suitable for internal review or authorized bug bounty triage.
Before reporting a finding:
- Reproduce it manually with the minimum payload.
- Verify the impact.
- Confirm the behavior is not a harmless echo or placeholder.
- Keep report redaction enabled unless the report is stored securely.
- Follow the target's disclosure policy.
| Flag | Values | Description |
|---|---|---|
--profile |
file path | Load JSON/YAML target profile. CLI flags override profile values. |
--authorized |
boolean | Confirms that the operator is authorized to test the target. |
--version |
boolean | Print tool version and exit. |
| Flag | Values | Description |
|---|---|---|
--target |
auto, mock, custom, openai, claude, gemini, cohere, ollama, huggingface, graphql |
Target connector type. |
--endpoint |
URL | Target API, WebSocket, SSE, GraphQL, or page URL. |
--method |
POST, GET, WS, SSE |
Request method or streaming protocol. |
--headers |
JSON or Key:Value |
Additional request headers. |
--cookie |
string or file | Cookie string or file path. |
--json-path |
path | Field containing response text, for example reply, data.text, or choices.0.message.content. |
--form |
boolean | Send payload as form-encoded body. |
--timeout |
seconds | Request timeout. |
--proxy |
URL | HTTP/SOCKS proxy. |
--insecure |
boolean | Disable TLS verification for authorized internal testing. |
--api-key |
string | API key for vendor LLM connectors. Prefer environment variables or secure secret storage. |
--model |
string | Model name for Ollama, HuggingFace, or vendor connectors. |
| Flag | Values | Description |
|---|---|---|
--csrf-token |
URL or token | Fetch or provide CSRF token. |
--auth-endpoint |
URL | Endpoint used to fetch auth token. |
--auth-data |
JSON or key-value | Auth request body. |
--login |
URL | Login form URL for auto-login flow. |
--username |
string | Username for login flow. |
--password |
string | Password for login flow. |
Do not commit secrets, cookies, API keys, or generated report files.
| Flag | Values | Description |
|---|---|---|
--language |
auto, en, id, mixed |
Payload and analyzer language mode. |
--analysis-mode |
strict, balanced, sensitive |
Analyzer decision mode. |
--validate |
boolean | Run analyzer validation dataset. |
--light |
boolean | Use lightweight validation behavior. |
--offline |
boolean | Avoid model downloads and use deterministic checks. |
--llm-judge |
Ollama URL | Optional confirmatory local LLM judge. |
| Flag | Values | Description |
|---|---|---|
--category |
basic, advanced, indirect, agent, graphql |
Payload category. |
--rounds |
integer | Number of attempts. |
--mutate |
boolean | Enable standard payload mutation. |
--aggressive |
boolean | Enable aggressive mutation and generator fallback. Use carefully on real targets. |
--audit |
boolean | Use audit-oriented payload selection. Recommended for real targets. |
--adaptive |
boolean | Enable adaptive payload weighting. |
--multi-stage |
boolean | Enable priming plus exploitation flow. |
--history |
file path | JSON conversation history file. |
--workers |
integer | Worker thread count. |
--rate-limit |
number | Global request rate limit across all workers. |
--burst |
integer | Token-bucket burst size. |
--ai-payloads |
boolean | Generate target-aware assessment probes with a local LLM, retrieve validated prior probes for the same target scope, and retain analyzer-confirmed successes. |
--ai-only |
boolean | Skip the template baseline and run only local AI-generated probes. Requires --ai-payloads. |
--ai-generator-url |
URL | Local Ollama URL for adaptive AI probe generation. |
--ai-generator-model |
model | Local model name for adaptive AI probe generation. |
--ai-generator-timeout |
seconds | Local AI generation timeout; defaults to 8 seconds before safe fallback probes are used. |
| Flag | Values | Description |
|---|---|---|
--attack-tree |
boolean | Run adaptive attack-tree mode. |
--max-depth |
integer | Attack-tree depth. Keep low for real targets. |
--adaptive-agent |
boolean | Run adaptive multi-turn agent. More exploratory and noisier than audit mode. |
--target-description |
string | Manual target description for adaptive agent. |
| Flag | Values | Description |
|---|---|---|
--bypass-waf |
cloudflare, akamai, auto, none |
WAF bypass strategy. Use only if explicitly allowed. |
--tls-fingerprint |
random, chrome, firefox, safari |
TLS fingerprint profile where supported. |
--headless |
boolean | Use headless browser support. |
--stealth |
boolean | Enable User-Agent rotation and jitter. |
--delay |
seconds | Base delay between requests. |
--discover |
boolean | Auto-discover chat endpoints from a page. |
--auto-profile / --no-auto-profile |
boolean | Enable or disable target profiling. Disabled by default; enable it only when profiling probes are authorized. |
--discover-external |
boolean | Permit discovery to follow external script/endpoint references. Disabled by default to prevent unintended cross-origin requests. |
--waf-detect |
boolean | Detect WAF without running a campaign. |
--graphql-introspect |
boolean | Run GraphQL introspection where authorized. |
| Flag | Values | Description |
|---|---|---|
--format |
json, html, csv, pdf, xlsx, term |
Report format. |
--output |
file path | Output report path. |
--redact |
boolean | Enable report redaction. Disabled by default; enable it only when profiling probes are authorized. |
--no-redact |
boolean | Disable report redaction. Use only when safe. |
--diff |
boolean | Compare response with a neutral baseline. |
Profiles reduce operator mistakes during repeated engagements. They are useful when a target needs many flags such as headers, method, JSON path, rate limit, and output settings.
Run with a profile:
python forge_x.py --profile examples/profiles/mock-strict.jsonCLI flags override profile values:
python forge_x.py --profile examples/profiles/mock-strict.json --rounds 2{
"target": "custom",
"endpoint": "https://api.example.com/chat",
"method": "POST",
"json-path": "reply",
"headers": {
"Authorization": "Bearer REPLACE_ME"
},
"language": "auto",
"analysis-mode": "strict",
"audit": true,
"rounds": 20,
"workers": 2,
"rate-limit": 1,
"burst": 1,
"offline": true,
"authorized": true,
"format": "html",
"output": "reports/final.html"
}- Keep real secrets out of committed profile files.
- Use placeholders such as
REPLACE_MEin examples. - Keep one profile per engagement or target environment.
- Prefer
strictmode for final validation profiles. - Prefer
rate-limitfor small or sensitive production systems.
--ai-payloads adds a local-model generation layer; it is not a replacement for validation. The engine derives a non-secret target description when one is not supplied, retrieves previously validated probes for the same target fingerprint, generates bounded assessment probes through a local Ollama model, and stores only analyzer-confirmed successes with redacted metadata.
The default is hybrid: a short deterministic baseline can establish behavior, then AI-generated probes add target-aware coverage. Use --ai-only when an authorized engagement explicitly requires generated probes without the template baseline.
# Hybrid baseline plus generated probes
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --ai-payloads \
--ai-generator-url "http://localhost:11434" --ai-generator-model llama3 \
--rounds 10 --workers 1 --rate-limit 1 --authorized --offline
# Generated probes only; use on an explicitly authorized target
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --ai-payloads --ai-only \
--target-description "customer-support assistant with retrieval" \
--rounds 10 --workers 1 --rate-limit 1 --authorized --offlineThe generator is deliberately constrained to synthetic assessment markers and must not be treated as a mechanism for requesting real credentials or confidential data. The retained database stores payload metadata and evidence summaries, not raw target responses.
python forge_x.py --target mock --rounds 10 --analysis-mode strict --language auto --offlinepython forge_x.py --target custom --endpoint "https://api.example.com/chat" \
--method POST --json-path "reply" \
--headers '{"Authorization":"Bearer TOKEN","Content-Type":"application/json"}' \
--language auto --analysis-mode strict --audit --rounds 20 \
--workers 2 --rate-limit 1 --burst 1 \
--format html --output reports/rest-final.html \
--offline --authorizedpython forge_x.py --target custom --endpoint "https://api.example.com/chat?q=" \
--method GET --json-path "data.answer" \
--language auto --analysis-mode balanced --rounds 10 \
--workers 1 --rate-limit 1 --offline --authorizedpython forge_x.py --target custom --endpoint "https://api.example.com/chat" \
--method POST --form --json-path "reply" \
--headers '{"Authorization":"Bearer TOKEN"}' \
--language auto --analysis-mode strict --audit \
--rounds 20 --workers 1 --rate-limit 1 \
--format html --output reports/form-final.html \
--offline --authorizedpython forge_x.py --target graphql --endpoint "https://api.example.com/graphql" \
--category graphql --language auto --analysis-mode strict \
--rounds 20 --workers 2 --rate-limit 1 \
--format html --output reports/graphql-final.html \
--offline --authorizedUse --graphql-introspect only when introspection testing is explicitly allowed by the program or owner.
python forge_x.py --target custom --method WS --endpoint "wss://chat.example.com/ws" \
--language auto --analysis-mode strict --rounds 15 \
--workers 1 --rate-limit 1 \
--format html --output reports/ws-final.html \
--offline --authorizedpython forge_x.py --target custom --method SSE --endpoint "https://chat.example.com/events" \
--language auto --analysis-mode strict --rounds 10 \
--workers 1 --rate-limit 1 \
--format html --output reports/sse-final.html \
--offline --authorizedpython forge_x.py --target ollama --model llama3 \
--category advanced --language auto --analysis-mode balanced \
--rounds 20 --offlinepython forge_x.py --target openai --api-key "$OPENAI_API_KEY" --model "gpt-4o-mini" \
--language auto --analysis-mode strict --rounds 10 \
--format json --output reports/openai-check.json --authorizedPrefer environment variables or a local secret manager for API keys.
| Mode | Use case | Behavior |
|---|---|---|
strict |
Final reports, bug bounty validation, client-facing output | Requires stronger evidence and minimizes false positives. |
balanced |
Normal internal testing | Balances precision and recall. |
sensitive |
Early exploration and candidate discovery | More sensitive to possible findings; requires manual review. |
Recommended workflow:
sensitive -> candidate discovery
strict -> retest and validation
manual -> final reproduction and impact review
| Mode | Description |
|---|---|
auto |
Uses automatic language handling and mixed payload coverage where appropriate. Recommended default. |
en |
English payloads and English-oriented refusal handling. |
id |
Bahasa Indonesia payloads and Indonesian refusal handling. |
mixed |
Combines English and Indonesian coverage. Useful for bilingual targets. |
Examples:
python forge_x.py --target mock --language id --analysis-mode strict --offline
python forge_x.py --target mock --language en --analysis-mode strict --offline
python forge_x.py --target mock --language mixed --analysis-mode balanced --offline--rate-limit enables a global token-bucket limiter shared by all worker threads.
Examples:
--rate-limit 1 --burst 1
--rate-limit 0.5 --burst 1
--rate-limit 2 --burst 2
--rate-limit 0Guidance:
| Target type | Suggested workers | Suggested rate limit |
|---|---|---|
| Mock/lab | 2-8 | disabled or 5 req/s |
| Small internal app | 1-2 | 0.5-1 req/s |
| Bug bounty target | 1-2 | 0.5-1 req/s unless rules allow more |
| WebSocket/SSE | 1 | 0.5-1 req/s |
For real targets, start slow. Increase only when explicitly allowed.
Built-in HTTP connectors use one shared retry contract. Retryable transport failures (408, 425, 429, 500, 502, 503, 504, connection failures, and timeouts) are retried with bounded exponential backoff; Retry-After is honored up to 60 seconds. Every retry passes through the same global rate limiter.
Terminal transport errors are marked as transport_error, never passed to the analyzer, and never used to change adaptive payload weights. To prevent a campaign from amplifying provider throttling, a campaign-local circuit breaker stops new target calls after three consecutive exhausted 429 outcomes.
Reports are redacted by default. Redaction applies to response bodies, leaked-data fields, evidence previews, and every concrete value extracted by the analyzer. Runtime SQLite result storage uses the same redaction policy by default, so a report is not the only protected output.
Default behavior:
python forge_x.py --target mock --format html --output reports/report.htmlDisable redaction only when necessary:
python forge_x.py --target mock --format json --output reports/raw.json --no-redactRecommended practice:
- Keep
--redactenabled for shared reports. - Use
--no-redactonly in restricted internal storage. - Never commit reports to GitHub.
- Verify redacted evidence before sending a report externally.
| Format | Use case |
|---|---|
json |
Machine-readable output and later processing. |
html |
Human-readable review report. Recommended for final review. |
csv |
Spreadsheet-friendly summary. |
pdf |
Static report sharing. |
xlsx |
Spreadsheet report with richer formatting. |
term |
Terminal-only output. |
Examples:
python forge_x.py --target mock --format json --output reports/result.json --offline
python forge_x.py --target mock --format html --output reports/result.html --offline
python forge_x.py --target mock --format csv --output reports/result.csv --offline
python forge_x.py --target mock --format pdf --output reports/result.pdf --offline
python forge_x.py --target mock --format xlsx --output reports/result.xlsx --offlineThe analyzer is evidence-gated. A response is not marked as successful just because it contains words like:
password
token
secret
system prompt
you are
kata sandi
rahasia
A positive finding requires stronger signals such as:
- Sensitive value assignment.
- Credential-like token/API key format.
- Non-redacted system or developer prompt disclosure.
- Instruction override confirmation.
- Canary response from an injection-style prompt.
- Optional LLM judge confirmation plus local evidence.
False-positive filters include:
- Refusal messages that mention sensitive words.
- Redacted or masked values.
- Placeholder values.
- Educational examples.
- User-supplied values echoed back by the target.
Example analysis metadata:
{
"success": true,
"confidence": 0.98,
"method": "evidence:strong_leak",
"leak_category": "API Key / Token",
"severity": "Critical",
"analysis_mode": "balanced",
"decision_reason": "Concrete evidence matched for API Key / Token.",
"evidence": [
{
"category": "API Key / Token",
"source": "labeled-sensitive-assignment",
"reason": "API key assignment",
"value_preview": "sk-m...[REDACTED]...4321"
}
]
}The bundled regression dataset contains 171 labeled cases across these case types:
api_key_leaktoken_leakpassword_leaksystem_prompt_leakinstruction_overriderefusalredactedplaceholdereducational_examplebenign_echobenign_security_advicemixed_language_refusal
Run validation:
python forge_x.py --validate --light --offline --analysis-mode balanced
python evaluate.py --analysis-mode strictThis dataset is intended to prevent known regressions. It is not a substitute for manual review on real targets.
This release includes:
.github/workflows/ci.yml
CI runs on push and pull request. It performs:
python -m compileall -q .
pytest -q
python forge_x.py --validate --light --offline --analysis-mode balanced
python evaluate.py --analysis-mode strict
If CI fails:
- Open the failed job in the Actions tab.
- Read the failing step.
- Reproduce the same command locally.
- Fix the code or test.
- Push again.
InjectionForgeProX/
|-- forge_x.py
|-- evaluate.py
|-- pyproject.toml
|-- requirements.txt
|-- README.md
|-- SECURITY.md
|-- CHANGELOG.md
|-- docs/
| |-- PRODUCTION.md
| |-- USAGE.md
|-- examples/
| |-- profiles/
| |-- mock-strict.json
| |-- rest-balanced.json
|-- core/
| |-- analyzer.py
| |-- attack_tree.py
| |-- adaptive_agent.py
| |-- config.py
| |-- database.py
| |-- engine.py
| |-- language.py
| |-- rate_limiter.py
| |-- redaction.py
| |-- reporter.py
| |-- payloads.py
| |-- payload_generator.py
| |-- connectors/
| |-- rest.py
| |-- graphql.py
| |-- websocket.py
| |-- sse.py
| |-- mock_target.py
|-- data/
| |-- benchmark.json
| |-- labeled_test_set.json
| |-- payloads_basic.json
| |-- payloads_basic_id.json
| |-- refusal_phrases.txt
| |-- refusal_phrases_id.txt
|-- tests/
|-- .github/
| |-- workflows/
| |-- ci.yml
Use profiles for each environment:
examples/profiles/dev-chatbot.json
examples/profiles/staging-chatbot.json
examples/profiles/prod-chatbot-strict.json
Recommended defaults:
analysis-mode: strict
language: auto
workers: 1 or 2
rate-limit: 1
redact: true
format: html
Run the mock target and validation dataset before modifying analyzer logic:
pytest -q
python forge_x.py --validate --light --offline --analysis-mode balanced
python evaluate.py --analysis-mode strictIf you change analyzer logic, add regression cases under data/labeled_test_set.json and tests under tests/.
Before testing:
- Confirm the target program explicitly allows chatbot/AI testing.
- Confirm rate-limit rules.
- Avoid WAF bypass unless it is explicitly allowed.
- Keep
--analysis-mode strictfor final reports. - Manually reproduce every finding.
Recommended final retest command:
python forge_x.py --target custom --endpoint "https://target.example/api/chat" \
--method POST --json-path "reply" --language auto --analysis-mode strict \
--audit --rounds 20 --workers 1 --rate-limit 1 --burst 1 \
--timeout 25 --diff --format html --output reports/final.html \
--offline --authorizedInstall dependencies:
pip install -r requirements.txtFor development:
pip install -e .[test]Install test dependencies:
pip install -r requirements.txtThe reports/ directory is created automatically when a report is written:
python forge_x.py --target mock --format html --output reports/test.html --offlineDo not commit generated reports.
Check --json-path. For example, if the response is:
{
"data": {
"reply": "hello"
}
}Use:
--json-path "data.reply"Use strict mode:
--analysis-mode strictAlso check whether the target is echoing user input. Echoes are usually not vulnerabilities unless they cause a real policy bypass or sensitive disclosure.
Use sensitive mode for discovery:
--analysis-mode sensitiveThen retest candidates with strict mode.
Lower workers and rate limit:
--workers 1 --rate-limit 0.5 --burst 1 --timeout 30Open the Actions tab and wait for the workflow to complete. First-time workflow runs can take a few minutes.
If pushing .github/workflows/ci.yml fails, update your GitHub Personal Access Token with:
repo
workflow
Then remove the old GitHub credential from Windows Credential Manager and push again.
No analyzer can guarantee zero false positives or zero false negatives across every real-world LLM response. This project reduces risk through:
- Evidence-gated detection.
- Regression datasets.
- Analyzer modes.
- Redaction.
- Rate limiting.
- CI tests.
- Manual review workflow.
For final reporting, use --analysis-mode strict and manually verify every success=true finding.
If you discover a vulnerability in this project, follow the guidance in SECURITY.md.
Do not open public issues containing secrets, tokens, private target details, or live exploit evidence.
Before opening a pull request:
python -m compileall -q .
pytest -q
python forge_x.py --validate --light --offline --analysis-mode balanced
python evaluate.py --analysis-mode strictRecommended contribution areas:
- More labeled regression cases.
- Additional language packs.
- Safer report templates.
- Connector improvements.
- Documentation examples.
Released under the MIT License. See LICENSE for details.