Skip to content
RasaGet a free license
Menu
Guides for AI teams

Guide · Platform / operations engineer

Agent build selection checks in Rasa

Trace a repository check from the selected example to its test command before accepting a green result.

by Rod Rivera

About 6 minutes to read

Key takeaways (3)
  • Match the tested directory to the example being added, rather than relying on a job name.
  • Distinguish an explicitly empty selection from an incomplete example that must fail.
  • Keep container readiness, offline tests, and credentialed runtime qualification as separate release evidence.

You add an agent example to a repository. Its container check is green, and a banking test job is green too. Before accepting the change, check which directory that second job tested.

In the Rasa examples repository, the container workflow could build a new example while a separate test matrix still named older banking examples. The two checks answered different questions. Putting their green statuses together did not establish that the new example’s own tests ran.

This guide is for the operator deciding whether those checks cover a release candidate. You will inspect the selected target, the command, and the result. Its runnable exercise checks the selector offline; it does not build a container or call an agent.

The same incomplete fixture gives a missing-Makefile error with the current target list and an empty selection with the declared old-target mutation.

The local comparison checks selection only. An empty list makes the workflow skip the example-test job.

Trace both workflows to their targets

A recorded Premier job was green at revision 5a0af21b. Its name was examples/fiserv-premier. Its steps built the container and reported READY; none ran the example’s make test command. The saved job metadata preserves the full revision and step list.

At that same revision, the separate banking test matrix named only jack-henry-banking and fiserv-banking. Premier was absent. This comparison inspects the matrix’s selectable names. Execution of that separate workflow on Premier’s change remains unverified.

The earlier Codespaces workflow builds each selected resource configuration. It runs the configuration’s creation check and looks for a READY line. In that continuous integration (CI) job, required-secret checks are deliberately skipped:

env:
  READY_SKIP_SECRETS: '1'

The corresponding readiness helper runs the project’s installation and validation check by default. Its success is useful environment evidence. Check the learner’s required credentials separately before a real conversation.

Meanwhile, the earlier banking test workflow contained this matrix:

matrix:
  project: [jack-henry-banking, fiserv-banking]

Those names differ from the new direct examples. They are shown here to explain the historical routing error, not as examples to restore or run.

EvidenceWhat it establishesWhat remains to check
Container starts and reports READYThat selected configuration passed its setup checkWhether this example’s tests ran; whether required runtime secrets were checked
Old matrix runs make testTests for the directories named by that matrixWhether the new example is one of those directories
Repaired job selects an example and runs its own make testThe selected example’s command ran in its selected environmentActual assertions, failures, skips, and any separate live qualification

Read the commands before interpreting the status. A test result belongs to the target that produced it.

Empty and incomplete need different outcomes

The repaired selector knows the direct Symitar, SilverLake, and Premier example names. It selects the ones actually present on the checked-out revision.

For each present example, it requires a Makefile, a dependency manifest, a lock, and the corresponding devcontainer configuration. A missing file raises Incomplete example instead of quietly dropping that target.

An empty checkout is different. The selector writes an explicit empty list, and the workflow skips the example-test job. That is a successful selection check with no example tests run. It must be recorded that way.

Here is the dangerous result when the selector itself knows only the old names. A disposable fixture contains examples/fiserv-premier but none of its required files. The output comparison, produced by this small probe, records both outcomes:

Same incomplete Premier fixtureActual selector resultWorkflow consequence
Current target listIncomplete example: examples/fiserv-premier/MakefileSelection fails visibly
Declared old-target mutation[]Selection returns successfully; the example-test job’s empty-list condition skips it

The second row is a local mutation, not an observed GitHub run. It exposes why successful empty selection needs a target-coverage control: a forgotten example looks exactly like legitimate absence.

The three selector controls use temporary directories. They check empty selection, complete new examples with old names ignored, and a present but incomplete example. Their fixture files contain placeholder text: these tests check selection and file presence, not the validity of a real lock or container configuration.

Route the missing input to the example owner

Refuse the incomplete target. Ask the example owner to supply its real manifest, resolved lock, Makefile, and configuration. Then let the selected environment run the actual tests. Placeholder files are sufficient for a selector fixture, not for a release candidate.

Check the executed command too

The repaired workflow uses the selected name for both its devcontainer configuration and its working directory. This excerpt is the command inside that container:

set -eu
unset RASA_LICENSE RASA_PRO_LICENSE OPENAI_API_KEY ANTHROPIC_API_KEY DEEPGRAM_API_KEY GEMINI_API_KEY
cd "$(git rev-parse --show-toplevel)/examples/${{ matrix.project }}"
make test

The job also sets inheritEnv: false. Its listed license and provider keys are unset before the test command. Keep those offline controls separate from a later credentialed conversation.

When a selected job fails, open that job’s output and retain the source revision, project name, command, and first failing assertion. Send the failure to the example owner. When it passes, inspect skipped tests too: a vendor-input test skipped because its definition file is absent is not a passing vendor-contract check.

Prove the selector notices the wrong targets

Use Python 3.12 and the pinned source:

git clone https://github.com/RasaHQ/rasa-community-resources.git
cd rasa-community-resources
git checkout 0285d2b86cc3d1fde13881ad68c5288429bce8e4
Any system
python3.12 -I -B -m unittest discover -s scripts -p test_banking_contract_scope.py -v

The recorded offline run on November 12, 2026 ended with:

----------------------------------------------------------------------
Ran 3 tests in 0.009s

OK

In a separate disposable copy, a declared mutation replaced only the selector’s target tuple with the old matrix names. The same controls then failed to recognize complete new examples and failed to reject an incomplete one. The mutation output ended with:

----------------------------------------------------------------------
Ran 3 tests in 0.009s

FAILED (failures=2)

That mutation tests the controls against the historical target mismatch. It is not a replay of an old GitHub job or a result from a running agent. No production source was changed.