Observed since 20 Oct, 16:54 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Conformance test suite for the Agent Accessibility Event Protocol (AAEP)
The official test suite for verifying AAEP implementations. This package, aaep-conformance, lets producers and subscribers prove they conform to a claimed AAEP Conformance Level by running a comprehensive battery of automated tests.
If you ship a product claiming AAEP support, you should run this suite and publish the report.
pip install aaep-conformance
Or from source:
git clone https://github.com/Ramseyxlil/aaep.git
cd aaep/conformance
pip install -e .
Requires Python 3.10 or newer.
aaep-conformance producer --endpoint http://localhost:8080/agent --level 1
The suite connects to your producer endpoint, exercises it with a battery of test scenarios, captures the events it emits, and verifies each event against the AAEP specification.
aaep-conformance subscriber --connect tcp://localhost:9999 --level 2
The suite acts as a synthetic producer, emits a battery of test events to your subscriber, and verifies your subscriber's behavior (including reply handling).
aaep-conformance validate event.json
Pure schema validation without exercising any endpoint.
Tests verify the producer:
session.completed, session.errored, or session.cancelledtool.completed without preceding tool.invoked)summary_normal on user-facing eventsurgency: critical on session.errored events~40 test cases.
Everything in Level 1, plus tests verifying:
agent.awaiting.confirmation before irreversible actionsdefault_decision follows the safety rule (irreversible+high → reject)confirmation.reply messagesclarification.reply messages~80 test cases.
Everything in Levels 1 and 2, plus tests verifying:
subscription.request with subscription.accepted or subscription.rejectedhonored_capabilities is not more permissive than the requestmax_events_per_second (backpressure)event_filters (include/exclude patterns)coalesce_boundaries~120 test cases.
The suite produces two output formats:
conformance-report.json)Machine-readable, suitable for CI pipelines:
{
"aaep_version": "1.0.0",
"conformance_level": 2,
"endpoint": "http://localhost:8080/agent",
"started_at": "2026-06-30T14:22:00Z",
"completed_at": "2026-06-30T14:24:18Z",
"result": "PASS",
"pass_rate": 0.98,
"tests_run": 120,
"tests_passed": 118,
"tests_failed": 2,
"tests_skipped": 0,
"failures": [
{
"test_id": "L2-CONF-007",
"description": "Producer blocks on confirmation timeout with default_decision=reject",
"expected": "default_decision applied at 300.0s",
"actual": "default_decision applied at 298.7s (1.3s early)",
"severity": "warning"
}
]
}
conformance-report.html)Human-readable, suitable for product documentation. Shows pass/fail by category with drill-down to individual test cases.
Once your implementation passes, publish the report alongside your product's accessibility documentation. Recommended format:
Product Name X.Y.Z supports AAEP v1.0.0 at Conformance Level 2. Verified 2026-09-15 against
aaep-conformance1.0.0. Full report: [link]
Add to your .github/workflows/:
name: AAEP Conformance
on: [push, pull_request]
jobs:
conformance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: pip install aaep-conformance
- run: |
# Start your producer in background
python my_agent.py --serve --port 8080 &
sleep 5
aaep-conformance producer --endpoint http://localhost:8080/agent --level 2 --fail-on-warning
The --fail-on-warning flag causes the suite to exit nonzero on any warning, blocking PR merges that introduce regressions.
| Failure type | Meaning | Action |
|---|---|---|
| error | Hard spec violation | Fix before claiming conformance |
| warning | Spec ambiguity or recommended-not-required violation | Investigate; may indicate a real bug |
| info | Behavior worth noting but not a violation | No action required |
A run with zero error failures and pass_rate ≥ 0.95 conforms at the claimed level.
conformance/
├── README.md ← this file
├── pyproject.toml ← package config
├── setup.py ← legacy entry
├── aaep_conformance/
│ ├── __init__.py
│ ├── cli.py ← main CLI entry point
│ ├── runner.py ← test orchestration
│ ├── reporter.py ← report generation
│ ├── level_1.py ← Level 1 test suite
│ ├── level_2.py ← Level 2 test suite
│ ├── level_3.py ← Level 3 test suite
│ ├── checks/
│ │ ├── __init__.py
│ │ ├── envelope.py ← envelope structure checks
│ │ ├── lifecycle.py ← session lifecycle checks
│ │ ├── tools.py ← tool invocation checks
│ │ ├── streaming.py ← output streaming checks
│ │ ├── confirmation.py ← confirmation flow checks
│ │ ├── handshake.py ← subscription handshake checks
│ │ └── safety.py ← safety rule enforcement
│ └── fixtures/
│ ├── valid/ ← known-valid AAEP events
│ └── invalid/ ← known-invalid AAEP events
└── tests/ ← tests for the suite itself
The suite is itself tested (it would be ironic if the conformance suite had bugs). Run pytest in this directory to verify the suite's own correctness.
If you find AAEP behavior that ought to be tested but isn't, contribute a test case:
aaep_conformance/level_N.py and add your test functionaaep_conformance/checks/aaep_conformance/fixtures/ if neededTest cases are reviewed by the AAEP maintainers and other contributors. The bar: a test must verify a specific normative requirement in the spec and must be precise enough that "pass" and "fail" are unambiguous.
../spec/09-conformance.md — normative conformance criteria../guides/IMPLEMENTERS_GUIDE.md — what implementations should do../guides/SUBSCRIBERS_GUIDE.md — what subscribers should do../tools/aaep-validate/ — lightweight standalone validatorDownload counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 1.0.0 | 2 Jun 2026 | 20 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 16:54 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:f0b6512cb11061210f60ce7a4e34f16e813e997f8c0dd0d2fe7d170ed0bede36