build(agent): melter#14fd4b iteration
This commit is contained in:
parent
6124229f74
commit
5fd6a7c781
|
|
@ -53,6 +53,8 @@ def map_delta_to_catopt(delta_env: DeltaEnvelope) -> Dict[str, Any]:
|
||||||
"Metadata": {
|
"Metadata": {
|
||||||
"protocol_version": getattr(delta_env, "protocol_version", "PulseMesh/0.1.0"),
|
"protocol_version": getattr(delta_env, "protocol_version", "PulseMesh/0.1.0"),
|
||||||
"timestamp": delta_env.delta.timestamp if hasattr(delta_env, "delta") else None,
|
"timestamp": delta_env.delta.timestamp if hasattr(delta_env, "delta") else None,
|
||||||
|
# Pass through optional PoeticCert provenance when present
|
||||||
|
"poetic_cert": getattr(delta_env, "poetic_cert", None),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from dataclasses import dataclass, asdict
|
from dataclasses import dataclass, asdict
|
||||||
from typing import List, Dict, Any
|
from typing import List, Dict, Any, Optional
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from .delta import Delta
|
from .delta import Delta
|
||||||
|
|
@ -29,12 +29,15 @@ class DeltaEnvelope:
|
||||||
protocol_version: str
|
protocol_version: str
|
||||||
contract: TelemetryContract
|
contract: TelemetryContract
|
||||||
delta: Delta
|
delta: Delta
|
||||||
|
# Optional provenance/certification for anomaly detectors (PoeticCert)
|
||||||
|
poetic_cert: Optional[Dict[str, Any]] = None
|
||||||
|
|
||||||
def to_dict(self) -> Dict[str, Any]:
|
def to_dict(self) -> Dict[str, Any]:
|
||||||
return {
|
return {
|
||||||
"protocol_version": self.protocol_version,
|
"protocol_version": self.protocol_version,
|
||||||
"contract": self.contract.to_dict(),
|
"contract": self.contract.to_dict(),
|
||||||
"delta": self.delta.to_dict(),
|
"delta": self.delta.to_dict(),
|
||||||
|
"poetic_cert": self.poetic_cert,
|
||||||
}
|
}
|
||||||
|
|
||||||
def to_json(self) -> str:
|
def to_json(self) -> str:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
# Ensure package source is importable during tests
|
||||||
|
SRC_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "src"))
|
||||||
|
if SRC_DIR not in sys.path:
|
||||||
|
sys.path.insert(0, SRC_DIR)
|
||||||
|
|
||||||
|
from pulsemesh_open_telemetry_visualization_a.delta import Delta
|
||||||
|
from pulsemesh_open_telemetry_visualization_a.protocol import TelemetryContract, DeltaEnvelope
|
||||||
|
from pulsemesh_open_telemetry_visualization_a.catopt_bridge import map_delta_to_catopt
|
||||||
|
|
||||||
|
|
||||||
|
def test_poetic_cert_roundtrip_and_mapping():
|
||||||
|
contract = TelemetryContract(
|
||||||
|
contract_id="c1",
|
||||||
|
device_type="test_device",
|
||||||
|
metrics=["m1"],
|
||||||
|
units={"m1": "unit"},
|
||||||
|
quality_flags=["ok"],
|
||||||
|
version=1,
|
||||||
|
)
|
||||||
|
|
||||||
|
d = Delta(delta_id="d1", timestamp=time.time(), items=[{"m1": 1.0}])
|
||||||
|
|
||||||
|
poetic = {
|
||||||
|
"model_version": "v1",
|
||||||
|
"training_data_digest": "sha256:deadbeef",
|
||||||
|
"confidence": 0.95,
|
||||||
|
"signer": "edge-operator",
|
||||||
|
}
|
||||||
|
|
||||||
|
env = DeltaEnvelope(protocol_version="PulseMesh/0.1.0", contract=contract, delta=d, poetic_cert=poetic)
|
||||||
|
|
||||||
|
# Ensure envelope preserves poetic_cert
|
||||||
|
ed = env.to_dict()
|
||||||
|
assert "poetic_cert" in ed and ed["poetic_cert"]["model_version"] == "v1"
|
||||||
|
|
||||||
|
cat = map_delta_to_catopt(env)
|
||||||
|
assert isinstance(cat, dict)
|
||||||
|
assert "Metadata" in cat and cat["Metadata"].get("poetic_cert") is not None
|
||||||
|
assert cat["Metadata"]["poetic_cert"]["signer"] == "edge-operator"
|
||||||
Loading…
Reference in New Issue