Skip to content

Commit 60a21dd

Browse files
authored
docs: record stable release evidence (#24)
1 parent 9cd6041 commit 60a21dd

6 files changed

Lines changed: 119 additions & 40 deletions

File tree

AGENTS.md

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,33 @@ proves only its own evidence layer. Never invent or mock missing evidence.
4848
Never reset, rebase, discard work, force-update refs, delete or recreate an
4949
existing `dev`, or push `dev` to recover. Report the exact state instead.
5050

51-
## Current milestone: Registry Alpha
51+
## Current milestone: Stable 0.1
5252

53-
Registry Alpha is complete: `cometapi==0.1.0a1` is publicly available and its
54-
release and registry trust chain has been verified.
53+
Stable 0.1 is complete: `cometapi==0.1.0` is publicly available and its release
54+
and registry trust chain has been verified. Do not begin 0.2 provider adapters
55+
without a separate maintainer request that authorizes that milestone.
5556

5657
Private Remote Validation, the sanitized first history, private initialization,
57-
pre-visibility closeout, public visibility configuration, Public Preview, and
58-
the first Registry Alpha release are completed historical steps and must not be
59-
repeated. The canonical repository is public with protected branch and
60-
version-tag rules, Private Vulnerability Reporting, immutable releases,
58+
pre-visibility closeout, public visibility configuration, Public Preview,
59+
Registry Alpha, and the first stable release are completed historical steps and
60+
must not be repeated. The canonical repository is public with protected branch
61+
and version-tag rules, Private Vulnerability Reporting, immutable releases,
6162
protected environments, public default-branch CI, and protected release and
6263
registry evidence.
6364

64-
The accepted release evidence is:
65+
The accepted stable release evidence is:
66+
67+
| Field | Value |
68+
| --- | --- |
69+
| Release commit and tag target | `6f42981edcc6c252f8db997606671c3da84d1dd8` |
70+
| Release tag | `v0.1.0` |
71+
| GitHub release | `https://github.com/cometapi-dev/cometapi-python/releases/tag/v0.1.0` |
72+
| Release workflow | `https://github.com/cometapi-dev/cometapi-python/actions/runs/30359383715` |
73+
| PyPI release | `https://pypi.org/project/cometapi/0.1.0/` |
74+
| Wheel SHA256 | `8eae758688bb6c98274e48d8d81f882eeae760f69cfd2f5e125004881d60e90f` |
75+
| Source SHA256 | `e9308b44f6091200b5121e24d1a0e1b9ea3e6bcccc109d6de87554b1ab2a8bca` |
76+
77+
The accepted Registry Alpha evidence is:
6578

6679
| Field | Value |
6780
| --- | --- |
@@ -88,7 +101,7 @@ The accepted identity is:
88101
| Support and conduct | `support@cometapi.com` |
89102
| Security | `https://github.com/cometapi-dev/cometapi-python/security/advisories/new` |
90103

91-
Post-alpha invariants:
104+
Post-stable invariants:
92105

93106
1. Treat the dependency dispositions recorded in `ROADMAP.md` as authoritative
94107
for the listed pull requests. Process newly opened dependency pull requests
@@ -101,14 +114,16 @@ Post-alpha invariants:
101114
bridge was used once to generate the stable release PR and must remain absent
102115
after its human finalization. Keep `RELEASE_RECOVERY_TAG` and
103116
`RELEASE_RECOVERY_SHA` absent outside an explicitly authorized recovery of
104-
that exact existing immutable release identity.
117+
that exact existing immutable release identity, and delete them as soon as
118+
recovery identity verification succeeds or the run stops.
105119
4. Treat the recorded public rules, security reporting, immutable releases, and
106120
protected environments as readiness invariants. Any drift invalidates the
107121
readiness claim until it is explicitly authorized, restored, and verified.
108122
5. Keep the `pypi` environment approval assigned to the current release
109123
approver with self-review allowed; the reviewer is GitHub configuration and
110124
must not be hardcoded in repository files.
111-
6. Treat the recovery tag, GitHub release, and PyPI distributions as immutable.
125+
6. Treat every recorded release tag, GitHub release, and PyPI distribution as
126+
immutable.
112127
Any later live request, tag, release, Trusted Publisher change, publication,
113128
or other registry mutation requires separate explicit maintainer
114129
authorization.
@@ -139,7 +154,7 @@ Post-alpha invariants:
139154

140155
## Product contract
141156

142-
The PyPI package name is `cometapi`. Version `0.1.0a1` exports only the public
157+
The PyPI package name is `cometapi`. Version `0.1.0` exports only the public
143158
clients `CometAPI` and `AsyncCometAPI`; `CometClient` and `AsyncCometClient`
144159
must not exist as aliases.
145160

ARCHITECTURE.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,14 @@ source distribution matched the retained pre-publication digests, Trusted
128128
Publisher provenance was verified, and the clean registry install/import/mocked
129129
smoke passed.
130130

131+
The same trust chain executed successfully for stable `0.1.0` in
132+
[release workflow run 30359383715](https://github.com/cometapi-dev/cometapi-python/actions/runs/30359383715).
133+
The immutable `v0.1.0` tag resolves to release commit
134+
`6f42981edcc6c252f8db997606671c3da84d1dd8`; the protected live suite, direct
135+
top-level OIDC publication, public digest and provenance comparison, and clean
136+
registry install all passed. The selector-descendant conditions were therefore
137+
verified in GitHub's hosted scheduler, not only by local static checks.
138+
131139
The scheduled/manual default-branch smoke is an operational canary only; it
132140
does not prove the release commit. `COMETAPI_KEY` is exposed only to the
133141
protected exact-release live job. OIDC permission is exposed only to the

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ automation.
1717
release chain after a successful selector, while continuing to reject
1818
cancellation, reruns, and every non-successful direct dependency.
1919

20+
### Documentation
21+
22+
- Record completed stable publication, provenance, digest, and clean-install
23+
evidence for `cometapi==0.1.0`.
24+
2025
## [0.1.0] - 2026-07-28
2126

2227
### Features

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# CometAPI Python SDK
22

3-
> **Stable release:** `0.1.0` is approved for PyPI publication.
3+
> **Stable release:** `0.1.0` is approved for PyPI publication and is available
4+
> from PyPI.
45
56
`cometapi` is a thin Python adapter over the official OpenAI SDK for the
67
OpenAI-compatible CometAPI endpoint. It changes the default API key and base
@@ -29,16 +30,15 @@ Project links: [CometAPI](https://www.cometapi.com),
2930

3031
## Installation
3132

32-
After the protected publication workflow and public-registry verification
33-
succeed, install the stable release from PyPI with:
33+
Install the independently verified stable release from PyPI with:
3434

3535
```bash
3636
python -m pip install 'cometapi==0.1.0'
3737
```
3838

39-
After those gates succeed, the immutable
39+
The immutable
4040
[GitHub release](https://github.com/cometapi-dev/cometapi-python/releases/tag/v0.1.0)
41-
and exact [PyPI release](https://pypi.org/project/cometapi/0.1.0/) for the
41+
and exact [PyPI release](https://pypi.org/project/cometapi/0.1.0/) record the
4242
published artifact.
4343

4444
## Authentication and configuration

RELEASING.md

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ uv run python scripts/check_repository_independence.py
9595
uv run python scripts/run_actionlint.py
9696
```
9797

98-
Build output must contain exactly the intended `0.1.0a1` wheel and source
98+
Build output must contain exactly the current project version's wheel and source
9999
distribution. Do not use an older artifact already present in `dist/`. Each
100100
exact artifact must be installed independently outside the source tree; the
101101
check must assert installed metadata, public exports, absence of legacy aliases,
@@ -362,7 +362,8 @@ gh workflow run publish.yml --ref main \
362362
The run must rebuild and verify the exact tag, pass the credential preflight and
363363
bounded four-request live suite, wait for protected `pypi` approval, publish by
364364
OIDC, verify provenance and public digests, and pass the registry clean-install
365-
smoke. Delete the gate immediately after the run succeeds or stops:
365+
smoke. Delete the gate as soon as `verify-recovery` succeeds; if verification
366+
never succeeds, delete it immediately when the run stops:
366367

367368
```bash
368369
gh variable delete RELEASE_RECOVERY_TAG
@@ -393,6 +394,35 @@ plain downstream job conditions. Build, live smoke, publication, and registry
393394
verification were all skipped while the overall workflow incorrectly reported
394395
success. No live request or PyPI upload occurred, and `cometapi==0.1.0` remained
395396
absent. The permanent correction explicitly evaluates every selector descendant
396-
and requires all of its direct dependencies to succeed. Do not dispatch another
397-
recovery until that fix reaches `main` and a new recovery is explicitly
397+
and requires all of its direct dependencies to succeed. A further recovery
398+
remained blocked until that fix reached `main` and a new recovery was explicitly
398399
authorized.
400+
401+
### Completed stable release evidence
402+
403+
- The immutable non-draft [GitHub release](https://github.com/cometapi-dev/cometapi-python/releases/tag/v0.1.0)
404+
and lightweight tag `v0.1.0` resolve to release commit
405+
`6f42981edcc6c252f8db997606671c3da84d1dd8` on protected `main`.
406+
- Selector-descendant fix [PR #23](https://github.com/cometapi-dev/cometapi-python/pull/23)
407+
passed [pull-request CI run 30358662050](https://github.com/cometapi-dev/cometapi-python/actions/runs/30358662050),
408+
squash-merged as `9cd60419130533d6920083e2f4bf295a3b5a4fd7`, and passed
409+
[default-branch CI run 30358990834](https://github.com/cometapi-dev/cometapi-python/actions/runs/30358990834).
410+
- Fresh first-attempt
411+
[recovery run 30359383715](https://github.com/cometapi-dev/cometapi-python/actions/runs/30359383715)
412+
passed immutable identity verification, the shared selector, an exact rebuild,
413+
the bounded four-request live suite, protected `pypi` approval, direct
414+
top-level OIDC publication with attestations, public digest and provenance
415+
verification, and the isolated public-registry install and mocked-call smoke.
416+
- The exact [PyPI release](https://pypi.org/project/cometapi/0.1.0/) has wheel
417+
SHA256 `8eae758688bb6c98274e48d8d81f882eeae760f69cfd2f5e125004881d60e90f`
418+
and source-distribution SHA256
419+
`e9308b44f6091200b5121e24d1a0e1b9ea3e6bcccc109d6de87554b1ab2a8bca`.
420+
Both public files matched the retained pre-publication digest record and
421+
Trusted Publisher provenance independently verified against this repository.
422+
- The immediate one-attempt local simple-index install encountered PyPI CDN
423+
propagation and still saw only `0.1.0a1`. The documented bounded retry then
424+
installed `cometapi==0.1.0`, verified the public imports and version, and
425+
passed all README mocked-call examples.
426+
- `RELEASE_RECOVERY_TAG` and `RELEASE_RECOVERY_SHA` were deleted immediately
427+
after recovery identity verification. `LIVE_SMOKE_ENABLED=false` is the only
428+
remaining release-related repository variable.

ROADMAP.md

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
11
# CometAPI Python SDK Roadmap
22

3-
Status: `0.1.0a1` released; `0.1.0` recovery in progress
3+
Status: `0.1.0` stable released
44
Last updated: 2026-07-28
55
Repository contract: this roadmap is self-contained.
6-
Current gate: land and remotely verify the selector-descendant control-flow
7-
fix, then complete a newly authorized `0.1.0` recovery.
6+
Current gate: maintain the verified stable 0.1 surface. Begin 0.2 only after a
7+
separate maintainer request authorizes its provider schemas and live contracts.
88

99
## Product target
1010

1111
The SDK provides the shortest reliable path from an OpenAI Python integration
1212
to CometAPI while preserving official request, response, error, retry, timeout,
1313
sync, async, and streaming behavior.
1414

15-
Private Remote Validation, Public Preview, and the functional `0.1.0a1`
16-
Registry Alpha are complete for the sanitized public repository. Protected
17-
repository configuration, public default-branch CI, exact-release live smoke,
18-
PyPI OIDC publication, provenance, digest comparison, and public-registry smoke
19-
provide separate evidence layers. Support and release claims remain limited to
20-
the evidence defined in this roadmap and `COMPATIBILITY.md`.
15+
Private Remote Validation, Public Preview, the functional `0.1.0a1` Registry
16+
Alpha, and stable `0.1.0` are complete for the sanitized public repository.
17+
Protected repository configuration, public default-branch CI, exact-release
18+
live smoke, PyPI OIDC publication, provenance, digest comparison, and
19+
public-registry smoke provide separate evidence layers. Support and release
20+
claims remain limited to the evidence defined in this roadmap and
21+
`COMPATIBILITY.md`.
2122

2223
## Milestones
2324

@@ -27,7 +28,7 @@ the evidence defined in this roadmap and `COMPATIBILITY.md`.
2728
| Private Remote Validation | Complete | The sanitized private repository passes real credential-free default-branch CI; public-only controls and live tests remain disabled. |
2829
| Public Preview | Complete | The public repository has blocking CI, repository rules, security reporting, protected environments, immutable releases, and authorized live-smoke evidence. |
2930
| `0.1.0a1` Registry Alpha | Complete | Early adopters can install the functional prerelease from PyPI; every release and registry gate passed. |
30-
| `0.1.0` stable | Recovery in progress | Complete runtime, release-PR, example, provenance, and registry gates pass. |
31+
| `0.1.0` stable | Complete | Complete runtime, release-PR, example, provenance, and registry gates passed. |
3132
| `0.2.0` provider-native text | Planned | Optional official Anthropic and Gemini adapters. |
3233
| `0.3.0` CometAPI resources | Planned | First schema-backed typed CometAPI-specific resource. |
3334
| Media and task APIs | Planned | Coherent task lifecycle precedes individual media helpers. |
@@ -456,12 +457,12 @@ the attestation certificate's Build Config URI named
456457
expected `publish.yml`. This is a platform constraint: reusable workflows are
457458
[unsupported by the PyPA publisher action](https://github.com/pypa/gh-action-pypi-publish/issues/166),
458459
and [Warehouse requires the attestation identity to match the publisher](https://github.com/pypi/warehouse/issues/19814).
459-
The permanent correction consolidates release creation, recovery, selection,
460-
build, protected live smoke, direct PyPI publication, and registry verification
461-
in the single top-level `publish.yml` identity. It keeps attestations and the
462-
existing Trusted Publisher intact. Stable remains unreleased until this change
463-
passes pull-request CI, reaches `main`, and a newly authorized recovery passes
464-
OIDC, provenance, and registry gates.
460+
The first permanent correction consolidated release creation, recovery,
461+
selection, build, protected live smoke, direct PyPI publication, and registry
462+
verification in the single top-level `publish.yml` identity. It kept
463+
attestations and the existing Trusted Publisher intact and reached `main` as
464+
`ec420af2966ef683660b58acff8d125e916fc623` through
465+
[PR #22](https://github.com/cometapi-dev/cometapi-python/pull/22).
465466

466467
[Recovery run 30357111315](https://github.com/cometapi-dev/cometapi-python/actions/runs/30357111315)
467468
verified the exact immutable release and passed the shared selector from the
@@ -472,8 +473,27 @@ the overall run incorrectly reported success. No live request or registry side
472473
effect occurred, and PyPI still returned 404 for `cometapi==0.1.0`. The
473474
permanent control-flow fix makes every selector descendant explicitly evaluate
474475
skipped ancestry while rejecting cancellation and reruns and requiring every
475-
direct dependency to succeed. Another recovery remains blocked until that fix
476-
passes review and reaches `main`, followed by fresh explicit authorization.
476+
direct dependency to succeed.
477+
478+
[PR #23](https://github.com/cometapi-dev/cometapi-python/pull/23) pinned those
479+
conditions in the semantic checker and mutation tests, passed
480+
[pull-request CI run 30358662050](https://github.com/cometapi-dev/cometapi-python/actions/runs/30358662050),
481+
squash-merged as `9cd60419130533d6920083e2f4bf295a3b5a4fd7`, and passed
482+
[default-branch CI run 30358990834](https://github.com/cometapi-dev/cometapi-python/actions/runs/30358990834).
483+
Fresh first-attempt
484+
[recovery run 30359383715](https://github.com/cometapi-dev/cometapi-python/actions/runs/30359383715)
485+
then passed the selector, exact artifact rebuild, bounded four-request live
486+
suite, protected `pypi` approval, direct OIDC publication with attestations,
487+
public digest and provenance checks, and the isolated PyPI install and mocked
488+
smoke. The exact [PyPI release](https://pypi.org/project/cometapi/0.1.0/) is
489+
public with wheel SHA256
490+
`8eae758688bb6c98274e48d8d81f882eeae760f69cfd2f5e125004881d60e90f`
491+
and source-distribution SHA256
492+
`e9308b44f6091200b5121e24d1a0e1b9ea3e6bcccc109d6de87554b1ab2a8bca`.
493+
Both files matched retained pre-publication evidence and independently verified
494+
Trusted Publisher provenance. Recovery variables were removed immediately
495+
after identity verification; `LIVE_SMOKE_ENABLED=false` is the only remaining
496+
release-related repository variable.
477497

478498
## `0.2.0`: Provider-native text adapters
479499

@@ -526,7 +546,8 @@ must resolve an unset or empty `COMETAPI_LIVE_MODEL` to `gpt-5.4` rather than
526546
attempt a request with an empty model. Immutable-release recovery additionally
527547
requires `RELEASE_RECOVERY_TAG` and `RELEASE_RECOVERY_SHA` to equal the exact
528548
dispatch inputs; keep both variables absent except for one explicitly authorized
529-
identity and delete them immediately after success or failure. Recovery and
549+
identity and delete them immediately after recovery identity verification or a
550+
stopped run. Recovery and
530551
publication jobs reject rerun attempts. Every job downstream of the mutually
531552
exclusive selector must explicitly evaluate skipped ancestry, reject
532553
cancellation, and require every direct dependency's result to equal `success`.

0 commit comments

Comments
 (0)