Skip to content

Multi-runtime release-please + Python harness correctness - #534

Merged
Seth Juarez (sethjuarez) merged 4 commits into
mainfrom
sethjuarez/python-harness-correctness
Sep 9, 2026
Merged

Seth Juarez (sethjuarez) merged 4 commits into
mainfrom
sethjuarez/python-harness-correctness

Conversation

@sethjuarez

Copy link
Copy Markdown
Member

Summary

Two related pieces of work from one session on this branch:

  1. Multi-runtime release-please — independent, per-runtime releases; graduates the 2.0.0-beta.N train to a clean 2.0.0 semver line.
  2. Python harness correctness — live agent-loop test anchored to a conformance vector, plus Azure→Foundry dead-code pruning (earlier commits).

Release automation (new)

Each runtime versions and ships on its own cadence via release-please. No shared version number — python/2.1.0 and rust/2.0.3 can coexist.

  • release-please-config.json / .release-please-manifest.json — one component per runtime (python, rust, typescript, csharp, java, go, swift). Tag format separator:"/" + include-component-in-tag + include-v-in-tag:false reproduces the existing python/2.x, rust/*, typescript/*, csharp/* tags exactly, so no publish workflow was changed.
  • .github/workflows/release-please.yml — opens/maintains one Release PR per runtime on main.
  • Version sources: native updaters for rust/go/python; node-workspace (anchored on packages/core) for TypeScript; x-release-please-version annotations on the csharp *.csproj and java build.gradle.kts version lines.
  • Python _version.py normalized 2.0.0b3 → 2.0.0-beta.3 (flit still builds a valid 2.0.0b3 PEP440 wheel; the publish workflow's raw tag↔source string check still passes).
  • RELEASING.md updated with the automated flow, component table, and first-Release-PR verification steps.
  • VS Code extension intentionally excluded — it uses its own vscode/2.0.0-pre.N Marketplace channel.

⚠️ Required before this auto-publishes

Add a RELEASE_PLEASE_TOKEN secret (GitHub App installation token or fine-grained PAT with contents:write + pull_requests:write). Tags cut with the default GITHUB_TOKEN do not trigger the tag-listening publish workflows. Without it, Release PRs still open but publishing won't auto-fire on the cut tag.

Graduation to 2.0.0

Manifest is seeded at each runtime's last beta with no prerelease mode, so the first Release PR per runtime graduates it to a clean 2.0.0.

Harness correctness (earlier commits)

  • Live multi-iteration agent-loop test (tests/integration/test_agent_vector.py) anchored to the multi_turn_tool_calls conformance vector, proving real tool dispatch + multi-iteration dependency on OpenAI and keyless Foundry.
  • Pruned Azure→Foundry dead code; fixed a discovery deprecation; image harness updated to gpt-image-1.

Validation

  • Both release-please JSON files parse; prompty.__version__ → 2.0.0-beta.3; ruff clean.
  • Integration suite: 46 passed / 13 skipped (credential-gated).

Co-authored-by: Copilot App 223556219+Copilot@users.noreply.github.com

…ge harness

Harness correctness for the Python runtime, validated live against OpenAI,
Anthropic, and keyless Foundry (Entra):

- core/discovery.py: replace deprecated EntryPoints[0] index access with
  next(iter(eps), None) (EntryPoints is a DeprecatedList on 3.11+).
- Remove Azure re-export shims (providers/azure/*) and the top-level
  AzureExecutor/AzureProcessor aliases; both `azure` and `foundry` entry-point
  keys already route to FoundryExecutor/FoundryProcessor. Repoint model
  conftest and drop the two obsolete backward-compat alias tests.
- Integration harness: default OpenAI image model dall-e-2 -> gpt-image-1
  (dall-e-2/3 retired on the platform); relabel integration marker as Foundry.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…ctor

Closes the one agent-loop gap not exercised against a real endpoint: a
multi-ITERATION tool chain (get_weather -> convert_temperature -> grounded
answer). Rather than invent a bespoke scenario, the live test reuses the same
canonical TurnConformance.run `multi_turn_tool_calls` @vector that the
deterministic model-conformance suite replays through a scripted double.

- conftest.py: add load_turn_vector()/turn_vector_tool_order() that read the
  Typra-emitted cross-runtime corpus (schema/tsp-output/.typra-generated/
  vectors.json), so the live scenario, tools, and expected tool-dispatch order
  all come from one Typra-governed definition.
- test_agent_vector.py: drive that vector live against OpenAI (sync+async) and
  keyless Foundry. Asserts the exact ordered dispatch sequence, that the
  convert step consumed the weather step's output (~72F -> proves a real
  multi-iteration dependency chain, not parallel calls), and that the final
  answer is grounded in the converted value. Skips (never mocks) when live
  creds are absent, since a mocked model cannot choose a two-step tool chain.

Verified live: 46 passed, 13 skipped; ruff clean.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Introduce independent, per-runtime releases driven by release-please so each
runtime (python, rust, typescript, csharp, java, go, swift) versions and ships
on its own cadence. Graduates the 2.0.0-beta.N train to a clean 2.0.0 semver
line (no prerelease mode).

- release-please-config.json / .release-please-manifest.json: one component per
  runtime; tag format separator=/ + include-component-in-tag + no v, reproducing
  existing python/2.x, rust/*, typescript/*, csharp/* tags so publish workflows
  are unchanged.
- .github/workflows/release-please.yml: opens Release PRs on main; uses
  RELEASE_PLEASE_TOKEN so cut tags trigger the publish workflows.
- Normalize python _version.py to semver 2.0.0-beta.3 (flit still builds a valid
  2.0.0b3 PEP440 wheel) and annotate for the generic updater.
- Annotate csharp *.csproj <Version> and java build.gradle.kts version lines.
- RELEASING.md: document the automated flow, components, token requirement, and
  first-Release-PR verification steps. VS Code extension intentionally excluded.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Comment thread runtime/python/prompty/tests/integration/conftest.py
Reflow long lines in tests/integration/conftest.py and test_agent_vector.py
so `ruff format --check` passes in CI.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@sethjuarez
Seth Juarez (sethjuarez) merged commit bc477ea into main Sep 9, 2026
25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant