Skip to content

test(conformance): executed-case manifests for renderer, agent, and extension harnesses - #3823

Merged
gspencergoog merged 60 commits into
a2ui-project:mainfrom
gspencergoog:test/renderer-conformance-manifests
Nov 5, 2026
Merged

gspencergoog merged 60 commits into
a2ui-project:mainfrom
gspencergoog:test/renderer-conformance-manifests

Conversation

@gspencergoog

@gspencergoog gspencergoog commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Before this change, conformance/scripts/check_executed_cases.py checked executed-case manifests only for the core conformance corpus. Renderer adapters, agent SDK runners, and framework extension runners could skip a suite or test case without failing CI. Each renderer adapter test file also embedded its own copy of mounting, step execution, and view-tree inspection logic.

This pull request extracts shared adapter_harness modules across the web, Flutter, and SwiftUI renderers. It also wires executed-case manifest emission (A2UI_CONFORMANCE_MANIFEST_DIR) and check_executed_cases.py CI checks into the adapter, agent, and extensions corpora.

Reviewer Focus

  • Start with conformance/conformance_harness_implementation_guide.md and the CI updates in .github/workflows/web_ci.yml, .github/workflows/flutter_packages_test.yml, .github/workflows/swift_build_and_test.yml, and .github/workflows/python_ci.yml.
  • Review the extracted renderer driver modules in typescript/renderers/lit/src/tests/adapter_harness.ts, typescript/renderers/react/tests/adapter_harness.tsx, typescript/renderers/angular/src/adapter_harness.ts, dart/a2ui_flutter/test/adapter_harness.dart, and swift/swiftui/Tests/A2UISwiftUITests/AdapterHarness.swift. Pay particular attention to typescript/renderers/angular/karma.conf.js, which bridges browser window.__karma__.info({ a2uiConformanceCase }) messages to the host manifest JSONL file.
  • Review the agent SDK conformance helpers in python/a2ui_agent/tests/conformance/, typescript/agents/a2ui_agent/tests/conformance/, and dart/a2ui_agent/test/conformance/, plus python/a2ui_a2a/tests/ and python/a2ui_adk/tests/.
  • You can skim the individual test_*.py files under python/a2ui_agent/tests/conformance/. They replace local load_suite boilerplate with the shared discover_suite_cases helper and record_executed_case fixture.

Changes

Renderer Adapter Runners (typescript/renderers/, dart/a2ui_flutter/, swift/swiftui/)

  • Extracts mounting, step execution, view-tree inspection, assertion-key validation, and assert_view op checks into sibling adapter_harness modules in Lit, React, Angular, Flutter, and SwiftUI.
  • Updates typescript/core/web_core/tests/conformance/accessibility_conformance.test.ts (web_core_universal) and all five framework adapter runners to emit one JSONL manifest line per case when A2UI_CONFORMANCE_MANIFEST_DIR is set.
  • Adds an inline a2ui-conformance-manifest Karma reporter plugin in typescript/renderers/angular/karma.conf.js so headless Chrome tests persist manifest lines on the host filesystem.

Agent SDK Conformance Runners (python/a2ui_agent/, typescript/agents/a2ui_agent/, dart/a2ui_agent/)

  • Adds discover_suite_cases, strict assertion-key validation, and manifest recording across python/a2ui_agent/tests/conformance/conftest.py, typescript/agents/a2ui_agent/tests/conformance/manifest.ts, and dart/a2ui_agent/test/conformance/manifest.dart.
  • Adds explicit unsupported_suites runners in Python, TypeScript, and Dart so suites listed under unsupported_suites in conformance/expected_failures.yaml emit status: "skipped" manifest records.

Extension Conformance Runners (python/a2ui_a2a/, python/a2ui_adk/, conformance/extensions/)

  • Adds manifest recording (conftest.py) and strict action/assertion-key dispatch to python/a2ui_a2a/tests/test_a2a_integration.py, python/a2ui_a2a/tests/test_extension.py, and python/a2ui_adk/tests/test_adk_extensions.py.
  • Validates v1.0 AgentCard extension capability parameters against specification/v1_0/json/agent_capabilities.json during create_agent_card conformance steps.
  • Removes duplicate test cases from conformance/extensions/a2a/a2a_integration.yaml that are already covered in conformance/extensions/a2a/extension.yaml.

CI Workflows and Conformance Guide (.github/workflows/, conformance/)

  • Configures .github/workflows/web_ci.yml, .github/workflows/flutter_packages_test.yml, .github/workflows/swift_build_and_test.yml, and .github/workflows/python_ci.yml to set A2UI_CONFORMANCE_MANIFEST_DIR and run conformance/scripts/check_executed_cases.py.
  • Documents the executed-case manifest format and CLI commands for all four corpora in conformance/conformance_harness_implementation_guide.md.

Impact & Risks

  • Public library exports across the renderer, agent, and extension packages are unchanged; all code changes live in test runners, CI workflows, and conformance docs.
  • New YAML cases under conformance/adapter/, conformance/agent/, or conformance/extensions/ must run in a registered runner or appear in conformance/expected_failures.yaml to pass CI.

Testing

  • Ran A2UI_CONFORMANCE_MANIFEST_DIR=<tmpdir> across Lit, React, Angular, web_core_universal, Flutter (a2ui_flutter), and SwiftUI (A2UISwiftUITests), then ran python3 conformance/scripts/check_executed_cases.py --corpus adapter --manifest-dir <tmpdir>.
  • Ran the Python (pytest), TypeScript (vitest), and Dart (dart test) a2ui_agent conformance suites with A2UI_CONFORMANCE_MANIFEST_DIR set and ran python3 conformance/scripts/check_executed_cases.py --corpus agent --manifest-dir <tmpdir>.
  • Ran pytest on python/a2ui_a2a/tests/ and python/a2ui_adk/tests/ with A2UI_CONFORMANCE_MANIFEST_DIR set and ran python3 conformance/scripts/check_executed_cases.py --corpus extensions --manifest-dir <tmpdir>.

🤖 Agent-generated

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements a comprehensive executed-case manifest system for conformance testing across multiple language harnesses (Dart, Python, Swift, TypeScript, Angular, Lit, and React). It introduces JSON schema validation for manifest records, a Python script to verify executed cases against the suite corpora, and enforces strict key validation within test cases. A critical issue was identified in the Angular test harness where accessing process.env directly in the browser context will result in a ReferenceError.

@gspencergoog
gspencergoog force-pushed the test/renderer-conformance-manifests branch 2 times, most recently from bb83cb0 to 1d44081 Compare November 2, 2026 07:42
… dispatch

Add suite_registry.dart and suite_registry_test.dart to map every conformance/core/*.yaml suite and action to its test file, record executed cases to A2UI_CONFORMANCE_MANIFEST_DIR, enforce known-key checks across all Dart core conformance harnesses, default matchesErrorFields onUnassertedField to fail, and verify the manifest in Flutter CI.
…ispatch

Have the Python core conformance harness emit executed-case manifest records when A2UI_CONFORMANCE_MANIFEST_DIR is set, validate every case and expectation block against known-key tables, verify that UNRUNNABLE_SUITES, UNSUPPORTED, and EXPECTED_FAILURES entries match loaded cases, and check the manifest in Python CI.
…it scaling and skip tables

Re-raise UnknownConformanceKeyError from expected-failure wrappers in Python, Dart, and Swift so YAML schema drift is not recorded as xfailed. Verify SKIP_TEST_NAMES in TypeScript verifyHarnessInvariants, add key validation and manifest recording to Swift MessageProcessorScalingConformanceTests, and update the Swift CI exclude reason.
Allow the payload key in Dart message_processor_scaling_conformance_test, handle .integer in ConformanceTestHelper.fromJSONValue, isolate ConformanceManifest.runAsync to MainActor, and unwrap optional action string interpolation in ValidatorConformanceTests.
…rrors

Wrap captured RendererError values in a reference box in ExpressionsConformanceTests so outboundListener does not mutate a local array while assertValidateStepError holds an active reference.
Add DataError case to ValidatorConformanceTests.assertErrorCategory so test_error_response_update_data_model_prototype_pollution verifies A2UIDataError.
Why: Wireit cached test:conformance with an empty output list, skipping conformance_test.mjs on cache hits and leaving A2UI_CONFORMANCE_MANIFEST_DIR empty when CI runs check_executed_cases.py.
What: Remove the files and output properties from the test:conformance Wireit script so it runs on every test invocation like test and test:timing.
…esses

Add strict key/action dispatch, an executed-case manifest writer, reasoned skip records for unsupported and performance-tagged agent suites, and the CI manifest check for dart/a2ui_agent.
…rnesses

- Remove duplicate recordCase call from skipVerdict in the TypeScript agent conformance loader and drop the redundant recordedSkipped deduplication set in manifest.ts.
- Assert context.add_activated_extension invocations in the Python A2A try_activate_a2ui_extension conformance runner.
- Document the Python A2A and ADK extension conformance harnesses in the harness implementation guide.
@gspencergoog
gspencergoog force-pushed the test/renderer-conformance-manifests branch from a1d126e to e89d676 Compare November 2, 2026 16:53
… cases

Upstream added core/agent_function_routing.yaml, so the Swift suite registry
must list it, and its cases need executed-case manifest records. The suite
also used the 30-second wall-clock call timeout, which a loaded test run can
exceed between two steps; the cases settle every call explicitly, so disable it.
…istry

suite_registry_test requires every conformance/core/*.yaml file to be
listed, and core/agent_function_routing.yaml, which
agent_function_routing_conformance_test.dart already runs, was missing.
…istry

suite_registry_test requires every conformance/core/*.yaml file to be
listed, and core/agent_function_routing.yaml, which
agent_function_routing_conformance_test.dart already runs, was missing.

@nan-yu nan-yu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed PR #3823 (6bca6cc09c) across all 61 changed files (web/Flutter/SwiftUI adapter harnesses, Python/TypeScript/Dart agent harnesses, A2A/ADK extension harnesses, CI workflows, and conformance docs).

Overall the harness extractions, CI manifest checks, and agent_capabilities.json validation are well-structured, and Wireit/workflow triggers were verified clean. Main issues to address before merge:

  • Dropped/misreported manifest records: node:test skips afterEach when t.skip() is called (web_core and lit drop skipped records); Angular's Jasmine reporter maps excluded specs (fit/fdescribe) to reasoned skipped; SwiftUI's withKnownIssue / #expect / if let paths diverge from manifest statuses (and user_activation_gated_function_gesture_vs_programmatic can pass natively by forwarding step["userActivation"] to Node.action(for:userActivation:)).
  • Agent harness gaps: dart-agent and ts-agent list implemented agent/*/scaling.yaml suites in unsupported_suites_test (masking broken scaling tests and emitting DUPLICATE under --run-skipped in Dart); ts-agent omits assertKnownKeys (leaving several YAML fields silently ignored), reverses id vs name precedence in loadCases, and tracks activeCase in module-global mutable state; Python _extract_skip_reason synthesizes fallback reasons that bypass UNREASONED checks, and xfail wrappers swallow unknown-key failures.

🤖 Agent-generated

@gspencergoog
gspencergoog requested a review from nan-yu November 4, 2026 22:27
@gspencergoog
gspencergoog force-pushed the test/renderer-conformance-manifests branch from e4d8ea4 to 955365e Compare November 4, 2026 22:35
@gspencergoog
gspencergoog force-pushed the test/renderer-conformance-manifests branch from 955365e to 916c56a Compare November 4, 2026 22:41

@nan-yu nan-yu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing all 16 comments from the previous review pass so thoroughly! Verified the fixes across the web/Flutter/SwiftUI adapter harnesses, the Python/TypeScript/Dart agent runners, the A2A/ADK extension runners, the CI workflows, and the upstream/main merge in test_macro_conformance.py. LGTM!

🤖 Agent-generated

@gspencergoog
gspencergoog merged commit b25e780 into a2ui-project:main Nov 5, 2026
57 of 58 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in A2UI Nov 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants