fix(metadata): drop orphan private repo entries blocking data merge#3394
Merged
Conversation
Two private entries in metadata/repos.yaml resolve to GraphQL NOT_FOUND (R_kgDOSVJgdw, R_kgDOSZ9x-w) — the repos were deleted or the App lost access. The fail-closed privacy gate in check-wiki-private-presence.ts could not verify them, blocking the weekly Merge Data Branch workflow. Also fix error classification: gh api graphql exits non-zero on NOT_FOUND, so execFileSync threw before the code could read the data.node: null body, mislabeling node-lifecycle failures as subprocess-threw (network/auth). The catch block now inspects captured output via isNotFoundSignal and classifies NOT_FOUND as node-null, so future orphans point operators at repo lifecycle instead of transport. Refs #3375
There was a problem hiding this comment.
Pull request overview
This PR unblocks the Merge Data Branch privacy gate by removing two orphaned private repo metadata entries and improving diagnostics for GraphQL NOT_FOUND responses from gh api graphql.
Changes:
- Removed two unreachable
[REDACTED]private repository placeholders frommetadata/repos.yaml. - Added
isNotFoundSignal()handling so non-zeroghexits containingNOT_FOUNDare classified asnode-null. - Added tests for NOT_FOUND classification, transport errors, and helper behavior.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
scripts/check-wiki-private-presence.ts |
Improves failure classification for captured GraphQL NOT_FOUND output. |
scripts/check-wiki-private-presence.test.ts |
Adds coverage for new classification paths and helper behavior. |
metadata/repos.yaml |
Removes the two orphan private repository entries blocking the privacy gate. |
marcusrbrown
approved these changes
Jun 1, 2026
Copilot AI
added a commit
that referenced
this pull request
Jun 1, 2026
Co-authored-by: marcusrbrown <831617+marcusrbrown@users.noreply.github.com>
marcusrbrown
pushed a commit
that referenced
this pull request
Jun 1, 2026
…e-repo list for privacy gate (#3395) * fix(workflow): use main's metadata/repos.yaml for privacy check Co-authored-by: marcusrbrown <831617+marcusrbrown@users.noreply.github.com> * fix(metadata): drop orphan private repo entries blocking data merge R_kgDOSVJgdw and R_kgDOSZ9x-w resolve to GraphQL NOT_FOUND (deleted repos / lost App access). Already removed from main by PR #3394; this ensures the copilot branch is also clean before the PR is opened. Refs #3375 Co-authored-by: marcusrbrown <831617+marcusrbrown@users.noreply.github.com> * chore: sync files from main to match PR #3394 and #3389 Co-authored-by: marcusrbrown <831617+marcusrbrown@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
marcusrbrown
pushed a commit
that referenced
this pull request
Jun 1, 2026
* chore(data): restore data branch * chore(reconcile): +0 new, 4 pending-review, 0 lost-access, 1 refreshes * feat(knowledge): survey marcusrbrown/marcusrbrown * chore(reconcile): record survey success for marcusrbrown/marcusrbrown * feat(knowledge): survey marcusrbrown/marcusrbrown.github.io * chore(reconcile): record survey success for marcusrbrown/marcusrbrown.github.io * chore(reconcile): onboard bfra-me/works (pending) * chore(reconcile): onboard bfra-me/ha-addon-repository (pending) * chore(reconcile): onboard bfra-me/.github (pending) * chore(reconcile): onboard bfra-me/renovate-action (pending) * feat(knowledge): survey marcusrbrown/marcusrbrown * chore(reconcile): record survey success for marcusrbrown/marcusrbrown * feat(knowledge): survey marcusrbrown/marcusrbrown.github.io * chore(reconcile): record survey success for marcusrbrown/marcusrbrown.github.io * feat(knowledge): survey marcusrbrown/marcusrbrown * chore(reconcile): record survey success for marcusrbrown/marcusrbrown * feat(knowledge): survey marcusrbrown/marcusrbrown.github.io * chore(reconcile): record survey success for marcusrbrown/marcusrbrown.github.io * chore(reconcile): +0 new, 0 pending-review, 0 lost-access, 4 refreshes * feat(knowledge): survey bfra-me/ha-addon-repository * chore(reconcile): record survey success for bfra-me/ha-addon-repository * feat(knowledge): survey bfra-me/renovate-action * chore(reconcile): record survey success for bfra-me/renovate-action * chore(reconcile): record survey failure for bfra-me/works * feat(knowledge): survey bfra-me/.github * chore(reconcile): record survey success for bfra-me/.github * feat(knowledge): survey bfra-me/works * chore(reconcile): record survey success for bfra-me/works * feat(knowledge): survey marcusrbrown/mrbro.dev * chore(reconcile): record survey success for marcusrbrown/mrbro.dev * feat(knowledge): survey marcusrbrown/opencode-copilot-delegate * chore(reconcile): record survey success for marcusrbrown/opencode-copilot-delegate * feat(knowledge): survey fro-bot/agent * chore(reconcile): record survey success for fro-bot/agent * feat(knowledge): survey fro-bot/systematic * chore(reconcile): record survey success for fro-bot/systematic * feat(knowledge): survey marcusrbrown/sparkle * chore(reconcile): record survey success for marcusrbrown/sparkle * feat(knowledge): survey marcusrbrown/renovate-config * chore(reconcile): record survey success for marcusrbrown/renovate-config * chore(reconcile): +0 new, 0 pending-review, 0 lost-access, 2 refreshes * feat(knowledge): survey fro-bot/fro-bot.github.io * chore(reconcile): record survey success for fro-bot/fro-bot.github.io * feat(knowledge): survey marcusrbrown/.dotfiles * chore(reconcile): record survey success for marcusrbrown/.dotfiles * feat(knowledge): survey marcusrbrown/containers * chore(reconcile): record survey success for marcusrbrown/containers * feat(knowledge): survey marcusrbrown/.github * chore(reconcile): record survey success for marcusrbrown/.github * feat(knowledge): survey marcusrbrown/esphome.life * chore(reconcile): record survey success for marcusrbrown/esphome.life * feat(knowledge): survey marcusrbrown/extend-vscode * chore(reconcile): record survey success for marcusrbrown/extend-vscode * feat(knowledge): survey marcusrbrown/gpt * chore(reconcile): record survey success for marcusrbrown/gpt * feat(knowledge): survey marcusrbrown/infra * chore(reconcile): record survey success for marcusrbrown/infra * chore(metadata): add marcusrbrown/cortexkit_anthropic-auth from invitation polling * feat(knowledge): survey marcusrbrown/cortexkit_anthropic-auth * chore(reconcile): record survey success for marcusrbrown/cortexkit_anthropic-auth * chore(reconcile): +0 new, 0 pending-review, 0 lost-access, 1 refreshes * feat(knowledge): survey marcusrbrown/tokentoilet * chore(reconcile): record survey success for marcusrbrown/tokentoilet * feat(knowledge): survey marcusrbrown/systematic * chore(reconcile): record survey success for marcusrbrown/systematic * feat(knowledge): survey marcusrbrown/vbs * chore(reconcile): record survey success for marcusrbrown/vbs * feat(knowledge): survey marcusrbrown/ha-config * chore(reconcile): record survey success for marcusrbrown/ha-config * feat(knowledge): survey bfra-me/.github * chore(reconcile): record survey success for bfra-me/.github * feat(knowledge): survey bfra-me/ha-addon-repository * chore(reconcile): record survey success for bfra-me/ha-addon-repository * feat(knowledge): survey bfra-me/works * chore(reconcile): record survey success for bfra-me/works * chore(reconcile): record survey failure for bfra-me/renovate-action * chore(metadata): remove stale private-repo orphans blocking data promotion Drop the two private-repo orphan entries (node_id R_kgDOSVJgdw and R_kgDOSZ9x-w) already deleted from main in #3394. They were the privacy gate violations blocking the data->main promotion in #3396. repos.yaml now holds 26 entries with zero private: true. --------- Co-authored-by: fro-bot[bot] <109017866+fro-bot[bot]@users.noreply.github.com> Co-authored-by: Fro Bot <80104189+fro-bot@users.noreply.github.com>
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.
What
The scheduled Merge Data Branch workflow is fail-closed at 🔒 Block private wiki pages.
scripts/check-wiki-private-presence.tscould not verify two private entries inmetadata/repos.yaml:Root cause
Both node IDs resolve to GraphQL
NOT_FOUND:The repos were deleted or the App's installation lost access. They sit in
repos.yamlas orphan placeholders —owner: '[REDACTED]',nameequal to the node_id,onboarding_status: pending— never fully onboarded, now unreachable.The diagnostic also mislabeled the failure class.
gh api graphqlexits non-zero whenever the response carries a top-levelerrorsarray — including the benignNOT_FOUNDthat ships alongside a validdata.node: null.execFileSynctherefore threw before the code could readdata.node, and thecatchdefaulted every such failure tosubprocess-threw(network/rate-limit/auth). The real cause — repo lifecycle — was masked.Changes
metadata/repos.yaml. This unblocks the weekly merge.reconcile-repos.tswould eventually prune them on its daily cron (it already has lost-access handling for[REDACTED]entries), but the privacy gate fails before reconcile runs.check-wiki-private-presence.ts. Thecatchblock now inspects the thrown subprocess's captured stdout/stderr via a newisNotFoundSignalhelper and classifies aNOT_FOUND/data.node: nullbody asnode-null("investigate repo lifecycle/App access") instead ofsubprocess-threw. Genuine transport errors (HTTP 401 with no body) still classify assubprocess-threw.isNotFoundSignalunit tests. 31 tests pass.The gate stays fail-closed by design — this only sharpens why it fails so the next orphan points operators at the right place.
Verification
vitest run scripts/check-wiki-private-presence.test.ts— 31 passedtsc --noEmit— cleannode scripts/check-wiki-private-presence.tsagainst the fixedrepos.yaml— exits 0 (remaining repos resolve cleanly, no leaks)Note
The privacy check reads
repos.yamlfrom thedatabranch in the workflow (working-directory: data-branch-check). Once this merges tomain, the nextdata→mainsync reconciles the two branches; reconcile's lost-access path keeps them aligned. If the next scheduled merge still trips on the data-branch copy, a manualdatabranch sync may be needed.Refs #3375
🤖 Generated by Fro Bot