From 5260058e90f0541f18e39cc28370bc38a0669e6d Mon Sep 17 00:00:00 2001 From: Nihit Gupta Date: Tue, 30 Jun 2026 16:24:31 +0530 Subject: [PATCH 1/2] Clean up graph resolve feature and infra labels --- .../application/readers/infra_topology.py | 4 +- .../domain/agent_context_port.py | 9 ++- potpie/context-engine/domain/graph_views.py | 1 - .../tests/unit/test_graph_views.py | 6 +- .../tests/unit/test_read_orchestrator.py | 62 +++++++++++++++++++ 5 files changed, 76 insertions(+), 6 deletions(-) diff --git a/potpie/context-engine/application/readers/infra_topology.py b/potpie/context-engine/application/readers/infra_topology.py index a240dc941..548186460 100644 --- a/potpie/context-engine/application/readers/infra_topology.py +++ b/potpie/context-engine/application/readers/infra_topology.py @@ -3,7 +3,7 @@ Inputs: scope (service / env / file). Logic: bounded neighbourhood traversal over claim edges with topology predicates (``DEFINED_IN``, ``DEPLOYED_TO``, ``DEPENDS_ON``, ``USES``, ``HOSTED_ON``, ``OWNED_BY``, -``PROVIDES``, ``IMPLEMENTED_IN``), +``USES_ADAPTER``, ``CONFIGURES``, ``DEPLOYED_WITH``), environment-filtered via the ``environment`` edge property. Supports blast-radius (incoming ``DEPENDS_ON`` traversal with depth). Supports ``as_of`` via the bitemporal predicate. @@ -44,8 +44,6 @@ "DEPLOYED_WITH", "HOSTED_ON", "OWNED_BY", - "PROVIDES", - "IMPLEMENTED_IN", ) diff --git a/potpie/context-engine/domain/agent_context_port.py b/potpie/context-engine/domain/agent_context_port.py index 7c5d1e59e..d44f508b0 100644 --- a/potpie/context-engine/domain/agent_context_port.py +++ b/potpie/context-engine/domain/agent_context_port.py @@ -78,7 +78,14 @@ FALLBACK_ONLY_INCLUDES: frozenset[str] = PLANNED_INCLUDES DEFAULT_INTENT_INCLUDES: dict[str, tuple[str, ...]] = { - "feature": ("coding_preferences", "infra_topology", "decisions", "owners", "docs"), + "feature": ( + "coding_preferences", + "features", + "infra_topology", + "decisions", + "owners", + "docs", + ), "debugging": ("prior_bugs", "infra_topology", "timeline"), "review": ("coding_preferences", "decisions", "timeline", "owners"), "operations": ("infra_topology", "timeline", "owners"), diff --git a/potpie/context-engine/domain/graph_views.py b/potpie/context-engine/domain/graph_views.py index abbf951eb..cd21f9fab 100644 --- a/potpie/context-engine/domain/graph_views.py +++ b/potpie/context-engine/domain/graph_views.py @@ -159,7 +159,6 @@ def _v( "DEFINED_IN", "HOSTED_ON", "OWNED_BY", - "PROVIDES", "EXPOSES", ), traversal=True, diff --git a/potpie/context-engine/tests/unit/test_graph_views.py b/potpie/context-engine/tests/unit/test_graph_views.py index 372bd0243..b5f2f5460 100644 --- a/potpie/context-engine/tests/unit/test_graph_views.py +++ b/potpie/context-engine/tests/unit/test_graph_views.py @@ -57,12 +57,16 @@ def test_use_case_views_are_backed() -> None: def test_traversal_flag_only_on_neighborhood_views() -> None: traversal = {v.name for v in GRAPH_VIEWS.values() if v.traversal} - assert traversal == {"infra_topology.service_neighborhood", "features.feature_context"} + assert traversal == { + "infra_topology.service_neighborhood", + "features.feature_context", + } def test_neighborhood_declares_depth_direction_environment() -> None: spec = view_spec("infra_topology.service_neighborhood") assert {"depth", "direction", "environment"} <= set(spec.inputs) + assert "PROVIDES" not in spec.inline_relations def test_neighborhood_documents_environment_filter_rule() -> None: diff --git a/potpie/context-engine/tests/unit/test_read_orchestrator.py b/potpie/context-engine/tests/unit/test_read_orchestrator.py index 01cc29753..f464865f0 100644 --- a/potpie/context-engine/tests/unit/test_read_orchestrator.py +++ b/potpie/context-engine/tests/unit/test_read_orchestrator.py @@ -86,3 +86,65 @@ def test_intent_expands_to_backed_readers() -> None: # readers; empty backed readers return no items, not unsupported includes. assert "coding_preferences" in {i.include for i in env.items} assert env.unsupported_includes == () + + +def test_feature_intent_routes_feature_claims_to_features_include() -> None: + store = InMemoryClaimQueryStore() + store.add( + ClaimRow( + pot_id="p1", + predicate="PROVIDES", + subject_key="repo:github.com/acme/widgets", + object_key="feature:search", + evidence_strength="attested", + fact="widgets repo provides search", + properties={}, + ) + ) + orch = ReadOrchestrator(claim_query=store) + + env = orch.resolve( + pot_id="p1", + intent="feature", + scope={"anchor_entity_key": "repo:github.com/acme/widgets"}, + ) + + includes = [item.include for item in env.items] + assert "features" in includes + assert "infra_topology" not in includes + + +def test_infra_topology_excludes_feature_predicates() -> None: + store = InMemoryClaimQueryStore() + store.add( + ClaimRow( + pot_id="p1", + predicate="DEFINED_IN", + subject_key="service:search-api", + object_key="repo:github.com/acme/widgets", + evidence_strength="attested", + fact="search api lives in widgets repo", + properties={}, + ) + ) + store.add( + ClaimRow( + pot_id="p1", + predicate="PROVIDES", + subject_key="repo:github.com/acme/widgets", + object_key="feature:search", + evidence_strength="attested", + fact="widgets repo provides search", + properties={}, + ) + ) + orch = ReadOrchestrator(claim_query=store) + + env = orch.resolve( + pot_id="p1", + include=["infra_topology"], + scope={"anchor_entity_key": "repo:github.com/acme/widgets"}, + ) + + assert [item.include for item in env.items] == ["infra_topology"] + assert env.items[0].payload["predicate"] == "DEFINED_IN" From c0a55bfef51f8ed51d55ce7d952c4d099da900b0 Mon Sep 17 00:00:00 2001 From: Nihit Gupta Date: Wed, 8 Jul 2026 10:15:18 +0530 Subject: [PATCH 2/2] fix:resolve minor issue --- potpie/context-engine/tests/unit/test_graph_views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/potpie/context-engine/tests/unit/test_graph_views.py b/potpie/context-engine/tests/unit/test_graph_views.py index b5f2f5460..b99b14383 100644 --- a/potpie/context-engine/tests/unit/test_graph_views.py +++ b/potpie/context-engine/tests/unit/test_graph_views.py @@ -67,6 +67,7 @@ def test_neighborhood_declares_depth_direction_environment() -> None: spec = view_spec("infra_topology.service_neighborhood") assert {"depth", "direction", "environment"} <= set(spec.inputs) assert "PROVIDES" not in spec.inline_relations + assert "EXPOSES" in spec.inline_relations def test_neighborhood_documents_environment_filter_rule() -> None: