UAT Criteria¶
The acceptance criteria FCC's UAT enforces. Two kinds: cross-surface tripwires (asserted at runtime by the executable probe contract against a live stack) and config-lint criteria (asserted offline by the test suite, no running services needed).
Cross-surface tripwires¶
★ = auto-asserted by scripts/uat_probe_pass.py (and mirrored as an
in-process pytest where noted). Documented in full in
../ecosystem/partner-probe-guide.md.
| # | Tripwire | Check | Where |
|---|---|---|---|
| T1 ★ | Version coherence | ws-bridge /health, ux /ux/health, /api/v1/mcp/info, and the A2A card all report the same version, equal to fcc.__version__. |
uat_probe_pass.py::_coherence_result; tests/test_ux_gateway.py::test_version_coherence_across_surfaces |
| T2 ★ | MCP catalog parity | /api/v1/mcp/info tools_count equals the number of tools listed, and both equal MCPToolRegistry.create_default(). |
uat_probe_pass.py::_mcp_info_catalog; tests/uat/test_streams.py::test_agent_ax_web_mcp_catalog |
| T3 ★ | A2A card served + 0.3.0 | /.well-known/agent-card.json returns 200 with protocolVersion == "0.3.0" and the six fcc.* skills. |
uat_probe_pass.py::_agent_card_0_3_0; tests/test_ux_gateway.py::test_agent_card_served_a2a_0_3_0 |
| T4 ★ | Never-5xx | A documented-but-absent path returns 404, never a 5xx. | uat_probe_pass.py::_never_5xx |
| T5 | Journey-event validity | Events FCC emits validate against the packaged journey_event_v1.schema.json. |
tests/test_journey_event_contract.py |
Config-lint criteria (offline)¶
| ID | Criterion | Enforced by |
|---|---|---|
| U-PROBE-1 | The executable probe contract exists, is stdlib-only, and is INERT (exit 0) when the stack is down. | scripts/uat_probe_pass.py (CI runs make uat-probe-strict) |
| U-PERF-1 | The performance model classifies into Quick (≤250 ms) / Moderate (≤2 s) / Slow bands, and the band drives the vision sample budget. | tests/test_uat_responsiveness.py |
| U-STREAM-1 | The three journey streams (stream_agent_ax, stream_human_ux, stream_persona) are registered markers; the two deterministic streams pass offline. |
tests/uat/test_streams.py, pyproject.toml [tool.pytest.ini_options] markers |
| U-PERSONA-1 | Every loaded persona is PAOM-runnable (has constitution.hard_stop). |
tests/uat/test_streams.py::test_persona_every_loaded_persona_is_runnable |
| U-PORTMAP-1 | The vendored port registry stays in lock-step with NEXUS (SHA256 drift). | tests/test_ecosystem_registry_drift.py |
| U-OPENAPI-1 | Every OpenAPI path is mapped to an implementation or an explicit not-mirrored exclusion. | tests/test_ux_gateway_openapi_drift.py |
Running¶
make uat-up # stand up the probeable stack
make uat-probe # run the tripwire contract (advisory)
make uat-probe-strict # CI gate (INERT-exit-0 when stack down)
make uat-streams # deterministic journey streams
make uat-perf # latency bands → docs/uat/v<ver>/responsiveness.json
Current as of v1.10.0.