diff --git a/README.md b/README.md index 4a91643..568faf8 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,12 @@ MVP Roadmap (high level) - Phase 1 (2-4 weeks): add a small set of global constraints (mesh energy balance, water budgets), governance ledger, offline simulations with digital twins. - Phase 2 (4-6 weeks): adapter marketplace entry points, minimal codegen path, reference UI for graph composition of devices and constraints. - Phase 3 (6-8 weeks): hardware-in-the-loop validation with 2-3 devices, measure plan quality, convergence, latency; prepare for field pilots. +- MVP Ownership & Delivery Details +- Core protocol, graph registry, and EnergiBridge integration: you +- Canonical IR bridge (EnergiBridge) and registry conformance: me +- Starter adapters and marketplace scaffolding: you +- Governance, audit, and per-message metadata: joint effort +- Suggested pilots: two-domain cross-asset demo (DER + pumps + HVAC) Contribution & Governance - This project follows a collaborative, repository-driven development model. See AGENTS.md for architectural guidelines and contribution rules. diff --git a/gridverse/adapter_marketplace/adapters/rover_planner_adapter.py b/gridverse/adapter_marketplace/adapters/rover_planner_adapter.py new file mode 100644 index 0000000..3e49fac --- /dev/null +++ b/gridverse/adapter_marketplace/adapters/rover_planner_adapter.py @@ -0,0 +1,25 @@ +class RoverPlannerAdapter: + """Minimal skeleton for a rover-planner adapter. + + This adapter demonstrates a lightweight, well-scoped interface that + translates a domain payload into GridVerse's canonical form. This is a + bootstrap artifact intended for Phase 0 MVP wiring; it should be fleshed out + with domain-specific mappings for real pilots. + """ + + def __init__(self, config=None): + self.config = config or {} + + def adapt(self, input_payload): + """Return a minimal canonical payload for GridVerse consumption. + + Expected input_payload to contain keys like 'device_id' and 'state'. The + function returns a simple, stable shape that downstream components can + rely on for integration tests. + """ + device_id = input_payload.get("device_id") + state = input_payload.get("state", {}) + return { + "device": device_id, + "plan": state, + } diff --git a/gridverse/dsl_sketch.md b/gridverse/dsl_sketch.md index 3c937e5..9d19450 100644 --- a/gridverse/dsl_sketch.md +++ b/gridverse/dsl_sketch.md @@ -27,3 +27,23 @@ EnergiaBridge notes - Bridge: Canonical GridVerse -> vendor-agnostic form; map LocalProblem/SharedVariables/PlanDelta to interoperable contracts. - The registry keeps contract schemas and adapter descriptors with per-message metadata (version, timestamp, nonce). - A minimal example showing a translated LocalProblem into a CanonicalBundle via the EnergiaBridge. + +### Minimal Cross-Domain DSL Snippet (Expanded) +- LocalProblem { id, domain, assets, objective, constraints } +- SharedVariables { forecasts, priors, version } +- PlanDelta { delta, timestamp, author, contract_id, signature } +- DualVariables { multipliers } +- PrivacyBudget { signal, budget, expiry } +- AuditLog { entry, signer, timestamp, contract_id } +- GovernanceBlock { policy, risk_limit } + +Example: +``` +LocalProblem { id: "lp-01", domain: "district_heating", assets: ["boiler-1"], objective: "min_cost", constraints: ["mesh_energy"] } +SharedVariables { forecasts: {demand: 1000}, priors: {temp: 21}, version: "0.2" } +PlanDelta { delta: { add_adapter: ["rover_planner"] }, timestamp: 1700000000, author: "system", contract_id: "lp-01", signature: "abc123" } +DualVariables { multipliers: { mu: 1.0 } } +PrivacyBudget { signal: "energy", budget: 0.01, expiry: 3600 } +AuditLog { entry: "bootstrap", signer: "system", timestamp: 1700000000, contract_id: "lp-01" } +GovernanceBlock { policy: "safety", risk_limit: 0.05 } +```