From 7770d9096e7f6212368c8a22cda01f0848196421 Mon Sep 17 00:00:00 2001 From: AdamRickards Date: Tue, 29 Sep 2026 19:01:22 +1000 Subject: [PATCH] docs(agents): park load_wire() overlay merge dropping value_maps (#329) Adds a hitl-engine-park.md row: load_wire()'s protocol-overlay merge (interpreter.py) merges only the overlay's attributes: block, so a top-level value_maps: in wire/{overlay_dir}/{wire_id}.yaml is never read; only the base file's value_maps: is used. Found while wiring #329's SSH-only net_mask_to_prefix map, which had to move into base wire/netconfig.yaml. Fix shape (mirror the attributes merge for value_maps) is Engine-touching and needs HITL sign-off; not implemented here. Docs only. Offline repro: tested. Draft; do not merge. Related #329 --- local/agents/diagrams/hitl-engine-park.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/local/agents/diagrams/hitl-engine-park.md b/local/agents/diagrams/hitl-engine-park.md index 160d37f..f7591b3 100644 --- a/local/agents/diagrams/hitl-engine-park.md +++ b/local/agents/diagrams/hitl-engine-park.md @@ -37,6 +37,8 @@ lands or HITL kills the need. | SSH get_ip_addresses nested ip_table / composed ipv4 | Schema NO_HOLE — defaults only `ipv4: {}` (no sub_tables) → attr scope empty → cli=[] honest; CLI.json names `show ip interface` (L3) + `show network parms` (L2 fallback) but archive needs `tag: ip_table` / intf→ipv4→ip→prefix_length nest (Engine). Binding management scalars invents NAPALM floor (both empty). Soft Rank1 exhausted | #329 get_ip_addresses | Soft Σ SSH no-cli continue (#330+); Engine ip_table / HITL when opened | +| `load_wire()` overlay merge drops `value_maps:` | Engine NO_HOLE — `load_wire()`'s protocol-overlay merge (`interpreter.py`) only merges the overlay file's `attributes:` block; a top-level `value_maps:` declared in `wire/{overlay_dir}/{wire_id}.yaml` (e.g. `wire/ssh/netconfig.yaml`) is silently never read — only the base file's `value_maps:` is ever consulted. Confirmed live 2026-09-27 building #329's SSH-only `net_mask_to_prefix` map: declaring it in the SSH overlay resolved to nothing (raw string passed through unmapped); had to move it to base `wire/netconfig.yaml` instead, even though it's meaningless to snmp/mops. Confuses ownership (protocol-specific data forced into the shared base file) and risks a name collision if two different overlays ever need a same-named map. Fix shape: mirror the existing attributes-merge loop for `value_maps` (`base.setdefault("value_maps", {}).update(override.get("value_maps", {}))` or equivalent) — same file, same pattern, small. | #329 get_ip_addresses (`net_mask_to_prefix` currently lives in base `wire/netconfig.yaml` as a workaround, documented inline) | Soft path: value_maps needed only by one protocol stay in the base file for now (workaround, not a fix); park Engine merge fix until HITL opens | + | SSH get_lldp_neighbors(_detail) remote-data sections/block parser | Schema NO_HOLE — CLI.json names `show lldp remote-data` (+ global/port); archive fixture + `local/archive/lldp.yaml` need `parser: sections` (block headers `Remote data, M/N - #port` + dotted field labels). Live `wire/ssh/lldp.yaml` write-only ("reads need block parser"). Live parsers only table/paired_rows/simple_table/regex — cannot multi-section list_append by local_port. Scalar `field:` invents single-record floor. `cli=show port` is ifindex key_map only. Detail = same show + same sections need (more rem fields). Prefer existing tools exhausted. Soft Rank1 exhausted | #333 get_lldp_neighbors; #334 get_lldp_neighbors_detail | Soft Σ SSH fail pack #333–#334 closed; Engine sections/block parser / HITL when opened | | SSH get_fan_status multi-row `parser: fan_status` | Schema NO_HOLE — CLI.json `show fan`; archive uses Engine `parser: fan_status` (multi-row walk). No scalar field for `hm2fanmgmtstatus`; schema invent floor `defaults.status: running` vs MOPS `{}`. Soft Rank1 exhausted | #332 get_fan_status | Soft Σ SSH fail continue (#333+#334); Engine fan_status / HITL when opened |