uacp-interop 0.2.0

  section                  findings  blocker  major  minor
  -----------------------  --------  -------  -----  -----
  uacp-spec                       2        0      2      0
  autogen-agentchat               6        0      4      2
  openai-function-calling         4        1      1      2
  uacp-native                     2        2      0      0
  -----------------------  --------  -------  -----  -----
  TOTAL                          14        3      7      4

  UACP spec: worst finding is major.
  Cross-format blockers are loss measured in foreign formats,
  which is what the harness is for, not a defect in UACP.
Provenance of corpus entries:
  autogen-agentchat        confidence=documented-api
  openai-function-calling  confidence=documented-api
  uacp-native              confidence=observed-serialization

==============================================================================
PART 1  UACP schema vs normative text, and schema vs the two reference implementations
==============================================================================
  [major]   SCHEMA_CONFLICT    schemas.$id/$ref
      The schema set cannot be resolved by a standards-compliant validator without network access. Relative $refs resolve against the schema's own $id, and every $id sits on a host that does not resolve, so even a plain sibling ref like 'capability.schema.json' becomes an unreachable URL. A validator then attempts a network fetch and fails with Unretrievable, which breaks air-gapped builds and any offline CI. Observed while building this harness: agent-descriptor ($id host wippa.dev) refs capability.schema.json -> https://wippa.dev/uacp/schemas/capability.schema.json
      evidence: uacp_interop had to construct a local referencing.Registry purely to validate the schemas at all

  [major]   SEMANTIC_MISMATCH  capability.async
      The schema documents async with "default": true, meaning a capability that omits it is treated as streaming or deferred. A plain request/response capability must therefore opt OUT by setting async: false explicitly. A consumer that trusts the default waits for a stream.end that never arrives, which presents as a hang rather than as a schema error. Defaults should express the common case.
      evidence: capability.schema.json properties.async has "default": true with description 'Whether the capability returns a stream or deferred result'


==============================================================================
PART 2  autogen-agentchat  (confidence: documented-api)
==============================================================================
  [major]   LOSSY              capabilities[web_search_func].outputSchema
      UACP requires outputSchema on every capability. The source declares no output contract, so the adapter must fabricate a permissive one. Consumers will believe a guarantee the source never made.
      evidence: UACP capability.schema.json requires ['name','description','inputSchema','outputSchema']; autogen-agentchat exposes no output schema for this tool

  [major]   SEMANTIC_MISMATCH  lifecycle
      The source agent is stateful: run() mutates internal history and is documented as being called with new messages rather than complete history. A UACP descriptor has no lifecycle or state field, and the UACP envelope is stateless message passing, so two calls that look identical on the wire mean different things on either side.
      evidence: autogen-agentchat documents run() as stateful (microsoft.github.io/autogen AgentChat agents tutorial); UACP SPEC.md section 1 agent descriptor has no state field

  [major]   SEMANTIC_MISMATCH  streaming
      The source streams per-token chunks (ModelClientStreamingChunkEvent) that are part of the agent's own message trace. UACP stream messages are partial *results* correlated to a request via replyTo and sequence numbers. Mapping one onto the other conflates 'the agent's reasoning trace' with 'the result stream', so a UACP consumer would receive internal reasoning it never asked for and could not tell the two apart.
      evidence: autogen-agentchat emits per-token chunks in its output stream; UACP SPEC.md section 13 defines stream/stream.end as correlated partial results

  [major]   UNREPRESENTABLE    payload
      The source accepts heterogeneous content parts (for example MultiModalMessage(content=[str, Image])). The UACP envelope's payload is untyped, so a list would validate, but the spec defines no modality, media type or part ordering, and an in-memory Image object has no wire form. Nothing in UACP distinguishes this from an ordinary array payload.
      evidence: autogen-agentchat MultiModalMessage; UACP SPEC.md section 3 envelope fields define no content-part or modality construct

  [minor]   LOSSY              capabilities[web_search_func].name
      Capability 'web_search_func' carries no namespace prefix, so the adapter must rename it. Registry queries scoped to a namespace (for example 'data.*') will not match the original name.
      evidence: UACP SPEC.md section 2 requires dot-notation namespaces (csv, llm, web, deploy, data.*, custom allowed); source name 'web_search_func' is unnamespaced

  [minor]   LOSSY              capabilities[web_search_func].strict
      The source sets strict=False. JSON Schema has no equivalent of the OpenAI 'strict' flag, so the guarantee is dropped in either direction and cannot be re-expressed as a UACP consumer check.
      evidence: OpenAI function-calling tool shape vs JSON Schema (draft 2020-12); no 'strict' keyword exists in JSON Schema


==============================================================================
PART 2  openai-function-calling  (confidence: documented-api)
==============================================================================
  [BLOCKER] SCHEMA_VIOLATION   $['id']
      UACP agent-descriptor.schema.json rejected the produced descriptor: 'tool-caller' does not match '^[a-zA-Z0-9_]{1,128}$'
      evidence: uacp_interop/schemas/agent-descriptor.schema.json

  [major]   LOSSY              capabilities[get_weather].outputSchema
      UACP requires outputSchema on every capability. The source declares no output contract, so the adapter must fabricate a permissive one. Consumers will believe a guarantee the source never made.
      evidence: UACP capability.schema.json requires ['name','description','inputSchema','outputSchema']; openai-function-calling exposes no output schema for this tool

  [minor]   LOSSY              capabilities[get_weather].name
      Capability 'get_weather' carries no namespace prefix, so the adapter must rename it. Registry queries scoped to a namespace (for example 'data.*') will not match the original name.
      evidence: UACP SPEC.md section 2 requires dot-notation namespaces (csv, llm, web, deploy, data.*, custom allowed); source name 'get_weather' is unnamespaced

  [minor]   LOSSY              capabilities[get_weather].strict
      The source sets strict=True. JSON Schema has no equivalent of the OpenAI 'strict' flag, so the guarantee is dropped in either direction and cannot be re-expressed as a UACP consumer check.
      evidence: OpenAI function-calling tool shape vs JSON Schema (draft 2020-12); no 'strict' keyword exists in JSON Schema


==============================================================================
PART 2  uacp-native  (confidence: observed-serialization)
==============================================================================
  [BLOCKER] UNREPRESENTABLE    csv.analyze.inputSchema.const
      UACP capability uses JSON Schema keyword 'const' at $.oneOf[0].properties.mode.const, which has no representation in an OpenAI function-calling `parameters` block. The capability cannot be exposed to an OpenAI-style tool consumer without either dropping the constraint or flattening it into prose.
      evidence: $.oneOf[0].properties.mode.const in the UACP capability schema vs the OpenAI function-calling parameter subset

  [BLOCKER] UNREPRESENTABLE    csv.analyze.inputSchema.oneOf
      UACP capability uses JSON Schema keyword 'oneOf' at $.oneOf, which has no representation in an OpenAI function-calling `parameters` block. The capability cannot be exposed to an OpenAI-style tool consumer without either dropping the constraint or flattening it into prose.
      evidence: $.oneOf in the UACP capability schema vs the OpenAI function-calling parameter subset


==============================================================================
TOTALS
==============================================================================
  spec/schema conflicts : 2
  cross-format findings : 12
  ----------------------------------------------------------------------------
  all findings          : 14
    blocker  3
    major    7
    minor    4

Caveat: the AutoGen entry models a documented constructor surface, not an
observed serialization. Findings derived from it are weaker evidence than
findings derived from the UACP-native entry, which is quoted from SPEC.md.
