Release Intelligence — setup & end-to-end
Turn your IDE into a release-confidence engine: validate PRs with PASS / WARN / BLOCK, unify incident history into Engineering Memory, cluster failure patterns with 30-day trend, gate named Release Bundles, and learn from post-ship outcomes — in Cursor, VS Code, CI, and the web app.
testneo_pr_validation_workflow (validate + Release Brief) or testneo_developer_release_workflow (mega-tool: memory sync → optional code generate → validate → optional bundle + gate). Planning runs without write access; test execution needs confirm: true + TESTNEO_MCP_ALLOW_WRITE=true.
Business flow (end to end)
Five stages connect organizational memory to every ship decision:
| Stage | Who | What happens | Outcome |
|---|---|---|---|
| 1. Ingest | QA lead | Upload bug CSV, sync Jira, or paste postmortem RCA | Unified incident timeline in Engineering Memory |
| 2. Patterns | QA lead | Re-cluster → review source mix + Worsening/Stable trend | Repeat failures visible before sprint ship |
| 3. Validate | Developer | PR validation + memory match cards with pattern_id links | Know why risk is high before merge |
| 4. Ship | EM / PM | Named release bundle → Evaluate Gate → confidence + brief | Data-backed go/no-go for this deploy |
| 5. Learn | EM / on-call | Record rollback/incidents → calibration panel | Read-only hints (e.g. ignored patterns → 3× rollback rate) |
Trust: Calibration suggestions are read-only — TestNeo never auto-changes your gate threshold.
The intelligence lifecycle
Teams with few tests today: start with MCP Customer E2E (generate → run), then return here for PR validation.
What is a PR validation?
One PR validation = one full review of a pull request or branch diff:
- Impact analysis on changed files
- Risk score (0–100) and AI release brief
- Optional impacted test execution (uses your test runs allowance separately)
- Evidence, fix plan, and PR comment draft
Each run is stored at /web/pr-validation/<workflow_id> — share the link in GitHub or Slack. Re-opening the same workflow does not use another credit.
| Signal | Score | Meaning |
|---|---|---|
| 🟢 PASS | 0–34 | Low risk; standard review |
| 🟡 WARN | 35–69 | Review impacted validation before merge |
| 🔴 BLOCK | 70–100 | Blocking findings; hold the release |
Three ways to validate: MCP in Cursor/VS Code · comment @TestNeo validate on a GitHub PR (when GitHub Release Intelligence is enabled) · manual trigger in the web app.
GitHub Release Intelligence shipped
Opt-in per project. When enabled, every PR open/sync (or a comment trigger) runs the same engine as MCP — including parallel impacted test execution by default.
Setup (5 minutes)
- PR Validation or Release Readiness → GitHub Release Intelligence → Step 1 — Connect repository (
owner/repo+ PAT withreposcope) - Index from GitHub on your target branch — see Code index from GitHub (replaces ZIP for connected repos)
- Enable auto-validation → Register webhook (or use Run on a PR # for smoke test)
- Toggle Execute impacted tests (default on) and optional Jira sync before validate
- On any open PR, comment
@TestNeo validateto re-run
| Setting | Default | Notes |
|---|---|---|
execute_impacted_tests | true | Runs mapped tests on PR (parallel, max 10) |
max_parallelism | 4 | Concurrent test runs |
comment_trigger_enabled | true | @TestNeo validate on PR comments |
post_check_run | true | GitHub Check Run on head SHA |
Release gate in CI: use the testneo-release-gate GitHub Action with a bundle_id — returns GATE_PASS or fails the job on GATE_BLOCK.
Code index from GitHub
No ZIP upload when your repo is connected — clone, index, and reuse across PR validations for blast radius, impacted tests, and execution evidence.
Step by step
- Connect GitHub — Release Intelligence → Step 1 — Connect repository (
owner/repo+ PAT) - Pick branch — Code index → Branch to index (default or feature branch)
- Index from GitHub — Wait 1–3 minutes; confirm Active index shows file/function counts
- Validate PRs — Leave Use code impact when index is available ON in GitHub Release Intelligence
repo. Add webhook scope if you use Register webhook from the UI.Fine-grained: Contents Read · Pull requests Read and write · Metadata Read · Webhooks Read and write (optional).
Self-hosted: set
GITHUB_ENCRYPTION_KEY in server .env before first connect. If the key changes, use Update token and paste a new PAT.
Without a code index, PR validation still runs but shows neutral execution evidence and no blast radius. Air-gapped repos: AI Assistant → Code Scanning (ZIP) or MCP testneo_sync_code_structure.
Hands-on demo — GitHub to ship readiness
~15 minutes on app.testneo.ai: connect repo → index → Engineering Memory → validate a PR.
| Step | Where in TestNeo | What you should see |
|---|---|---|
| 1. Project | Create or open a project with at least one environment | Tests exist or will be added; risk scoring works from day one |
| 2. Connect GitHub | PR Validation → GitHub Release Intelligence | Connected repo name; PAT stored securely |
| 3. Code index | Same panel → Code index → branch dropdown → Index from GitHub | Active index with file/function counts; optional index history row |
| 4. Engineering Memory | Engineering Memory → upload bug CSV or Add postmortem | Entries ingested; Re-cluster on Patterns tab |
| 5. Auto-validation | GitHub Release Intelligence toggles + Register webhook | Webhook active; or use Run on a PR # for a manual smoke test |
| 6. PR validation | PR Validation detail for the run | Risk score + PASS/WARN/BLOCK; memory matches when changed files overlap prior incidents |
| 7. Release readiness (optional) | Release Readiness → bundle + gate | Confidence score across validated PRs in the window |
realworld_app_engineering_memory_bugs.csv, realworld_app_postmortem_signin.md).
Memory is project-scoped — matching uses changed file paths in the PR diff, not the GitHub repo name.
repo). 0 memory matches → PR paths must overlap CSV/postmortem. 0 impacted tests → run tests in TestNeo first. Webhook not firing locally → use Run on PR #.
Full customer setup: Customer PR validation flow. Self-hosted / local stack: Realworld App demo.
Setup — MCP in your IDE
1. Account & API key
Sign up → Settings → API keys (tn_…).
2. MCP config (Cursor or VS Code)
Cursor: ~/.cursor/mcp.json · VS Code + Copilot: .vscode/mcp.json in your project — then Developer: Reload Window (no npm install).
{
"mcpServers": {
"testneo": {
"command": "npx",
"args": ["-y", "@testneo/mcp-server@0.2.1"],
"env": {
"TESTNEO_BASE_URL": "https://app.testneo.ai",
"TESTNEO_API_KEY": "YOUR_API_KEY",
"TESTNEO_MCP_ALLOW_WRITE": "false"
}
}
}
}
Set TESTNEO_MCP_ALLOW_WRITE to true only when you want test execution inside validation.
3. Verify
In chat: Validate my TestNeo connection or call testneo_validate_connection.
4. IDE playbooks (auto-behavior)
Optional IDE playbooks (Cursor, VS Code Copilot, and other agents) auto-detect git context and call testneo_pr_validation_workflow first when configured in your project.
Full install steps: MCP Quickstart.
End-to-end checklist (PR focus)
| Step | Action |
|---|---|
| 1 | MCP connected (testneo_validate_connection) |
| 2 | testneo_list_projects → note <PROJECT_ID> |
| 3 | Connect Jira once (AI Assistant → Jira Integration → select project key) or prepare bug CSV |
| 4 | testneo_pr_validation_workflow with confirm: false — or testneo_developer_release_workflow for one-shot generate + validate + bundle |
| 4b | Optional: enable GitHub Release Intelligence → comment @TestNeo validate on PR |
| 5 | Open /web/pr-validation/<workflow_id> in the app |
| 6 | If BLOCK → testneo_explain_failure + testneo_suggest_fix |
| 7 | Sprint ship → create release bundle → Evaluate Gate |
| 8 | Engineering Memory → Patterns tab → Re-cluster → review trends |
| 9 | After deploy → Record outcome on Release Readiness → review calibration |
Greenfield (no tests yet)? Run Customer E2E first, then repeat from step 4 on every PR.
Prompt techniques (copy-paste)
Replace <PROJECT_ID> and <PR_NUMBER> with your values. More prompts: MCP Prompt Packs — PR Validation.
Validate PR (planning only)
Ask in Cursor / Copilot:
Validate PR <PR_NUMBER> for project <PROJECT_ID>. Use git to detect base_sha, head_sha, and changed_files. Call testneo_pr_validation_workflow with confirm false. Show PASS/WARN/BLOCK, risk score, top findings, and the PR comment draft. Give me the workflow_id link to the web board.
Preflight (before you push)
I'm modifying [list files] in project <PROJECT_ID>. What's the historical failure rate and flakiness on related tests? Have we seen BLOCK-level PRs on these paths recently?
After BLOCK — explain & fix
Explain why this PR is blocked — root cause per finding. Then give me the NOW/NEXT fix plan and which tests to rerun.
Release readiness (end of sprint)
Is project <PROJECT_ID> ready to release to production? Give me release confidence and a Go / No-Go verdict with top risks.
PR risk trend
Show recent PR validation history for project <PROJECT_ID> — what's the risk trend over the last two weeks?
🆕 Define a Release Bundle and get unlock actions (v1.1)
Define release v2.4.0 for project <PROJECT_ID>. Include these PR validation IDs: [<WF_ID_1>, <WF_ID_2>, <WF_ID_3>]. Gate policy: both. Min confidence: 85. What do I need to fix to ship?
🆕 Pre-validate Engineering Memory hint (v1.1)
I'm about to change: app/services/order_service.py, app/models/order.py. Before I push — any historical risk patterns for these files? Project <PROJECT_ID>.
Patterns + trend (QA lead)
Call testneo_refresh_engineering_memory_patterns with project_id <PROJECT_ID>. Call testneo_list_engineering_memory_patterns with project_id <PROJECT_ID>. Summarize worsening patterns, source_mix, and best_resolution for each.
Full ship loop + outcome learning (EM5–EM8)
Create release bundle v2.4.0 for project <PROJECT_ID> with workflow_ids [...]. Call testneo_evaluate_release_gate with bundle_id, policy both, min_confidence 85. After deploy: testneo_record_release_outcome with rollback / incident_within_7d. Call testneo_get_release_calibration — leadership summary.
Engineering Memory — validate PR with Jira (Phase A, default)
Validate PR <PR_NUMBER> for project <PROJECT_ID>. Use git for base_sha, head_sha, changed_files. Call testneo_pr_validation_workflow with sync_jira_before_validate true and confirm false. Show Historical Incident Matches and explain they match by file/area — not PR number.
Engineering Memory — Jira & CSV → live PR matches
Store historical bugs in TestNeo (bug CSV, Jira Bug/Incident issues, postmortems). When a PR is validated, memory rows are scored against that PR's changed files — there is no permanent bug-to-PR link.
Phase A flow (shipped)
QA files bug in Jira (label: orders)
↓
Dev validates PR (MCP / webhook / open PR in UI)
↓
Auto: Jira → Engineering Memory ← Phase A
↓
Auto: score memory vs PR changed files
↓
"Engineering Memory Match" on PR board
| Path | When Jira syncs |
|---|---|
MCP testneo_pr_validation_workflow | Step 0a — sync_jira_before_validate: true (default) |
| GitHub webhook | Before validate — toggle in GitHub Release Intelligence |
| PR detail UI | Before live · live memory lookup on page load |
| Manual | Engineering Memory page → Sync from Jira (optional) |
Setup (one-time)
- TestNeo → AI Assistant → Jira Integration → connect → select project key (e.g. SCRUM)
- Team-managed Jira: use labels (
orders,checkout) — Components may not exist - Or upload bug CSV with
affected_areacolumn (no Jira required)
MCP: Workflow 8 · Workflow 10 · Prompts EM1–EM9 · Tools: Engineering Memory reference
Unified patterns & trend
After ingest, Re-cluster groups memory entries into unified failure patterns across Jira, CSV, and postmortem sources. Each pattern shows:
- Occurrence count with source mix (e.g. Seen 5× (2 Jira, 1 postmortem))
- Trend badge — Worsening if last 30 days > prior 30 days; otherwise Stable
- Best-known fix from your RCAs
- Shareable drill-down:
/web/engineering-memory?project_id=<ID>&pattern_id=<ID>&view=patterns
Web UI — step by step
- Open Engineering Memory → select project → Patterns tab
- Click Re-cluster after bulk ingest
- Click a pattern row → detail panel with trend narrative + contributing entries
- View contributing entries filters the Entries tab by
pattern_id
PR validation link-through
On /web/pr-validation/<workflow_id>, Engineering Memory Match cards include View pattern → — opens the pattern detail with context preserved.
MCP
testneo_refresh_engineering_memory_patterns(project_id) testneo_list_engineering_memory_patterns(project_id) // list + trend testneo_list_engineering_memory_patterns(project_id, pattern_id) // detail testneo_list_engineering_memory(project_id, pattern_id) // contributing entries
Release Bundles — named release candidates v1.1
A Release Bundle is a named group of PR validations representing a specific release candidate — "Release v2.4.0 = these 8 PRs" instead of "the last 14 days of history". The confidence score, unlock actions, and AI Release Brief are all scoped to exactly that bundle.
What you get from a bundle
- Confidence score — 5-factor unified score scoped to exactly the PRs in the bundle
- Unlock actions — "Fix PR #278 → +8 confidence" — specific, not vague
- AI Release Brief — Go/No-Go verdict, release notes, deploy checklist, rollback plan
- CI/CD gate — API endpoint your pipeline calls; returns GATE_PASS or GATE_BLOCK
- Shareable link —
/web/release-readiness?bundle_id=<id>— PM and on-call don't need Cursor
MCP tools (C22–C25)
| Tool | What it does |
|---|---|
testneo_developer_release_workflow | Mega-tool (C25). Memory sync → optional generate_if_unmapped → validate → optional auto_release_bundle + gate in one call. |
testneo_sync_code_structure | Index repo ZIP for code impact before first PR validate. |
testneo_generate_tests_from_code | Generate NLP tests from function/file/folder/codebase (VS Code parity). |
testneo_create_release_bundle | Define release candidate by name + PR validation IDs. Returns confidence + unlock actions. |
testneo_generate_release_brief | Accepts bundle_id to generate a brief scoped to the bundle. |
testneo_pre_validate_hint | Engineering Memory check before coding — surfaces historical risk for changed files (C23). |
testneo_get_release_readiness | Accepts bundle_id to score exactly the bundled PRs. |
Unified confidence formula (v1.1 — 5 factors)
| Factor | Weight | Signal |
|---|---|---|
| Verification Coverage | 35% | % of PRs that are PASS or WARN (not BLOCK) |
| Execution Evidence | 20% | Impacted tests ran + pass rate + flaky suppression. Neutral (50) if no runs — no penalty. |
| Average PR Risk | 20% | Inverted mean risk score across all PRs in bundle |
| Component Health | 15% | High-risk / worsening components across changed files |
| Engineering Memory | 10% | HIGH-tier incident matches — recurring failure patterns |
CI/CD Gate policies
| Policy | Blocks when |
|---|---|
both (recommended) | Any BLOCK PR exists or confidence < threshold |
no_block | Any BLOCK PR exists |
min_confidence | Confidence < threshold |
warn_only | Never hard-blocks — posts GATE_WARN check |
Override: EM-level users can pass override_reason to force-pass the gate. The override is recorded with user, timestamp, and reason for audit.
Gate + outcome stub
When testneo_evaluate_release_gate returns GATE_PASS, TestNeo automatically creates an outcome stub row you can update after deploy. Use testneo_evaluate_release_gate from MCP or Evaluate Gate in Release Readiness.
Outcome learning — ship → measure → calibrate
Close the loop after production deploy. TestNeo correlates gate decisions with post-ship signals (rollback, incidents, hotfixes) and surfaces read-only calibration suggestions — e.g. “Releases that ignored HIGH memory patterns had 3× rollback rate.”
Web UI — step by step
- Open Release Readiness → select a release bundle (
?bundle_id=<uuid>) - Click Evaluate Gate (
GATE_PASSstubs an outcome row) or Mark bundle deployed - After deploy window: Release Outcome Learning → Record outcome — rollback, incident within 7d/30d, hotfix count, notes
- After 2–3 recorded outcomes: Calibration panel shows suggestions
Note: Post-ship Jira/PagerDuty webhook setup is API/MCP advanced only in the current release — not in the web UI. Day-1 ship loops use manual Record outcome above.
MCP tools
| Tool | Purpose |
|---|---|
testneo_evaluate_release_gate | Gate decision; stubs outcome on GATE_PASS |
testneo_get_release_outcomes | List outcome history for project/bundle |
testneo_record_release_outcome | Mark deployed or PATCH post-ship signals |
testneo_get_release_calibration | Read-only policy suggestions |
Recipe: MCP Workflow 10 · Prompts EM5–EM8
15-minute customer demo
Quick timeline for a live call. Step-by-step setup: Hands-on demo · Code index from GitHub.
| Min | Step | Web UI | MCP |
|---|---|---|---|
| 0–2 | Connect GitHub + code index | GitHub Release Intelligence → Code index | — |
| 2–5 | Ingest bugs + postmortem | Engineering Memory → upload / paste | testneo_ingest_* |
| 5–7 | Patterns + trend | Patterns tab → click pattern | testneo_list_engineering_memory_patterns |
| 7–10 | PR with memory match | PR Validation detail → View pattern | testneo_pr_validation_workflow |
| 10–12 | Bundle + gate | Release Readiness → Evaluate Gate | testneo_evaluate_release_gate |
| 12–15 | Outcome + calibration | Record outcome modal | testneo_get_release_calibration |
Web UI (same data as MCP)
- PR Validation board —
/web/pr-validation - PR detail —
/web/pr-validation/<workflow_id>(live Engineering Memory · auto Jira sync) - Engineering Memory —
/web/engineering-memory— CSV, Jira sync, postmortem, Patterns tab with trend - Pattern drill-down —
/web/engineering-memory?project_id=<ID>&pattern_id=<ID>&view=patterns - Branch health — Analytics → Branch (CI + PR risk overlay)
- Release Readiness —
/web/release-readiness— confidence, bundle picker, Release Brief, gate, Outcome Learning panel - Create Bundle wizard —
/web/release-bundle-create— 3-step: name + policy → select PRs → create - Shareable bundle link —
/web/release-readiness?bundle_id=<id>— share with PM/on-call, no login required to view
Tool reference and JSON contracts: PR Validation & Release Confidence.
Plans & limits
| Plan | PR validations / 30d | MCP writes / day |
|---|---|---|
| Free | 25 | 30 |
| Starter | 50 | 50 |
| Pro | 200 per user | 150 |
| Release Intelligence | 800 per user | 400 |
| Team | 2000 shared pool | 500 |
Errors: release_verification_limit_reached (monthly PR validation cap) or MCP 403 (daily write cap). See MCP troubleshooting — limits.
FAQ
| Question | Answer |
|---|---|
| Do memory entries need a PR number? | No — matching uses changed files and impact areas. |
| When should we Re-cluster? | After bulk ingest (CSV, Jira sync, postmortem). |
| What does “Worsening” mean? | More hits in the last 30 days than the prior 30 days for that pattern. |
| Does calibration change our gate automatically? | No — suggestions are read-only. |
| What counts toward plan limits? | Each new PR validation (one pull request or branch review) = one credit. Test runs inside a validation are separate. |
Current release scope
| Surface | Status | Notes |
|---|---|---|
| PR validation (GitHub + MCP) | ✅ | Auto on PR; @TestNeo validate |
| Engineering Memory | ✅ | Jira, CSV, postmortem → patterns + PR matches |
| Release Readiness | ✅ | Bundle, gate, Mark deployed → Record outcome → Calibration |
| Test Manager → CLI export | ✅ | Export .testneo ZIP — see TestNeo CLI |
MCP (@testneo/mcp-server@0.2.1) | ✅ | Default cloud execution in mcp.json.example |
| Post-ship webhooks UI | — | Not in web UI; API/MCP tools remain for integrators |
Last updated July 2026 · Release 2.2 + Layer 4 brief · Engineering Memory Phases 1–5 · MCP @testneo/mcp-server@0.2.1 (69 tools) · Default MCP config: cloud execution · PR/GitHub comments show Why this score, Test gaps, release-confidence drivers