feat: add a2a-cli specification v0.2 reviewed - #1
Conversation
Introduce the specification directory: the a2a-cli behavior specification, a compliance-report template, and a directory README. The specification defines what a command-line client must do to be conformant, so that independently built CLIs converge on one predictable command surface, output contract, and conversation model: - Tiered conformance (Core / Standard / Advanced), evidence-based through a published compliance report rather than self-declaration - Multi-turn conversation and session state: context/task id continuation, reporting identifiers back to the caller, and resumability - Task status polling as a required path alongside optional streaming - Opinionated defaults for a seamless experience, always overridable - Structured output contract, semantic exit codes, and a minimal JSON envelope - Authentication, card-driven transport selection, and version signaling - A single lightweight SKILL.md so AI coding agents can drive the tool Also expands the top-level README to point at the specification directory. Status: v0.1 draft, open for review.
The governance section named a single official reference implementation and its language. That is a project decision, not a behavioral requirement, and it contradicted the specification's own language-agnostic stance (§4.4) and non-goals (§14). It also risked reading as though implementations in other languages were second-class. §15.3 now states only that the project MAY designate reference implementations, that the designation is recorded outside this document, and that it neither restricts nor privileges conformance. Aligned the pointers in §1.4, §14, §15.2 and the directory README. Which implementations are designated official belongs in project governance and the compatibility matrix, not in the specification.
The draft conflated the two: `-n` was described as an alias for `--output json` "(NDJSON)", leaving it ambiguous whether machine-readable output was one document or a stream of them. They are different contracts for different consumers, so the specification now defines both. - `json` emits exactly one complete document, buffered even when the underlying interaction streams, so a caller can parse stdout in one shot. This suits fast agents and callers that want the whole result at once. - `jsonl` emits one complete JSON object per line, flushed as produced, so agentic apps and harnesses that consume streaming output can act on partial results. A single-line result is valid JSONL. Both modes share the Appendix B envelope and the §6.3 identifier fields. Also: renamed NDJSON to JSONL throughout, added `--no-wait` as an alias for `--async` / `--return-immediately`, and made explicit that not waiting still emits `taskId` and `contextId` so the caller can poll later. Renumbered the exit-code subsection to §9.6 and expanded the compliance checklist to cover each mode separately.
The header carried a version and status but no date, so a reader could not tell how current the document was. It now records when it last changed. §15.4 also required a version bump for any normative change, which the document was already breaking: it has stayed at 0.1 across two normative revisions. That rule belongs to a ratified specification, not to a draft still being assembled. It now applies from the first Proposed version, and while in Draft the revision history and the last-updated date carry the record instead. Implementers are told to pin to a ratified version for conformance claims. Appendix D now lists dated draft revisions rather than a single summary row.
Motivation. "Why this matters" now states three distinct problems rather than four overlapping ones. The skill-file point and the coding-agent point were saying the same thing and are merged. A third motivation is added that was missing: A2A has SDKs, a TCK, an inspector and samples, but no quick way to exercise a *running* agent from outside a single SDK. A scriptable client with machine-readable output doubles as a lightweight test harness, by hand or in CI. Error registry. Nineteen required error codes was too much to ask of an implementer and risked discouraging adoption. The registry is now split: eight core codes are required and between them cover every exit code, so a caller can always act on a result; the remaining eleven become optional refinements that a tool uses only when it can genuinely tell those cases apart, falling back to the core code otherwise. The vocabulary is unchanged, the obligation is much smaller. The eight exit codes stay as they are. Each maps to a distinct, separately actionable failure, which is what the Command Line Interface Guidelines ask for: map the non-zero exit codes to the most important failure modes. Compliance report. Output checks collapse from nine to five, with OUT_001 now the single "every response says which conversation, which task, and what state" check. Skill checks collapse from three to two. Adds a short explanation of what an exit code is and why it is worth verifying, a note that the requirement list is expected to grow on request, and a results summary table.
Field evidence: across the A2A CLIs surveyed, the most useful thing an error carries is not its code but a suggested next step. ghchinoy/a2acli derives hints from the Agent Card's security schemes and emits a copy-pasteable command, e.g. "Run: a2acli auth login -u <url>". The wider CLI world agrees: the Command Line Interface Guidelines ask implementers to catch errors and rewrite them for humans, and tools with a single exit code lean entirely on message quality. The draft specified a precise code vocabulary and said nothing about guidance, optimising the axis with the least evidence behind it. The error envelope now carries a RECOMMENDED hint alongside code and message: a code tells a program what happened, a hint tells a person what to do about it.
Co-authored-by: Sam Betts <1769706+Tehsmash@users.noreply.github.com>
Co-authored-by: Sam Betts <1769706+Tehsmash@users.noreply.github.com>
Terminology. Interaction, not conversation: A2A has no concept of a conversation, and the contextId definition overstated things by implying one. What the grouping means is the agent author's decision. Transport. supported_interfaces is always in server preference order, so the specification described a state that cannot occur — a card with no decisive preference. --transport becomes repeatable and ordered, because a single value leaves a client unable to negotiate against a card that does not offer it. Version negotiation now says what to do rather than only what not to: negotiate down to the highest mutually supported version, never below 1.0. Output. Appendix B defined a schema duplicating types the protocol already has; SendMessageResponse and StreamResponse are the discriminated unions it was reaching for. It now names which protocol type each command emits and defines nothing itself. --output json emits the terminal object rather than a buffered event log, bounding its size by the task. Framing is never switched implicitly: a caller that asked for json and received jsonl parses the first line and returns a confidently wrong answer. The tui mode is gone, and 9.2 now pins what the default text mode must satisfy, which also resolves the conflict where 4.1's "structured output" was read as machine-parseable when it meant predictable. State. The CLI is stateless. Identifiers are reported in output and supplied as input; nothing is carried between invocations. 6.4 had conflated session state with configuration, which is what made the persistence question hard to answer; only configuration survives, with a documented precedence and scoping by agent-card reference. Commands. get and list become task get and task list, so adding context or message listing later is not a breaking change. discover becomes agent-inspect, since discovery already names the process of resolving a card. --service-url and --card-url — which contradicted each other across sections — become --agent-card, accepting a host, an explicit URL, or a file:// path, so offline conformance runs no longer need a live server. --verbose and --debug separate presentation from logging. Message parts gain the detail they lacked: multiple parts, stdin via --data -, and an explicit media type, because file extensions are unreliable and often absent. Errors. Protocol failures carry the A2A error by name per A2A 3.3.2 with the 5.4 mappings, rather than 11.6, which covers one binding only and would contradict 4.4. Appendix E keeps only conditions the protocol has no opinion on and drops from nineteen codes to ten. Conformance. 3.2 required a report generated against the A2A TCK. The TCK validates agents, not clients, so this asked for something a CLI cannot do. Conformance is now demonstrated against a live agent with an outcome per requirement identifier, and the TCK's role is upstream: confirming the agent under test is itself conformant, so a failure is attributable to the CLI. A requirement that cannot be provoked is recorded with its reason and never assumed to pass. Identifiers. Areas renamed to match the commands they cover: INSPECT, INTERACT, TASK_GET, TASK_CANCEL, TASK_LIST. Reuse is forbidden at every status; renumbering is permitted while Draft and frozen from the first Proposed version. Tiers and scope. chat moves to Tier 3 as a layer on top of the basic operations; push-notification config drops to Tier 2, since only hosting the receiver is the hard part. Shipping an agent skill becomes conditional, and 12.4 replaces a distribution rule no implementation could satisfy — no agent-facing standard defines an installation mechanism. Output checks consolidate from seven to six, Tier 1 from twenty-nine requirements to twenty-eight. Editorial. Why this matters merges to two problems, framing the CLI as a lightweight testing framework alongside the existing SDKs, TCK and samples. Command tables sort by tier then name. Appendix C separates normative from informative references and drops entries nothing cites. Appendix D records the revision.
The scheme required eight exit codes. No tool surveyed emits more than three, and requiring the other five made a Tier 1 requirement that nothing could satisfy — which says the obligation was wrong, not that the vocabulary was. The number of statuses was never the fundamental. What matters is that the status is meaningful and agrees with the error reported. How finely a tool subdivides failure is an elaboration, and it is one that expands safely: adding a status later leaves a caller testing for non-zero unaffected, while removing one breaks anyone who tested for it. Starting small is therefore the direction that does not need reversing. 0, 1 and 2 are required. 3 through 7 keep their meanings and are reserved, so no tool can define a conflicting 3, but a tool that does not implement one reports 1 in its place. Whatever a tool emits must agree with the error it reported. Appendix E's exit column is read the same way, and EXIT_001 now checks the required three plus the correct use of any reserved status. The effect on measurement is the point: one of the three tools tested already satisfies the requirement as restated, and the two that do not now fail for a specific reason — usage errors exit 1 where the convention is 2 — rather than for declining to implement five codes nobody implements.
Follow-ups from the second external review round, all in SPEC.md: - §5.2: split -H/--header out of the credential flags into a general-purpose service-parameter option, matching §10.1. - §7.2: state that push-notification config is Tier 2 (an ordinary API call); only hosting the receiver is Tier 3. - §9.3, §5.2: reject --stream with -o json as a usage error rather than buffering an event log or switching modes implicitly. - §6.2: a rejected --task-id (not found, terminal, or a non-corresponding context) now fails and creates nothing, instead of warning and starting a new task in an unintended context.
- Output format is `-o <text|json>`; `--stream` selects live delivery, rendering events under `text` and emitting JSONL under `json`. `json` stays a single document unless `--stream` is set, and `--stream` must be explicit (never from config, env, or a TTY). Supersedes the earlier `--stream` + `-o json` usage-error. - Add `-v/--version`; `--verbose` keeps only its long form. - Drop named profiles and `--env`: configuration resolves through an environment variable and local/global files with fixed precedence, keeping the CLI stateless. - Artifacts returned by the server MUST be rendered, never stripped. - Reserve `--<binding>-<option>` for future per-transport flags. - Recommend distributing the skill bundled with the tool as an Agent Plugin, co-versioned, with independent install still allowed. - Clarify a client inspects an agent card and starts/continues/resumes an interaction (§1.2).
- §5.2: sort options alphabetically; sharpen --context-id/--task-id; add one-liners for --bearer and --poll-interval. - §12.4: distribution is phased — tool + one skill first (adoption priority), then an Agent Plugin carrying the skill (and optionally an MCP server); binary stays with package managers. - §15.4: proposals enter via a feature request (new capability) or an RFC (change to an existing requirement), submitted to the TSC.
- §5.1: add the `help` command (Tier 1). - §5.2: reorder options as a usage flow; add `-h/--help`; note that only global options are listed and command-specific flags live in §8; header ties option availability to each feature's tier. - Bare `get` -> `task get` throughout (§5.2, §7.2-7.4, §9.5). - Drop `--dump-wire`; raw-wire diagnostics fold into `--debug`. - §12.4: remove tool-name mentions; genericise to "the tool". - §15.4: intake via feature request / RFC, without naming a specific body. - Appendix D: refresh the round-two revision entry.
- §3.1: a tier claim binds every applicable requirement listed for that tier, including SHOULD-worded rows (promoted to required for the claim); inapplicable requirements are excused, unobservable ones are not counted satisfied (§13.1). - §3.3: drop encoded tiers from the PUSH/SERVE area rows (tier is not part of an identifier); point to sections instead. - §6.2: chat is Tier 3 (was mislabeled Tier 2), matching §5.1, §3.1, and §8.5. - Appendix D: record the consistency fixes.
The two options overlapped: --verbose was described as "presentation" and --debug as "diagnostics", which does not tell a reader which one to reach for. Split them along who is asking. --verbose is user-facing: the full human-readable breakdown of message parts and the data exchanged with the agent. It answers what was sent and received. --debug is developer-facing: timing, retries, transport and version negotiation, and at Tier 2 the raw wire messages. It answers how the tool performed the action. The §4.5 detail-level default now matches the §5.2 wording.
The command operated on a task but was the only task operation not namespaced under it: task get, task list, and task cancel all were. Renamed in the six places it appears: the Tier 2 definition (§3.2), the command surface (§5.1), stream resumption (§7.4), the A2A operation mapping (Appendix A), and the machine-readable output table (Appendix B). The requirement area keeps its own name; identifiers do not encode command names (§3.3).
§8.5 was a third inventory of the Tier 2 and Tier 3 commands, alongside the tier table in §3.2 and the command surface in §5.1. Three copies of one list had already drifted: §8.5 listed batch/stdin input, which appears in neither of the other two and has no requirement identifier. It also carried nothing unique. Every item it named is defined more precisely elsewhere: push-config CRUD in Appendix A, chat in §6.2, stream reconnect in §7.4, raw-wire logging in §5.2. Structurally it did not belong either. §8.1-§8.4 are normative Tier 1 command specifications, so a non-normative outline sitting fifth implied §8 covered every tier. §8 now opens by saying it specifies Tier 1 only and pointing at where the rest lives, which answers the same question without being a citation target. Every reference to §8.5 is repointed: eight cells in the §3.3 area table and the scope note in §1.1. The revision history keeps its mentions, as a record of what was true at the time.
Three fixes to the requirement-identifier areas. Areas SUB and POLL are renamed TASK_SUBSCRIBE and TASK_POLL, so the whole task family reads alike: TASK_GET, TASK_CANCEL, TASK_LIST, TASK_SUBSCRIBE, TASK_POLL. Renaming an area is not repurposing it, and the identifiers keep their numbers. Both also cited the wrong sections, and overlapped each other. TASK_SUBSCRIBE covers streaming but omitted §7.2, where streaming is defined. TASK_POLL claimed all of §7, including the streaming and stream-resumption subsections that belong to TASK_SUBSCRIBE; it now cites §7.1 and §7.3, which is what its requirements already cited. SERVE is described as a local demo agent for CLI practice rather than "local agent mode". The point of serve is a dummy agent to practise commands against, which the old wording did not convey. §5.1 matches. The closing paragraph of §3.3 is condensed to the two facts it carries: this document defines the identifier scheme, COMPLIANCE.md holds the list. It previously named no file at all. Also records the day's revision in Appendix D and bumps the date.
The specification allowed configuration to come from an environment variable or a configuration file (§4.5, §6.4) but never said what those were named or where they lived, so two conformant tools could implement the same precedence and share no spelling. §5.2 now defines the convention: an option's environment variable is A2ACLI_ plus its long flag in upper snake case, and the same names may live in a .env file. §6.4 names the files — a global ~/.config/a2a-cli/.env and a local .env — and a new --config option loads an explicit file in place of the local one, which is also how per-agent scoping is realised. --stream keeps its carve-out: it MUST stay an explicit flag, never read from the environment or a file. The config command becomes show-config and is read-only. It reports each effective setting with the source it resolved from, so a caller can verify the tool applied the documented precedence rather than trusting it. Editing and clearing move to the environment variables and .env files themselves, which keeps a single obvious place to change a value and avoids a command that both reads and mutates the state it reports on. The rename also keeps the command distinct from the new --config option.
yarolegovich
left a comment
There was a problem hiding this comment.
I understand the spec is a result of the analysis and synthesis of multiple existing implementations, but I think by doing this we also lost on the coherence side.
A number of flags (eg. --async / --return-immediately / --no-wait) have the same meaning, why don't we pick one?
Command surface is a mix of namespace and flag verb oriented grammars (eg. a2a task get, but a2a download). If a verb is applicable in multiple contexts it needs to be namespaced: a2a (card|task) download.
Then there's a question of usefulness of commands. I'd rather we have narrow command surfaces of simple composable commands. How is a2a download different from a2a task get > task.json?
The document is also quite long and verboseness draws attention from detail. I wonder whether we are not over-specifying things here. Like the section about not generating identifiers, do we really need it? Bringing this ad absurdum we can have a section stating a cli must not inject arbitrary content into user messages.
Exit codes now report whether the CLI conducted and reported the interaction turn, not how the turn ended. a2a-cli is an interaction client: an A2A turn may complete, fail, be rejected, or pause for more input or authentication, and all of these are outcomes of the conversation rather than of the tool. The CLI therefore exits 0 for any turn it faithfully carried out and reported, SHOULD name a non-success or paused outcome in a warning on stderr, and leaves the outcome in the task state (6.3). The reserved codes are CLI-execution failures only -- unreachable, auth, timeout -- and the task-outcome exit codes, together with their now-unreachable Appendix E entries, are removed (9.6, App. E). Task continuation is relaxed to match A2A: --task-id no longer requires --context-id, since a taskId is unique and the server infers its context (A2A 3.4.3); --context-id alone starts a new task grouped in that context, and a mismatched pair is rejected. --include-artifacts is removed because GetTask returns artifacts unconditionally and defines only historyLength as a toggle (A2A 3.1.3); 8.2 now states that a client attaches content on send as message parts, never as artifacts. Authentication opens by framing it as essential but unstandardised, with the tiers as the roadmap, and names the credential flags without mislabelling -H/--header or --metadata as authentication. A new experimental, non-normative 16 sketches CLI extensions for adapting the tool without forking it or breaking conformance, and the 9 subsections are given uniform headings. The revision history is consolidated to the net shipped state. COMPLIANCE.md realignment to these identifiers follows in a separate change.
Correct several requirements against the A2A v1.0 spec without changing the CLI's intended behaviour: - Streaming: the final JSONL line is the terminal StreamResponse (normally a TaskStatusUpdateEvent carrying the ids and state), not a guaranteed full Task; A2A only optionally resends a Task snapshot before closing (A2A §11.7), so the final line may omit artifacts (§9.3, Appendix B). - Auth: credentials are attached per the agent's declared security scheme (A2A §7.3), not as §3.2.6 service parameters (§10.1). - Transport: supported_interfaces is declared in server preference order as a SHOULD (A2A §8.3.1), not a guarantee; protocolVersion is per-interface (A2A §4.4.6) so transport and version resolve together (§4.5, §11.1). - send: --file is a file-with-bytes FilePart for a local path vs a file-with-uri FilePart for a URL, with a request-size caveat (§8.2). - messageId reuse reworded to MAY, since A2A §3.3.1 makes idempotency OPTIONAL (§6.1). - Add a per-command top-level JSON shape note (§9.3); widen the OUT area citation to §9.1-9.5 (§3.3); record all changes in Appendix D.
Editorial readability pass (presentation only, no normative change): - Rationale separated from requirements into `> **Rationale.**` call-outs (§3.2, §4.1, §6.4, §9.6, §11.1, §12.1, §13.2, Appendix B). - Redundant restatements collapsed to a single canonical statement plus a cross-reference; the exit-code litany now lives only in the §9.6 table. - AI-slop removed: em-dash pile-ups reduced, filler intensifiers cut, and the §2 / §16 openings de-marketed. - Added an informative Terminology block (interaction, turn, transport/binding, interface); fixed one stray "conversation" → "interaction" in §9.6. Added three informative Mermaid diagrams, validated against A2A v1.0: - Task state machine (§7.1; A2A §4.1.3). - Update-delivery mechanisms (§7.2; A2A §3.5, §4.3.3). - Configuration resolution precedence (§6.4). Header bumped to Version 0.2 / Status Review; the pass is logged in Appendix D. No requirement, identifier, default, exit code, error code, or cross-reference was changed (verified: RFC-2119 keyword counts unchanged at MUST 145, MUST NOT 38, SHOULD 42, MAY 31, REQUIRED 5, RECOMMENDED 3).
Make COMPLIANCE.md self-contained: it now defines the requirement-identifier registry, the legend, the fill order, and publication rules without needing SPEC.md open alongside. Add a header that tracks SPEC.md v0.2 (Review). Registry changes: - Renumber the AUTH area to a contiguous 001-011 (Tier 1 001-004, Tier 2 005-007, Tier 3 008-011), permitted while the spec is pre-Proposed (SPEC.md 3.3). Drop three former Tier-2 AUTH rows; Tier 2 total 18 -> 15. - Reword AUTH insecure-credential handling to a stderr warning, matching SPEC.md 4.5. - Add the A2A 4.6 reference to the VER_002 citation. Structure and readability: - Add a Withdrawn status across the legend, the totals rule, and Appendix A (vocabulary and fail-closed rules) so an identifier can be retired from the first Proposed version without being reused. - Document requirement kinds (gating, conditional) and reserve an optional capability-badge kind for the Tier-3 model still under discussion. - Distinguish N/A (the tool) from not-measured (the test agent). - Simplify the Appendix A.4 schema sketch: show each repeated block once and point to the authoritative sections instead of restating them. - Reconcile the "Draft" wording with the new Review status; trim filler. Add compliance-report.template.yaml: the single YAML artifact a tool links from the compatibility matrix. Placeholders only, no secrets. Its requirement-ID set and tier totals (37/15/12) match COMPLIANCE.md.
…irst-class SPEC.md 0.2 (Review) revisions: - Command rename: `inspect` → `card get` (§1.2, §3.1, §5.1, §8.1, App. A/B); requirement-area symbol `INSPECT` → `CARD_GET` (§3.3). Dropped the inspect-vs-discover rationale note. `COMPLIANCE.md` `INSPECT_*`→`CARD_GET_*` realignment to follow. Agent-reference scope (`card get` vs `--agent-card`) deferred to OPEN-QUESTIONS.md OQ9. - Service parameters: `-H/--header` → `--svc-param` (A2A §3.2.6); corrected §10.1/§11.2 to drop "query parameter" for service parameters (A2A carries them in HTTP headers / gRPC metadata). `--metadata` retained (A2A §3.2.5 payload) and clarified vs `--svc-param` with a worked example. - Output: `--stream` promoted to a first-class §5.2 global-options row and decoupled from `-o` (format vs delivery as orthogonal peers). No behavior change; the §9.3 json/jsonl contract and env/config carve-out are unchanged. - Restored the §10.1 credential-redaction MUST and added a non-normative Naming note. Changelog rows added under Appendix D. No A2A wire-semantics change.
Follows the SPEC.md `inspect`→`card get` rename (865067d): renames the five Agent-Card requirement identifiers `A2ACLI_INSPECT_001`–`005` to `A2ACLI_CARD_GET_001`–`005`, the `area: INSPECT` → `CARD_GET`, and the `inspect` command references in their descriptions. No requirement semantics change.
The specification had drifted: three rounds of renames landed in the body but not in the headers, the companion docs, or a handful of cross-references, and several requirements could not be satisfied as written. Fixes the defects that blocked implementation: §7.3 demanded an exit code §9.6 makes optional; §9.2's text floor forbade the multi-line artifacts §8.2 requires; §8.2 mandated a media type with no syntax to express it; and Appendix B claimed to define no schema while defining the error envelope. Checks every load-bearing claim against the published A2A v1.0.0 spec, now named as the baseline. That found `supported_interfaces` should be `supportedInterfaces`, a missing task state (TASK_STATE_UNSPECIFIED, which left --wait undefined), a version form and an API-key location the document had dropped, and an unnamed routing identifier (AgentInterface.tenant). Rewrites §4 around the principles the document actually implements, including one that existed only inside §9.6's rationale: tool execution and agent outcome are separate results. §4.2 had promised a version bump for breaking changes, which §15.4 contradicts. Finishes the naming conventions rather than leaving a fourth rename for later, and resyncs the registries. compliance-report.template.yaml had never received the inspect → card get rename, so the machine-readable artifact disagreed with the registry it mirrors. OPEN-QUESTIONS.md is published because the revision history cited OQ numbers against a file that did not exist. Requirement identifiers renumbered while pre-Proposed, per §3.3; retired numbers are recorded in COMPLIANCE.md and are never reused.
SPEC.md now defines behavior only. The conformance model — what claiming a tier means, the evidence it needs, and the requirement-identifier registry — moves to COMPLIANCE.md, where it is actually measured. The tier table stays in the specification, because tier membership is a scope decision the normative text depends on. §13 is removed, §14-§16 renumber to §13-§15, and Appendix E becomes Appendix D. The multi-vendor apparatus goes with it. Conformant-vs-official, the compatibility matrix, reference implementations and the report designation are deleted, and "a conformant tool MUST" becomes "an a2a-cli MUST" throughout: the specification describes one tool rather than grading several. "Why this matters" is rebuilt against sources fetched on 2026-08-18 and cut to three non-overlapping points. Four claims were removed as factually wrong: that no official CLI exists (two ship inside the org), that the consolidation vote is open (it closed and passed on 2026-08-07), that a Swift CLI is among the implementations (there is none; the sixth language is Elixir), and that no scriptable way exists to exercise a running agent. Checking the document end to end against A2A v1.0.0 also corrected supportedInterfaces casing, a missing task state that left --wait undefined, the A2A-Version request-parameter form, an omitted API-key location, and the AgentInterface tenant field. Editorially: §4 is rewritten around dual-consumer, statelessness, and the separation of tool execution from agent outcome; the Terminology block is removed as redundant, keeping only the binding/transport equivalence; rationale call-outs are demoted to inline prose; and COMPLIANCE.md's front matter is deduplicated. No normative requirement changed. The tier contents, all 66 requirement identifiers, and every behavioral rule are as they were. OPEN-QUESTIONS.md is withdrawn from the published set and kept as a local working document.
Add explicit Problem statement / Goals / Non-goals sections and a §4.1 Identifiers table, move CLI extensions to Appendix E, and renumber the document. Resync COMPLIANCE.md and the report template to the new section references.
ede72af to
6c0adba
Compare
|
Thank you for the review @Tehsmash @muscariello @yarolegovich @herczyn @darrelmiller @kthota-g I will be proceeding with PR now. The Spec is in v0.2 and will save as Reviewed only to keep it open for suggestions till EOM. |
Introduce the specification directory: the a2a-cli behavior specification, a compliance-report template, and a directory README.
The specification defines what a command-line client must do to be conformant, so that independently built CLIs converge on one predictable command surface, output contract, and conversation model:
Also expands the top-level README to point at the specification directory.
Status: v0.1 draft, open for review.