Repository navigation
ci: delete the detectNewJavaFiles workflow (XNT-200) - #16
Conversation
It runs on `ubuntu-latest-low`, a label this organisation does not have, so the job is never assigned a runner and never reaches a terminal state. A non-terminal job holds its whole run non-terminal, so every pull request in this repository sits permanently one check short of green with no error to read. It was visibly doing this to PR #14, which had to be merged by hand, and it is doing it to PR #15 right now. The workflow has never once produced a verdict in this fork. Fifteen runs since 2026-09-07: fourteen `cancelled` and one still `queued`, no successes. The `cancelled` conclusion is its own trap — it reads as though someone cancelled the run, when in fact the concurrency group superseded a job that was still waiting for a runner that was never coming. Deleted rather than repointed, following XNT-124 which deleted this same file from files-android. Disabling it was the other candidate; deletion was chosen so the fork diff states the decision rather than hiding it in repository settings. CONTRIBUTING.md advertised this workflow as the thing that enforces the Kotlin-only rule for new files. That claim was false for the entire life of the fork, so it is corrected here rather than left pointing at a deleted file: the rule stands, as a review convention. One correction to the ticket, which argued against repointing to `ubuntu-latest` on the grounds that it would fail permanently because the repo contains `.java` files. It would not. The script only inspects `files_added`, so the 178 `.java` files already present are irrelevant and it would only fail on a pull request that adds a new one. The reason to delete is XNT-124 precedent and the Kotlin-first posture, not that. Assisted-by: ClaudeCode:claude-opus-5 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Correcting a misleading line in my own PR description, flagged by another session working on PR #15. My table above is headed "Why it does not block a PR" and that column is accurate — but read quickly it gives four workflows a clean bill of health, and one of them does not deserve it.
It does not change anything this PR claims.
The audit trap worth writing down: Still out of scope for this PR by instruction, and I am not widening it unilaterally. Raised with the orchestrator to decide between widening XNT-200 or a follow-up ticket; 🤖 Generated with Claude Code |
|
Retracting the What I got wrong. I wrote that
So there is no backstop there to remove, and fixing that label cannot endanger this deletion. The actual reason the reversibility argument holds, which is stronger. That matters because my original framing made the backstop contingent on a broken workflow staying broken — which would have been a genuinely fragile thing to rely on. It isn't. Mandatory human review of sync PRs is the designed state, documented at the point it is enforced, and it does not depend on any dead runner label. One thing I found while checking, which cuts the other way. That matters for the label sweep, not for this PR. Nothing in this retraction changes what this PR does or the terminal-state evidence for it. 🤖 Generated with Claude Code |
Closes XNT-200.
The problem
detectNewJavaFiles.ymlruns onubuntu-latest-low, a label this organisation does not have. The job is never assigned a runner, never reaches a terminal state, and a non-terminal job holds its whole run non-terminal. So every pull request in this repository sits permanently one check short of green, with no error to read. It did this to PR #14, which had to be merged by hand, and it is doing it to PR #15 right now.Unlike the other four
ubuntu-latest-lowworkflows in this repo, this one has no guard:pull_request, noif:, so it is scheduled on every PR and then waits forever.It has never worked here, not once
15 runs since 2026-09-07 — 14
cancelled, 1 stillqueued, zero successes.The
cancelledconclusion is its own trap. It reads as though someone cancelled the run; what actually happened is the concurrency group superseded a job still waiting for a runner that was never coming. Nothing in the signal says "this cannot run".Why delete rather than disable or repoint
files-android. Chosen. The fork diff states the decision instead of hiding it in repository settings, andCONTRIBUTING.mdcan be corrected in the same commit.gh workflow disable— zero fork diff and survives upstream syncs better, but leavesCONTRIBUTING.mdadvertising a check that silently does nothing.ubuntu-latest— rejected.One correction to the ticket on that last option. It argued repointing would fail permanently because the repo contains
.javafiles. It would not. The script only inspectssteps.file_changes.outputs.files_added, so the 178.javafiles already present are irrelevant; it would only fail on a PR that adds a new one. The reason to delete is the XNT-124 precedent and the Kotlin-first posture, not that.CONTRIBUTING.md
CONTRIBUTING.mdlinked this workflow as the thing that enforces the Kotlin-only rule for new source files. That claim has been false for the entire life of the fork — the check never produced a verdict. Rather than leave a link to a deleted file, the rule now stands as a review convention and the section says so. The rule itself is unchanged.If an upstream sync re-adds the file
This was the stated argument against deletion, so it deserves an answer rather than silence. Deletion is not self-protecting; a sync merge can reintroduce the file. Two things would surface it:
main.xenia-upstream-sync.ymlpushes toupstream-sync/mainand opens a PR via the REST API (PRs Upstream sync: 57 new commit(s) from nextcloud/notes-android #7 and Upstream sync: 8 new commit(s) from nextcloud/notes-android #13 are the precedent), so a reintroduced file appears in that PR's diff for review.Worth being precise about the limit: notice (2) depends on someone reading the sync PR's checks, and
autoApproveSync.ymlis itself onubuntu-latest-lowso it never auto-approves anything here — sync PRs need manual attention today, which is what makes (1) reliable. If sync auto-approval is ever fixed, this deletion loses its backstop and would want a positive guard instead. Flagging, not fixing — out of scope here.The other four
ubuntu-latest-lowworkflows are out of scope, and confirmed harmlessChecked rather than assumed, because deleting this file only meets the goal if nothing else blocks terminal state:
pr-feedback.ymlscheduleonly, plusif: github.repository_owner == 'nextcloud'stale.ymlscheduleonlyautoApproveSync.ymlif:requires thesynclabel andgithub.actor == 'nextcloud-android-bot'renovate-approve-merge.ymlif:requiresrenovate[bot]; no renovate config in this forkThe distinction that matters: a job-level
if:is evaluated before runner assignment, so a false guard yieldsskipped— which is terminal.detectNewJavaFileshas no guard, which is why it queues instead. PR #15 shows both halves empirically:Auto approve syncandauto-approve-mergereportskipping, whiledetectNewJavaFilesreportspending 0.Caveat for whoever picks up XNT-193's per-file decision:
renovate-approve-mergeandautoApproveSyncwould hang on a PR that does match their guard. Neither actor is active in this fork today, so neither blocks anything now.Evidence
Before — PR #15 (
xnt197-conflict-marker-guard, not mine), read live:After — the checks on this PR, below. Because the workflow file is deleted in this branch,
detectNewJavaFilesis not scheduled at all, and every check should reach a terminal state. That is the actual goal; the file being gone is only the means.🤖 Generated with Claude Code