Skip to content

fix(metadata): drop orphan private repo entries blocking data merge#3394

Merged
marcusrbrown merged 1 commit into
mainfrom
fix/merge-data-orphan-private-repos
Jun 1, 2026
Merged

fix(metadata): drop orphan private repo entries blocking data merge#3394
marcusrbrown merged 1 commit into
mainfrom
fix/merge-data-orphan-private-repos

Conversation

@fro-bot
Copy link
Copy Markdown
Owner

@fro-bot fro-bot commented Jun 1, 2026

What

The scheduled Merge Data Branch workflow is fail-closed at 🔒 Block private wiki pages. scripts/check-wiki-private-presence.ts could not verify two private entries in metadata/repos.yaml:

[subprocess-threw] R_kgDOSVJgdw
[subprocess-threw] R_kgDOSZ9x-w

Root cause

Both node IDs resolve to GraphQL NOT_FOUND:

Could not resolve to a node with the global id of 'R_kgDOSVJgdw'.
Could not resolve to a node with the global id of 'R_kgDOSZ9x-w'.

The repos were deleted or the App's installation lost access. They sit in repos.yaml as orphan placeholders — owner: '[REDACTED]', name equal to the node_id, onboarding_status: pending — never fully onboarded, now unreachable.

The diagnostic also mislabeled the failure class. gh api graphql exits non-zero whenever the response carries a top-level errors array — including the benign NOT_FOUND that ships alongside a valid data.node: null. execFileSync therefore threw before the code could read data.node, and the catch defaulted every such failure to subprocess-threw (network/rate-limit/auth). The real cause — repo lifecycle — was masked.

Changes

  • Remove the two orphan entries from metadata/repos.yaml. This unblocks the weekly merge. reconcile-repos.ts would eventually prune them on its daily cron (it already has lost-access handling for [REDACTED] entries), but the privacy gate fails before reconcile runs.
  • Fix error classification in check-wiki-private-presence.ts. The catch block now inspects the thrown subprocess's captured stdout/stderr via a new isNotFoundSignal helper and classifies a NOT_FOUND / data.node: null body as node-null ("investigate repo lifecycle/App access") instead of subprocess-threw. Genuine transport errors (HTTP 401 with no body) still classify as subprocess-threw.
  • Tests: added coverage for the non-zero-exit-carrying-NOT_FOUND path, the transport-error path, and isNotFoundSignal unit 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 passed
  • tsc --noEmit — clean
  • node scripts/check-wiki-private-presence.ts against the fixed repos.yaml — exits 0 (remaining repos resolve cleanly, no leaks)

Note

The privacy check reads repos.yaml from the data branch in the workflow (working-directory: data-branch-check). Once this merges to main, the next datamain sync 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 manual data branch sync may be needed.

Refs #3375

Run Summary — dispatch #26728562097 (workflow_dispatch)

  • Diagnosis: R_kgDOSVJgdw and R_kgDOSZ9x-w resolve to GraphQL NOT_FOUND (deleted repos / lost App access). Orphan placeholders in metadata/repos.yaml.
  • Fix: removed both orphan entries; reclassified gh non-zero NOT_FOUND exits as node-null instead of subprocess-threw.
  • Checks: vitest (31 passed) + tsc + live privacy check all green.

🤖 Generated by Fro Bot

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
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 from metadata/repos.yaml.
  • Added isNotFoundSignal() handling so non-zero gh exits containing NOT_FOUND are classified as node-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 marcusrbrown enabled auto-merge (squash) June 1, 2026 00:58
@marcusrbrown marcusrbrown merged commit 7aecdf0 into main Jun 1, 2026
14 checks passed
@marcusrbrown marcusrbrown deleted the fix/merge-data-orphan-private-repos branch June 1, 2026 00:59
Copilot AI added a commit that referenced this pull request Jun 1, 2026
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>
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>
fro-bot added a commit that referenced this pull request Jun 1, 2026
…otion

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.
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>
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.

3 participants