Blog 10 · Worked example

An app test checks the panel experience: the app starts the panel, calls the backing workflow, checks the response, and confirms the expected widget appears. The workflow behind each panel gets its own, deeper suite. A thorough app suite covers both, in that order.

Key terms in this post

  • App stage: The kind of request an app sends its workflow: InitDisplay when a panel first loads, Query for a typed question, Summary, and others.
  • Panel test: One test per top-level app panel, checking that the panel loads through its workflow and shows the expected widget.
  • Widget contract: The widget types a panel may or must show, such as a record table or a card list.
  • App sync plan: The same checklist for an app: each panel, the state of its panel test, and the workflow tests that must be finished first.

Other terms are defined in the ATLAS glossary.

The example is the Manager Coaching Workspace, an app with four panels. Each panel is backed by its own workflow, and each workflow answers several app stages: the panel’s first display, suggested actions, suggested communications, a free-text question, a summary, and in two cases filling in email parameters.

Manager Coaching Workspace app open in the AI Studio App Editor in VS Code, showing an Ask Oracle box, a team summary, priority actions and communications, with the Team Health Advisor panel below.
Screenshot. The Manager Coaching Workspace in the AI Studio App Editor, with the Team Health Advisor panel at the bottom and priority actions on the right. Names are masked.
Manager Coaching Workspace: four panels, each with one panel test, backed by four workflows with 7, 7, 9, and 9 tests
Figure 1. Four panel tests sit on top of 32 workflow tests. The panel tests prove the panels render; the workflow tests prove every stage and fallback behind them.

Step 1: Complete the backing-workflow tests first

Here is the Team Health workflow with each of its seven tests placed on the path it proves. Notice the shape, because most app-backed workflows look like this: shared data fetching and guard checks first, then a router on the app stage, then one model node per stage.

Team Health workflow: three Business Object fetches, a code normalizer, two IF guards with fallback messages, and an app-stage switch with five LLM nodes, each mapped to its test
Figure 2. Seven tests, seven paths. Live data is recorded once for InitDisplay; the other stages reuse it, and the two fallbacks use small generated responses.
TestInputDataChecks
init-displayInitDisplay stageRecorded livePath, plus a 7-criterion judge: one ranked team table, agreed columns, rows only from retrieved data, people needing attention first
init-actionsInitActions stageBaseline replayPath, plus a judge: at most four actions, each naming a real team member and the evidence behind it
init-communicationsInitCommunications stageBaseline replayPath, plus a judge: emails only to people in the roster, or nothing when no outreach is justified
query“Who on my team should I be most worried about right now, and why?”Baseline replayPath, plus a judge: direct answer first, named evidence, says plainly what isn’t on record
summarySummary stageBaseline replayPath, plus a judge: at most two sentences naming the top concern
team-health-is-unavailable-…InitDisplay, no manager assignmentGeneratedExact message and path only. No judge needed.
no-reporting-team-members-…InitDisplay, empty teamGeneratedExact message and path only. No judge needed.

Thoroughness lives in the edge cases.

The Recognition and Communications workflows add a FillParameters test (“Send a recognition note to <team member> for the work she has been putting in”) and a matching no-match test where the generated roster has no names. Its judge expects an empty greeting and no invented person. That second test is the one that catches a model making someone up.

Ask

Complete the workflow test sync plan for the Team Health workflow behind the Manager Coaching Workspace. Cover every app stage the workflow handles, record InitDisplay with real data, reuse it for the other stages, and use small generated data for the no-manager and no-team fallbacks.

The assistant runs: get-workflow-test-sync-plan · do-generate-workflow-test --data-capture-policy record-now | baseline-replay | model-generated · run-workflow-tests --workflow-code MANAGER_COACHING_TEAM_HEALTH --data-source file

Example: The real Team Health suite result

Workflow test suite passed: 7/7 passed, 0 failed, 0 needs judge.   Data source: file
Metrics:
  AI units: 30 total (6 token units, 5/7 cases computed).
  Latency: total workflow time 18.5s across 5/5 model-backed cases.
Optimization:
  Model optimization is available for this workflow. 5 passing tests exercise model-backed nodes.
  Next action: Run node-level model optimization sweep.

Only 5 of the 7 tests count toward AI units because the two fallback tests never reach a model. That is expected, and a quick sanity check that the fallbacks really skip the LLM.

Workflow test suite result for MANAGER_COACHING_TEAM_HEALTH: all 7 tests passed, run configuration, runtime metrics, and a summary with metrics, optimization and the test list.
Screenshot. The Team Health workflow suite report: 7 of 7 passed, with Metrics, Optimization, and one line per test.

Step 2: Inspect which panel tests are missing or out of date

Ask

Show me the app test sync plan for the Manager Coaching Workspace, including required backing workflow coverage. Do not run anything yet.

The assistant runs: get-app-test-sync-plan --file src/apps/<manager-coaching-workspace>.app

The app sync plan is the app-level version of the workflow sync plan: a checklist that lists each top-level panel, whether its panel test is missing or out of date, and which backing-workflow tests must be finished first.

Example: The real app test sync plan (read-only, nothing run)

PanelPanel testStatus
Team Health Advisorinit_display_team_health_advisor[update]
Recognition and Coaching Advisorinit_display_recognition_and_coaching_advisor[update]
Development Goals Advisorinit_display_development_goals_advisor[covered]
Communications and HR Review Advisorinit_display_communications_and_hr_review_advisor[covered]
Backing workflowMissingOut of syncNeeds reviewUp to date
manager_coaching_comms_hr0900
manager_coaching_goals_wf0700
manager_coaching_recognition_pw1720
manager_coaching_team_health3520

