Skip to content

feat(profile): map and detect the entirety of non-migrated data - #30

Merged
cvega merged 5 commits into
mainfrom
feat/full-migration-coverage
Jun 16, 2026
Merged

cvega merged 5 commits into
mainfrom
feat/full-migration-coverage

Conversation

@cvega

@cvega cvega commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Summary

Makes the Profile surface the entirety of what a migration loses, delivered in phases so each commit is independently green and shippable. The consideration registry is now the complete map of non-migrated data, and several items that were previously invisible now light up with real, gathered data.

What's included

Commit Phase Delivers
710e6a5 Foundation Registry = complete map: adds a scope field (repo/org/migration) + 13 missing considerations (now 38 total). The detail page renders an always-visible "Always lost in every migration" panel for the 9 whole-migration losses (mannequins, audit logs, commit status checks, comment edit history, sub-issues, cross-repo references, @mention re-linking, secret-scanning states, activity feed).
8b93dcc Phase 2 (org scan) Gathers org teams and GitHub App installations via REST → org-resource tiles; they leave "not yet evaluated".
51deb46 Phase 6 (repo scan) Detects direct collaborators and tag protection rules per repo → count tiles + considerations.
bcc0b7e Progress Live crawl-phase labels — the runner tags each progress nudge with its phase, so a watching page shows what the run is doing right now (discover → org scan → counts → details → repo signals) instead of just a percentage.
54787ed Polish Redesigns the always-lost panel as a responsive card grid (matching the org-resource/scale tiles) so it reads as intentional instead of ragged.

Coverage after this PR

  • 19 considerations detected per-repo
  • 7 evaluated at the org level (secrets, runners, custom properties, rulesets, teams, GitHub Apps, …)
  • 9 whole-migration "always lost" facts
  • Remaining size/policy blockers still require an opt-in deep scan (git-sizer), as before

So customers see the full picture immediately, and it refines phase by phase as the crawl progresses.

Notes

  • All new GitHub API calls (org teams/app-installs, repo collaborators/tag-protection) are best-effort — they degrade to 0 on a missing scope or older GHES, so a read-only token still completes the crawl.
  • Registry claims reconciled against GitHub's live Importer docs; MIGRATION_DOCS_VERIFIED bumped to 2026-06-15.
  • All 11 gates green (typecheck, svelte-check, lint, format, coverage 88.63/87.25, dup, deadcode, cycles, boundaries, build, audit).

Test plan

  • bun run gates — all green
  • New/updated unit tests cover the registry integrity (scope validity, migration-scope invariants), the summary alwaysLost split, org-resource gathering (teams pagination + app installs), per-repo REST signals (collaborators + tag protection), and the phase-labeled progress events.

cvega added 5 commits June 15, 2026 16:45
Make the consideration registry the complete map of what a migration
loses, so the Profile surfaces all of it up front rather than only the
items we can currently detect.

- Add a `scope` field (repo|org|migration) to each consideration.
- Add 13 missing considerations: teams, GitHub Apps, repo collaborators,
  tag protection, plus nine whole-migration losses (mannequins, audit
  logs, commit status checks, comment edit history, sub-issues,
  cross-repo references, @mention re-linking, secret-scanning states,
  activity feed).
- Summary now reports migration-scope facts as `alwaysLost` and excludes
  them from `notYetCrawled` (they're known losses, not coverage gaps).
- Profile detail page renders an 'Always lost in every migration' panel.
- Bump docs-verified stamp to 2026-06-15.
Phase 2 of the org scan now counts two more org-scoped resources that
do not migrate, so the teams and github-apps considerations light up
with real data instead of sitting in 'not yet evaluated'.

- org-resources.ts: count teams via the Link-header pagination primitive
  and GitHub App installations via installations.total_count, both
  best-effort (degrade to 0 on missing scope / older GHES).
- OrgResources gains teams + appInstallations (and zero defaults).
- Mark teams and github-apps as org-evaluated so the summary stops
  listing them as coverage gaps.
- Profile page shows Teams and GitHub Apps org-resource tiles.
Phase 6 of the per-repo REST signals pass now reads two more repo-scoped
considerations that do not migrate, lighting them up with real counts.

- rest-signals.ts: count direct collaborators (affiliation=direct, the
  access a migration does not carry) via the Link-header pagination
  primitive, and tag protection rules from /tags/protection. Both
  best-effort, degrading to 0 on 403/404.
- RepoSignals gains collaboratorsCount + tagProtectionCount; analyze adds
  the repo-collaborators and tag-protection detectors.
- Profile repo rows show Collaborators and Tag protection count tiles.
The runner now tags every progress nudge with its crawl phase, so a
watching detail page shows what the run is doing right now instead of
just a percentage.

- Add ProfilePhase (discovering | organization | counting | details |
  signals) and carry it on ProfileProgress and the SSE progress event.
- Emit a phase nudge at each pass boundary so the label transitions
  crisply (discover -> org scan -> counts -> details -> repo signals).
- Profile page renders the phase label with a spinner under the
  progress bar while the run is in progress.
The bulleted two-column list left ragged whitespace because rows aligned
to the tallest item. Render each loss as a bordered card in a responsive
grid (matching the org-resource and scale tiles), so items have even
heights per row and the panel reads as intentional.
@cvega
cvega merged commit 90f9e98 into main Jun 16, 2026
2 checks passed
@cvega
cvega deleted the feat/full-migration-coverage branch June 16, 2026 02:20
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.

1 participant