From 01bb26f388b21fdef8a5c6507b381467367dd9ef Mon Sep 17 00:00:00 2001 From: saagpatel <269905221+saagpatel@users.noreply.github.com> Date: Sun, 6 Sep 2026 06:55:05 -0700 Subject: [PATCH] fix(config): correct the stale personal-ops identity leftovers The catalog said the personal-ops live checkout sits outside the Projects workspace. It has not since the auditor started tracking saagpatel/personal-ops from the normal scan, which is also why the supp:personal-ops enrollment was retired. The same era left a "Personal Ops" -> operator-os-docs title alias, from when the row had no auditor identity to bind to. It is dead today: the title normalizes straight onto the tracked repo, so direct resolution answers before the alias is consulted, and rebuilding the live registry with and without it produces identical titles, page ids, and zero orphans. Dead is not harmless here - it names a binding that would hand one project's Notion row to another the moment resolution order shifted. Pin the correct binding with a test rather than leave it implied by resolution order. --- config/portfolio-catalog.yaml | 2 +- config/project-registry-overrides.json | 1 - src/github_repo_auditor/project_registry.py | 1 - tests/test_project_registry.py | 28 +++++++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/config/portfolio-catalog.yaml b/config/portfolio-catalog.yaml index 52c6279..d3a4581 100644 --- a/config/portfolio-catalog.yaml +++ b/config/portfolio-catalog.yaml @@ -1502,7 +1502,7 @@ repos: maturity_program: maintain target_maturity: operating automation_eligible: false - notes: Tier-0 Operator OS project. The live checkout is outside the Projects workspace and is represented in generated registry output as supp:personal-ops. + notes: Tier-0 Operator OS project. The live checkout is ~/Projects/personal-ops, tracked by the normal scan as saagpatel/personal-ops and keyed personal-ops in generated registry output. It was represented as supp:personal-ops while it sat outside the workspace; that supplementary enrollment was retired once the auditor picked the repo up directly. # --- 2026-07-17 Portfolio Tribunal: contracts for previously uncataloged KEEP repos --- Temper: owner: d diff --git a/config/project-registry-overrides.json b/config/project-registry-overrides.json index 7a0d869..52a16bf 100644 --- a/config/project-registry-overrides.json +++ b/config/project-registry-overrides.json @@ -63,7 +63,6 @@ "OPERANT": "operant-public", "OrbitMechanics": "OrbitMechanic", "OrbitForge (staging)": "OrbitForge", - "Personal Ops": "operator-os-docs", "PhantomFrequencies": "Phantom Frequencies", "PomGambler-prod": "PomGambler", "seismoscope": "Seismoscope", diff --git a/src/github_repo_auditor/project_registry.py b/src/github_repo_auditor/project_registry.py index a846148..145ec4d 100644 --- a/src/github_repo_auditor/project_registry.py +++ b/src/github_repo_auditor/project_registry.py @@ -143,7 +143,6 @@ "GithubRepoAuditor-public": "GithubRepoAuditor", "Notion Operating System": "Notion", "OrbitForge (staging)": "OrbitForge", - "Personal Ops": "operator-os-docs", "PomGambler-prod": "PomGambler", } diff --git a/tests/test_project_registry.py b/tests/test_project_registry.py index b1dd5ce..a6b2dab 100644 --- a/tests/test_project_registry.py +++ b/tests/test_project_registry.py @@ -606,3 +606,31 @@ def test_registry_schema_version_pins_the_published_shape(): "notion_local_ambiguous", } assert set(registry["warnings"]) == {"normalized_key_collisions"} + + +def test_personal_ops_owns_its_own_notion_row(tmp_path: Path): + # The "Personal Ops" title used to be aliased onto operator-os-docs, from the + # era when personal-ops lived outside the Projects workspace and had no + # auditor identity of its own. The auditor tracks saagpatel/personal-ops + # directly now, so that alias would hand one project's Notion row to another + # the moment resolution order shifted. The row belongs to the repo. + snapshot = _snapshot( + _ident("personal-ops", "personal-ops", "saagpatel/personal-ops"), + _ident("operator-os-docs", "operator-os-docs", "saagpatel/operator-os-docs"), + ) + snap = _pid_snapshot( + tmp_path, + [ + {"title": "Personal Ops", "page_id": "page-personal-ops"}, + {"title": "operator-os-docs", "page_id": "page-docs"}, + ], + ) + registry = build_project_registry( + snapshot, + notion_snapshot_path=snap, + overrides_config_path=Path("config/project-registry-overrides.json"), + ) + by_key = {e["canonical_key"]: e for e in registry["entries"]} + assert by_key["personal-ops"]["notion_local_page_id"] == "page-personal-ops" + assert by_key["operator-os-docs"]["notion_local_page_id"] == "page-docs" + assert registry["unmatched"]["notion_local"] == []