Inspect hosted assets against build manifests

This commit is contained in:
2026-10-05 19:56:32 +00:00
parent 717d6d0d04
commit 692a503c26
9 changed files with 695 additions and 13 deletions

View File

@@ -28,6 +28,24 @@ lookup cannot determine the result after a possibly successful write, the
client returns an unknown outcome. Other HTTP failures retain their structured
failure kind and status code.
For a binary-producing release, the client can build a deterministic
`SHA256SUMS` file from the declared artifact names and SHA-256 digests. Entries
are sorted by filename and use the standard two-space separator. A source-only
release produces no manifest.
Asset inspection lists the release attachments, streams each declared existing
file, and compares its SHA-256 digest. It reports each asset as matching,
missing, conflicting, or unverifiable. Same-name attachments with different
bytes are conflicts even when their reported size matches. An existing
`SHA256SUMS` must exactly match the complete expected manifest; a subset or
different manifest is a conflict. An unreadable attachment is unverifiable,
not missing. Unrelated attachments are returned separately and are preserved.
Attachment downloads and same-origin redirects carry authorization only when
their scheme, host, and port match the configured Gitea service. Cross-origin
URLs and redirects are left unrequested and reported as unverifiable. Inspection
uses GET requests only; uploads are a later delivery operation.
The integration tests use a local HTTP fixture and assert request paths,
payloads, authorization, and failure handling. They do not contact a live Gitea
service or use real credentials.
payloads, authorization, streaming comparisons, manifest handling, and failure
handling. They do not contact a live Gitea service or use real credentials.

View File

@@ -16,8 +16,8 @@ Implemented internal packages:
overlays.
- `internal/build` compiles explicit Go targets with shared version injection,
verifies native version output, and returns generated file digests.
- `internal/gitea` verifies hosted source tags and finds or creates matching
stable release pages through the Gitea REST API.
- `internal/gitea` verifies hosted source tags, finds or creates matching stable
release pages, and inspects existing attachments through the Gitea REST API.
- `internal/candidate` captures and validates one clean local candidate, checks
its committed release note and local tag state, runs validation once, and
rechecks mutable repository state.

View File

@@ -1,6 +1,6 @@
# ReleaseKit staged implementation plan
Status: In progress. Stages 1–12 are complete; later stages remain pending.
Status: In progress. Stages 1–13 are complete; later stages remain pending.
Date: 2026-10-05
@@ -758,7 +758,7 @@ request paths, payloads, and authentication without using real credentials.
## Stage 13: Inspect asset and manifest content
Status: Pending. Depends on Stage 12.
Status: Complete. Depends on Stage 12.
1. Generate the expected binary manifest from the declared build result. Add
attachment discovery and streaming hash comparison of existing assets.

View File

@@ -2,11 +2,11 @@
This is a proposal based on a review of PromptKit, ConfigKit, Audita, Notarius,
Narratio, and Scriptorium on 2026-09-29. The implementation plan records the
current implemented boundary; the internal Gitea page client is implemented,
while asset delivery, facade/CLI integration, and broader integrations remain
planned. The public facade architecture is accepted in
[ADR 0001](../adr/0001-public-facade.md) and is implemented for runtime version,
candidate validation, and source publication.
current implemented boundary; the internal Gitea page and asset-inspection
client is implemented, while asset delivery, facade/CLI integration, and
broader integrations remain planned. The public facade architecture is
accepted in [ADR 0001](../adr/0001-public-facade.md) and is implemented for
runtime version, candidate validation, and source publication.
The [implementation plan](implementation.md) owns ordered stages, execution
instructions, acceptance checks, and progress toward this target state.
@@ -57,8 +57,9 @@ The [architecture policy](../policy/architecture.md) owns the adopted
responsibility and dependency rules, including the runtime version boundary.
The root `releasekit` package provides the public facade for candidate
validation, source publication, and selected-target builds. The internal
Gitea page client is implemented; delivery orchestration remains planned. The
separate public `buildinfo` package provides lightweight runtime version access.
Gitea page and asset-inspection client is implemented; delivery orchestration
remains planned. The separate public `buildinfo` package provides lightweight
runtime version access.
Each facade owns its public named types and documented contracts. Public
operations, inputs, outcomes, errors, and callbacks express deliberately