Files
Aura/docs/plans/0023-unify-blueprint-render.md
T
Brummel 862882bc04 audit: cycle 0023 (#48) — drift reconciled; render paths unified
Architect drift review (bb90c42..481172a): no contract drift. C9 (render
reads structure + label()/params()/output() only, never eval), C8 (sink =
zero-output leaf, no special case), C12 (blueprint = root composite is
render-structural only; types stay distinct), C23 (consumer-prefix mirrors
the := binding), #38 (composites stay opaque) — all hold. Three fidelity
items, resolved:

- [high, fixed] spec acceptance over-claimed: the SimBroker slot-stub box read
  as in-scope though the work is deferred. Spec amended — the stub acceptance
  is annotated against #49, the met boxes checked.
- [medium, recorded] no docs/plans/0023: this cycle ran spike→refactor under
  user steering instead of planner→implement, because the edge-label-vs-
  consumer-side fork needed an empirical probe (ascii-dag silently drops edge
  labels on collision) before a placeholder-free plan was possible. A plan
  RECORD (not a task plan) now holds the 0023 slot so the counter pairing
  stays intact and the next cycle takes 0024.
- [low, carry-on] multi_output_field_name's leaf-producer fallback is latent
  and untested (no multi-output leaf in the corpus). Carried as debt.

Regression scripts: none configured (no-op). Build/test/clippy green.
Deferred stub work is tracked in #49 (user-signed).

closes #48
2026-06-09 00:15:50 +02:00

2.7 KiB

Unify the Blueprint Main-Graph Render — Implementation Record

Parent spec: docs/specs/0023-unify-blueprint-render.md

This is NOT a task-by-task plan. Cycle 0023 was implemented through an exploratory spike→refactor path under direct user steering, not the standard planner → implement decomposition. This file exists to keep the spec/plan counter pairing intact (naming.counter_dirs: [docs/specs, docs/plans]) and to record why the standard plan artefact is absent, so the next cycle takes slot 0024 and a future reader does not mistake the gap for a lost file.

Goal: one shared render path for the blueprint main graph and the composite where: interior — the blueprint is the root composite.

Why no task-by-task plan

The spec named the direction but left one detail to "the planner/implementer call against ascii-dag's actual capability": where a multi-output producer's selected field surfaces. Resolving it needed an empirical answer, not a paper decision:

  1. The obvious default (an ascii-dag per-edge label) turned out to be unreliable — ascii-dag 0.9.1's can_place_label silently drops a label it cannot place without collision (verified by throwaway probe against the real macd topology). The Plain path drops it with no legend; the colored path shifts it to a legend.
  2. So the field had to move to the consumer node label ([histogram → Exposure(scale)]), which also removed the render_flat signature change entirely (no edge-label slot).

A placeholder-free plan could not be written before that probe, so the work ran as a spike (validate the notation visually with the user) → refactor (collapse the duplication into one shared render_graph over borrowed slices — LeafFactory is not Clone, so an owned root-composite adapter is impossible).

What shipped (commits)

  • 5dd9503 — spec: 0023 unify blueprint main-graph render
  • 481172a — feat(aura-cli): unify blueprint main-graph render through one shared core (render_graph; ParamNames {Aliases, Factory}; Entry unifying Role/SourceSpec; deleted the duplicated blueprint_leaf_label)

Production change confined to crates/aura-cli/src/graph.rs; goldens re-captured in crates/aura-cli/src/main.rs. No engine change. Build/test/clippy green.

Deferred / debt (filed, not lost)

  • Issue #49 — top-level blueprint multi-input leaves render without #-slot stubs (stub_ctx: None); fan_in_identifiers/signature_of stays composite-coupled. User-signed deferral.
  • Latent, untestedmulti_output_field_name's leaf-producer fallback (from_field > 0 → index string) is unexercised (no multi-output leaf in the current corpus); carried as latent code, no anchoring test this cycle.