Release status is evidence-based:
| State | Required evidence |
|---|---|
| Local code-complete | Required source, tests, documentation, metadata, fixtures, and workflows exist, and every applicable offline check passes. |
| Private Remote Validation ready | Local gates pass, the sanitized history and maintainer-confirmed identity are complete, and real credential-free private default-branch CI passes. |
| Public Preview ready | After visibility changes, public-only repository rules, security reporting, environments, default-branch CI, the content gate, and authorized protected live smoke all pass. |
| Registry Alpha candidate | The exact 0.1.0-alpha.3 artifact passes package and clean-install gates after preserving the unpublished immutable alpha.2 failure record. |
| Registry Alpha released | The public npm artifact installs from the next channel, passes post-publication verification, and has verified provenance plus any documented one-time bootstrap evidence. |
| Stable released | Every applicable stable local, remote, live, review, provenance, and registry gate has recorded evidence. |
| Stable patch candidate | An action-created Release Please PR has the exact version, changelog, manifest, complete CI matrix, and formal exact-head APPROVED review from a distinct human administrator. |
| Stable patch released | The immutable Release Please tag and GitHub Release, bounded live smoke, npm OIDC publication, and independent public-registry verification all pass. |
A build, mock, valid workflow file, successful upload, or HTTP 200 proves only its own layer. Never use it to claim a later state.
Before Public Preview, initialize an empty private repository from a sanitized first commit. Do not ask GitHub to generate a README, license, or ignore file. The complete history must already be suitable for public visibility.
Apply these canonical values before the first push:
| Field | Required value |
|---|---|
| Repository | https://github.com/cometapi-dev/cometapi-node |
| Package author | CometAPI |
| Copyright | Copyright (c) 2026 CometAPI |
| Homepage | https://www.cometapi.com |
repository.url |
git+https://github.com/cometapi-dev/cometapi-node.git |
bugs.url |
https://github.com/cometapi-dev/cometapi-node/issues |
| Support and conduct | support@cometapi.com |
| Security | https://github.com/cometapi-dev/cometapi-node/security/advisories/new |
The Public Preview gate and publish validation require the same normalized
repository.url. Remove .github/CODEOWNERS and its validation dependencies;
it is not required while the project has one active maintainer.
Before the first push, require LIVE_SMOKE_ENABLED=true for live execution and
RELEASE_PLEASE_ENABLED=true for Release Please. An unset or non-true value
prevents the corresponding workflow from running. Leave both disabled during
Private Remote Validation and leave Release Please disabled through the initial
manual alpha.
The private stage validates sanitized history, the complete local gate, and real credential-free default-branch CI only. Do not configure or exercise branch or tag rules, Private Vulnerability Reporting, secrets, protected environments, Trusted Publishing, live API calls, tags, releases, or registry publication. Record the CI result and stop before changing visibility.
Run the fail-closed content and identity gate before the first remote push and again before changing repository visibility:
npm run check:public-previewMaintainers may prepare source, tests, documentation, metadata, fixtures, workflow definitions, changelog entries, release PR content, and dry-run artifacts. Authorized maintainers must supply or approve:
- Changes to the canonical identity and contact values listed above
- Repository creation and visibility, branch/tag protections, environments, secrets, and environment approval policies
- npm package ownership for the maintainer-confirmed
cometapi_devaccount and Trusted Publisher configuration - A
COMETAPI_KEY, request budget, and explicit authorization for live smoke tests - Immutable public tags, GitHub releases, environment approvals, and npm publication
Missing identity, credentials, ownership, or authorization blocks the corresponding release gate. Do not invent it or replace it with a mock.
The cometapi package exists in the public registry. Registry Alpha owner
evidence is complete only when npm owner ls cometapi lists the
maintainer-confirmed cometapi_dev account; until then this remains a Registry
Alpha prerequisite.
Public Preview, Registry Alpha, stable 0.1.x maintenance, and Repository foundation are complete. Future topic pushes, pull requests, merges, immutable GitHub Releases, bounded live smoke, npm publication, and environment approvals require authorization from the current maintainer request. This document defines allowable mechanics but grants no standing remote-write permission.
GitHub does not allow a pull-request author to approve that same pull request,
including when the author is an organization or repository administrator. The
repository setting can_approve_pull_request_reviews=true authorizes eligible
GitHub Actions workflows to submit approving pull-request reviews; it does not
override this author-self-approval restriction. Before requesting a review,
compare the PR author login with the intended reviewer login.
If they are the same, never ask that reviewer to select the disabled Approve
action and never describe a COMMENTED review as APPROVED. A ruleset that
requires an approving review needs a different human reviewer. When the active
ruleset requires zero approvals and the release procedure asks only for an
owner's exact-head audit record, the author may submit a Comment review whose
body names the reviewed commit; verify its user.login, state=COMMENTED, and
commit_id through the reviews API before merge. Action-authored Release Please
PRs remain different: the release workflow requires a formal, exact-head
APPROVED review from a human repository administrator whose login differs
from the bot author.
Any head change invalidates an earlier exact-head COMMENTED audit or formal
approval. Release and publication trust-boundary PRs require a new exact-head
human record before merge. GitHub's Approve and run workflows control is a
separate authorization for CI created by an action-authored PR; it is not a PR
review and satisfies no approval requirement.
Run from the repository root on a clean checkout:
npm ci
npm run build
npm test
npm run typecheck
npm run lint
npm run format:check
npm run test:secrets
npm run test:package
npm run test:examples
npm run test:live-contract
npm run test:fixtures
npm run test:compat
npm run check:standalone-content
npm run check:self-contained
npm run check:public-preview
npm run actionlint
npm run verifyThe individual commands remain documented even if npm run verify aggregates
them. The verification record includes exact commands and outcomes, including
failures, skipped checks, and unavailable runtime/tool checks.
npm run test:package builds and inspects a candidate tarball and runs package
metadata, export, declaration, publint, Are the Types Wrong, and dry-run pack
checks. npm run test:examples installs one exact tarball with the locked OpenAI
version, checks dependency deduplication, and executes the canonical README ESM
and CommonJS examples with fail-closed mocked transport.
npm run test:fixtures installs a candidate tarball into clean ESM,
CommonJS, and compatible-OpenAI host applications. Both commands accept
--tarball <path> so the publication workflow can pack once, inspect and
install the exact artifact, then upload that same file. npm run test:compat
covers the minimum, locked, and applicable canary dependency lanes with ESM and
CommonJS runtime checks plus .mts and .cts consumer type checks.
npm run test:secrets fails on a shallow Git clone and scans the current tracked
tree plus reachable Git blobs, commit and tag messages, and historical paths.
It reports only the rule and a safe object identifier or path hash rather than a
matched value.
npm run check:standalone-content fails on a shallow Git clone, materializes
every unique tracked tree reachable from all local refs and HEAD without
honoring export exclusions, and reports the commit and tree for every
outside-root or private-content violation. In the isolated self-containment copy
it scans that exact file tree because Git metadata is intentionally absent.
npm run check:self-contained requires a clean tracked worktree, materializes
the exact HEAD tree into an empty temporary parent, scans documentation and
configuration for outside-root dependencies, and runs the documented offline
setup and tests from the copied root. Untracked local files cannot satisfy a
missing repository dependency.
npm run test:live-contract uses mocked transport to prove the bounded live
runner rejects empty Chat results and failed, incomplete, or unterminated
Responses streams. It never contacts the production API.
npm run actionlint uses the repository-pinned actionlint version to statically
validate every workflow. It is not a GitHub Actions emulator and does not prove
that any workflow executed remotely.
package.json is the sole candidate-version authority; validation must not
hard-code a second version as an independent authority. Before release, local
package checks derive that value and require:
- The package-lock root name and version to match
package.json. - Either the Release Please manifest to match, or, for the first release only,
an empty manifest plus
release-asmatching the candidate version. - Exactly one changelog heading for the candidate. It may remain
Unreleasedduring prerelease preparation. - The packed package metadata name, version, dependency range, and runtime contract to match the source manifest.
For normal stable maintenance, the generated Release Please PR changes exactly these four files:
.release-please-manifest.jsonCHANGELOG.mdpackage-lock.jsonpackage.json
Those files carry the candidate-specific version agreement. README, status, compatibility, and runbook prose must remain publication-neutral so the generated PR does not require a manually predicted version or an additional documentation mutation.
The release workflow then requires the Release Please manifest to equal the
candidate, the one-time release-as bootstrap to be absent, the changelog
heading to be uniquely dated, the immutable tag to be v<version>, the GitHub
release to refer to that tag and have the correct prerelease state, and the
uploaded tarball metadata to contain the same version. Maintainer-supplied identity
metadata changes the artifact and therefore requires all exact-artifact checks
to run again.
The workflow is the sole source of npm dist-tag selection: a version containing
a prerelease component publishes to next, and a stable version publishes to
latest. package.json must not define a static publishConfig.tag.
Query exact public state when needed instead of copying it into durable prose:
npm view cometapi version
npm view cometapi dist-tags --json
gh release view --repo cometapi-dev/cometapi-node \
--json tagName,isDraft,isPrerelease,publishedAt,urlDevelopment checks may run before public identity is complete, but the
publication path is fail-closed: publish.yml invokes
scripts/validate-release.mjs --require-releasable-docs and fails before build,
live smoke, or registry access unless all of these conditions hold:
LICENSEcontains a maintainer-supplied copyright year and holder with no placeholder.README.mdcontains the exact unpinnednpm install cometapicommand, links to the unversioned npm package page, and contains no exact-version current, approval, unpublished-candidate, or in-progress release claim.SECURITY.mdandSUPPORT.mdremove stale candidate status and each contain a maintainer-supplied canonical email address or GitHub repository contact URL.- The candidate's dated
CHANGELOG.mdsection contains no candidate-only release evidence such as unperformed publication or pending ownership. - The separate immutable-release trust check confirms that
package.jsonrepository.urlandbugs.urlexactly match the publishing GitHub repository.
The Public Preview variant collects and reports every violation in one run and
then returns non-zero if any violation exists. It must require
git+https://github.com/cometapi-dev/cometapi-node.git as repository.url, the
same value required by publish validation.
Maintainers land this transition in a reviewed implementation or finalization PR before Release Please preparation. After Release Please creates or refreshes the generated four-file release PR, validate that PR's exact final committed state with:
release_version="$(node -p "require('./package.json').version")"
node scripts/validate-release.mjs \
--tag "v${release_version}" \
--release-prerelease false \
--require-final \
--require-releasable-docsChanging identity or public status text after artifact verification invalidates that evidence; rebuild and rerun every exact-artifact check.
The repository maintains four independently auditable workflows:
-
ci.yml: credential-free pull-request and default-branch checks on Node.js 22 and 24, with Node.js 26 advisory. -
live-smoke.yml: trusted scheduled and manual default-branch-only low-cost compatibility tests against the pinned CometAPI HTTPS endpoint. Each run makes exactly three sequential requests, caps generated output at 16 tokens, applies a 60-second timeout to each request, fixes concurrency at one, and stops on the first failure. Standalone and release smoke jobs share one repository-wide concurrency group. Scheduled and manual live execution requiresLIVE_SMOKE_ENABLED=true. -
release-please.yml: patch-only versioning, an explicitcometapibranch component, separate pull requests, and the pinned root-package titlechore(main): release <version>. It requiresRELEASE_PLEASE_ENABLED=trueand uses the defaultGITHUB_TOKEN. The authorized repository baseline keeps default workflow permissions read-only and allows Actions to create pull requests; it does not make bot review valid release approval. Automatic push execution covers everymaincommit so a normalfix:commit that changes source, tests, or documentation cannot be filtered out before Release Please classifies it. The in-job before/after check sends an unchanged current package version to patch-PR preparation and requires a release-PR merge to increment exactly one patch. Thus an ordinary sourcefix:prepares or refreshes exactly one canonical patch PR, while the reviewed package-version bump alone can enter GitHub Release creation. A manual preparation dispatch is attempt-1-only, skips GitHub Release creation, and prepares or revalidates exactly one action-authored patch PR. The preparation run verifies the canonical branch, title, machine-readable body, pending label, four expected release files, and 0.1.x patch versions. Before a post-mergepushmay create a Release, the workflow rejects legacy, alternate, fork, older, or multiple candidates and requires a formal human administrator approval on the exact final head. Release Please creates the immutable tag and GitHub Release, verifies the release notes byte-for-byte against the normalizedCHANGELOGentry, reconciles release labels, and uploads one schema-v2 attempt-qualified result artifact. An existing Release may be reconciled only by a later attempt of that same run after its exact commit, tag, author, immutable state, notes, and creation window are proven. The triggering SHA must remain the fetchedmaintip before every mutation. Before and after tag creation, the workflow also validates the permanent publication contract stored at the exact release commit. This flow does not introduce a PAT or GitHub App credential. Component identity remains internal to release discovery:include-component-in-tag=falserequires the exact publicv<version>tag. Its write permissions are limited tocontents,pull-requests, andissues; it also hasactions: readand no npm OIDC permission. -
publish.yml: separates release discovery from registry authority. A successful trusted Release Pleaseworkflow_runcan enter only thehandoffjob. That job has no Environment and no OIDC permission. It validates the exact source job and treats a preparation run whose result-upload step was skipped as release-inert. For a release run, it requires the unique attempt-qualified result, immutable bot-authored Release, tag commit, exact currentmainidentity, and the dispatch contract stored in the tag, then uses its soleactions: writepermission to dispatch the same workflow withref=v<version>. Theverify,live-smoke, andpublishjobs accept only that tag-boundworkflow_dispatch; they are unreachable from the original main-contextworkflow_run. A successful manual Release Please preparation run is release-inert and cannot enter the handoff.The tag run independently revalidates the source run and result artifact, exact tag and immutable Release, package metadata, and exact current
mainidentity. It freezes the Release Please run set, packs and tests one fresh attempt-qualified artifact, runs a fresh bounded live smoke, and sends that same file to the protected npm Environment. Immediately after approval and directly before registry mutation, it rechecks the source run, enable variable, Release, tag, currentmain, active Publish runs, Release Please run snapshot, npm Environment reviewer and branch policies, public versions, and dist-tags. The Environment must contain exactly its permanenttag:v*deployment policy. Registry token credentials are rejected; only the publish job receivesid-token: write. Provenance must bind the package to the exact stablev0.1.xtag and release commit. Replays are integrity-idempotent, not exactly-once: an existing version is accepted only when its registry integrity matches the downloaded artifact, after which the bounded registry, signature, and provenance checks run again. Package metadata and the attestation endpoint may converge independently, so attestation HTTP failures, including an early404, receive a bounded ten-minute retry. Exhaustion remains a hard failure.
The one-time 0.1.1 main-context publication exception is historical evidence,
not a reusable release route. Its dispatch inputs, fixed evidence identifiers,
prior-artifact reuse, live-evidence reuse, and temporary main policy handling
must remain absent from executable workflow code. No later release may add a
main publication policy, dispatch publication from a branch, fabricate an
auxiliary tag, or choose a different patch to bypass a failed release.
The permanent npm Environment deployment-policy set is exactly one tag:v*
policy. Any branch:main policy or other additional policy is configuration
drift and stops publication. Environment reviewers, the Trusted Publisher
tuple, repository variables, protections, secrets, and npm ownership are
external release prerequisites; the workflow validates the state it can read
and never changes those settings.
Third-party actions are pinned to full commit SHAs. Workflow permissions remain
read-only except where a documented job requires more; id-token: write belongs
only to the publish job, and actions: write belongs only to the unprivileged
handoff. Publication cannot run from an arbitrary branch or an unreviewed
commit.
The supported package engines range contains Node.js 22 and 24 only. Node.js
26 remains an advisory workflow target until it enters LTS; Node.js 18 and 20
remain unsupported.
The first manual alpha recorded 0.1.0-alpha.1 in the manifest and removed the
temporary release-as configuration. Later releases advance that manifest with
the package version. The publication workflow fails unless the manifest equals
the package version, release-as is absent, and the version has exactly one
dated changelog heading.
The first npm artifact must be functional and published under the next
dist-tag. Before authorizing release:
-
Complete Private Remote Validation, record real credential-free CI, and stop for explicit visibility-change authorization.
-
After the repository becomes public, require pull requests and blocking CI for
mainwith zero required approvals, block force pushes and deletion, reserve administrator bypass for emergencies, protect version tags from updates and deletion, and enable immutable releases and Private Vulnerability Reporting. -
Configure
live-smokewith no required reviewer andnpmwith approval by the current release approver and self-review allowed. SetLIVE_SMOKE_ENABLED=true, rerun default-branch CI, run the authorized live smoke, and record Public Preview readiness only after all public gates pass. -
Prepare the initial alpha through a reviewed manual pull request while Release Please remains disabled. Make the manifest record
0.1.0-alpha.1, remove the one-timerelease-assetting, date and normalize the changelog entry, update release-status text, and require the canonical repository and contact metadata. -
Derive
0.1.0-alpha.1frompackage.jsonand confirm agreement with the lock root, manifest, changelog heading, intendedv0.1.0-alpha.1tag, GitHub prerelease state, and packed metadata. -
Run every local gate on the exact candidate, inspect and retain the exact tarball, install it into clean ESM, CommonJS, and compatible-OpenAI host fixtures, and confirm one effective OpenAI dependency plus
APIError instanceofidentity. -
Attempt normal npm Trusted Publisher configuration for the canonical repository, workflow, and
npmenvironment before considering the conditional bootstrap. -
Review the exact candidate, create
v0.1.0-alpha.1, and publish the matching immutable GitHub prerelease. -
Let the release workflow verify
immutable: true,mainancestry, the exact tarball, and the trusted release-tag live smoke: exactly three sequential requests, 16 output tokens, 60 seconds per request, concurrency one, and stop on the first failure. -
Approve publication of that same tarball through the protected
npmenvironment with OIDC and provenance, or use the one-time alpha.1 bootstrap only when normal Trusted Publishing cannot create the new package. The workflow selectsnext; no static package-manifest dist-tag participates. -
After the first npm publication, an authorized maintainer adds the company-controlled owner and verifies the resulting owner list:
npm owner add cometapi_dev cometapi npm owner ls cometapi
Record evidence that the output lists
cometapi_dev; Registry Alpha owner setup is incomplete until it does. -
Install
cometapi@nextfrom npm and run an independent import and mocked call before marking the alpha released. Enable Release Please only after the initial manual alpha is complete.
The normal publication runner uses Node.js 22.14.0 or later and npm CLI 11.5.1
or later; Node.js 24 is preferred. npm Trusted Publishing requires the manifest
repository.url to match the canonical GitHub repository exactly. Publication
is blocked until that canonical URL is configured.
Maintainers must first attempt normal Trusted Publisher configuration. If npm
does not permit it before the package exists, only 0.1.0-alpha.1 may use this
one-time exception:
- A maintainer creates a short-lived granular read/write token with minimum scope and non-interactive 2FA bypass from an account protected by 2FA.
- In the protected
npmenvironment, setNPM_ALPHA1_BOOTSTRAP_ENABLED=trueand expose the token only asNPM_ALPHA1_BOOTSTRAP_TOKENto one reviewed immutable-tag run. The workflow rejects the bootstrap for every version except0.1.0-alpha.1, requires thenextdist-tag, and fails if the token is absent when publication is needed. - That run verifies and publishes the exact artifact with public access and provenance, then verifies registry installation.
- Complete the common Registry Alpha owner-verification step after this first publication; the bootstrap does not change or defer that requirement.
- A maintainer immediately configures OIDC, removes the environment variable and secret, revokes the token, and restricts token-based publishing.
- The project prepared the immutable
0.1.0-alpha.2GitHub release through OIDC. Exact-artifact verification and the protected live smoke passed, but the local publication guard rejected the fixedactions/setup-nodeauthentication placeholder before npm was invoked. No alpha.2 registry artifact was published. - Preserve that immutable failure record, prepare and publish
0.1.0-alpha.3through OIDC with regression coverage for the placeholder, verify its provenance and public installation, and confirm thatnextresolves to0.1.0-alpha.3. - The release record documents the exception, the unpublished alpha.2 attempt, and both public-install evidence layers.
This exception must never become a reusable source-controlled publishing path.
Registry Alpha completed on 2026-07-27 with these independently auditable layers:
- The one-time
0.1.0-alpha.1bootstrap recovery published the exact artifact with provenance in GitHub Actions run 30251436832. - npm ownership lists both
tensornull <tensor.null@gmail.com>and the company-controlledcometapi_dev <dev@cometapi.com>account. The bootstrap token was revoked, local npm authentication was removed, the protectednpmenvironment has no secrets or variables, and npm disallows token publishing. - The immutable
0.1.0-alpha.2release passed exact-artifact verification and protected live smoke in run 30270656080, then failed before invoking npm because the local publication guard rejected the fixedactions/setup-nodeauthentication placeholder. No alpha.2 registry artifact exists. - Pull request #23 added regression coverage for that placeholder while preserving rejection of real registry credentials. Default-branch CI run 30272606126 passed before tagging.
- The immutable
v0.1.0-alpha.3release completed exact-artifact verification, the bounded three-request live smoke, OIDC publication, registry convergence, signature verification, dependency deduplication, and public installation in run 30272764488. - npm identifies the publisher as GitHub Actions using
npm-oidc-no-reply@github.com. The registry reports SLSA provenance v1 and integritysha512-dtzQOz0dxif74jJpu2fhfUVjiq6TLm3YkPydtsryHGxuU6usaLWTpcblky854T42TG+SbTApCgOoNJDMkEYIOg==, and Sigstore transparency-log index2257566579. - Independent installs from the public registry passed for ESM, CommonJS, and a
host already declaring
openai@6.47.0. The host resolved one effective OpenAI installation and preservedAPIError instanceofidentity. Registry signatures and attestations were verified withnpm audit signatures. - At the Registry Alpha closeout on 2026-07-27, npm had assigned
0.1.0-alpha.3to the prerelease channel. At the stable0.1.0closeout, npm had assigned0.1.0to the stable channel and replaced the registry-created assignment for0.1.0-alpha.1.
feature or fix pull request
-> required offline CI
-> merge to the protected default branch
-> first-attempt manual Release Please preparation
-> action-created Release Please branch and release PR
-> human review and merge
-> immutable tag and GitHub release
-> rebuild and verify exact artifact
-> protected release-tag live smoke
-> OIDC publication with provenance
-> dist-tag, integrity, provenance, signature, and public-install verification
-> roadmap milestone marked released
Stable release additionally requires the complete supported-runtime matrix, executed README examples against the packed artifact, release-PR/tag/changelog/ manifest version agreement, reviewed security and compatibility status, and post-publication registry evidence.
CHANGELOG.md is owned by Release Please and excluded from Prettier so the
action-generated release notes remain byte-for-byte identical to the release
PR body. Release validators still require the exact dated stable-patch section,
the four-file candidate shape, and exact PR-body note equality; secret,
standalone-content, and public-preview checks continue to scan the file.
Before a stable patch operation, verify the standard autorelease: pending and
autorelease: tagged labels, default_workflow_permissions=read, Actions
pull-request creation authorization, no canonical-branch collision, and the
current external Environment and Trusted Publisher state. The workflow never
changes those settings; drift is a stop condition. Enable
RELEASE_PLEASE_ENABLED, start a new attempt-1 manual dispatch on main, and
never rerun a preparation dispatch. An unchanged candidate is revalidated by a
new dispatch. Manual preparation uses skip-github-release=true and is release-
and publication-inert.
The action-created PR must contain only the four release files and exact
generated notes. A human with write access separately authorizes its CI through
Approve and run workflows when GitHub requires that gate. After all final-
head checks pass, a human repository administrator whose login differs from the
bot author must submit a formal exact-head APPROVED review. That
administrator's latest review must remain exact-head APPROVED through merge
and post-action validation; a later COMMENTED or CHANGES_REQUESTED review,
or any head change, invalidates the approval.
The release-PR merge creates the only push run that may call Release Please in
release mode. From that merge through successful registry verification and the
final readback, do not start a new Release Please workflow or rerun any run
except the bounded source-run retry described below or the exact post-publish
failed-job replay described after the handoff; publication freezes the complete
Release Please run set. Through post-action validation, do not edit the release
PR, change its labels or review, or mutate its branch. Keep main frozen at the
release commit through successful registry verification and the final variable
and Environment-policy readback; every handoff, tag, and pre-publish gate
requires that exact identity. A Release Please rerun may retry the same release
candidate only while no tag or Release exists. If an earlier attempt of that run
already created the Release, same-run reconciliation is allowed only after
proving the exact run ID, SHA, tag, bot author, immutable state, target, URL,
notes, and publication time inside one earlier Release Please step. It may only
reconcile labels and write the attempt-qualified result artifact.
The successful Release Please workflow_run enters an unprivileged handoff,
which validates the exact result and immutable Release before dispatching
publish.yml with ref=v<version>. Only the tag-bound dispatch may rebuild and
verify the artifact, run the fresh bounded live smoke, enter the npm
Environment, request OIDC, or verify the registry. The permanent npm Environment
policy set is exactly tag:v*. After registry verification, immediately restore
RELEASE_PLEASE_ENABLED=false and keep LIVE_SMOKE_ENABLED=true.
The handoff itself runs only on attempt 1 and refuses the dispatch when any
exact Publish child already exists for that immutable tag and commit. A handoff
rerun may never create a replacement child publication run.
Never substitute a manually authored release PR, manual or auxiliary tag,
branch-context publication, temporary main Environment policy, cross-run
artifact or live-evidence reuse, arbitrary rerun, or different patch version. An
ambiguous npm result requires exact registry integrity, signature, and
provenance inspection; it never authorizes an automatic retry.
If the exact publish step succeeded but a later registry verification step
failed, query the immutable version and both dist-tags before taking any action.
When the exact version is absent, latest must equal the previous patch. When
the exact version equals the candidate, latest may equal the previous patch or
candidate. Final verification requires the exact version and latest to equal
the candidate. Throughout the run, next must equal the prerelease value
captured by the initial verification job; durable guidance does not pin that
registry value.
An early attestation-endpoint 404 is the known convergence case. Other HTTP or
transport failures receive the same finite retry, but persistent authentication,
authorization, URL, server, or convergence failures remain failures. Let the
workflow's strict ten-minute wall-clock fetch finish; exhaustion is terminal, so
stop and report rather than rerunning to extend the wait. Only after attestations
are readable and independent signature and provenance checks pass may a
different failed post-publication gate use exactly one rerun failed jobs on
the same tag-bound run. Before approving that replay, confirm that GitHub kept
the successful exact-artifact and live-smoke jobs. Rerun-all is invalid and its
attempt guards must fail before live API access. The attempt-2 protected
preflight must record that the exact version exists, and the idempotent
publication script must report matching integrity and skip npm publish. An
exact-version metadata E404 after that preflight is a hard stop rather than
permission to republish. The failed publish job still requires a fresh npm
Environment approval. Attempt 3 or later, a second replay request, retry
exhaustion, or any mismatch is terminal. After successful verification, restore
RELEASE_PLEASE_ENABLED=false immediately.
The 0.1.1 repair used the immutable 0.1.0 commit as a one-cycle
last-release-sha only for its initial preparation, then removed the anchor.
The failed run's exact generated 0.2.0 branch was verified as failure-only
evidence with no open PR or independent work before replacement by the
canonical action-owned 0.1.1 branch. Neither branch is a 0.2 starting point.
The one-time main-context npm recovery is historical evidence only; its complete
record appears below and its executable path was removed by PR #41.
The 0.1.0 promotion limited Release Please to the stable PR because the
pinned v5.0.0 action bundles Release Please 17.6.0 and its single-package path
has the open upstream
release-please-action issue #1205
when component names are omitted from tags. After the release PR merged, a
maintainer created the draft v0.1.0 GitHub Release manually against the exact
merge commit, reviewed it with prerelease=false, and published it with
immutable releases enabled.
Release Please did not add an autorelease: pending label to the manually
opened stable PR, and the repository had no autorelease labels at the time, so
no post-tag label transition applied to this release.
Release Please did not author the final public status text. A maintainer pushed the focused README, SECURITY, SUPPORT, COMPATIBILITY, and ROADMAP candidate state to the generated branch and repeated the CI review on the final head before merging it.
The failed post-merge Release Please
run 30345116433
started seven seconds after the maintainer created a draft v0.1.0 Release, but
the draft had no tag and was not published until more than eight minutes after
the run failed. Release Please therefore found no discoverable published
release/tag boundary, scanned the older initial feature commit, and prepared an
unrequested 0.2.0 branch update. PR creation then failed for the separate reason
that repository Actions were not authorized to create or approve pull requests
at that time.
Publishing the manual Release later could not retroactively bound that run, and
leaving skip-github-release enabled would continue the split discovery model.
The 0.1.1 repair replaces that historical combination with explicit component
identity, one-cycle history anchoring, action-created/human-reviewed release
PRs, and normal Release Please tag and GitHub Release creation. Repository
Actions pull-request authorization is now enabled for that scoped job; the
workflow still uses only its default token and job-local permissions.
The same-run Release reconciliation rules follow the pinned implementation
rather than assuming the action is atomic. Release Please 17.6.0
creates the Release before PR comments and label changes,
while the pinned action emits release outputs only after that call returns. An
unchanged release PR may also return
no PR result.
Finally, commit-level Release-As: is rejected before the action because the
base strategy applies it before configured versioning.
GitHub documents that a GITHUB_TOKEN-created PR's opened or synchronize event
creates an approval-required workflow run.
Stable 0.1.3 completed on 2026-07-31 with these independently auditable
layers:
- Source PR #48
updated the README, runnable ESM/CommonJS examples, mocked example fixtures,
and protected live-smoke defaults to
gpt-5.6-sol. It also disabled reasoning explicitly in the bounded chat and Responses requests so the 16-token cap remained effective. Final headcae4c97a29221fd46aa798d93c0ed10b6e94cb7dpassed CI run 30618613128 and merged as3809692d35e2d9f98ba3a209947c716d8e4307b7. - Manual Release Please preparation
run 30627666360 attempt 1
ran from that exact merge on
mainand created the action-authored release PR below. - The resulting four-file release
PR #49 had final head
39894513ae2534d778a0a4b8bc2a978533bec40band changed only the manifest, changelog, package lock, and package manifest. After the human workflow gate, its complete blocking matrix passed in CI run 30627706967 attempt 2. Human repository administratortensornull, distinct from bot authorgithub-actions[bot], submitted formal review 4828166257 withstate=APPROVEDagainst that exact head before merge. The reviewed merge produced265375a088cce50d2e5980ca557404fd01028efc. - Release Please run 30628129319 attempt 1
created the exact lightweight
v0.1.3tag and immutable non-prerelease GitHub Release ID363031910. The bot-authoredv0.1.3Release targets the reviewed merge commit and was published at2026-07-31T11:45:32Z. - The unprivileged
handoff run 30628167257 attempt 1
validated the exact Release Please result and immutable Release before
dispatching the tag-bound
Publish run 30628187558 attempt 1.
That run rebuilt the release commit, passed the full release checks and
public declarations/fixtures, and uploaded artifact ID
8792282959, namednpm-package-0.1.3-30628187558-1, with ZIP digestsha256:f896a2a24ef8b6c30aac03327d022a277558c99db8c8ca2e32b3a4f7b25502f3. Its sole tarball has SHA-256283b1dbc91f2eeb84d675da2623bc25eab4148da333f7a77b07be548b6589293and is byte-identical to the public registry tarball. - The same run's
live job 91148676643
checked out
refs/tags/v0.1.3and passed exactly three sequential requests, with Chat Completions and Responses usinggpt-5.6-sol, a 16-token output cap, 60-second per-request timeout, concurrency one, and stop-on-first-failure behavior. - Protected npm job
91148760122
published through the tag-only npm Environment and GitHub Actions OIDC at
2026-07-31T11:51:06.196Z. Attempt 1 then completed exact artifact, dist-tag, signature, attestation, provenance, and public-install verification without a replay. - At closeout, npm's stable channel resolved to
0.1.3, while the prerelease channel remained0.1.0-alpha.3. The package has SHA-1e000b2066b6c19b6ff4a327ed9451dba896cc939and integritysha512-ByPYZsoLGDYZeyMZCnq99CzT3IhveylPMG8gB8bLlBSpRP8g/FdD8jrQvZMWx+4+qaVSTQp4HVHHYsU9POeFtw==.npm audit signaturesverified registry signatures for all three installed packages and attestations for two. npm exposes its publish attestation at Sigstore index 2300742325 and SLSA provenance at index 2300742191. The provenance bindscometapi@0.1.3topublish.yml@refs/tags/v0.1.3, commit265375a088cce50d2e5980ca557404fd01028efc, and Publish run30628187558/1. - Independent public-registry verification downloaded the workflow artifact
and registry tarball, proved byte identity and the integrity above, installed
cometapi@0.1.3in clean ESM and CommonJS consumers, and resolved one effectiveopenai@6.47.0installation while preserving the public class and official error-type boundary. - Final readback kept
mainat the release commit, passed default-branch CI 30628129332, restoredRELEASE_PLEASE_ENABLED=false, keptLIVE_SMOKE_ENABLED=true, and retained exactly one npm Environment deployment policy,tag:v*(policy ID55718965).
This release repeated the permanent immutable-tag path without recovery or cross-run evidence reuse and moved the protected live validation to the same model ID shown in the public examples.
Stable 0.1.2 completed on 2026-07-31 with these independently auditable
layers:
- Source PR #44 fixed
the structural TypeScript option bypass, made consumer documentation
release-neutral, and prepared the permanent release path without expanding
the supported resource surface. Final head
c0934cc804fb5c23f0ff38e463cdfb00784da159passed CI run 30600555979 and merged as1d62b52fc5ca2fc803c11fbc99cf9c5991c6c974. - Manual Release Please preparation
run 30600722163 attempt 1
ran from that exact merge on
main, loggedupdating from 0.1.1 to 0.1.2, and created only the action-authored release PR below. This is remote evidence that the repaired stable-patch configuration selected0.1.2, not0.2.0. - The resulting four-file release
PR #45 had final head
c335f7081b9e8bb7cce7060c85c53d08947423d1and changed only the manifest, changelog, package lock, and package manifest. After the human workflow gate, its complete blocking matrix passed in CI run 30600746212 attempt 2. Human repository administratortensornull, distinct from bot authorgithub-actions[bot], submitted formal review 4825214156 withstate=APPROVEDagainst that exact head before merge. The reviewed merge producede348f7800c6088e0349b67ce5927cd9ba50dde25. - Release Please run 30601626589 attempt 1
created the exact lightweight
v0.1.2tag and immutable non-prerelease GitHub Release ID362834814. The bot-authoredv0.1.2Release targets the reviewed merge commit and was published at2026-07-31T03:27:59Z. - The unprivileged
handoff run 30601651061 attempt 1
validated the Release Please result and immutable Release before dispatching
the exact tag. Tag-bound
Publish run 30601661643 attempt 1
rebuilt the release commit, passed the full release checks and public
declarations/fixtures, and uploaded artifact ID
8782147591, namednpm-package-0.1.2-30601661643-1, with ZIP digestsha256:59f840b182e2e7c74b237ba507ea725e76e60174ce817b8fc18d99c6631d0131. Its sole tarball has SHA-25688923983b62cbeaf37f7aacdea4d89b9b9a55b81ab8f0748cf1a8d0135c74d58and is byte-identical to the public registry tarball. - The same run's
live job 91065744397
checked out
refs/tags/v0.1.2and passed exactly three sequentialgpt-5.4requests with a 16-token output cap, 60-second per-request timeout, concurrency one, and stop-on-first-failure behavior. - Attempt 1's protected npm job
91065788380published through the tag-only npm Environment and GitHub Actions OIDC at2026-07-31T03:36:57.735Z. Publication succeeded, but the immediately following attestation fetch received the registry's transient404, so the job failed after npm mutation. After the attestations became readable, the sole authorized failed-job replay used npm job91069383430; it reportedcometapi@0.1.2 already matches the verified artifact; resuming checks.and completed without a secondnpm publish. GitHub preserved the successful exact-artifact job91069398975and bounded-live job91069383750from attempt 1. - At closeout, npm's stable channel resolved to
0.1.2, while the prerelease channel remained0.1.0-alpha.3. The package has SHA-12f3b1ec8c9149172fe52ac25b0a7658cdc102ed8and integritysha512-JmFFjOX9GBJqjp7I8XOrTvCHAxd8zYQjLKIX/CKE0wPQ+98HpzBXn4cuA/OUzRsW8/GtX2vfYBEsL588P1XWkw==.npm audit signaturespassed. npm exposes its publish attestation at Sigstore index 2298372367 and SLSA provenance at index 2298372342. The provenance bindscometapi@0.1.2torefs/tags/v0.1.2, commite348f7800c6088e0349b67ce5927cd9ba50dde25, and Publish run30601661643/1. - Clean public-registry verification installed
cometapi@0.1.2with one effectiveopenai@6.47.0installation and passed ESM, CommonJS,.mtsand.ctsdeclarations, supported mocked calls, officialAPIError instanceofidentity, integrity, registry signatures, and both attestations. - Post-publication hardening
PR #46 made the
observed failed-job convergence finite and fail-closed. Final head
05041c4080a57814a3d2e90122185951b9b84404passed PR CI 30607413580 and exact-head owner audit review 4825808534, recorded asstate=COMMENTED, merged asd02b87da330d4b71d194f5c3a6df727b20dc9df3, and passed default-branch CI 30607756481. Final state was read back asRELEASE_PLEASE_ENABLED=false,LIVE_SMOKE_ENABLED=true, and exactly one npm Environment deployment policy,tag:v*(policy ID55718965). Post-merge Release Please run 30607756491 and Publish handoff run 30607764192 were skipped as required.
This is the first completed end-to-end registry publication through the permanent immutable-tag handoff. The earlier one-time main-context recovery remains historical evidence only and is not a reusable release path.
Stable 0.1.1 completed on 2026-07-30 with these independently auditable
layers:
- The action-authored release pull request
#33 had final head
132d158c5bc4b83d582dd0a3c7677b05b46d471b. Its complete final-head matrix passed in CI run 30443300601 attempt 2 and the latest-compatible/manual matrix passed in run 30468358086. Human repository administratortensornull, distinct from bot authorgithub-actions[bot], submitted formal review 4810328062 withstate=APPROVEDagainst that exact head before merge. - The reviewed merge produced
c98b514227858cd183c781270a7f78f65b577e82. Release Please run 30469181724 attempt 1 created, rather than recovered, the exact lightweightv0.1.1tag and immutable non-prerelease GitHub Release ID361883325. Thev0.1.1Release is bot-authored, targets that merge commit, and was published at2026-07-29T16:07:15Z. - The initial
Publish run 30469240186
failed before packing, live smoke, OIDC, or npm mutation. Its downloaded
release-please-result/result.jsonwas inside the workspace scanned bynpm run format:check, and Prettier correctly returned non-zero for that runtime JSON file. - Run 30471665743 attempt 1
then completed all offline and exact-artifact checks. Its
live job 90643725110
checked out the exact release commit and passed three sequential
gpt-5.4requests with a 16-token output cap, 60-second per-request timeout, concurrency one, and stop-on-first-failure behavior. The npm job received no runner and no OIDC token: GitHub's check annotation states that branchmainwas not allowed by the tag-only npm Environment policy. - That failed run retained artifact ID
8731956162, namednpm-package-0.1.1-30471665743-1, with ZIP digestsha256:567b00f1ec32168d5c5be7d0b553542441920d3bb401959bcc2d6e157f35d08b. It contains onlycometapi-0.1.1.tgz; the tarball has SHA-2563c926a2b15be99fbba92e1e100c2ee254ff866da27496a5c31824c542cccbf91. Artifact metadata names recovery-control head22c313d4f80c53ba01672dd35cc27b621d5ec9ce, while Actions logs prove that packaging and live validation checked out release commitc98b514227858cd183c781270a7f78f65b577e82. - The authorized one-time control
PR #40 merged as
37b811c54773295487aa4200f349ec3edd30d729. Publish run 30533520823 attempt 1 revalidated and published the exact retained artifact while reusing the already successful bounded-live evidence rather than spending another live request budget. Its npm job 90841672147 used GitHub Actions OIDC and completed the public-registry gates. - At the stable
0.1.1closeout on 2026-07-30, npm had assigned0.1.1to the stable channel and0.1.0-alpha.3to the prerelease channel. The registry tarball was byte-identical to the source artifact and had SHA-100edad522c9ffaf937facbe5a35ef211869551c1and integritysha512-uYo573XD+ITsa8F4GbYLAlXMrj9SA1Qc4KBgvoRbnwwTvfX+Ye8QVo7xgSNOl9AoYpoglQCW8lEo9cvjwan+7Q==.npm audit signaturespassed. npm exposes both its publish attestation (Sigstore index 2289305373) and SLSA provenance (index 2289305033). The provenance bindscometapi@0.1.1torefs/heads/main, control commit37b811c54773295487aa4200f349ec3edd30d729, and Publish run30533520823/1; it does not claim tag-bound publication. - A separate clean public-registry installation on Node.js
24.18.1passed ESM, CommonJS,.mtsand.ctsdeclarations, all three supported mocked operations including streaming and errors, one effective OpenAI installation, officialAPIError instanceofidentity, integrity, signature, and both attestations. - Cleanup PR #41
removed every one-time recovery input, fixed evidence identifier,
prior-artifact/live reuse branch, and temporary
mainpolicy path. Its final headc5566246abce065a39f1f66ed2b6e2d4bc89e62fpassed PR CI 30538011343, merged asc319503684b371ad4a4f1ce78a156978de86072e, and passed default-branch CI 30538123153. Post-release state was read back asRELEASE_PLEASE_ENABLED=false,LIVE_SMOKE_ENABLED=true, and exactly one npm deployment policy,tag:v*(policy ID55718965).
The permanent immutable-tag handoff later completed its first end-to-end
registry publication in the stable 0.1.2 evidence above. The 0.1.1
publication remains evidence only for the disclosed main-context exception and
does not authorize that path again.
Stable 0.1.0 completed on 2026-07-28 with these independently auditable
layers:
- The maintainer-edited release pull request #28
had required pull-request CI in run 30344166767
and the manually dispatched latest-compatible OpenAI 6.x lane in
run 30344290818
on final head
34f8dd342b56f82baa1d5a98807d715fe0bd60bf. GitHub records no formalAPPROVEDreview object; maintainer review is evidenced by the focused candidate edits, merge, Release publication, and protected npm-environment approval. - The protected merge produced
1752cbb57f11dc6dca8dd1b13f0f8d5e8b5fdfca; its tree matched the reviewed final head, and default-branch Node.js 22 and 24 CI passed in run 30345116325. - The immutable
v0.1.0release targets that exact merge commit withprerelease=false. Its publish run 30345735681 rebuilt and verified one exact artifact, executed the bounded three-request release-tag live smoke with a 16-output-token cap, 60-second per-request timeout, concurrency one, and stop on first failure, then published through the protectednpmenvironment and GitHub Actions OIDC. - At the
0.1.0closeout, npm'slatestdist-tag resolved to0.1.0, whilenextremained on0.1.0-alpha.3. The registry artifact has SHA-1e509196ac5618d5b073207c74c7cdc5204efbe37and SHA-512 integritysha512-B7vyPXZkoZRM2JjFMQZthumUHgHWZLcPlQt8SG5oopPL2JGU0LR1iBOjtox4Mos+gZmA1Bs2q6vLPX2loHyfuw==. - npm reports SLSA provenance v1 and a registry signature. The provenance binds
cometapi@0.1.0torefs/tags/v0.1.0, the publishing workflow, run30345735681, and the exact release commit. The Sigstore transparency-log index is2269554513, and the npm publish-attestation index is2269555365. - Separate post-publication registry verification downloaded the workflow
artifact and npm tarball and found them byte-for-byte identical. Registry
signature and attestation verification passed. The registry tarball then
passed the ESM, CommonJS, and compatible-OpenAI host fixtures; the host
resolved one effective
openai@6.47.0installation and preserved official error identities. - A closeout
npm auditof the locked development checkout reported six development-tooling findings: five high through ESLint/minimatch/brace-expansion and one low in esbuild.npm audit --omit=devreported zero production vulnerabilities; these findings do not affect the published production dependency graph and remain deferred dependency-maintenance work. - The immutable npm
0.1.0tarball retains its candidate-era README. The post-release documentation status recorded here and on the default branch can first appear inside a later package artifact; no published tarball was rewritten. - The post-merge Release Please
run 30345116433
failed after updating its unreviewed temporary branch to
3f0949e5c0ccd0923d10595437f7a315f013af7c, a generated0.2.0draft, but before creating a pull request. It did not modifymain, create a tag, or publish a package.RELEASE_PLEASE_ENABLEDwas set tofalsebefore the closeout push. During the authorized 0.1.1 repair, the branch was revalidated as failure-only evidence with no associated PR or independent work, deleted, and then recreated by Release Please for the normal action-owned 0.1.1 PR.
Every release candidate records these evidence layers separately:
- Completed local checks and their exact commands
- Failed checks and implementation defects
- Skipped or unavailable checks
- Unmet release prerequisites
- Real GitHub Actions evidence
- Trusted live API evidence
- npm ownership and Trusted Publisher evidence
- Tag, release, provenance, publication, and post-publication evidence
For a pre-visibility closeout, use the merged private pull request as the
durable evidence record because a commit cannot contain its own final object
ID. After merge, add one timeline comment that records the exact final main
commit, the complete local gate results for that commit, pull-request and
default-branch Node.js 22/24 CI URLs, failed dependency-update dispositions,
the read-only private/public-only configuration audit, and every skipped or
unknown boundary. The comment must explicitly confirm that no visibility,
repository-rule, environment, secret, live API, tag, release, or registry state
was changed.
Only a publicly installed and verified npm artifact may be called released.