feat: the k3d/floci estates render whole — cluster root, helm releases, honest component status - #159
Merged
Merged
Conversation
…s, honest component status
Verified against a live kubemicrovm-ops (k3d + floci, tier prod-ha) and
fountain-ops. Five gaps, one theme: what the estate actually runs was
invisible or wrongly painted.
- Component status: an ABSENT deploy unit (`stack: {name}` — no status, no
healthy) painted accent as if mid-deploy, outranking its own all-present
rollup; five of kubemicrovm's seven components read "in flux" on a green
estate. Only `healthy: false` decides now; absence falls through to the
rollup.
- The cluster build root: the estates declare their k3d cluster as chant
source in `cluster/`, deliberately outside sourceDir, so no view ever saw
it — the k8s half rendered inside a synthetic `cluster <env>` box.
`clusterRootGraphIr` reads that root the way the estates' own justfiles
do; the merged K3d::Cluster is painted from `k3d cluster list` (running →
good, declared-but-absent → accent) and becomes the cluster box.
- Cluster anchoring: `K3d::Cluster` joins MANAGED_CLUSTER_KINDS, and the
bound kube context (k8s.profiles.<env>.context — the dead-code
contextBindsCluster, finally wired, now k3d-aware) breaks the multi-
cluster tie, so fountain-ops's two declared clusters anchor to the one
the reads actually land on instead of declining.
- Helm releases: a deploy-step estate (helm-upgrade units, no declared
Helm::Chart nodes) observed its releases and had nothing to hang them on
— helm was invisible on every zoom. Observed releases matching no
declared chart synthesize as Helm::Release nodes: component-owned ones
(release names scraped from *.component.ts, the same convention ops.ts
uses) good/warn by helm status, the rest warn (foreign). The logical view
places them in their namespace boxes, creating the box under the cluster
for an observed-but-undeclared namespace. applyHelmArtifacts + the
synthesis + the wrong-tier note now also run on /api/refresh and the
logical overlay branch, which silently dropped them.
- Substrates: the Floci probe accepts `chant-floci` (chant emulator up's
container name) alongside `floci`; the Helm pill reports the PROJECT'S
bound context instead of the ambient current-context (observed live: an
estate bound to k3d-kubemicrovm-local whose pill named a real EKS
cluster); the /api/apply Floci #16 pre-flight only fires when applies
actually target Floci — on a k8s/helm estate a re-apply is the normal
sync gesture and used to 409 with an error naming an emulator the project
doesn't use.
pinhole ^0.2.5: reserved `_`-attrs stay off cards (no more `_status: good`
printed on every overlay card), childless containers lay out finite, and
group boxes carry the container node's status tint.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NEtbXBSwLiYFMKv2o4VMb4
lex00
added a commit
that referenced
this pull request
Aug 7, 2026
… no phantom docs (#160) Moving every write into the ⌘K palette (#73) left the header with zero action buttons: behold looked read-only unless you happened to press ⌘K, the docs still said "click Run floci-apply" about buttons that no longer existed, and an estate had three differently-named routes to the same apply. Concretely: - The PRIMARY deploy gesture is a header button again. A committed ApplyOp gets `▶ Deploy (<op>)` (+ `Approve <gate>` beside it when gated); a project with only components gets `▶ Deploy…`, which opens the dial's component picker. One intent, one word — the tooltip carries the mechanism. Everything else stays in ⌘K. - The dial no longer vanishes wordlessly when no env is picked — it says what's missing and where to pick it. A static export keeps the silence (there is genuinely nothing to offer). - Errors get a toast at the point of gesture, not only a line in a bottom log pane that is display:none until something writes to it. Successes toast too ("running <op> — output streams in the log below"), so a palette action no longer closes into dead air. - The Floci #16 warnings (re-apply collides on the emulator) only appear when the estate actually targets Floci — a k3d/helm estate used to be warned about an emulator it doesn't use, in dialogs and in the 409 (the server side of this gating landed in #159). - Docs describe the UI that exists: README, example-k8s/README, run-it.mdx, and acting.mdx's action table (button vs palette, per action). Claude-Session: https://claude.ai/code/session_01NEtbXBSwLiYFMKv2o4VMb4 Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This was referenced Aug 7, 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.
Verified against a live kubemicrovm-ops (k3d + floci, tier prod-ha) and fountain-ops. Five gaps, one theme: what the estate actually runs was invisible or wrongly painted.
stack: {name}— no status, no healthy) painted accent as if mid-deploy, outranking its own all-present rollup; five of kubemicrovm's seven components read "in flux" on a green estate. Onlyhealthy: falsedecides now; absence falls through to the rollup.cluster/, deliberately outside sourceDir, so no view ever saw it — the k8s half rendered inside a syntheticcluster <env>box.clusterRootGraphIrreads that root the way the estates' own justfiles do; the mergedK3d::Clusteris painted fromk3d cluster listand becomes the cluster box.K3d::ClusterjoinsMANAGED_CLUSTER_KINDS, and the bound kube context (the dead-codecontextBindsCluster, finally wired, now k3d-aware) breaks the multi-cluster tie — fountain-ops's two declared clusters anchor to the one the reads actually land on instead of declining.Helm::Chartnodes) observed its releases and had nothing to hang them on — helm was invisible on every zoom. Observed releases matching no declared chart synthesize asHelm::Releasenodes: component-owned ones good/warn by helm status, the rest warn (foreign). The logical view places them in their namespace boxes. The artifact join + synthesis + wrong-tier note now also run on/api/refreshand the logical overlay branch.chant-flocialongsidefloci; the Helm pill reports the project's bound context instead of the ambient one; the/api/applyFloci writes: delegated Adopt — foreign node → ReconcileOp → PR (#8) #16 pre-flight only fires when applies actually target Floci — on a k8s/helm estate a re-apply is the normal sync gesture and used to 409 with an error naming an emulator the project doesn't use.Also bumps pinhole to ^0.2.5 (reserved
_-attrs off cards, finite childless boxes, group-box status tint).Live receipts (kubemicrovm-ops, all against the running estate): components zoom went from
{accent:5, good:1, neutral:1}to{good:3, neutral:4}; the logical cluster box islocalCluster · Cluster(good tint) instead ofcluster dev; the Helm pill readscontext k3d-kubemicrovm-local (bound)where it previously named an unrelated real EKS cluster; SVGs carry zero_status:card-text occurrences (was 7–19 per view).🤖 Generated with Claude Code
https://claude.ai/code/session_01NEtbXBSwLiYFMKv2o4VMb4