Skip to content

fix: correct UCP version data format in samples#137

Open
dipankar1415 wants to merge 5 commits into
Universal-Commerce-Protocol:mainfrom
dipankar1415:agent_version_compare_server_version
Open

fix: correct UCP version data format in samples#137
dipankar1415 wants to merge 5 commits into
Universal-Commerce-Protocol:mainfrom
dipankar1415:agent_version_compare_server_version

Conversation

@dipankar1415

Copy link
Copy Markdown

Description

Fix UCP version in the Python REST merchant sample (rest/python/server).

validate_ucp_headers previously compared agent and merchant versions with string ordering (agent_version > server_version), which is incorrect for UCP YYYY-MM-DD versions. In discovery_profile.json looks like it is in date format, for example:
"version": "2026-01-23"

This change parses versions as ISO calendar dates, compares datetime.date values, returns VERSION_INVALID_FORMAT (400) for malformed agent versions, and returns VERSION_UNSUPPORTED (400) when the agent version is newer than the merchant. Behavior is unchanged when UCP-Agent omits version= (defaults to merchant version).

Files changed: ucp_version.py (new), exceptions.py (UcpVersionError), dependencies.py (date-based validation).
Note: the tests are not added, can add the tests if instructed to add them at a new tests folder.

Category (Required)

Please select one or more categories that apply to this change.

  • Core Protocol: Changes to the base communication layer, global context, or breaking refactors. (Requires Technical Council approval)
  • Governance/Contributing: Updates to GOVERNANCE.md, CONTRIBUTING.md, or CODEOWNERS. (Requires Governance Council approval)
  • Capability: New schemas (Discovery, Cart, etc.) or extensions. (Requires Maintainer approval)
  • Documentation: Updates to README, or documentations regarding schema or capabilities. (Requires Maintainer approval)
  • Infrastructure: CI/CD, Linters, or build scripts. (Requires DevOps Maintainer approval)
  • Maintenance: Version bumps, lockfile updates, or minor bug fixes. (Requires DevOps Maintainer approval)
  • SDK: Language-specific SDK updates and releases. (Requires DevOps Maintainer approval)
  • Samples / Conformance: Maintaining samples and the conformance suite. (Requires Maintainer approval)
  • UCP Schema: Changes to the ucp-schema tool (resolver, linter, validator). (Requires Maintainer approval)
  • Community Health (.github): Updates to templates, workflows, or org-level configs. (Requires DevOps Maintainer approval)

Related Issues

Checklist

  • I have followed the Contributing Guide (including Conventional Commits title requirements and ! for breaking changes).
  • I have updated the documentation (if applicable).
  • My changes pass all local linting and formatting checks.
  • I have added tests that prove my fix is effective or that my feature works.
  • New and existing unit tests pass locally with my changes.
  • (For Core/Capability) I have included/updated the relevant JSON schemas.
  • I have regenerated Python Pydantic models by running generate_models.sh under python_sdk.

Screenshots / Logs (if applicable)

Example response for a newer agent version (version="2027-01-01" vs merchant 2026-01-23):

{
"detail": {
"status": "error",
"errors": [{
"code": "VERSION_UNSUPPORTED",
"message": "Version 2027-01-01 is not supported. This merchant implements version 2026-01-23.",
"severity": "critical"
}]
}
}

@google-cla

google-cla Bot commented Jul 19, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@damaz91 damaz91 added the status:needs-triage Signal that the PR is ready for human triage label Jul 19, 2026

@dipankar1415 dipankar1415 left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reason of the change:

  • Makes accepted version format explicit and unambiguous.
  • Clarified parse_ucp_version() in rest/python/server/ucp_version.py to explicitly state that datetime-style version strings (for example YYYY-MM-DDTHH:MM:SSZ) are not supported.
  • Added unit tests in rest/python/server/ucp_version_test.py for UCP version parsing behavior.

@damaz91 damaz91 added status:under-review and removed status:needs-triage Signal that the PR is ready for human triage labels Jul 20, 2026
@dipankar1415
dipankar1415 force-pushed the agent_version_compare_server_version branch from 5d92cfe to 7afcaee Compare July 21, 2026 15:46
)


def _version_error_detail(code: str, message: str) -> dict:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this helper function really necessary?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, this error is in the same shape as what UcpVersionError to_detail returns.

Can we have some kind of data class? e.g. UcpErrorDetail(BaseModel) - I guess we can use pydantic. AFAIK FastAPI will also automatically document pydantic models.

No provision for other formats supported like YYYY-MM-DDTHH:MM:SSZ

"""
if not isinstance(version, str):

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: do we need this? version is type-hinted to str - ideally this'd be caught by mypy. If not, version.strip() would throw an error anyway if it's not a str.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants