Every push to main previously ran a full Docker build + push. Pushes confined to .planning/** (GSD planning docs push straight to main under the unprotected .planning/* branch-protection pattern) or .gitea/** (CI/workflow edits merged via PR) produce a byte-identical image — .dockerignore already excludes .planning. The rebuild and :latest re-push were wasted runner time.
Behavior
Push touching only .gitea/** and/or .planning/** → publish job skipped.
Push touching code / Dockerfile / manifests (alone or mixed with docs) → publish runs as before. paths-ignore skips only when every changed file matches.
Merging this PR is itself a .gitea-only push, so it will correctly not trigger a publish.
Verification
YAML parses; on.push carries both branches: [main] and paths-ignore: ['.gitea/**', '.planning/**']; the publish job is intact.
The in-workflow grep "--target production" D-10 hygiene self-assertion still matches.
Quick task 260613-fp9.
## What
Adds a `paths-ignore` filter to the `push` trigger in `.gitea/workflows/publish.yml`:
```yaml
on:
push:
branches: [main]
paths-ignore:
- '.gitea/**'
- '.planning/**'
```
## Why
Every push to `main` previously ran a full Docker build + push. Pushes confined to `.planning/**` (GSD planning docs push straight to main under the unprotected `.planning/*` branch-protection pattern) or `.gitea/**` (CI/workflow edits merged via PR) produce a byte-identical image — `.dockerignore` already excludes `.planning`. The rebuild and `:latest` re-push were wasted runner time.
## Behavior
- Push touching only `.gitea/**` and/or `.planning/**` → `publish` job skipped.
- Push touching code / Dockerfile / manifests (alone or mixed with docs) → `publish` runs as before. `paths-ignore` skips only when **every** changed file matches.
Merging this PR is itself a `.gitea`-only push, so it will correctly not trigger a publish.
## Verification
- YAML parses; `on.push` carries both `branches: [main]` and `paths-ignore: ['.gitea/**', '.planning/**']`; the `publish` job is intact.
- The in-workflow `grep "--target production"` D-10 hygiene self-assertion still matches.
Quick task 260613-fp9.
Add paths-ignore ['.gitea/**', '.planning/**'] to publish.yml's push
trigger. Doc/CI-only pushes to main (planning docs push straight to main;
workflow edits merge via PR) produce a byte-identical image (.dockerignore
already excludes .planning), so the build + :latest re-push was wasted.
paths-ignore skips only when every changed file matches; mixed code+docs
pushes still publish.
dorny/paths-filter combines patterns with Array.some, and picomatch compiles
'!.gitea/**' as 'any path not under .gitea'. The '- !.gitea/**' line (from
quick task 260613-dmw) therefore matched every non-.gitea file — including
.planning/** and *.md — so code=true for doc-only PRs and the heavy api/harness
jobs ran anyway. It also never excluded .gitea (the **/*.yml glob already
matched workflow files), regressing the Phase 15 doc-only skip.
Switch to predicate-quantifier 'every' with negation-only globs: a file counts
as code only if it is outside .gitea/, outside .planning/, and not Markdown.
Verified with picomatch against representative file sets.
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.
What
Adds a
paths-ignorefilter to thepushtrigger in.gitea/workflows/publish.yml:Why
Every push to
mainpreviously ran a full Docker build + push. Pushes confined to.planning/**(GSD planning docs push straight to main under the unprotected.planning/*branch-protection pattern) or.gitea/**(CI/workflow edits merged via PR) produce a byte-identical image —.dockerignorealready excludes.planning. The rebuild and:latestre-push were wasted runner time.Behavior
.gitea/**and/or.planning/**→publishjob skipped.publishruns as before.paths-ignoreskips only when every changed file matches.Merging this PR is itself a
.gitea-only push, so it will correctly not trigger a publish.Verification
on.pushcarries bothbranches: [main]andpaths-ignore: ['.gitea/**', '.planning/**']; thepublishjob is intact.grep "--target production"D-10 hygiene self-assertion still matches.Quick task 260613-fp9.