From 831ceca46e00da2a37b60c5cb6d8a2335a1d5088 Mon Sep 17 00:00:00 2001 From: agent-dd492b85242a98c5 Date: Sun, 19 Apr 2026 20:52:43 +0200 Subject: [PATCH] build(agent): new-agents-3#dd492b iteration --- nova_plan/contracts.py | 18 ++++++++++++++++++ nova_plan/energi_bridge.py | 15 +++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/nova_plan/contracts.py b/nova_plan/contracts.py index cedecac..61e5da5 100644 --- a/nova_plan/contracts.py +++ b/nova_plan/contracts.py @@ -60,6 +60,24 @@ class GoCRegistry: def get_provenance(cls, contract_id: str) -> list: return list(cls._deltas.get(contract_id, [])) + @classmethod + def list_contracts(cls) -> list[str]: + """Return a list of contract_ids currently stored in the registry.""" + return list(cls._contracts.keys()) + + @classmethod + def latest_delta(cls, contract_id: str) -> PlanDelta | None: + """Return the most recent PlanDelta for a given contract, if any.""" + deltas = cls._deltas.get(contract_id) + if not deltas: + return None + return deltas[-1] + + @classmethod + def get_all_provenance(cls) -> Dict[str, list]: + """Return a mapping of contract_id to its provenance delta list.""" + return {cid: list(deltas) for cid, deltas in cls._deltas.items()} + def _delta_sign_digest(delta: PlanDelta, key: str) -> str: payload = { diff --git a/nova_plan/energi_bridge.py b/nova_plan/energi_bridge.py index 7b26935..ec69d57 100644 --- a/nova_plan/energi_bridge.py +++ b/nova_plan/energi_bridge.py @@ -16,10 +16,10 @@ feature growth. from __future__ import annotations -from typing import Any, Dict +from typing import Any, Dict, cast from nova_plan.catopt_bridge import to_object, delta_to_morphism -from nova_plan.contracts import PlanDelta, CaCContract, CaCRegistry, sign_ca_contract +from nova_plan.contracts import PlanDelta, CaCContract, CaCRegistry, sign_ca_contract, GoCRegistry class EnergiBridge: @@ -53,8 +53,15 @@ class EnergiBridge: """ contract = CaCContract(contract_id=contract_id, version=1, content=content) signed = sign_ca_contract(contract, key) - CaCRegistry.register(signed) - return signed + # Persist in CaC registry (store the unsigned contract metadata for MVP) + CaCRegistry.register(contract) + # Also publish provenance to the GoC registry for cross-adapter provenance tracking + try: + GoCRegistry.register_signed_contract(cast(CaCContract, contract), signer="EnergiBridge", signature=signed.signature) + except Exception: + # Best-effort provenance extension; do not fail publishing if registry is not ready + pass + return contract __all__ = ["EnergiBridge"]