diff --git a/.github/workflows/v1-post-release-metadata-sync.yml b/.github/workflows/v1-post-release-metadata-sync.yml new file mode 100644 index 00000000..fd3f2cc3 --- /dev/null +++ b/.github/workflows/v1-post-release-metadata-sync.yml @@ -0,0 +1,68 @@ +name: V1 Post-Release Metadata Sync + +on: + pull_request: + branches: [main] + paths: + - 'docs/releases/v1.0.0.md' + - '.github/workflows/v1-post-release-metadata-sync.yml' + push: + branches: [main] + paths: + - 'docs/releases/v1.0.0.md' + - '.github/workflows/v1-post-release-metadata-sync.yml' + workflow_dispatch: + +permissions: + contents: read + +jobs: + validate: + name: Validate published v1 metadata source + runs-on: ubuntu-24.04 + timeout-minutes: 10 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Validate repository release record and live stable release + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + set -euo pipefail + grep -F 'PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED' docs/releases/v1.0.0.md + grep -F 'Independent external validation is not claimed' docs/releases/v1.0.0.md + grep -F '37771109825' docs/releases/v1.0.0.md + grep -F '37771295572' docs/releases/v1.0.0.md + gh release view v1.0.0 --repo "$GITHUB_REPOSITORY" \ + --json tagName,isDraft,isPrerelease \ + --jq 'select(.tagName == "v1.0.0" and .isDraft == false and .isPrerelease == false)' >/dev/null + + sync: + name: Synchronize GitHub Release body + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: validate + runs-on: ubuntu-24.04 + timeout-minutes: 10 + permissions: + contents: write + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Replace release body without changing tag or maturity + env: + GH_TOKEN: ${{ github.token }} + shell: bash + run: | + set -euo pipefail + before="$(gh release view v1.0.0 --repo "$GITHUB_REPOSITORY" --json tagName,isDraft,isPrerelease)" + python3 -c 'import json,sys; d=json.loads(sys.argv[1]); assert d["tagName"]=="v1.0.0"; assert d["isDraft"] is False; assert d["isPrerelease"] is False' "$before" + + gh release edit v1.0.0 \ + --repo "$GITHUB_REPOSITORY" \ + --notes-file docs/releases/v1.0.0.md + + after="$(gh release view v1.0.0 --repo "$GITHUB_REPOSITORY" --json tagName,isDraft,isPrerelease,body)" + python3 -c 'import json,sys; d=json.loads(sys.argv[1]); assert d["tagName"]=="v1.0.0"; assert d["isDraft"] is False; assert d["isPrerelease"] is False; assert "PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED" in d["body"]; assert "PUBLICATION PENDING" not in d["body"]' "$after" diff --git a/.github/workflows/v1-r1-release-control-plane.yml b/.github/workflows/v1-r1-release-control-plane.yml index b94853bb..5427475c 100644 --- a/.github/workflows/v1-r1-release-control-plane.yml +++ b/.github/workflows/v1-r1-release-control-plane.yml @@ -28,7 +28,7 @@ jobs: run: cargo test --locked -p execsurface --test v1_release_control_plane -- --test-threads=1 --nocapture synthetic-v1-dry-contract: - name: Synthetic stable-v1 classification / no publication + name: Published stable-v1 contract / classifier regression runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -36,7 +36,7 @@ jobs: with: persist-credentials: false - - name: Active request is frozen RC or explicitly authorized stable v1 + - name: Active request and records identify the published stable v1 state shell: bash run: | set -euo pipefail @@ -45,26 +45,18 @@ jobs: from pathlib import Path data=json.load(open(".release/release-request.json")) - rc_unarmed = data == { - "version":"0.1.0-alpha.6", - "tag":"v0.1.0-alpha.6", - "stable_channel":"v0.1", - "request_revision":1, - } - release_armed = data == { + assert data == { "version":"1.0.0", "tag":"v1.0.0", "stable_channel":"v1", "request_revision":2, } - if release_armed: - decision=Path("docs/release/V1_0_0_RELEASE_DECISION.md").read_text() - notes=Path("docs/releases/v1.0.0.md").read_text() - assert "RELEASE_V1_0_AUTHORIZED_BOUNDED" in decision - assert "PUBLICATION PENDING" in notes - - assert rc_unarmed or release_armed + decision=Path("docs/release/V1_0_0_RELEASE_DECISION.md").read_text() + notes=Path("docs/releases/v1.0.0.md").read_text() + assert "RELEASE_V1_0_AUTHORIZED_BOUNDED" in decision + assert "PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED" in notes + assert "Independent external validation is not claimed" in notes PY - name: Classify current Alpha line @@ -98,7 +90,7 @@ jobs: fi no-v1-side-effects: - name: No v1 tag/channel side effect during V1-R1 + name: Published v1 tag/channel source identity runs-on: ubuntu-24.04 timeout-minutes: 10 steps: @@ -106,9 +98,13 @@ jobs: with: fetch-depth: 0 persist-credentials: false - - name: Prove V1-R1 did not publish v1 refs + - name: Prove published moving and immutable refs resolve to one source shell: bash run: | set -euo pipefail - test -z "$(git ls-remote --tags origin refs/tags/v1)" - test -z "$(git ls-remote --tags origin refs/tags/v1.0.0)" + git fetch --force --tags origin + stable_sha="$(git rev-parse 'v1^{commit}')" + immutable_sha="$(git rev-parse 'v1.0.0^{commit}')" + test "$stable_sha" = "$immutable_sha" + git merge-base --is-ancestor "$immutable_sha" HEAD + test "$(git show v1.0.0:action/release-tag.txt | tr -d '[:space:]')" = "v1.0.0" diff --git a/.github/workflows/v1-rc1-internal-qualification.yml b/.github/workflows/v1-rc1-internal-qualification.yml index f8f577ea..53f760a1 100644 --- a/.github/workflows/v1-rc1-internal-qualification.yml +++ b/.github/workflows/v1-rc1-internal-qualification.yml @@ -38,7 +38,7 @@ jobs: fetch-depth: 0 persist-credentials: false - - name: Prove v1 release state is frozen or explicitly authorized + - name: Prove published v1 release state is exact and bounded shell: bash run: | set -euo pipefail @@ -50,35 +50,35 @@ jobs: from pathlib import Path request=json.load(open(".release/release-request.json")) - rc_unarmed = request == { - "version":"0.1.0-alpha.6", - "tag":"v0.1.0-alpha.6", - "stable_channel":"v0.1", - "request_revision":1, - } - release_armed = request == { + assert request == { "version":"1.0.0", "tag":"v1.0.0", "stable_channel":"v1", "request_revision":2, } - if release_armed: - decision=Path("docs/release/V1_0_0_RELEASE_DECISION.md").read_text() - notes=Path("docs/releases/v1.0.0.md").read_text() - assert "RELEASE_V1_0_AUTHORIZED_BOUNDED" in decision - assert "PUBLICATION PENDING" in notes + decision=Path("docs/release/V1_0_0_RELEASE_DECISION.md").read_text() + notes=Path("docs/releases/v1.0.0.md").read_text() + readme=Path("README.md").read_text() + status=Path("docs/STATUS.md").read_text() - assert rc_unarmed or release_armed + assert "RELEASE_V1_0_AUTHORIZED_BOUNDED" in decision + assert "PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED" in notes + assert "Current stable release" in readme and "v1.0.0" in readme + assert "Public release: `v1.0.0`" in status + assert "Independent external validation is not claimed" in notes PY - grep -F 'v0.1.0-alpha.6' README.md >/dev/null - grep -F 'v0.1.0-alpha.6' docs/STATUS.md >/dev/null - - name: Prove qualification has not created public v1 refs + - name: Prove published v1 channel and immutable tag resolve to one release source shell: bash run: | set -euo pipefail - test -z "$(git ls-remote --tags origin refs/tags/v1 refs/tags/v1.0.0)" + git fetch --force --tags origin + stable_sha="$(git rev-parse 'v1^{commit}')" + immutable_sha="$(git rev-parse 'v1.0.0^{commit}')" + test "$stable_sha" = "$immutable_sha" + git merge-base --is-ancestor "$immutable_sha" HEAD + test "$(git show v1.0.0:action/release-tag.txt | tr -d '[:space:]')" = "v1.0.0" - name: Attack RC identity, generated channel and registry chain run: cargo test --locked -p execsurface --test v1_internal_rc1 -- --test-threads=1 --nocapture @@ -296,6 +296,7 @@ jobs: steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: + fetch-depth: 0 persist-credentials: false - name: Re-read repository rulesets and classify admin state env: @@ -311,13 +312,14 @@ jobs: printf '\n' >> "$evidence" done - if python3 .github/scripts/verify_tag_ruleset.py --rulesets-jsonl "$evidence" --tag v1.0.0; then - echo "IQ6_GOVERNANCE_READY" - else - echo "IQ6_ADMIN_PENDING" - fi + python3 .github/scripts/verify_tag_ruleset.py --rulesets-jsonl "$evidence" --tag v1.0.0 + echo "IQ6_GOVERNANCE_READY" - test -z "$(git ls-remote --tags origin refs/tags/v1 refs/tags/v1.0.0)" + git fetch --force --tags origin + stable_sha="$(git rev-parse 'v1^{commit}')" + immutable_sha="$(git rev-parse 'v1.0.0^{commit}')" + test "$stable_sha" = "$immutable_sha" + git merge-base --is-ancestor "$immutable_sha" HEAD iq8-destruction-round-b: @@ -340,11 +342,15 @@ jobs: - name: Execute release-lifecycle destruction corpus run: cargo test --locked -p execsurface --test v1_internal_destruction_b -- --test-threads=1 --nocapture - - name: Re-prove no v1 public refs exist + - name: Re-prove published v1 refs remain source-identical shell: bash run: | set -euo pipefail - test -z "$(git ls-remote --tags origin refs/tags/v1 refs/tags/v1.0.0)" + git fetch --force --tags origin + stable_sha="$(git rev-parse 'v1^{commit}')" + immutable_sha="$(git rev-parse 'v1.0.0^{commit}')" + test "$stable_sha" = "$immutable_sha" + git merge-base --is-ancestor "$immutable_sha" HEAD - name: Build candidate for cross-version custody attack shell: bash diff --git a/.github/workflows/v1-release-arming.yml b/.github/workflows/v1-release-arming.yml index 0b5f7619..8e288313 100644 --- a/.github/workflows/v1-release-arming.yml +++ b/.github/workflows/v1-release-arming.yml @@ -40,28 +40,33 @@ jobs: printf '%s\n' "$out" python3 -c 'import json,sys; d=json.load(sys.stdin); assert d["version"]=="1.0.0"; assert d["tag"]=="v1.0.0"; assert d["stable_channel"]=="v1"; assert d["release_kind"]=="stable"; assert d["is_prerelease"] is False; assert d["request_revision"]==2' <<<"$out" - - name: Prove release records are prepared but public status is not pre-announced + - name: Prove published stable-v1 records and public status shell: bash run: | set -euo pipefail test -s docs/releases/v1.0.0.md test -s docs/release/V1_0_0_RELEASE_DECISION.md grep -F 'RELEASE_V1_0_AUTHORIZED_BOUNDED' docs/release/V1_0_0_RELEASE_DECISION.md + grep -F 'PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED' docs/releases/v1.0.0.md grep -F 'Independent external validation is not claimed' docs/releases/v1.0.0.md - grep -F 'v0.1.0-alpha.6' README.md - grep -F 'Public release: `v0.1.0-alpha.6`' docs/STATUS.md + grep -F 'Current stable release' README.md + grep -F 'v1.0.0' README.md + grep -F 'Public release: `v1.0.0`' docs/STATUS.md - - name: Prove stable refs and release do not exist before arming merge + - name: Prove stable refs and GitHub Release exist with stable maturity env: GH_TOKEN: ${{ github.token }} shell: bash run: | set -euo pipefail - test -z "$(git ls-remote --tags origin refs/tags/v1 refs/tags/v1.0.0)" - if gh release view v1.0.0 --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then - echo "::error::v1.0.0 GitHub Release already exists before arming merge" - exit 1 - fi + git fetch --force --tags origin + stable_sha="$(git rev-parse 'v1^{commit}')" + immutable_sha="$(git rev-parse 'v1.0.0^{commit}')" + test "$stable_sha" = "$immutable_sha" + git merge-base --is-ancestor "$immutable_sha" HEAD + gh release view v1.0.0 --repo "$GITHUB_REPOSITORY" \ + --json tagName,isDraft,isPrerelease \ + --jq 'select(.tagName == "v1.0.0" and .isDraft == false and .isPrerelease == false)' >/dev/null immutable-tag-governance: name: Immutable v1 tag governance diff --git a/CHANGELOG.md b/CHANGELOG.md index 24bb1693..e36a9554 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,29 @@ All notable public-product changes are recorded here. The detailed pre-Alpha.5 e ## Unreleased -- No unreleased public-product changes after Alpha.6 release preparation. +- No unreleased public-product changes after the v1.0.0 stable release. + +## v1.0.0 — 2026-10-08 + +### Stable contract + +- Published the first stable ExecSurface release for the documented Linux x86_64 + native ptrace boundary. +- Froze PASS=0, ERROR=2, REVIEW=10, BLOCK=20 semantics and retained fail-closed incomplete-evidence behavior. +- Froze the target-outcome separation: ExecSurface PASS does not prove the wrapped target command succeeded. +- Preserved Alpha.6 profile-4 upgrade/rollback compatibility and explicit Alpha.5 profile-3 incompatibility. +- Preserved policy schemas v1/v2 and opt-in v3 matcher semantics. + +### Release and distribution + +- Published stable GitHub Release `v1.0.0` with checksum and GitHub provenance attestation. +- Promoted stable Action channel `AETHERXGLOBAL/execsurface@v1` only after immutable artifact and Action consumer proofs. +- Published the full crates.io dependency chain and proved exact zero-contact installation of `execsurface = 1.0.0`. +- Protected immutable `v1.*` release tags against update/deletion with no bypass actors. + +Release workflow: `37771109825`. +Registry publication workflow: `37771295572`. + +Independent external validation is not claimed. ## v0.1.0-alpha.6 — 2026-10-08 diff --git a/README.md b/README.md index aaadd5bd..e5587d3d 100644 --- a/README.md +++ b/README.md @@ -9,18 +9,18 @@ Release License Apache-2.0 Linux x86_64 - Current Supported Alpha + Stable v1.0

ExecSurface learns an accepted **runtime execution surface**, runs the same command later, and reports execution behavior that appeared, disappeared, or changed. It is intended for CI pipelines, dependencies, developer tools and AI-assisted workflows where source review alone does not show every runtime effect. -> **Current Supported Alpha:** **v0.1.0-alpha.6** is the supported finished Alpha release for the documented Linux x86_64 + native `ptrace` product boundary. +> **Current stable release:** **v1.0.0** is the supported stable release for the documented Linux x86_64 + native `ptrace` product boundary. > > **Self-service:** no signup, API key, meeting, or AETHER X approval is required. > -> **Important Alpha.6 boundary:** an ExecSurface PASS is a drift-verdict PASS, not proof that the wrapped target command itself exited successfully. See [What a result means](#what-a-result-means) and [Current Status](docs/STATUS.md). +> **Important stable-v1 boundary:** an ExecSurface PASS is a drift-verdict PASS, not proof that the wrapped target command itself exited successfully. See [What a result means](#what-a-result-means) and [Current Status](docs/STATUS.md). ## Why developers use it @@ -59,7 +59,7 @@ Choose the path that matches your environment. Download the published release, verify its checksum, and install it in your user path: ```bash -VERSION=v0.1.0-alpha.6 +VERSION=v1.0.0 TARGET=x86_64-unknown-linux-gnu ASSET="execsurface-${VERSION}-${TARGET}.tar.gz" @@ -81,12 +81,12 @@ Then run the controlled **PASS → REVIEW** walkthrough in **[Five-Minute Start] ### B. Rust already installed ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version execsurface doctor ``` -The current supported Alpha release is still a SemVer prerelease, so request the exact prerelease version explicitly. The crates.io channel is published only after the immutable GitHub release and stable Action gates succeed. See [crates.io Publishing](docs/CRATES_IO_PUBLISHING.md). +The current stable release is `v1.0.0`. Exact-version installation remains recommended for reproducible evaluation. See [crates.io Publishing](docs/CRATES_IO_PUBLISHING.md). ### C. Add it to a GitHub Actions project @@ -98,15 +98,15 @@ execsurface init --command "cargo test --locked" --github-actions `init` creates a starter policy and workflow. It **does not run your target command** and does not create a baseline automatically. -The generated workflow uses the current supported Alpha Action channel: +The generated workflow uses the stable v1 Action channel: ```text -AETHERXGLOBAL/execsurface@v0.1 +AETHERXGLOBAL/execsurface@v1 ``` Do not use `@main` as the normal consumer path. See the **[GitHub Action guide](docs/GITHUB_ACTION.md)**. -If the wrapped command's own success matters—for example `cargo test`, `pytest` or a build—keep that command as its own CI gate as well. In Alpha.6, target exit/signal is report metadata and does not by itself change the ExecSurface drift verdict. +If the wrapped command's own success matters—for example `cargo test`, `pytest` or a build—keep that command as its own CI gate as well. In v1.0, target exit/signal remains report metadata and does not by itself change the ExecSurface drift verdict. ## First real project @@ -132,7 +132,7 @@ If `doctor` fails, follow the action it prints and see **[Troubleshooting](docs/ | REVIEW | 10 | one or more findings require review | | BLOCK | 20 | one or more findings matched blocking policy | -**Alpha.6 target-outcome boundary:** these exit codes are ExecSurface verdict codes. The wrapped target command's native exit code or terminating signal is retained in the structured report but is **not verdict-bearing in Alpha.6**. Therefore `ExecSurface: PASS` does not mean the wrapped target command succeeded. A nonzero or signalled target can still receive PASS when there is no policy-relevant execution-surface finding. Keep the target command's own success/failure gate when correctness of that command matters. This immutable Alpha.6 limitation is tracked in **[Issue #143](https://github.com/AETHERXGLOBAL/execsurface/issues/143)**. +**Stable v1 target-outcome boundary:** these exit codes are ExecSurface verdict codes. The wrapped target command's native exit code or terminating signal is retained in the structured report but is **not verdict-bearing in v1.0.0**. Therefore `ExecSurface: PASS` does not mean the wrapped target command succeeded. A nonzero or signalled target can still receive PASS when there is no policy-relevant execution-surface finding. Keep the target command's own success/failure gate when correctness of that command matters. This contract was explicitly frozen before v1 release. ExecSurface does **not** infer that drift is malicious. It reports observed drift and evaluates the explicit policy you selected. @@ -170,11 +170,11 @@ The baseline answers what canonical execution surface was accepted. The policy a ## Qualification and independent evaluation -Alpha.6 has completed the repository's bounded Final Supported Alpha qualification for Linux x86_64 + native `ptrace`. The qualification exercised the exact published artifact, Ubuntu 22.04/24.04, Debian 12/Fedora 42 userlands, repeated PASS/REVIEW stress, fail-closed corruption cases, immutable-source adversarial replay, crates.io and the stable Action. See **[Current Status](docs/STATUS.md)** for exact run IDs and limitations. +ExecSurface v1.0.0 completed the repository's strengthened internal stable-release qualification for the documented Linux x86_64 + native `ptrace` boundary. The release chain proved exact source/tag identity, checksum and provenance, zero-contact public binary consumption, immutable-tag installation, stable `@v1` PASS/REVIEW/BLOCK/ERROR behavior, and exact crates.io installation. Independent external validation is not claimed. See **[Current Status](docs/STATUS.md)** for exact run IDs and limitations. Independent external validation remains open as additional evidence rather than a blocker to this bounded supported-Alpha state. Use [Self-Service Start](docs/SELF_SERVICE_START.md), [Five-Minute Start](docs/QUICKSTART_5_MIN.md), [Independent Evaluation](docs/INDEPENDENT_EVALUATION.md), and [Technical Evaluation Pack](docs/TECHNICAL_EVALUATION.md). -Public findings can be reported through **[Issue #118 — Alpha.6 Independent External Validation & Post-Release Review](https://github.com/AETHERXGLOBAL/execsurface/issues/118)**. Negative, partial, unsupported-environment, usability and performance-problem results are welcome. Internal qualification is not evidence of independent adoption or external validation. +External findings remain welcome through **[Issue #118 — Independent External Validation & Post-Release Review](https://github.com/AETHERXGLOBAL/execsurface/issues/118)**. Negative, partial, unsupported-environment, usability and performance-problem results are welcome. Internal qualification is not evidence of independent adoption or external validation. ## Selected external technical engagement @@ -195,10 +195,10 @@ For the company-level evidence summary, see the **[AETHER X GLOBAL organization The supported Alpha distribution surfaces are: - checksum-verified GitHub Release binary for Linux x86_64; -- exact prerelease install `cargo install execsurface --version "=0.1.0-alpha.6" --locked` for Rust users; -- GitHub Action `AETHERXGLOBAL/execsurface@v0.1` after stable-channel promotion. +- exact stable install `cargo install execsurface --version "=1.0.0" --locked` for Rust users; +- GitHub Action `AETHERXGLOBAL/execsurface@v1` after stable-channel promotion. -For maximum Action pinning, use `AETHERXGLOBAL/execsurface@v0.1.0-alpha.6`. +For maximum Action pinning, use `AETHERXGLOBAL/execsurface@v1.0.0`. Optional GitHub build provenance verification: @@ -220,7 +220,8 @@ Key documents: - [Troubleshooting](docs/TROUBLESHOOTING.md) - [Independent Evaluation](docs/INDEPENDENT_EVALUATION.md) - [Technical Evaluation Pack](docs/TECHNICAL_EVALUATION.md) -- [Alpha.6 release record](docs/releases/v0.1.0-alpha.6.md) +- [v1.0.0 stable release record](docs/releases/v1.0.0.md) +- [Alpha.6 historical release record](docs/releases/v0.1.0-alpha.6.md) - [Alpha.5 historical release record](docs/releases/v0.1.0-alpha.5.md) - [Roadmap](ROADMAP.md) - [Contributing](CONTRIBUTING.md) diff --git a/ROADMAP.md b/ROADMAP.md index 79959599..0ee1c332 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ This file describes the **current forward roadmap**. The detailed M0–M9 historical roadmap is preserved unchanged at `docs/archive/ROADMAP_PRE_ALPHA5.md`. -Current public state: `v0.1.0-alpha.6` is released for Linux x86_64, with native `ptrace` as the bounded public reference observer. See `docs/STATUS.md` for the authoritative current release state. +Current public state: stable `v1.0.0` is released for the documented Linux x86_64 boundary, with native `ptrace` as the bounded public reference observer. See `docs/STATUS.md` for the authoritative current release state. ## Operating principles @@ -18,21 +18,21 @@ ExecSurface advances only through evidence-preserving changes: ## P9 — Production readiness & v1.0 qualification -**OPEN / ACTIVE** +**CLOSED — `RELEASE_V1_0`** -The production-readiness program is tracked in issue `#129`, the frozen qualification contract is `docs/PRODUCTION_READINESS.md`, the current Alpha.6 gap analysis is `docs/development/V1_PRODUCTION_READINESS_GAP_ANALYSIS.md`, the frozen v1 stable contract is `docs/COMPATIBILITY.md`, and the stable support/deprecation policy is `docs/SUPPORT_POLICY.md`. The current release-governance amendment is `docs/development/V1_INTERNAL_QUALIFICATION_GOVERNANCE.md`. +The production-readiness program is tracked in issue `#129`, the frozen qualification contract is `docs/PRODUCTION_READINESS.md`, the retained Alpha.6-to-v1 gap analysis is `docs/development/V1_PRODUCTION_READINESS_GAP_ANALYSIS.md`, the frozen v1 stable contract is `docs/COMPATIBILITY.md`, and the stable support/deprecation policy is `docs/SUPPORT_POLICY.md`. The current release-governance amendment is `docs/development/V1_INTERNAL_QUALIFICATION_GOVERNANCE.md`. -The program does not authorize a stable-release claim from internal CI alone. Production qualification requires independent external evidence, a stable compatibility contract, public-consumer reliability, repository/supply-chain controls, real-workload evidence, and an evidence-qualified release candidate. +The program closed with stable `v1.0.0` after the strengthened internal IQ0-IQ9 qualification, release-control, artifact, rollback, productization and registry gates. Independent external validation was not required as a release blocker under the explicit governance amendment and is not claimed. P8 remains the authority for classifying any genuine external evidence. Under the explicit 2026-10-08 governance amendment, P9.1/P9.5 external evidence is no longer a mandatory v1 release blocker; it remains a disclosed evidence limitation and must never be relabeled as internally supplied validation. Repository-administration controls that cannot be applied through the connected automation remain explicit blockers rather than being treated as complete by documentation. -V1-R0 stable-contract freeze is now the active internal maturity boundary: do not add v1 features merely for breadth. The next internal engineering gate after R0 is V1-R1 release-control-plane hardening, while external Alpha.6 execution/use evidence proceeds independently. +V1-R0/V1-R1 and RC1 qualification are closed for v1.0.0. Post-v1 work must preserve the frozen stable contract and open new evidence-gated programs rather than retroactively widening v1 claims. ## R1 — Post-release independent validation **OPEN / ACTIVE** -Obtain independent reproduction, criticism, counterexamples, interoperability findings and real-workload evidence against the current supported public release. Historical Alpha.5 evidence remains retained; current v1-readiness execution/use evidence should target Alpha.6 unless a protocol explicitly freezes another source. +Obtain independent reproduction, criticism, counterexamples, interoperability findings and real-workload evidence against the current supported public release `v1.0.0`. Historical Alpha.6/Alpha.5 evidence remains retained unless a protocol explicitly freezes another source. Tracking: issues `#114` and `#118`. @@ -46,7 +46,7 @@ Maintain a small durable operational CI surface that continuously proves: - source formatting, linting, tests and lockfile integrity; - public GitHub Release installation and checksum verification; -- stable `AETHERXGLOBAL/execsurface@v0.1` behavior; +- stable `AETHERXGLOBAL/execsurface@v1` behavior; - exact registry installation of the current public release; - bounded ptrace lifecycle and adversarial regressions; - PASS / REVIEW / BLOCK / ERROR behavior without silent semantic relaxation. @@ -73,13 +73,13 @@ No general backend-equivalence claim is authorized. **NOT YET CLAIMED** -Linux x86_64 remains the public support boundary for Alpha.6. ARM64 or additional operating-system support may be reconsidered only after independent, reproducible platform evidence closes the relevant compatibility and semantic gates. +Linux x86_64 remains the public support boundary for stable v1.0.0. ARM64 or additional operating-system support may be reconsidered only after independent, reproducible platform evidence closes the relevant compatibility and semantic gates. Historical ARM64 negative evidence remains retained and must not be reinterpreted as support. ## R6 — Release discipline -Future public releases should preserve the Alpha.6 release standard or strengthen it: +Future public releases should preserve the v1.0.0 release standard or strengthen it: 1. freeze the exact release source; 2. run full source and adversarial gates; @@ -87,7 +87,7 @@ Future public releases should preserve the Alpha.6 release standard or strengthe 4. bind checksums and provenance to the exact artifact; 5. publish an immutable version tag/release; 6. consume the public artifact as a fresh user on supported environments; -7. move the stable `v0.1` channel only after public-artifact proofs pass; +7. move the stable `v1` channel only after public-artifact proofs pass; 8. prove registry installation after publication; 9. retain every failed attempt and material negative result. diff --git a/crates/execsurface-cli/tests/alpha6_productization_gate.rs b/crates/execsurface-cli/tests/alpha6_productization_gate.rs index 1985ca94..e16757f6 100644 --- a/crates/execsurface-cli/tests/alpha6_productization_gate.rs +++ b/crates/execsurface-cli/tests/alpha6_productization_gate.rs @@ -24,7 +24,7 @@ fn repo_root() -> std::path::PathBuf { } #[test] -fn landing_and_current_docs_present_alpha6_as_current_not_final() { +fn landing_and_current_docs_track_stable_v1_without_rewriting_alpha_history() { let root = repo_root(); let readme = fs::read_to_string(root.join("README.md")).expect("README"); let action = fs::read_to_string(root.join("docs/GITHUB_ACTION.md")).expect("Action guide"); @@ -32,24 +32,29 @@ fn landing_and_current_docs_present_alpha6_as_current_not_final() { let quickstart = fs::read_to_string(root.join("docs/QUICKSTART_5_MIN.md")).expect("quickstart"); assert!( - readme.contains("status-Current%20Supported%20Alpha"), - "landing badge must say Current Supported Alpha" + readme.contains("status-Stable%20v1.0") + && readme.contains("Current stable release") + && readme.contains("v1.0.0"), + "landing page must present the published stable v1.0.0 state" ); assert!( !readme.contains("status-Final%20Supported%20Alpha"), - "landing badge must not imply Alpha.6 is a final/stable product" + "landing page must not revive the historical Final Alpha label" ); assert!( - action.contains("The current supported Alpha Action channel is:"), - "Action guide must describe @v0.1 as the current supported Alpha channel" + action.contains("The current stable Action channel is:") + && action.contains("AETHERXGLOBAL/execsurface@v1") + && action.contains("AETHERXGLOBAL/execsurface@v1.0.0"), + "Action guide must present the stable v1 channel and immutable v1.0.0 pin" ); assert!( - status.contains("docs/releases/v0.1.0-alpha.6.md"), - "authoritative status must point current users to the Alpha.6 release record" + status.contains("Public release: `v1.0.0`") && status.contains("docs/releases/v1.0.0.md"), + "authoritative status must point current users to the published v1.0.0 release" ); assert!( - status.contains("Previous release `v0.1.0-alpha.5` remains immutable"), - "status must preserve Alpha.5 explicitly as historical/rollback evidence" + status.contains("Previous public Alpha `v0.1.0-alpha.6` remains immutable") + && status.contains("Alpha.5 also remains immutable historical evidence"), + "status must preserve Alpha.6 and Alpha.5 as historical/rollback evidence" ); assert!( quickstart.contains("EXECSURFACE_BASELINE_DIGEST") @@ -61,7 +66,6 @@ fn landing_and_current_docs_present_alpha6_as_current_not_final() { "Five-Minute Start must tell users that init prints the custody setup commands" ); } - #[test] fn generated_github_workflow_gates_target_success_before_execsurface() { let dir = temp_dir("target-gate"); diff --git a/crates/execsurface-cli/tests/v1_internal_destruction_b.rs b/crates/execsurface-cli/tests/v1_internal_destruction_b.rs index 789a6cc2..7bc52f06 100644 --- a/crates/execsurface-cli/tests/v1_internal_destruction_b.rs +++ b/crates/execsurface-cli/tests/v1_internal_destruction_b.rs @@ -114,42 +114,33 @@ fn release_request_validation_rejects_wrong_channel_and_stale_action_tag() { } #[test] -fn release_state_cannot_be_armed_without_explicit_authorization_or_claim_publication_early() { +fn published_release_state_requires_exact_authorization_and_bounded_public_claims() { let request = read(".release/release-request.json"); let readme = read("README.md"); let status = read("docs/STATUS.md"); - - let rc_unarmed = request.contains(r#""version": "0.1.0-alpha.6""#) - && request.contains(r#""tag": "v0.1.0-alpha.6""#) - && request.contains(r#""stable_channel": "v0.1""#); - - let release_armed = request.contains(r#""version": "1.0.0""#) - && request.contains(r#""tag": "v1.0.0""#) - && request.contains(r#""stable_channel": "v1""#) - && request.contains(r#""request_revision": 2"#); - - if release_armed { - let decision = read("docs/release/V1_0_0_RELEASE_DECISION.md"); - let notes = read("docs/releases/v1.0.0.md"); - assert!( - decision.contains("RELEASE_V1_0_AUTHORIZED_BOUNDED"), - "armed stable request requires explicit bounded release authorization" - ); - assert!( - notes.contains("PUBLICATION PENDING"), - "release notes must not claim publication before the transaction succeeds" - ); - } + let decision = read("docs/release/V1_0_0_RELEASE_DECISION.md"); + let notes = read("docs/releases/v1.0.0.md"); assert!( - rc_unarmed || release_armed, - "release state must be either frozen RC-unarmed Alpha.6 or explicitly authorized v1.0.0" + request.contains(r#""version": "1.0.0""#) + && request.contains(r#""tag": "v1.0.0""#) + && request.contains(r#""stable_channel": "v1""#) + && request.contains(r#""request_revision": 2"#), + "published state must retain the exact authorized stable-v1 request" + ); + assert!( + decision.contains("RELEASE_V1_0_AUTHORIZED_BOUNDED"), + "published stable state requires explicit bounded release authorization" + ); + assert!( + notes.contains("PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED"), + "release record must prove publication rather than remain in a pending state" ); for doc in [&readme, &status] { assert!( - doc.contains("v0.1.0-alpha.6"), - "public documents must remain on Alpha.6 until the release transaction succeeds" + doc.contains("v1.0.0"), + "current public documents must identify stable v1.0.0 after publication" ); for forbidden in [ "independently validated", @@ -164,8 +155,12 @@ fn release_state_cannot_be_armed_without_explicit_authorization_or_claim_publica ); } } -} + assert!( + status.contains("Previous public Alpha `v0.1.0-alpha.6` remains immutable"), + "published state must retain Alpha.6 as immutable historical/rollback evidence" + ); +} #[test] fn release_workflows_enforce_governance_and_consumer_ordering() { let promote = read(".github/workflows/promote-release.yml"); diff --git a/crates/execsurface-cli/tests/v1_internal_rc1.rs b/crates/execsurface-cli/tests/v1_internal_rc1.rs index 976cf269..98b1a510 100644 --- a/crates/execsurface-cli/tests/v1_internal_rc1.rs +++ b/crates/execsurface-cli/tests/v1_internal_rc1.rs @@ -28,49 +28,48 @@ fn temp_dir(name: &str) -> std::path::PathBuf { } #[test] -fn v1_source_identity_requires_an_explicit_release_state() { +fn v1_source_identity_requires_the_published_stable_release_state() { let cargo = read("Cargo.toml"); let action_tag = read("action/release-tag.txt"); let release_request = read(".release/release-request.json"); + let decision = read("docs/release/V1_0_0_RELEASE_DECISION.md"); + let notes = read("docs/releases/v1.0.0.md"); + let readme = read("README.md"); + let status = read("docs/STATUS.md"); assert!( cargo.contains(r#"version = "1.0.0""#), - "v1 source version must be 1.0.0" + "published v1 source version must remain 1.0.0" ); assert_eq!( action_tag.trim(), "v1.0.0", - "candidate Action source must identify the intended immutable v1 tag" - ); - - let rc_unarmed = release_request.contains(r#""version": "0.1.0-alpha.6""#) - && release_request.contains(r#""tag": "v0.1.0-alpha.6""#) - && release_request.contains(r#""stable_channel": "v0.1""#); - - let release_armed = release_request.contains(r#""version": "1.0.0""#) - && release_request.contains(r#""tag": "v1.0.0""#) - && release_request.contains(r#""stable_channel": "v1""#) - && release_request.contains(r#""request_revision": 2"#); - - if release_armed { - let decision = read("docs/release/V1_0_0_RELEASE_DECISION.md"); - let notes = read("docs/releases/v1.0.0.md"); - assert!( - decision.contains("RELEASE_V1_0_AUTHORIZED_BOUNDED"), - "armed v1 request requires explicit bounded release authorization" - ); - assert!( - notes.contains("AUTHORIZED STABLE RELEASE CANDIDATE — PUBLICATION PENDING"), - "armed v1 request requires release notes that do not pre-claim publication" - ); - } - + "published Action source must retain the immutable v1.0.0 identity" + ); + assert!( + release_request.contains(r#""version": "1.0.0""#) + && release_request.contains(r#""tag": "v1.0.0""#) + && release_request.contains(r#""stable_channel": "v1""#) + && release_request.contains(r#""request_revision": 2"#), + "published state must retain the exact authorized v1.0.0 release request" + ); + assert!( + decision.contains("RELEASE_V1_0_AUTHORIZED_BOUNDED"), + "published v1 state must retain explicit bounded release authorization" + ); assert!( - rc_unarmed || release_armed, - "release request must be either the frozen RC-unarmed Alpha.6 state or the explicitly authorized v1.0.0 state" + notes.contains("PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED"), + "release record must advance from publication-pending to the published stable state" + ); + assert!( + readme.contains("Current stable release") && readme.contains("v1.0.0"), + "README must identify v1.0.0 as the current stable release after publication" + ); + assert!( + status.contains("Public release: `v1.0.0`"), + "authoritative status must identify v1.0.0 as public after publication" ); } - #[test] fn rc1_init_generates_future_stable_v1_action_channel() { let dir = temp_dir("init-v1-channel"); @@ -108,20 +107,23 @@ fn rc1_init_generates_future_stable_v1_action_channel() { } #[test] -fn rc1_public_documents_still_identify_alpha6_as_published_release() { +fn published_v1_documents_preserve_alpha6_as_historical_rollback_evidence() { let readme = read("README.md"); let status = read("docs/STATUS.md"); assert!( - readme.contains("v0.1.0-alpha.6"), - "unpublished RC must not rewrite README current release to v1" + readme.contains("Current stable release") && readme.contains("v1.0.0"), + "published v1 README must identify the stable release" + ); + assert!( + status.contains("Public release: `v1.0.0`"), + "published v1 status must identify the stable release" ); assert!( - status.contains("v0.1.0-alpha.6"), - "unpublished RC must not rewrite authoritative public status to v1" + status.contains("Previous public Alpha `v0.1.0-alpha.6` remains immutable"), + "Alpha.6 must remain explicit historical/rollback evidence" ); } - #[test] fn rc1_registry_publish_chain_is_complete_and_dependency_ordered() { let workflow = read(".github/workflows/publish-crates.yml"); diff --git a/crates/execsurface-cli/tests/v1_release_control_plane.rs b/crates/execsurface-cli/tests/v1_release_control_plane.rs index 521f8ad5..8252387f 100644 --- a/crates/execsurface-cli/tests/v1_release_control_plane.rs +++ b/crates/execsurface-cli/tests/v1_release_control_plane.rs @@ -199,27 +199,27 @@ fn v1_release_request_requires_exact_state_and_explicit_authorization() { && request.contains(r#""stable_channel": "v0.1""#) && request.contains(r#""request_revision": 1"#); - let release_armed = request.contains(r#""version": "1.0.0""#) + let release_published = request.contains(r#""version": "1.0.0""#) && request.contains(r#""tag": "v1.0.0""#) && request.contains(r#""stable_channel": "v1""#) && request.contains(r#""request_revision": 2"#); - if release_armed { + if release_published { let decision = read("docs/release/V1_0_0_RELEASE_DECISION.md"); let notes = read("docs/releases/v1.0.0.md"); assert!( decision.contains("RELEASE_V1_0_AUTHORIZED_BOUNDED"), - "a real v1 release request must have explicit bounded release authorization" + "published v1 state must retain explicit bounded release authorization" ); assert!( - notes.contains("PUBLICATION PENDING"), - "release notes must preserve pre-publication state until the transaction succeeds" + notes.contains("PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED"), + "release record must identify the completed stable publication" ); } assert!( - rc_unarmed || release_armed, - "active request must be either frozen RC-unarmed Alpha.6 or explicitly authorized v1.0.0" + rc_unarmed || release_published, + "active request must be either frozen RC-unarmed Alpha.6 or the exact published v1.0.0 state" ); } diff --git a/crates/execsurface-cli/tests/v1_stable_contract.rs b/crates/execsurface-cli/tests/v1_stable_contract.rs index 0aa7f043..bb95f580 100644 --- a/crates/execsurface-cli/tests/v1_stable_contract.rs +++ b/crates/execsurface-cli/tests/v1_stable_contract.rs @@ -21,8 +21,8 @@ fn stable_contract_freezes_target_outcome_and_policy_v3_without_semantic_expansi let compatibility = read("docs/COMPATIBILITY.md"); assert!( - compatibility.contains("V1_STABLE_CONTRACT_FROZEN_BOUNDED"), - "compatibility document must declare the frozen bounded v1 contract" + compatibility.contains("V1_STABLE_CONTRACT_ACTIVE_BOUNDED"), + "compatibility document must declare the active bounded stable-v1 contract" ); assert!( compatibility.contains("target outcome is not verdict-bearing") @@ -124,8 +124,8 @@ fn stable_contract_uses_alpha6_as_upgrade_source_and_preserves_alpha5_boundary() assert!( compatibility.contains("Alpha.6 profile-4") - && compatibility.contains("current supported upgrade source"), - "v1 upgrade contract must start from current Alpha.6/profile-4" + && compatibility.contains("qualified upgrade source"), + "v1 upgrade contract must preserve Alpha.6/profile-4 as the qualified upgrade source" ); assert!( compatibility.contains("Alpha.5 profile-3") diff --git a/docs/COMPATIBILITY.md b/docs/COMPATIBILITY.md index 39ec9b4f..9662e409 100644 --- a/docs/COMPATIBILITY.md +++ b/docs/COMPATIBILITY.md @@ -1,13 +1,13 @@ # ExecSurface Compatibility & Stability Contract -Status: **V1_STABLE_CONTRACT_FROZEN_BOUNDED — RC EVIDENCE PENDING** +Status: **V1_STABLE_CONTRACT_ACTIVE_BOUNDED — RELEASED** Tracking: P9.3 / issue #134 -Current public baseline: `v0.1.0-alpha.6` +Current public stable release: `v1.0.0` Stable-support policy: `docs/SUPPORT_POLICY.md` -This document freezes the bounded compatibility and stability contract proposed for the future stable v1 line. +This document defines the bounded compatibility and stability contract for the released stable v1 line. -It does **not** claim that v1.0 is released or production-qualified. +v1.0.0 has been released through the qualified stable release-control chain. Independent external validation is not claimed. ## Compatibility principle @@ -59,9 +59,9 @@ Stable facts: ### Current upgrade source -**Alpha.6 profile-4 is the current supported upgrade source for the future v1 RC.** +**Alpha.6 profile-4 was the qualified upgrade source for v1.0.0 and remains preserved rollback/upgrade evidence.** -A valid Alpha.6 profile-4 baseline may be consumed directly only when the exact v1 RC proves semantic compatibility. +The exact v1.0.0 RC proved that valid Alpha.6 profile-4 baselines can be consumed directly on the preserved stable path without baseline mutation. ### Historical Alpha.5 boundary @@ -214,7 +214,7 @@ Experimental eBPF/BPF-LSM and imported/research backends are **not part of the s ### Prebuilt GitHub Release binary -Current Alpha.6 evidence proves: +Qualified Alpha.6 evidence, replayed through v1 qualification, proves: - exact public prebuilt artifact: PASS on Ubuntu 24.04 x86_64; - exact current prebuilt artifact: FAIL on Ubuntu 22.04 because it requires `GLIBC_2.39`. @@ -225,7 +225,7 @@ Unless V1-R1 deliberately changes the stable build floor and the exact v1 RC rep ### crates.io / local-build path -Current Alpha.6 evidence proves exact-version local build/install plus `doctor -> learn -> check` on both: +Qualified Alpha.6/v1 evidence proves exact-version local build/install plus `doctor -> learn -> check` on both: - Ubuntu 22.04 x86_64; - Ubuntu 24.04 x86_64. @@ -269,7 +269,7 @@ Core rules: ## 12. Upgrade and rollback contract -Before v1.0 release, the exact frozen RC must prove: +The exact frozen v1.0.0 RC proved: 1. Alpha.6 profile-4 compatibility for the preserved stable path; 2. explicit Alpha.5 profile-3 incompatibility handling where semantics differ; @@ -300,7 +300,7 @@ Bug fixes are not automatically breaking merely because alpha behavior differed. ## 14. Required executable proof before v1 closeout -P9.3 remains OPEN until the exact v1 RC passes: +P9.3 is CLOSED for v1.0.0 after the exact RC passed: 1. V1-R0 stable-contract sentinels; 2. Alpha.6 profile-4 upgrade rehearsal; @@ -313,7 +313,7 @@ P9.3 remains OPEN until the exact v1 RC passes: 9. upgrade and rollback rehearsal; 10. experimental-surface anti-drift review. -Historical Alpha.5/Alpha.6 evidence is starting evidence; it does not by itself qualify an unreleased v1 candidate. +Historical Alpha.5/Alpha.6 evidence remains retained and is supplemented by exact v1.0.0 RC and public-release evidence. ## 15. Change control @@ -321,7 +321,7 @@ The frozen contract is: **V1_STABLE_CONTRACT_FROZEN_BOUNDED** -Any change before v1.0 must record: +Any stable-contract change after v1.0.0 must record: - exact changed promise; - rationale; diff --git a/docs/CRATES_IO_PUBLISHING.md b/docs/CRATES_IO_PUBLISHING.md index aa9d85c0..fb4868ed 100644 --- a/docs/CRATES_IO_PUBLISHING.md +++ b/docs/CRATES_IO_PUBLISHING.md @@ -5,20 +5,20 @@ ExecSurface uses GitHub Releases as its checksum-verifiable, provenance-attested ## Current public install ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version execsurface doctor ``` -Alpha.6 is a prerelease, so consumers should request the exact prerelease version explicitly. +v1.0.0 is the current stable release. Exact-version installation remains recommended for reproducible evaluation. ## Verified publication order -The Alpha.6 publication chain publishes only after the immutable GitHub release and public-artifact checks succeed: +The stable-v1 publication chain publishes only after the immutable GitHub release and public-artifact checks succeed: -`immutable source/tag -> GitHub Release -> public binary proofs -> stable v0.1 proofs -> registry publication -> zero-contact registry install` +`immutable source/tag -> GitHub Release -> public binary proofs -> stable v1 proofs -> registry publication -> zero-contact registry install` -Canonical Alpha.6 release workflow run: `36910725515`. +Canonical v1.0.0 release workflow run: `37771109825`. Registry publication workflow: `37771295572`. ## Publishable crate chain diff --git a/docs/ECOSYSTEM_POSITIONING.md b/docs/ECOSYSTEM_POSITIONING.md index db82d58b..9a5e5990 100644 --- a/docs/ECOSYSTEM_POSITIONING.md +++ b/docs/ECOSYSTEM_POSITIONING.md @@ -4,7 +4,7 @@ Last reviewed: 2026-10-01 This document explains where ExecSurface fits relative to adjacent open-source security and provenance systems. It is a **scope and interoperability map**, not a winner ranking. -ExecSurface Alpha.6 is a public alpha for Linux x86_64. Native `ptrace` is the bounded public reference observer. ARM64 support and independent external validation are not claimed. +ExecSurface v1.0.0 is the stable public release for the documented Linux x86_64 boundary. Native `ptrace` is the bounded public reference observer. ARM64 support and independent external validation are not claimed. ## The question ExecSurface is designed to answer @@ -78,14 +78,14 @@ source / artifact / workflow identity Backend identity alone never grants authority. Any future external trace or kernel backend must be qualified proposition-by-proposition for authority, completeness, loss and semantic compatibility before it can support the same verdict claims. -## Current Alpha.6 boundary +## Current stable v1 boundary -Alpha.6 currently provides public distribution through: +v1.0.0 currently provides public distribution through: - checksum-verifiable GitHub Release artifacts for Linux x86_64; -- `cargo install execsurface --version "=0.1.0-alpha.6" --locked`; -- GitHub Action `AETHERXGLOBAL/execsurface@v0.1`; -- immutable Action pin `AETHERXGLOBAL/execsurface@v0.1.0-alpha.6`. +- `cargo install execsurface --version "=1.0.0" --locked`; +- GitHub Action `AETHERXGLOBAL/execsurface@v1`; +- immutable Action pin `AETHERXGLOBAL/execsurface@v1.0.0`. The public release has internal release, reproducibility, compatibility, artifact-binding and consumer-path evidence. Those results are not independent external validation. External review remains open in [Issue #118](https://github.com/AETHERXGLOBAL/execsurface/issues/118). diff --git a/docs/GITHUB_ACTION.md b/docs/GITHUB_ACTION.md index b9be4361..3ce048e0 100644 --- a/docs/GITHUB_ACTION.md +++ b/docs/GITHUB_ACTION.md @@ -2,18 +2,18 @@ ## Public channel -The current supported Alpha Action channel is: +The current stable Action channel is: ```text -AETHERXGLOBAL/execsurface@v0.1 +AETHERXGLOBAL/execsurface@v1 ``` -`v0.1` is a moving minor channel, but it is promoted only after the immutable version release has passed release-binary, Cargo fallback and Action consumer gates. +`v1` is the moving stable major channel and is promoted only after the immutable version release has passed release-binary, Cargo/tag and Action consumer gates. For maximum pinning after this release, use: ```text -AETHERXGLOBAL/execsurface@v0.1.0-alpha.6 +AETHERXGLOBAL/execsurface@v1.0.0 ``` Do not use `@main` as the normal consumer path. @@ -38,7 +38,7 @@ jobs: run: cargo test --locked - name: ExecSurface runtime drift id: execsurface - uses: AETHERXGLOBAL/execsurface@v0.1 + uses: AETHERXGLOBAL/execsurface@v1 with: command: "cargo test --locked" baseline: execsurface.lock.json @@ -49,7 +49,7 @@ jobs: run: echo "ExecSurface verdict: ${{ steps.execsurface.outputs.verdict }}" ``` -The separate target-command step above is intentional. In Alpha.6, unchanged from Alpha.5, ExecSurface evaluates execution-surface drift; it does not turn the wrapped target's native exit code or signal into the ExecSurface verdict. +The separate target-command step above is intentional. In stable v1.0.0, ExecSurface evaluates execution-surface drift; it does not turn the wrapped target's native exit code or signal into the ExecSurface verdict. ## Binary installation inside the Action @@ -69,9 +69,9 @@ execsurface learn -- /bin/bash -lc 'cargo test --locked' Without an explicit policy, unmatched drift is REVIEW. PASS succeeds; REVIEW succeeds by default; `fail-on-review=true` makes REVIEW fail; BLOCK fails; ERROR fails. -### Alpha.6 target-outcome boundary (unchanged from Alpha.5) +### Stable v1 target-outcome boundary -The Alpha.6 target command's native `exit_code` / terminating `signal` is retained in the structured report, but it is **report metadata rather than a verdict input**. This meaning is unchanged from Alpha.5. +The stable-v1 target command's native `exit_code` / terminating `signal` is retained in the structured report, but it is **report metadata rather than a verdict input**. Consequences: @@ -81,7 +81,7 @@ Consequences: - run/gate a command such as `cargo test`, `pytest` or a build separately when its success is itself required; - do not use the Action's `exit-code` output as the target command's native exit status. -This target-outcome behavior was first frozen for Alpha.5 in issue `#143` and remains unchanged in Alpha.6. Any future target-outcome enforcement must be introduced as a versioned contract change rather than silently reinterpreting either release. +This target-outcome behavior was first discovered in the Alpha line and was explicitly frozen into the v1 stable compatibility contract. Any future target-outcome enforcement requires a versioned compatibility decision. ## Outputs diff --git a/docs/INDEPENDENT_EVALUATION.md b/docs/INDEPENDENT_EVALUATION.md index aee1361e..9ca8a2fd 100644 --- a/docs/INDEPENDENT_EVALUATION.md +++ b/docs/INDEPENDENT_EVALUATION.md @@ -2,7 +2,7 @@ This guide is for developers, maintainers, security engineers, CI owners, and researchers who want to evaluate ExecSurface independently, without contacting AETHER X first. -Current public version: `v0.1.0-alpha.6` +Current public version: `v1.0.0` Supported public environment: Linux x86_64 @@ -19,7 +19,7 @@ It does not prove software safety and it is not antivirus, EDR, malware detectio ### Recommended exact public-release path ```bash -VERSION=v0.1.0-alpha.5 +VERSION=v1.0.0 TARGET=x86_64-unknown-linux-gnu ASSET="execsurface-${VERSION}-${TARGET}.tar.gz" @@ -36,7 +36,7 @@ execsurface --version ### crates.io alternative ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version ``` @@ -114,14 +114,14 @@ steps: - uses: actions/checkout@v4 - name: ExecSurface - uses: AETHERXGLOBAL/execsurface@v0.1 + uses: AETHERXGLOBAL/execsurface@v1 with: command: cargo test --locked baseline: execsurface.lock.json policy: execsurface-policy.json ``` -For immutable evaluation of this release, pin `AETHERXGLOBAL/execsurface@v0.1.0-alpha.5`. +For immutable evaluation of this release, pin `AETHERXGLOBAL/execsurface@v1.0.0`. Pin other third-party Actions to immutable SHAs in security-sensitive repositories according to your own supply-chain policy. diff --git a/docs/PRODUCTION_READINESS.md b/docs/PRODUCTION_READINESS.md index a0875b47..ad498ab9 100644 --- a/docs/PRODUCTION_READINESS.md +++ b/docs/PRODUCTION_READINESS.md @@ -6,16 +6,21 @@ Program start HEAD: `88284764c70dddf137e89a34b48519328e530ad9` Current public release at program start: `v0.1.0-alpha.5` Current gap-analysis refresh: 2026-10-08 -Current public release at refresh: `v0.1.0-alpha.6` +Current public release at closeout: `v1.0.0` Current gap analysis: `docs/development/V1_PRODUCTION_READINESS_GAP_ANALYSIS.md` -Current frozen stable contract: `docs/COMPATIBILITY.md` +Current stable contract: `docs/COMPATIBILITY.md` Stable support/deprecation policy: `docs/SUPPORT_POLICY.md` -The original gate criteria below remain frozen. The 2026-10-08 gap analysis updates the factual state after Stage-2 remediation, Alpha.6 release, and the Alpha.6 Productization Gate without weakening any production criterion. +The original gate criteria below remain retained as the frozen decision framework. The 2026-10-08 closeout records Stage-2 remediation, Alpha.6 productization, v1 stable-contract freeze, RC1 qualification, release-control hardening, stable publication and registry proof without rewriting earlier evidence. Governance amendment: `docs/development/V1_INTERNAL_QUALIFICATION_GOVERNANCE.md` -The owner has explicitly removed P9.1 and P9.5 external evidence as mandatory release blockers. They are **WAIVED_AS_RELEASE_BLOCKER_BY_GOVERNANCE**, not PASS. Missing external evidence remains a disclosed limitation, and any v1 release under this path must state that independent external validation is not claimed. The strengthened internal IQ0-IQ9 qualification chain is mandatory in their place for release governance. +The owner explicitly removed P9.1 and P9.5 external evidence as mandatory release blockers. They remain **WAIVED_AS_RELEASE_BLOCKER_BY_GOVERNANCE**, not PASS. Missing external evidence remains a disclosed limitation. Stable v1.0.0 was released only after the strengthened internal IQ0-IQ9 qualification chain, release-control proof and public artifact/registry verification. Independent external validation is not claimed. + +Final P9 decision: **`RELEASE_V1_0`** +Stable release workflow: `37771109825` — SUCCESS +Registry publication workflow: `37771295572` — SUCCESS +Release source: `e70169b959f2163715090c371335fa6c5591e3e4` This document freezes the evidence contract for deciding whether ExecSurface may move from public alpha to a production-qualified stable `v1.0` release. @@ -47,14 +52,14 @@ Dynamic specialists are added only when a gate requires them: Rust/SemVer, Linux | Gate | Requirement | Evidence source | Start state | Closeout rule | |---|---|---|---|---| -| P9.0 | Freeze the production qualification contract | This document + issue #129 | ACTIVE | Criteria are versioned, bounded and linked from current roadmap/docs | +| P9.0 | Freeze the production qualification contract | This document + issue #129 | PASS / FROZEN | Criteria are versioned, bounded and linked from current roadmap/docs | | P9.1 | Independent external evidence | P8 issue #114 + public intake #118 | WAIVED AS RELEASE BLOCKER / EVIDENCE STILL INCOMPLETE | Historical/current external evidence is retained honestly; v1 release eligibility no longer depends on closing this row | -| P9.2 | Public-consumer reliability | Operational CI, public artifact, crates.io and Action consumption | STRONG INTERNAL EVIDENCE | Supported consumer paths repeatedly pass without semantic relaxation | -| P9.3 | Compatibility & stability contract | Versioning/schema/CLI/migration evidence | CONTRACT FROZEN / RC EVIDENCE PENDING | Stable compatibility promises and deprecation/migration rules are explicit and tested on the exact v1 RC | -| P9.4 | Repository & supply-chain controls | GitHub rules/protection, workflow permissions, release/provenance evidence | PARTIAL / V1 CONTROL-PLANE BLOCKER | Release-critical changes cannot bypass the approved control plane and v1 immutable-tag/channel mechanics are qualified | +| P9.2 | Public-consumer reliability | Operational CI, public artifact, crates.io and Action consumption | PASS / CONTINUOUS | Supported consumer paths repeatedly pass without semantic relaxation | +| P9.3 | Compatibility & stability contract | Versioning/schema/CLI/migration evidence | PASS_BOUNDED / CLOSED | Stable compatibility promises and deprecation/migration rules were tested on the exact v1 RC | +| P9.4 | Repository & supply-chain controls | GitHub rules/protection, workflow permissions, release/provenance evidence | PASS_BOUNDED / CLOSED | Release-critical changes are gated by the approved control plane and immutable-v1 tag/channel mechanics were verified | | P9.5 | Real-workload adoption evidence | External workloads not created solely for demonstration | WAIVED AS RELEASE BLOCKER / EVIDENCE STILL INCOMPLETE | External workload evidence remains valuable but is no longer mandatory for the v1 release decision | -| P9.6 | v1.0 RC qualification | Frozen RC source + full release/compatibility/adversarial evidence | BLOCKED | Exact public RC is reproducibly built, consumed and upgrade-tested | -| P9.7 | Stable release decision | Independent critical review of P9.0–P9.6 | BLOCKED | `RELEASE_V1_0`, `REWORK_REQUIRED`, or `REMAIN_ALPHA_BETA` recorded with evidence | +| P9.6 | v1.0 RC qualification | Frozen RC source + full release/compatibility/adversarial evidence | PASS_BOUNDED / CLOSED | Exact RC was built, consumed, destructively tested and upgrade/rollback-qualified | +| P9.7 | Stable release decision | Internal critical review under amended governance | `RELEASE_V1_0` / CLOSED | Stable v1.0.0 published with bounded claims; external independent validation is not claimed | ## P9.0 — frozen production criteria diff --git a/docs/QUICKSTART_5_MIN.md b/docs/QUICKSTART_5_MIN.md index af6bd734..608ec8a7 100644 --- a/docs/QUICKSTART_5_MIN.md +++ b/docs/QUICKSTART_5_MIN.md @@ -9,7 +9,7 @@ Support: **Linux x86_64 public alpha**. No Rust toolchain is required for this path. ```bash -VERSION=v0.1.0-alpha.6 +VERSION=v1.0.0 TARGET=x86_64-unknown-linux-gnu ASSET="execsurface-${VERSION}-${TARGET}.tar.gz" @@ -77,7 +77,7 @@ execsurface check --policy execsurface-policy.json -- /bin/bash -lc 'cargo test ### Before pushing the generated GitHub workflow -The generated workflow runs the target command as its own correctness gate **and** runs ExecSurface against the same command. This is intentional because an Alpha.6 ExecSurface PASS is not the target command's native exit status. +The generated workflow runs the target command as its own correctness gate **and** runs ExecSurface against the same command. This is intentional because a stable-v1 ExecSurface PASS is not the target command's native exit status. The generated workflow also requires two externally trusted GitHub variables: diff --git a/docs/SELF_SERVICE_START.md b/docs/SELF_SERVICE_START.md index 4fbde010..57b82e4d 100644 --- a/docs/SELF_SERVICE_START.md +++ b/docs/SELF_SERVICE_START.md @@ -7,7 +7,7 @@ Public Alpha support: **Linux x86_64**. ## Install — recommended path (no Rust required) ```bash -VERSION=v0.1.0-alpha.6 +VERSION=v1.0.0 TARGET=x86_64-unknown-linux-gnu ASSET="execsurface-${VERSION}-${TARGET}.tar.gz" @@ -28,12 +28,12 @@ Do not run the binary if checksum verification fails. ## Alternative install — crates.io ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version execsurface doctor ``` -The current public release is a prerelease, so request the exact prerelease version explicitly. The registry publication follows the immutable GitHub release and stable Action validation. +The current public release is stable `v1.0.0`. Exact-version installation remains recommended for reproducible evaluation. ## Start in your project @@ -59,4 +59,4 @@ Run `execsurface doctor`, then use [`TROUBLESHOOTING.md`](TROUBLESHOOTING.md). E ## Product boundary -Public Alpha `v0.1.0-alpha.6` supports Linux x86_64 with native `ptrace` as the correctness-reference backend. ExecSurface reports observed runtime execution-surface drift; it does not prove software is safe and is not antivirus, EDR, malware detection, or a sandbox. +Stable v1.0.0 supports the documented Linux x86_64 boundary with native `ptrace` as the correctness-reference backend. ExecSurface reports observed runtime execution-surface drift; it does not prove software is safe and is not antivirus, EDR, malware detection, or a sandbox. diff --git a/docs/STATUS.md b/docs/STATUS.md index 71be1b53..9e52629b 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -4,18 +4,19 @@ This file is the authoritative current public product state. Historical mileston ## Current public product state -**ExecSurface v0.1.0-alpha.6 is the current supported Alpha release for Linux x86_64 within the documented native-ptrace product boundary.** +**ExecSurface v1.0.0 is the current supported stable release for Linux x86_64 within the documented native-ptrace product boundary.** Current bounded state: -`ALPHA6_SUPPORTED_ALPHA_WITH_STAGE2_SEMANTIC_REMEDIATION — LINUX_X86_64_PTRACE` +`V1_0_0_STABLE_INTERNALLY_QUALIFIED — LINUX_X86_64_PTRACE` -- Public release: `v0.1.0-alpha.6` -- Immutable Action pin: `AETHERXGLOBAL/execsurface@v0.1.0-alpha.6` -- Stable GitHub Action: `AETHERXGLOBAL/execsurface@v0.1`, promoted to Alpha.6 only after immutable release and consumer gates pass. -- Registry package: `execsurface = 0.1.0-alpha.6`, published only after the GitHub release and stable Action gates pass. -- Previous release `v0.1.0-alpha.5` remains immutable and available for historical reproduction and rollback. -- Alpha.5 normalization profile 3 is **not** silently reinterpreted under Alpha.6 profile 4; incompatible Alpha.5 baselines are rejected explicitly and must be relearned under corrected semantics. +- Public release: `v1.0.0` +- Immutable Action pin: `AETHERXGLOBAL/execsurface@v1.0.0` +- Stable GitHub Action: `AETHERXGLOBAL/execsurface@v1`, promoted to v1.0.0 only after immutable release and consumer gates passed. +- Registry package: `execsurface = 1.0.0`; exact-version zero-contact registry installation passed after publication. +- Previous public Alpha `v0.1.0-alpha.6` remains immutable and available for historical reproduction and rollback. +- Alpha.5 also remains immutable historical evidence. +- Alpha.5 normalization profile 3 is **not** silently reinterpreted under stable profile 4; incompatible Alpha.5 baselines are rejected explicitly. Alpha.6 profile-4 baselines were qualification inputs for v1 and remain rollback-compatible within the frozen contract. - Policy schema v3 is opt-in; v1/v2 meanings remain unchanged. - Stage-2 adds bounded FD-state, object/path authority, custody, policy-expressiveness, CI, and verdict-materialization correctness repairs. - Supported public product scope: Linux x86_64. @@ -24,7 +25,15 @@ Current bounded state: The research/product classification remains runtime behavioral verification, execution semantics and semantic-evidence correctness. It is not cybersecurity research. -Alpha.6 supersedes Alpha.5 as the recommended public Alpha after the release pipeline succeeds. It does not delete or rewrite Alpha.5 artifacts, issues, pull requests, comments, review threads or external-engagement records. +v1.0.0 supersedes Alpha.6 as the recommended stable public release. The v1 release does not delete or rewrite Alpha.6/Alpha.5 artifacts, issues, pull requests, comments, review threads or external-engagement records. + +Stable release transaction evidence: + +- GitHub Release workflow `37771109825` — SUCCESS; +- crates.io publication workflow `37771295572` — SUCCESS; +- stable `v1` channel resolves to immutable `v1.0.0` source; +- release asset SHA-256: `6892dc54e6f3f842cfecffa77ae0814c9e30aec219f2251c7c39a9f19f02ca7b`; +- external independent validation is not claimed. ## Historical Alpha.5 qualification @@ -91,7 +100,7 @@ It is not antivirus, EDR, SIEM, malware detection, a sandbox, a general mandator ## External validation state -Independent external validation remains open as additional evidence, not as a blocker to the bounded Final Supported Alpha state above. +Independent external validation remains open as additional evidence. Under the recorded v1 governance amendment it was not a release blocker, and v1.0.0 does not claim independent external validation. This repository does **not** claim independent validation, endorsement, adoption or approval by external reviewers or organizations merely from internal qualification, downloads, stars, outreach or community participation. @@ -107,4 +116,4 @@ Any future external failure, counterexample, no-fit result or limitation remains Historical failures, prerelease decisions, closed-gate workflows and negative evidence are retained. Operationally obsolete files may be moved out of active paths into `docs/archive/` or `.github/workflow-archive/`; that is repository hygiene, not evidence deletion or history rewriting. -For current public facts, use this file, `README.md`, the latest GitHub Release and `docs/releases/v0.1.0-alpha.6.md`. The Alpha.5 release record remains historical evidence. +For current public facts, use this file, `README.md`, the latest GitHub Release and `docs/releases/v1.0.0.md`. Alpha.6 and Alpha.5 release records remain historical evidence. diff --git a/docs/SUPPORT_POLICY.md b/docs/SUPPORT_POLICY.md index 50715e73..44faa0de 100644 --- a/docs/SUPPORT_POLICY.md +++ b/docs/SUPPORT_POLICY.md @@ -1,6 +1,6 @@ # ExecSurface Stable Support and Deprecation Policy -Status: **PRE-V1 FROZEN OPERATING POLICY — RELEASE PENDING** +Status: **V1 STABLE OPERATING POLICY — ACTIVE** Applies when a stable `v1.x` line is published. This policy defines the operational lifecycle for the bounded stable surface. It does not claim that v1.0 is already released. diff --git a/docs/TECHNICAL_EVALUATION.md b/docs/TECHNICAL_EVALUATION.md index d87f9b25..23abccb5 100644 --- a/docs/TECHNICAL_EVALUATION.md +++ b/docs/TECHNICAL_EVALUATION.md @@ -2,7 +2,7 @@ **Purpose:** let an external engineer independently reproduce one unchanged-runtime PASS and one controlled runtime-drift REVIEW in roughly 5–10 minutes, with machine-readable evidence and without AETHER X assistance. -**Current public release:** `v0.1.0-alpha.5` +**Current public release:** `v1.0.0` **Current boundary:** Linux x86_64 Public Alpha. Native `ptrace` is the public default/reference observer. This evaluation is not a malware test, sandbox, EDR assessment, enforcement-system test, or proof of program safety. @@ -24,7 +24,7 @@ A failure, unsupported environment, incomplete observation or unexpected result No Rust toolchain is required for the primary evaluation path. ```bash -VERSION=v0.1.0-alpha.5 +VERSION=v1.0.0 TARGET=x86_64-unknown-linux-gnu ASSET="execsurface-${VERSION}-${TARGET}.tar.gz" @@ -44,7 +44,7 @@ execsurface doctor Expected version: ```text -execsurface 0.1.0-alpha.6 +execsurface 1.0.0 ``` Optional build-provenance verification when GitHub CLI attestation support is available: @@ -60,7 +60,7 @@ A valid build attestation binds an artifact to a build source/workflow. It does If Rust/Cargo is already installed: ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version execsurface doctor ``` @@ -183,7 +183,7 @@ Important boundaries: - no automatic hybrid selection or ptrace↔hybrid baseline interchangeability is authorized; - Linux x86_64 is the current public support scope. -See `docs/architecture/PTRACE_VS_LSM_ARCHITECTURE_REVIEW.md` and `docs/releases/v0.1.0-alpha.5.md`. +See `docs/architecture/PTRACE_VS_LSM_ARCHITECTURE_REVIEW.md` and `docs/releases/v1.0.0.md`. ## 9. What a successful evaluation establishes diff --git a/docs/WHY_RUNTIME_BEHAVIORAL_INTEGRITY.md b/docs/WHY_RUNTIME_BEHAVIORAL_INTEGRITY.md index e31a86e5..5106def4 100644 --- a/docs/WHY_RUNTIME_BEHAVIORAL_INTEGRITY.md +++ b/docs/WHY_RUNTIME_BEHAVIORAL_INTEGRITY.md @@ -134,12 +134,12 @@ We want reports such as: - evidence that an adjacent system already solves the same problem more directly; - a counterexample to the claimed product boundary. -Current public release: `v0.1.0-alpha.6` +Current public release: `v1.0.0` Install: ```bash -cargo install execsurface --version "=0.1.0-alpha.6" --locked +cargo install execsurface --version "=1.0.0" --locked execsurface --version execsurface doctor ``` diff --git a/docs/releases/v1.0.0.md b/docs/releases/v1.0.0.md index 5e7c9862..7ea60d2c 100644 --- a/docs/releases/v1.0.0.md +++ b/docs/releases/v1.0.0.md @@ -1,9 +1,20 @@ # ExecSurface v1.0.0 -Status before publication: **AUTHORIZED STABLE RELEASE CANDIDATE — PUBLICATION PENDING** +Status: **PUBLISHED STABLE RELEASE — INTERNALLY QUALIFIED BOUNDED** ExecSurface v1.0.0 is the first stable release of the runtime behavioral verification / execution-semantics / semantic-evidence correctness line. +Published 2026-10-08 from source `e70169b959f2163715090c371335fa6c5591e3e4`. + +Release evidence: + +- GitHub Release workflow: `37771109825` — SUCCESS; +- crates.io publication workflow: `37771295572` — SUCCESS; +- stable Action channel: `AETHERXGLOBAL/execsurface@v1`; +- immutable Action pin: `AETHERXGLOBAL/execsurface@v1.0.0`; +- release asset SHA-256: `6892dc54e6f3f842cfecffa77ae0814c9e30aec219f2251c7c39a9f19f02ca7b`; +- exact registry install: `cargo install execsurface --version "=1.0.0" --locked` — PASS. + Independent external validation is not claimed. The release is internally qualified under the repository's published compatibility, adversarial, artifact, rollback, productization, and release-control gates. ## Supported boundary