A private repository on vm4006 (hs.hsadmin.ng) served every artifact without the control token: the repository is internal in a private organisation, and Werkator asked Gitea with its token and read only the private flag.
Visibility is asked as a visitor (without token); 401/403/404 and a visible private/internal answer mean private. An unclear answer hides the repository (fail closed, retried after a minute). Artifact routes answer 404 instead of 500 for unknown or hidden names.
builds.<name>.publicArtifacts releases chosen artifacts of a private repository: globs over workspace paths like artifactDirs, or true. The paths come from the built commit's own .werkator.yml; only a branch the primary configuration names literally in that definition's trigger.branches publishes.
Released artifacts answer server.corsAllowedOrigins (PR#96) via a Spring CorsFilter, preflight included; nothing else carries a CORS header.
A private repository on vm4006 (hs.hsadmin.ng) served every artifact without the control token: the repository is `internal` in a private organisation, and Werkator asked Gitea with its token and read only the `private` flag.
- Visibility is asked as a visitor (without token); 401/403/404 and a visible `private`/`internal` answer mean private. An unclear answer hides the repository (fail closed, retried after a minute). Artifact routes answer 404 instead of 500 for unknown or hidden names.
- `builds.<name>.publicArtifacts` releases chosen artifacts of a private repository: globs over workspace paths like `artifactDirs`, or `true`. The paths come from the built commit's own `.werkator.yml`; only a branch the primary configuration names literally in that definition's `trigger.branches` publishes.
- Released artifacts answer `server.corsAllowedOrigins` (PR#96) via a Spring `CorsFilter`, preflight included; nothing else carries a CORS header.
PR-doc: `docs/prs/2026-10-04-PR#114-private-artifacts-and-public-paths.md`
🤖 Generated with [Claude Code](https://claude.com/claude-code)
hs.hsadmin.ng on vm4006 served every artifact without the control token:
the repository is internal in a private organisation, so the token's
view said private: false. Werkator now asks without the token, treats
401/403/404 and a visible private/internal answer as private, an
unclear answer as private (asked again after a minute), and answers
404 instead of 500 for an unknown or hidden repository on the artifact
routes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The released paths are read from the built commit's own .werkator.yml,
so they change with the code; a build releases only when the primary
configuration names its branch literally in the definition's
trigger.branches, so no branch can publish its own artifacts. Every
other path of a private repository keeps answering the 404 of an
unknown repository; pages and the artifact index stay hidden.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Spring CorsFilter with a per-request source (ArtifactCors) shares an
artifact with an origin in server.corsAllowedOrigins when everyone may
have it anyway: any artifact of a public repository, a released one of
a private repository. The preflight is answered by the same rule; an
artifact that is not released carries no CORS header, token or not.
publicArtifacts globs are written like artifactDirs (build/reports/...);
ArchivedPaths maps a stored file back to its workspace path by the rule
FileArtifactStore archives with.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
A private repository on vm4006 (hs.hsadmin.ng) served every artifact without the control token: the repository is
internalin a private organisation, and Werkator asked Gitea with its token and read only theprivateflag.private/internalanswer mean private. An unclear answer hides the repository (fail closed, retried after a minute). Artifact routes answer 404 instead of 500 for unknown or hidden names.builds.<name>.publicArtifactsreleases chosen artifacts of a private repository: globs over workspace paths likeartifactDirs, ortrue. The paths come from the built commit's own.werkator.yml; only a branch the primary configuration names literally in that definition'strigger.branchespublishes.server.corsAllowedOrigins(PR#96) via a SpringCorsFilter, preflight included; nothing else carries a CORS header.PR-doc:
docs/prs/2026-10-04-PR#114-private-artifacts-and-public-paths.md🤖 Generated with Claude Code