What changed, and where it went

Commits, diffs, builds, test reports and the promotion trail.

The commit graph

Commits as nodes, branches as lanes, and what the platform did with each one.

Open inkwell-web's history →

Branches are lanes that persist down the page and curve back into the trunk at their merge base. Open a row for the message body, the builds, the environments it reached and its pull requests.

The annotations are the part a general git viewer cannot do. Anyone can draw a commit graph; "live in production, built twice, and this is what PR 7's review environment forked from" is knowledge only the platform has. A pull request's base commit is marked forks here and names the review-pr-<n> environment and the -pr-<n> component suffix.

Commits and diffs, in the console

warning

Links to git.jung.town/<org>/<repo>/commit/<sha> return 404, not 403, for anyone without a Gitea session. All twelve application repositories are private, and Gitea will not confirm a private repo exists. The URL is correct; the reader has no session.

So commits render here instead, read with the console's own token.

/commits/<org>~<repo>/<sha> — subject, message body, author, parents, and the coloured diff per file.

The repository slash is written as ~. Not URL-encoded: %2F in a path segment is rejected or silently normalised by enough proxies that it is not worth relying on, and it makes a link nobody can read aloud.

/commits/<org>~<repo>/<base>...<head> — every commit between two points, newest first, spelled the way Gitea spells it so a pasted compare URL transfers.

The deploys page shows what went live and what was in it, built from the delivery metric and Gitea's compare endpoint.

Builds and their tests

A release page is where the trail ends: what it declares, where it is serving, and every manifest it rendered.

One release: commit to build to release to binding, what it declared, and the nine manifests it rendered

  1. 1

    The build page

    Stages with cache verdicts, the trace, per-stage logs and the commit diff in place.

  2. 2

    The test report

    Totals, failures first with their message and captured output, the ten slowest cases, and every case filterable by outcome and suite. Both filters live in the URL, so a filtered report is a link.

    The platform writes a real junit.xml per run — pytest natively, the rspec plugin by hand — but this page reads the per-test log records instead, because the XML never leaves the build container: the artifact store is ClusterIP on the workflow plane and this console runs on the data plane.

  3. 3

    A missing duration is missing

    Not zero. Zero would make an untimed test look instant, sort it below every real one, and report a 220-case suite as taking 0.00s — which reads as a fast suite rather than as absent timings.