Skip to content

docs(skills): capture zot sync-prefix and merge-queue deadlock patterns - #655

Merged
castrojo merged 1 commit into
mainfrom
docs/session-learnings
Aug 14, 2026
Merged

docs(skills): capture zot sync-prefix and merge-queue deadlock patterns#655
castrojo merged 1 commit into
mainfrom
docs/session-learnings

Conversation

@castrojo

Copy link
Copy Markdown
Collaborator

Skill write-back from an egress-audit session. Docs-only — no code, no manifests.

Three patterns that each cost real debugging time this session:

1. Zot sync prefixes filter on-demand pulls → docs/skills/cluster-tooling/zot-sync.md (new)

Verified against upstream (/project-zot/zot, examples/README.md): the sync content[] list is "which content to periodically pull, also it's used for filtering ondemand images". Narrowing it changes what the cluster can pull at all.

The verification trap, which nearly produced a false outage call:

Symptom Meaning
Fast 404/denied Prefix not allowed — a real break
Hangs for minutes Prefix is allowed; Zot is syncing every blob

A multi-GB bootc image legitimately exceeds a 300s timeout, so skopeo inspect timing out proves nothing. Read zot_repo_downloads_total and check for an absent error series instead.

Also documented: the NodePort is a LAN address, unreachable while the workstation is on Tailscale even though kubectl works. That presents as "every pull is broken." Port-forward the Service.

2. Baseline failures deadlock the merge queue → docs/ops/merge-queue.md

main was un-mergeable for everyone: every PR failed test-validation on the same 7 pre-existing failures, and each fix-PR cleared only a subset, so none could go green. Splitting fixes across PRs makes this worse. Land one test-only PR that greens the whole suite; use xfail(strict=False) for assertions encoding unimplemented policy rather than deleting them. Fixed this session in #654.

3. K8sGPT reports symptoms, not causes → docs/skills/cluster-tooling/SKILL.md

A controller burning sustained throughput was flagged alongside a broken Ingress on the same resource. The Ingress was genuinely misconfigured but entirely inert — the real cause was an optimistic-concurrency requeue loop on a resource reporting Ready=True throughout. Fixing the Ingress would have changed nothing. Two distinguishing signals are recorded: Ready=True means that resource is not what is failing, and a genuine cause shows matching error frequency in the logs.

Housekeeping

Split the Zot content into a deep-dive file per the existing ## Deep-dive topics convention — SKILL.md ends up smaller than before this change (425 → 454 including the new K8sGPT and Red Flag entries, versus 508 unsplit). Added matching ## Red Flags and ## Verification entries per the canonical skill spec.

Validation: just lint passes, validate-docs.py passes, no cluster IPs introduced.

Co-authored-by: Copilot [email protected]

Three durable patterns from an egress-audit session, each of which cost real
debugging time and would otherwise be rediscovered.

docs/skills/cluster-tooling/zot-sync.md (new deep-dive):
- The sync `content[]` prefix list also filters on-demand pulls, verified
  against upstream (/project-zot/zot examples/README.md). Narrowing it is a
  cluster-wide change: an omitted prefix is a failed pull, not a slow one.
- `skopeo inspect` is not a valid pass/fail signal. A blocked prefix 404s
  fast; an allowed one hangs while Zot syncs every blob, so a timeout proves
  nothing. Verify with `zot_repo_downloads_total` and the absence of an error
  series instead.
- The NodePort is a LAN address and is unreachable while the workstation is on
  Tailscale, even though kubectl works. This presents as "every pull is
  broken"; port-forward the Service instead.

docs/ops/merge-queue.md:
- Pre-existing test failures on main deadlock every open PR: each fix clears
  only a subset, so its own required check still fails and it can never merge.
  Confirm against a clean worktree, then land one test-only PR that greens the
  whole suite. Use xfail(strict=False) for assertions encoding unimplemented
  policy rather than deleting them.

docs/skills/cluster-tooling/SKILL.md:
- K8sGPT reports symptoms, not causes. A Ready=True resource is not the thing
  failing; confirm causation in controller logs before acting on a finding.
- Split the Zot section into a deep-dive per the existing convention, keeping
  SKILL.md smaller than before this change.

Co-authored-by: Copilot <[email protected]>
@castrojo
castrojo enabled auto-merge August 13, 2026 23:54
@castrojo
castrojo added this pull request to the merge queue Aug 13, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 13, 2026
@castrojo
castrojo added this pull request to the merge queue Aug 14, 2026
Merged via the queue into main with commit a827f0e Aug 14, 2026
2 checks passed
@castrojo
castrojo deleted the docs/session-learnings branch August 14, 2026 00:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant