fix(ui): the workbench audit — the graph survives scale, choudoufu edges and words, ⌘K by address, and the license (#393, #394) - #407
Merged
Conversation
…ges and words, ⌘K by address, and the license (#393, #394) The audit's fixes as one commit on main. Layout at scale (an edgeless box wraps its cards; a box with edges packs its components; module sub-boxes; count badges and a collapse lens), intra-estate edges for a choudoufu member from the terraform lexicon, ⌘K by address, choudoufu's own words in the legend, cards that say what their box does not, the UNOWNED inspect leading with the adopt tags, boot on resources, runtime only where it applies, no 500 on /api/resources, the roots note everywhere it belongs, and Apache-2.0 declared and shipped with the notices carried by export. PR #395 has the milestone-by-milestone account. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DoXg2GDWwXJRPQo76t9Nrq
Merged
This was referenced Sep 10, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Supersedes #395, which GitHub closed when its base branch was deleted on #392's merge; same branch, same content, now one commit on main.
Closes #393, #394. Stacked on #392 (the workbench); every measurement below was taken on the workbench entries it added.
The audit's headline was that the graph did not survive scale: terralith-4, 301 choudoufu resources, rendered as a 144,010 × 316 strip with nothing clickable. It is now a 7,660 × 5,162 picture with 266 edges, module sub-boxes and a count badge, and ⌘K lands on any address.
What changed
Layout at scale (src/edgeless.ts, src/render.ts)
module.<name>[...]instance inside a choudoufu member, drawn from where the cards landed, ids stable.301 resources · 84 bound · 85 unowned · 132 neutral), and acollapse=1lens that folds a box over 40 cards into one summary card; a palette command toggles it.Edges (src/choudoufu-refs.ts) — a choudoufu member's read also runs the terraform lexicon over the same directory when it is resolvable, and joins its reference edges onto the roster by address, module instance by module instance. count/for_each pairs join key-to-key when both ends expand over the same keys, falling back to the full product otherwise, and every such edge is marked inferred. Without the lexicon the note names the install line instead of claiming nothing references anything.
Search — ⌘K matches node ids and addresses from the painted graph, Enter selects the card and pans the viewBox onto it. Works in a static export.
Words and cards — the legend, the statusbar and the Model tab speak choudoufu's words (bound / unowned / pending / not observed) on a choudoufu estate, derived from the member kinds and carried on the overlay meta; a mixed estate keeps chant's words and says so. A card is painted with its address alone and the rows the box does not already carry (
owned by:stays;rung:only when it is not the common one); ids are untouched, the display id is restored on the finished SVG, and a label two cards would share is used for neither. The UNOWNED inspect leads with the two adopt tags as one copyable line; choudoufu 0.16's JSON carries no adoption command, so behold composes none.Boot, zoom, notes, bugs — a non-chant estate boots on
resources;runtimeis offered only where a member could have runtime children;/api/resourcesno longer 500s on a non-chant estate; "estate of 1 project"; the roots note survives the logical zoom, has a short form for the strip and the full text on a tooltip and in the Model tab; waterpark's empty member box is gone (the root boxes take the member's name when the estate has more than one member); a data-URI favicon stops the 404 every load fetched.License (#394) — Apache-2.0 to match chant:
LICENSE, the package.json field, LICENSE + THIRD_PARTY.md + licenses/ in the shipped files (asserted by test), andbehold exportcopies the notices into every bundle. Republishing is a release step.Numbers
bash e2e/workbench-e2e.shon the author's machine, on this branch: 8 entries green, 3 skipped (the two chant examples have no node_modules and an in-place entry is never installed; fountain-ops is excluded by name), 499s, no scratch container left. terralith-4: 301 nodes, 266 edges, 1.58:1 at detail 2, badged, collapses to one card; terralith-4-adopt: 85 unowned before the by-hand live-import, 301 bound after; the cohorts and the workbench now carry 1 to 51 edges each; waterpark untouched.Built how
Five Opus agents in worktrees off this branch, merged by hand in two waves; the three merge commits carry the reconciliation (one word for the "directory is its own member" shape, bands read off real ids, footprints measured with the face overrides).
just checkandnpm run smoke:uigreen at every merge.🤖 Generated with Claude Code
https://claude.ai/code/session_01DoXg2GDWwXJRPQo76t9Nrq