Skip to content

feat(portfolio-truth): emit canonical cross-store project registry#51

Merged
saagpatel merged 2 commits into
mainfrom
feat-project-registry-emit
Jun 7, 2026
Merged

feat(portfolio-truth): emit canonical cross-store project registry#51
saagpatel merged 2 commits into
mainfrom
feat-project-registry-emit

Conversation

@saagpatel

Copy link
Copy Markdown
Owner

Generates project-registry.json each run, joining the four stores that key projects differently (auditor project_key, bridge-db project_name, Notion Local Portfolio titles, ~/.claude memory slugs) under one canonical key so events stop going unmatched.

  • New src/project_registry.py: join + resolve() (override table for hard normalization failures, collision guard, no fuzzy matching)
  • publish_portfolio_truth emits the registry via the existing staged atomic-write set
  • config/project-registry-overrides.json: operator-editable enrollment; adds personal-ops + SecondBrain as supplementary (absent from auditor)
  • notion_scoring_page_id backfilled from the Project Portfolio data source (read-only)
  • Every external source optional / degrades gracefully (CI-safe)
  • Normalized-key collisions surfaced under warnings instead of silent first-wins

Tests: 12 new; existing 43 publish tests still pass; ruff clean.

saagpatel added 2 commits June 7, 2026 05:50
Adds project_registry.py: joins the four stores that key projects
differently (auditor project_key, bridge-db project_name, Notion Local
Portfolio titles, ~/.claude memory slugs) under one canonical key so
events stop going unmatched.

- publish_portfolio_truth now emits project-registry.json each run via
  the existing staged atomic-write set
- resolve(): override table for hard normalization failures (notion_os->
  Notion, jcc->JobCommandCenter) + a collision guard (screenshotselect ->
  ScreenshottoDataSelect, not ScreenshotAnnotate); no fuzzy matching
- config/project-registry-overrides.json: operator-editable enrollment;
  adds personal-ops + SecondBrain as supplementary (absent from auditor)
- notion_scoring_page_id backfilled from the Project Portfolio data source
- every external source optional/degrades gracefully (CI-safe)
- 10 tests; existing 43 publish tests still pass
…ilent first-wins

Code-review hardening: the resolver index keeps the first entry on a
normalized-form clash, so a second project normalizing to the same form
would silently mis-resolve. Detect clashes during index build and emit
them under warnings.normalized_key_collisions (live registry has none
today). Adds 2 tests.
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@saagpatel saagpatel merged commit 168d81a into main Jun 7, 2026
2 checks passed
@saagpatel saagpatel deleted the feat-project-registry-emit branch June 7, 2026 13:01
Comment thread src/project_registry.py
try:
configured = json.loads(config_path.read_text()).get("sources", {})
sources.update({k: v for k, v in configured.items() if v})
except (json.JSONDecodeError, OSError):
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.

2 participants