All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
v0.2.3 (2026-05-22)
- updated to diffo 0.4.1 (issue #48)
- refreshed agent guidance via
mix usage_rules.sync
- adopted upstream
Diffo.Provider.Changes.{Define,Relate,Assign}across 11 instance resources; deleted the localDiffoExample.Changes.*trio now that the same modules ship in diffo proper (diffo#170) - slimmed 16
BaseCharacteristic-derived resources by relying on the auto-generated:create/:updateactions (diffo#171) — ~360 lines removed; custom:updateretained oncable,path,circuit,constraintswhere unit/bandwidth-profile composition is needed Cable.relateinlineafter_action(which referenced an unaliasedRelationshipmodule) folded intochange Diffo.Provider.Changes.Relate
DslAccess.qualify_resultnow transitions to:feasibilityChecked— restores correct TMF form following diffo#168 broadening the Assigner lifecycle gate to include:feasibilityCheckedUtil.summarise_characteristics/2no longer called from tests — typed characteristic + pool records now surface in TMF JSON by default (diffo#169). The projection function is retained in lib/diffo_example/util.ex for future projection demonstrations. Expected JSON strings updated acrosscable,card,cable,path,shelf,dsl_access,nbn_ethernettests to reflect the real typed/pool surfacing
- NBN — AVC, CVC, NniGroup characteristic inheritance and metrics (issue #49):
- AVC inherits the upstream CVC's
cvccharacteristic via the:cvlanassignment (single-hop), and the NniGroup'snni_groupcharacteristic transitively via[:cvlan, :svlan](two-hop). Both singular. - CVC inherits the upstream NniGroup's
nni_groupcharacteristic via the:svlanassignment (singular). - NniGroup brings up the typed value of every comprised NNI as
nnis[]via the:containsrelationship. - New
cvc_metricscharacteristic on CVC carriesavcs_countandavcs_total_bandwidthaggregated live over assigned AVCs. - New
nni_group_metricscharacteristic on NniGroup carriescvcs_count/cvcs_total_bandwidth(demand),nnis_count/nnis_total_bandwidth(capacity), andutilization = cvcs_total_bandwidth / nnis_total_bandwidth.
- AVC inherits the upstream CVC's
- NBN — NTD brings up assigned UNIs as
unis[]via the:portassignment (issue #49 part 2). - NBN — NbnEthernet (PRI) brings up four characteristics surfacing the full delivery chain (issue #49 part 3):
avcsingle-hop via the:circuitowns relationship,unisingle-hop via the:portowns relationship,cvctwo-hop via:circuitthen:cvc, andntdtwo-hop via:portthen:ntd. All singular. - NBN and Access — consumer-side aliases on assignments and relationships now name the upstream related resource the consumer is part of (its domain role), not the slot/thing being received. NBN: AVC sets
:cvcon its cvlan assignment, CVC sets:nni_groupon its svlan assignment, UNI sets:ntdon its port assignment; PRI's two:ownsrelationships are aliased:circuit(AVC) and:port(UNI). Access: Card sets:shelfon its slot assignment, Path sets:cardon its port assignment, andShelf.cardsfilters onalias: :shelf. Inheritance walks use these consumer-aliases. Pool/metric aggregations are unaffected — they still filter bything. BandwidthProfile.downstream/1— atom-to-Mbps mapping used by the metrics aggregation. CVCs are treated as symmetric capacity in this model (satellite asymmetry ignored).
DiffoExample.Calculations.InheritedCharacteristicrenamed toInheritedCharacteristicViaAssignment; new siblingInheritedCharacteristicViaRelationshiptraversesProvider.Relationshipedges (forward source → target). Both calcs acceptsingular?:to unwrap to a single value where graph identity guarantees ≤1 result.InheritedCharacteristicViaRelationshipalso accepts athen_via:list of assignment aliases to continue the walk viaAssignmentRelationshipafter the relationship hop — covers mixed paths like PRI'scvc(relationship + assignment).ReverseInheritedCharacteristicextended with athing:filter option, complementing the existingalias:filter. Source-side aggregations should preferthing:since it's always set from the pool DSL — see the assignment-direction-asymmetry rationale.
v0.2.2 (2026-05-21)
- updated to diffo 0.4.0 (skipping 0.3.0)
- updated to ash_neo4j 0.6.0
- added ash_ai 0.6 for MCP and future LLM features
- AGENTS.md added with discipline reminders (keep
tools doaligned with code-interfacedefines; runmix formatandreuse lintbefore every commit) DiffoExample.DataCaseExUnit case template — DRYs the AshNeo4j sandbox setup across 7 test filestest/support/characteristics.ex@characteristic_modulesderived from configured ash_domains at runtime viaAsh.Domain.Info.resources/1+Diffo.Provider.Extension.Info.instance?/1
- diffo 0.4.0 migration: unified
provider doDSL,pools do,AssignmentRelationship,Assigner.assign/3with pool lookup,relationships dopermitted source/target roles,Pool.update_pools/3in define actions DiffoExample.Changes.Define,Relate,Assign— three change modules collapsing ~28 hand-written after-action bodies across 11 instance resources into one declarative line per action- MCP interface via ash_ai (issue #44) — 60 tools exposed across Access and Nbn domains;
/mcpforwarded from the existing Plug.Cowboy listener on port 4000; setup how-to atdocumentation/how_to/setup_mcp.md - Bring up characteristics across the assignment graph (issues #10 and #32):
DiffoExample.Calculations.InheritedCharacteristic— assignee inherits typed characteristic from its assigner via incomingAssignmentRelationshiptraversal (mirrorsDiffo.Provider.Calculations.InheritedPlace)DiffoExample.Calculations.ReverseInheritedCharacteristic— assigner brings up typed characteristic from its assignees via outgoing traversal ("insanity is hereditary, you get it from your kids")DiffoExample.Access.Calculations.ShelfTotalPorts— multi-hop aggregate-style calc summing port capacity across a shelf's assigned cards- Card surfaces
:shelf/:slot; Path surfaces:card/:portand (two-hop):shelf; Shelf surfaces:cards/:total_ports
- Resource lifecycle:
:buildleavesresource_statenil;:definetransitions to:operating— minimum needed for the Assigner gate without modelling intermediate planning states (which are better expressed as Plan entities outside the instance) ShelfandPathcharacteristics gained:device_nameattribute with JSON rename to"name"(parallel to theDslampattern), so the typed characteristic carries the device's own name without colliding withBaseCharacteristic's role-name:name
DslAccess.qualify_resulttransitions to:inactiveinstead of:feasibilityChecked— works around the diffo Assigner gating services to[:active, :inactive]DiffoExample.Util.summarise_characteristics/2test-time projection collapses typed characteristics and pool records to"absent_diffo_169"placeholders on both sides of JSON comparisons while diffo#169 is open- No JSON rendering yet of inherited / reverse-inherited characteristic calc results — waits on diffo#173
- diffo#169 — surface typed characteristics and pools in Instance JSON
- diffo#170 — provide change modules for the Define / Relate / Assign patterns
- diffo#171 — BaseCharacteristic could generate
update :update acceptfrom public attributes - diffo#172 —
inherited_characteristicandreverse_inherited_characteristicDSL declarations - diffo#173 — JSON surfacing of inherited and reverse-inherited concepts
- diffo-dev/ash_neo4j#74 — vector index support (enriched with consumer context)
v0.2.1 (2026-05-07)
- updated to diffo 0.2.1
- using transactions and test sandbox
- using improved provider DSL
v0.2.0 (2026-04-26)
- updated to diffo 0.2.0
- new NBN domain modelling NBN Ethernet access and constituent resources (UNI, AVC, NTD, CVC, NNI Group, NNI)
- JSON API via AshJsonApi and Plug.Cowboy
- RSP resource with AshStateMachine lifecycle (inactive/active/suspended) and Ash Policy authorisation
- RSP multi-tenancy: SetRspId change, OwnedByActor and NoActor policy checks, RspOwnership macro shared across RSP-owned resources
- NTD and UNI modelled as NBN-owned infrastructure — readable by any RSP, mutable only by internal calls
- Interactive NBN livebook with Kino RSP selector and actor-scoped provisioning flow
- NBN domain documentation including Perentie ecosystem narrative
v0.0.4 (2026-03-19)
- fixed relationship enrichment inconsistent across neo4j versions
v0.0.3 (2026-03-13)
- updated to diffo 0.1.4, using ash_neo4j 0.2.13 using fork bolty 0.0.7 rather than boltx 0.0.6
v0.0.2 (2025-12-01)
- updated to diffo 0.1.3
v0.0.1 (2025-10-20)
- initial version