# Release Operations

This is the release operator entrypoint. It explains what to run and where to
find the record; it is not a ledger of every historical release decision.

## Read This First

- [Release checklist](release-checklist.md) is the procedural checklist.
- [GitHub Actions release automation](github-actions-release-automation.md)
  describes the protected release workflow.
- [npm trusted publishing runbook](npm-trusted-publishing-runbook.md) covers
  the npm publisher environment and approval boundary.
- [Versioned release docs](../../releases/README.md) and the
  [package/version index](../../releases/package-index.md) hold durable version
  facts.
- [Release operations history](history.md) retains old readiness decisions,
  beta evidence, and the full release-note index without making them current.

## Live Release State

The package version in this checkout is a source input. npm dist-tags and
GitHub Releases can change only later in the governed lifecycle, so
package-visible current docs do not freeze a live channel snapshot.

- Read [live npm versions and dist-tags](https://www.npmjs.com/package/persona-harness?activeTab=versions).
- Read [live GitHub Releases](https://github.com/jyt6640/persona-harness/releases).
- Read immutable historical version facts in the
  [package/version index](../../releases/package-index.md).

Those sources are not a standing authorization to publish, promote a channel,
consume Finish authority, or create a release. Before a release decision, read
the live registry and the protected workflow state again.

## Current Workflow Lifecycle Boundary

The current workflow/closure/finish state contract is
[`../workflow-closure-state-machine-design.md`](../workflow-closure-state-machine-design.md).
`workflow-lifecycle.1` is a read-only, fail-closed workflow projection; it is
not a release state, approval, or producer record. A blocked or trusted
`finishAuthority` value does not claim producer success, signature
verification, registry publication, tag movement, GitHub release creation, or
release completion.

Only records selected by [`../README.md`](../README.md) or
[`../canonical-docs-index.md`](../canonical-docs-index.md) are current inputs.
Historical readiness files are context, not current release decisions.

## Release Messaging Guardrail

Describe Persona Harness as an AI coding workflow rail and completion-evidence
harness. Do not turn a release, an evidence count, or a smoke run into a claim
of generated-app quality, broad reliability, token saving, or autonomous
completion. Record the sample, operator, environment, and unmeasured limits
when evidence needs interpretation.

## Release Tags Are Immutable

`refs/tags/v*` is covered by the `Release tags are immutable` ruleset with no
bypass actors. It blocks all three tag mutations:

| Rule | Effect |
| --- | --- |
| `deletion` | A release tag cannot be deleted. |
| `update` | A release tag cannot be repointed. |
| `non_fast_forward` | A release tag cannot be rewound. |

Tag creation remains open for a new release. `update` is essential:
`non_fast_forward` alone only blocks a rewind, so moving an old tag forward can
otherwise succeed. The 2026-08-09 probe restored `v0.8.0-beta.8` to
`c13caf30f058c4112101ec3ac093c114463aa74b` before adding `update`.

To remove or repoint a tag deliberately, disable the ruleset, perform the
operation, and re-enable it. There is no bypass path.

## Release Order

Run `release.yml` before `publish.yml`. The release workflow's source
verification includes `npm publish --dry-run`; after a version exists on npm,
that verification can no longer prepare the GitHub release for the same
version.

For a general-availability release:

1. Tag the approved protected-main commit.
2. Dispatch `release.yml` with the tag and `approval_scope: ga-approved`.
3. Dispatch `publish.yml` with the tag, `dist_tag: latest`, and
   `approval_scope: ga-approved`.

If the order was reversed, use `checkReleaseState` in
`scripts/release-workflow-policy.mjs` to verify the recovered release state.
