Skip to content

Promote the A2A server batch to @stable — 17 tests that watch nothing today #1349

Description

@rafaelgiln

Problem

The A2A batch shipped 7 specs / 17 tests across #1242, #1244 and #1247, and none of them carries @stable. daily-stable.yml filters on --grep "@stable", so the entire area — 10 of the 18 checklist bullets in §16 — watches nothing. An A2A regression between two nightlies is invisible to every scheduled lane; the specs only run when a PR happens to touch them (import graph) or someone dispatches manual.yml.

This closes the batch scoped in #1195: [-][x] for §16.1.

Why the tag is absent, and why that reason no longer holds

Each spec doc states the same justification:

No @stable yet: granted only after team validation (CONTRIBUTING.md). New in #1244, no daily history.

Two problems with it.

It is not one of the documented exceptions. CONTRIBUTING.mdTag @stable states the standard plainly: "every new test enters with @stable" — in the PR itself, together with the spec doc, with the reviewer confirming the 5 validation steps on approval. The four exceptions are inherited-not-yet-reviewed, temporarily-removed-while-failing, utility specs, and @destructive. The A2A batch is none of those: the specs are newly authored, every one has a complete spec doc, and the assertions are causal (per-run sentinels, API observables paired with every UI assertion) rather than DOM echoes.

"No daily history" is circular. Without @stable these specs never enter the daily, so they can never accumulate the history their own docs cite as the precondition for the tag.

The technical blocker that would have justified holding back is also gone: LANGFLOW_A2A_ENABLED=true has been on every lane and both start scripts since #1240, and the whole batch is LLM-free (the round-trips run a Chat Input → Chat Output passthrough with a per-run sentinel — no provider, no key, no quota).

Evidence — local run, 2026-08-06

npx playwright test --grep "@a2a" --repeat-each=3 --retries=0

Against langflowai/langflow-nightly:latest = 1.12.0.dev18, LANGFLOW_A2A_ENABLED=true, LANGFLOW_WORKERS=1, default worker count on the Playwright side (fully parallel).

Metric Result
Executions 51 / 51 passed (17 tests × 3)
Retries 0 — the local default of 3 was disabled so a flake could not hide
Wall clock 53.4 s
🚨 Backend Error: in the log 0
Flows before → after 26 → 26 (no leaked flow)

The spec docs record Last validated: 1.12.0.dev14; this run re-validates the batch four nightlies later on dev18, unchanged.

Scope

Promote to @stable — 17 tests across 7 specs:

  • a2a-server-agent-card.spec.ts (4)
  • a2a-server-discovery.spec.ts (2)
  • a2a-server-jsonrpc-message-send.spec.ts (3)
  • a2a-server-multi-turn-context.spec.ts (1)
  • a2a-server-tasks-lifecycle.spec.ts (3)
  • a2a-server-agent-tab-publish.spec.ts (3)
  • a2a-server-agent-tab-try-it.spec.ts (1)

Also in scope:

  1. QA-CHECKLIST.md §16.1 — flip the 9 [-] bullets to [x]. The [~] Try it bullet stays [~]: the gap it names ("View JSON-RPC exchange") is a product absence, not a coverage gap (agentTab.viewExchange is a dead i18n key — 7 locales, zero call sites, absent from the DOM after a completed turn, Create: A2A Agent tab — publish flow and the Try it panel (§16.1 UI) #1244). Its spec still earns the tag; only the bullet symbol is held by the partial.
  2. Each spec doc — replace the "No @stable yet" line in Tags with the tag, and bump Last validated to 1.12.0.dev18.
  3. Do not run npm run coverage:summary in the PR (Guard QA-CHECKLIST generated blocks from PR edits (stop recurring merge conflicts) #741 — the generated blocks regenerate on merge).

Out of scope

  • The 8 [ ] bullets (all 3 of §16.2 A2A Client, plus non-owner-publish 403 and the disabled-server state). §16.2 is spec-creation work and needs the loopback-SSRF question answered first (follow-up 4 of the scoping doc); the other two are recorded as not automatable in docs/core-functionality/a2a/a2a-coverage-scope.md.
  • Re-running step 2 of the validation checklist (forced failure). It was performed per spec in the authoring PRs and recorded in their commit bodies — Create: A2A JSON-RPC task surface — multi-turn context and task lifecycle (§16.1 T5+T6) #1247's is the sharpest example, where a force-fail attempt that shrank the 2 MB payload back to 1 KB was rejected for not making the test fail, which is why the spec doc states the payload is margin rather than a requirement.

Risk

The 4 UI tests (agent-tab-*) are the only ones with a plausible flake surface: the Agent-tab save has no DOM completion signal (agent-status flips optimistically), so both specs wait on the PATCH /api/v1/flows/{id} the button fires, and agent-card-name is mount-time state that a save does not refresh (asserted after a reload). Both were measured in #1244 and are already handled; 3/3 green here. Worth watching in the first week of daily history.

Acceptance

  • 17 tests carry @stable
  • 9 [-] bullets in §16.1 read [x]; the [~] bullet is unchanged
  • 7 spec docs updated (Tags + Last validated)
  • npm run typecheck, npm run lint, npm run test:units green
  • npx playwright test --grep "@a2a" green on the PR lane

Metadata

Metadata

Assignees

Labels

roadmapROADMAP.md scheduled wave deliverable (milestone marks which wave)

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions