Child of #378. A design call before either of the other two lands, because it decides what they are drawing.
The number
chant graph --format ir over waterpark's six roots: 247 nodes for 43 resources.
| kind |
count |
Terraform::Variable |
108 |
Terraform::Output |
53 |
Terraform::Resource |
43 |
Terraform::Terraform |
14 |
Terraform::Locals |
10 |
Terraform::Data |
8 |
Terraform::Module |
7 |
Terraform::Provider |
4 |
Four fifths of the estate graph is not infrastructure. A terraform {} block is a card. Every variable is a card. The picture that results is a 275KB SVG in which the resources are a minority of the ink.
This is the lexicon being right: it reads every block because the post-synth checks and chant audit need every block. It is the renderer's job to decide which of them are cards.
The decision
What is a card at each zoom, and it should be settled once rather than per-lens:
- Default. Resources, modules, data sources. Twenty-two nodes on waterpark instead of 247. This is the estate.
- Deeper. Outputs and variables, which are the estate's interface, and which carve's own report already treats as edge endpoints (
output.* -value-> …) rather than dropping.
- Never a card, but reachable.
terraform {}, provider {}, locals {} — settings, not estate. They belong in the inspect pane of the root's box, or in a panel row, not on the canvas.
behold has a zoom axis already (ZOOM_OPTS, ?detail=), and chant has its own detail tiers. Worth deciding which one carries this: a behold-side filter is honest about being a view choice, a chant-side one would make every consumer agree. My read is behold-side, because "what is worth drawing" is a rendering opinion and chant should keep emitting everything.
Definition of done
- A stated rule for which entity kinds are cards at which zoom, written down where the next lens can find it (AGENTS.md, beside the member-kind section).
- The default view of a Terraform estate leads with infrastructure.
- Nothing is dropped silently: a filtered-out kind is counted somewhere a person can see, the way
edgelessNote says why a view has no edges rather than implying there are none.
Why now
#379 decides what a card says and #380 decides which box it sits in. Both are cheaper to do once against an agreed set than to redo when the default view turns out to be unreadable.
🤖 Claude Code — https://claude.ai/code/session_0124XP1LJTZxgJRy7Dh1UfXt
Child of #378. A design call before either of the other two lands, because it decides what they are drawing.
The number
chant graph --format irover waterpark's six roots: 247 nodes for 43 resources.Terraform::VariableTerraform::OutputTerraform::ResourceTerraform::TerraformTerraform::LocalsTerraform::DataTerraform::ModuleTerraform::ProviderFour fifths of the estate graph is not infrastructure. A
terraform {}block is a card. Everyvariableis a card. The picture that results is a 275KB SVG in which the resources are a minority of the ink.This is the lexicon being right: it reads every block because the post-synth checks and
chant auditneed every block. It is the renderer's job to decide which of them are cards.The decision
What is a card at each zoom, and it should be settled once rather than per-lens:
output.* -value-> …) rather than dropping.terraform {},provider {},locals {}— settings, not estate. They belong in the inspect pane of the root's box, or in a panel row, not on the canvas.behold has a zoom axis already (
ZOOM_OPTS,?detail=), and chant has its own detail tiers. Worth deciding which one carries this: a behold-side filter is honest about being a view choice, a chant-side one would make every consumer agree. My read is behold-side, because "what is worth drawing" is a rendering opinion and chant should keep emitting everything.Definition of done
edgelessNotesays why a view has no edges rather than implying there are none.Why now
#379 decides what a card says and #380 decides which box it sits in. Both are cheaper to do once against an agreed set than to redo when the default view turns out to be unreadable.
🤖 Claude Code — https://claude.ai/code/session_0124XP1LJTZxgJRy7Dh1UfXt