862882bc04
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
52 lines
2.7 KiB
Markdown
52 lines
2.7 KiB
Markdown
# 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, untested** — `multi_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.
|