fix(janitor): dual-org support for the wyre-technology/WYRE-AI fleet split - #66
Merged
Merged
Conversation
…split The *-mcp/node-* fleet moved from entirely under wyre-technology to split across wyre-technology (13 repos) and WYRE-AI (50 repos, conduit included) around 2026-08-24 evening/night. The janitor's repo enumeration was a single-org API call, so it silently kept scanning only the 13 repos still under wyre-technology -- likely the real explanation for a persistent ~80-108-PR "chronic dependabot backlog" multiple scan-mcp-repos cycles reported as steady-state review-gating rather than the janitor simply never reaching those repos. ORG -> ORGS (space-separated, default "wyre-technology WYRE-AI", ORG kept as a back-compat single-org override). REPOS entries are now "org/name" pairs so every downstream gh -R call targets the repo's real org. Verified live: 105 repos in scope (85 WYRE-AI + 20 wyre-technology, the script's actual -mcp$|^mcp|^node- pattern) vs ~20 under the old single-org call. Not fully live yet: the wyre-projects-bot App used for token minting is confirmed NOT installed on WYRE-AI (verified via the installations API). Left the token-minting owner: single-org rather than risk a hard failure on an untested assumption -- documented the exact one-line change needed once the install lands. WYRE-AI repos will show up in the run's Errors section (isolated per-repo auth failures, no crash) until then, which turns a previously-invisible gap into a visible, diagnosable one.
asachs01
force-pushed
the
fix/dependabot-janitor-dual-org
branch
from
August 27, 2026 15:56
aa6204a to
404f71e
Compare
Member
Author
|
Disclosure: this is my own PR from 2026-08-25 (forge) — flagging that rather than presenting a fresh review of unfamiliar work. Native approve is blocked by shared identity regardless, so this is a currency re-check instead of an independent review:
|
6 tasks
asachs01
added a commit
that referenced
this pull request
Aug 31, 2026
…ent overlap (#69) Three open PRs (#26, #50, #54) all showed mergeable=CONFLICTING against current main. None of their real changes overlap line-for-line — the conflicts are purely stale-diff artifacts of main having moved on since each PR's fork point (#66's dual-org repo-enumeration restructure in particular). This reapplies all three fixes' actual intent by hand onto current main, in dependency order (both #50 and #54 touch dependabot-janitor.sh). #54 (classify() group-PR hardening, supersedes #23): a Dependabot "group" PR title no longer proves minor/patch. classify() now fetches the PR body via REST and requires every per-dependency "from A to B" marker to be same-major, failing closed otherwise. Reapplied verbatim except the body fetch now calls `repos/$repo/pulls/$num` directly (since $repo is already "org/name" post-#66) instead of #54's original `repos/$ORG/$repo/...`. Adds dependabot-janitor.test.sh (14 assertions, real fixtures) — verified byte-identical to #54's original test file aside from that same $ORG-> $repo adaptation; all 14 assertions pass unmodified. #50 (cortextos/conduit scope carve-out): reapplied by hand onto the current multi-org enumeration loop (#66) rather than #50's own stale single-org grep pipeline — added `|^cortextos$|^conduit$` to the still-present grep -E inside the `for _org in $ORGS` loop. #26 (mcp-server-release.yml always() gating): the release job's "Detect released version" step now runs with `if: always()`, and the docker job's gate is `if: always() && needs.release.outputs.released == 'true'`, so a non-fatal failure after semantic-release cuts a release (e.g. a flaky git-notes push) can't silently skip artifact publishing. Investigated the apparent second `id: detect` in the current file: it is an unrelated step in the (post-#26) mcpb job that checks for a pack:mcpb script, not a duplicate release-detection block — #26's fix applies to exactly the one occurrence it always targeted. Flagged in the CHANGELOG that mcpb's own released=='true' gate has an analogous latent exposure, left out of scope here since it predates neither #26 nor this reconciliation. Verified: shellcheck clean on dependabot-janitor.sh (baseline was already clean); dependabot-janitor.test.sh carries only pre-existing info-level notices inherited from #54's original file (one pre-existing SC2034 warning was fixed by dropping the now-unused $ORG var); all 14 tests pass; mcp-server-release.yml parses as valid YAML. Refs: #26, #50, #54
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The -mcp/node- fleet moved from being entirely under
wyre-technologyto being split acrosswyre-technology(13 repos) andWYRE-AI(50 repos,conduitincluded) sometime around 2026-08-24 evening/night — confirmed via org repo listings and org IDs, not inferred.dependabot-janitor.sh's repo enumeration was a single-org API call (ORG, defaulting towyre-technology, and the workflow explicitly pinned it there), so it silently kept scanning only the 13 repos still underwyre-technology— no error, just 50 of 63 repos never looked at.This is almost certainly the real explanation for a persistent ~80-108-PR "chronic dependabot backlog" that multiple
scan-mcp-reposcycles reported today as steady-state review-gating — it wasn't; the janitor simply never reached most of those repos.Fix
ORG→ORGS(space-separated org list, default"wyre-technology WYRE-AI";ORGkept as a back-compat single-org override).REPOSentries are now"org/name"pairs, not bare names — every downstreamgh ... -Rcall now targets the repo's actual org directly, rather than assuming one global org.EXCLUDE_REPOSstill matches on the bare repo name (unchanged behavior), now via anawkfilter that's org-agnostic.ORG: ${{ github.repository_owner }}env line, which was silently overriding the script's ownORGSdefault back down to a single org — without this the script fix would have done nothing in production.Verified live (read-only, before writing any code): the new enumeration logic finds 105 repos in scope (85 WYRE-AI + 20 wyre-technology, using the script's actual
-mcp$|^mcp|^node-pattern, which is broader than just the*-mcpfleet) vs. the ~20 the old single-org call would find.Known gap, left visible rather than silently forced
Not fully live yet — one line still gates it. Checked live via
gh api orgs/WYRE-AI/installations: thewyre-projects-botApp (the oneAPP_ID/APP_PRIVATE_KEYmint tokens for) is not installed on WYRE-AI — onlydigitalocean,blacksmith-sh,vanta-with-task-management, and twoinfisicalapps are.Adding
WYRE-AIto the token-minting step'sowner:before that install exists risks failing token minting outright rather than degrading gracefully to a partial-org token — untested behavior ofactions/create-github-app-token, and not worth risking the currently-workingwyre-technologyhalf of the janitor to find out. Soowner:is left single-org for now, with the exact one-line change (addWYRE-AIto a newline-separatedowner:list) documented inline in the workflow for whoever does the App install.In the interim,
ORGSalready includesWYRE-AI, so everyWYRE-AIrepo will show up in each run's Errors section (pr list failed, an auth failure) until the install lands. This is expected and isolated per-repo — no crash, no effect onwyre-technologyrepos' processing — and turns a previously-invisible gap (silently scanning 13/63 with no error) into a visible, diagnosable one in the workflow's own summary output.Ripples worth noting (per boss)
*-mcprepos underwyre-technology— correct at the time, and its conclusions still hold, but a straight rerun of that samewyre-technology-only recipe today would only find 13. Anyone rerunning that verification needs the dual-org enumeration too.scan-mcp-reposcron prompts, any stale-PR sweep, anything that does a full-org repo listing. Per-repoghcalls (PR view, run list, etc.) already survive the split via GitHub's transfer redirect; only enumeration is affected. Flagging so this isn't treated as a one-off fix specific to the janitor.Verification
bash -non the script: syntax OK.python3 -c "import yaml; yaml.safe_load(...)"on the workflow: valid.REPOSenumeration end-to-end against real org data (read-onlygh apicalls, no merges/mutations): 105 repos found, correctly split 85/20 across the two orgs,WYRE-AI/timezest-mcppresent,EXCLUDE_REPOSfiltering verified correct on a synthetic multi-org test case.wyre-technologywasn't necessary to verify this specific fix.Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is enabled.