53 Commits
Author SHA1 Message Date
KyuubiYoru e3b687c903 fix(release): keep publication off GitHub-only actions (#1)
quality-gate / quality (push) Successful in 2m35s
quality-gate / container (push) Successful in 1m38s
immutable-release / release (push) Successful in 6m26s
upload-artifact@v4 speaks the v2 artifacts API, which this Gitea answers
only at its v3-era shape, so the sixth release attempt cleared every gate
and then aborted at "Preserve verified candidate artifacts" with the GHES
compatibility error. Move the step to v3.2.1, the commit the upstream v3
tag resolves to, which keeps name, path, if-no-files-found and
retention-days unchanged. The step also becomes continue-on-error: it is a
pre-publish debugging backstop, and publish-release.sh attaches the same
directory as Gitea release assets, so losing it must never cost a release.

Replace cosign-installer with the direct fetch the scanner already uses.
The action issues no API call on this path, but it is a composite action
resting on envsubst and a resolved runner.arch, neither of which this
runner has exercised. Asked for the version it bootstraps, it downloads
exactly cosign-linux-amd64 from the v3.0.6 release, compares it against
c956e5df..., and exits; that digest matches the release checksums file, so
fetching the asset directly verifies identically with nothing unproven
left before the one-way publication gate. The binary joins the PATH that
publish-release.sh already resolves dotnet through.
v1.0.0
2026-08-22 22:10:00 +02:00
KyuubiYoru 747e3bb9c3 test(client): survive a starved stream handshake (#1)
quality-gate / quality (push) Successful in 2m40s
quality-gate / container (push) Successful in 1m51s
immutable-release / release (push) Failing after 5m35s
Opening an SSE stream is a single unretried request bounded by
RendezvousClientOptions.RequestTimeout. On the release runner the suite
shares a builder container with parallel image builds, so the loopback
handshake can lose its whole wall-clock budget to thread-pool starvation;
the client then reports a typed ServiceUnavailable that the test asserted
against as if it were the reset event.

Retry the open from the same replayable cursor, raise the per-request
budget to the contract ceiling, and drop protocol keepalives so a slow
interval between assertions cannot be mistaken for a session event. The
retry only fires on the transport failure the stream endpoint can never
produce as an envelope, is bounded, and yields the final failure verbatim,
so a genuinely broken stream still fails.
2026-08-22 21:42:21 +02:00
KyuubiYoru b235670afd fix(security): pin runtime to .NET 10.0.11 chiseled (#1)
quality-gate / quality (push) Successful in 2m42s
quality-gate / container (push) Successful in 1m55s
immutable-release / release (push) Failing after 5m39s
The 10.0.9 ASP.NET chiseled base shipped Microsoft.NETCore.App 10.0.9,
which the release trivy gate flags with six HIGH advisories:
CVE-2026-47302, CVE-2026-50524, CVE-2026-50528, CVE-2026-50651 and
CVE-2026-57108 (fixed in 10.0.10) plus CVE-2026-62901 (fixed in
10.0.11). Move the runtime stage to 10.0.11-noble-chiseled, pinned by
multi-architecture manifest digest as before, so every finding clears in
one step.

The build stage keeps SDK 10.0.301: the published server is framework
dependent, so the shipped runtime comes from the aspnet base alone and
the discarded builder layer is never scanned.
2026-08-22 21:20:30 +02:00
KyuubiYoru 562b8308b7 fix(release): run trivy from a pinned verified binary (#1)
quality-gate / quality (push) Successful in 2m47s
quality-gate / container (push) Successful in 1m51s
immutable-release / release (push) Failing after 5m40s
trivy-action checks its own repository out of github.com using the runner
token; on this self-hosted Gitea that token is a Gitea token, GitHub answers
"Bad credentials", and both scan steps die before trivy is installed.

Download the v0.69.3 release archive directly, verify it against a sha256
digest pinned inline, and unpack only the binary into .release-work/bin,
which is gitignored and excluded from the Docker build context. The gate
keeps its exact semantics: --exit-code 1, --severity HIGH,CRITICAL, table
output, unfixed vulnerabilities still in scope. The SPDX step writes the
same filename release_artifacts.py normalize-container-sbom consumes, and
TRIVY_CACHE_DIR keeps the vulnerability DB inside the work directory.
2026-08-22 21:06:21 +02:00
KyuubiYoru 4233f12368 fix(release): share sibling paths through the workspace (#1)
quality-gate / quality (push) Successful in 2m42s
quality-gate / container (push) Successful in 2m9s
immutable-release / release (push) Failing after 6m7s
The release job stopped at the bind-source gate. RUNNER_TEMP is
container-internal on this runner and no runner mount exposes it on the Docker
host, so no sibling container could ever share it; only the workspace is
host-mounted.

Move every path shared between the runner's shell steps and its sibling
containers under $GITHUB_WORKSPACE/.release-work: the release directory, the
release builder's HOME and NuGet cache, both candidate image tars, and the
container SPDX inventory. Resolution now maps the workspace alone to its host
path, and each sibling binds that source at $GITHUB_WORKSPACE and works from
there instead of /source, so a shared path is the same string on both sides of
the boundary. publish-release.sh follows with a single bind and requires the
release directory to sit inside the workspace.

Ignore .release-work in Git so the tag gate's cleanliness check stays true while
artifacts accumulate, and in Docker so artifacts written between the two
candidate builds cannot alter the build context the byte-comparison gate
depends on. Skip it in the dependency inventory as well, keeping the restored
package cache out of the license policy scan.
2026-08-22 20:31:18 +02:00
KyuubiYoru c5bc9651e5 docs(release): date the 1.0.0 changelog entry (#1)
quality-gate / quality (push) Successful in 2m39s
immutable-release / release (push) Failing after 1m26s
quality-gate / container (push) Successful in 1m53s
2026-08-22 19:48:01 +02:00
KyuubiYoru d41fa0c7e9 fix(release): repair tag gate and sibling-container publication (#1)
The release workflow could not complete on the self-hosted sibling-container
runner. Four defects are corrected together because three of them share the
same release.yml plumbing.

Exclude the tag under release from the prior-tag probe. check-release-tag.sh
already requires the tag to point at HEAD, so the unfiltered listing always
matched itself and rejected every first release before the initial baseline
branch could run.

Resolve host bind sources once per job. Steps run inside the runner container
while docker run starts siblings on the host daemon, so GITHUB_WORKSPACE and
RUNNER_TEMP are not usable as bind sources. A new step maps both to host paths
through the runner's own mounts and exports them; the build, provenance, smoke,
finalize, and publish steps reuse them, and publish-release.sh receives them by
environment instead of repeating the inspection. Bind destinations stay at the
container-internal paths so runner-side reads keep working unchanged.

Prove the signing material before the first push. Gitea package versions are
immutable, so a missing or undecryptable cosign key must abort ahead of the
require_absent gate rather than after packages and the image are published.

Authenticate the pinned consumer fetches. Both consumer repositories are
private, so anonymous fetches fail; the release token is passed to the
verification step and applied as a URL-scoped extra header through git's
config environment, keeping it out of argv, remotes, and on-disk config.
Anonymous fetch remains the fallback for local runs.
2026-08-22 19:47:57 +02:00
KyuubiYoru 589f802e2e fix(ci): smoke through service namespace (#1)
quality-gate / quality (push) Successful in 2m26s
quality-gate / container (push) Successful in 1m34s
2026-07-17 02:16:21 +02:00
KyuubiYoru 4423503bba fix(ci): reduce readiness probe pressure (#1)
quality-gate / quality (push) Successful in 2m40s
quality-gate / container (push) Failing after 4m34s
2026-07-17 02:06:39 +02:00
KyuubiYoru 74ae126ea7 fix(ci): allow cold container startup (#1)
quality-gate / quality (push) Successful in 2m39s
quality-gate / container (push) Failing after 3m11s
2026-07-17 01:59:30 +02:00
KyuubiYoru a77d4b801c fix(ci): isolate deployment smoke client (#1)
quality-gate / quality (push) Successful in 2m29s
quality-gate / container (push) Failing after 2m23s
2026-07-17 01:53:50 +02:00
KyuubiYoru 769336e424 fix(ci): run smoke on Compose network (#1)
quality-gate / quality (push) Successful in 2m37s
quality-gate / container (push) Failing after 1m39s
2026-07-17 01:42:28 +02:00
KyuubiYoru 41be7fbce5 fix(ci): join service to runner network (#1)
quality-gate / quality (push) Successful in 2m37s
quality-gate / container (push) Failing after 1m40s
2026-07-17 01:36:47 +02:00
KyuubiYoru 1bca034a52 fix(ci): route smoke through Docker gateway (#1)
quality-gate / quality (push) Successful in 2m37s
quality-gate / container (push) Failing after 1m51s
2026-07-17 01:29:30 +02:00
KyuubiYoru 8d98d888b3 fix(ci): resolve sibling-container bind sources (#1)
quality-gate / quality (push) Successful in 2m36s
quality-gate / container (push) Failing after 1m46s
2026-07-17 01:23:16 +02:00
KyuubiYoru ef07685d22 fix(ci): correct Docker inspect templates (#1)
quality-gate / quality (push) Successful in 2m36s
quality-gate / container (push) Failing after 1m42s
2026-07-17 01:14:44 +02:00
KyuubiYoru f9cb7f47e5 fix(ci): isolate Compose host ports (#1)
quality-gate / quality (push) Successful in 2m46s
quality-gate / container (push) Failing after 1m28s
2026-07-17 01:07:56 +02:00
KyuubiYoru de753b99e6 fix(deploy): validate complete smoke logs (#1)
quality-gate / quality (push) Successful in 2m47s
quality-gate / container (push) Failing after 2m18s
2026-07-17 00:58:28 +02:00
KyuubiYoru c3b3629515 fix(deploy): gate smoke readiness atomically (#1)
quality-gate / quality (push) Failing after 2m14s
quality-gate / container (push) Has been skipped
2026-07-17 00:54:04 +02:00
KyuubiYoru e8c07ee22a fix(deploy): synchronize smoke listing lookup (#1)
quality-gate / quality (push) Failing after 2m14s
quality-gate / container (push) Has been skipped
2026-07-17 00:48:13 +02:00
KyuubiYoru d42e6c99a3 fix(ci): provision TestClient runtime (#1)
quality-gate / quality (push) Failing after 2m18s
quality-gate / container (push) Has been skipped
2026-07-17 00:42:16 +02:00
KyuubiYoru c2f63db3ad test(client): stabilize stream integration gate (#1)
quality-gate / quality (push) Failing after 1m28s
quality-gate / container (push) Has been skipped
2026-07-17 00:34:29 +02:00
KyuubiYoru 99885f8c8c feat(observability): add diagnostic dashboards (#27)
quality-gate / quality (push) Failing after 1m31s
quality-gate / container (push) Has been skipped
2026-07-17 00:22:46 +02:00
KyuubiYoru 06c4ecf8f3 feat(browser): stream bounded live session updates (#26)
quality-gate / quality (push) Failing after 1m47s
quality-gate / container (push) Has been skipped
2026-07-16 23:25:48 +02:00
KyuubiYoru 95c3a4aed6 docs(operations): record v1 readiness evidence (#23)
quality-gate / quality (push) Failing after 1m29s
quality-gate / container (push) Has been skipped
2026-07-16 22:39:50 +02:00
KyuubiYoru 00d5ff7764 feat(operations): add production readiness gate (#23) 2026-07-16 22:19:51 +02:00
KyuubiYoru 6bad659c12 docs(integration): record Unscouted pilot evidence (#22)
quality-gate / quality (push) Failing after 1m35s
quality-gate / container (push) Has been skipped
2026-07-16 21:53:48 +02:00
KyuubiYoru f368fec6eb feat(deploy): provision Unscouted smoke tenant (#22) 2026-07-16 21:49:17 +02:00
KyuubiYoru 9e863ebf64 docs(integration): verify Godot and Linux SpaceGame pilot (#21)
quality-gate / quality (push) Failing after 1m40s
quality-gate / container (push) Has been skipped
2026-07-16 20:32:53 +02:00
KyuubiYoru ebb5eb617c docs(integration): record SpaceGame pilot checkpoint (#21)
quality-gate / quality (push) Failing after 1m26s
quality-gate / container (push) Has been skipped
2026-07-16 19:18:03 +02:00
KyuubiYoru 7fb85059fb docs: add integration guides and incident runbooks (#20)
quality-gate / quality (push) Failing after 1m28s
quality-gate / container (push) Has been skipped
2026-07-16 18:25:10 +02:00
KyuubiYoru cc5793f935 feat(release): add reproducible signed artifacts (#19)
quality-gate / quality (push) Failing after 1m50s
quality-gate / container (push) Has been skipped
2026-07-16 17:48:21 +02:00
KyuubiYoru 07004cd75f docs(evidence): record clean capacity candidate (#18)
quality-gate / quality (push) Failing after 1m28s
quality-gate / container (push) Has been skipped
2026-07-16 16:11:39 +02:00
KyuubiYoru cf14836d48 fix(operations): require clean candidate provenance (#18) 2026-07-16 16:04:25 +02:00
KyuubiYoru 609dad7cf1 feat(operations): add capacity and resilience gates (#18) 2026-07-16 15:57:01 +02:00
KyuubiYoru 08729ae25c feat(deployment): add secure Linux runtime (#17)
quality-gate / quality (push) Failing after 1m9s
quality-gate / container (push) Has been skipped
2026-07-16 15:03:04 +02:00
KyuubiYoru be732de7c9 feat(server): add observability and operator controls (#16)
quality-gate / quality (push) Failing after 1m1s
2026-07-16 13:22:16 +02:00
KyuubiYoru 88ef946af5 feat(server): harden hostile input and overload behavior (#15)
quality-gate / quality (push) Failing after 1m5s
2026-07-16 12:37:38 +02:00
KyuubiYoru 2ff7cd6d9d test(integration): add deterministic NAT topology harness (#14)
quality-gate / quality (push) Failing after 1m3s
2026-07-16 11:50:53 +02:00
KyuubiYoru 7e3be2cad1 feat(tooling): add standalone rendezvous test client (#25)
quality-gate / quality (push) Failing after 1m3s
2026-07-16 11:05:56 +02:00
KyuubiYoru 94aba8a3bb feat(client): standardize connection outcomes (#13)
quality-gate / quality (push) Successful in 59s
2026-07-16 10:18:41 +02:00
KyuubiYoru b4b6072fe1 feat(client): add rendezvous traversal coordinators (#12)
quality-gate / quality (push) Successful in 56s
2026-07-16 08:39:05 +02:00
KyuubiYoru 6d076c281a feat: implement authenticated NAT mediator (#11)
quality-gate / quality (push) Successful in 59s
Closes #11
2026-07-16 07:37:02 +02:00
KyuubiYoru 1baa1055dc feat: implement scoped join attempts and tickets (#10)
quality-gate / quality (push) Successful in 1m1s
Closes #10
2026-07-16 06:56:30 +02:00
KyuubiYoru 06c3973ce7 feat: add publisher and browser client SDK (#9)
quality-gate / quality (push) Successful in 1m6s
Closes #9
2026-07-16 06:27:44 +02:00
KyuubiYoru a9a2b3db35 feat: add bounded compatible session browser (#8)
quality-gate / quality (push) Successful in 57s
Closes #8
2026-07-16 06:06:29 +02:00
KyuubiYoru 49564c7e7e feat: add presence-gated session leases (#7)
quality-gate / quality (push) Successful in 55s
Closes #7
2026-07-16 05:58:47 +02:00
KyuubiYoru 02ca502a76 feat: add atomic ephemeral state (#6)
quality-gate / quality (push) Successful in 57s
Closes #6
2026-07-16 05:32:48 +02:00
KyuubiYoru 47382ddadc feat: add tenant provisioning and key lifecycle (#5)
quality-gate / quality (push) Successful in 50s
Closes #5
2026-07-16 05:13:35 +02:00
KyuubiYoru 69c8b2d2bc feat: freeze v1 transport contracts (#4)
quality-gate / quality (push) Successful in 51s
Closes #4
2026-07-16 04:52:38 +02:00