Skip to content

feat(makie): implement circlepacking-basic - #11186

Merged
MarkusNeusinger merged 8 commits into
mainfrom
implementation/circlepacking-basic/makie
Sep 2, 2026
Merged

feat(makie): implement circlepacking-basic#11186
MarkusNeusinger merged 8 commits into
mainfrom
implementation/circlepacking-basic/makie

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Implementation: circlepacking-basic - julia/makie

Implements the julia/makie version of circlepacking-basic.

File: plots/circlepacking-basic/implementations/julia/makie.jl

Parent Issue: #2498


🤖 impl-generate workflow

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Review - Attempt 1/3

Image Description

Light render (plot-light.png): Warm off-white background (#FAF8F1), bold dark-ink title "circlepacking-basic · julia · makie · anyplot.ai" at top. No axes/ticks/spines (correctly hidden for this chart type). Four Imprint-palette-tinted category clusters (green/Documents, lavender/Media, blue/Code, ochre/System) with a faint outlined root container circle. Nested subcategory and leaf circles use depth-based alpha (0.16/0.38/0.88) with page-background strokes for separation. Category labels are bold and legible; subcategory labels render where the circle is large enough. All text is readable against the light background — no light-on-light issues.

Dark render (plot-dark.png): Warm near-black background (#1A1A17). Title, root-container stroke, and category/subcategory labels flip to light ink (#F0EFE8) and stay clearly legible. Data colors (the four Imprint hues) are identical to the light render — only chrome (background, text, container stroke) flips. No dark-on-dark failures anywhere.

Both renders pass the readability check.

Score: 88/100

Category Score Max
Visual Quality 29 30
Design Excellence 15 20
Spec Compliance 14 15
Data Quality 13 15
Code Quality 9 10
Library Mastery 8 10
Total 88 100

Visual Quality (29/30)

  • VQ-01: Text Legibility (7/8) — all text readable in both themes; title is on the smaller side (~44% width) vs. the comfortable 50-70% band
  • VQ-02: No Overlap (6/6)
  • VQ-03: Element Visibility (6/6)
  • VQ-04: Color Accessibility (2/2)
  • VQ-05: Layout & Canvas (4/4) — canvas gate passed exactly (2400×2400), no clipping
  • VQ-06: Axis Labels & Title (2/2)
  • VQ-07: Palette Compliance (2/2) — canonical order, correct theme-adaptive backgrounds

Design Excellence (15/20)

  • DE-01: Aesthetic Sophistication (6/8) - Custom packing algorithm + deliberate depth-based alpha layering
  • DE-02: Visual Refinement (5/6) - Chrome fully hidden, generous whitespace
  • DE-03: Data Storytelling (4/6) - Hierarchy reads well overall, but the label-floor bug (see weaknesses) leaves whole categories without readable substructure

Spec Compliance (14/15)

  • SC-01: Plot Type (5/5)
  • SC-02: Required Features (3/4) - Color-by-category, root padding, packing algorithm all present; "labels for larger circles" inconsistently honored
  • SC-03: Data Mapping (3/3) - Leaf circle area (not radius) scales with value
  • SC-04: Title & Legend (3/3)

Data Quality (13/15)

  • DQ-01: Feature Coverage (4/6) - 60 nodes across 4 levels, but many subcategories end up unlabeled
  • DQ-02: Realistic Context (5/5) - Disk-storage folder hierarchy
  • DQ-03: Appropriate Scale (4/4)

Code Quality (9/10)

  • CQ-01: KISS Structure (2/3) - Struct + 5 helper functions needed for manual circle packing; justified but not flat-script simple
  • CQ-02: Reproducibility (2/2)
  • CQ-03: Clean Imports (2/2)
  • CQ-04: Code Elegance (2/2)
  • CQ-05: Output & API (1/1)

Library Mastery (8/10)

  • LM-01: Idiomatic Usage (4/5)
  • LM-02: Distinctive Features (4/5) - Hand-rolled tangent-circle packing algorithm is genuinely distinctive given Makie has no built-in packing primitive and NetworkLayout.jl is out of scope

Score Caps Applied

  • None

Strengths

  • Implements a genuine greedy circle-packing algorithm from scratch (tangent-point placement, bottom-up enclosing-radius sizing) — no NetworkLayout.jl workaround
  • Leaf circle area (not radius) scales with node.value via r = sqrt(value), satisfying the spec's area-encoding requirement
  • Imprint palette applied in canonical order; both renders keep data colors identical and flip only chrome tokens, no dark-on-dark/light-on-light failures
  • Root circle drawn as a faint outlined container encompassing all children with visible padding, matching the spec note
  • Depth-based fill alpha (0.16/0.38/0.88) creates a clear, deliberate visual hierarchy
  • Canvas lands exactly on 2400×2400; title format matches the mandated convention exactly

Weaknesses

  • subcat_label_floor is computed from the GLOBAL root radius (0.10 * root.r) instead of each category's own radius, so smaller categories lose almost all subcategory labels — "Code" shows zero subcategory labels and "System" shows only "Cache", even though those circles are large relative to their own category. Compute the floor relative to each category node's own radius instead.
  • CQ-01: the implementation necessarily introduces a struct and 5 helper functions to implement circle packing manually — justified by the plot type, but a real departure from the flat-script ideal.
  • Title occupies only ~44% of canvas width, below the ~50-70% comfortable band — could be sized up slightly given the ample surrounding whitespace.

Issues Found

  1. SC-02/DE-03/DQ-01 MEDIUM: Subcategory label visibility threshold is computed from the global root radius rather than per-category, so entire categories (Code, most of System) render with no readable subcategory labels
    • Fix: change subcat_label_floor = 0.10 * root.r to a per-category threshold, e.g. compute it as 0.18 * cat_node.r inside the labeling loop (using each node's parent/category radius) so every category gets a comparable share of labeled subcircles
  2. CQ-01 LOW: Struct + 5 helper functions depart from the KISS ideal
    • Fix: acceptable as-is given the algorithmic requirement; no action needed unless a simpler packing approach is found
  3. VQ-01/VQ-05 LOW: Title is smaller than the comfortable proportional band
    • Fix: consider bumping titlesize slightly (e.g. 26 → 30) since there is ample whitespace above the root circle

AI Feedback for Next Attempt

Fix the subcategory label floor so it's computed relative to each category's own radius instead of the global root radius — this is the main gap keeping the "Code" and "System" categories from showing any internal structure to the viewer. Everything else (algorithm, palette, theming, canvas) is solid; only minor polish (slightly larger title) would help beyond that.

Verdict: APPROVED

@github-actions github-actions Bot added quality:88 Quality score: 88/100 ai-rejected Quality not OK, triggers update labels Sep 2, 2026
@github-actions github-actions Bot added ai-attempt-1 First repair attempt and removed ai-rejected Quality not OK, triggers update labels Sep 2, 2026
Attempt 1/4 - fixes based on AI review
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Repair Attempt 1/4

Applied fixes based on AI review feedback.

Status: Repair completed, re-triggering review...


🤖 impl-repair

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Review - Attempt 2/3

Image Description

Light render (plot-light.png): Warm off-white background (#FAF8F1), not pure white. Bold dark title "circlepacking-basic · julia · makie · anyplot.ai" top-center, clearly readable. A thin dark-ink-soft stroke marks the root container circle with generous padding. Four category clusters (Documents/green, Media/lavender, Code/blue, System/ochre) use the Imprint palette in canonical order, each a low-alpha tinted circle containing medium-alpha subcategory circles and near-opaque leaf circles — a deliberate three-tier alpha hierarchy (0.16/0.38/0.88). Bold category labels ("Documents", "Media", "Code", "System") sit below each cluster in dark ink, all legible. Subcategory labels render inconsistently: Media shows all 4 ("Videos", "Photos", "Audio", "Design Files"); Documents shows only 2 of 3 ("Reports", "Presentations" — "Spreadsheets" is blank); System shows only 1 of 4 ("Cache" — "Logs"/"Config"/"Temp" are blank); Code shows 0 of 4 ("Frontend"/"Backend"/"Scripts"/"Tests" are all blank, despite those circles being visually comparable in size to labeled circles elsewhere). All text that is rendered is legible against the light background — no light-on-light failures.

Dark render (plot-dark.png): Same layout on a warm near-black background (#1A1A17). Title, category labels, and root-circle stroke correctly flip to light ink (#F0EFE8) and remain fully readable — no dark-on-dark failures. Data hues (green/lavender/blue/ochre) are pixel-identical to the light render; only chrome flipped, as required. The exact same subcategory-label gaps persist: 0/4 in Code, 1/4 in System, 2/3 in Documents, 4/4 in Media — confirmed via direct pixel search for ink-colored text in each category's bounding box (zero ink pixels found in the Code region in both themes).

Both paragraphs are required. A review that only describes one render is invalid.

Score: 79/100

Category Score Max
Visual Quality 29 30
Design Excellence 13 20
Spec Compliance 12 15
Data Quality 12 15
Code Quality 8 10
Library Mastery 5 10
Total 79 100

Visual Quality (29/30)

  • VQ-01: Text Legibility (7/8) — everything that renders is legible in both themes; not docked further here since the missing-label defect is a content/completeness issue, scored under SC-02/DE-03/DQ-01 below.
  • VQ-02: No Overlap (6/6)
  • VQ-03: Element Visibility (6/6)
  • VQ-04: Color Accessibility (2/2)
  • VQ-05: Layout & Canvas (4/4) — canvas gate passed exactly at 2400×2400, no clipping/overflow
  • VQ-06: Axis Labels & Title (2/2)
  • VQ-07: Palette Compliance (2/2) — first series is #009E73, canonical order, correct theme-adaptive backgrounds in both renders

Design Excellence (13/20)

  • DE-01: Aesthetic Sophistication (6/8) - Custom greedy tangent-circle packer and depth-based alpha layering (0.16/0.38/0.88) show real design intent beyond defaults
  • DE-02: Visual Refinement (5/6) - Spines/decorations hidden, generous whitespace, subtle root-circle stroke
  • DE-03: Data Storytelling (2/6) - The missing-label defect (see below) undercuts the core storytelling job of a circle-packing chart for half the dataset: an entire category (Code) reads as an undifferentiated cluster of same-colored blobs with no way to tell what any of the 4 circles represent

Spec Compliance (12/15)

  • SC-01: Plot Type (5/5)
  • SC-02: Required Features (1/4) - "Display labels for larger circles" fails hard for Code (0/4 subcategories labeled) and largely fails for System (1/4) and Documents (2/3) — see Weaknesses for root-cause evidence
  • SC-03: Data Mapping (3/3) - leaf circle area scales with value via r = sqrt(value)
  • SC-04: Title & Legend (3/3)

Data Quality (12/15)

  • DQ-01: Feature Coverage (3/6) - ~62 nodes across 4 levels is within spec range, but most of those nodes are functionally indistinguishable in the static PNG because their labels never render
  • DQ-02: Realistic Context (5/5)
  • DQ-03: Appropriate Scale (4/4)

Code Quality (8/10)

  • CQ-01: KISS Structure (2/3) - Struct + 5 helper functions are justified by the plot type (no built-in packing primitive) but remain a real departure from the flat-script ideal
  • CQ-02: Reproducibility (2/2)
  • CQ-03: Clean Imports (2/2)
  • CQ-04: Code Elegance (1/2) - The label-floor logic doesn't do what it's documented to do (see Weaknesses) — a real correctness gap, not just style
  • CQ-05: Output & API (1/1)

Library Mastery (5/10)

  • LM-01: Idiomatic Usage (3/5) - Correct use of poly!/text!/DataAspect()/hidedecorations!/hidespines!, but the per-node text!() loop is silently dropping most depth-2 labels — see Weaknesses
  • LM-02: Distinctive Features (2/5) - Hand-rolled tangent-circle packing algorithm is a genuine distinctive-engineering solution, capped low pending the label-rendering fix

Score Caps Applied

  • None triggered numerically, but see Weaknesses — this is a confirmed functional regression on the exact issue flagged (and supposedly fixed) in the previous review.

Strengths

  • Genuine greedy circle-packing algorithm from scratch (tangent-point placement, bottom-up enclosing-radius sizing) — no NetworkLayout.jl workaround, correctly avoiding the out-of-scope dependency
  • Leaf circle area (not radius) scales with value via r = sqrt(value), satisfying the spec's area-encoding requirement
  • Imprint palette applied in canonical order with correctly flipped theme-adaptive chrome and pixel-identical data colors between light/dark
  • Root circle drawn as a faint bounding container with visible padding, matching the spec note
  • Depth-based fill alpha (0.16/0.38/0.88) creates a clear three-tier visual hierarchy without extra chrome
  • Canvas lands exactly on 2400×2400; title format matches the mandated convention exactly

Weaknesses

  • Confirmed via direct re-execution of the packing algorithm (verbatim source, same seed) and pixel-level inspection of both PNGs: the per-category label-floor "fix" from attempt 1 does not work — most depth-2 labels that clear the 0.18 * category_r threshold still don't render, and the pattern doesn't correlate with the ratio at all. Actual computed ratios (re-run of the real algorithm): Code — Frontend=0.375, Backend=0.452, Scripts=0.289, Tests=0.329 (all well above 0.18) yet 0 of these 4 render (confirmed zero ink-colored pixels in the entire Code cluster region, in both themes). System — Cache=0.545 (renders), Logs=0.196, Temp=0.360 (both above 0.18, neither renders). Documents — Spreadsheets=0.300 (above 0.18, does not render) while Reports=0.438 and Presentations=0.414 do render. Media is the only category where all 4 subcategories (down to Design Files=0.188, barely above threshold) render correctly. This is not a threshold-tuning issue — it looks like a rendering-side bug in how the text!() calls in the per-node loop get drawn to the CairoMakie canvas (some are silently dropped rather than the position/threshold logic being wrong). Recommended debugging approach for the next attempt: (1) don't just re-tune the ratio constant — verify with a temporary bright scatter! marker at each candidate label position to confirm coordinates are correct; (2) try switching the per-node loop of individual text!() calls to a single vectorized text!(ax, positions; text = labels, ...) call (Makie's recommended pattern for plotting many labels at once), which may avoid whatever call-order/attribute-mutation issue is dropping labels; (3) after the fix, re-verify by inspecting the actual rendered PNG pixel-by-pixel per category (not just by checking that the ratio formula computes true) before declaring it resolved.
  • CQ-01: the implementation necessarily introduces a mutable struct (PackNode) and five helper functions (tangent_points, pack_siblings, pack!, locate!, collect_nodes!) to implement circle packing manually — justified by the plot type but still a real departure from the single flat-script ideal other plot types achieve.

Issues Found

  1. SC-02 / DE-03 / DQ-01 HIGH: Subcategory labels fail to render for the majority of circles that pass their own labeling threshold — 0/4 in Code, 1/4 in System, 2/3 in Documents. This is the same class of defect flagged in the attempt-1 review ("entire categories lose almost all subcategory labels") and the attempt-1 fix (switching the floor from global-root-relative to per-category-relative) did not resolve it — the underlying rendering behavior, not the threshold formula, needs to be diagnosed.
    • Fix: See the three-step debugging approach in Weaknesses above; verify against actual rendered pixels, not just the computed ratio.

AI Feedback for Next Attempt

The per-category label threshold you introduced last attempt computes correctly (verified by re-running your exact algorithm) — Frontend/Backend/Scripts/Tests in Code and Logs/Temp in System all clear 0.18 * category_r, yet none of them render as text in either theme's PNG. Don't re-tune the constant again; instead treat this as a rendering bug in the text!() loop itself. Try replacing the per-node individual text!() calls for depth-2 labels with one vectorized text!(ax, positions; text = labels, ...) call passing arrays, and confirm the fix by checking the actual output PNG (e.g. crop each category region and look for label pixels) rather than only checking that the threshold condition evaluates true.

Verdict: REJECTED

@github-actions github-actions Bot added quality:79 Quality score 79/100 ai-rejected Quality not OK, triggers update and removed quality:88 Quality score: 88/100 labels Sep 2, 2026
@github-actions github-actions Bot added ai-attempt-2 Second repair attempt and removed ai-rejected Quality not OK, triggers update labels Sep 2, 2026
Attempt 2/4 - fixes based on AI review
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

🔧 Repair Attempt 2/4

Applied fixes based on AI review feedback.

Status: Repair completed, re-triggering review...


🤖 impl-repair

@claude

claude Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

AI Review - Attempt 3/3

Image Description

Light render (plot-light.png): Warm off-white background (#FAF8F1), not pure white. Bold dark-ink title "circlepacking-basic · julia · makie · anyplot.ai" at top, clearly legible. No axes/ticks/spines (correctly hidden). Four Imprint-palette category clusters (Documents=green #009E73, Media=lavender, Code=blue, System=ochre) with a faint outlined root-container circle and depth-based fill alpha (0.16/0.38/0.88) giving a clear category → subcategory → leaf hierarchy. Category labels (Documents, Media, Code, System) are bold and fully legible. Subcategory labels are inconsistent: only 7 of the 13 subcategory circles that clear their own 0.18×category-radius labeling threshold actually render text — Reports, Presentations, Photos, Videos, Audio, Design Files, Cache show; Spreadsheets, Frontend, Backend, Scripts, Tests, Logs, Temp are silently missing, despite circles comparable in size to labeled peers elsewhere. All text that is rendered is fully readable against the light background — no light-on-light issues.

Dark render (plot-dark.png): Same layout on warm near-black (#1A1A17). Title, category labels, and root-circle stroke correctly flip to light ink (#F0EFE8) and stay legible — no dark-on-dark failures. Data hues are pixel-identical to the light render — only chrome flipped, as required. The exact same 7-rendered / 6-missing subcategory-label pattern persists in this theme too (confirmed via 2× pixel-crop inspection of the System and Code clusters).

Both paragraphs are required. A review that only describes one render is invalid.

Score: 79/100

Category Score Max
Visual Quality 29 30
Design Excellence 13 20
Spec Compliance 12 15
Data Quality 12 15
Code Quality 8 10
Library Mastery 5 10
Total 79 100

Visual Quality (29/30)

  • VQ-01: Text Legibility (7/8) — all rendered text is legible in both themes; the missing-label defect is a content-completeness bug, scored under SC-02/DE-03/DQ-01/LM-01 instead
  • VQ-02: No Overlap (6/6)
  • VQ-03: Element Visibility (6/6)
  • VQ-04: Color Accessibility (2/2)
  • VQ-05: Layout & Canvas (4/4) — canvas gate passed exactly at 2400×2400, no clipping
  • VQ-06: Axis Labels & Title (2/2)
  • VQ-07: Palette Compliance (2/2) — first series #009E73, canonical order, correct theme-adaptive backgrounds

Design Excellence (13/20)

  • DE-01: Aesthetic Sophistication (6/8) - Custom greedy tangent-circle packer, deliberate depth-based alpha layering
  • DE-02: Visual Refinement (5/6) - Chrome fully hidden, generous whitespace
  • DE-03: Data Storytelling (2/6) - 6 of 13 qualifying subcategory labels are missing; Code cluster shows 0/4, undercutting the chart's core job for half the dataset

Spec Compliance (12/15)

  • SC-01: Plot Type (5/5)
  • SC-02: Required Features (1/4) - "Display labels for larger circles" still fails for the majority of qualifying circles — same defect as attempt 2, unresolved
  • SC-03: Data Mapping (3/3)
  • SC-04: Title & Legend (3/3)

Data Quality (12/15)

  • DQ-01: Feature Coverage (3/6) - ~62 nodes across 4 levels within spec range, but most are functionally indistinguishable since labels never render
  • DQ-02: Realistic Context (5/5)
  • DQ-03: Appropriate Scale (4/4)

Code Quality (8/10)

  • CQ-01: KISS Structure (2/3) - Struct + 5 helper functions justified by plot type but a real departure from flat-script ideal
  • CQ-02: Reproducibility (2/2)
  • CQ-03: Clean Imports (2/2)
  • CQ-04: Code Elegance (1/2) - The vectorized text!() fix explicitly recommended last review did not resolve the flagged bug — a real, still-open correctness gap
  • CQ-05: Output & API (1/1)

Library Mastery (5/10)

  • LM-01: Idiomatic Usage (2/5) - Correct use of poly!/text!/DataAspect()/hidedecorations!/hidespines!, but text rendering for sub-labels remains unreliable across two different call styles
  • LM-02: Distinctive Features (3/5) - Hand-rolled tangent-circle packing algorithm remains genuinely distinctive engineering

Score Caps Applied

  • None numerically triggered — no category hit 0

Strengths

  • Genuine greedy circle-packing algorithm from scratch (tangent-point placement, bottom-up enclosing-radius sizing) — no NetworkLayout.jl workaround
  • Leaf circle area (not radius) scales with node.value via r = sqrt(value), satisfying the spec's area-encoding requirement
  • Imprint palette in canonical order; both renders keep data colors identical, flipping only chrome — no dark-on-dark/light-on-light failures
  • Root circle drawn as a faint bounding container with visible padding, matching the spec note
  • Depth-based fill alpha (0.16/0.38/0.88) creates a clear three-tier visual hierarchy
  • Canvas lands exactly on 2400×2400; title format matches the mandated convention exactly

Weaknesses

  • Confirmed via independent re-execution of the exact packing algorithm (verbatim source, same Random.seed!(42)) that this is NOT a threshold-tuning problem. Recomputed node.r / category_r[cat] ratios: Reports=0.438, Spreadsheets=0.300, Presentations=0.414, Photos=0.346, Videos=0.563, Audio=0.198, Design Files=0.188, Frontend=0.375, Backend=0.452, Scripts=0.289, Tests=0.329, Cache=0.545, Logs=0.196, Config=0.097 (correctly excluded, below 0.18), Temp=0.360. 13 of 14 subcategory nodes clear the 0.18 * category_r threshold, yet only 7 actually render as text in the saved PNG — Reports, Presentations, Photos, Videos, Audio, Design Files, Cache appear; Spreadsheets, Frontend, Backend, Scripts, Tests, Logs, Temp are silently absent in both themes.
  • This is the identical drop pattern as attempt 2 (Documents 2/3, Media 4/4, Code 0/4, System 1/4 — verified pixel-crop by pixel-crop). The attempt-2 fix (switching the per-node text!() loop to a single vectorized text!(ax, positions; text=labels, ...) call) produced the exact same failure signature, so the root cause is not the per-node-vs-vectorized call style — something else is silently dropping roughly half the elements of the vectorized text call, or of the underlying label set, regardless of how it's issued.
  • Recommended debugging approach for the next attempt (do not re-tune the ratio constant again, and do not re-try switching between per-node and vectorized text!() — both have now failed identically):
    1. Split the single 14-element vectorized text!() call into 4 separate per-category vectorized calls to test whether cross-category batching size is the trigger.
    2. Temporarily add a small bright scatter!() marker at each sub_positions entry (same array) to confirm every position is valid and non-NaN — this rules out a data/position bug vs. a pure text-rendering bug.
    3. Bisect by adding labels one at a time (or in small batches) and re-rendering after each addition, to isolate exactly which addition causes the previously-visible labels to start disappearing.
    4. Check for known CairoMakie 0.12.9 / Makie 0.21.9 (the versions pinned in this project's Project.toml) GitHub issues about text!() silently dropping array elements — this may be an upstream rendering bug requiring a workaround (e.g., one text!() call per node instead of a shared batched call, despite the per-node loop's own prior failure in attempt 1 — the two failure modes may have different causes worth isolating separately).
    5. Verify the fix by inspecting actual rendered pixels per category region (not just confirming the threshold formula evaluates true) before declaring it resolved.
  • CQ-01: the implementation necessarily introduces a mutable struct (PackNode) and five helper functions (tangent_points, pack_siblings, pack!, locate!, collect_nodes!) to implement circle packing manually — justified by the plot type but still a real departure from the single flat-script ideal.

Issues Found

  1. SC-02 / DE-03 / DQ-01 / LM-01 HIGH: Subcategory labels fail to render for 6 of 13 circles that clear their own labeling threshold — same defect flagged in attempt 2, unresolved by the attempt-2 fix (switching to a vectorized text!() call). Confirmed by independently recomputing the packing algorithm's actual ratios (not just visual estimate) and by pixel-crop inspection of both themes.
    • Fix: see the five-step debugging approach in Weaknesses above; this needs actual root-cause isolation (bisection / minimal repro), not another blind retry of a call-style swap.

AI Feedback for Next Attempt

The label-floor threshold is correct and not the problem — re-verified independently, 13 of 14 subcategory nodes clear 0.18 * category_r. The bug is that roughly half of a vectorized text!(ax, positions; text=labels, ...) call's elements silently fail to render, and this happened identically whether the code used a per-node loop (attempt 1→2) or a single vectorized call (attempt 2→3). Don't swap call styles again without first isolating the actual cause: bisect by rendering with labels added incrementally, or split into one text!() call per category, and confirm the fix against actual rendered pixels per category (not just the threshold formula). Everything else — the packing algorithm, palette, theming, canvas — is solid and unchanged from the strong attempt-1 review.

Verdict: REJECTED

@github-actions github-actions Bot added the ai-approved Quality OK, ready for merge label Sep 2, 2026
@MarkusNeusinger
MarkusNeusinger merged commit 05b8ebd into main Sep 2, 2026
@MarkusNeusinger
MarkusNeusinger deleted the implementation/circlepacking-basic/makie branch September 2, 2026 16:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-approved Quality OK, ready for merge ai-attempt-1 First repair attempt ai-attempt-2 Second repair attempt quality:79 Quality score 79/100

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant