|
| 1 | +# SPDX-License-Identifier: PMPL-1.0-or-later |
| 2 | +# Metadatastician Transfer Plan |
| 3 | +# Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) |
| 4 | +# |
| 5 | +# Purpose: move private hyperpolymath repos that can tolerate |
| 6 | +# enterprise-internal visibility into The-Metadatastician org, |
| 7 | +# where GitHub Advanced Security (GHAS) coverage is available |
| 8 | +# on the Enterprise plan. Repos remain non-public; they gain |
| 9 | +# code scanning, secret scanning, and dependency review. |
| 10 | +# |
| 11 | +# Current posture: |
| 12 | +# - The-Metadatastician (login: `The-Metadatastician`) is on Enterprise |
| 13 | +# plan (999999 private repos, 50 seats, 1 filled). Owns 1 private + 2 public. |
| 14 | +# - hyperpolymath org holds 10 private repos (1 archived, 9 active). |
| 15 | +# - User is owner of both orgs (transfer authorisation available). |
| 16 | +# |
| 17 | +# Irreversibility profile (per `git remote` redirect): GitHub keeps |
| 18 | +# old URLs redirecting indefinitely, so SSH/HTTPS refs keep working. BUT: |
| 19 | +# CI webhooks that point at the org-name path (rare), hard-coded owner |
| 20 | +# references in workflow `uses:` (none for hyperpolymath-authored code), |
| 21 | +# and mirror-sync targets may need URL updates. |
| 22 | + |
| 23 | +@abstract: |
| 24 | +Transfer plan for the 4 low-sensitivity private hyperpolymath repos that |
| 25 | +are good candidates for Metadatastician-internal status (unlocks GHAS). |
| 26 | +Four repos explicitly excluded as always-private (007, .git-private-farm, |
| 27 | +hyperpolymath-sovereign-registry, blog-drafts). One archived (polystack), |
| 28 | +one workspace-root (repos-monorepo) also excluded. |
| 29 | +@end |
| 30 | + |
| 31 | +## Inventory — 10 private hyperpolymath repos |
| 32 | + |
| 33 | +[[inventory]] |
| 34 | +name = "007" |
| 35 | +exclude = true |
| 36 | +reason = "always-private per memory: Claude-only language repo, agent meta-language" |
| 37 | +last_push = "2026-04-17" |
| 38 | + |
| 39 | +[[inventory]] |
| 40 | +name = ".git-private-farm" |
| 41 | +exclude = true |
| 42 | +reason = "always-private per memory: hookset-sync hub with sensitive manifest data" |
| 43 | +last_push = "2026-04-16" |
| 44 | + |
| 45 | +[[inventory]] |
| 46 | +name = "hyperpolymath-sovereign-registry" |
| 47 | +exclude = true |
| 48 | +reason = "always-private per memory: sovereign registry; decisional/governance content" |
| 49 | +last_push = "2026-04-17" |
| 50 | + |
| 51 | +[[inventory]] |
| 52 | +name = "blog-drafts" |
| 53 | +exclude = true |
| 54 | +reason = "always-private per memory: unpublished blog drafts; premature disclosure risk" |
| 55 | +last_push = "2026-04-17" |
| 56 | + |
| 57 | +[[inventory]] |
| 58 | +name = "polystack" |
| 59 | +exclude = true |
| 60 | +reason = "archived; superseded by boj-server. No ongoing security-signal value from transfer." |
| 61 | +last_push = "2026-04-04" |
| 62 | + |
| 63 | +[[inventory]] |
| 64 | +name = "repos-monorepo" |
| 65 | +exclude = true |
| 66 | +reason = "Eclipse-drive workspace-root wrapper; submodule pointer tracker. Transferring changes origin for every submodule consumer. Too high-blast for this pass." |
| 67 | +last_push = "2026-04-17" |
| 68 | +review_next_pass = true |
| 69 | + |
| 70 | +[[inventory]] |
| 71 | +name = "ipv6-only" |
| 72 | +exclude = false |
| 73 | +candidate = true |
| 74 | +size_kb = 45138 |
| 75 | +description = "IPv6-only network profile tool (aerie/network). Dual-use with ambientops subset." |
| 76 | +last_push = "2026-04-17" |
| 77 | +rationale = "Already positioned as dual-use with a public subset downstream. Low-sensitivity code. Size ~45MB suggests real content worth scanning." |
| 78 | + |
| 79 | +[[inventory]] |
| 80 | +name = "katagoria" |
| 81 | +exclude = false |
| 82 | +candidate = true |
| 83 | +size_kb = 373 |
| 84 | +description = "(empty)" |
| 85 | +last_push = "2026-04-17" |
| 86 | +rationale = "Very small (373KB). Low disclosure risk. Empty description — recommend user confirm content before transfer." |
| 87 | +pre_transfer_check = "skim README + file listing to confirm no sensitive content hides under the size." |
| 88 | + |
| 89 | +[[inventory]] |
| 90 | +name = "network-ambulance" |
| 91 | +exclude = false |
| 92 | +candidate = true |
| 93 | +size_kb = 413 |
| 94 | +description = "Platform-independent complete internet repair tool — cross-platform successor to Windows Complete Internet Repair. Canonical in aerie; subset in ambientops." |
| 95 | +last_push = "2026-04-17" |
| 96 | +rationale = "Described as cross-platform successor to an existing public tool. Subset already extracted downstream. Low-sensitivity operational tool." |
| 97 | + |
| 98 | +[[inventory]] |
| 99 | +name = "nextgen-typing" |
| 100 | +exclude = false |
| 101 | +candidate = true |
| 102 | +size_kb = 373 |
| 103 | +description = "(empty)" |
| 104 | +last_push = "2026-04-17" |
| 105 | +rationale = "Very small (373KB). Low disclosure risk. Empty description — recommend user confirm content before transfer." |
| 106 | +pre_transfer_check = "skim README + file listing to confirm no sensitive content hides under the size." |
| 107 | + |
| 108 | +## Proposed sequencing (dry-run first, then batched) |
| 109 | + |
| 110 | +[[batch]] |
| 111 | +id = "batch-0-dry-run" |
| 112 | +description = "Dry-run inspection — no transfers executed. For each candidate, cat README + list top-level files + verify no secrets." |
| 113 | +commands = [ |
| 114 | + "for r in ipv6-only katagoria network-ambulance nextgen-typing; do echo === $r ===; gh api repos/hyperpolymath/$r/contents/ -q '.[].name'; done", |
| 115 | + "for r in katagoria nextgen-typing; do gh api repos/hyperpolymath/$r/readme --jq '.content' | base64 -d || echo NO-README; done", |
| 116 | +] |
| 117 | +executes_transfer = false |
| 118 | + |
| 119 | +[[batch]] |
| 120 | +id = "batch-1-tiny-repos" |
| 121 | +description = "Transfer the two tiny empty-description repos first, as the lowest-blast-radius test of the transfer mechanics." |
| 122 | +repos = ["katagoria", "nextgen-typing"] |
| 123 | +rationale = "If the mechanics break, failure is contained to 2×373KB repos with no stars/forks and no CI dependency." |
| 124 | +executes_transfer = true |
| 125 | +commands = [ |
| 126 | + "gh api -X POST repos/hyperpolymath/katagoria/transfer -f new_owner=The-Metadatastician", |
| 127 | + "gh api -X POST repos/hyperpolymath/nextgen-typing/transfer -f new_owner=The-Metadatastician", |
| 128 | +] |
| 129 | +post_action = "verify redirect works: `git ls-remote git@github.com:hyperpolymath/katagoria.git` should resolve." |
| 130 | + |
| 131 | +[[batch]] |
| 132 | +id = "batch-2-operational-tools" |
| 133 | +description = "Transfer the operational tool repos after batch-1 succeeds." |
| 134 | +repos = ["network-ambulance", "ipv6-only"] |
| 135 | +rationale = "Real content with public downstream subsets. Transfer unblocks GHAS code-scanning on the full internal version while the aerie/ambientops public subsets continue to ship normally." |
| 136 | +executes_transfer = true |
| 137 | +commands = [ |
| 138 | + "gh api -X POST repos/hyperpolymath/network-ambulance/transfer -f new_owner=The-Metadatastician", |
| 139 | + "gh api -X POST repos/hyperpolymath/ipv6-only/transfer -f new_owner=The-Metadatastician", |
| 140 | +] |
| 141 | +post_action = "verify mirror-sync references still resolve; check CI webhook targets (if any) still fire." |
| 142 | + |
| 143 | +[[batch]] |
| 144 | +id = "batch-3-deferred" |
| 145 | +description = "Repos-monorepo transfer deferred pending review." |
| 146 | +repos = ["repos-monorepo"] |
| 147 | +rationale = "Submodule-pointer workspace root. Moving it changes origin URL for every downstream submodule reference. Worth doing only if GHAS on the wrapper repo provides meaningful signal — probably not." |
| 148 | +executes_transfer = false |
| 149 | +decision_pending = "JONATHAN — is there value in scanning the wrapper monorepo, or is the signal entirely on the member repos?" |
| 150 | + |
| 151 | +## Post-transfer checks (each transferred repo) |
| 152 | + |
| 153 | +[[post_check]] |
| 154 | +id = "redirect-works" |
| 155 | +command = "git ls-remote git@github.com:hyperpolymath/<repo>.git 2>&1 | head -1" |
| 156 | +expect = "non-error output (GitHub redirects old-owner URLs)" |
| 157 | + |
| 158 | +[[post_check]] |
| 159 | +id = "ghas-features-enabled" |
| 160 | +command = "gh api repos/The-Metadatastician/<repo> -q '.security_and_analysis'" |
| 161 | +expect = "secret_scanning + code_scanning = enabled (may need explicit enablement POST-transfer)" |
| 162 | +next_action_if_missing = "gh api -X PATCH repos/The-Metadatastician/<repo> -f 'security_and_analysis[secret_scanning][status]=enabled' -f 'security_and_analysis[code_scanning][status]=enabled'" |
| 163 | + |
| 164 | +[[post_check]] |
| 165 | +id = "internal-visibility" |
| 166 | +command = "gh api repos/The-Metadatastician/<repo> -q '.visibility'" |
| 167 | +expect = "private (default on transfer) — must be changed to 'internal' via gh api -X PATCH -f visibility=internal if Enterprise tier supports it for this repo" |
| 168 | + |
| 169 | +[[post_check]] |
| 170 | +id = "mirror-chain-updated" |
| 171 | +description = "Verify hub-and-spoke mirror system still points at the new upstream. Per memory: GitHub is single source of truth; mirror-sync is automated. Transfers change the canonical URL from github.com/hyperpolymath/X to github.com/The-Metadatastician/X — confirm the mirror system follows." |
| 172 | +owner = "JONATHAN or mirror-sync tooling" |
| 173 | + |
| 174 | +## Open questions for Jonathan |
| 175 | + |
| 176 | +[[question]] |
| 177 | +id = "q1-katagoria-content" |
| 178 | +text = "What is katagoria? Empty description, 373KB, 1 star. Confirm content is not sensitive before batch-1 executes." |
| 179 | + |
| 180 | +[[question]] |
| 181 | +id = "q2-nextgen-typing-content" |
| 182 | +text = "What is nextgen-typing? Empty description, 373KB, 1 star. Same check as katagoria." |
| 183 | + |
| 184 | +[[question]] |
| 185 | +id = "q3-repos-monorepo" |
| 186 | +text = "Transfer repos-monorepo to Metadatastician, or keep it at hyperpolymath as the workspace root?" |
| 187 | + |
| 188 | +[[question]] |
| 189 | +id = "q4-ghas-features-post-transfer" |
| 190 | +text = "Post-transfer, should code_scanning + secret_scanning be auto-enabled via PATCH, or left to the default enterprise policy?" |
| 191 | + |
| 192 | +[[question]] |
| 193 | +id = "q5-greenlight-batch-1" |
| 194 | +text = "GREENLIGHT batch-1 (katagoria + nextgen-typing)? This is the first destructive-ish action — everything prior is reversible via `gh api -X POST repos/The-Metadatastician/X/transfer -f new_owner=hyperpolymath`." |
| 195 | + |
| 196 | +## Status |
| 197 | + |
| 198 | +[[status]] |
| 199 | +as_of = "2026-04-17" |
| 200 | +plan_prepared = true |
| 201 | +dry_run_executed = false |
| 202 | +batch_1_executed = false |
| 203 | +batch_2_executed = false |
| 204 | +batch_3_executed = false |
| 205 | +awaiting = "Jonathan greenlight on open questions q1-q5" |
0 commit comments