Assistant: codex Assistant-Model: gpt-6.1-sol Assistant-Session: 01a14bfc-9643-7872-aa12-98326dcf25e7
11 KiB
Forgejo release preparation (build only)
The Apps Makefile targets package the digest-bound 49-path Forgejo 11.0.3
source candidate in forgejo-security-extension.patch. It combines the original
three-group any-of gate, private secret-file input, private source-operation DB
primitives and the producer-owned Access Engine client in the OIDC callback.
Coordinator source tests and complete release checks are recorded separately;
independent owner review and operational admission of this revision remain open. They never deploy, push, change default values or choose
an operational image. Third-party application source is expanded only into a new
/tmp workspace; this repository retains a release input lock and exact reviewed
patch, not a second source-code tree. Upstream source ownership and publication
remain separate owner work.
Supply explicit public input archives/cache paths to make forgejo-release-prepare:
FORGEJO_SOURCE_ARCHIVE, FORGEJO_GO_ARCHIVE, FORGEJO_NODE_ARCHIVE,
FORGEJO_BUILD_GOMODCACHE, optionally FORGEJO_BUILD_GOCACHE_SEED and
FORGEJO_BUILD_NPM_CACHE_SEED. Every archive, patch, source output, dependency
lock and selected host compiler tool is digest-bound by inputs.lock.json.
Go's official checksums and Node's official SHASUMS must be independently checked
when acquiring those public archives. The source archive is official Forgejo
v11.0.3; archive PAX commit b81aa4d0807cc1e2d6a2fbafd0b75c46cc0ae237.
The workspace must not exist. Existing trials are preserved, never restarted
because an observer timed out. The recipe's process.json records the exact
active child PID, phase and command, then completion; logs and receipts stay in
the workspace. Do not run two phases against the same workspace concurrently.
make forgejo-release-acquire-npm explicitly acquires only public registry
packages, with fresh HOME/config paths, integrity-bound lockfile and lifecycle
scripts disabled. With the cache ready, make forgejo-release-build reruns
npm ci --offline --ignore-scripts, Go module verification, upstream frontend
compilation and upstream generation/static backend targets inside a network
namespace without connectivity. It uses the exact Go/Node distributions, local
compiler inputs, bindata timetzdata sqlite sqlite_unlock_notify plus upstream
static target's netgo osusergo, explicit Make GOFLAGS for trimpath/buildvcs and
fixed file/directory timestamps. Build tags retain the upstream rootless build
profile. make forgejo-release-verify compares every embedded public/options/
template file to actual generated source bytes, checks the extension CLI and
checks the ELF has no dynamic interpreter. These are local artifact checks,
not application login, DB, native rollout or architecture acceptance.
For a local container build only, first acquire the locked public amd64
base with an empty Docker client config and the explicit local socket. Then
make forgejo-release-container uses that exact digest as a build input and a
minimal context containing only the verified executable and generated Dockerfile.
It directly exports a local OCI archive with rewrite-timestamp=true, no-cache,
no image load or push. SOURCE_DATE_EPOCH alone does not fix COPY parent-directory
timestamps. The image epoch is max(source epoch,ceil immutable base created
instant), so the original base layers remain exact while new metadata is stable.
The recipe verifies every OCI blob, original base layer prefix, rootless runtime
configuration, provenance labels and exact final executable. Two no-cache exports
must reproduce the frozen output image and archive digests before claiming
reproducibility. The actual local proof receipts are in the accompanying source
proposal packet, not an admission of the resulting artifact.
There is no deployment tag, registry publication, RUN directive, privileged container or Docker host/secret mount. Public base acquisition and a standard local Docker/buildx daemon supporting OCI export/layer timestamp rewriting are explicit prerequisites. An unavailable feature is a retained blocker; do not switch to a privileged builder or claim a successful image from a backend-only binary. Existing contexts/output archives refuse overwrite. Reconcile an actual failed export explicitly, retaining original metadata/logs/artifacts; observation timeouts never justify another build. Older prototype load/save behavior and its config-versus-manifest-ID issue are retained in the source trial history, not shipped as a production continuation.
The static host toolchain is pinned for this Linux amd64 review estate. Broader
cross-host reproducibility or a different architecture/compiler/libc is a new
input revision, not an implicit fallback. The glibc static-linker's optional
SQLite dlopen diagnostic is retained; no SQLite-extension runtime compatibility
or production platform admission is inferred from ELF inspection or asset checks.
An accepted owner image/source/backend, authenticated access-engine decision,
private secret-input boundary, type/case/descriptor re-freeze, current operation/
inverse sessions, durable journal and application/Helm writer exclusion are
separate gates. Helm omission/rollback does not remove persisted OAuth source.
The existing case gate is compatibility code, not a single-PDP exception.
KeyCape identity and callback admission
The callback independently verifies the ID token against owner-admitted public
keys, algorithms, issuer, audience and token type. Public trust is loaded from
FORGEJO_ACCESS_ENGINE_ADMISSION_FILE; only an absolute private file reference
is used for the PDP caller token. No admission file or operational keys are
supplied by this build. New fields tenant_source_claim and
max_authentication_age are mandatory. The KeyCape v0.3 profile uses
assurance_claim: assurance and tenant_source_claim: tenant_source. Maximum
identity age and maximum authentication age are separate positive durations
chosen by the owner, not implicit defaults.
The signed assurance object preserves level, methods, boolean mfa,
source: key-cape and integer at. Its authentication time must not follow
issuance or the current time, and must satisfy the admitted authentication-age
bound. Identity validity ends at the earliest token expiration, issued-at age
bound or authentication-age bound. Directory, registration and default tenant
provenance remain distinct in the request. Mutable UserInfo cannot replace
these authenticated facts. Current UserInfo subject and the Goth subject must
match the independently verified token; the three required group alternatives
remain policy input.
The parser also represents valid lower-assurance facts. Application policy continues to decide authorization. The Check client and unchanged canonical signature bytes are a generated source slice of Access Engine ca0cb757; Forgejo adds no policy evaluator. Exact caller/policy/registry/signer/request/lifetime pins, an authenticated HTTPS connection and a current ALLOW are required. Synthetic callback fixtures test ALLOW, DENY and adverse cases, including an ID token serialized by the actual pinned KeyCape handler. Those fixtures do not prove an actual browser, factor, custody or native rollout.
The current integration covers this guarded OIDC callback. Ongoing application HTTP/API/Git/SSH paths, current operation/inverse sessions, durable private evidence and retention, deployed PostgreSQL/custody acceptance and exclusion of all release writers remain open in RAPPS-WP-0016-T08/T09 and NK-WP-0048-T43. An old image approval or source test result cannot admit this candidate.
PostgreSQL operation-source verification
The source primitive has now run on a disposable PostgreSQL 16.14 instance using
the actual Forgejo engine, model schemas and OAuth configuration types. Tests
cover default, explicit-public and named schemas, exact source restoration, drift
and linked-account refusals, trigger rollback, uncooperative SQL writer exclusion
and concurrent preparation. Independent client processes and an actual server
restart verify prepared/applied/inverse journal recovery. The test-only
source_operation_postgres tag selects the integration tests; no runtime route,
credential, session or authority callback is added. The companion Custodian
forgejo-postgres-source-r1 packet holds the isolated fixture, commands, source
pins, counterexamples and original failed attempts.
Actual PostgreSQL diagnostics exposed a tracing-hook composition crash. Tracing now publishes its task context to the shared XORM hook context so later hooks retain it. Ordinary and private SQLite traces and actual PostgreSQL failure queries exercise this path. Controlled copies without the table lock or private query marker fail their respective regressions. These are source/database mechanics checks; owner admission, current authenticated operation/inverse sessions, runtime/backup custody, retention, every release writer and native deployed-database acceptance remain separate obligations. The previous frozen release is historical and does not contain this context correction.
Current-token callback source continuation
The 49-path candidate additionally vendors the unchanged, producer-generated
KeyCape current-token adapter from 08c083ba; no consumer token registry or
handwritten copy is introduced. current_token (explicit HTTPS issuer, resource
audience, owning client, CA/JWKS/private-client-file references and maximum token
age) and application_tenant are mandatory in the independently admitted
FORGEJO_ACCESS_ENGINE_ADMISSION_FILE for this guarded callback profile. A signed
caller cannot select the application's tenant. No operational configuration or
credential is supplied by the build.
The callback requires the online KeyCape human ID token's exact RS256 at_hash
access-grant binding before private caller use. Access-only jti/scope cannot
substitute for an ID token. It joins independently verified subject/tenant/type,
issuance, assurance/authentication time and tenant provenance to a fresh issuer
observation before the PDP, then checks current status again after the decision.
Source tests refuse mixed, revoked, suspended, stale, malformed and unavailable
inputs; actual HTTPS issuer PKCE/discovery/UserInfo/status/revocation and real
Forgejo provider/callback run in five isolated consumer processes. MFA session
seeds and PDP admissions are synthetic. Complete release build/asset/OCI evidence
for the preceding patch remains historical; this revision requires its own build
and independent owner/package/type/custody admission before operational use.
The user selected current KeyCape checks on every ongoing API/Git/SSH operation for NetKingdom-linked accounts, while retaining the separate local break-glass path. That is an implementation requirement under RAPPS16-T09/NK48-T43, not a claim that the callback implements those routes or a native deployment grant. Ongoing resource/action/current-group decisions, protected operation/inverse and all release writers/journal custody remain acceptance work.
Final composed source validation passes 116 test/subtest results without skips. The initial 114-pass run skipped its private file-replacement check because a reused fixture was exhausted; the runner now creates fresh private/read-only aliases. That initial skip is retained and is not PostgreSQL acceptance.