Skip to content

Commit 604ed0b

Browse files
author
Grace Lee Rui Yue
committed
link interval enclosure verifier
1 parent 292c9f4 commit 604ed0b

4 files changed

Lines changed: 69 additions & 2 deletions

File tree

src/jacobian/polynomial_interval_capabilities.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
from jacobian.contracts.capabilities import (
4141
CapabilityAssurance,
4242
CapabilityAssuranceLevel,
43+
CapabilityCatalogRelationship,
44+
CapabilityCatalogRelationshipKind,
45+
CapabilityCatalogRelationshipRegistration,
4346
CapabilityCompleteness,
4447
CapabilityCompletenessStatus,
4548
CapabilityDescriptor,
@@ -115,6 +118,7 @@ class PolynomialIntervalInstallation:
115118
claim_schema_uri: str
116119
certificate_schema_uri: str
117120
checker_id: str | None
121+
catalog_relationships: tuple[CapabilityCatalogRelationshipRegistration, ...] = ()
118122

119123

120124
@dataclass(frozen=True, slots=True)
@@ -218,6 +222,28 @@ def install_polynomial_interval_capabilities(
218222
)
219223
.checker_id
220224
)
225+
catalog_relationships = (
226+
(
227+
CapabilityCatalogRelationshipRegistration(
228+
source_capability_id="polynomial.interval.enclose",
229+
related_capability=CapabilityCatalogRelationship(
230+
capability_id="polynomial.interval.enclosure.verify",
231+
kind=CapabilityCatalogRelationshipKind.INDEPENDENT_VERIFIER,
232+
relationship="independently verify this exact interval enclosure",
233+
),
234+
),
235+
CapabilityCatalogRelationshipRegistration(
236+
source_capability_id="polynomial.interval.enclosure.verify",
237+
related_capability=CapabilityCatalogRelationship(
238+
capability_id="polynomial.interval.enclose",
239+
kind=CapabilityCatalogRelationshipKind.VERIFIABLE_RESULT_PRODUCER,
240+
relationship="produce the exact enclosure accepted by this verifier",
241+
),
242+
),
243+
)
244+
if checker_id is not None
245+
else ()
246+
)
221247
installation = PolynomialIntervalInstallation(
222248
semantics_uri=semantics_uri,
223249
polynomial_semantics_uri=polynomial_semantics_uri,
@@ -227,6 +253,7 @@ def install_polynomial_interval_capabilities(
227253
claim_schema_uri=claim_schema_uri,
228254
certificate_schema_uri=certificate_schema_uri,
229255
checker_id=checker_id,
256+
catalog_relationships=catalog_relationships,
230257
)
231258
resources = PolynomialIntervalResources(
232259
store=store,

src/jacobian/portfolio/resource_installation.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ def install(self, result: PortfolioInstallation) -> None:
5858
for interval_adapter in interval_adapters:
5959
if interval_adapter is not None:
6060
ctx.register_capability(interval_adapter)
61-
6261
positivity_adapters, result.polynomial_positivity = (
6362
install_polynomial_positivity_capabilities(
6463
ctx.store,
@@ -72,7 +71,10 @@ def install(self, result: PortfolioInstallation) -> None:
7271
for positivity_adapter in positivity_adapters:
7372
if positivity_adapter is not None:
7473
ctx.register_capability(positivity_adapter)
75-
for relationship in result.polynomial_positivity.catalog_relationships:
74+
for relationship in (
75+
*result.polynomial_interval.catalog_relationships,
76+
*result.polynomial_positivity.catalog_relationships,
77+
):
7678
ctx.register_checker_relationship(
7779
relationship.source_capability_id,
7880
relationship.related_capability,

tests/boundary/mcp/test_mcp_invocation_journey.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,25 @@ async def scenario() -> None:
8989
}
9090
]
9191

92+
enclosure_description = await client.call_tool(
93+
"math.find",
94+
{
95+
"capability_id": "polynomial.interval.enclose",
96+
"view": "CONTRACT",
97+
},
98+
)
99+
assert isinstance(enclosure_description.structured_content, dict)
100+
enclosure_contract = enclosure_description.structured_content
101+
assert enclosure_contract["related_capabilities"] == [
102+
{
103+
"capability_id": "polynomial.interval.enclosure.verify",
104+
"kind": "INDEPENDENT_VERIFIER",
105+
"relationship": (
106+
"independently verify this exact interval enclosure"
107+
),
108+
}
109+
]
110+
92111
positivity_description = await client.call_tool(
93112
"math.find",
94113
{

tests/domain/polynomial/test_polynomial_interval_capabilities.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from jacobian.capability_service import CapabilityInvocationError
1010
from jacobian.contracts.capabilities import (
1111
CapabilityAssuranceLevel,
12+
CapabilityCatalogRelationshipKind,
1213
CapabilityRelationshipStatus,
1314
CapabilityRequest,
1415
)
@@ -59,6 +60,24 @@ def test_verify_adapter_rejects_missing_authorized_checker(installation) -> None
5960
PolynomialIntervalEnclosureVerifyAdapter(resources)
6061

6162

63+
def test_installation_declares_reciprocal_checker_navigation(installation) -> None:
64+
_adapters, installed, _store = installation
65+
relationships = installed.catalog_relationships
66+
67+
assert [item.source_capability_id for item in relationships] == [
68+
"polynomial.interval.enclose",
69+
"polynomial.interval.enclosure.verify",
70+
]
71+
assert [item.related_capability.capability_id for item in relationships] == [
72+
"polynomial.interval.enclosure.verify",
73+
"polynomial.interval.enclose",
74+
]
75+
assert [item.related_capability.kind for item in relationships] == [
76+
CapabilityCatalogRelationshipKind.INDEPENDENT_VERIFIER,
77+
CapabilityCatalogRelationshipKind.VERIFIABLE_RESULT_PRODUCER,
78+
]
79+
80+
6281
def test_enclose_capability_computes_a_valid_bernstein_enclosure(
6382
installation,
6483
) -> None:

0 commit comments

Comments
 (0)