Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 3 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1011,18 +1011,7 @@ jobs:
--notes-file artifacts/release/release-notes.md \
--asset-names-file /tmp/proofkit-expected-release-assets.txt
cp /tmp/proofkit-release-view.json artifacts/release/github-release.json
retained_evidence=(artifacts/release/github-release.json)
if compgen -G "artifacts/attestations/*.json" >/dev/null; then
while IFS= read -r evidence; do
retained_evidence+=("$evidence")
done < <(find artifacts/attestations -type f -name '*.json' | sort)
fi
mapfile -t retained_evidence < <(printf '%s\n' "${retained_evidence[@]}" | sort)
: > artifacts/release/retained-evidence-checksums.sha256
for evidence in "${retained_evidence[@]}"; do
sum="$(sha256sum "$evidence" | awk '{print $1}')"
printf '%s %s\n' "$sum" "$(basename "$evidence")" >> artifacts/release/retained-evidence-checksums.sha256
done
go run ./internal/tools/releasepreflight retained-evidence --artifact-root artifacts
final_dir="$(mktemp -d)"
for asset in "${expected_assets[@]}"; do
asset_name="$(basename "$asset")"
Expand All @@ -1048,18 +1037,7 @@ jobs:
--tag "$GITHUB_REF_NAME" \
--notes-file artifacts/release/release-notes.md \
--asset-names-file /tmp/proofkit-expected-release-assets.txt
retained_evidence=(artifacts/release/github-release.json)
if compgen -G "artifacts/attestations/*.json" >/dev/null; then
while IFS= read -r evidence; do
retained_evidence+=("$evidence")
done < <(find artifacts/attestations -type f -name '*.json' | sort)
fi
mapfile -t retained_evidence < <(printf '%s\n' "${retained_evidence[@]}" | sort)
: > artifacts/release/retained-evidence-checksums.sha256
for evidence in "${retained_evidence[@]}"; do
sum="$(sha256sum "$evidence" | awk '{print $1}')"
printf '%s %s\n' "$sum" "$(basename "$evidence")" >> artifacts/release/retained-evidence-checksums.sha256
done
go run ./internal/tools/releasepreflight retained-evidence --artifact-root artifacts
final_dir="$(mktemp -d)"
for asset in "${expected_assets[@]}"; do
asset_name="$(basename "$asset")"
Expand Down Expand Up @@ -1095,7 +1073,7 @@ jobs:
artifacts/release/checksums.sha256
artifacts/release/github-release.json
artifacts/release/metadata-checksums.sha256
artifacts/release/retained-evidence-checksums.sha256
artifacts/retained-evidence-checksums.sha256
artifacts/release/release-manifest.json
artifacts/release/release-notes.md
artifacts/release/sbom.cdx.json
Expand Down
1 change: 1 addition & 0 deletions BACKLOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ records, generated release manifests, or the owning docs named above.
| DEFERRED | VALUE-01 | Admit exact value-evidence comparisons only after a real producer and downstream consumer establish the public record boundary; detailed candidate contract is retained in [issue #65](https://github.com/research-engineering/agentic-proofkit/issues/65). | A real execution-receipt projection, baseline producer, and downstream consumer prove an exact producer-output-to-admission round trip plus compact/full-graph inclusion or an intentional omission non-claim; otherwise no public command is added. |
| BLOCKED | RELOCATION-01 | Add provenance-bounded witness relocation candidates without introducing a second binding path or trusting a caller-authored prior digest; detailed candidate contract is retained in [issue #66](https://github.com/research-engineering/agentic-proofkit/issues/66). | An owner-admitted content-addressed baseline binds witness id, prior path and digest, source revision, evidence class, authentication non-claims, and freshness non-claims; the scanner then proves the zero/one/many match partition while remaining non-current until fresh execution evidence exists. |
| BLOCKED | RELEASE-01 | Prove signed protected-tag release policy as provider-side release governance, not source-only intent. | Repository tag protection/ruleset and release workflow variables require signed annotated release tags; the next public release records provider-side evidence or the row is explicitly retired as an accepted non-claim. |
| BLOCKED | RELEASE-02 | Retire the inaccurate PyPI `0.1.159` wheel compatibility and license projection without mutating immutable release history. | After a public replacement release proves macOS 12.0 wheel tags, embedded MIT license identity, npm/PyPI/GitHub byte closure, and installed-package smoke, yank PyPI `0.1.159` with an exact compatibility-and-license reason and retain provider evidence of the yank. |
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ Python consumers use the Python package as a runner wrapper over the same Go
CLI, not as a Python SDK. Python projects should still treat CLI/JSON records,
exit codes, and package metadata as the public contract.

Published Darwin binary distributions require macOS 12.0 or later.

## Project Boundary

`agentic-proofkit` is intended to provide reusable proof-workflow mechanics for
Expand Down
24 changes: 17 additions & 7 deletions docs/release-process.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ Go source
-> GitHub Release assets with checksums and SBOM for provenance lookup
```

The repository-owned `release:manifest` tool creates `release-manifest.json`,
The committed `release/change-record.v1.json` owns the reviewed, version-bound
declaration of the public-contract delta, migration decision, platform
requirements, known limitations, and rollback strategy. It does not infer
change completeness from the source diff. The repository-owned
`release:manifest` tool admits that record and creates `release-manifest.json`,
`checksums.sha256`, `metadata-checksums.sha256`, `sbom-subjects.sha256`,
release notes, and deterministic SBOM candidate evidence from explicit package,
registry, and release evidence. `checksums.sha256` covers distributable archive
Expand Down Expand Up @@ -77,18 +81,21 @@ Before publishing a version:

1. The source tree is clean.
2. `package.json` contains the exact new version.
3. `package.json` repository, license, bin, exports, files, and publishConfig
3. `release/change-record.v1.json` contains the same version and explicitly
classifies breaking changes, additions, migration, platform requirements,
known limitations, and rollback.
4. `package.json` repository, license, bin, exports, files, and publishConfig
match the intended public package contract.
4. The npm account has verified email and write-protective 2FA, or the package
5. The npm account has verified email and write-protective 2FA, or the package
uses an admitted Trusted Publisher configuration.
5. When `PROOFKIT_ENABLE_PYPI_PUBLISH=true`, the PyPI account has a normal or
6. When `PROOFKIT_ENABLE_PYPI_PUBLISH=true`, the PyPI account has a normal or
pending Trusted Publisher configured for project `agentic-proofkit`,
repository `research-engineering/agentic-proofkit`, workflow `release.yml`, and
environment `pypi`.
6. The release workflow is configured for the package, public npm registry, and
7. The release workflow is configured for the package, public npm registry, and
release environments. PyPI release configuration is required only when the
PyPI channel is explicitly enabled.
7. `npm run check` passes locally or the release candidate workflow provides
8. `npm run check` passes locally or the release candidate workflow provides
equivalent current-head evidence.

## Candidate Proof
Expand Down Expand Up @@ -156,7 +163,10 @@ The `release` workflow must:
14. retain normalized GitHub Release metadata as workflow release evidence at
`artifacts/release/github-release.json` after byte-for-byte asset
verification, and bind it plus any attestation record with
`artifacts/release/retained-evidence-checksums.sha256`. The release
`artifacts/retained-evidence-checksums.sha256`. The checksum manifest lives
at the retained artifact root and uses exact `release/...` and
`attestations/...` paths, so standard checksum verification executes against
the downloaded artifact layout without path rewriting. The release
manifest records GitHub Release channel data as candidate/archive inventory;
`github-release.json` owns post-create GitHub Release facts only inside
retained workflow evidence, not as a public release asset.
Expand Down
11 changes: 7 additions & 4 deletions docs/specs/proofkit-spec-proof-core/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,13 @@ execution receipts, and merge policy.
boundaries, and non-claims, then emits a bounded source-bound question packet
only after explicit user submission.
- `REQ-PROOFKIT-SPEC-022`: semantic diff compares admitted requirement fields
by owner-declared scalar, set, and map semantics rather than textual order.
- `REQ-PROOFKIT-SPEC-023`: traceability graphs preserve specification, proof,
code traceability, and native execution as distinct evidence planes and
accept code topology only as explicit caller-owned input.
by owner-declared scalar, set, map, and lifecycle semantics, covers entity
additions and removals, and remains closed under output re-admission.
- `REQ-PROOFKIT-SPEC-023`: traceability graph input schema v2 preserves
specification, proof, code traceability, and native execution as distinct
evidence planes and accepts code topology only as explicit caller-owned input
with source-digest, parent-edge, abstraction-order, and pre-materialization
budget closure.

## Non-Claims

Expand Down
4 changes: 2 additions & 2 deletions docs/specs/proofkit-spec-proof-core/requirements.v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,7 @@
{
"requirementId": "REQ-PROOFKIT-SPEC-022",
"ownerId": "proofkit.spec-proof-core",
"invariant": "Requirement semantic diff compares two admitted context snapshots by stable requirement identity and owner-declared scalar, set, and map field classes, producing deterministic added, removed, and modified facts without textual diff, inferred move semantics, or authority over requirement meaning.",
"invariant": "Requirement semantic diff compares two admitted context snapshots by stable requirement identity and owner-declared scalar, set, map, and lifecycle field classes, producing canonically ordered added, removed, and modified facts that remain closed under output re-admission without textual diff, inferred move semantics, or authority over requirement meaning.",
"claimLevel": "blocking",
"riskClass": "medium",
"proofBindingRefs": ["proofkit/requirement-bindings.json"],
Expand All @@ -546,7 +546,7 @@
{
"requirementId": "REQ-PROOFKIT-SPEC-023",
"ownerId": "proofkit.spec-proof-core",
"invariant": "Requirement traceability graph deterministically projects admitted specification and proof topology plus explicit caller-owned code topology while preserving specification, proof, code traceability, and native execution as distinct evidence planes and rejecting dangling topology references.",
"invariant": "Requirement traceability graph input schema v2 deterministically projects admitted specification and proof topology plus explicit caller-owned code topology while preserving specification, proof, code traceability, and native execution as distinct evidence planes; one typed topology validator rejects dangling endpoints, enforces the bijection between non-root parentNodeId facts and contains edges with broader parent abstraction, verifies every supplied code-source digest, and applies node, edge, and source-byte budgets before per-item semantic materialization.",
"claimLevel": "blocking",
"riskClass": "high",
"proofBindingRefs": ["proofkit/requirement-bindings.json"],
Expand Down
8 changes: 8 additions & 0 deletions docs/specs/proofkit-supply-chain-quality/overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,14 @@ vulnerability absence, or consumer rollout safety by itself.
routes, bounded server cleanup, repository-confined non-symlink proof
artifacts, and machine-admitted per-project rendered engine evidence without
runtime dependencies or a production bundler.
- `REQ-PROOFKIT-QUALITY-023`: Python wheels independently bind advertised
platform compatibility to decoded executable bytes and carry Core Metadata
2.4 plus an exact, RECORD-closed repository license payload.
- `REQ-PROOFKIT-QUALITY-024`: a version-bound machine record declares the
reviewed public-contract change set and owns release-note content, while one
retained-evidence owner builds and verifies checksums against exact
downloadable artifact-relative paths without inferring change completeness
from the source diff.

## Non-Claims

Expand Down
26 changes: 26 additions & 0 deletions docs/specs/proofkit-supply-chain-quality/requirements.v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,32 @@
"lifecycle": {"state": "active", "replacementRequirementIds": [], "evidenceRefs": []},
"deferral": null,
"updatePolicy": {"reviewOwnerId": "proofkit.supply-chain-quality", "requiresImpactDeclaration": true, "requiresProofBindingReview": true}
},
{
"requirementId": "REQ-PROOFKIT-QUALITY-023",
"ownerId": "proofkit.supply-chain-quality",
"invariant": "Each Python wheel binds its embedded executable to the release binary digest, independently decodes Darwin Mach-O bytes so an advertised macOS platform minimum is never lower than the executable minimum, uses Core Metadata 2.4 License-Expression and License-File fields, carries an exact repository LICENSE copy under the wheel licenses directory, and closes every payload entry through RECORD.",
"claimLevel": "blocking",
"riskClass": "critical",
"proofBindingRefs": ["proofkit/requirement-bindings.json"],
"nonClaimRefs": ["NC-PROOFKIT-QUALITY-023"],
"nonClaims": ["This requirement does not claim execution on every accepted operating-system version, legal approval, registry publication, release approval, rollout approval, or production readiness."],
"lifecycle": {"state": "active", "replacementRequirementIds": [], "evidenceRefs": []},
"deferral": null,
"updatePolicy": {"reviewOwnerId": "proofkit.supply-chain-quality", "requiresImpactDeclaration": true, "requiresProofBindingReview": true}
},
{
"requirementId": "REQ-PROOFKIT-QUALITY-024",
"ownerId": "proofkit.supply-chain-quality",
"invariant": "Release metadata generation admits one version-bound machine-readable declaration of the reviewed public-contract change set and renders release notes as its exact projection, while one repository-owned retained-evidence builder and verifier checksum the exact final downloadable artifact topology with artifact-relative paths, reject unbound evidence files and symlink substitution, and fail release closeout on record, note, path, or digest drift.",
"claimLevel": "blocking",
"riskClass": "high",
"proofBindingRefs": ["proofkit/requirement-bindings.json"],
"nonClaimRefs": ["NC-PROOFKIT-QUALITY-024"],
"nonClaims": ["This requirement does not infer change-record completeness from source changes, make release notes approval authority, or prove provider publication, attestation authenticity, consumer adoption, rollout approval, or production readiness."],
"lifecycle": {"state": "active", "replacementRequirementIds": [], "evidenceRefs": []},
"deferral": null,
"updatePolicy": {"reviewOwnerId": "proofkit.supply-chain-quality", "requiresImpactDeclaration": true, "requiresProofBindingReview": true}
}
]
}
Loading
Loading