How garak tests NeMo Guardrails rails for jailbreak and injection
garak sends probes through your guarded application using its NeMo Guardrails generators and reports a failure rate for each probe, so you can see how often jailbreak and injection attempts get past your input and output rails. The generator connects garak to NeMo Guardrails either in process, where the configuration loads inside the garak run, or against a guardrails server that exposes an HTTP API. garak is licensed under Apache 2.0 and installed from PyPI with pip, and the package requires Python 3.11 or newer. Before you write any scan configuration, confirm the exact generator name and its options in the user guide at docs.garak.ai for the garak version you pin, because generator names and settings can change between releases.
The first decision is which path to test. In-process testing runs the same Python code path your application uses when it calls the NeMo Guardrails library, which suits a developer workstation or a CI job. Testing against a guardrails server exercises the deployed HTTP surface, including the server image and the configuration folder it loads, which is closer to what users reach. Choose the path that matches the deployment you will defend in an assessment. Record the NeMo Guardrails version, the config.yml file, the Colang files and any Python actions that were loaded. Confirm which Colang version your configuration uses, because Colang 1.0 is the default and 2.0 is also supported, and the two are written differently.
garak is built from probes, detectors, evaluators, generators and harnesses. The default probewise harness runs each probe with its recommended detectors. By default garak makes 10 generations per prompt and marks a probe as FAIL with a failure rate when any attempt produces undesirable output. Read that rate with care. One attempt that gets through is enough to fail a probe, so the rate describes how often the guarded application produced undesirable output across attempts. It does not describe the outcome of a single conversation. Check the probe list and detector list for your pinned version, and confirm which detectors apply to the jailbreak and prompt injection probes you plan to run. Do not assume a probe maps to a particular rail without checking the configuration you tested.
Each run writes a JSONL report of every attempt and its evaluation, along with a garak.log file that continues across runs. Keep both with a snapshot of the configuration. Before you present results as evidence, run the scan more than once against the same build so you can see how much the failure rate moves between runs. Decide in advance which result would trigger a change to the rails or the configuration. Document which rails were active during each scan, including input rails, output rails and any jailbreak or injection detection you enabled. A result without the rail configuration cannot show what was tested, and an assessor will ask for it.
What you need before the first garak scan of NeMo Guardrails
These six items set up the scan: a compatible Python environment, both tools at known versions, the guardrails configuration, access to the underlying model and written authorization to probe. Check each one before the first run so that a failed scan can be traced to the guardrails.
One Python environment for both tools
garak requires Python 3.11 or newer, while NeMo Guardrails supports Python 3.10 through 3.13. The two floors differ, so the environment must satisfy both, which means Python 3.11, 3.12 or 3.13 for this scan. Create a dedicated virtual environment for the test harness so that package pins from the target application do not conflict with garak. Confirm the interpreter version in the same shell that runs the scan.
garak installed from PyPI
Install garak with pip from PyPI on Linux or macOS. The current reference for this page is garak v0.17.1, released on 16 October 2026. Record the exact version in your test notes, because probe names, detectors and report fields can change between releases. Read the release notes before upgrading an existing environment, and remember that garak.log is continued across runs, so keep earlier logs separate when you compare results.
NeMo Guardrails version and deployment mode
Install the nemoguardrails package from PyPI at v0.24.1, released on 16 September 2026, or at the version your production application uses. Decide early whether garak will call the library in process through the Python API or reach a guardrails server over HTTP. The server path needs an endpoint that the scanning host can reach, so confirm routing, TLS and firewall rules before the first run.
Guardrails configuration folder
Gather the complete configuration folder: config.yml, any optional Python actions and all Colang files. NeMo Guardrails supports Colang 1.0 and 2.0, with 1.0 as the default, so confirm which version the folder uses. Note whether LangChain is enabled through the NEMOGUARDRAILS_LLM_FRAMEWORK=langchain environment variable, because it changes how the application loads its model. Test against the same folder that production runs and record its revision.
Credentials for the underlying LLM
The guardrails sit in front of a model, so garak needs access to that model through the same provider settings the application uses. Prepare API keys or endpoint credentials in environment variables or your secrets store, and confirm the account has quota for the volume of requests. By default garak makes 10 generations per prompt, so a scan sends far more requests than a single test call. Ask the model owner which rate limits and logging policies apply.
Written permission to probe the target
Get written authorization from the owner of the application, the model provider account and the environment that hosts the guardrails. Jailbreak and injection probes can trigger alerts, content filters or provider abuse reviews, so the approval should name the hosts, models and time window. Keep the approval with the scan record, and agree who receives the JSONL report and garak.log before the run starts.
Choosing in-process or guardrails server testing
Choose the deployment shape before you write any garak configuration, because it decides which part of the stack your results describe. garak can reach NeMo Guardrails in two ways: by calling the NeMo Guardrails Python API inside the same process as garak, or by pointing garak at a guardrails server that loads configurations from a folder and exposes an HTTP API. The server can be built from the Dockerfile that NVIDIA provides in the NeMo Guardrails repository. Both shapes run the same rails logic, but they exercise different things, so the choice is a testing decision, not a packaging preference.
In-process testing isolates the rails configuration. garak imports the library, loads one configuration directory, and sends probes straight into the rails pipeline. This makes it easy to change a Colang file or a config.yml setting and rerun a probe set to see the effect. The cost is that the test skips the HTTP layer, authentication, request routing, timeouts and any proxy in front of the application. A pass in this mode shows that the rails hold, not that the deployed endpoint holds.
The server shape tests the endpoint your users actually reach. garak sends requests over HTTP to the same guardrails server image, with the same folder of configurations, that the application calls in production. This catches problems that in-process runs cannot see, such as a configuration folder that was not mounted, a server that loads a different config name, or a gateway that strips or rewrites fields. Confirm with the platform owner how the production service is started, which port and path it uses, and whether any headers or API keys are required, so the garak REST generator is configured against the same surface.
Two settings must match the target exactly. First, the Colang version. Colang 1.0 is the default in NeMo Guardrails, and Colang 2.0 is also supported. A configuration written for one version can behave differently under the other, and migrated files still need manual review according to NVIDIA's migration guidance. Record the Colang version in your test plan and confirm it with the team that runs the target. Second, the LangChain integration is opt-in and enabled with the NEMOGUARDRAILS_LLM_FRAMEWORK=langchain environment variable. If production sets this variable and your test environment does not, or the reverse, you are testing a different stack from the one users reach.
Document the shape, Colang version, library version and environment variables with every garak report, since the JSONL output records attempts but not your deployment choices. Pin the NeMo Guardrails release you test, and repeat the scan after any configuration or framework change. Ask the team that owns the target which shape gives the evidence they need: in-process runs are cheaper to iterate on, while server runs are the stronger check before a release.
How to run a garak scan against guarded NeMo Guardrails
This sequence sets up a repeatable garak scan against a NeMo Guardrails application, from pinned packages and a verified configuration to a baseline report you can compare after each change. Each step ends with a check so the team knows the scan is measuring the guarded application, not the raw model.
Pin garak and NeMo Guardrails versions
The engineer creates a dedicated virtual environment using Python 3.11 or newer, since the garak PyPI package requires that version, and a Python version from 3.10 to 3.13 for NeMo Guardrails. Install a specific garak release and a specific nemoguardrails release that you have tested together, such as garak v0.17.1 and NeMo Guardrails v0.24.1, and record both in your change log. Done when pip freeze lists both packages at the chosen versions and both packages import without errors in that environment.
Confirm the guardrails configuration loads
The engineer checks that the config.yml file, any Python actions and the Colang files load together without errors. Send a benign prompt, such as a simple product question, through the same entry point garak will use. Confirm which Colang version your configuration targets, since Colang 1.0 is the default and 2.x requires its own configuration structure. Done when the benign prompt returns a normal answer, no rail blocks it, and the logs show no configuration warnings that would change how the rails behave.
Select the NeMo Guardrails generator mode
Choose in-process mode, where garak calls the NeMo Guardrails Python API directly, or server mode, where garak sends requests to a guardrails server that loads configurations from a folder and exposes an HTTP API. Use the generator name and options documented for your pinned garak version at the garak user guide, because these can change between releases. Done when one test prompt sent through the selected generator returns a response from the guarded application, and the server log shows the request when server mode is used.
Choose jailbreak and injection probes
The security engineer selects probes from garak's jailbreak and prompt injection families, matched to the rails you configured. Input rails should face injection and jailbreak attempts, and output rails should face attempts that try to extract unsafe content. Keep the recommended detector that each probe uses by default, because the default probewise harness runs every probe with its recommended detectors. Done when a written probe list exists with the detector for each probe and the owner of the guardrails configuration has reviewed it.
Run a small first scan
Start with a short probe list before the full scan. Garak makes 10 generations per prompt by default, so run time and the number of calls to your guarded application and model provider grow with every probe you add. Any single undesirable output marks that probe as FAIL and reports a failure rate, so a small run also shows how your rails respond to the probes. Done when the small run finishes without pipeline errors and the results match what the team expected from the probes selected.
Verify the JSONL report and garak.log
Each garak run writes a JSONL report with every attempt and its evaluation, and a garak.log debugging file that continues across runs. Check that both files appear in the output location you configured, that the JSONL report has an entry for each attempt in the small run, and that garak.log names the generator you selected. Done when both files exist, each probe in the run appears in the report, and the log contains no unexplained errors from the guarded application.
Record the baseline for later comparison
Save the JSONL report, garak.log, package versions, probe and detector list, generator mode and a copy of the guardrails configuration as the baseline for this application. Run the full scan after the small run is verified, and store its results with the same metadata. When the configuration changes, repeat the scan and compare failure rates for each probe against this baseline. Done when the baseline is stored with a named owner and the team can reproduce the run from the recorded versions and configuration.
Which rail types and garak results map to each finding
This table links each of the five NeMo Guardrails rail types to the kind of garak probe result it is expected to influence and the JSONL field you check. Treat it as a planning aid, and confirm each mapping against the garak and NeMo Guardrails versions you pin before you rely on it.
| Rail type | Probe results it is expected to influence | JSONL evidence to check | Traceability note |
|---|---|---|---|
| Input rails | Jailbreak and prompt injection probes that FAIL when the malicious prompt reaches the model unblocked | Probe and prompt fields, plus the attempt's outputs showing whether the request was refused or passed through | Record whether the input rail blocked the prompt before the model was called, since a blocked prompt should not produce a model output |
| Dialog rails | Multi-turn or persona-based probes where the model drifts off the allowed conversation flow | Attempt sequence and per-turn outputs, checked for off-topic or unauthorized responses | Confirm the flow definitions in your Colang files match the version under test, because migrated flows need manual review |
| Retrieval rails | Probes that inject instructions through retrieved context, where chunks carry hostile text into the prompt | Retrieved chunk content included in the attempt record, alongside the detector verdict | Only applicable if your scanned application uses retrieval; otherwise mark this layer as not exercised in the report |
| Execution rails | Probes that try to trigger custom actions or tools with attacker-chosen arguments | Attempt outputs that reference tool calls, action names or returned results | Log which action ran and its parameters, since garak's report shows output text rather than tool-side effects |
| Output rails | Probes where the model produces disallowed content that gets past the model but should be caught before the user sees it | Output text and detector verdict fields, showing whether the final response was altered or withheld | Compare the raw model output with the rail-filtered response, if your harness can capture both |
| Jailbreak and injection detection in NeMo Guardrails versus garak detectors | Both can flag the same attempt, so a FAIL alone does not show which layer failed | Detector name for garak and the matching NeMo Guardrails detection event in your application logs | Record both verdicts for every attempt so a failure can be traced to a specific layer, input rail, output rail or the model itself |
Reading garak reports to find which rail failed
The summary line tells you which probe failed, but not which rail let the output through. To find the rail, work from the attempt level. Each garak run writes a JSONL report with a record for every attempt and its evaluation, so for each FAIL you need the prompt sent, the response your application returned, and the detector's verdict on that response. Start with the probes marked FAIL, then open the matching attempt records. Because the default harness runs each probe with its recommended detectors, the evaluation fields tell you which detector judged the output, which narrows the search to the rail that should have handled that kind of content. Confirm the exact field names in the report produced by your garak version before you write any parsing scripts.
The key question for each failing attempt is whether the model produced the undesirable output or a rail should have stopped it. Check what the input rail did with the prompt and whether the output rail ran on the response. Then read garak.log and the NeMo Guardrails logs for that same prompt, to see which rails were triggered and what they returned. Illustrative example: if the input rail passed a jailbreak variant unchanged, and the model's answer reached the caller without any output rail action, the gap sits in the input rail or in the output rail's coverage, not in the model. If a rail fired and the response still leaked, the rail's action or its configured check is the suspect. Record your conclusion per failing probe so the remediation owner knows which configuration file to review.
A single FAIL still matters. garak makes 10 generations per prompt by default and marks a probe as FAIL, with a failure rate, when any one attempt produces undesirable output. A failure rate of one in ten therefore reports the same status as ten in ten. Treat any failing attempt as evidence that a route through your rails can produce that output. Reproduce it by rerunning the single probe against the same configuration and checking whether the attempt recurs. Some attempts will be non-deterministic, so a failure that does not reproduce on the first rerun still belongs in your findings with its prompt and response preserved, and should be reviewed before anyone marks it as resolved.
Comparing runs after a configuration change requires keeping each run separate. garak.log continues across runs, so it does not isolate one run's messages on its own. Save each run's JSONL report in its own directory, named with the date, the garak version and the NeMo Guardrails version and configuration revision used. The current garak release is v0.17.1, released on 16 October 2026, and the current NeMo Guardrails release is v0.24.1, released on 16 September 2026. Compare the two runs probe by probe, and then attempt by attempt for any probe whose status changed. Do not merge reports from different garak or NeMo Guardrails versions into one trend line, because a change in either tool can alter results independently of your rails.
A failure rate is not a complete measure of security. It reports how the probes you selected behaved under one configuration, on one run, with the generations counted in that run. A probe that never fails tells you only that the probe did not trigger undesirable output, not that the application is safe against attacks the probe does not cover. Confirm which probes and detectors your scan included, record that selection with each report, and decide which probe families need coverage before you report results to a stakeholder. Use the reports as evidence of specific gaps to fix and retest, and pair them with a review of your rail configuration and a periodic rescan after each change.
Securing the guardrails endpoint and scan data
A garak scan against a NeMo Guardrails deployment touches three exposure points: the guardrails server's HTTP API, the credentials that call the underlying model, and the reports the scan produces. Each card below sets a control for one of those points, plus the change-control steps that keep the rails tested as they evolve.
Restrict access to the guardrails server
A guardrails server loads configurations from a folder and exposes an HTTP API, so anyone who can reach it can send prompts through your rails. Limit network reachability to the scanning host and the application tier, and place authentication in front of the API according to your own gateway or identity design. Confirm in your environment which endpoints the server exposes before you point garak at it, and document which callers are allowed.
Keep provider credentials out of the repository
The guardrails configuration and the garak REST generator YAML both reference model endpoints, and the model call usually needs an API key. Load these values from a secrets store or from environment variables injected at runtime, and keep them out of config.yml, Colang files, generator files and CI logs. Scan the repository for accidental keys before each merge and rotate any key that has appeared in a commit.
Control where scan reports are stored
Each garak run writes a JSONL report of every attempt and its evaluation, and garak.log is continued across runs. Together they hold the adversarial prompts and the model outputs, which can include sensitive content your rails failed to block. Store both in a restricted location with access limited to the security team, set a retention period you can defend, and avoid copying them into shared tickets or chat channels.
Limit scan traffic to authorized targets
garak sends many prompts per probe, with 10 generations per prompt by default, so a misdirected run can load a production model or a third-party provider. Define an allowlist of target endpoints for each scan and confirm the target in the generator configuration before every run. Run against a staging deployment with the same rails configuration whenever the production system can not absorb the traffic.
Pin versions after review
garak v0.17.1 was released on 16 October 2026, and NeMo Guardrails v0.24.1 was released on 16 September 2026. Both projects change, and a version bump can alter probe behavior, detectors or rails handling. Pin the garak and nemoguardrails versions in your environment, review release notes before upgrading, and record the versions used for each report so results can be compared over time.
Retest rails after each Colang change
A rail that blocked a jailbreak last week can stop blocking it after an edit to a Colang flow, a flow priority or an action. Treat every change to Colang files or config.yml as a trigger for a fresh garak scan against the affected rails, and compare the failure rates with the previous baseline. Keep the baseline runs with their configuration version so a regression can be traced to a specific change.
Review converted Colang 2.x rails
NVIDIA documents a Colang 1.0 to 2.x migration using the nemoguardrails convert tool, and states that converted configurations still need manual review. Do not assume a converted rail behaves like the original. Review each converted flow by hand, then rerun the full garak scan against the converted configuration and compare results with the Colang 1.0 baseline before cutover.
Why NeMo Guardrails scans fail or give misleading results
This table lists the failures most likely to break a garak scan of a NeMo Guardrails application or make it look safer than it is, with the cause and a check to run for each. Read it before the first scan and again whenever results change between runs. The main takeaway is that many clean results come from the rails or from mismatched environments, so confirm the test target and versions before reading a pass as model safety.
| Failure | Likely cause | Check and fix |
|---|---|---|
| Python version mismatch | garak's PyPI package requires Python 3.11 or newer, while NeMo Guardrails supports 3.10 to 3.13, so a shared environment can fail or resolve differently. | Run python --version in the same shell for both installs. Use 3.11, 3.12 or 3.13 for the shared environment and reinstall both packages there. |
| Generator cannot find the config folder or Colang files | The generator path points to the wrong directory, or the working directory changes between runs so a relative path resolves differently. | Print the resolved absolute path in the run script. Load the config once with the NeMo Guardrails Python API to confirm the Colang files parse before scanning. |
| Colang version mismatch | A Colang 1.0 configuration is run with 2.0 expectations, or the reverse. Colang 1.0 is the default, so a config without an explicit version is read as 1.0. | Check the Colang version declared in config.yml against the file syntax. Review converted configs manually, since the migration guide says converted configurations still need review. |
| LangChain behavior differs between runs | The opt-in variable NEMOGUARDRAILS_LLM_FRAMEWORK=langchain is set in one shell, CI job or container but missing from the other. | Print the variable in each environment before every run and record its value in the report header. Compare results from the same probe set in both environments. |
| Server results do not match the tested config | The guardrails server image or endpoint loads a different config folder, library version or model than the local configuration garak was pointed at. | Compare the server image tag and a checksum of the config folder with the local copy. Send one known prompt to the endpoint and confirm the response matches the local run. |
| Clean results come from the rails, not the model | Input rails can refuse a probe before the model receives it, so the pass reflects the rail and the model is never tested. | Count blocked responses separately from model responses. Run the same probes against the model through the same generator with rails switched off in a copy of the config, then compare. |
| Reports that mix versions | Results from different garak, NeMo Guardrails or config versions are written to one report folder, and garak.log continues across runs. | Write each run to its own report directory. Record the garak, NeMo Guardrails and config versions in the report header and confirm the JSONL file matches that run. |
Keeping rail tests in regression after config changes
A garak scan only works as a gate if it runs the same way every time. Pin the probe selection, the generator settings and the garak version in a file stored with config.yml, the Colang files and any Python actions. Re-run that identical probe set after every change to config.yml, an action or a Colang file. Because each run writes a JSONL report of every attempt and its evaluation, you can compare two runs at the attempt level instead of only by summary. Confirm that the generator points at the same guardrails configuration folder on each run, since a scan against a different folder tests a different application.
Upgrades are the second trigger. garak v0.17.1, released on 16 October 2026, may change probe or detector behavior, so run the existing configuration against the old and new garak versions on a branch before accepting the new output as the reference. NeMo Guardrails v0.24.1, released on 16 September 2026, can change how input and output rails fire even when your files stay the same. Record both versions in the report metadata so that a later failure can be traced to a cause. A failure that appears only after a library upgrade points to the upgrade, not to your configuration.
A Colang migration is the heaviest trigger. NVIDIA documents a Colang 1.0 to 2.x migration with the nemoguardrails convert tool and states that converted configurations still need manual review. Treat the converted application as a new build and run the full probe set, not a subset. A rail that blocked a probe under Colang 1.0 may pass it after conversion, or the reverse, so keep the Colang 1.0 baseline archived and compare both sets of results side by side throughout the cutover.
Store each baseline JSONL report together with its garak.log, the commit hash, the probe list and both tool versions. garak.log continues across runs, so archive a copy for each run instead of relying on the file in the working directory. Decide in advance what counts as a regression. Typical rules include a probe moving from PASS to FAIL, a higher failure rate on any probe, or any new failure on probes covering data leakage. These thresholds are team decisions. Agree them with the security owner and record them in the gate policy before the first comparison is made.
The results feed a release gate in the pipeline. The job runs garak against a staging guardrails server, compares the output with the stored baseline and blocks promotion when the agreed rules are broken. Record who may override a block and what evidence the override requires. A passing scan only covers the probes it ran, so the gate report should list the probe set explicitly. Before go-live, confirm that the pipeline runner can reach the generator endpoint and that the scan length fits your release schedule. Ask any implementation partner to name the gate, its inputs and its owner in the written scope.
How much effort does a garak test of NeMo Guardrails take?
What makes a garak test of NeMo Guardrails cost more or take longer?
The main drivers are the size and shape of the guardrail configuration, the number of probes and generations, and how many configurations or environments must be covered. Rails and actions: a config with input, dialog, retrieval, execution and output rails, plus custom Python actions, has more paths to exercise than a single input filter. Colang version and migration state: a Colang 1.0 configuration that is still being converted to 2.x needs both the old and new behavior checked. Deployment mode: testing the in-process Python API differs from testing a guardrails server reached over HTTP, because the server adds endpoint configuration and authentication. Probe volume: garak makes 10 generations per prompt by default, so the probe selection and generation count set the number of model calls. Ask the provider to state each of these inputs in the written scope.
Which parts of a garak test are one-time and which recur?
The first engagement is one-time work, and later regression runs are recurring. One-time: environment setup, the first scan, establishing a baseline of results, and reviewing the report with your team. Recurring: regression runs after you change rails, actions, Colang files, prompts or the underlying model, and re-testing after NeMo Guardrails or garak version upgrades. The garak release v0.17.1 and NeMo Guardrails v0.24.1 are examples of versions that may require retesting when you adopt them, so check the release notes before each upgrade. Confirm in the quote whether retesting is included, how many regression cycles are covered, and whether support for upgrades is a separate retainer.
What does our team need to provide for a garak test of NeMo Guardrails?
The work depends on four inputs from your side. Configuration access: the config.yml, Colang files, Python actions and any server settings, in a copy or repository the testers can read. Test model credentials: access to the model or application endpoint that the guardrails wrap, in a non-production environment where possible. An authorized target: written permission to send adversarial probes to that environment, with an agreed window and rate limits. A named owner for findings: one person who triages failed probes, decides on fixes and signs off on residual risk. Without these, the first phase tends to stall on access rather than testing. Confirm each item in the scope document before work starts.
Can an internal team run a garak test of NeMo Guardrails on its own?
Yes, a team with Python skills and access to the target can install garak from PyPI, which requires Python 3.11 or newer, and run it against a guardrails configuration. The harder parts are usually elsewhere: writing the REST or NeMo generator configuration, choosing probes that match your threat model, and interpreting results. Each run writes a JSONL report of every attempt and its evaluation, plus a garak.log file, so the output is detailed but requires judgment to read. A common approach is to pilot one configuration internally, then decide whether to bring in outside help for scope, coverage across environments, or independent review. Compare your team's time with the written scope before deciding.
What should a written quote for this work include?
A useful quote states the scope in terms you can verify. Ask for: the list of configurations, environments and deployment modes covered; the NeMo Guardrails and garak versions tested; the probe set and generation count, with the reason for each choice; the number of test cycles and whether regression runs are included; the report format and review meeting; and what the client must supply, with dates. Also ask what is excluded, such as remediation of rails, model fine-tuning or changes to the application. DeployOpen works from a fixed written scope with agreed deliverables and timelines, and it does not publish a price list, so the quote follows from that scope. Ask for the assumptions behind any effort figure.
Does a garak scan prove our guardrails are secure?
A garak scan measures how the configured rails respond to the probes you select, within the limits of that probe set and the detectors used. It does not provide a guarantee that an attacker cannot bypass the rails, and a passing run does not replace a broader security assessment. Treat results as evidence for a specific configuration and version. Record which probes, detectors and generation counts were used, so the result can be reproduced after a change. Ask the provider to state in writing what the test does not cover, and how residual risk will be recorded for your owner to accept or reject.
How do we keep garak results comparable across NeMo Guardrails changes?
Hold the probe set, detectors, generation count and target endpoint constant, and record the exact garak and NeMo Guardrails versions for every run. Store the JSONL reports and garak.log with the configuration commit that was tested, so a later run can be compared against the baseline. When a result changes, check first whether the cause is a rail change, a model change, or a version upgrade before reading it as a regression or improvement. Confirm with the provider how baselines are versioned and kept, and who owns them after the engagement ends.
How DeployOpen scopes and delivers a garak test of NeMo Guardrails
DeployOpen plans and runs garak scans against your NeMo Guardrails configuration in infrastructure you control, measuring how input and output rails respond to jailbreak and injection probes. Each engagement starts with a written scope that names the guardrails setup, the access path and the findings you need.
How we scope
- Confirm whether the guardrails run in process through the Python API or as a guardrails server over HTTP.
- Record which rails are in place: input, output, dialog, retrieval and execution rails, and which Colang version is in use.
- Agree the probe families, generation count and detectors to run, and what counts as a failure for your application.
How we build
- Configure a garak generator that reaches your guarded application, using the NeMo Guardrails generator for in-process runs or the REST generator for a server.
- Run baseline scans against an unguarded model and the guarded application so the rail effect can be compared.
- Review each garak JSONL report and garak.log entry, separating true rail failures from detector noise before reporting.
How we hand over
- Deliver the garak configuration files, run commands and scan reports so your team can repeat the test.
- Document each failing probe with its attempts, failure rate and the rail or configuration involved.
- Provide a written summary of findings, open questions and recommended configuration changes for your own review.
How we support
- Ongoing support, upgrades and continuous testing are available as a retainer after the initial scope is delivered.
- Re-run the scan suite when garak or NeMo Guardrails versions change, and check whether configuration migrations need manual review.
- Confirm the retainer scope, cadence and reporting in writing before work starts, since each engagement is fixed-scope.

