Status: Stable 0.1.x maintenance active
Last updated: 2026-07-31
Repository contract: this roadmap is self-contained.
Current gate: maintain the verified stable 0.1 surface. Begin 0.2 only after a
separate maintainer request authorizes its provider schemas and live contracts.
The SDK provides the shortest reliable path from an OpenAI Python integration to CometAPI while preserving official request, response, error, retry, timeout, sync, async, and streaming behavior.
Private Remote Validation, Public Preview, the functional Registry Alpha, the
first stable release, and verified 0.1.x maintenance releases are complete
for the sanitized public repository and recorded below as immutable evidence.
Protected repository configuration, public default-branch CI, exact-release
live smoke, PyPI OIDC publication, provenance, digest comparison, and
public-registry smoke provide separate evidence layers. Only 0.1.x maintenance
is active; no maintenance release activates 0.2 scope.
Support and release claims remain limited to the evidence defined in this
roadmap and COMPATIBILITY.md.
| Milestone | Status | Exit outcome |
|---|---|---|
| Repository foundation | Complete | Public files, offline gates, packaging checks, and self-containment are complete. |
| Private Remote Validation | Complete | The sanitized private repository passes real credential-free default-branch CI; public-only controls and live tests remain disabled. |
| Public Preview | Complete | The public repository has blocking CI, repository rules, security reporting, protected environments, immutable releases, and authorized live-smoke evidence. |
| Registry Alpha | Complete | Early adopters could install the functional prerelease from PyPI; every release and registry gate passed. |
| First stable release | Complete | Complete runtime, release-PR, example, provenance, and registry gates passed. |
| Configuration maintenance | Complete | Configuration validation and every stable release, live, provenance, and registry gate passed. |
| Release metadata maintenance | Complete | Publication-neutral metadata and release-transport boundaries passed every normal release, live, provenance, and registry gate. |
| Release-claim maintenance | Complete | Durable release-claim detection passed every normal release, live, provenance, and registry gate. |
| Release-document normalization maintenance | Complete | Composed changelog, evidence-URL, archive-parity, and standalone-release gates passed every normal release, live, provenance, and registry gate. |
| Provider-native text | Planned | Optional official Anthropic and Gemini adapters after separately authorized 0.2 activation. |
| CometAPI resources | Planned | First schema-backed typed CometAPI-specific resource after separately authorized 0.2 activation. |
| Media and task APIs | Planned | Coherent task lifecycle precedes individual media helpers. |
Stable maintenance preserves the 0.1 public operation and constructor surface.
String API keys and base URLs are trimmed at their direct or environment
boundary. Explicit blank values fail without fallback; a blank environment key
is missing, while a blank environment base URL selects the default CometAPI
URL. Callable keys and httpx.URL values keep their official OpenAI semantics.
Inherited copy and with_options helpers remain unsupported and fail-closed
for provider routing, workload identity, and private-option injection.
No maintenance release activates 0.2 provider adapters or adds a new resource, CLI, translation, or Go surface without a separate maintainer request.
Deliverables:
- Package
cometapi, withCometAPIandAsyncCometAPIand no legacy aliases. - Standalone documentation, MIT licensing, contribution and conduct guidance, security and support policies, architecture, release guide, changelog, compatibility matrix, and issue and pull-request templates.
- Normalized package metadata with HTTPS-only project URLs and a public support document link, a reproducible development lock, Ruff, Pyright, pytest, metadata, artifact, clean-install, secret, and version checks.
- Offline CI, trusted live-smoke definition, release-PR automation, OIDC publishing definition, and dependency update automation.
- A repository-independence gate that copies the candidate into an empty temporary parent and runs repository-local checks.
- Local validation of every workflow with documented
actionlint1.7.12.
Exit criteria:
- A new contributor can run documented checks from the repository root.
- Pull-request checks require no production credential.
- The wheel and source distribution contain only intended files and each exact artifact passes an independent clean install and mocked-call smoke.
- Documentation and configuration contain no dependency outside the repository root.
- Public identity and remote administration use maintainer-confirmed values.
Private Remote Validation was the one-time initialization stage for the canonical repository. Maintainers created an empty private repository from a sanitized first commit and verified real GitHub behavior. The complete history was required to be suitable for future public visibility and contain only durable product, contribution, maintenance, compatibility, and release material. This stage is complete and must not be repeated for the current canonical repository.
Recorded exit criteria:
- Canonical repository metadata,
CometAPIauthorship,Copyright (c) 2026 CometAPI,support@cometapi.com, and the repository's Private Vulnerability Reporting URL are present in their intended public files.CODEOWNERSis absent until a real multi-maintainer model exists. - Default-branch CI passes in GitHub Actions on every blocking runtime.
- The repository-independence and public-content gates pass against tracked files and history.
LIVE_SMOKE_ENABLEDandRELEASE_PLEASE_ENABLEDkeep live and release-PR workflows disabled.- No branch or tag rules, Private Vulnerability Reporting, protected environments, registry publisher, live credential, tag, release, or package publication is configured or exercised during this private stage.
The private repository was created empty, without generated starter files, so the sanitized local content became its first history. The stage ended after real credential-free default-branch CI was recorded. It did not change visibility or publish to a private or public registry.
Recorded evidence on 2026-07-21:
- The empty private canonical repository received sanitized root commit
7bbffde609e2a5767c3ac1a8b6387ca9744c9e44. - Credential-free default-branch CI run 29796686485 completed successfully for that commit. Blocking Python 3.10 through 3.14, minimum-OpenAI, quality, workflow, package, clean-install, and copied-checkout jobs passed; the push-only latest-within-major canary skipped as designed.
- Release Please remained disabled and its push run skipped. The repository remained private, and no live request, public-only control, tag, release, or package publication was configured or exercised.
Public Preview ready as of 2026-07-27.
Private initialization, pre-visibility work, the visibility change, public configuration, and preview evidence are completed historical steps and must not be repeated. The recorded dependency dispositions below remain authoritative for the listed pull requests. Newly opened dependency pull requests remain pending until a current maintainer request explicitly authorizes their normal maintenance; they must not cause closed or superseded dispositions to be described as unfinished.
The milestone was established only after repository rules, Private Vulnerability Reporting, immutable releases, protected environments, public default-branch CI, the public-content gate, and an authorized protected live smoke passed. Registry Alpha remained a separate authorization and evidence gate and was completed later the same day.
Recorded pre-visibility dependency dispositions:
| Item | Disposition | Evidence and required action |
|---|---|---|
Dependabot PR #1: actions/download-artifact 4.3.0 to 8.0.1 |
Closed unmerged; superseded by merged private PR #9 | PR #9 applies the reviewed SHA pin throughout the release workflow and adds a credential-free CI artifact download plus SHA256 round trip. Its final CI run 29916685839 passed, PR #9 squash-merged as 72b212dd72e66bbde9c6714329f72071cc1ca129, and PR #1 was closed without merging. |
Dependabot PR #2: actions/checkout 4.2.2 to 7.0.1 |
Closed unmerged; superseded by merged private PR #9 | PR #2's CI run 29796719306 failed because its regression test hard-coded the previous checkout SHA. PR #9 instead validates parsed action references independently of version, passed final CI run 29916685839, and squash-merged as 72b212dd72e66bbde9c6714329f72071cc1ca129; PR #2 was closed without merging, and its failed run remains negative evidence only. |
Dependabot PR #3: pypa/gh-action-pypi-publish 1.14.0 to 1.14.1 |
Superseded by current maintenance | The stale dependency PR remains unsuitable for merge, but its one-line Node 24 fallback update was independently reviewed and applied on the current maintenance branch with an exact-SHA semantic gate. Pull-request CI still does not prove OIDC publication, provenance, or registry installation; the authorized normal release supplies that evidence. |
Dependabot PR #4: actions/upload-artifact 4.6.2 to 7.0.1 |
Closed unmerged; superseded by merged private PR #9 | PR #9 applies the reviewed SHA pin in CI and release builds, requires missing artifacts to fail, retains digest evidence, passed final CI run 29916685839, and squash-merged as 72b212dd72e66bbde9c6714329f72071cc1ca129; PR #4 was closed without merging. |
Dependabot PR #5: googleapis/release-please-action 4.4.1 to 5.0.0 |
Closed unmerged; superseded by merged PR #29 | PR #29 pins the reviewed upstream Release Please v5.0.0 commit, verifies its Node 24 runtime through the workflow semantic contract, and carries the required release-metadata hardening. Its final CI run 30509063138 passed, and it squash-merged as 67bd1893983c724d1cc81b824106b7c3d9418e97; PR #5 was then closed without merging. PR #5's failed CI remains negative evidence from the former semantic check that required the old action pin and is not runtime evidence. |
Dependabot PR #6: actions/setup-python 5.6.0 to 7.0.0 |
Closed unmerged; superseded by merged private PR #9 | PR #9 applies the reviewed SHA pin across CI, monitoring, and release workflows, passed final CI run 29916685839 on every blocking lane, and squash-merged as 72b212dd72e66bbde9c6714329f72071cc1ca129; PR #6 was closed without merging. |
Recorded pre-visibility replacement evidence on 2026-07-22:
Local and package evidence at commit
97a14ac6087db3c9205e66bcfbcc890dc23a7ca7:
git diff --check,uv lock --check, anduv sync --lockedpassed.uv run ruff check src tests scripts,uv run ruff format --check src tests scripts, anduv run pyrightpassed.uv run pytest -m "not live"passed with 173 tests passed and one separately marked live test deselected.uv run python scripts/check_version.py --require-changeloganduv run python scripts/check_version.py --require-public-preview-docspassed.uv run python scripts/check_secrets.pyanduv run python scripts/check_workflows.pypassed.rm -rf distcompleted, anduv buildproduced the candidate wheel and source distribution in the clean output directory.uv run twine check dist/*,uv run python scripts/check_artifacts.py dist/*, anduv run python scripts/check_clean_install.py dist/*passed for both exact artifacts, including SHA256 digest generation.uv run python scripts/check_repository_independence.pypassed after copying the candidate into an empty temporary parent and rerunning its complete offline, workflow, build, artifact, and two-artifact clean-install gates.uv run python scripts/run_actionlint.pyanduv run python scripts/run_actionlint.py --offlinepassed with checksum-pinned actionlint 1.7.12.
Follow-up verifier-hardening evidence at commit
88560a889017e2bddc47c52bcaf51e97fa42bcd4:
git diff --check,uv lock --check, anduv sync --lockedpassed.uv run ruff check src tests scripts,uv run ruff format --check src tests scripts, anduv run pyrightpassed.uv run pytest -m "not live"passed with 197 tests passed and one separately marked live test deselected.uv run python scripts/check_version.py --require-changelog,uv run python scripts/check_version.py --require-public-preview-docs,uv run python scripts/check_secrets.py, anduv run python scripts/check_workflows.pypassed.uv run python scripts/run_actionlint.pyanduv run python scripts/run_actionlint.py --offlinepassed with checksum-pinned actionlint 1.7.12.uv build,uv run twine check dist/*,uv run python scripts/check_artifacts.py dist/*, anduv run python scripts/check_clean_install.py dist/*passed for the rebuilt wheel and source distribution.uv run python scripts/check_repository_independence.pypassed the complete copied-checkout gate, including its offline suite, build, artifact checks, and independent clean installs of both artifacts.- Independent adversarial workflow review and targeted follow-up regression coverage found no remaining accepted hostile case after checking trigger filters, secret-context access, runner, container, matrix, working-directory, checkout, job, step, and environment overrides, arbitrary privileged actions, mutable refs, no-op and failure-swallowing commands, artifact ordering, and release-ref decoys.
Final workflow-inventory hardening evidence at commit
668b78f89e8962cc8ab1d1aca8fe3d24c38723ac:
git diff --check,uv lock --check, anduv sync --lockedpassed.uv run ruff check src tests scripts,uv run ruff format --check src tests scripts, anduv run pyrightpassed.uv run pytest -m "not live"passed with 200 tests passed and one separately marked live test deselected.uv run python scripts/check_version.py --require-changelog,uv run python scripts/check_version.py --require-public-preview-docs,uv run python scripts/check_secrets.py, anduv run python scripts/check_workflows.pypassed.uv run python scripts/run_actionlint.pyanduv run python scripts/run_actionlint.py --offlinepassed with checksum-pinned actionlint 1.7.12.uv run python scripts/check_repository_independence.pypassed the complete copied-checkout gate, including 200 offline tests, the package build, artifact inspection, and independent clean installs of the wheel and source distribution.
Final pre-visibility refresh evidence on 2026-07-23:
git diff --check,uv lock --check, anduv sync --lockedpassed.uv run ruff check src tests scripts,uv run ruff format --check src tests scripts, anduv run pyrightpassed.uv run pytest -m "not live"passed with 200 tests passed and one separately marked live test deselected.uv run python scripts/check_version.py --require-changelog,uv run python scripts/check_version.py --require-public-preview-docs,uv run python scripts/check_secrets.py, anduv run python scripts/check_workflows.pypassed.uv build --out-dir dist/previsibility-20260723built exactly the candidate wheel and source distribution in a newly created empty directory.uv run twine check dist/previsibility-20260723/*,uv run python scripts/check_artifacts.py dist/previsibility-20260723/*, anduv run python scripts/check_clean_install.py dist/previsibility-20260723/*passed for both exact artifacts.uv run python scripts/check_repository_independence.pypassed the complete copied-checkout gate, including its 200 offline tests, workflow validation, package build, artifact inspection, and independent clean installs of both artifacts.uv run python scripts/run_actionlint.pyanduv run python scripts/run_actionlint.py --offlinepassed with checksum-pinned actionlint 1.7.12.
Failed or unavailable checks:
- None of the executed final-candidate validation checks failed or were unavailable. Dependabot PR #2's failed run remains separate negative evidence for that PR, not replacement evidence for PR #9. An earlier intentional offline actionlint probe in a fresh detached worktree failed closed before the verified cache was populated; it is not final-candidate validation evidence.
Recorded pre-visibility remote evidence:
- Private PR #9's final-head
CI run 29916685839
passed quality, Python 3.10 through 3.14, minimum OpenAI, package,
exact-artifact clean install, retained artifact digest, and copied-checkout
jobs for
5db7f012a1470564f4f60fe343b9a0799b58987d; the PR-only latest-within-major canary skipped as designed. PR #9 then squash-merged as72b212dd72e66bbde9c6714329f72071cc1ca129, and its credential-free default-branch CI run 29916919999 passed. Superseded PRs #1, #2, #4, and #6 were closed without merging. - Private PR #10's
CI run 29978262916
passed the same blocking lanes for
debd7c1d12c72219ee37de0baa58be119d135ae0; its PR-only canary skipped as designed. PR #10 squash-merged as7d9a3d70714b38b4815d8a8f82a7177d1bcea857, and its default-branch CI run 29978384862 passed. The corresponding Release Please run 29978384858 skipped as required whileRELEASE_PLEASE_ENABLEDremains disabled. - The final merged workflow's latest-within-major canary remains unverified under its scheduled and Dependabot paths.
- The canonical repository was confirmed private after these runs.
Repository-level variables and Actions secrets, environments, tags, releases,
and publish runs were absent when checked;
mainreportedprotected: false. Organization-level variables and secrets were unavailable to the current credential; detailed protection and ruleset APIs were unavailable under the current private-repository plan. They do not provide additional evidence. No visibility, secret, environment, protection, live, tag, release, registry, or publication change was made.
Recorded pre-visibility live evidence:
- The live-smoke path was not executed, and no live API request was made. Transport success and provider behavior therefore remain unverified.
Recorded pre-visibility registry and release evidence:
- Release Please, immutable-release publishing, PyPI OIDC, provenance, and public-registry installation were not executed. No tag, release, or publication was created.
Public Preview readiness evidence on 2026-07-27:
- The complete local readiness gate passed on 2026-07-27 with all three readiness-document changes present: lock reproduction, Ruff, formatting, Pyright, 200 non-live tests, public-content, secret, workflow, actionlint, exact wheel and source-distribution, clean-install, and copied standalone-repository checks all succeeded.
- The canonical repository became public. Active rulesets require pull
requests and the nine blocking CI contexts on
main, block force pushes and deletion with organization-administrator emergency bypass, permit only squash merges, and protectrefs/tags/v*from updates and deletion. - Immutable releases and Private Vulnerability Reporting were enabled. The
live-smokeenvironment has no required reviewer; thepypienvironment requires the current release approver and permits self-review. The live key exists only as an environment secret. - Public scheduled
CI run 30248141487
passed quality, Python 3.10 through 3.14, minimum and latest-within-major
OpenAI compatibility, package, exact-artifact, retained-digest, and copied
standalone-repository jobs for
fa32e962f7a35dd9e183f7b201bd9117590654a9. A manually requested rerun was superseded by this scheduled run through the reviewed concurrency group and was not used as final evidence. - Explicitly authorized protected
live-smoke run 30248383703
passed all four sequential Chat Completions and Responses modes against
gpt-5.4within the four-request, 16-output-token, 30-second-per-request, concurrency-one, zero-retry, stop-on-first-failure budget. TheLIVE_SMOKE_ENABLEDopt-in was reset tofalseafter the run. - At this Public Preview checkpoint, no tag, GitHub release, Trusted Publisher,
PyPI OIDC publication, provenance, or public-registry installation existed.
Those later Registry Alpha actions are recorded below. Release Please remained
disabled until a separately reviewed and tested
last-release-shabridge established the recovery alpha as its previous-release boundary.
Public Preview remains ready only while:
mainrequires pull requests and blocking CI with zero required approvals; force pushes and deletion are blocked, and administrator bypass is reserved for emergencies.- Version tags cannot be updated or deleted, immutable releases and Private Vulnerability Reporting are enabled, and the documented security URL works.
- The
live-smokeenvironment has no required reviewer. Thepypienvironment requires approval by the current release approver and permits self-review. - Default-branch CI is rerun successfully after the public configuration.
- The fail-closed content gate reports all violations together and then passes, repository self-containment and package gates pass, and the README uses publication-neutral stable installation guidance suitable for immutable distribution metadata.
- An explicitly authorized protected live smoke passes within the four-request, 16-output-token, 30-second-per-request, concurrency-one, stop-on-first-failure budget.
Registry Alpha completed on 2026-07-27.
CometAPIandAsyncCometAPI.chat.completions.create: sync and async, streaming and non-streaming.responses.create: sync and async, streaming and non-streaming.models.list: sync and async.COMETAPI_KEY,COMETAPI_BASE_URL, and explicit constructor overrides.- Official OpenAI request, response, stream, error, retry, timeout, proxy, and custom transport behavior.
- Thin public subclasses of
openai.OpenAIandopenai.AsyncOpenAI. - Installable range
openai>=2.45.0,<3.0.0. - Minimum, locked-development, and latest-within-major compatibility lanes.
- Mocked contracts for URLs, authentication, serialization, deserialization, sync/async modes, streaming, client closing, option forwarding, retries, timeouts, official error identity, and credential non-disclosure.
- Wheel and source-distribution metadata, file-list, version, clean-install, and mocked-call verification.
- Anthropic or Gemini adapters.
- CometAPI account, balance, usage, token, log, task, or platform resources.
- Image, video, audio, batch, fine-tuning, realtime, or provider-neutral APIs.
- Reimplemented HTTP, SSE, retry, timeout, protocol models, or error classes.
- Support claims for every resource inherited from OpenAI.
- CLI or Go SDK changes.
CometClientorAsyncCometClientcompatibility aliases.
The alpha was not called released until maintainers confirmed package ownership and PyPI Trusted Publisher configuration, authorized the budgeted live smoke, and reviewed the release documentation. The release workflow proved that the immutable tag target was the checked-out commit and belonged to the protected default branch, ran the protected live suite against that exact commit, and only then made protected PyPI approval eligible. Public artifact identity, digest, provenance, import, clean install, and mocked calls were verified as separate post-publication evidence.
A mock never satisfies a live gate, static workflow validation never proves a remote run, and a successful upload never proves registry installation. PyPI publication is OIDC-only; Python has no token-bootstrap exception.
The first immutable release reached PyPI OIDC publication but Warehouse rejected its non-HTTPS Support project URL before accepting any distribution. The exact tombstoned and recovery identities are recorded in the immutable Registry Alpha evidence block.
Accepted release evidence:
- Metadata fix PR #16
merged as
6344c2d0e2e975360b42c887275c1950b82918ee; recovery contract PR #17 merged as release commit31b68904141489ca04932edbf305ccf88af09372. Final default-branch CI run 30261497883 passed.
- Annotated tag
v0.1.0-alpha.1+recovery.1has tag objectfdc4a6cce31f4534f83903f3f95e7757a4d4049fand peels to release commit31b68904141489ca04932edbf305ccf88af09372. The corresponding immutable GitHub prerelease is release360377046. - Release workflow run 30261746138
passed exact artifact construction and validation, the authorized four-request
protected live smoke, protected
pypiapproval, OIDC Trusted Publishing, provenance verification, public digest comparison, clean PyPI installation, imports, and the public-registry mocked-call smoke. - The exact PyPI release is public.
Its wheel SHA256 is
a6820347317943ca22f7632acbe354dd992f31a122a6172dfe45b57960e3a093and its source-distribution SHA256 is98d86829ef14771e8b7ec180d452c6638289f49c14a39b7207be5c47cb64cde7. LIVE_SMOKE_ENABLED=false. Release Please remains disabled outside an explicitly authorized release sequence. The reviewed stable-readinesslast-release-shabridge generated the stable release PR and was removed during human finalization.
Stable 0.1 retains the alpha surface. Its additional exit criteria are:
- Blocking Python runtime matrix for every supported runtime.
- Human-reviewed release PR with exact version and changelog agreement.
- Stable documentation, classifier, and installation guidance finalized in the release PR, with the one-time recovery bridge removed before merge.
- Executed README examples against the built artifact.
- Trusted live Chat Completions and Responses smoke evidence.
- Immutable tag, GitHub release, wheel, source distribution, and changelog versions agree.
- PyPI OIDC publication includes provenance and the public artifact passes an independent post-publication install/import/mocked-call check.
- No complete credential appears in source, fixtures, artifacts, or logs.
The first stable publication attempt created the immutable stable release and
passed default-branch CI plus exact artifact construction, but
stopped before any live request
because the reusable workflow caller omitted secrets: inherit and GitHub
resolved the live-smoke environment secret as empty. PyPI publication and
registry verification were skipped. PR #21
added secret inheritance, a credential preflight, exact recovery identity
gates, and rerun rejection.
Recovery run 30353657522
then passed exact release verification, artifact construction, the credential
preflight, the bounded four-request live suite, and protected pypi approval.
PyPI rejected the upload with HTTP 400 before accepting either distribution:
the attestation certificate's Build Config URI named
release-recovery.yml@refs/heads/main, while the configured Trusted Publisher
expected publish.yml. This is a platform constraint: reusable workflows are
unsupported by the PyPA publisher action,
and Warehouse requires the attestation identity to match the publisher.
The first permanent correction consolidated release creation, recovery,
selection, build, protected live smoke, direct PyPI publication, and registry
verification in the single top-level publish.yml identity. It kept
attestations and the existing Trusted Publisher intact and reached main as
ec420af2966ef683660b58acff8d125e916fc623 through
PR #22.
Recovery run 30357111315 verified the exact immutable release and passed the shared selector from the correct top-level workflow identity. GitHub nevertheless propagated the intentionally skipped Release Please ancestry to the selector descendants, so build, live smoke, publication, and registry verification were all skipped and the overall run incorrectly reported success. No live request or registry side effect occurred, and PyPI still returned 404 for the stable distribution. The permanent control-flow fix makes every selector descendant explicitly evaluate skipped ancestry while rejecting cancellation and reruns and requiring every direct dependency to succeed.
PR #23 pinned those
conditions in the semantic checker and mutation tests, passed
pull-request CI run 30358662050,
squash-merged as 9cd60419130533d6920083e2f4bf295a3b5a4fd7, and passed
default-branch CI run 30358990834.
Canonical GitHub release
and PyPI release identity at release
commit 6f42981edcc6c252f8db997606671c3da84d1dd8.
Fresh first-attempt
recovery run 30359383715
then passed the selector, exact artifact rebuild, bounded four-request live
suite, protected pypi approval, direct OIDC publication with attestations,
public digest and provenance checks, and the isolated PyPI install and mocked
smoke. The exact PyPI release is
public with wheel SHA256
8eae758688bb6c98274e48d8d81f882eeae760f69cfd2f5e125004881d60e90f
and source-distribution SHA256
e9308b44f6091200b5121e24d1a0e1b9ea3e6bcccc109d6de87554b1ab2a8bca.
Both files matched retained pre-publication evidence and independently verified
Trusted Publisher provenance. Recovery variables were removed immediately
after identity verification. At that closeout, LIVE_SMOKE_ENABLED=false was
the only remaining release-related repository variable.
The configuration-validation maintenance release rejects explicitly blank API
keys and base URLs,
treats a blank environment key as missing, and uses the default CometAPI URL
for a blank environment base URL. It trims surrounding string whitespace,
including the Node-compatible byte-order mark boundary, without changing
callable keys or httpx.URL values. Inherited copy helpers remain fail-closed
against provider routing, workload identity, and private-option injection.
Fix PR #25 passed
pull-request CI run 30419881169
and squash-merged as d02b1dba277ac72229b772d29ea1870b569edd88.
The first authorized
Release Please run 30420057230
failed before creating a pull request because GitHub Actions lacked permission
to create pull requests; it created no tag, release, live request, or PyPI file.
The permission was restored while default workflow permissions remained
read-only, and
PR #26 recorded the
preflight as 18de120c79b5a4fde5d125d56238f7f3b28e69bf.
Fresh Release Please run 30423490399
created release PR #27.
Its final head 7d24b4079b232c6c5e9b09b3d182ded230840ea8 passed all nine
required checks in
run 30424732041
and received an exact-head human owner approval. It squash-merged as release
commit 576e7503a0a8c1103faca5143e4b8d576f8e8b44, which passed
default-branch CI run 30429821579.
First-attempt
release run 30429821548
created and verified the immutable non-draft
GitHub release
and lightweight tag v0.1.1 at release commit
576e7503a0a8c1103faca5143e4b8d576f8e8b44. The run selected the
verified release identity, rebuilt and independently installed both artifacts,
and passed the exact-release live suite with four serial requests, at most 16
output tokens per request, a 30-second request timeout, and stop-on-first-failure.
After protected pypi approval, the same top-level publish.yml published by
OIDC with attestations and passed public registry verification.
The exact PyPI release has wheel
SHA256 27e7904542f82fbbcd60e0de23a4a62c042420b6d004d00286d1f37d2ec4c5e5
and source-distribution SHA256
64c7cb87745032703b3374cc562ea00b979416c54908862dbcebd116b2dc44c8.
Both files matched the retained pre-publication digest record. Their PyPI
Integrity API provenance names repository cometapi-dev/cometapi-python,
workflow publish.yml, environment pypi, release commit 576e7503, and run
attempt 1.
An independent post-workflow verification downloaded both public files,
verified their provenance with pypi-attestations==0.0.29, installed
cometapi==0.1.1 from the public simple index, checked version and public
imports, and passed every supported mocked call and README example.
RELEASE_PLEASE_ENABLED=false and LIVE_SMOKE_ENABLED=false. Recovery
variables are absent. No recovery tag or recovery workflow was used.
Release Please run 30509764960
failed while maintaining the release-metadata patch PR. The pinned v5 action had built
the candidate and reached its PR write boundary when Undici/global fetch
reported other side closed. It created or updated no branch, pull request,
tag, GitHub Release, live request, PyPI file, or other registry state. Read-only
inspection showed that neither the existing release branch nor repository
pull-request permission caused the failure.
Release Please now executes according to external-state reversibility. A
release-only invocation (skip-github-pull-request: true) runs first without
continue-on-error and without retry. Only if no release was created does
PR-only maintenance (skip-github-release: true) run; its first attempt may
continue on error solely to permit one identical conditional retry. Mutable,
idempotent branch and pull-request maintenance can therefore recover from one
isolated transport close, while immutable tag and GitHub Release creation can
never be automatically replayed. This remains 0.1.x maintenance and does not
authorize provider, resource, CLI, or 0.2 work.
Metadata and runtime PR #29
made the packaged README release-neutral, added wheel and source-distribution
long-description assertions, and moved Release Please to its pinned v5 Node 24
runtime. It passed
CI run 30509063138
and squash-merged as 67bd1893983c724d1cc81b824106b7c3d9418e97.
Transport-boundary PR #31
passed
CI run 30510887049
and squash-merged as a411bf5c4aeba341a2d4520a023ad0fe2c5ccee3.
The resulting first-attempt
Release Please run 30511071674
created and maintained
release PR #32.
Its final head 322fdf40585f46aef64bc8b881ee2ce36c09c951 passed
all required CI in run 30511373822,
received human owner approval at that exact head, and squash-merged as release
commit 710c56491d9ef5f47cccff3ce837ab7e799455b0. The release commit passed
default-branch CI run 30515861285.
First-attempt
release run 30515861246
created and verified the immutable non-draft
GitHub release
and lightweight tag v0.1.2 at release commit
710c56491d9ef5f47cccff3ce837ab7e799455b0. It rebuilt and
clean-installed the exact artifacts, passed the four-request exact-release live
suite, received protected pypi approval, published directly from top-level
publish.yml through OIDC with attestations, and passed public registry
verification without a rerun or recovery path.
The exact PyPI release has wheel
SHA256 3f12c26ae1ae7a1de5ac19d8ef27a784b2bf592143c716493f1b0f35ec19daca
and source-distribution SHA256
21c8edc0586610de1a9a8cd39b54ed23d2b1e20552100f69f53938cb7678da3d.
Both files match the retained pre-publication digest record. Their PyPI
Integrity API provenance names repository cometapi-dev/cometapi-python,
workflow publish.yml, environment pypi, release commit 710c5649, and run
attempt 1.
An independent post-workflow verification downloaded both public files,
verified both provenance records with pypi-attestations==0.0.29, installed
cometapi==0.1.2 from the public simple index, verified the public version and
imports, and passed every supported mocked call and README example. The wheel's
immutable long description contains the release-neutral 0.1.x installation
guidance rather than a stale pre-publication version claim.
RELEASE_PLEASE_ENABLED=false and LIVE_SMOKE_ENABLED=false. Recovery
variables are absent. No recovery tag, workflow dispatch, or workflow rerun was
used for 0.1.2.
Implementation PR #34
removed the mutable published-patch claim from persistent guidance and extended
the existing document/version checker across pull-request CI, release source and
artifact verification, copied standalone repositories, wheel metadata, and
source-distribution documents. Its mutation tests reject current/latest
published-patch claims while allowing version-neutral guidance and immutable
historical evidence. They also prove that a synchronized candidate bump does
not require persistent-document edits. The PR passed
CI run 30547956809
and squash-merged as c5b422cdff9d3751323b0aa470091b09db253d1e, which passed
default-branch CI run 30548315922.
First-attempt
Release Please run 30548315785
created release PR #35.
The generated head 4728f111ada71cfb538da35ad14a5540294d2338
used a link-style changelog heading, so
CI run 30548348489
failed the exact changelog-heading contract. The scoped finalization commit
b26c6e645fec131e9b1cd9360bf79651c32808ce restored the required dated
heading. That exact head passed all required checks in
CI run 30548842807,
received human owner approval, and squash-merged as release commit
45429f373bbd11314ec43ba81904fdbb78db2522. The release commit passed
default-branch CI run 30550533622.
First-attempt
release run 30550536000
created and independently verified the immutable non-draft
GitHub release
and lightweight tag v0.1.3 at release commit
45429f373bbd11314ec43ba81904fdbb78db2522. It rebuilt and
clean-installed the exact artifacts, passed the bounded four-request
exact-release live suite, received protected pypi approval, published
directly from top-level publish.yml by OIDC with attestations, and passed
public registry verification. The release workflow used neither a rerun nor a
recovery path.
The exact PyPI release has wheel
SHA256 9ac2f8062a8554943649bffd7ec859fc90491f76bbe2b0165327722201417d6f
and source-distribution SHA256
07ded54606d50f44b689dad38cf93a74e1175370efaa33be84a3c01240d48e66.
Both public files match the retained pre-publication digest record. PyPI
Integrity API provenance identifies repository
cometapi-dev/cometapi-python, workflow publish.yml, environment pypi,
release commit 45429f37, and release run attempt 1.
An independent post-workflow verification downloaded both public files,
verified both provenance records with pypi-attestations==0.0.29, installed
cometapi==0.1.3 from https://pypi.org/simple/, verified the public version
and imports, passed the canonical supported-operation mocked-call smoke and all
four README examples, and then passed the release commit's full ten-case
supported-operation contract suite against that public installation. The
workflow's initial public-index probe saw normal CDN propagation lag; its
bounded retry then completed the same registry smoke successfully.
RELEASE_PLEASE_ENABLED=false and LIVE_SMOKE_ENABLED=false.
RELEASE_RECOVERY_TAG and RELEASE_RECOVERY_SHA are absent; no recovery tag,
workflow dispatch, or release-workflow rerun was used for 0.1.3.
Release-gate PR #37
replaced stale natural-language heuristics with deterministic document and
workflow contracts, moved all active examples and live checks to
gpt-5.6-sol, passed
CI run 30614739509,
and squash-merged as c5eb2f96bd8a5c33c84d6ac00303e376cfac2221.
Release-boundary PR #39
made Release Please's linked dated heading canonical and tightened release
document ownership, passed
CI run 30623035616,
and squash-merged as f28a84911015097872680ec09860ff71015bd7b4.
Normalization PR #40
then composed raw, normalized, decoded, and rendered evidence-URL validation,
required source-distribution byte parity, and fixed immutable-build standalone
verification before digest retention. Its exact head
2ee1f65c5ae40dc2d76564d6d4dac3247b09346b passed
all required CI in run 30635373505
and independently reviewed adversarial probes before squash-merging as
cd4e15157e2704c514483c44497837beab872f32.
The resulting first-attempt Release Please maintenance run created
release PR #38.
Its exact patch-release head c4ed250f511a010c8fd2e8af132e12b652522ab4
changed only the manifest, project version, lock, and canonical dated changelog,
passed all required CI in run 30636496696,
received exact-head human owner approval, and squash-merged as release commit
2a8c857292595471265d99891f5cc0c0ed743fc9. The release commit passed
default-branch CI run 30637109945.
First-attempt
release run 30637109712
created and independently verified the immutable non-draft
GitHub release
and lightweight tag v0.1.4 at release commit
2a8c857292595471265d99891f5cc0c0ed743fc9. It rebuilt and
clean-installed the exact artifacts, verified the copied standalone checkout,
passed the bounded four-request exact-release live suite with gpt-5.6-sol,
received protected pypi approval, published directly from top-level
publish.yml by OIDC with attestations, and passed public registry
verification. The release workflow used neither a rerun nor a recovery path.
The exact PyPI release has wheel
SHA256 fc5992fed080b19e0d656b2f4a4bf5eef7f82b3726ba415f84853b228d4c484c
and source-distribution SHA256
b2b4adbc5da852fe9fdedbe17fa3f29aa536ebb31aefe9d2a7047e783d528df2.
Both public files match the retained pre-publication digest record. PyPI
Integrity API provenance identifies repository
cometapi-dev/cometapi-python, workflow publish.yml, environment pypi,
release commit 2a8c8572, and release run attempt 1.
Independent post-workflow verification downloaded both files, verified both
provenance records with pypi-attestations==0.0.29, and installed
cometapi==0.1.4 from https://pypi.org/simple/ with the then-current OpenAI
2.x dependency. It
verified the public version, exact exports, and isolated installed module;
passed the canonical supported-operation mocked-call smoke and all four README
examples; and passed the release source distribution's full ten-case
sync/async, stream/non-stream supported-operation contract suite against that
public installation.
RELEASE_PLEASE_ENABLED=false and LIVE_SMOKE_ENABLED=false.
RELEASE_RECOVERY_TAG and RELEASE_RECOVERY_SHA are absent; no recovery tag,
workflow dispatch, or release-workflow rerun was used for 0.1.4.
Planned scope:
- Anthropic Messages and Gemini text generation through their official SDKs.
- Optional dependencies with root-import isolation.
- Provider-native request, response, stream, and error types.
- A separate provider API-root configuration that preserves explicit custom proxy paths.
No 0.2 adapter is added without mocked and authorized live contract coverage.
Candidate account or platform resources require an authoritative schema,
authentication contract, error contract, fixtures, precise public types, and a
live test endpoint. Resources and their Pydantic models remain physically
separated under resources/ and types/ when this milestone begins.
The repository maintains three independently auditable workflows:
ci.yml: offline lint, type, unit, contract, build, artifact, and clean install checks for pull requests and default-branch pushes.live-smoke.yml: scheduled and manual default-branch monitoring capped at four requests, a reviewed 64/128/256 output-token calibration choice with a 64-token default, a 30-second request timeout, concurrency one, a ten-minute workflow timeout, and stop on first failure.publish.yml: the single top-level release and PyPI Trusted Publisher identity. Its gated push path first attempts non-retryable release-only creation, then, only when no release exists, permits one bounded retry for PR-only maintenance. It independently verifies a created release. Its explicitly enabled manual path recovers an independently verified existing immutable release only from the protected default branch. An exact selector feeds both paths into tag, commit, and default-branch ancestry verification, artifact rebuild, protected live smoke, direct PyPI OIDC publication, provenance, and registry verification.
All workflow files must pass local actionlint 1.7.12. This is static
validation only. Remote behavior remains unverified until each workflow runs
successfully in the canonical GitHub repository.
Scheduled and manually dispatched live smoke must require
LIVE_SMOKE_ENABLED=true; an unset or other value prevents live execution.
Release Please requires RELEASE_PLEASE_ENABLED=true and remains disabled
outside an explicitly authorized release sequence. Its reviewed one-time
last-release-sha bridge established the recovery alpha boundary, generated
the stable release PR, and was removed during human finalization. Release jobs
must use the canonical active model enforced by the workflow checker, without
accepting a repository-variable override. Immutable-release recovery additionally
requires RELEASE_RECOVERY_TAG and RELEASE_RECOVERY_SHA to equal the exact
dispatch inputs; keep both variables absent except for one explicitly authorized
identity and delete them immediately after recovery identity verification or a
stopped run. Recovery and
publication jobs reject rerun attempts. Every job downstream of the mutually
exclusive selector must explicitly evaluate skipped ancestry, reject
cancellation, and require every direct dependency's result to equal success.
The PyPI action must execute directly in top-level publish.yml; workflow
inventory, semantic checks, and mutation tests must reject reusable publishing,
split publisher identities, additional OIDC consumers, downstream use of raw
dispatch inputs, or weakened selector-descendant conditions.
- Review upstream OpenAI updates weekly through automated dependency pull requests.
- Run trusted live compatibility checks nightly once maintainers authorize the schedule and budget.
- Review security and compatibility issues before every release.
- Review this roadmap for every minor release and at least monthly while a milestone remains active.
- Mark a milestone released only after its registry artifact is independently installed and verified.