Skip to content

[Actions] sdk-python: wave.compose as a finished rendering — save, run, docs on the live shape, release, live e2e #51

Open

Description

@yakimoto

Sub-epic: the Python SDK rendering of WAVE Composer — wave.compose as a finished product surface, not just a merged module.

POST https://api.wave.online/v1/compose takes a plain-language intent and returns a grounded proposal: which WAVE products to chain, in what order, at what live price. The Python SDK is one of four renderings of that one engine (API, CLI, SDK, MCP); all four must serve the same proposal without re-implementing it.

Today (receipt)

  • Add wave.compose: the PR4 Composer rendering behind POST /v1/compose #50 Add wave.compose: the Composer rendering behind POST /v1/compose MERGED 2026-09-06T20:03:25Z (feat/compose). The module exists in source.
  • The engine it calls is live. Probed unauthenticated this session: POST https://api.wave.online/v1/compose with no credentials returns 402 with an x402 payment challenge naming "resource": "/v1/compose". With a key holding composer:write it returns 200, carrying these keys: callShape, engine, executes, flowId, groundedAt, grounding, id, intent, manifestHash, next, priceRows, productIds, scopes, stages, tools.
  • GET https://api.wave.online/.well-known/wave-skills/composer.json returns 200 and declares auth.scope: "composer:write" and pricing.meter: "wave_compose_builds".
  • What is not done: no published release carries compose yet, the dataclasses/type hints are not proven against the live response, there is no save-flow path, no run/progress/artifact surface, and no e2e in this repo's CI calls the live gateway.

Done means (live proof)

  • (a) Compose live against the engine — wave.compose(...) returns a proposal fetched from POST https://api.wave.online/v1/compose. Receipt: the merged PR (Add wave.compose: the PR4 Composer rendering behind POST /v1/compose #50) plus a captured live response.
  • (b) Save flow — a composed proposal persists through the authenticated bearer path and reads back by id from Python.
  • (c) Run + progress + artifacts — the library can hand a proposal to a run, expose stage progress as it streams, and list the resulting artifacts.
  • (d) Types, docstrings and examples grounded on the LIVE response shape — every declared field and every doc example names the keys the API actually returns (stages, priceRows, scopes, engine, executes, flowId, candidates). A test fails if a declared field is absent from a live response.
  • (e) Release cut — a version bump plus a release-workflow run id as the receipt, and the published package's compose import resolves from a clean install.
  • (f) e2e vs the live gateway in this repo's CI — a test asserting 402 without a key and the 200 response shape with a key, green, with the run id recorded.

Owner

Lane builds it. Jake crossing: the merge to this public repo's default branch, and any release publish.

Depends on

The runner surface behind (c) is tracked on the API side; (a), (d), (e), (f) are independent and buildable now.

Layer

Actions — the Python face of WAVE's Knowledge / Actions / Awareness triple.

Activity

  1. added
    enhancementNew feature or request
    size:LThis PR changes 100-499 lines, ignoring generated files
    on Sep 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    category:bugSomething is brokenenhancementNew feature or requestneeds-triageOn the board but missing Type/Area/Prioritysize:LThis PR changes 100-499 lines, ignoring generated filestrust:ownerIssue author is repo owner

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions