diff --git a/src/repo_registry/candidate_graph/generator.py b/src/repo_registry/candidate_graph/generator.py index ea2a4d0..8f31bc3 100644 --- a/src/repo_registry/candidate_graph/generator.py +++ b/src/repo_registry/candidate_graph/generator.py @@ -103,16 +103,21 @@ class CandidateGraphGenerator: capabilities.append( self._interface_capability(interfaces, tests, examples, docs, chunks) ) - promotable_llm_facts = self._promotable_llm_facts( - llm_providers + provider_registries + fallback_policies + promotable_llm_providers = self._promotable_llm_facts(llm_providers) + promotable_provider_registries = self._promotable_llm_facts(provider_registries) + promotable_fallback_policies = self._promotable_llm_facts(fallback_policies) + promotable_llm_facts = ( + promotable_llm_providers + + promotable_provider_registries + + promotable_fallback_policies ) if promotable_llm_facts: capabilities.append( self._llm_provider_capability( - llm_providers, + promotable_llm_providers, credential_configs, - provider_registries, - fallback_policies, + promotable_provider_registries, + promotable_fallback_policies, tests, examples, docs, diff --git a/tests/test_candidate_graph.py b/tests/test_candidate_graph.py index 23a0fc4..a4706b3 100644 --- a/tests/test_candidate_graph.py +++ b/tests/test_candidate_graph.py @@ -403,3 +403,58 @@ def test_candidate_generator_does_not_promote_llm_provider_mentions_to_capabilit for capability in graph[0].capabilities if capability.name == "Route LLM Requests Across Providers" ] == [] + + +def test_candidate_generator_excludes_mention_only_providers_from_promoted_capability(): + repository = Repository( + id=1, + name="MixedSignals", + url="/tmp/mixed-signals", + description=None, + branch="main", + status="analyzed", + ) + facts = [ + fact(1, "documentation", "README", "README.md"), + fact( + 2, + "llm_provider", + "OpenRouter", + "src/providers.py", + "openrouter", + {"source_role": "implementation_source", "utility_relationship": "adapter"}, + ), + fact( + 3, + "llm_provider", + "Claude", + "README.md", + "claude", + {"source_role": "product_documentation", "utility_relationship": "mention"}, + ), + fact( + 4, + "provider_registry", + "LLM provider registry", + "src/providers.py", + metadata={"source_role": "implementation_source", "utility_relationship": "adapter"}, + ), + ] + + graph = CandidateGraphGenerator().generate(repository, facts) + + capability = next( + capability + for capability in graph[0].capabilities + if capability.name == "Route LLM Requests Across Providers" + ) + assert "OpenRouter" in capability.description + assert "Claude" not in capability.description + assert {feature.name for feature in capability.features} == { + "Use OpenRouter Models", + "Maintain LLM Provider Registry", + } + assert [ref.path for ref in capability.source_refs] == [ + "src/providers.py", + "src/providers.py", + ] diff --git a/workplans/RREG-WP-0009-provenance-aware-characteristic-rebuild.md b/workplans/RREG-WP-0009-provenance-aware-characteristic-rebuild.md index 198aab0..1a2fafc 100644 --- a/workplans/RREG-WP-0009-provenance-aware-characteristic-rebuild.md +++ b/workplans/RREG-WP-0009-provenance-aware-characteristic-rebuild.md @@ -8,7 +8,7 @@ status: active owner: codex topic_slug: foerster-capabilities created: "2026-05-01" -updated: "2026-05-01" +updated: "2026-05-02" state_hub_workstream_id: "d8f304b3-a30c-4172-99de-19ab84bf330e" --- @@ -76,7 +76,7 @@ Acceptance criteria: ```task id: RREG-WP-0009-T02 -status: in_progress +status: done priority: high state_hub_task_id: "3ef728a0-832f-4441-9ece-16888ef68c47" ```