This plan was taken a few weeks after the suite in step 1 passed 36 of 36. The workflows had changed since, so two panel tests and every backing-workflow test were out of sync: the recorded paths no longer matched the current workflows. That’s exactly what the plan is for. It also says what a full sync would do, in order:

  1. Sync each backing workflow first. For each of the four workflows: its own sync plan, create or update tests one at a time, run the full workflow suite, attach the judge results.
  2. Then refresh the panel tests. Only once the workflows are current does it update the two out-of-date panel tests.
  3. Run the app suite and produce the final summary.

It also flagged steps that change data (one in Recognition, two in Team Health). The sync handles those separately, and they’re never replayed like an ordinary lookup.

How you phrase the follow-up sets the scope:

  • App-wide: “Run the complete app sync for Manager Coaching Workspace” or “Run all panel tests.” Every backing workflow loop runs, then every panel test.
  • Targeted: “Regenerate the Team Health workflow and its panel test” or “Run the Team Health Advisor panel test.” Only that workflow and panel run.

An app that is still an empty shell, with no panel wired to a workflow, has nothing to test yet. Tests become available once a top-level agent container exists.

Step 3: Create and record the panel tests

There is one InitDisplay test per top-level panel. Each one proves that:

  • the panel resolves to the intended workflow, and that workflow has an InitDisplay route;
  • the request uses the app-stage input shape and the expected path runs;
  • recordable nodes replay from stored data;
  • the returned widgets match the panel’s widget contract, and malformed widget JSON fails the test.

Example: From init_display_team_health_advisor.json (trimmed)

"scenario": { "kind": "app-panel", "appStage": "InitDisplay",
              "intent": "Verify the Team Health Advisor panel InitDisplay response and widget contract." },
"widgetAssertions": { "source": "panel-widget-list",
                      "allowedLayoutIds": ["ORA_LAYOUT_MULTIRECORD"], "allowedPatternIds": ["multiRecordWidget"] },
"judge": { "rubric": [ { "name": "Panel content comes from retrieved records" },
                       { "name": "Renders the panel widget contract" },
                       { "name": "Shows the team health columns" },
                       { "name": "Puts the people needing attention first" },
                       { "name": "Uses only supported badge priorities" },
                       { "name": "Leads with a short actionable narrative" } ] }

The assistant runs: do-generate-app-test --panel-segment team_health_advisor --data-capture-policy record-later · do-record-app-test-data · run-app-test --test-file test/apps/manager_coaching_workspace/init_display_team_health_advisor.json

Widget expectations come from the panel’s widget list first, then from the workflow’s output layout. If neither declares widgets, the test still runs with structural checks and no invented widget contract.

App test result for init_display_team_health_advisor: passed, widget assertions 1 of 1, path assertions 14 of 14, and semantic evaluation 5 of 5 with criterion results.
Screenshot. The Team Health Advisor panel test: the widget contract check, the path checks, and the judge’s criteria for the panel content.

Step 4: Run the app tests and read the summary

For an app, Validation and Insights lists the app test counts, the consolidated report, the app suite report, and for every backing workflow its own suite report, Metrics, and Optimization.

Example: The real consolidated result: 36 of 36 passed

Panel testWidget returnedJudge
Team Health AdvisormultiRecordWidget passed5/5
Development Goals AdvisormultiRecordWidget passed5/5
Recognition and Coaching AdvisormessageListWidget passed4/5
Communications and HR Review AdvisormultiCardWidget passed4/5
Backing workflowTestsAI unitsWorkflow time
Communications and HR Review9/94014.0 s
Development Goals7/73014.0 s
Recognition and Coaching9/94016.7 s
Team Health7/73018.5 s
Consolidated test suite result for the Manager Coaching Workspace: 36 of 36 passed, validation attention items, and the four workflow suites plus the app suite with their results.
Screenshot. The consolidated app report: all 36 tests passed across four workflow suites and the app suite, with the items that need a validation review listed first.

Ask

Test the Opportunity Details panel and its backing workflow. Verify that the panel opens, returns the correct information, and displays the expected layout. Create or update the needed tests and provide a concise report.

The assistant runs: do-sync-app-tests · run-app-tests --app-code <APP_CODE> · do-attach-app-test-judge-results · get-app-test-final-summary

A thorough app suite, at a glance

  • For every backing workflow: Every app stage it handles: InitDisplay, InitActions, InitCommunications, Query, Summary, FillParameters, InvokeAction Query with a real user question, not an empty message Every guard and fallback message No-match and missing-data cases for anything that resolves people or records Loop coverage where a stage loops over records
  • For the app: One InitDisplay test per top-level panel Widget contract checks A run against PUBLISHED backing workflows before release Conversation tests in the workflow suite for anything that pauses for a person

Key takeaways

  • Test the agents behind the panels first, then the panels themselves.
  • Record live data once for InitDisplay, reuse it for the other app stages, and use small generated data for fallbacks.
  • One panel test per top-level panel proves the panel renders its widget contract; the workflow suites prove every stage and edge case behind it.

Part 10 of the ATLAS learning path.

Previous: What “thorough” means for each kind of node

Next: Keep tests in sync

Back to the Learning Path for ATLAS