diff --git a/ROADMAP.md b/ROADMAP.md index 33ea7b9c2..cf28b02d9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,7 +2,7 @@ **Stage: alpha** (declared by the owner 2026-10-22) · the alpha gate passed: the owner walked every workflow end to end on real clusters (2026-10-17 to 2026-10-20, the last five in the gate walk of 2026-10-20 on the staging cluster) and re-walked every fix that touches it on 2026-10-22, each passed, his findings AW1–AW19 none blocking ([G16](docs/parity/gaps.md#g16-stability-and-the-user-bug-backlog), [D-114](docs/developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)); ready for real work ~47% (estimated 2026-10-22), inside the ~40–75% band: both alpha conditions hold · next: the alpha walk's findings AW1–AW19 (G16, D-114), then the way to beta (ready for real work ≥ ~75%, no gap marked *blocks beta*) · Linux: a `.deb` for amd64 and arm64 with Cogpit's APT repository and updates through apt, built 2026-10-20 night (D-108), first in the release after v0.32.0 · Windows: an NSIS setup for x64 with WinSparkle's updates and the terminal on ConPTY, built 2026-10-21 (D-111), merged (PR #66) and in the releases since v0.37.0 -> **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-22 · **Change:** minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): feature breadth ~88% with 7 of 10 authentication rows and 3 of 10 paid features, the cloud-plugin discount removed: mainstream ~59%, essentials ~69%; the audience table, Why pre-alpha, the connectivity dimension and Upcoming's line on it); minor (the readiness recount after the owner's re-walk of the gate, the lead's estimate of 2026-10-22: ready for real work ~47%, mainstream ~42%, essentials ~48%, the full Lens target ~31%, every dimension's % and the Interface, Connectivity, Helm and Foundation hours from the gap entries; the stage line and Why pre-alpha: the gate passed, both alpha conditions hold, alpha on the owner's word; Upcoming rank 7, the beta table's alpha and readiness rows; the progress log: the alpha walk); trivial (Upcoming's upstream line: Fyne's font cache fix, PR fyne#6620, and the terminal pull requests' state); minor (progress log: CI and test time, D-112, on the branch `ci-speed`); minor (Cogpit for Windows, D-111, on the branch `windows-release`: feature breadth ~86% with 9 of 13 package rows, 86.0% weighted, the platforms dimension, G22 re-estimated 20–45 h and the full Lens target ~360–900 h, the progress log); minor (Cogpit for Linux, D-108, 2026-10-20 night: feature breadth ~86% with 8 of 13 package rows, the platforms dimension, G22 re-estimated 30–65 h and the full Lens target ~370–920 h, the progress log; readiness not re-estimated, it measures macOS; Beyond Lens 61 of 74 rows done, 12 partial); minor (stage line, the path to alpha and the progress log: GW1–GW14 built 2026-10-20); minor (stage line, the path to alpha and the progress log: the owner's gate walk of 2026-10-20, every workflow passed, findings GW1–GW9 in G16); minor (progress log and stage line: fast scrolling released as v0.30.0); minor (stage line and progress log: fast scrolling merged after the owner's look of 2026-10-20); minor (stage line and progress log, 2026-10-20 night run: fast scrolling built on the branch `fast-scroll`, D-102 on a real cluster, H-118's waiting line and four bugs found through flakes fixed, v0.29.1 to v0.29.3); minor (stage line and progress log, 2026-10-19 evening: H-125, H-126, the stale container square, the stuck ⌘ and debug containers built and released as v0.28.0 and v0.29.0; the walks on hold; the fast-scroll finding); trivial (progress log, 2026-10-19: the owner's answers on H-125 and H-126 built the same day); minor (stage line, the path to alpha, macOS distribution: the owner's findings WF31–WF45 built 2026-10-19, WF42 in his visual review the same afternoon; his re-walk next); minor (Beyond Lens: what holds a Terminating namespace and Remove finalizers, the owner's WF43, D-98, a row of Cogpit's own, done; 59 of 72 rows done, 11 partial); minor (stage line, Why pre-alpha and the path to alpha and beta brought to the owner's walks of 2026-10-17 to 2026-10-19; the readiness and the hours marked as of before the walks; progress log: 2026-10-19); minor (progress log: 2026-10-18, the owner's walk findings WF11–WF30 built (D-85 to D-95), v0.25.0 and v0.26.0; beyond Lens 58 of 71 rows done, the free interface rows 118 of 121); minor (progress log: the evening of 2026-10-17, the owner's walk findings WF1–WF10 built, v0.24.0); minor (Beyond Lens: a pre-choice before any integration is looked for and Ask again, the owner's WF5 and WF4 of 2026-10-17, D-82, two rows done); minor (progress log: the day of 2026-10-17, cluster integrations D-76 to D-79, F23 to F29, D-80, D-81); minor (Beyond Lens: Reconnect from the kubeconfig file with the tabs kept, the owner's F28 and F29 of 2026-10-17, D-81, done; 54 of 67 rows done, 11 partial); minor (Beyond Lens: every pod's worst image rating in the Pods list, D-78, done; 53 of 66 rows done); minor (Beyond Lens: a cluster's accent colour, the owner's F26 of 2026-10-17, D-80, a row of Cogpit's own, partial: the setting only; 52 of 66 rows done, 11 partial); minor (Beyond Lens: Kyverno's policy violations on the objects and for agents, the owner's I7 of 2026-10-17, D-79, two rows of Cogpit's own, done; 48 of 58 rows done, 8 partial); minor (Beyond Lens: the cluster's alerts, the title bar's pill and the alert board, the owner's I4 and I5 of 2026-10-17, D-77, two rows of Cogpit's own, done; 48 of 58 rows done, 8 partial); minor (Beyond Lens: cluster integrations, the owner's words of 2026-10-17, D-76, three rows of Cogpit's own, 1 done and 2 partial; 48 of 61 rows done, 10 partial); minor (Beyond Lens: a pod's image ratings from Trivy Operator's reports in its drawer, the owner's I6 of 2026-10-17, D-78, done, the Pods list's worst rating missing; 47 of 58 rows done); minor (progress log: the morning of 2026-10-17, D-74, F20 to F22, v0.22.0); minor (Beyond Lens: a client certificate's time left in the cluster lists, the owner's F22 of 2026-10-17, D-75, a row of Cogpit's own, done; 46 of 56 rows done); minor (progress log: the night run of 2026-10-16/17); minor (Upcoming: G12 1–4 h, was 2–7, night run 2026-10-16/17); minor (Beyond Lens ~2–6 h and Upcoming: G17 closed and M9 done, 2026-10-16 night); minor (Upcoming 3: the welcome page without its button, built 2026-10-16 night); minor (Upcoming: the steps from alpha to beta, 2026-10-16 evening); minor (Upcoming 3: D-57's night decisions confirmed by the owner, audit of 2026-10-16, but the menu path and the welcome page's button); minor (Interface: Lens Metrics not a target, Cogpit Metrics withdrawn by the owner 2026-10-16, D-61: 117 of 120 interface rows, breadth unchanged at 84.8%; G12 2–7 h, Helm releases and metrics 4–15 h); minor (Beyond Lens: D-69 stage 3, two rows of Cogpit's own, 45 of 55 rows done, 8 partial); minor (Upcoming 1: v0.13.0 has its disk image since a re-run); minor (progress log: the day run of 2026-10-16, F10 to F18); minor (Beyond Lens: the connection log, D-66, a row of Cogpit's own, partial, 42 of 53 rows done, 9 partial); minor (Next 1 done: the first update through the feed, 2026-10-16; beyond Lens 43 of 52 rows done, 7 partial); minor (Next 1: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0); minor (Next 1: v0.14.0 and v0.15.0 notarized with files on 2026-10-16, appcasts waiting for the owner); minor (hours recounted after the night run: alpha ~50–200 h, beta ~220–600 h, free parity ~220–620 h, the full Lens target ~380–940 h); minor (beyond Lens 42 of 52 rows done: the Diagnostics view's memory per kind, G3; G3's discovery cached on disk, D-65; hours not recounted); minor (Interface: Lens Metrics partial, Cogpit Metrics (D-61, G12, night run of 2026-10-15/16), 118 of 121 interface rows; breadth ~85% (weighted 84.8%); G12 3–10 h (was 7–21): beta ~235–640 h, full parity ~240–655 h, the full Lens target ~395–980 h, Helm releases and metrics 5–18 h; readiness percentages unchanged); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Upcoming rank 2, standby and lost connections, built 2026-10-16 (D-58), the owner's check left; beyond Lens 41 of 52 rows done); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Feature breadth: 42 of 42 actions with a Secret's drawer Save, D-59; rank 4: the drawer's audit answers built, night run 2026-10-15); minor (next item 4: the chat's audit answers built in the night run: send all tools, `http://` warning and CA file, F9); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (next item 4: the chat's send all tools, `http://` warning and CA file built in the night run); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (next item 4: the chat's send all tools built in the night run); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Upcoming rank 3, choosing a cluster, built in the night run, D-57; readiness and hours not moved) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-13 · **Last updated:** 2026-10-22 · **Change:** minor (the alpha walk's findings AW1–AW19 built 2026-10-22, PRs #74 to #82, the re-walk open; a Secret's value copied without showing it; a progress log row); minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): feature breadth ~88% with 7 of 10 authentication rows and 3 of 10 paid features, the cloud-plugin discount removed: mainstream ~59%, essentials ~69%; the audience table, Why pre-alpha, the connectivity dimension and Upcoming's line on it); minor (the readiness recount after the owner's re-walk of the gate, the lead's estimate of 2026-10-22: ready for real work ~47%, mainstream ~42%, essentials ~48%, the full Lens target ~31%, every dimension's % and the Interface, Connectivity, Helm and Foundation hours from the gap entries; the stage line and Why pre-alpha: the gate passed, both alpha conditions hold, alpha on the owner's word; Upcoming rank 7, the beta table's alpha and readiness rows; the progress log: the alpha walk); trivial (Upcoming's upstream line: Fyne's font cache fix, PR fyne#6620, and the terminal pull requests' state); minor (progress log: CI and test time, D-112, on the branch `ci-speed`); minor (Cogpit for Windows, D-111, on the branch `windows-release`: feature breadth ~86% with 9 of 13 package rows, 86.0% weighted, the platforms dimension, G22 re-estimated 20–45 h and the full Lens target ~360–900 h, the progress log); minor (Cogpit for Linux, D-108, 2026-10-20 night: feature breadth ~86% with 8 of 13 package rows, the platforms dimension, G22 re-estimated 30–65 h and the full Lens target ~370–920 h, the progress log; readiness not re-estimated, it measures macOS; Beyond Lens 61 of 74 rows done, 12 partial); minor (stage line, the path to alpha and the progress log: GW1–GW14 built 2026-10-20); minor (stage line, the path to alpha and the progress log: the owner's gate walk of 2026-10-20, every workflow passed, findings GW1–GW9 in G16); minor (progress log and stage line: fast scrolling released as v0.30.0); minor (stage line and progress log: fast scrolling merged after the owner's look of 2026-10-20); minor (stage line and progress log, 2026-10-20 night run: fast scrolling built on the branch `fast-scroll`, D-102 on a real cluster, H-118's waiting line and four bugs found through flakes fixed, v0.29.1 to v0.29.3); minor (stage line and progress log, 2026-10-19 evening: H-125, H-126, the stale container square, the stuck ⌘ and debug containers built and released as v0.28.0 and v0.29.0; the walks on hold; the fast-scroll finding); trivial (progress log, 2026-10-19: the owner's answers on H-125 and H-126 built the same day); minor (stage line, the path to alpha, macOS distribution: the owner's findings WF31–WF45 built 2026-10-19, WF42 in his visual review the same afternoon; his re-walk next); minor (Beyond Lens: what holds a Terminating namespace and Remove finalizers, the owner's WF43, D-98, a row of Cogpit's own, done; 59 of 72 rows done, 11 partial); minor (stage line, Why pre-alpha and the path to alpha and beta brought to the owner's walks of 2026-10-17 to 2026-10-19; the readiness and the hours marked as of before the walks; progress log: 2026-10-19); minor (progress log: 2026-10-18, the owner's walk findings WF11–WF30 built (D-85 to D-95), v0.25.0 and v0.26.0; beyond Lens 58 of 71 rows done, the free interface rows 118 of 121); minor (progress log: the evening of 2026-10-17, the owner's walk findings WF1–WF10 built, v0.24.0); minor (Beyond Lens: a pre-choice before any integration is looked for and Ask again, the owner's WF5 and WF4 of 2026-10-17, D-82, two rows done); minor (progress log: the day of 2026-10-17, cluster integrations D-76 to D-79, F23 to F29, D-80, D-81); minor (Beyond Lens: Reconnect from the kubeconfig file with the tabs kept, the owner's F28 and F29 of 2026-10-17, D-81, done; 54 of 67 rows done, 11 partial); minor (Beyond Lens: every pod's worst image rating in the Pods list, D-78, done; 53 of 66 rows done); minor (Beyond Lens: a cluster's accent colour, the owner's F26 of 2026-10-17, D-80, a row of Cogpit's own, partial: the setting only; 52 of 66 rows done, 11 partial); minor (Beyond Lens: Kyverno's policy violations on the objects and for agents, the owner's I7 of 2026-10-17, D-79, two rows of Cogpit's own, done; 48 of 58 rows done, 8 partial); minor (Beyond Lens: the cluster's alerts, the title bar's pill and the alert board, the owner's I4 and I5 of 2026-10-17, D-77, two rows of Cogpit's own, done; 48 of 58 rows done, 8 partial); minor (Beyond Lens: cluster integrations, the owner's words of 2026-10-17, D-76, three rows of Cogpit's own, 1 done and 2 partial; 48 of 61 rows done, 10 partial); minor (Beyond Lens: a pod's image ratings from Trivy Operator's reports in its drawer, the owner's I6 of 2026-10-17, D-78, done, the Pods list's worst rating missing; 47 of 58 rows done); minor (progress log: the morning of 2026-10-17, D-74, F20 to F22, v0.22.0); minor (Beyond Lens: a client certificate's time left in the cluster lists, the owner's F22 of 2026-10-17, D-75, a row of Cogpit's own, done; 46 of 56 rows done); minor (progress log: the night run of 2026-10-16/17); minor (Upcoming: G12 1–4 h, was 2–7, night run 2026-10-16/17); minor (Beyond Lens ~2–6 h and Upcoming: G17 closed and M9 done, 2026-10-16 night); minor (Upcoming 3: the welcome page without its button, built 2026-10-16 night); minor (Upcoming: the steps from alpha to beta, 2026-10-16 evening); minor (Upcoming 3: D-57's night decisions confirmed by the owner, audit of 2026-10-16, but the menu path and the welcome page's button); minor (Interface: Lens Metrics not a target, Cogpit Metrics withdrawn by the owner 2026-10-16, D-61: 117 of 120 interface rows, breadth unchanged at 84.8%; G12 2–7 h, Helm releases and metrics 4–15 h); minor (Beyond Lens: D-69 stage 3, two rows of Cogpit's own, 45 of 55 rows done, 8 partial); minor (Upcoming 1: v0.13.0 has its disk image since a re-run); minor (progress log: the day run of 2026-10-16, F10 to F18); minor (Beyond Lens: the connection log, D-66, a row of Cogpit's own, partial, 42 of 53 rows done, 9 partial); minor (Next 1 done: the first update through the feed, 2026-10-16; beyond Lens 43 of 52 rows done, 7 partial); minor (Next 1: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0); minor (Next 1: v0.14.0 and v0.15.0 notarized with files on 2026-10-16, appcasts waiting for the owner); minor (hours recounted after the night run: alpha ~50–200 h, beta ~220–600 h, free parity ~220–620 h, the full Lens target ~380–940 h); minor (beyond Lens 42 of 52 rows done: the Diagnostics view's memory per kind, G3; G3's discovery cached on disk, D-65; hours not recounted); minor (Interface: Lens Metrics partial, Cogpit Metrics (D-61, G12, night run of 2026-10-15/16), 118 of 121 interface rows; breadth ~85% (weighted 84.8%); G12 3–10 h (was 7–21): beta ~235–640 h, full parity ~240–655 h, the full Lens target ~395–980 h, Helm releases and metrics 5–18 h; readiness percentages unchanged); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Upcoming rank 2, standby and lost connections, built 2026-10-16 (D-58), the owner's check left; beyond Lens 41 of 52 rows done); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Feature breadth: 42 of 42 actions with a Secret's drawer Save, D-59; rank 4: the drawer's audit answers built, night run 2026-10-15); minor (next item 4: the chat's audit answers built in the night run: send all tools, `http://` warning and CA file, F9); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (next item 4: the chat's send all tools, `http://` warning and CA file built in the night run); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (next item 4: the chat's send all tools built in the night run); major (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate after the docs pass of rule 10: alpha ~65–240 h plus the walks, beta ~240–650 h, full parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours the sum of its gaps; 10 counted rows done; readiness percentages unchanged); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): out of the path to alpha and the essentials user's dominating work; the night run of 2026-10-15/16 in Upcoming); minor (Upcoming rewritten as the path to alpha, after the owner's audit and the two interviews of 2026-10-15 evening, standby and choosing a cluster, decided and not built; the day of 2026-10-15 in the progress log; Sparkle's update key set up by the owner; breadth and hours unchanged); minor (Interface: the terminal's scrollback, a row of its own and done (D-56, the owner's decisions of 2026-10-15), 117 of 121 interface rows); minor (Beyond Lens: the built-in agent's settings row done, the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), 36 of 44 rows done, 6 partial); minor (Feature breadth: 41 of 41 actions, a Config Map's drawer Save, the owner's F3; breadth not moved); minor (Beyond Lens: the layout toggles, F7, 35 of 44 rows done; the Update button built); minor (Upcoming rank 6: R3 postponed by the owner until the rest is done); minor (progress log: the night run of 2026-10-14/15, the built-in agent and the owner's decisions of 2026-10-14 evening built but R3 and A10; Upcoming rank 6 the owner's audit; actions 40 of 40; hours not recounted); minor (Upcoming item 1: the About dialog fixed); minor (the owner's decision round of 2026-10-14 evening: beyond Lens 24 of 43 rows done, 5 partial (two rows he required, missing); Upcoming: his findings in a real window first, his decisions as rank 6; breadth unchanged at ~85%, hours not recounted); minor (Sparkle 2 and the signed appcast built, waiting for the owner's update key (D-4, G14): breadth ~84%, 116 of 120 interface rows, 6 of 13 package rows, beyond Lens 24 done and 5 partial; hours not recounted); minor (night build of 2026-10-13/14 in the progress log: Flux CD and Argo CD sections, Create Secret and the node shell, namespace-limited users, workload drawers' Pods, tabs across restarts, agents reading dock tabs; 39 of 39 actions, breadth ~82%, beyond Lens 23 of 40 done; the CI rework of 2026-10-13 in the progress log: parallel jobs, sharded race tests, semantic-release live; the day run of 2026-10-13 in the progress log: D-29, the lists' copy icons, the decoded certificates (D-30) and local times (D-31) built, Upcoming 2 done, breadth unchanged at ~79%, beyond Lens 20 of 40 done; earlier the same day, major: the night run in the progress log; breadth counted by `make parity`, ~56% → ~79%; the hours re-estimated roughly by the lead from the gap estimates the run lowered, not re-assessed one by one; the upcoming work after it; beyond Lens: the built-in agent's engine side, 27 of 43 rows done, 10 partial, ~20–42 h; item 1: the node history from Prometheus built in the night run (G12, A43); beyond Lens: the built-in agent's window half, six rows partial, 24 of 43 done and 11 partial; beyond Lens 32 of 43 done and 8 partial: crash recovery's Helm row partial, as built since 2026-10-11; the owner's Helm decisions A14, A17, A36 and A39 built); minor (Upcoming rank 3, choosing a cluster, built in the night run, D-57; readiness and hours not moved) · **Target:** Lens Desktop 2026.10.51501 Cogpit's one-page summary of how close it is to Lens Desktop 2026.10.51501, the Kubernetes IDE it reimplements as a native desktop client in Go, for macOS first; Linux since 2026-10-20 (a `.deb` @@ -42,7 +42,7 @@ serial foundation, about 80% of the work parallelizes. |---|---:|---:|---| | Full Lens target | ~31% | 360–900 | Everything below, plus paid-plan features, the rest of Windows and Linux | | Mainstream practitioner (macOS) | ~59% | 220–620 | The interface, stability, metrics, the depth of views and actions, Helm install and charts | -| Essentials user (macOS) | ~69% | 45–150 plus the walks | The alpha walk's findings AW1–AW19 and what real use finds (G16), the depth of logs, shells, the editor and the core views | +| Essentials user (macOS) | ~69% | 45–150 plus the walks | What real use finds (G16; the alpha walk's findings AW1–AW19 built 2026-10-22, the re-walk open), the depth of logs, shells, the editor and the core views | The three percentages are the lead's estimate of 2026-10-22, open to revision ([target-app-parity](docs/parity/target-app-parity.md#readiness-by-audience); were ~17%, ~25% and @@ -119,7 +119,7 @@ agent hours, borrowed calibration, not measured): | Step | Gap | Estimate | |---|---|---:| -| Alpha first: both conditions hold (the gate passed, every fix touching it re-walked 2026-10-22; ready for real work ~47%, estimated), alpha on the owner's word; then rank 7 above (the alpha walk's findings AW1–AW19, D-114; the depth of G1–G11 and alpha's part of G13) | G1–G11, G13, G16 | ~50–200 h + human | +| Alpha first: both conditions hold (the gate passed, every fix touching it re-walked 2026-10-22; ready for real work ~47%, estimated), alpha on the owner's word; then rank 7 above (the alpha walk's findings AW1–AW19 built 2026-10-22, D-114 to D-116, the owner's re-walk open; the depth of G1–G11 and alpha's part of G13) | G1–G11, G13, G16 | ~50–200 h + human | | Interface parity: every free Lens row of ui-parity done (navigation, tables, drawer, hotbar, palette, menus, shortcuts, preferences, cluster settings, themes, deep links) | G5, G13 (M8) | 39–137 h | | Performance at scale: the budgets P1–P11 measured and met on a fixed runner and a real cluster (10,000 rows, 1,000 events/s, API request budgets); P3 (scrolling), P6 (memory) and P7 (cold start) not measured, the rest measured offscreen against fakes ([scorecard](docs/parity/scorecard.md), 2026-10-16), not against a real cluster's round trips or Lens | G15 | 28–66 h | | Stability: testers using it on their clusters, the first user bug backlog worked off; the owner's walks are its start (WF1–WF45, 2026-10-17 to 2026-10-19); testers besides the owner from alpha on, calendar time rather than agent-hours | G16 | 100–200 h + human | @@ -138,6 +138,7 @@ Detail: [docs/parity/roadmap.md](docs/parity/roadmap.md). | Date | Entry | |---|---| +| 2026-10-22 | **The alpha walk's findings AW1–AW19 built** (the owner's start that afternoon; seven agents in worktrees, a pull request per package, stacked and merged in order, PRs #74 to #82): Escape closes the innermost thing and a closed dropdown is outlined (AW1–AW4, AW19, [D-116](docs/developer/decisions.md#d-116-escape-closes-the-innermost-thing)); a dock tab the user opens takes the keys and ⌘F's find bar opens at once (AW5, AW6, AW8, [D-115](docs/developer/decisions.md#d-115-a-dock-tab-the-user-opens-takes-the-keys)); a click below the rows and on a welcome row acts at its release (AW12); a cancelled or backgrounded connect is no error toast (AW15, AW16); a failed connect's error page in the welcome page's look with the connect's stages, kubeconfig, a plugin's login, DNS, TCP, TLS and the API server, also in Connection Updates, the welcome page without Other clusters (AW13, AW17, AW18, [D-114](docs/developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages) built); the Context label grey, a shown dock tab opens the dock, Move Tab in the dock (AW7, AW9, AW10); Follow switched by scrolling and a deleted namespace noticed from its own events (AW11, AW14). Beside it, the owner's request of the same afternoon: a Secret's value copied without showing it (D-25 reversed by him). Tests failing before each change, offscreen renders; not seen in a real window yet: the owner's re-walk is next. | | 2026-10-22 | **The alpha walk** (the owner on v0.38.0, the staging cluster, guided step by step; Docker was down, so no kind: the lead built a namespace of test objects on the staging cluster, a Config Map, a ticking and a sleeping pod, a Deployment and a Helm release with two revisions, and a kubeconfig folder with fake login plugins against it, one that hangs and one that answers after 20 s, and a client certificate taken away during the walk): every fix that touches the alpha gate re-walked (WF31–WF33 Change, WF35 Triage after a real sleep, WF38–WF40 Connect, GW1–GW9, GW11, GW13, GW14); **each passed** (the tab drag by the mouse only, AW10; a deleted namespace's red late, AW11). Findings AW1–AW19 ([G16](docs/parity/gaps.md#g16-stability-and-the-user-bug-backlog)), none blocking a workflow, not built: Escape in dropdowns, confirmations, searches and the Connection Updates window (AW2–AW4, AW19), the keyboard focus of a new dock tab (AW5, AW8), connect outcomes that are no failures shown as error toasts (AW15, AW16), a failed connect at restore landing on the welcome page with the raw error (AW17), and ten on their own; his decisions on AW7, AW13, AW14 and AW17 in [D-114](docs/developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages) (AW17: an error page in the welcome page's look with the connect's stages). The test objects and files removed afterwards. Then the readiness recount by the lead: ready for real work **~47%** (range 42–52, estimated; was ~30%), mainstream ~42%, essentials ~48% (~59% and ~69% once the cloud providers' plugins left the target the same day, D-9); inside the ~40–75% band, so both alpha conditions hold. **The owner declared alpha** the same day: "Ja, dann sind wir jetzt Alpha" | | 2026-10-21 | **CI and test time** on the branch `ci-speed` (PR #67; the owner's request of that evening: less CI and local test time at the same coverage, decided by the lead; [D-112](docs/developer/decisions.md#d-112-ci-and-test-time)): a run of the pipeline 17:08 instead of 29:43 and 111 instead of 186 minutes of the shared self-hosted machine (the build cache saved from main's pushes only, Fyne's build dependencies minimal and in the background, the Linux tests without the race detector only where it keeps them from running, the states timing alone had reached tested on purpose); the UI's tests locally in parallel shards (`make test-ui` 70 s instead of 344, `make test-ui-race` about 6 minutes instead of 18; Go's test cache answers a repeat); render tests write no picture nobody keeps, and the logo is drawn once per size. The combined coverage unchanged | | 2026-10-21 | **Cogpit for Windows** on the branch `windows-release` (the owner's request of that day: prepare the Windows release on a branch, no commits to `main`; the owner's choices: an NSIS setup per user with `/allusers`, `/S` and `/D=`, WinSparkle with the update key Sparkle's feed is signed with, the first releases without Authenticode, the Update button installing with one click; [D-111](docs/developer/decisions.md#d-111-cogpit-for-windows-an-nsis-setup-and-winsparkle)): `Cogpit--windows-x64-setup.exe` and the release pipeline's Windows jobs with `appcast-windows.xml` on Pages; the updater, its button installing at once (`app.installUpdate`); the local terminal on ConPTY in a job object; PowerShell's MCP registration commands. Every test ran on Windows for the first time: 91 failures in 15 packages, the real faults among them fixed (renames of held files, a log's resume, the program a login's approval binds, Winsock's errors), all 36 packages passing in 222 s on the owner's workstation; CI runs them since. Checked on the owner's Windows 11 Pro: installed, reinstalled, uninstalled, updated 0.0.1 to 0.0.2 end to end through a local feed. Feature breadth 86.0% weighted (9 of 13 package rows), G22 20–45 h. Released with the first release after the merge | @@ -176,6 +177,7 @@ Detail: [docs/parity/roadmap.md](docs/parity/roadmap.md). | Date | Change | Summary | |---|---|---| +| 2026-10-22 | minor | The alpha walk's findings AW1–AW19 built 2026-10-22 (PRs #74 to #82): the progress log's row, the audience table's and the next steps' AW mentions; a Secret's value copied without showing it (the owner's request, D-25) | | 2026-10-22 | minor | Stage: alpha, declared by the owner 2026-10-22 ("Ja, dann sind wir jetzt Alpha") after the gate's re-walk and the readiness recount; the stage texts brought to it | | 2026-10-22 | minor | The cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9; was out of scope until long after parity, owner 2026-10-15): feature breadth ~88% (87.8% weighted, was 86.0%) with 7 of 10 authentication rows (was 7 of 13) and 3 of 10 paid features (was 3 of 11); the cloud-plugin discount ×0.7 removed: mainstream practitioner ~59% (was ~42%), essentials user ~69% (was ~48%); ready for real work ~47% and the full Lens target ~31% unchanged; the audience table, Why pre-alpha, the connectivity dimension and Upcoming's line on it | | 2026-10-22 | minor | The readiness recount after the owner's re-walk of the gate (the lead's estimate, open to revision, D-74): ready for real work ~47% (range 42–52; was ~30%), mainstream ~42% (was ~29% in the headline and ~25% in the audience table), essentials ~48% (was ~36% and ~34%), the full Lens target ~31% (was ~17%); every dimension's %; hours from the gap entries: Interface 42–148, Connectivity 8–26, Helm and metrics 3–12, Foundation 0–9; the stage line and Why pre-alpha: the gate passed, ~47% inside the band, both alpha conditions hold, alpha on the owner's word; Upcoming rank 7 and the beta table's alpha and readiness rows; the stage line's Windows part: merged (PR #66), in the releases since v0.37.0; the progress log: the alpha walk | diff --git a/docs/developer/architecture.md b/docs/developer/architecture.md index 234984734..b0a0b6ef7 100644 --- a/docs/developer/architecture.md +++ b/docs/developer/architecture.md @@ -1,6 +1,6 @@ # Architecture -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-22 · **Change:** minor (§4.3: which dock tab has the keys, a tab the user opens or shows from the window takes them, an agent's leaves them; the find bar opens through the window's canvas; the owner's AW5, AW6 and AW8, D-115, the lead's decisions, open to revision); trivial (the navigator's cloud sections not a target, owner 2026-10-22: won't build, D-9); patch (§4.4: a list that gets shorter while scrolled brings its offset back within its rows, the owner's finding of 2026-10-22, the lead's choice, open to revision); minor (image grades, D-113, in PR #69: Current state's Trivy paragraph and §4.4's overlay, `sectionAmender`); patch (§4.4: the drawer's header laid out by the drawer whenever it changes, the owner's finding of 2026-10-22, the lead's choice, open to revision); minor (Cogpit for Windows, D-111, on the branch `windows-release`: Current state, §2, §3, §6, §8, §10, §11 with "Windows: WinSparkle", §14, §15; the Linux paragraph's stdio registration brought current); minor (§7, the `internal/mcp` row: the external MCP server is opt-in, off until the user switches it on, a missing `mcp-switch` file off for the window and `cogpit-cli mcp`, D-49, the owner\'s security posture); patch (Current state: the title bar names no cluster, neither dot, name nor kubeconfig file, the owner's request of 2026-10-21, D-54; the status bar and the navigator do); minor (Current state, §2, §3, §11, §14, §15: Cogpit for Linux, the `.deb` and Cogpit's APT repository, the updater through apt, D-108); minor (§4.3, the navigator's scope: the slides between its levels and between clusters, Reduce motion, D-107); minor (§4.3, §6: the tab bar shows the shown cluster's tabs at the section too, `TabsShown`, the owner's GW11); minor (§4.3: tabs moved by dragging, ui.tab.move, Move Tab Left and Right, dock.move, the owner's GW4, D-106; the current state's command count); minor (§4.3: the namespace filter reads every namespace page by page and marks one it names that is deleted or terminating, the owner's GW9, D-106); minor (§4.2 and §8: ⌘F opens the find bar of the dock's editor tab, the owner's GW3, D-106); minor (§4.3: a click below a list's rows closes the drawer, the checked rows stay, the owner's GW1, D-106); minor (Current state 2026-10-20: every dropdown a `selectField`, D-104); minor (`Spec.Dialog` and the generated dialog's hints and slider, `dialogFrame`, D-104; Current state 2026-10-20); patch (§10: Ctrl with an arrow, Delete or a function key sends xterm's sequence, not the control character of the key's name, D-105); patch (§10: a key's modifiers from the key's own event, no modifier state in the terminal widget, xterm's sequences with ⇧, the owner's GW8, D-105); patch (§10: reverse video a state of the terminal widget, a paste's highlight one run, the owner's GW7, D-105); minor (Current state 2026-10-20: D-103 in releases since v0.30.0, the night's fixes of v0.29.1 to v0.29.3); minor (§12: Fyne's thread check a build parameter, off in releases, the audit of the UI's goroutines, D-103, on the branch `fast-scroll`); patch (§6: the credential plugin's process search counts a child's process group at its last look); patch (§5: a refusal of a read in all namespaces noted before the read can end, and a read by a plan made earlier taken only after checking for one, after a second refused read); patch (§4.3 and §4.4: a log opened again under a name another pod or container instance holds now: a workload's stream opens again only while the cache shows its instance running and is handed the next one instead of a second stream, a `[cogpit]` line where a log does not go on from its last line, D-58); patch (§5: the custom kinds judge a refusal on the one read of the definitions' error they show, after a refusal dropped their watch without a reason); minor (§4.3 and §6: a connection that waits behind a run Cogpit stopped waiting for and could not end is told of it and shows no end time, `LoginRun.RunsOn`, `waitingForLogin.runsOn`, H-118's residual, D-73); minor (Current state: debug containers, D-102, 214 commands); minor (§4.3 and §4.4: a click takes ⌘ and ⇧ from its own mouse event, not from the driver's last key event, after the owner's clicks that only toggled the row, G16); minor (§4.4: a list's cell laid out again when its content changes, after a colleague's pod with one container square too many, G16); minor (Current state, §4.3 and §4.7: a cluster's name and icon, the integrations question's steps and answer, and switching an integration on the user's alone, the owner's decisions on H-125 and H-126); minor (Current state and §4.3: every connect a run of its own, a failed connect stays on its cluster (D-97); the connection log's interruption entry and a log's resume marker; a removed source's hotbar tiles (D-101)); minor (Current state and §5: a Terminating namespace's Blocking Deletion list through metadata-only scopes in its namespace, and Remove finalizers, the owner's WF43, D-98); minor (§4, toasts and the logs tabs: a log tab's text selected across its lines, a toast's text selectable with a copy icon, the window's and not engine state (D-99)); minor (§9: Prometheus and Alertmanager asked by the port's number first, then its name, a refusal no longer ends detection (D-96)); minor (§9: the source row centred, the owner's correction of WF24 (D-88)); minor (Current state, the `internal/ui/fyneui` and `cmd/cogpit` rows: the window's place kept in `window.json` and given back at start, D-95, the owner's WF11); minor (§9: a chart's series drawn as one path (D-89), a node's filesystems as usage bars and the Nodes list's Disk the fullest (D-90)); minor (Current state and §4.4's overlay: the Kubernetes version and upstream end of life, the release table built in, Cogpit's own overlay on the Nodes list, a cell's tooltip, D-91, the owner's WF30; the gear in the navigator's cluster row, D-92); minor (Current state, §4.7 and §9: Cluster Settings' integrations under a divider with a section each, Prometheus's fields on its own section, the kubeconfig's path selectable, D-87; the metrics' source row under the charts with links to the settings only when needed, D-88); minor (package table: model.ObjectYAML, an object's YAML in the Kubernetes order (D-86); no filter crosses a cluster switch (WF20)); minor (Current state and §4.7: consent before looking, a pre-choice before any integration is looked for and Ask again, D-82, the owner's WF5 and WF4 of 2026-10-17; 216 commands); minor (Current state, §4.2 and §4.3: one hotbar without banks, a file of banks merged, the drag that carries the tile, D-83, the owner's WF7 and WF6 of 2026-10-17; 209 commands); minor (the package table and §8: the YAML view's undo and redo history in the widget, D-84, the owner's WF9 of 2026-10-17); minor (§4.3: the namespace filter and the create dialogs read the namespace names again when they open, WF10); minor (§ kubeconfig sources: Remove from Cogpit closes a connection by its context id and forgets the removed contexts' cluster settings, the owner's walk WF3/WF4 of 2026-10-17); minor (Current state and §6: Reconnect from the kubeconfig file and what Log in again does, D-81, the owner's F28 and F29 of 2026-10-17; §4.3's interrupted row); minor (Current state, §4.4 and §5: Trivy's Image Rating in the Pods list and its drawer group through the overlay, its reports trimmed, D-78); minor (§4.2 and §4.3: a cluster's accent colour, D-80, `ClusterSettings.AccentColor` and the GUI-only `cluster.settings.setAccentColor`; the tab bar draws a cluster's uploaded icon, F25; 205 commands); minor (Current state, the cache's and the engine's rows, §4.4's integration overlay and §5's trimmed scopes: Kyverno's policy violations on the objects, D-79); minor (Current state, §2, §3, §4.3 and §9 › Alertmanager: the Alertmanager integration, D-77: `internal/alerting` (L2, its own depguard entry), the alerts pill's source, the alert board, 209 commands); minor (§4.7 Integrations added, D-76, the owner's words of 2026-10-17: the switch, the probes and followers, the question, detection when shown; Current state, §4.3 and §9 follow; 204 commands); minor (Current state: a pod's image ratings from Trivy Operator's reports in its drawer, the owner's I6 of 2026-10-17, D-78's first phase; the Pods column and the summary-only cache not yet); minor (Current state, §6 and the kubeconfig and cluster rows: a context's client certificate, how long it is valid, in the cluster lists and `cluster.contexts`, the file read at listing outside the places macOS protects and after a connect inside them, D-75, the owner's F22 of 2026-10-17); minor (§4.3: the namespace filter's search text and highlight the window's own, not engine state, the owner's F21 of 2026-10-17, the lead's decision); minor (Current state, §4.3 and §6: a login that waits, D-73, the owner's finding of 2026-10-16 night: Disconnect, the window's Cancel Connecting, ends a connect under way and the credential plugin it waits for, every plugin run bounded by 5 minutes, `connection.waitingForLogin`, the connect's timeout below the plugin; built); minor (Current state and §6: every file chooser on the system's panels on macOS, the bookmarks restored at start, D-72); minor (Current state and §2: `internal/ui/nativedialog`, the system's file panels on macOS and the bookmarks of what they grant, added 2026-10-16 night); minor (§9, G12, night run 2026-10-16/17: the area under every chart series filled, the lead's decisions); minor (§9, G12, night run 2026-10-16/17: a drawer that shows only the network or the filesystem asks for no CPU and memory); minor (§9, G12, D-71, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and shown under their own names); minor (§9, G12, night run 2026-10-16/17: the source line's Prometheus namespace and service as links); minor (§9, G12, night run 2026-10-16/17: the Prometheus setting's fields on Cluster Settings › Metrics in place of the dialog, the lead's decisions); minor (§4.3 the layout toggles: at the very right after the alerts pill, the bell and a divider, the owner's of 2026-10-16 night); minor (Current state: the version beside the wordmark about 30% smaller, on its baseline, the owner's of 2026-10-16 night); minor (§4.2 `Escalate`: an Edit tab's apply that removes a data key, built 2026-10-16 night); minor (choosing a cluster: the welcome page without its Connect to Cluster…, N122, built 2026-10-16 night); minor (the selection: a lone checked row's menu ends with Clear Selection, N112, built 2026-10-16 night); minor (§11: a check for updates at every start, the owner's of 2026-10-16 night); minor (Current state renamed to 2026-10-16, its anchor followed in every link); minor (§4.4: the copy icon over a Secret's editor in the drawer, the owner's audit decision of 2026-10-16, built); minor (§4.4: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16, built: `add` and `remove` on the drawers' commands, a removal destructive with the review as its confirmation); minor (Current state and §7: a chat connection's CA file replaces the system's roots for that connection, the owner's decision in the audit of 2026-10-16, N141); minor (§4.3 and Current state: each view keeps its checked rows, per tab and cluster, `selectionmemory.go`, and a selection shown again drops the objects gone meanwhile, N111, the owner's decision in the audit of 2026-10-16); minor (the owner's audit of the night decisions (2026-10-16): D-57's window state, D-65's discovery on disk and §9's query settings confirmed by the owner); minor (D-61 withdrawn by the owner 2026-10-16: Cogpit installs nothing into a cluster for its own features; Current state, the helm package's row, §4.3's commands with a `context` (D-69), §9's detection (no score 110; the prometheus chart's server under any release's name) and its Cogpit Metrics part; 202 commands); minor (D-69 stage 3, built 2026-10-16: Current state; §4.3's connection watch with the lapsed login of a cluster not shown (`ConnectedCluster.LoginLapsed`, `connwatch_lapse.go`) and the restore of the last session (`restore.go`, `ConnectBackground`, `workspace.json`'s `connected` and `shown`); §6 the login hold in client-go's exec authenticator (`cluster/loginhold.go`) and the pool's background connects); minor (D-69 stage 2, the window with several connected clusters, built 2026-10-16: Current state; §4.3's dock per cluster, `dockscope.go`, and the tab bar; §6's note of what stage 3 leaves); minor (D-69 stage 1, several clusters connected at once, built 2026-10-16: Current state; §4.3's `UIState.Connections` with `cold`, a command's cluster (`target.go`: a `context` parameter, a reference's, a dock tab's) and the connection watch per connected cluster; §5's diagnostics of every connected cluster; §6 the pool of backends, one shown, `BackendOf` and `TargetBackend`); minor (Current state, §4.3's `UIState.User`, §6 Who the connection is logged in as: the owner's F17, D-68, one short name for a cluster everywhere and the user from a SelfSubjectReview at every connect and reconnect, 2026-10-16); minor (Current state and §6: the connection log, D-66, 2026-10-16: attempts on disk per context, the cluster layer's steps through Options.Trace, the error picture, a failed credential plugin's standard error); minor (Current state, F13 2026-10-16: the connection as a dot, never a word, blinking green while (re)connecting, one blinker for every dot, a click opening the connection log); minor (Current state, F12 2026-10-16: the build's version right of the top bar's wordmark); minor (Current state, the package table's `internal/demo` and `cmd/cogpit` rows, §6's bare names: the demo cluster a development build's only, releases built with the tag `nodemo`, D-67, 2026-10-16); minor (§4.3 and §11, F11 2026-10-16: the Update button's label from the bar's row layout, the line under the top bar directly under it, Sparkle's scheduled check every hour); minor (the package table's `internal/update` row: the first update through the signed feed, 2026-10-16); minor (Current state: the Argo CD section checked against a live Argo CD controller on a real cluster, 2026-10-16, and what it changed); minor (§4.4, §4.3 and Current state: Drain as a background job, a step per pod, Cancel leaving the drain `stopped` in its journal, the banner without a row for a drain running in the window, D-63, 2026-10-16); minor (G3 built in the night run of 2026-10-16: discovery cached on disk (D-65) and memory per kind and per cluster in the Diagnostics view, §5's table row, Measurable and Discovery on disk, Current state and the cluster and cache rows; measured on a real cluster); minor (§4.4: owners that are custom resources linked in the drawers and the Pods list, 2026-10-16); minor (§4.2: a confirmation's message names each object by its kind, `ConfirmRequest.Kinds`, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (§4.2: a confirmation's message names each object by its kind, `ConfirmRequest.Kinds`, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (Current state and §2's layout: `make scorecard` and `hack/`, D-15, 2026-10-16); minor (Current state and the package table's `internal/testkit` row: envtest's control plane, `testkit/envtest`, D-64, 2026-10-16); minor (Current state and the package table's `internal/testkit` row: envtest's control plane, `testkit/envtest`, D-64, 2026-10-16); minor (§9: Cogpit Metrics, the bundled stack installed on request (D-61), the provider's query format, empty-container filter and HTTPS, a node's network and filesystem from node-exporter, P13 measured on a real cluster; Current state and the package table brought to it); minor (§4.4, §4.2, Current state: an action on a selection of more than ten objects as a background job with Cancel, G4, D-63, 2026-10-16; 196 commands); minor (D-58, standby and lost connections: Current state; §4.3 the connection's states and the connection watch; §6 a connection that stops answering: the request timeout, the gates, the login guard, the probes; 198 commands); minor (§4.4 and Current state: the owner's audit answers of 2026-10-15 for the drawer: a Config Map's Save rebases by itself and its unsaved values are drafts; a Secret's values edited in the drawer, the window's only, D-59); minor (§4.4 and Current state: a Config Map's drawer Save rebases onto a newer version none of the edited keys changed in, and its unsaved values are kept as drafts, the owner's audit answers of 2026-10-15); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`; plain `http://` to another machine warned about and a CA file per connection, `agent/cafile.go`; a sent message edited and sent again, `ChatAgent.Resend` and `fyneui/chat_edit.go`, F9; the owner's audit answers of 2026-10-15, built in the night run); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`; plain `http://` to another machine warned about and a CA file per connection, `agent/cafile.go`; the owner's audit answers of 2026-10-15, built in the night run); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`, the owner's audit answer of 2026-10-15, built in the night run); minor (§4.3 and Current state: choosing a cluster in the navigator's section only, D-57; the context picker, "Switch context" and the scope dropdown gone); minor (§3 and the package table: `internal/update` with a `depguard` rule of its own, `l4-update`; §4.4: `ui.navigate` leaves the checked rows alone and the selection bar from one row, the owner's audit answers (7) and (8)); minor (the docs brought to the code, owner's rule 10: Current state with the chat column built, the Pods' and Nodes' CPU and Memory columns, background jobs (A91), the cache's `Join`, `Held` and `Peek`, bash and fish in the terminal, every flag of `cmd/cogpit`, Cluster Settings › Metrics, the day's D-53 to D-56 and the logo, rows for `internal/buildinfo` and `internal/testkit`; §3 `demo` in L2 and `internal/update` without a depguard rule of its own; §4.2 nine actions on a selection, Restart on a selection built (A74); §4.3 the scope dropdown decided to go, not built; §4.4 the drawer's Metrics section; §8 what the proxy preference carries and what not (the agent, Sparkle); §9 the Prometheus dialog from Cluster Settings › Metrics too; §10 the terminal's scrollback (D-56); §14 Fyne v2.8.2, Helm v4.3.1, no LLM module; §15); minor (the package table: `internal/update` with the owner's update key in the releases since v0.11.0, not proven until a signed appcast is served); minor (§7 and the package table: the agent's API keys in the owner-only `llm-keys.json` on every platform (`FileKeyStore`), the keychain code removed, a key kept there before shown as no key (`ErrKeyMissing`), the owner's decision of 2026-10-15); minor (§4.4: the drawer's data sections with each key above its value, names wrapping at - . _ /, a Config Map's values in editors saved through `configMap.saveData`, D-53); minor (Current state, §4.3 and §11: the layout toggles, `UIState.NavigatorHidden`, `DockOpen` and `Update`, `ui.toggleNavigator`, `ui.toggleDock`, the dock's collapse moved into the engine, the Update button from Sparkle's gentle reminders, F7, D-54); minor (§7 and Current state, F6 (D-53): the MCP token and port kept across starts, Regenerate token through the guard on the same port, the MCP details behind the status bar's gear, the top bar's MCP button gone, the bridge reading the files before every call); minor (§4.2: the drawer's Copy drawn right after the object's name (F4)); minor (Current state: a copy's confirmation shown as a toast only, not in the notification log (F5)); minor (§7: a conversation in which a turn ran over a private connection is not kept, H-96 built); minor (Current state and §4.3: R3 postponed by the owner); minor (§4.3: R2 built, a hotbar tile dragged within the bar moves through `hotbar.moveCluster`, `fyneui/hotbardrag.go`); minor (Current state (2026-10-15): the evening's decisions built in the night run but R3 and A10); minor (§4.3: A73 built, `ui.select`'s mode `open`: a plain click keeps the checked rows, the drawer's row highlighted, the scroll follows the drawer); minor (`internal/buildinfo`, L0, the version both binaries report; About Cogpit in macOS's application menu, decision A60); minor (the owner's decision round of 2026-10-14 evening, marked "decided 2026-10-14 evening, not built" where a section describes behaviour it changes: §4.2 more agents' calls that always ask, Restart on a selection, ⌘F and ⌘⇧T as menu items; §4.3 one window (D-52), a click keeps the checked rows, F-keys in search fields, an agent's proxy as a confirmed write, Disconnect closes the tabs, the navigator's and the palette's state (D-51), notifications to agents; §4.4 resource claims in the pod drawer, a device's claim; §5 the Overviews wait for the reviews, Flux and Argo CD from discovery; §6 insecure-TLS contexts ask once, the approval binds Cogpit's proxy, unlinking a sync folder; §7 the bridge honours the MCP switch (D-49), the switch's 1-hour end, the filter's 10 bytes, the README framed; §8 http origins marked, dotted repository names, no offer after an interrupted install; §9 node history from node-exporter (F1), separate queries for far ranges; §10 bash and fish, an enforcing setting, the signature with Rekor (D-50); §15 D-47's rest and D-52 open; defaults the owner confirmed marked so); minor (two binaries: `cogpit-cli` inside the app bundle and the app copying its stdio registration, D-16, D-2; §5: the table snapshots counted in the Diagnostics tab and `diagnostics.get` only, no longer in the status bar, owner; ); minor (§11 and Current state: `internal/update` built, Sparkle 2 loaded at run time from the app bundle, D-4); minor (; §4.6, §4.1, §12 and Current state: `cogpit://` links through five navigation commands with origin `deeplink`, D-47; §4.3 and Current state: start at login, `UIState.LoginItem`, `Options.LoginItem`, D-48; §5: peeking at running scopes; §7: the cached Secrets' values and Flux's credential fields kept out of what agents read (H-82, H-63); §8: credentials over plain http asked once per repository (H-40); crash safety: the node shell journal and its cleanup at connect, H-71; §7: the terminal tab's agent-read marker and its 15-minute end, H-83; §4.2: `Spec.AgentsAsk`, an agent's role binding always asks, H-27; Current state, §9: the workloads' drawers' Pods tables without a Namespace column, D-40 decided by the owner; §9: a pod-metrics refusal affects only its namespace, D-39 decided by the owner; §4.3: the status filter of every view, `UIState.States`, `ui.setStatusFilter`, the snapshot's states, D-34; §4.2: the node shell's maximum duration among the parameters refused to agents, D-37; §9: the cluster's Metrics source; §9: the cluster Overview's Pods history from kube-state-metrics; §9: history that outlives a closed drawer, lines broken at a gap; §9: the nodes' disk from node-exporter through Prometheus, D-43; §9: the Nodes list's usage bars; §8: the charts' icons, D-46, G11; §8: the chart drawer's version and README, HELM2, G11; §6: a context that leaves Cogpit takes its dock tabs, a connect under way when it leaves forgets it, G5, G13; §5: the Flux and Argo CD dashboards follow a namespace-limited user's plans and refusals, say when the definitions cannot be listed, and a refused label-selected scope is not kept warm, G3, G23; §7: `kinds.list` with each kind's tools, its cache state and the kinds not served, G17; §7: what the dock's tabs show, `dock.read` and the window's reader, D-44, G17; §4.2: GUI-only commands under one mark, `Spec.GUIOnly`, G17; Current state, §4.3: no context picker at start, D-42; §4.3, §6, Current state and `cmd/cogpit`: the tabs and the tables' layout kept in `workspace.json`, restored without connecting anything, D-41; §4.3, §4.4, §5, §9 and Current state: a Pods table in the workloads' drawers (D-40), the drawer's own indexes (`DetailNeeds`), the 500-row bound of sortable drawer tables; §4.3, §4.4, §9 and Current state: a Pods table in the workloads' drawers (D-40), the drawer's own indexes (`DetailNeeds`), the 500-row bound of sortable drawer tables; §9: Prometheus detection reads the Services per namespace for a namespace-limited user and follows a refusal, G12; §5: a refused list of the custom resource definitions ends their watch until a refresh, checked on kind with a namespace-limited ServiceAccount, G3; §5: the rest of the class for a namespace-limited user: views' indexes, an agent's Overviews, `Lookup` and write targets, Helm's releases, the Applications follow plans and refusals, non-waiting reads hold nothing while a plan is pending, G3; §9: the pods' metrics listed per namespace of the Pods view's plan for a user who may not list pods everywhere, D-39, G12; §5: one object's read, the drawer's and an agent's, takes the object's namespace and its events there, night decision, G3; §5: a refused read in all namespaces counts whoever met it, `cache.OnRefused`, and the reads that wait follow it at once, `readFollowing`, G3; Argo CD, G23: §4.5 curated profiles from their own files and kinds that come with a definition, D-35; §4.3, §4.5: the Flux dashboard page and the Flux kinds' curated profiles, G23; §2 `internal/terminal`: the node shell's stream (D-37); Current state and §9: every byte amount in binary units with one decimal, D-32; §2, §3, §4.3, §4.4 and Current state: every timestamp in the local time zone and the region's format, `internal/locale`, D-31; §5 and Current state: DER certificates, the key check and the chain check, D-30 (the owner's answers); §5 and Current state: the certificates in a Secret's keys decoded in the drawer and for agents, D-30; §8 and Current state: Helm's repositories.yaml as the repositories' source, D-29 built; §5: one object, workload logs and port forwards read their namespace once the plan is decided; Current state: copy icons in the lists, D-25; §5: the Overviews follow the access reviews' answers; §4.5: references link to every built-in kind; §6: removing a source closes its contexts' tabs; §5 and Current state: the Diagnostics tab, D-13; §7 and Current state: the audit log read back, Help › Audit Log and `audit.list`, G17; §4.3, §7 and Current state: the allowance of agent writes in Cluster Settings › Agents, G17; §4.4 and Current state: `object.get`'s related objects, G17; §4.4, §7 and Current state: `view.rows`, the rows the user sees, G17; §4.4 Revert to original and drafts of unsaved editor text, G9; §4.4 drafts of unsaved editor text, G9; §5 namespaced watches, G3: `Cache.AcquireNamespaces`, refused scopes not kept warm, the engine reading a kind in each named namespace when the user may not list it in all of them, §4.3 the accessible namespaces as a cluster setting, G13; §6 the kubeconfig's TLS and proxy fields verified against TLS test servers, certificate hints in connect errors, a `proxy-url` password kept out of them, insecure contexts marked in the picker and the connect log; §10 kubectl in terminals, D-3 built: the check, the verified download, the release first on PATH, `internal/kubectl` (L1, §2, §3), §4.3 the kubectl preferences, Current state; §4.3, §8 the proxy of the Helm downloads, Preferences › Proxy, G13; §4.3, §6 a cluster's proxy through rest.Config.Proxy, its password redacted, G13; §4.3, §9 hidden metrics, nothing polled for them, G12 and G13; the navigator's scope, G5 and G13, §4.3: `UIState.NavigatorScope`, `ui.setNavigatorScope`, kept in step with the connection by `syncNavScope`, the tabs of the scope (`TabsInScope`) counted by the tab keys, the window's section level (`navigator_sections.go`) and the tab bar drawing the scope's tabs; the navigator's scope, G5 and G13, §4.3: `UIState.NavigatorScope`, `ui.setNavigatorScope`, kept in step with the connection by `syncNavScope`, the tabs of the scope (`TabsInScope`) counted by the tab keys; §4.3 the notification log of every toast, `UIState.Notifications`, what stays in the window; §4.3 `UIState.ColumnOrder` and the snapshot's `Order`; the window's row checkboxes, §4.3 and Current state; the table's selection, G5, G7, G9: §4.2 actions on a selection and `object.deleteMany`, §4.3 `ui.select`'s modes; the welcome page and Disconnect, G5 and G13, §4.3: `UIState.Welcome`, `ui.welcome.open`, `cluster.disconnect`, the window's page and its Help and Window menus; the welcome page and Disconnect, G5 and G13, §4.3: `UIState.Welcome`, `ui.welcome.open`, `cluster.disconnect`; §4.4 a logs tab's source, narrowed in the merged stream, timestamps on every stream, its older lines and a jump to a time; §4.4 a logs tab's source, narrowed in the merged stream, timestamps on every stream, and its older lines; §4.4 a logs tab's source, narrowed in the merged stream, and timestamps on every stream; §8: a release upgraded to a chart version from the user's repositories, the Upgrade tab's choice of repository and version, G11; the tab bar of cluster views, G5, §4.3: `UIState.Tabs` and `ActiveTab`, kept in step by `syncTabs`, the `ui.tab.*` commands, `ui.openView` in the preview tab, the window's bar (`tabbar.go`) and its View menu keys, §4.2; the tab bar of cluster views, G5, §4.3: `UIState.Tabs` and `ActiveTab`, kept in step by `syncTabs`, the `ui.tab.*` commands, `ui.openView` in the preview tab; Preferences and cluster settings, G13, §4.3: engine state, stores, commands, the GUI that applies them; the cluster Overview, G12: §4.3 the page and `UIState.Overview`, §9 the cluster scope of the metrics hub; §5 a virtual kind made of several kinds, the Applications; §4.5 curated profiles of CRD kinds, the Vertical Pod Autoscalers; Current state: the four Device Resources views, 45 built-in views; §8: Helm chart repositories kept in Cogpit's own folders, the Charts view and the install, G11; the command palette, G13, §4.2: its rules from the registry's metadata, the shortcuts bound from the registry, §4.3: `UIState.Palette`; `cogpit-cli` contexts, get and the MCP stdio bridge, §7, and `internal/app`, the wiring both binaries share: Current state, §3; the navigator, §4.3: its search, keyboard row and open groups are the window's, its tree Cogpit's own rows; one line in Current state; the hotbar, G13, §4.3: `UIState.Hotbar`, `hotbar.json`, the `hotbar.*` commands and the bar left of the navigator; Current state after the fifth run's evening: crash reports, the external MCP server switched in the status bar, the window's metrics and chart hover, the quit crash fixed; G12 third slice, §9: Prometheus in the window, ranges as engine state, checked against a real Prometheus on kind; G12 second slice, §9: Prometheus through the service proxy, backend; G12 first slice, §9 as built: the Metrics Server provider, the hub that polls only while a view or drawer shows metrics, CPU and Memory columns, the drawer's Metrics section, `metrics.get`, the demo's synthetic Metrics Server; D-28 built, §6: every context from a source file read alone, `~/.kube/config` a file of the default folder, `$KUBECONFIG` and `--kubeconfig` files session sources, bare names resolved; Kubeconfig Syncs second pass, §6: dot files, `~/.kube` by default, a connection closed with its file, the connect log; related rows rebuilt when the indexed kinds finish listing; a stopped shell drops its queued work; fourth run: kubeconfig sources and the approval of their credential plugins, §6; an upgrade from a tab bound to the tab's text revision, values scrubbed in their quoted forms too, upgrade and rollback checked against the server's newest revision, the Rollback dialog's answer bound to its revision, §8; a revealed Secret value bound to the Secret's version, §5; pasting a kubeconfig removed again, D-21, §6; §7 the chat column and the seam `engine.ChatAgent`; A5 built; §7 the built-in agent's engine side built, the package table's `internal/agent` row; §9: the nodes' history from node-exporter built in the night run (F1, A43, A115), the cause of F1 and every chart's source recorded; §9: query sets for ranges far apart built in the night run (A46); §7 the window's chat built: the column, its re-reading and streaming, Preferences › Agent; §7 the private connection's reads like the user's, built in the engine (M12 (c)); §5 A90 built: the curated kinds from API discovery without the definitions; §4.4 background jobs, A91 built; §4.4 an application's logs in one tab, A81 built; 185 commands; §10 the signature with sigstore-go and Rekor's transparency-log proof, built (D-50), §14 sigstore-go; §4.3 and §4.2: the navigator's search, keyboard row and collapsed source groups and the palette's text as engine state (D-51: `UIState.Navigator`, `PaletteText`, `syncNavigator`, four commands), the ring on keyboard navigation only, the dropdown of the hotbar's clusters, Disconnect closing the cluster's tabs, F1–F12 in the search fields, ⌘F and ⌘⇧T as View menu items, the welcome page's Recent and two links (A51–A55, A61, A63, A64, A67, A113), built 2026-10-15; 188 commands; §6: a credential plugin's approval binds Cogpit's proxy for the cluster, A23; §6: an `insecure-skip-tls-verify` context asked once through the plugins' policy, A28; §6: such a connection marked in the UI state and the status bar, `cogpit-cli get` warns, A29; §8: A39 built, the both-drivers note in the owner's wording; §8: A17 built, an interrupted install offered nothing; §8: A36 built, the chart id; §4.2 Spec.Warning and §8 the origins' marks, A14 built 2026-10-15) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-22 · **Change:** minor (§5: the namespaces watched while the shown cluster's namespace filter names some, `EventNamespaces`, AW11, D-106; §4.4's namespace filter read on it, not on the view's rows); patch (§4.3: ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab while the keyboard works in the dock, `dock` on `ui.tab.moveLeft` and `ui.tab.moveRight`, the owner's AW10; a command that shows a dock tab open already opens the minimised dock also when that tab is the active one, `UIState.ShowDockTab`, the owner's AW9); minor (§4.4: a masked Secret value copied without being shown, `copyHook.fetch` and `secretcopy.go`, the owner's decision of 2026-10-22, D-25); minor (Current state, §4.3 and §6: a failed connect's error page and the connect's stages, measured on client-go's own first request, the welcome page without "Other clusters", D-114); patch (§4.3: a click below a list's rows acts at its release, the table no `fyne.DoubleTappable`, the owner's AW12, D-106; the navigator's double click: Fyne's hold is the system's interval, 0.5 s on macOS, not 300 ms); minor (Current state: Escape closes the innermost thing, D-116, and a closed dropdown outlined, D-104, the owner's AW1–AW4 and AW19); minor (§4.3: which dock tab has the keys, a tab the user opens or shows from the window takes them, an agent's leaves them; the find bar opens through the window's canvas; the owner's AW5, AW6 and AW8, D-115, the lead's decisions, open to revision); trivial (the navigator's cloud sections not a target, owner 2026-10-22: won't build, D-9); patch (§4.4: a list that gets shorter while scrolled brings its offset back within its rows, the owner's finding of 2026-10-22, the lead's choice, open to revision); minor (image grades, D-113, in PR #69: Current state's Trivy paragraph and §4.4's overlay, `sectionAmender`); patch (§4.4: the drawer's header laid out by the drawer whenever it changes, the owner's finding of 2026-10-22, the lead's choice, open to revision); minor (Cogpit for Windows, D-111, on the branch `windows-release`: Current state, §2, §3, §6, §8, §10, §11 with "Windows: WinSparkle", §14, §15; the Linux paragraph's stdio registration brought current); minor (§7, the `internal/mcp` row: the external MCP server is opt-in, off until the user switches it on, a missing `mcp-switch` file off for the window and `cogpit-cli mcp`, D-49, the owner\'s security posture); patch (Current state: the title bar names no cluster, neither dot, name nor kubeconfig file, the owner's request of 2026-10-21, D-54; the status bar and the navigator do); minor (Current state, §2, §3, §11, §14, §15: Cogpit for Linux, the `.deb` and Cogpit's APT repository, the updater through apt, D-108); minor (§4.3, the navigator's scope: the slides between its levels and between clusters, Reduce motion, D-107); minor (§4.3, §6: the tab bar shows the shown cluster's tabs at the section too, `TabsShown`, the owner's GW11); minor (§4.3: tabs moved by dragging, ui.tab.move, Move Tab Left and Right, dock.move, the owner's GW4, D-106; the current state's command count); minor (§4.3: the namespace filter reads every namespace page by page and marks one it names that is deleted or terminating, the owner's GW9, D-106); minor (§4.2 and §8: ⌘F opens the find bar of the dock's editor tab, the owner's GW3, D-106); minor (§4.3: a click below a list's rows closes the drawer, the checked rows stay, the owner's GW1, D-106); minor (Current state 2026-10-20: every dropdown a `selectField`, D-104); minor (`Spec.Dialog` and the generated dialog's hints and slider, `dialogFrame`, D-104; Current state 2026-10-20); patch (§10: Ctrl with an arrow, Delete or a function key sends xterm's sequence, not the control character of the key's name, D-105); patch (§10: a key's modifiers from the key's own event, no modifier state in the terminal widget, xterm's sequences with ⇧, the owner's GW8, D-105); patch (§10: reverse video a state of the terminal widget, a paste's highlight one run, the owner's GW7, D-105); minor (Current state 2026-10-20: D-103 in releases since v0.30.0, the night's fixes of v0.29.1 to v0.29.3); minor (§12: Fyne's thread check a build parameter, off in releases, the audit of the UI's goroutines, D-103, on the branch `fast-scroll`); patch (§6: the credential plugin's process search counts a child's process group at its last look); patch (§5: a refusal of a read in all namespaces noted before the read can end, and a read by a plan made earlier taken only after checking for one, after a second refused read); patch (§4.3 and §4.4: a log opened again under a name another pod or container instance holds now: a workload's stream opens again only while the cache shows its instance running and is handed the next one instead of a second stream, a `[cogpit]` line where a log does not go on from its last line, D-58); patch (§5: the custom kinds judge a refusal on the one read of the definitions' error they show, after a refusal dropped their watch without a reason); minor (§4.3 and §6: a connection that waits behind a run Cogpit stopped waiting for and could not end is told of it and shows no end time, `LoginRun.RunsOn`, `waitingForLogin.runsOn`, H-118's residual, D-73); minor (Current state: debug containers, D-102, 214 commands); minor (§4.3 and §4.4: a click takes ⌘ and ⇧ from its own mouse event, not from the driver's last key event, after the owner's clicks that only toggled the row, G16); minor (§4.4: a list's cell laid out again when its content changes, after a colleague's pod with one container square too many, G16); minor (Current state, §4.3 and §4.7: a cluster's name and icon, the integrations question's steps and answer, and switching an integration on the user's alone, the owner's decisions on H-125 and H-126); minor (Current state and §4.3: every connect a run of its own, a failed connect stays on its cluster (D-97); the connection log's interruption entry and a log's resume marker; a removed source's hotbar tiles (D-101)); minor (Current state and §5: a Terminating namespace's Blocking Deletion list through metadata-only scopes in its namespace, and Remove finalizers, the owner's WF43, D-98); minor (§4, toasts and the logs tabs: a log tab's text selected across its lines, a toast's text selectable with a copy icon, the window's and not engine state (D-99)); minor (§9: Prometheus and Alertmanager asked by the port's number first, then its name, a refusal no longer ends detection (D-96)); minor (§9: the source row centred, the owner's correction of WF24 (D-88)); minor (Current state, the `internal/ui/fyneui` and `cmd/cogpit` rows: the window's place kept in `window.json` and given back at start, D-95, the owner's WF11); minor (§9: a chart's series drawn as one path (D-89), a node's filesystems as usage bars and the Nodes list's Disk the fullest (D-90)); minor (Current state and §4.4's overlay: the Kubernetes version and upstream end of life, the release table built in, Cogpit's own overlay on the Nodes list, a cell's tooltip, D-91, the owner's WF30; the gear in the navigator's cluster row, D-92); minor (Current state, §4.7 and §9: Cluster Settings' integrations under a divider with a section each, Prometheus's fields on its own section, the kubeconfig's path selectable, D-87; the metrics' source row under the charts with links to the settings only when needed, D-88); minor (package table: model.ObjectYAML, an object's YAML in the Kubernetes order (D-86); no filter crosses a cluster switch (WF20)); minor (Current state and §4.7: consent before looking, a pre-choice before any integration is looked for and Ask again, D-82, the owner's WF5 and WF4 of 2026-10-17; 216 commands); minor (Current state, §4.2 and §4.3: one hotbar without banks, a file of banks merged, the drag that carries the tile, D-83, the owner's WF7 and WF6 of 2026-10-17; 209 commands); minor (the package table and §8: the YAML view's undo and redo history in the widget, D-84, the owner's WF9 of 2026-10-17); minor (§4.3: the namespace filter and the create dialogs read the namespace names again when they open, WF10); minor (§ kubeconfig sources: Remove from Cogpit closes a connection by its context id and forgets the removed contexts' cluster settings, the owner's walk WF3/WF4 of 2026-10-17); minor (Current state and §6: Reconnect from the kubeconfig file and what Log in again does, D-81, the owner's F28 and F29 of 2026-10-17; §4.3's interrupted row); minor (Current state, §4.4 and §5: Trivy's Image Rating in the Pods list and its drawer group through the overlay, its reports trimmed, D-78); minor (§4.2 and §4.3: a cluster's accent colour, D-80, `ClusterSettings.AccentColor` and the GUI-only `cluster.settings.setAccentColor`; the tab bar draws a cluster's uploaded icon, F25; 205 commands); minor (Current state, the cache's and the engine's rows, §4.4's integration overlay and §5's trimmed scopes: Kyverno's policy violations on the objects, D-79); minor (Current state, §2, §3, §4.3 and §9 › Alertmanager: the Alertmanager integration, D-77: `internal/alerting` (L2, its own depguard entry), the alerts pill's source, the alert board, 209 commands); minor (§4.7 Integrations added, D-76, the owner's words of 2026-10-17: the switch, the probes and followers, the question, detection when shown; Current state, §4.3 and §9 follow; 204 commands); minor (Current state: a pod's image ratings from Trivy Operator's reports in its drawer, the owner's I6 of 2026-10-17, D-78's first phase; the Pods column and the summary-only cache not yet); minor (Current state, §6 and the kubeconfig and cluster rows: a context's client certificate, how long it is valid, in the cluster lists and `cluster.contexts`, the file read at listing outside the places macOS protects and after a connect inside them, D-75, the owner's F22 of 2026-10-17); minor (§4.3: the namespace filter's search text and highlight the window's own, not engine state, the owner's F21 of 2026-10-17, the lead's decision); minor (Current state, §4.3 and §6: a login that waits, D-73, the owner's finding of 2026-10-16 night: Disconnect, the window's Cancel Connecting, ends a connect under way and the credential plugin it waits for, every plugin run bounded by 5 minutes, `connection.waitingForLogin`, the connect's timeout below the plugin; built); minor (Current state and §6: every file chooser on the system's panels on macOS, the bookmarks restored at start, D-72); minor (Current state and §2: `internal/ui/nativedialog`, the system's file panels on macOS and the bookmarks of what they grant, added 2026-10-16 night); minor (§9, G12, night run 2026-10-16/17: the area under every chart series filled, the lead's decisions); minor (§9, G12, night run 2026-10-16/17: a drawer that shows only the network or the filesystem asks for no CPU and memory); minor (§9, G12, D-71, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and shown under their own names); minor (§9, G12, night run 2026-10-16/17: the source line's Prometheus namespace and service as links); minor (§9, G12, night run 2026-10-16/17: the Prometheus setting's fields on Cluster Settings › Metrics in place of the dialog, the lead's decisions); minor (§4.3 the layout toggles: at the very right after the alerts pill, the bell and a divider, the owner's of 2026-10-16 night); minor (Current state: the version beside the wordmark about 30% smaller, on its baseline, the owner's of 2026-10-16 night); minor (§4.2 `Escalate`: an Edit tab's apply that removes a data key, built 2026-10-16 night); minor (choosing a cluster: the welcome page without its Connect to Cluster…, N122, built 2026-10-16 night); minor (the selection: a lone checked row's menu ends with Clear Selection, N112, built 2026-10-16 night); minor (§11: a check for updates at every start, the owner's of 2026-10-16 night); minor (Current state renamed to 2026-10-16, its anchor followed in every link); minor (§4.4: the copy icon over a Secret's editor in the drawer, the owner's audit decision of 2026-10-16, built); minor (§4.4: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16, built: `add` and `remove` on the drawers' commands, a removal destructive with the review as its confirmation); minor (Current state and §7: a chat connection's CA file replaces the system's roots for that connection, the owner's decision in the audit of 2026-10-16, N141); minor (§4.3 and Current state: each view keeps its checked rows, per tab and cluster, `selectionmemory.go`, and a selection shown again drops the objects gone meanwhile, N111, the owner's decision in the audit of 2026-10-16); minor (the owner's audit of the night decisions (2026-10-16): D-57's window state, D-65's discovery on disk and §9's query settings confirmed by the owner); minor (D-61 withdrawn by the owner 2026-10-16: Cogpit installs nothing into a cluster for its own features; Current state, the helm package's row, §4.3's commands with a `context` (D-69), §9's detection (no score 110; the prometheus chart's server under any release's name) and its Cogpit Metrics part; 202 commands); minor (D-69 stage 3, built 2026-10-16: Current state; §4.3's connection watch with the lapsed login of a cluster not shown (`ConnectedCluster.LoginLapsed`, `connwatch_lapse.go`) and the restore of the last session (`restore.go`, `ConnectBackground`, `workspace.json`'s `connected` and `shown`); §6 the login hold in client-go's exec authenticator (`cluster/loginhold.go`) and the pool's background connects); minor (D-69 stage 2, the window with several connected clusters, built 2026-10-16: Current state; §4.3's dock per cluster, `dockscope.go`, and the tab bar; §6's note of what stage 3 leaves); minor (D-69 stage 1, several clusters connected at once, built 2026-10-16: Current state; §4.3's `UIState.Connections` with `cold`, a command's cluster (`target.go`: a `context` parameter, a reference's, a dock tab's) and the connection watch per connected cluster; §5's diagnostics of every connected cluster; §6 the pool of backends, one shown, `BackendOf` and `TargetBackend`); minor (Current state, §4.3's `UIState.User`, §6 Who the connection is logged in as: the owner's F17, D-68, one short name for a cluster everywhere and the user from a SelfSubjectReview at every connect and reconnect, 2026-10-16); minor (Current state and §6: the connection log, D-66, 2026-10-16: attempts on disk per context, the cluster layer's steps through Options.Trace, the error picture, a failed credential plugin's standard error); minor (Current state, F13 2026-10-16: the connection as a dot, never a word, blinking green while (re)connecting, one blinker for every dot, a click opening the connection log); minor (Current state, F12 2026-10-16: the build's version right of the top bar's wordmark); minor (Current state, the package table's `internal/demo` and `cmd/cogpit` rows, §6's bare names: the demo cluster a development build's only, releases built with the tag `nodemo`, D-67, 2026-10-16); minor (§4.3 and §11, F11 2026-10-16: the Update button's label from the bar's row layout, the line under the top bar directly under it, Sparkle's scheduled check every hour); minor (the package table's `internal/update` row: the first update through the signed feed, 2026-10-16); minor (Current state: the Argo CD section checked against a live Argo CD controller on a real cluster, 2026-10-16, and what it changed); minor (§4.4, §4.3 and Current state: Drain as a background job, a step per pod, Cancel leaving the drain `stopped` in its journal, the banner without a row for a drain running in the window, D-63, 2026-10-16); minor (G3 built in the night run of 2026-10-16: discovery cached on disk (D-65) and memory per kind and per cluster in the Diagnostics view, §5's table row, Measurable and Discovery on disk, Current state and the cluster and cache rows; measured on a real cluster); minor (§4.4: owners that are custom resources linked in the drawers and the Pods list, 2026-10-16); minor (§4.2: a confirmation's message names each object by its kind, `ConfirmRequest.Kinds`, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (§4.2: a confirmation's message names each object by its kind, `ConfirmRequest.Kinds`, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (§4.4: the related-objects index `CustomKindsByGroupKind`, an event's involved custom resource linked to its view, 2026-10-16); minor (Current state and §2's layout: `make scorecard` and `hack/`, D-15, 2026-10-16); minor (Current state and the package table's `internal/testkit` row: envtest's control plane, `testkit/envtest`, D-64, 2026-10-16); minor (Current state and the package table's `internal/testkit` row: envtest's control plane, `testkit/envtest`, D-64, 2026-10-16); minor (§9: Cogpit Metrics, the bundled stack installed on request (D-61), the provider's query format, empty-container filter and HTTPS, a node's network and filesystem from node-exporter, P13 measured on a real cluster; Current state and the package table brought to it); minor (§4.4, §4.2, Current state: an action on a selection of more than ten objects as a background job with Cancel, G4, D-63, 2026-10-16; 196 commands); minor (D-58, standby and lost connections: Current state; §4.3 the connection's states and the connection watch; §6 a connection that stops answering: the request timeout, the gates, the login guard, the probes; 198 commands); minor (§4.4 and Current state: the owner's audit answers of 2026-10-15 for the drawer: a Config Map's Save rebases by itself and its unsaved values are drafts; a Secret's values edited in the drawer, the window's only, D-59); minor (§4.4 and Current state: a Config Map's drawer Save rebases onto a newer version none of the edited keys changed in, and its unsaved values are kept as drafts, the owner's audit answers of 2026-10-15); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`; plain `http://` to another machine warned about and a CA file per connection, `agent/cafile.go`; a sent message edited and sent again, `ChatAgent.Resend` and `fyneui/chat_edit.go`, F9; the owner's audit answers of 2026-10-15, built in the night run); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`; plain `http://` to another machine warned about and a CA file per connection, `agent/cafile.go`; the owner's audit answers of 2026-10-15, built in the night run); minor (Current state, §7 and the package table: a chat connection may send every command as a tool, `ChatConnection.AllTools`, the owner's audit answer of 2026-10-15, built in the night run); minor (§4.3 and Current state: choosing a cluster in the navigator's section only, D-57; the context picker, "Switch context" and the scope dropdown gone); minor (§3 and the package table: `internal/update` with a `depguard` rule of its own, `l4-update`; §4.4: `ui.navigate` leaves the checked rows alone and the selection bar from one row, the owner's audit answers (7) and (8)); minor (the docs brought to the code, owner's rule 10: Current state with the chat column built, the Pods' and Nodes' CPU and Memory columns, background jobs (A91), the cache's `Join`, `Held` and `Peek`, bash and fish in the terminal, every flag of `cmd/cogpit`, Cluster Settings › Metrics, the day's D-53 to D-56 and the logo, rows for `internal/buildinfo` and `internal/testkit`; §3 `demo` in L2 and `internal/update` without a depguard rule of its own; §4.2 nine actions on a selection, Restart on a selection built (A74); §4.3 the scope dropdown decided to go, not built; §4.4 the drawer's Metrics section; §8 what the proxy preference carries and what not (the agent, Sparkle); §9 the Prometheus dialog from Cluster Settings › Metrics too; §10 the terminal's scrollback (D-56); §14 Fyne v2.8.2, Helm v4.3.1, no LLM module; §15); minor (the package table: `internal/update` with the owner's update key in the releases since v0.11.0, not proven until a signed appcast is served); minor (§7 and the package table: the agent's API keys in the owner-only `llm-keys.json` on every platform (`FileKeyStore`), the keychain code removed, a key kept there before shown as no key (`ErrKeyMissing`), the owner's decision of 2026-10-15); minor (§4.4: the drawer's data sections with each key above its value, names wrapping at - . _ /, a Config Map's values in editors saved through `configMap.saveData`, D-53); minor (Current state, §4.3 and §11: the layout toggles, `UIState.NavigatorHidden`, `DockOpen` and `Update`, `ui.toggleNavigator`, `ui.toggleDock`, the dock's collapse moved into the engine, the Update button from Sparkle's gentle reminders, F7, D-54); minor (§7 and Current state, F6 (D-53): the MCP token and port kept across starts, Regenerate token through the guard on the same port, the MCP details behind the status bar's gear, the top bar's MCP button gone, the bridge reading the files before every call); minor (§4.2: the drawer's Copy drawn right after the object's name (F4)); minor (Current state: a copy's confirmation shown as a toast only, not in the notification log (F5)); minor (§7: a conversation in which a turn ran over a private connection is not kept, H-96 built); minor (Current state and §4.3: R3 postponed by the owner); minor (§4.3: R2 built, a hotbar tile dragged within the bar moves through `hotbar.moveCluster`, `fyneui/hotbardrag.go`); minor (Current state (2026-10-15): the evening's decisions built in the night run but R3 and A10); minor (§4.3: A73 built, `ui.select`'s mode `open`: a plain click keeps the checked rows, the drawer's row highlighted, the scroll follows the drawer); minor (`internal/buildinfo`, L0, the version both binaries report; About Cogpit in macOS's application menu, decision A60); minor (the owner's decision round of 2026-10-14 evening, marked "decided 2026-10-14 evening, not built" where a section describes behaviour it changes: §4.2 more agents' calls that always ask, Restart on a selection, ⌘F and ⌘⇧T as menu items; §4.3 one window (D-52), a click keeps the checked rows, F-keys in search fields, an agent's proxy as a confirmed write, Disconnect closes the tabs, the navigator's and the palette's state (D-51), notifications to agents; §4.4 resource claims in the pod drawer, a device's claim; §5 the Overviews wait for the reviews, Flux and Argo CD from discovery; §6 insecure-TLS contexts ask once, the approval binds Cogpit's proxy, unlinking a sync folder; §7 the bridge honours the MCP switch (D-49), the switch's 1-hour end, the filter's 10 bytes, the README framed; §8 http origins marked, dotted repository names, no offer after an interrupted install; §9 node history from node-exporter (F1), separate queries for far ranges; §10 bash and fish, an enforcing setting, the signature with Rekor (D-50); §15 D-47's rest and D-52 open; defaults the owner confirmed marked so); minor (two binaries: `cogpit-cli` inside the app bundle and the app copying its stdio registration, D-16, D-2; §5: the table snapshots counted in the Diagnostics tab and `diagnostics.get` only, no longer in the status bar, owner; ); minor (§11 and Current state: `internal/update` built, Sparkle 2 loaded at run time from the app bundle, D-4); minor (; §4.6, §4.1, §12 and Current state: `cogpit://` links through five navigation commands with origin `deeplink`, D-47; §4.3 and Current state: start at login, `UIState.LoginItem`, `Options.LoginItem`, D-48; §5: peeking at running scopes; §7: the cached Secrets' values and Flux's credential fields kept out of what agents read (H-82, H-63); §8: credentials over plain http asked once per repository (H-40); crash safety: the node shell journal and its cleanup at connect, H-71; §7: the terminal tab's agent-read marker and its 15-minute end, H-83; §4.2: `Spec.AgentsAsk`, an agent's role binding always asks, H-27; Current state, §9: the workloads' drawers' Pods tables without a Namespace column, D-40 decided by the owner; §9: a pod-metrics refusal affects only its namespace, D-39 decided by the owner; §4.3: the status filter of every view, `UIState.States`, `ui.setStatusFilter`, the snapshot's states, D-34; §4.2: the node shell's maximum duration among the parameters refused to agents, D-37; §9: the cluster's Metrics source; §9: the cluster Overview's Pods history from kube-state-metrics; §9: history that outlives a closed drawer, lines broken at a gap; §9: the nodes' disk from node-exporter through Prometheus, D-43; §9: the Nodes list's usage bars; §8: the charts' icons, D-46, G11; §8: the chart drawer's version and README, HELM2, G11; §6: a context that leaves Cogpit takes its dock tabs, a connect under way when it leaves forgets it, G5, G13; §5: the Flux and Argo CD dashboards follow a namespace-limited user's plans and refusals, say when the definitions cannot be listed, and a refused label-selected scope is not kept warm, G3, G23; §7: `kinds.list` with each kind's tools, its cache state and the kinds not served, G17; §7: what the dock's tabs show, `dock.read` and the window's reader, D-44, G17; §4.2: GUI-only commands under one mark, `Spec.GUIOnly`, G17; Current state, §4.3: no context picker at start, D-42; §4.3, §6, Current state and `cmd/cogpit`: the tabs and the tables' layout kept in `workspace.json`, restored without connecting anything, D-41; §4.3, §4.4, §5, §9 and Current state: a Pods table in the workloads' drawers (D-40), the drawer's own indexes (`DetailNeeds`), the 500-row bound of sortable drawer tables; §4.3, §4.4, §9 and Current state: a Pods table in the workloads' drawers (D-40), the drawer's own indexes (`DetailNeeds`), the 500-row bound of sortable drawer tables; §9: Prometheus detection reads the Services per namespace for a namespace-limited user and follows a refusal, G12; §5: a refused list of the custom resource definitions ends their watch until a refresh, checked on kind with a namespace-limited ServiceAccount, G3; §5: the rest of the class for a namespace-limited user: views' indexes, an agent's Overviews, `Lookup` and write targets, Helm's releases, the Applications follow plans and refusals, non-waiting reads hold nothing while a plan is pending, G3; §9: the pods' metrics listed per namespace of the Pods view's plan for a user who may not list pods everywhere, D-39, G12; §5: one object's read, the drawer's and an agent's, takes the object's namespace and its events there, night decision, G3; §5: a refused read in all namespaces counts whoever met it, `cache.OnRefused`, and the reads that wait follow it at once, `readFollowing`, G3; Argo CD, G23: §4.5 curated profiles from their own files and kinds that come with a definition, D-35; §4.3, §4.5: the Flux dashboard page and the Flux kinds' curated profiles, G23; §2 `internal/terminal`: the node shell's stream (D-37); Current state and §9: every byte amount in binary units with one decimal, D-32; §2, §3, §4.3, §4.4 and Current state: every timestamp in the local time zone and the region's format, `internal/locale`, D-31; §5 and Current state: DER certificates, the key check and the chain check, D-30 (the owner's answers); §5 and Current state: the certificates in a Secret's keys decoded in the drawer and for agents, D-30; §8 and Current state: Helm's repositories.yaml as the repositories' source, D-29 built; §5: one object, workload logs and port forwards read their namespace once the plan is decided; Current state: copy icons in the lists, D-25; §5: the Overviews follow the access reviews' answers; §4.5: references link to every built-in kind; §6: removing a source closes its contexts' tabs; §5 and Current state: the Diagnostics tab, D-13; §7 and Current state: the audit log read back, Help › Audit Log and `audit.list`, G17; §4.3, §7 and Current state: the allowance of agent writes in Cluster Settings › Agents, G17; §4.4 and Current state: `object.get`'s related objects, G17; §4.4, §7 and Current state: `view.rows`, the rows the user sees, G17; §4.4 Revert to original and drafts of unsaved editor text, G9; §4.4 drafts of unsaved editor text, G9; §5 namespaced watches, G3: `Cache.AcquireNamespaces`, refused scopes not kept warm, the engine reading a kind in each named namespace when the user may not list it in all of them, §4.3 the accessible namespaces as a cluster setting, G13; §6 the kubeconfig's TLS and proxy fields verified against TLS test servers, certificate hints in connect errors, a `proxy-url` password kept out of them, insecure contexts marked in the picker and the connect log; §10 kubectl in terminals, D-3 built: the check, the verified download, the release first on PATH, `internal/kubectl` (L1, §2, §3), §4.3 the kubectl preferences, Current state; §4.3, §8 the proxy of the Helm downloads, Preferences › Proxy, G13; §4.3, §6 a cluster's proxy through rest.Config.Proxy, its password redacted, G13; §4.3, §9 hidden metrics, nothing polled for them, G12 and G13; the navigator's scope, G5 and G13, §4.3: `UIState.NavigatorScope`, `ui.setNavigatorScope`, kept in step with the connection by `syncNavScope`, the tabs of the scope (`TabsInScope`) counted by the tab keys, the window's section level (`navigator_sections.go`) and the tab bar drawing the scope's tabs; the navigator's scope, G5 and G13, §4.3: `UIState.NavigatorScope`, `ui.setNavigatorScope`, kept in step with the connection by `syncNavScope`, the tabs of the scope (`TabsInScope`) counted by the tab keys; §4.3 the notification log of every toast, `UIState.Notifications`, what stays in the window; §4.3 `UIState.ColumnOrder` and the snapshot's `Order`; the window's row checkboxes, §4.3 and Current state; the table's selection, G5, G7, G9: §4.2 actions on a selection and `object.deleteMany`, §4.3 `ui.select`'s modes; the welcome page and Disconnect, G5 and G13, §4.3: `UIState.Welcome`, `ui.welcome.open`, `cluster.disconnect`, the window's page and its Help and Window menus; the welcome page and Disconnect, G5 and G13, §4.3: `UIState.Welcome`, `ui.welcome.open`, `cluster.disconnect`; §4.4 a logs tab's source, narrowed in the merged stream, timestamps on every stream, its older lines and a jump to a time; §4.4 a logs tab's source, narrowed in the merged stream, timestamps on every stream, and its older lines; §4.4 a logs tab's source, narrowed in the merged stream, and timestamps on every stream; §8: a release upgraded to a chart version from the user's repositories, the Upgrade tab's choice of repository and version, G11; the tab bar of cluster views, G5, §4.3: `UIState.Tabs` and `ActiveTab`, kept in step by `syncTabs`, the `ui.tab.*` commands, `ui.openView` in the preview tab, the window's bar (`tabbar.go`) and its View menu keys, §4.2; the tab bar of cluster views, G5, §4.3: `UIState.Tabs` and `ActiveTab`, kept in step by `syncTabs`, the `ui.tab.*` commands, `ui.openView` in the preview tab; Preferences and cluster settings, G13, §4.3: engine state, stores, commands, the GUI that applies them; the cluster Overview, G12: §4.3 the page and `UIState.Overview`, §9 the cluster scope of the metrics hub; §5 a virtual kind made of several kinds, the Applications; §4.5 curated profiles of CRD kinds, the Vertical Pod Autoscalers; Current state: the four Device Resources views, 45 built-in views; §8: Helm chart repositories kept in Cogpit's own folders, the Charts view and the install, G11; the command palette, G13, §4.2: its rules from the registry's metadata, the shortcuts bound from the registry, §4.3: `UIState.Palette`; `cogpit-cli` contexts, get and the MCP stdio bridge, §7, and `internal/app`, the wiring both binaries share: Current state, §3; the navigator, §4.3: its search, keyboard row and open groups are the window's, its tree Cogpit's own rows; one line in Current state; the hotbar, G13, §4.3: `UIState.Hotbar`, `hotbar.json`, the `hotbar.*` commands and the bar left of the navigator; Current state after the fifth run's evening: crash reports, the external MCP server switched in the status bar, the window's metrics and chart hover, the quit crash fixed; G12 third slice, §9: Prometheus in the window, ranges as engine state, checked against a real Prometheus on kind; G12 second slice, §9: Prometheus through the service proxy, backend; G12 first slice, §9 as built: the Metrics Server provider, the hub that polls only while a view or drawer shows metrics, CPU and Memory columns, the drawer's Metrics section, `metrics.get`, the demo's synthetic Metrics Server; D-28 built, §6: every context from a source file read alone, `~/.kube/config` a file of the default folder, `$KUBECONFIG` and `--kubeconfig` files session sources, bare names resolved; Kubeconfig Syncs second pass, §6: dot files, `~/.kube` by default, a connection closed with its file, the connect log; related rows rebuilt when the indexed kinds finish listing; a stopped shell drops its queued work; fourth run: kubeconfig sources and the approval of their credential plugins, §6; an upgrade from a tab bound to the tab's text revision, values scrubbed in their quoted forms too, upgrade and rollback checked against the server's newest revision, the Rollback dialog's answer bound to its revision, §8; a revealed Secret value bound to the Secret's version, §5; pasting a kubeconfig removed again, D-21, §6; §7 the chat column and the seam `engine.ChatAgent`; A5 built; §7 the built-in agent's engine side built, the package table's `internal/agent` row; §9: the nodes' history from node-exporter built in the night run (F1, A43, A115), the cause of F1 and every chart's source recorded; §9: query sets for ranges far apart built in the night run (A46); §7 the window's chat built: the column, its re-reading and streaming, Preferences › Agent; §7 the private connection's reads like the user's, built in the engine (M12 (c)); §5 A90 built: the curated kinds from API discovery without the definitions; §4.4 background jobs, A91 built; §4.4 an application's logs in one tab, A81 built; 185 commands; §10 the signature with sigstore-go and Rekor's transparency-log proof, built (D-50), §14 sigstore-go; §4.3 and §4.2: the navigator's search, keyboard row and collapsed source groups and the palette's text as engine state (D-51: `UIState.Navigator`, `PaletteText`, `syncNavigator`, four commands), the ring on keyboard navigation only, the dropdown of the hotbar's clusters, Disconnect closing the cluster's tabs, F1–F12 in the search fields, ⌘F and ⌘⇧T as View menu items, the welcome page's Recent and two links (A51–A55, A61, A63, A64, A67, A113), built 2026-10-15; 188 commands; §6: a credential plugin's approval binds Cogpit's proxy for the cluster, A23; §6: an `insecure-skip-tls-verify` context asked once through the plugins' policy, A28; §6: such a connection marked in the UI state and the status bar, `cogpit-cli get` warns, A29; §8: A39 built, the both-drivers note in the owner's wording; §8: A17 built, an interrupted install offered nothing; §8: A36 built, the chart id; §4.2 Spec.Warning and §8 the origins' marks, A14 built 2026-10-15) · **Target:** Lens Desktop 2026.10.51501 ## Current state (2026-10-20) @@ -163,7 +163,13 @@ is checked against upstream's end of life from a table built into each release Since 2026-10-19 (WF39, WF40, [D-97](decisions.md#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays)): every connect is a run of its own (`engine/connect_run.go`): showing another cluster ends only the window's wait, never the login, and a failed connect leaves the window on its cluster (the -section [Several clusters connected](#several-clusters-connected-d-69)). Since 2026-10-19 (WF35, WF37): an +section [Several clusters connected](#several-clusters-connected-d-69)); since 2026-10-22 (AW17, +[D-114](decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)) with +that cluster's error page over the workspace, whether or not a tab is open, and every connect +measured in stages (kubeconfig, a credential plugin's login, DNS, TCP, TLS, the API server's +answer: `cluster/connectstages.go`, on client-go's own first request through `net/http/httptrace`), +kept in the connection log and, for a failure, in `UIState.ConnectFailure`; the welcome page lists +the hotbar and Recent only (AW13). Since 2026-10-19 (WF35, WF37): an interruption is an entry of its own in the connection log, and a log's resume marker names the gap from its last line. Since 2026-10-19 (WF44, WF45, [D-101](decisions.md#d-101-the-kubeconfig-sources-at-hand-and-a-removed-cluster-leaves-the-hotbar)): removing a source takes its clusters' hotbar tiles off (`Session.dropHotbarTilesOfSource`). @@ -213,7 +219,19 @@ title in two texts (`objectDialogTitle`: a space after the arrow, in Fyne's symb wide) and a tooltip layer of the dialog's own (`newDialogTooltip`). Every dropdown is a `selectField` ([`selectfield.go`](../../internal/ui/fyneui/selectfield.go), GW5): Fyne's Select for the field, a list of Cogpit's over it, the current entry checked at the field's place, scrolled to -it in a list taller than the window. +it in a list taller than the window; since 2026-10-22 (the owner's AW1) outlined as an entry, the +outline of every field 2:1 on every surface (`theme.ColorNameInputBorder`; the wells' and cards' +edges a token of their own, `colorHairline`). Since 2026-10-22 (the owner's alpha walk, AW2 to +AW4 and AW19, [D-116](decisions.md#d-116-escape-closes-the-innermost-thing)) Escape closes the +innermost thing open ([`escape.go`](../../internal/ui/fyneui/escape.go)): what has the keyboard +closes its own first (a dropdown's list, which takes the keyboard off its field; a find bar; a +search, cleared and left), then the window's `escape` runs what the top overlay registered as it +showed (`onEscape`, `onShown`: a dialog's Cancel, a pop-up's close, the palette, the +notifications, the MCP details; every Fyne dialog through `sh.showDialog`), an overlay without one +taking the key, then a settings page, then the drawer. Fyne hands a key to the focused widget only, +so the fields of Cogpit's dialogs are types that pass an Escape on (`fieldEntry`, +`fieldSelectEntry`, `fieldCheck`, `fieldSlider`); `TestEveryDialogTakesEscape` reads the sources +for a dialog or a pop-up shown past the mechanism. ## 1. Goals and principles **Goals** @@ -741,7 +759,8 @@ type UIState struct { IntegrationsQuestion string // the shown cluster the window asks which integrations to use; derived (2026-10-17, D-76, §4.7) Tabs []ViewTab // the tab bar: a view of one cluster each, with its own state (2026-10-13) ActiveTab string // the shown tab; View, Namespace, Filter, Selected, Drawer are its - Welcome bool // the workspace shows the welcome page; derived (2026-10-13) + Welcome bool // the workspace shows the welcome page; derived (2026-10-13), never over a chosen cluster's failed connect (2026-10-22) + ConnectFailure *ConnectFailure // the shown cluster's failed connect: context, time, the connect's stages; its error page shows it (2026-10-22, D-114) ColumnOrder map[string][]string // each view's column ids as the user arranged them (2026-10-13) Notifications NotificationSummary // the toasts' log: total, unread, its worst level (2026-10-13) NavigatorScope string // "section:local" or "cluster:": the navigator's level, the tabs shown (2026-10-13) @@ -783,7 +802,9 @@ restore's `ConnectBackground` starts one nobody waits for. A later connect or sh (`errConnectSuperseded`), never the run, which then joins the pool as a cluster the window left with a toast, or says why it failed; Disconnect cancels the run itself. A run's entry is `connecting` while it runs, kept by `syncConnections` through its unexported `running` mark when -another cluster is shown; a failed connect leaves `Context` on its cluster with `ConnectError`. +another cluster is shown; a failed connect leaves `Context` on its cluster with `ConnectError`, +`Connection.Error` the failure's cause in a sentence and `ConnectFailure` its stages +([`connectfailure.go`](../../internal/engine/connectfailure.go), D-114). A command's cluster ([`target.go`](../../internal/engine/target.go)) is the context its parameters name: an optional `context` (`engine.OnCluster`, embedded in the parameters of the commands that @@ -811,7 +832,8 @@ collapsed. `SyncDock` runs the rules after every change (`syncDockScope` first): not shown made active (an agent's `pod.logs` or `terminal.open` with that `context`) becomes that cluster's active tab, its dock open for when it is shown, and the shown dock keeps its tab; the active tab closing gives way to the nearest tab the dock shows; the dock opens for a tab it shows, -not when another cluster is shown; `ui.toggleDock` is greyed while the dock shows no tab. +also for one a command shows again that was the active tab (`UIState.ShowDockTab`, the owner's +AW9, 2026-10-22), not when another cluster is shown; `ui.toggleDock` is greyed while the dock shows no tab. `dock.activate` of a hidden cluster's tab shows its cluster first (`Session.Show`). Every tab stays in `Dock` with its stream on its own cluster's backend, so `dock.read` finds a hidden one by its id; the window keeps every tab's content and shows the strip's (`dock.sync`). The dock's height is the @@ -847,7 +869,10 @@ a row, ↵ and Space on a row, a link to the row's own object (the cluster Overv row menu's Show Details (`shell.openDetails`). A click on the empty area below a list's rows sends `ui.closeDrawer` and leaves `Selected` alone (the owner's GW1, built 2026-10-20, the lead's choice to keep the checked rows as A73 does, [D-106](decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace); -[`tableclick.go`](../../internal/ui/fyneui/tableclick.go)). **Built 2026-10-15 night** (owner: selecting and +[`tableclick.go`](../../internal/ui/fyneui/tableclick.go)); it acts at the click's release since +2026-10-22 (the owner's AW12: about 1 s later, × and Escape at once): the table is no +`fyne.DoubleTappable`, whose every tap Fyne's driver holds for the double-click interval, and counts +its header separators' double click itself (`resourceTable.separatorTapped`, `TestListClicksAreNotHeld`). **Built 2026-10-15 night** (owner: selecting and opening a drawer are separate actions): `ui.navigate` sets the view and `Drawer` and leaves `Selected` alone in the same view (`TestNavigateLeavesTheSelection`); the window's selection bar shows from one checked row (`minSelectionBar`), while a checked row's menu acts on the selection @@ -1168,7 +1193,9 @@ connecting it first when it is not) and then restores the tab. What is inferred and changes the tabs only through the commands: a click selects, the × closes, a double click on the preview tab pins, a drag along the bar moves the tab (`ui.tab.move`, since 2026-10-20, the owner's GW4, [D-106](decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace)); the keys are View menu items (§4.2), -⌘⌥⇧← and ⌘⌥⇧→ (`ui.tab.moveLeft`, `ui.tab.moveRight`) among them. A move places the tab among the +⌘⌥⇧← and ⌘⌥⇧→ (`ui.tab.moveLeft`, `ui.tab.moveRight`) among them, which since 2026-10-22 (the +owner's AW10) move the dock's active tab with `dock` while the keyboard works in the dock +([`fyneui/tabmovekeys.go`](../../internal/ui/fyneui/tabmovekeys.go)). A move places the tab among the tabs the bar shows (the navigator's scope's), the other clusters' keeping their places among the rest ([`engine/tabmove.go`](../../internal/engine/tabmove.go)); the dock's tabs move the same way (`dock.move`, among the tabs the dock shows). The window's drag is one for both strips @@ -1234,15 +1261,17 @@ A background connect that fails emits a toast; a context the pool holds is left [`commands/welcome.go`](../../internal/engine/commands/welcome.go)). `UIState.Welcome` says whether the workspace shows the welcome page. It is derived, never set by a command: `UIState.syncWelcome`, which `UpdateUI` runs after `syncTabs` (and `New` once), sets it while no cluster is connected and -none is connecting (at start, after a disconnect, a failed connect or a connection Cogpit closed), -and while a cluster is connected and no tab is active (`syncTabs` leaves no tab active only while +none is connecting (at start, after a disconnect or a connection Cogpit closed; after a failed +connect only without a context to name: since 2026-10-22 a chosen cluster's failed connect shows +its error page, `UIState.ConnectFailure`, D-114), and while a cluster is connected and no tab is active (`syncTabs` leaves no tab active only while no view is open: the last tab closed). While a connect runs it is off, so that switching to a tab of another cluster shows "Connecting to …" and not the page for a moment. `ui.welcome.open` (Help › Welcome, `DangerUI`) shows it over a connected cluster by leaving the active tab: `ActiveTab` empty and the live view closed as closing the last tab closes it, the tab keeping the state `syncTabs` saved, so selecting it (`ui.tab.select`) brings its view, filter, selection and drawer back; opening a view ends the page as well. It also closes a settings page and the palette, and is -refused while a connect runs. Agents read the flag with `ui_state` (`welcome`). Cogpit's defaults, +refused while a connect runs; over a failed connect it leaves the failed cluster `Disconnected`, as +Disconnect does, so that the page shows (D-114). Agents read the flag with `ui_state` (`welcome`). Cogpit's defaults, inferred, not the owner's decision (Lens's welcome page is not captured). The window ([`fyneui/welcome.go`](../../internal/ui/fyneui/welcome.go)) draws the page over the workspace, below the tab bar; since 2026-10-13 (night run, G17) not over the dock, so that a dock tab of no @@ -1259,7 +1288,20 @@ Documentation and About Cogpit are window actions outside the registry, as the s (D-23): no agent opens a browser. Since 2026-10-15 the page's Documentation is two links to the repository on GitHub (the owner's A113): the README for what Cogpit does and `docs/developer/commands.md` for the commands (`TestWelcomeLinksTheReadmeAndTheCommands`); the -clusters of this session are headed "Recent" (A67, was "This session"). On macOS About Cogpit is the application menu's (A60, 2026-10-14): +clusters of this session are headed "Recent" (A67, was "This session"). Since 2026-10-22 the page +has no "Other clusters" (the owner's AW13, D-114): the hotbar and Recent, and only on a first start +the kubeconfigs' clusters as "Your clusters". + +**A failed connect's error page** (built 2026-10-22, the owner's AW17, +[D-114](decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages), +[`fyneui/errorpage.go`](../../internal/ui/fyneui/errorpage.go)): the tab bar stacks it over the +workspace beside the welcome page (`tabBar.workspace`) and shows it while the chosen cluster's +connect failed and the engine shows no welcome page (`errorPageShown`), in the welcome page's stage: +the logo, "Could not connect to ", that it is an error page, the cause under the stage it +failed in, the stages from `UIState.ConnectFailure` ([`connectstages.go`](../../internal/ui/fyneui/connectstages.go), +which Connection Updates uses too), Connect Again and Show Connection Updates. The view's own +placeholder under it says only "Not connected."; every placeholder line fits the view with an +ellipsis (`placeholderLayout`, AW18: a line centred at its full width drew over the navigator). On macOS About Cogpit is the application menu's (A60, 2026-10-14): GLFW's own About item, which `appmenu_darwin.m` points at Cogpit's dialog (`about.go`) once the app started; its tag stays below the 5000 from which Fyne's `resetDarwinMenu` removes items, so the menu bar's rebuilds (a connect, a disconnect, the kinds loading) keep it. No main-menu item is @@ -1383,7 +1425,8 @@ panel out as none), the tab bar, the views and the dock take it, the hotbar stay leaves the navigator if it was in it; its width stays the user's. The dock's open state was the window's until then (`dock.expanded`); `UIState.SyncDock`, which `UpdateUI` runs after every change, keeps it to what the dock can show: a tab added or another tab made active while the one before -is still there opens it, the active tab moving because its tab closed does not, a dock without tabs +is still there opens it, and so does a command that shows a tab open already, the active one too +(`UIState.ShowDockTab`, since 2026-10-22, AW9), the active tab moving because its tab closed does not, a dock without tabs is closed and `ui.toggleDock` is disabled (`ErrNoDockTabs`); the dock's arrow, the toggle and a click on the shown tab of a collapsed dock all dispatch the command (`TestSyncDock`, `TestLayoutTogglesThroughTheEngine`). `workspace.json` keeps whether the navigator is hidden and @@ -1440,11 +1483,13 @@ The names it offers are read from the cache again at every opening, as are a cre namespace fields, which follow them while the dialog is open (`shell.loadNamespaces`, `followNamespaces`; since 2026-10-17 evening, the owner's walk, WF10: a namespace created in the window was missing from both until the cluster was shown anew; `TestNamespaceFilterOffersANamespaceCreatedSince`, -`TestCreateDialogFollowsTheNamespaces`). It is a read of the cache on the user's action, not a poll. Since 2026-10-20 (the owner's GW9, [D-106](decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace), [`nsgone.go`](../../internal/ui/fyneui/nsgone.go)) it reads every namespace page by page (`resources.list`'s `offset`, 1,000 a page; one request without a limit had answered the first 100) and notes the terminating ones by their row's status; while the filter names namespaces it reads them again after the view's rows changed, at most every 2 s (`shell.recheckNamespaces`; a namespace deleted takes its objects with it, which changes the rows of a view filtered to it), so that a namespace the filter names that is gone or going reads red in the list and on the button; the window derives the marks, agents read the same cache through `resources.list`. +`TestCreateDialogFollowsTheNamespaces`). It is a read of the cache on the user's action, not a poll. Since 2026-10-20 (the owner's GW9, [D-106](decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace), [`nsgone.go`](../../internal/ui/fyneui/nsgone.go)) it reads every namespace page by page (`resources.list`'s `offset`, 1,000 a page; one request without a limit had answered the first 100) and notes the terminating ones by their row's status; while the filter names namespaces it reads them again on the engine's `EventNamespaces` (`shell.namespacesChanged`; since 2026-10-22, the owner's AW11: before, after the view's rows changed, which a namespace without objects of the view's kind never does; [§5](#5-cache), [`nswatch.go`](../../internal/engine/nswatch.go)), so that a namespace the filter names that is gone or going reads red in the list and on the button; the window derives the marks, agents read the same cache through `resources.list`. What the navigator opens is engine state: a click, ↵ and the search's ↵ dispatch `ui.openView` (the preview tab), a double click and ⇧↵ `ui.tab.open` with `fixed` (since 2026-10-13). The navigator and -the tab bar tell a double click themselves (two clicks within 500 ms, macOS's default): Fyne's own -double tap delays every single tap by 300 ms. The +the tab bar tell a double click themselves (two clicks within 500 ms, macOS's default), as the +list's header separators do since 2026-10-22: Fyne's own double tap holds every single tap for the +system's double-click interval (on macOS `NSEvent.doubleClickInterval`, 0.5 s by default; 300 ms +elsewhere). The tree is Cogpit's own rows (`navTree`), not Fyne's `widget.Tree`, whose rows keep their hover and keyboard highlight private: an item's tooltip needs the pointer, the focus ring the keyboard's row. @@ -1768,7 +1813,12 @@ while the drafts banner and the node shell sweep take an interruption's end as n memory only (`drawer.secretUnsaved`), never on disk; an editor's copy goes through `shell.copyText` as a Secret's value (yamlview's `OnCopy`), and since 2026-10-16 the copy icon in the key's line above each editor (`secData.copyIcon`, a pinned `copyButton`) copies the whole - value the same way. + value the same way. Since 2026-10-22 (the owner's decision, D-25) a masked value, in this drawer + and in a read-only one, has the drawer's copy icon too: its `copyHook.fetch` runs `secret.reveal` + with `whole` and copies the answer as a Secret's value without showing it, nothing kept in the + drawer's revealed values, and an edited value hidden again copies the editor's text + ([`fyneui/secretcopy.go`](../../internal/ui/fyneui/secretcopy.go)); a revealed value Show cut + copies whole through its icon by the same hook, the drawer keeping the cut text. - **Editors, logs, terminals and chats** are engine sessions shown as dock tabs, so agents can open, read and close them too. - **Background jobs** (A91, built 2026-10-15; [`engine/jobs.go`](../../internal/engine/jobs.go), @@ -2480,7 +2530,8 @@ any object and keeps nothing of its own: `BuildDetailWith` adds a Data section t binary value by its size only; it decodes each value to measure it and zeroes the bytes at once (best effort: the cached object's base64 text and a revealed value's string are Go strings, which cannot be overwritten). `secret.reveal` reads one value of the Secret the drawer shows from the -cache, cut to 4 KiB and 40 lines, for the GUI origin only (`TestSecretDrawerReadsTheCacheAndMasks`, +cache, cut to 4 KiB and 40 lines (whole with `whole`: the drawer's editor, D-59, and since +2026-10-22 a masked value's copy without showing it, D-25), for the GUI origin only (`TestSecretDrawerReadsTheCacheAndMasks`, `TestRevealIsGUIOnly`). Its action names the Secret's `resourceVersion` the drawer listed the key at: a Secret changed or created again since is refused, and the drawer masks a value revealed at an older version and forgets it (`TestRevealedValueDroppedWhenSecretChanges`; R-6 of the fourth run's @@ -2617,6 +2668,21 @@ closes; opening the Secrets view again moves the releases back and closes theirs (`KindProfile.APIObject`); such kinds bring their own commands. `kinds.list` marks them `local` and `virtual` (2026-10-12), and the GUI shows no "+" (Create resource) on their views. +**The namespaces while a filter names them** (2026-10-22, the owner's AW11, +[`nswatch.go`](../../internal/engine/nswatch.go), [D-106](decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace)). +Each backend with a cache has a namespaces watch that holds nothing until the shown cluster's +namespace filter names namespaces (`UIState.Namespaces`, followed through `EventUIState`) and the +user may list namespaces (`Backend.Listable`, polled from the access reviews' answers in memory, +woken by `accessChanged`). Then it holds one handle on the namespaces, shared through the cache with +the filter's own `resources.list` reads and the access reviews' handle, and its loop, coalesced to +one step per five snapshot intervals (500 ms by default), emits `EventNamespaces` (`View` the +context) when a namespace was added or deleted or began or ended terminating; a label or a condition +sends none. The window reads the namespaces again on it (`shell.namespacesChanged`). A list the API +server refuses ends the watch until `cluster.refreshAccess` or the next connect, as the custom +kinds' watch does; nothing waits on the watch, so a refusal costs no view +(`TestNamespaceWatchOfANamespaceLimitedUser`, `TestNamespaceWatchEndsAtARefusal`). Clearing the +filter or showing another cluster gives the handle back; the informer stays warm as any. + **Custom resource kinds** (2026-10-11, [`customkinds.go`](../../internal/engine/customkinds.go)). A real cluster's backend holds one cache handle on `customresourcedefinitions` while it is connected (`Backend.CustomResources`; the demo cluster has none). Its watch events, coalesced, @@ -3306,7 +3372,13 @@ after a failed login only. Each line is appended to the context's file as it hap JSON-lines file per context in `/Cogpit/connection-logs`, named by a hash, 7 days and 1 MiB); the session keeps its own attempts in memory too (30 per context, 64 contexts) for `ConnectProblem` and the lines of `cluster.connectLog`, whose `attempts` are read from the file and -memory at each call, newest first. `Contexts()` marks a context whose latest attempt ends in an +memory at each call, newest first. Since 2026-10-22 (D-114) a connect's attempt also keeps its +stages (`ConnectAttempt.Stages`, a `stage` record each in the file): `cluster.Connect` measures them +([`connectstages.go`](../../internal/cluster/connectstages.go)) from the configuration it builds and +client-go's own `GET /version`, whose context carries an `httptrace.ClientTrace` (the name looked +up and its addresses, each dial, the handshake, the first byte), so that Cogpit opens no connection +of its own for them, and reports them once at its end (`StepStages`) and on its `*ConnectError` +(`cluster.StagesOf`, the failed stage's text its `Cause`). `Contexts()` marks a context whose latest attempt ends in an error line (`ContextInfo.ConnectProblem`): the welcome page shows a warning icon and the navigator's section a red dot and Show Connection Updates… in the row's menu, each opening "Connection Updates: ", which every status dot of a cluster opens too, for any context. The engine announces @@ -5896,6 +5968,13 @@ changed. | Date | Change | Summary | |---|---|---| | 2026-10-22 | minor | §4.3: which dock tab has the keys (the owner's AW5, AW6 and AW8, D-115): a tab the user opens or shows from the window takes them on its editor, terminal or log once ready, `dock.requestFocus` and `dock.takeFocus`, an agent's leaves them; the ⌘F paragraph: the find bar repaints and focuses its field through the window's canvas | +| 2026-10-22 | minor | Current state: Escape closes the innermost thing (D-116, the owner's AW2–AW4 and AW19: `escape.go`, every overlay's Escape registered as it shows, a dialog's fields passing Escape on) and a closed dropdown outlined as an entry, the field outline 2:1, `colorHairline` for the wells and cards (AW1, D-104) | +| 2026-10-22 | patch | §4.3: a click below a list's rows closes the drawer at its release (the owner's AW12, D-106): the table counts its header separators' double click itself and is no `fyne.DoubleTappable`; the navigator's paragraph: Fyne's double tap holds a tap for the system's interval (0.5 s on macOS by default), not 300 ms | +| 2026-10-22 | minor | Current state, §4.3 and §6 (the owner's AW17 and AW13, D-114, built on the branch `feat/failed-connect-page`): a chosen cluster's failed connect shows its error page, `UIState.ConnectFailure`; the connect's stages measured on client-go's own first request with `net/http/httptrace`, kept in the connection log; the welcome page without "Other clusters"; the view's placeholder fits the view (AW18) | +| 2026-10-22 | minor | §4.4: a masked Secret value copied without being shown (the owner's decision, D-25): the drawer's copy hook reads it with `secret.reveal` and `whole` and copies it as a Secret's value, the drawer kept masked (`secretcopy.go`) | +| 2026-10-22 | patch | §4.3: ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab while the keyboard works in the dock (`dock` on `ui.tab.moveLeft` and `ui.tab.moveRight`, `tabmovekeys.go`, the owner's AW10, D-106) | +| 2026-10-22 | patch | §4.3: a command that shows a dock tab open already, the active one too, opens the minimised dock (`UIState.ShowDockTab`, the owner's AW9, D-54) | +| 2026-10-22 | minor | §5: the namespaces watched while the shown cluster's namespace filter names some (`nswatch.go`), `EventNamespaces` when one comes, goes or begins terminating, coalesced; §4.4's namespace filter reads them again on it, not after the view's rows changed (the owner's AW11, D-106) | | 2026-10-22 | trivial | The navigator's sections: the cloud sections not a target (the owner's decision of 2026-10-22 on the cloud providers' credential plugins and cloud account integrations: won't build, D-9), no longer "after the beta" | | 2026-10-22 | patch | §4.4: a list that gets shorter while scrolled, a new bullet: Fyne's table kept the longer list's offset and drew no row ("2 of 200 items" on awe-d-pinniped, the owner's finding); `tableView.keepScrollInRows` clamps it as a scroller does, the lead's choice, open to revision | | 2026-10-22 | minor | Current state and §4.4: the Pods list's image grade as a shield and each container section's grade card in a pod's drawer (D-113, PR #69); the overlay's `sectionAmender` | diff --git a/docs/developer/commands.md b/docs/developer/commands.md index 631f57368..94b5f5869 100644 --- a/docs/developer/commands.md +++ b/docs/developer/commands.md @@ -40,7 +40,7 @@ Cogpit and its flags are in [`usage.md`](usage.md). | `chat.toggle` | `chat_toggle` | ui | `open`? | Shows or hides the built-in agent's chat column at the right edge of Cogpit's window, as ⌘I (Ctrl+I) does. ui_state reports chat: true while it is shown | | `cluster.alertmanager` | `cluster_alertmanager` | read | `context`? | Returns which Alertmanager a connected cluster's alerts come from (the shown one unless context names another): auto (found among the cluster's Services by its well-known names) or the address namespace/service:port, path prefix and https the user set, whether it is kept in Cogpit's preferences, and what Cogpit knows of it now (state, inUse, detail) | | `cluster.connect` | `cluster_connect` | ui | `context` | Connects to a context as cluster_contexts lists it and shows it in the window: its most recently used tab, or else its Pods view in the preview tab; the other clusters' tabs stay | -| `cluster.connectLog` | `cluster_connectLog` | read | `context`, `limit`? | Returns a context's connection log. attempts: every connect, reconnect, login, disconnect and interruption kept (7 days, at most 1 MiB per context, also from earlier runs), newest first, each with its kind, start, end, duration (tookMs), outcome (ok, failed, abandoned, cancelled, interrupted for an interruption, whose reconnect is the next attempt; empty and running:true while it runs, empty otherwise when Cogpit stopped first) and lines: a time, a level (INFO, WARN or ERROR), a text, the step it documents (kubeconfig, server, login, tls, proxy, answer, discovery, cache, access, heartbeat, error, plugin) and its duration | +| `cluster.connectLog` | `cluster_connectLog` | read | `context`, `limit`? | Returns a context's connection log. attempts: every connect, reconnect, login, disconnect and interruption kept (7 days, at most 1 MiB per context, also from earlier runs), newest first, each with its kind, start, end, duration (tookMs), outcome (ok, failed, abandoned, cancelled, interrupted for an interruption, whose reconnect is the next attempt; empty and running:true while it runs, empty otherwise when Cogpit stopped first) and lines: a time, a level (INFO, WARN or ERROR), a text, the step it documents (kubeconfig, server, login, tls, proxy, answer, discovery, cache, access, heartbeat, error, plugin) and its duration; a connect's stages too (stages: kubeconfig, login for a credential plugin, dns, tcp, tls, api, each with its result ok, failed, notReached, skipped or cancelled, its text and tookMs: the names looked up and their addresses, the address and port dialled, or the proxy's, the TLS handshake and the API server's answer) | | `cluster.contexts` | `cluster_contexts` | read | | Lists the kubeconfig contexts Cogpit can connect to (name, cluster, user, default namespace, server, whether it is the kubeconfig's current context) | | `cluster.disconnect` | `cluster_disconnect` | ui | `context`? | Closes Cogpit's connection to a connected cluster (ui_state's connections; context, else the cluster the window shows), or cancels a connect under way, the shown cluster's or one restoring the last session (the window's Cancel Connecting): a credential plugin the connect waits for (connection.waitingForLogin, a browser login) is ended at once, and the cluster is not connected | | `cluster.integrations.answer` | `cluster_integrations_answer` | ui (GUI only) | `context`?, `integrations`?, `saveAsDefault`? | Answers the window's question about a cluster's integrations (ui_state's integrationsQuestion), as its Apply button does (and the warning's Yes of Don't use integrations, with every one off): starting from what applies now (the question's ticks; none for a cluster the window does not ask about), the integrations named are switched on or off and the result is the cluster's own choice; with saveAsDefault it is also the default for new clusters | @@ -220,13 +220,13 @@ Cogpit and its flags are in [`usage.md`](usage.md). | `ui.setStatusFilter` | `ui_setStatusFilter` | ui | `states`? | Sets the status filter of the open view, as the window's states menu beside the namespace filter does (Cogpit's addition; Lens has none): only the rows that carry the given states are shown, in the table, view_rows, select all and the CSV export. view_rows lists the states the rows carry (stateChoices, with counts) | | `ui.sort` | `ui_sort` | ui | `column`, `desc`? | Sorts the open view by a column id (name, namespace, age, ... as kinds_list reports them), ascending unless desc is true | | `ui.sortDrawerTable` | `ui_sortDrawerTable` | ui | `column`, `desc`?, `section`? | Sorts a table in the detail drawer by a column, as a click on the column's title does: the Pods of a node, Deployment, Replica Set, Stateful Set, Daemon Set, Job or Cron Job by name, node, namespace, ready, cpu, memory, status or any other of its columns, ascending unless desc is true | -| `ui.state` | `ui_state` | read | | Returns what the user sees: the connected context and its connection state (tlsUnchecked when the connection does not check the server's certificate), who Cogpit is logged in as there (user: username and groups with source apiServer when the API server confirmed them at the connect, source kubeconfig with a reason when it did not and username is only the kubeconfig's user entry's name, source lastSeen with lastSeen while the cluster is not connected; absent for the demo cluster and a context never confirmed), its Kubernetes version (clusterVersion: the API server's version as its connect read it, its minor and the minor's upstream support from the Kubernetes release table built into this Cogpit, upstream's dates only: released, maintenanceFrom, endOfLife, estimated for a minor newer than the table (tableNewest, tableFetched), state supported, maintenance, endOfLife or unknown as of now, daysLeft; view_rows' tips say each node's kubelet support and version skew), the open view (kind key), the namespace filter, the search text and its toggles (filterOptions: matchCase, regex; filterError when its regular expression is invalid), the status filter (states; view_rows lists the states offered), the sort order, the selected objects (selected: the shown view's; every view keeps its own, which comes back when the view is shown again and is not listed meanwhile), the object in the detail drawer and the order of its sortable tables by title (drawerSort: a node's or a workload's Pods, ui_sortDrawerTable), the tab bar's tabs (tabs and activeTab: each tab's id, context, view, title, preview or fixed, its own filter and selection, and its history), the dock tabs, how many rows the view shows of how many objects, for a pod's or node's drawer the time range and variant of each metrics chart (drawerCharts) and the metrics providers' status line (drawerMetricsProviders: Prometheus and the Metrics Server, answering or not, what each serves), the hotbar of pinned clusters as hotbar_list returns it, one list of clusters top to bottom (each tile's displayName is the name the window shows: the display name set, else the part of the context's name after its last @; commands take the context), and timeFormat, the Go layouts of a date and a time of day that the drawn texts (view_rows, resources_list, object_get's sections) write absolute times in, in the Preferences' time zone; the window's layout (navigatorHidden, dockOpen, chat) and update, the newer release the updater holds for the user (available, version) | +| `ui.state` | `ui_state` | read | | Returns what the user sees: the connected context and its connection state (tlsUnchecked when the connection does not check the server's certificate; after a failed connect state error, error its cause in a sentence and connectFailure the page the window shows for it: the context, when, and the connect's stages kubeconfig, login, dns, tcp, tls and api, each with its result and text; welcome is set while the welcome page shows instead), who Cogpit is logged in as there (user: username and groups with source apiServer when the API server confirmed them at the connect, source kubeconfig with a reason when it did not and username is only the kubeconfig's user entry's name, source lastSeen with lastSeen while the cluster is not connected; absent for the demo cluster and a context never confirmed), its Kubernetes version (clusterVersion: the API server's version as its connect read it, its minor and the minor's upstream support from the Kubernetes release table built into this Cogpit, upstream's dates only: released, maintenanceFrom, endOfLife, estimated for a minor newer than the table (tableNewest, tableFetched), state supported, maintenance, endOfLife or unknown as of now, daysLeft; view_rows' tips say each node's kubelet support and version skew), the open view (kind key), the namespace filter, the search text and its toggles (filterOptions: matchCase, regex; filterError when its regular expression is invalid), the status filter (states; view_rows lists the states offered), the sort order, the selected objects (selected: the shown view's; every view keeps its own, which comes back when the view is shown again and is not listed meanwhile), the object in the detail drawer and the order of its sortable tables by title (drawerSort: a node's or a workload's Pods, ui_sortDrawerTable), the tab bar's tabs (tabs and activeTab: each tab's id, context, view, title, preview or fixed, its own filter and selection, and its history), the dock tabs, how many rows the view shows of how many objects, for a pod's or node's drawer the time range and variant of each metrics chart (drawerCharts) and the metrics providers' status line (drawerMetricsProviders: Prometheus and the Metrics Server, answering or not, what each serves), the hotbar of pinned clusters as hotbar_list returns it, one list of clusters top to bottom (each tile's displayName is the name the window shows: the display name set, else the part of the context's name after its last @; commands take the context), and timeFormat, the Go layouts of a date and a time of day that the drawn texts (view_rows, resources_list, object_get's sections) write absolute times in, in the Preferences' time zone; the window's layout (navigatorHidden, dockOpen, chat) and update, the newer release the updater holds for the user (available, version) | | `ui.tab.back` | `ui_tab_back` | ui | | Goes back to the view the active tab showed before (its history: views opened in the preview tab, ui_navigate to another kind) | | `ui.tab.close` | `ui_tab_close` | ui | `id`? | Closes the active tab (or the tab named by id) | | `ui.tab.forward` | `ui_tab_forward` | ui | | Goes forward again in the active tab's history, after ui_tab_back | | `ui.tab.move` | `ui_tab_move` | ui | `id`?, `index` | Moves a tab of the tab bar (the active one without id) to another place among the tabs the bar shows, as dragging it there does: index 1 is the first | -| `ui.tab.moveLeft` | `ui_tab_moveLeft` | ui | | Moves the active tab one place to the left in the tab bar, as ui_tab_move does | -| `ui.tab.moveRight` | `ui_tab_moveRight` | ui | | Moves the active tab one place to the right in the tab bar, as ui_tab_move does | +| `ui.tab.moveLeft` | `ui_tab_moveLeft` | ui | `dock`? | Moves the active tab one place to the left in the tab bar, as ui_tab_move does, or with dock the dock's active tab in the dock, as dock_move does | +| `ui.tab.moveRight` | `ui_tab_moveRight` | ui | `dock`? | Moves the active tab one place to the right in the tab bar, as ui_tab_move does, or with dock the dock's active tab in the dock, as dock_move does | | `ui.tab.next` | `ui_tab_next` | ui | | Activates the tab right of the active one, the first after the last, as ui_tab_select does | | `ui.tab.open` | `ui_tab_open` | ui | `fixed`?, `view` | Opens a view of the shown cluster in a tab of the tab bar: in the preview tab (which the next view opened in preview replaces; ui_openView does the same), or with fixed in a new fixed tab that stays until closed | | `ui.tab.pin` | `ui_tab_pin` | ui | `id`? | Makes the preview tab (or the tab named by id) a fixed tab, as a double click on its title does: the next view opened in preview then opens in a new preview tab | diff --git a/docs/developer/conventions.md b/docs/developer/conventions.md index f6f7505e7..c5298f1f1 100644 --- a/docs/developer/conventions.md +++ b/docs/developer/conventions.md @@ -140,6 +140,12 @@ malformed-input tests or fuzz targets. on such a line (2026-10-12). - Verify every visual change with an offscreen render (Fyne's `test` package) or a screenshot, in dark and light themes, and attach before/after images to the pull request. +- Escape closes the innermost thing open ([D-116](decisions.md#d-116-escape-closes-the-innermost-thing), + [`escape.go`](../../internal/ui/fyneui/escape.go)): show a Fyne dialog with `sh.showDialog`, never + its own `Show`; show a `widget.PopUp` through `onShown` with what closes it; give a dialog's + fields the types that pass Escape on to the dialog's Cancel (`newFieldEntry`, + `newFieldSelectEntry`, `newFieldCheck`, `newFieldSlider`), never Fyne's plain ones + (`TestEveryDialogTakesEscape` reads the sources for the first two). - Every dropdown is a `selectField` (`newSelectField`, [`selectfield.go`](../../internal/ui/fyneui/selectfield.go)), never Fyne's `widget.NewSelect`: it opens over its field, the current entry checked at the field's place, as a macOS pop-up button (the owner's GW5, 2026-10-20: Fyne's list showed the @@ -163,6 +169,9 @@ Kubernetes-Objekten ist immer: Context, Namespace, Objects." the kind once, the names under each other; in plain text (a title) "Config Map → walk-cm". A dialog builds its rows with `placeRows` and `objectsRow` ([`objectnames.go`](../../internal/ui/fyneui/objectnames.go)), never with `kind + " " + name`. +- **A context is named by its id as it is, its source label grey** (the owner's AW7, 2026-10-22: + "aber grau wäre top"): the Context row reads "kind-cogpit [kubernetes_configs/walk-kind.yaml]", + the label in brackets in the kind word's muted colour (`contextValue`, which `placeRows` uses). - **What a command does beyond its objects is a quick view, never a sentence** (the owner's WF33: "technisch präzise Schnellansicht"): a row per fact with its own short name ("Removes", "To revision", "Image"), the value terse, names bold, what is lost bold in the error colour, what diff --git a/docs/developer/decisions.md b/docs/developer/decisions.md index 399444f3f..df242f981 100644 --- a/docs/developer/decisions.md +++ b/docs/developer/decisions.md @@ -1,6 +1,6 @@ # Decisions -> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (D-115 added and built on the branch `fix/dock-tab-focus`: a dock tab the user opens or shows from the window takes the keys, an agent's leaves them, the find bar's first ⌘F repaints and focuses its field; the owner's AW5, AW6 and AW8 of 2026-10-22, the lead's decisions, open to revision; D-106's GW3 follows; its index row); minor (D-9: the owner's decision of 2026-10-22, the cloud providers' credential plugins and cloud account integrations not a target, won't build, his words verbatim; the 2026-10-15 decision kept as history; its index row); minor (D-114 added: the owner's decisions in his alpha walk of 2026-10-22, not built: a failed connect's page and its stages, the Context label grey, the welcome page without Other clusters, Follow by scrolling; its index row); trivial (D-113: D-new numbered at the merge of PR #69, the owner's merge of 2026-10-22); minor (D-113 added and built in PR #69: image grades S to E and N/A, drawn as shields, from Trivy Operator's reports, the owner's rules and his pick in the Image Rating Lab of 2026-10-22; D-78's severity word, its colours and its drawer section replaced; the lead's details, open to revision; its index row); minor (D-58: a view not read before the interruption or the expiry says so, without the item count, "syncing…" and the download; the namespaces of the cluster shown before dropped at a switch, D-69's WF20 row; the owner's finding of 2026-10-22, the lead's decisions, open to revision; its index row); minor (D-4: A10 made, the tag ruleset and `release`'s admin bypass off, 2026-10-22); minor (D-4: the appcast jobs in `sparkle` sign without the owner's approval since 2026-10-22, H-141); trivial (D-14: the upstream pull requests' state, #155 to #157 merged, #158's requested changes pushed, waiting for review); minor (D-112: the font cache's row decided by the owner, reported upstream as fyne#6619 with the fix in PR fyne#6620; its index row); minor (D-112 added and built on the branch `ci-speed`: CI and test time at the same coverage, the lead's decisions, open to revision; its index row); minor (D-1, D-3, D-7, D-14, D-26, D-47, D-65, D-73 and D-95 brought to D-111's build: S7 and S5 on Windows, kubectl first and Enforce kubectl on Windows, the tests on Windows, ConPTY through x/sys, the program PATHEXT runs, no `cogpit://` scheme from the setup; D-1's index row); minor (D-111 added and built on the branch `windows-release`: Cogpit for Windows, an NSIS setup per user and WinSparkle with the update key Sparkle's feed is signed with, the first releases without Authenticode, the Update button installing with one click, the owner's answers of 2026-10-21; the lead's details; D-4, D-7, D-16 and D-109 follow; its index row); minor (D-99: the agent's column selectable block by block, the owner's choice; D-110: the warning column a fixed width); patch (D-110: the owner's first look at v0.35.0 built: the welcome page's grid floor at every scroll, the header's column dividers, the agent input's cursor); minor (D-109 added and built: on Windows and Linux the menus in the top bar, under the system's title bar); minor (D-110 added: Dark Cockpit, the owner's design language of 2026-10-21; D-22 replaced in the window; D-54: a light and dark toggle left of the bell); minor (D-54: the title bar names no cluster, neither its dot, its name nor its kubeconfig file, the owner's request of 2026-10-21; the status bar and the navigator name it; the lead's decisions, open to revision; D-57, D-58, D-66, D-68 and D-69 follow); minor (D-49: the external MCP server is opt-in, the owner's security posture of 2026-10-21: off on a new installation and for `cogpit-cli mcp` until the user switches it on, a stored "on" or an explicit old preference kept, the agent's note reworded; built with the lead's decisions, open to revision; D-2, D-23, D-48 and their index rows follow); minor (D-108 added and built: Cogpit for Linux, a .deb for amd64 and arm64 and Cogpit's signed APT repository on GitHub Pages, the app updating through apt; D-4, D-7 and D-16 follow); patch (D-77: the alerts pill 5 points wider at each end, the owner's look of 2026-10-20); minor (D-107 added and built: the navigator slides into a cluster, back and between clusters, Preferences › App › Reduce motion, the owner's requests of 2026-10-20; the lead's decisions, open to revision; its index row); minor (D-69: no tab of a cluster without a connection, the owner's GW13); minor (D-69: the tab bar shows the shown cluster's tabs at the section too, the restore's other clusters' tabs hidden, and the preference mixed environments at the foot of All Clusters, the owner's GW11; D-106's place rule with it); minor (D-106: GW4 built, tabs moved by dragging and by Move Tab Left and Right); minor (D-106: GW9 built, a deleted namespace red in the namespace filter, every namespace read); minor (D-106: GW3 built, ⌘F in the dock's editor tabs); minor (D-106 added: the gate walk's GW1 built, a click below a list's rows closes the drawer); minor (D-104: GW5 built, every dropdown a `selectField` that opens over its field, the current entry checked at its place; the lead's decisions, open to revision; its index row); minor (D-104 added, the owner's GW2, GW5 and GW6 of the gate walk of 2026-10-20, GW2 and GW6 built: hints behind a "?", fields sized to their values, Scale's slider, titles without the gap after the arrow; the lead's decisions, open to revision; its index row); patch (D-105: Ctrl with a named key sends xterm's sequence, found on the way); minor (D-105: the owner's GW8, a key's modifiers from its own event in the terminal widget, its cause verified); minor (D-105 added and built: reverse video a state of the terminal widget, the owner's GW7); minor (D-77: the owner's look at the alerts pill, green "0", grey "warn", the sign and number larger); minor (D-103 in releases since v0.30.0 (PR #64 merged)); minor (D-103: the owner's look, "Deutlich besseres Ansprechverhalten", merged into main, in releases from the next one on); minor (D-103 added and built on the branch `fast-scroll`: Fyne's thread check, a build parameter, off in releases); patch (D-58: a log opened again under a name another pod or container instance holds now, the FLAKE row checked 2026-10-20: real, fixed, no line twice and a line where the log does not go on from its last line; the lead's decisions, open to revision; its index row); minor (D-73: H-118's residual, a connection that waits behind a run Cogpit stopped waiting for and could not end says so, with no end time, `runsOn` for agents; built, the lead's decisions, open to revision; its index row); minor (D-102 checked on a real cluster, 2026-10-19 night: Kyverno's refusal shown unchanged, the Target and the squares from the cache, `TestRealDebugContainer`); minor (D-102 added and built: debug containers, the owner's words of 2026-10-19 evening); minor (the owner's decisions on H-125 and H-126 of 2026-10-19 afternoon, built: a cluster's name and icon, the integrations question's steps and answer, and switching an integration on the user's alone; D-2's UI commands agents do not run, D-68, D-76 with the lead's details, D-80 with the lead's details, D-82; their index rows); minor (D-70: the name pills, the owner's WF42 and his pick of 2026-10-19 after Finder's label was measured); minor (the owner's walk findings WF31–WF45 of 2026-10-19 built but WF42: D-97 to D-101 added, D-58 S7, D-66, D-69, D-73, D-85 and D-94 changed; their index rows); minor (D-72: the owner's walk of 2026-10-19 observed a source picked in Downloads read again after a restart of Cogpit without a prompt and without a TCC grant; bookmark or the item's own grant not told apart; its index row); minor (D-96 added, the owner's mgmt-p finding and choice of 2026-10-18 evening: the service proxy's port by its number first, then its name; built; its index row); minor (D-88: the source row centred, the owner's correction of 2026-10-18 evening); minor (D-95 added, the owner's WF11 of 2026-10-17: the window comes back with its last size, place, display and full screen, whatever Restore the last session says, `window.json`; built with the lead's decisions, open to revision; D-41's note; its index row); minor (D-89 and D-90 added, the owner's WF23 and WF26 of 2026-10-18: a chart's series as one path with round joins at the screen's pixel size; a node's disks as a usage bar per real filesystem, the Nodes list's Disk the fullest; built with the lead's decisions, open to revision; D-43 points to D-90; their index rows); minor (D-91 added, the owner's WF30 of 2026-10-18 and his decisions: the Kubernetes version and upstream end of life from a table built into each release, an estimate beyond it, upstream's dates only; built with the lead's decisions, open to revision; H-130 opened; its index row); minor (D-92 added, the owner's WF29 of 2026-10-18: a gear in the navigator's cluster row; built; its index row); minor (D-87 and D-88 added, the owner's WF22, WF24, WF25 and WF28 of 2026-10-18: Cluster Settings' integrations under a divider, a section each, Metrics their consumer, the kubeconfig's path selectable; the metrics' source row with links to the settings only when needed; built with the lead's decisions, open to revision; D-76, D-77 and D-82 follow; their index rows); minor (D-93 and D-94 added, the owner's WF12, WF17, WF18, WF21 and WF27 of 2026-10-18: room in the data footer, between the toggles and in the back row; the empty dock's toggle opens a terminal (D-54 changed); alert names copy (D-25); built with the lead's decisions, open to revision; their index rows); minor (D-86 added, the owner's WF15 of 2026-10-18: an object's YAML in the Kubernetes order, built with the lead's decisions, open to revision; its index row); minor (D-85 added, the owner's WF13, WF14, WF16 and WF19 of 2026-10-18: dialogs as tables, an object's state without its resourceVersion, the CSV named by the cluster's short name; built with the lead's decisions, open to revision; its index row); minor (D-69 stage 1: no filter crosses a cluster switch, the owner's WF20 of 2026-10-18, fixed); minor (D-82 added, the owner's WF5 and WF4 of 2026-10-17: a pre-choice before any integration is looked for, nothing read before the question is answered, and Ask again; built the same evening with the lead's decisions, open to revision; D-76 changed; H-126 opened; its index row); minor (D-83 added, the owner's WF7 and WF6 of 2026-10-17: one hotbar without banks, a file of banks merged; the drag that carries the tile, R2's look replaced; A65 and A57 moot); minor (D-84 added, the owner's WF9 of 2026-10-17: undo and redo in the YAML editor, built with the lead's decisions, open to revision; its index row); minor (D-69 item 8: the welcome page's checkbox of Restore the last session, the owner's walk WF1); minor (D-81 added, the owner's F28 and F29 of 2026-10-17: Reconnect, a new connection from the kubeconfig file with the tabs kept; Log in again reconnects a login without a credential plugin or one changed in the file; a login renewed in the file picked up by itself once the old one is rejected; the cause of F28 verified; built with the lead's decisions, open to revision; D-58's Reconnect now replaced by Reconnect; its index row); minor (D-78 and D-79: Trivy's and Kyverno's reports read only while the cluster is the one shown, the lead's decision of 2026-10-17); minor (D-78 built: the Pods list's Image Rating and the reports read trimmed, the second phase, with the lead's decisions, open to revision; its index row); minor (D-80 added, the owner's F26 of 2026-10-17: a cluster's accent colour, the setting built, GUI-only, where the window uses it open; H-125 opened; its index row; D-25: copy icons by a cluster's name and kubeconfig path on Cluster Settings › General, the owner's F27); minor (D-79 added: Kyverno's policy violations on the objects, the owner's I7 of 2026-10-17 and his answer on Enforce; built with the lead's decisions, open to revision; its index row); minor (D-77 added, the owner's I4 and I5 of 2026-10-17: Alertmanager, the alerts pill by the worst active alert and its number every alert, the alert board; built the same day with the lead's decisions, open to revision; D-54's pill has its source; its index row); minor (D-76 added, the owner's words of 2026-10-17: integrations per cluster, Cluster Settings › Integrations, the question at a new cluster's first connect with the checkbox for the default, everything on by default; the Metrics source moved into the two metrics switches; built with the lead's decisions, open to revision; H-120 opened; its index row); minor (D-78 added, the owner's I6 of 2026-10-17: Trivy Operator's image ratings, the pod drawer's part built with the lead's decisions, open to revision, the Pods list's column not yet; its index row); minor (D-75: an expired client certificate reads "expired" alone in the window, the owner's of 2026-10-17); minor (D-75 added, the owner's F22 of 2026-10-17: a context's client certificate, the time left or "expired", in the navigator's section, on the welcome page and in the hotbar tile's tooltip, for agents in `cluster.contexts` and in `cogpit-cli contexts`; the dates only, never the key; a file in a place macOS protects read after a connect; never blocking a connect; built with the lead's decisions for the owner to confirm; H-119 opened; its index row); minor (D-74 added, the owner's choice of 2026-10-17: the lead decides details and records them, open to revision; every "for the owner to confirm" outside the change log reads "open to revision"); minor (D-73 added, the owner's finding of 2026-10-16 night: Disconnect, the window's Cancel Connecting, ends a connect under way and the credential plugin it waits for; every plugin run bounded by 5 minutes; `connection.waitingForLogin`; the connect's timeout no longer counts the login; built with the lead's decisions for the owner to confirm; D-58 points to it; H-118 opened; its index row); minor (D-72 added: native file panels and macOS folder access, the owner's order of 2026-10-16 night, built the same night with the lead's decisions for the owner to confirm; H-116 opened; its index row); minor (D-39, night run 2026-10-16/17: the namespace-limited user's Pods history by the plan's namespaces not built, A47 standing; the lead's decision and the owner's question); minor (D-71 added, night run 2026-10-16/17: Thanos and VictoriaMetrics found by their Services' names after a Prometheus by its own names and named so, vmselect under the default tenant; the lead's decisions for the owner to confirm, built, checked against a real Thanos and VictoriaMetrics on kind; its index row); minor (D-54: the bar's right end reordered, the toggles at the very right after the bell and a divider, close together, and an alerts pill without a source, the owner's of 2026-10-16 night, built); minor (D-55: a key removed through the Edit tab destructive for every origin, built 2026-10-16 night, the "What it does not cover" bullet closed with the lead's decisions on it; the index row); minor (D-57: the welcome page without its "Connect to Cluster…" button built 2026-10-16 night (N122), the workspace's kept; verified the same night that the navigator shows the section wherever the workspace's button shows, but for a navigator ⌘B hid; the index row); minor (D-4: a check for updates at every start while the automatic checks are on, the owner's of 2026-10-16 night, built); minor (D-55 and D-57: the owner's answers of 2026-10-16 evening, asked one at a time after the audit: a key removed through the Edit tab is destructive for every origin (`object.apply` escalating as for a scale to zero), the welcome page without its "Connect to Cluster…" button and the workspace's kept; both not built yet; their index rows); minor (D-4: the appcast's deploy lets a newer release win over an older item its draft never saw, the owner's correction of F18 after v0.19.0's refused deploy, 2026-10-16); minor (D-58: the selection bar's greyed Delete names the engine's reason in its tooltip, "Delete — connection interrupted", the owner's audit decision of 2026-10-16 (c), built the same day with the build's choices for the owner to confirm; its index row); minor (D-59: the copy icon over a Secret's editor, the owner's audit decision of 2026-10-16 (c), built the same day, every copy through the clipboard rule for Secret values; D-25 says so; their index rows); minor (D-55 and D-59: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16 (N152), built the same day with the lead's decisions for the owner to confirm; a save that removes a key destructive, the review its confirmation; their index rows); minor (D-10 (6): a chat connection's CA file replaces the system's roots for that connection, as kubectl's certificate-authority, the owner's decision in the audit of 2026-10-16, N141, built the same day); minor (D-57: every cluster and kubeconfig command under the menu path `Cluster/`, the inconsistency it noted resolved, the owner's decision in the audit of 2026-10-16, N121); minor (the owner's audit of the night decisions of 2026-10-15/16 (2026-10-16 afternoon): the lead's decisions in D-10, D-11, D-15, D-43, D-55, D-57, D-58, D-59, D-62, D-63, D-64 and D-65 confirmed as built where he chose the built option, the rows the audit did not ask left open; changed by him and not built yet: the copy from a Secret's editor, D-59, and the selection bar's greyed Delete, D-58; to be changed, how not said yet: the welcome page's button, D-57; his four other changes (the checked rows after `ui.navigate`, the Cluster menu's paths, D-10's CA file, D-59's keys) left to the changes that build them; their index rows, the stale duplicate rows of D-43, D-62 and D-63 removed); minor (D-61 withdrawn by the owner 2026-10-16 and removed: Cogpit installs nothing into a cluster for its own features; the stack, its commands and N183 to N192 gone, H-105 closed, the reading improvements kept; its index row); minor (D-69 stage 3 built 2026-10-16, the two settings: a cluster that is not shown holds its credential plugin while its setting "Renew the login while the cluster is not shown" is off, its login then lapsing (`loginLapsed`, not red) until it is shown or logged in again; Preferences › App › Restore the last session, off by default, connecting the clusters of the last quit at start, the shown one first; D-41 and D-42 changed by the owner's decision of 2026-10-16, D-58's background renewal; the lead's decisions for the owner to confirm); minor (D-69 stage 2 built 2026-10-16, the window: switching without reconnecting at every entry point, the marks of item 5 on every dot, each cluster blinking for itself, the dock per cluster as engine state, Disconnect per cluster in its menus, Diagnostics per cluster, a failed connect shows the cluster shown before again, `ConnectedCluster.LoginLapsed` for stage 3; the lead's decisions for the owner to confirm; its index row); minor (D-69 stage 1 built 2026-10-16, the engine: a pool of backends by context, one shown, `cluster.connect` of a connected context only shows it, the left cluster's views warm for 5 minutes and then cold, `cluster.disconnect {context?}`, every command on its own cluster (a reference's, a dock tab's, an optional `context`), the connection watch and the write gate per cluster, `UIState.Connections`; the lead's decisions for the owner to confirm; its index row); minor (D-69 added: several clusters connected at once, the owner's interview of 2026-10-16, not built); minor (D-58 S3: the light Running green #177f4a, the owner's decision 2026-10-16, 3.1:1 on a selected row); minor (D-68, the owner's F17 of 2026-10-16: one short name for a cluster everywhere, the part after the last "@"; the user Cogpit is logged in as in the navigator's root row from a SelfSubjectReview at every connect, the kubeconfig fallback marked, the last known user while not connected, the groups in a tooltip; agents read the username and the groups in `ui_state`; built, the lead's decisions for the owner to confirm; its index row); minor (D-70 added: the disk image's window, the owner's visual review and pipeline choice of 2026-10-16, built); minor (D-66: the connection log, decided by the owner 2026-10-16 and built, the lead's choices for the owner to confirm, H-112 opened, its index row); minor (D-58's S3 amended by the owner, F13 2026-10-16: the connection as a dot, never a word, Connected in the Running green, blinking while (re)connecting with a 3 s minimum, a click opening the connection log, D-66; the lead's decisions for the owner to confirm; D-22 and D-23 follow; its index row); minor (D-67: the demo cluster compiled out of releases by the tag `nodemo`, the owner's decision of 2026-10-16, built); minor (D-4: the appcast's deploy refuses a feed that drops a served item, F18, owner 2026-10-16); minor (F11, owner 2026-10-16: D-4's scheduled update check every hour instead of Sparkle's day; D-54's Update button names the version, "Update to v0.16.0", and says "Update" where the bar has no room for it; its index rows); minor (D-4: the first update through the feed, 2026-10-16); minor (D-36 checked against a live Argo CD 3.5.5 controller on a real cluster, 2026-10-16: the sync windows' check, the project's namespace and the operation's source brought to Argo CD's, the lead's decisions for the owner to confirm; its index row); minor (D-63: Drain built as a background job 2026-10-16, night run: a step per pod with the PodDisruptionBudget's wait, Cancel, a stopped drain kept in the journal as `stopped` and offered as after a crash, an MCP client that gives up no longer stops it; the lead's decisions for the owner to confirm; D-11 and D-58 follow, H-111 opened, its index row); minor (D-65 discovery cached on disk: the lead's decisions of the night run of 2026-10-16 for the owner to confirm, built, measured on a real cluster, its index row; D-13 says the answer holds no object); minor (D-62: checks against a real cluster, the lead's decisions for the owner to confirm, 2026-10-16); minor (D-15: the scorecard built 2026-10-16 in the night run, `make scorecard` and docs/parity/scorecard.md, the lead's choices for the owner to confirm; its index row); minor (D-64: envtest, a real API server in CI without Docker, built 2026-10-16 in the night run with the lead's decisions for the owner to confirm: controller-runtime's envtest v0.25.2, the binaries pinned by SHA-512, SIGSTOP of the API server for D-58's standby case, a job of its own); minor (D-64: envtest, a real API server in CI without Docker, built 2026-10-16 in the night run with the lead's decisions for the owner to confirm: controller-runtime's envtest v0.25.2, the binaries pinned by SHA-512, SIGSTOP of the API server for D-58's standby case, a job of its own); minor (D-61: Cogpit Metrics, the bundled metrics stack of Lens Metrics, the lead's decision for the owner to confirm, built and tried on kind and a real cluster; D-43: a node's network and filesystem from node-exporter, the lead's choices for the owner to confirm); minor (D-63 built 2026-10-16, night run: long commands as background jobs, an action on a selection of more than ten objects with progress in the dock and Cancel for every origin, the lead's decisions for the owner to confirm, with its index row); minor (D-58 standby and lost connections: the owner's decisions S1–S8 of 2026-10-15 evening, the lead's defaults, built 2026-10-15/16 with the build's decisions for the owner to confirm, its index row); minor (D-15: parity-checklist.md generated by hack/parity, built 2026-10-16); minor (D-59: a Secret's values edited in the drawer, the window's only, decided by the owner 2026-10-15 and built the same night; D-55: the owner's audit answers for a Config Map's drawer built); minor (D-55: the owner's audit answers of 2026-10-15 for a Config Map's drawer built: Save rebases by itself when no edited key changed, unsaved values kept as disk drafts; a Secret's values in the drawer decided); minor (D-57: an insecure context's warning icon on its section row; the selection bar in the item count's place); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the warning for `http://` to another machine and a CA file per connection, item 10 revised; F9, a sent message edited and sent again, H-100; the index row); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the warning for `http://` to another machine and a CA file per connection, item 10 revised; the index row); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the index row); minor (D-57 built: choosing a cluster in the navigator's section only, the context picker, "Switch context" and the scope dropdown gone; D-42, D-47 and D-51 follow); minor (D-9: verifying the credential plugins against EKS, GKE and AKS out of scope until long after parity, the owner's decision of 2026-10-15, with its index row; the index brought to the code: D-10 built (M12), the missing rows of D-14 to D-32 added; D-1: S7's re-check half done since CI; D-2: the round's answers built, the token kept in the configuration directory; D-4: Sparkle no longer "not built"; D-44: the built-in agent built; D-48: the releases' Developer ID signature; D-16: the bundled `cogpit-cli` in signed releases since v0.7.0, a quarantined copy not tried; the round's intro says what the night run built); minor (D-4: Sparkle's update key set up by the owner on 2026-10-15, in v0.11.0 to v0.13.0, no signed appcast yet; A10 decided further, the App the tag ruleset's only bypass, the settings not made; confirmed by the owner on 2026-10-15: D-47 as a whole, D-10 item 12's repaired key file and no keychain migration, D-51's ↵ on an agent's palette text; D-51's dropdown bank moot; the index rows of D-2, D-33, D-34, D-36, D-41 and D-44 no longer say "not built", checked against the code); minor (D-24 revised: the glowing C helm as the logo everywhere, every earlier version kept and drawable) +> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (D-99: AW14 built, Follow switched by scrolling, the owner's spec verbatim, the lead's details, open to revision; D-114's status and AW14; their index rows); minor (D-106: AW11 built, a deleted namespace the filter names read on the namespaces' own changes, `EventNamespaces`, not on the view's rows; the lead's decisions, open to revision; its index row); minor (D-106: AW10 built 2026-10-22, ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab where the keyboard works in the dock, `dock` on `ui.tab.moveLeft` and `ui.tab.moveRight`, read with D-115: the focus first, the click's memory for a dock tab that takes no keys; D-54: AW9 built 2026-10-22, a command that shows a dock tab open already, the active one too, opens the dock; D-85, D-114: AW7 built 2026-10-22, a dialog's Context row draws the source label in the kind word's grey, the lead's details in D-85; their index rows); minor (D-25: the owner's decision of 2026-10-22, his words verbatim, a masked Secret value copied without showing it, reversing "copyable only once revealed", built with the lead's details, open to revision, a revealed value Show cut copied whole by its icon among them; its index row; D-59's masked value); minor (D-97: the owner's AW15 and AW16 of 2026-10-22 built, a cancelled connect and one left in the background raise no toast on any path, typed outcomes, what agents get back, a second connect of the same cluster joins the window's wait; D-66's Levels row; the lead's decisions, open to revision; its index row); minor (D-114: AW17 and AW13 built, AW18 fixed with them: a failed connect's error page in the welcome page's look with the connect's stages, measured on client-go's own first request, also in Connection Updates, the error line its cause; the welcome page without "Other clusters"; the lead's details, open to revision; D-97, D-66 and D-57 follow; its index row); patch (D-106: the window's other held clicks, the welcome page's cluster rows built: a click connects at its release, a second one while the connect is under way connects nothing more; the sync picker's rows and the log tab's head row left held, with why; the lead's decision, open to revision); patch (D-106: GW1's click below the rows not held by Fyne's double tap, the owner's AW12, its cause verified; the table counts the header separators' double click itself; the lead's decision, open to revision); minor (D-116 added and built, the owner's alpha walk AW3, AW4 and AW19: Escape closes the innermost thing, a dialog as its Cancel with the drawer untouched, a search and the find bar end; D-104: the dropdown's outline and its Escape, AW1 and AW2; D-57: its "any other search" was the navigator's; the lead's decisions, open to revision; their index rows); minor (D-115 added and built on the branch `fix/dock-tab-focus`: a dock tab the user opens or shows from the window takes the keys, an agent's leaves them, the find bar's first ⌘F repaints and focuses its field; the owner's AW5, AW6 and AW8 of 2026-10-22, the lead's decisions, open to revision; D-106's GW3 follows; its index row); minor (D-9: the owner's decision of 2026-10-22, the cloud providers' credential plugins and cloud account integrations not a target, won't build, his words verbatim; the 2026-10-15 decision kept as history; its index row); minor (D-114 added: the owner's decisions in his alpha walk of 2026-10-22, not built: a failed connect's page and its stages, the Context label grey, the welcome page without Other clusters, Follow by scrolling; its index row); trivial (D-113: D-new numbered at the merge of PR #69, the owner's merge of 2026-10-22); minor (D-113 added and built in PR #69: image grades S to E and N/A, drawn as shields, from Trivy Operator's reports, the owner's rules and his pick in the Image Rating Lab of 2026-10-22; D-78's severity word, its colours and its drawer section replaced; the lead's details, open to revision; its index row); minor (D-58: a view not read before the interruption or the expiry says so, without the item count, "syncing…" and the download; the namespaces of the cluster shown before dropped at a switch, D-69's WF20 row; the owner's finding of 2026-10-22, the lead's decisions, open to revision; its index row); minor (D-4: A10 made, the tag ruleset and `release`'s admin bypass off, 2026-10-22); minor (D-4: the appcast jobs in `sparkle` sign without the owner's approval since 2026-10-22, H-141); trivial (D-14: the upstream pull requests' state, #155 to #157 merged, #158's requested changes pushed, waiting for review); minor (D-112: the font cache's row decided by the owner, reported upstream as fyne#6619 with the fix in PR fyne#6620; its index row); minor (D-112 added and built on the branch `ci-speed`: CI and test time at the same coverage, the lead's decisions, open to revision; its index row); minor (D-1, D-3, D-7, D-14, D-26, D-47, D-65, D-73 and D-95 brought to D-111's build: S7 and S5 on Windows, kubectl first and Enforce kubectl on Windows, the tests on Windows, ConPTY through x/sys, the program PATHEXT runs, no `cogpit://` scheme from the setup; D-1's index row); minor (D-111 added and built on the branch `windows-release`: Cogpit for Windows, an NSIS setup per user and WinSparkle with the update key Sparkle's feed is signed with, the first releases without Authenticode, the Update button installing with one click, the owner's answers of 2026-10-21; the lead's details; D-4, D-7, D-16 and D-109 follow; its index row); minor (D-99: the agent's column selectable block by block, the owner's choice; D-110: the warning column a fixed width); patch (D-110: the owner's first look at v0.35.0 built: the welcome page's grid floor at every scroll, the header's column dividers, the agent input's cursor); minor (D-109 added and built: on Windows and Linux the menus in the top bar, under the system's title bar); minor (D-110 added: Dark Cockpit, the owner's design language of 2026-10-21; D-22 replaced in the window; D-54: a light and dark toggle left of the bell); minor (D-54: the title bar names no cluster, neither its dot, its name nor its kubeconfig file, the owner's request of 2026-10-21; the status bar and the navigator name it; the lead's decisions, open to revision; D-57, D-58, D-66, D-68 and D-69 follow); minor (D-49: the external MCP server is opt-in, the owner's security posture of 2026-10-21: off on a new installation and for `cogpit-cli mcp` until the user switches it on, a stored "on" or an explicit old preference kept, the agent's note reworded; built with the lead's decisions, open to revision; D-2, D-23, D-48 and their index rows follow); minor (D-108 added and built: Cogpit for Linux, a .deb for amd64 and arm64 and Cogpit's signed APT repository on GitHub Pages, the app updating through apt; D-4, D-7 and D-16 follow); patch (D-77: the alerts pill 5 points wider at each end, the owner's look of 2026-10-20); minor (D-107 added and built: the navigator slides into a cluster, back and between clusters, Preferences › App › Reduce motion, the owner's requests of 2026-10-20; the lead's decisions, open to revision; its index row); minor (D-69: no tab of a cluster without a connection, the owner's GW13); minor (D-69: the tab bar shows the shown cluster's tabs at the section too, the restore's other clusters' tabs hidden, and the preference mixed environments at the foot of All Clusters, the owner's GW11; D-106's place rule with it); minor (D-106: GW4 built, tabs moved by dragging and by Move Tab Left and Right); minor (D-106: GW9 built, a deleted namespace red in the namespace filter, every namespace read); minor (D-106: GW3 built, ⌘F in the dock's editor tabs); minor (D-106 added: the gate walk's GW1 built, a click below a list's rows closes the drawer); minor (D-104: GW5 built, every dropdown a `selectField` that opens over its field, the current entry checked at its place; the lead's decisions, open to revision; its index row); minor (D-104 added, the owner's GW2, GW5 and GW6 of the gate walk of 2026-10-20, GW2 and GW6 built: hints behind a "?", fields sized to their values, Scale's slider, titles without the gap after the arrow; the lead's decisions, open to revision; its index row); patch (D-105: Ctrl with a named key sends xterm's sequence, found on the way); minor (D-105: the owner's GW8, a key's modifiers from its own event in the terminal widget, its cause verified); minor (D-105 added and built: reverse video a state of the terminal widget, the owner's GW7); minor (D-77: the owner's look at the alerts pill, green "0", grey "warn", the sign and number larger); minor (D-103 in releases since v0.30.0 (PR #64 merged)); minor (D-103: the owner's look, "Deutlich besseres Ansprechverhalten", merged into main, in releases from the next one on); minor (D-103 added and built on the branch `fast-scroll`: Fyne's thread check, a build parameter, off in releases); patch (D-58: a log opened again under a name another pod or container instance holds now, the FLAKE row checked 2026-10-20: real, fixed, no line twice and a line where the log does not go on from its last line; the lead's decisions, open to revision; its index row); minor (D-73: H-118's residual, a connection that waits behind a run Cogpit stopped waiting for and could not end says so, with no end time, `runsOn` for agents; built, the lead's decisions, open to revision; its index row); minor (D-102 checked on a real cluster, 2026-10-19 night: Kyverno's refusal shown unchanged, the Target and the squares from the cache, `TestRealDebugContainer`); minor (D-102 added and built: debug containers, the owner's words of 2026-10-19 evening); minor (the owner's decisions on H-125 and H-126 of 2026-10-19 afternoon, built: a cluster's name and icon, the integrations question's steps and answer, and switching an integration on the user's alone; D-2's UI commands agents do not run, D-68, D-76 with the lead's details, D-80 with the lead's details, D-82; their index rows); minor (D-70: the name pills, the owner's WF42 and his pick of 2026-10-19 after Finder's label was measured); minor (the owner's walk findings WF31–WF45 of 2026-10-19 built but WF42: D-97 to D-101 added, D-58 S7, D-66, D-69, D-73, D-85 and D-94 changed; their index rows); minor (D-72: the owner's walk of 2026-10-19 observed a source picked in Downloads read again after a restart of Cogpit without a prompt and without a TCC grant; bookmark or the item's own grant not told apart; its index row); minor (D-96 added, the owner's mgmt-p finding and choice of 2026-10-18 evening: the service proxy's port by its number first, then its name; built; its index row); minor (D-88: the source row centred, the owner's correction of 2026-10-18 evening); minor (D-95 added, the owner's WF11 of 2026-10-17: the window comes back with its last size, place, display and full screen, whatever Restore the last session says, `window.json`; built with the lead's decisions, open to revision; D-41's note; its index row); minor (D-89 and D-90 added, the owner's WF23 and WF26 of 2026-10-18: a chart's series as one path with round joins at the screen's pixel size; a node's disks as a usage bar per real filesystem, the Nodes list's Disk the fullest; built with the lead's decisions, open to revision; D-43 points to D-90; their index rows); minor (D-91 added, the owner's WF30 of 2026-10-18 and his decisions: the Kubernetes version and upstream end of life from a table built into each release, an estimate beyond it, upstream's dates only; built with the lead's decisions, open to revision; H-130 opened; its index row); minor (D-92 added, the owner's WF29 of 2026-10-18: a gear in the navigator's cluster row; built; its index row); minor (D-87 and D-88 added, the owner's WF22, WF24, WF25 and WF28 of 2026-10-18: Cluster Settings' integrations under a divider, a section each, Metrics their consumer, the kubeconfig's path selectable; the metrics' source row with links to the settings only when needed; built with the lead's decisions, open to revision; D-76, D-77 and D-82 follow; their index rows); minor (D-93 and D-94 added, the owner's WF12, WF17, WF18, WF21 and WF27 of 2026-10-18: room in the data footer, between the toggles and in the back row; the empty dock's toggle opens a terminal (D-54 changed); alert names copy (D-25); built with the lead's decisions, open to revision; their index rows); minor (D-86 added, the owner's WF15 of 2026-10-18: an object's YAML in the Kubernetes order, built with the lead's decisions, open to revision; its index row); minor (D-85 added, the owner's WF13, WF14, WF16 and WF19 of 2026-10-18: dialogs as tables, an object's state without its resourceVersion, the CSV named by the cluster's short name; built with the lead's decisions, open to revision; its index row); minor (D-69 stage 1: no filter crosses a cluster switch, the owner's WF20 of 2026-10-18, fixed); minor (D-82 added, the owner's WF5 and WF4 of 2026-10-17: a pre-choice before any integration is looked for, nothing read before the question is answered, and Ask again; built the same evening with the lead's decisions, open to revision; D-76 changed; H-126 opened; its index row); minor (D-83 added, the owner's WF7 and WF6 of 2026-10-17: one hotbar without banks, a file of banks merged; the drag that carries the tile, R2's look replaced; A65 and A57 moot); minor (D-84 added, the owner's WF9 of 2026-10-17: undo and redo in the YAML editor, built with the lead's decisions, open to revision; its index row); minor (D-69 item 8: the welcome page's checkbox of Restore the last session, the owner's walk WF1); minor (D-81 added, the owner's F28 and F29 of 2026-10-17: Reconnect, a new connection from the kubeconfig file with the tabs kept; Log in again reconnects a login without a credential plugin or one changed in the file; a login renewed in the file picked up by itself once the old one is rejected; the cause of F28 verified; built with the lead's decisions, open to revision; D-58's Reconnect now replaced by Reconnect; its index row); minor (D-78 and D-79: Trivy's and Kyverno's reports read only while the cluster is the one shown, the lead's decision of 2026-10-17); minor (D-78 built: the Pods list's Image Rating and the reports read trimmed, the second phase, with the lead's decisions, open to revision; its index row); minor (D-80 added, the owner's F26 of 2026-10-17: a cluster's accent colour, the setting built, GUI-only, where the window uses it open; H-125 opened; its index row; D-25: copy icons by a cluster's name and kubeconfig path on Cluster Settings › General, the owner's F27); minor (D-79 added: Kyverno's policy violations on the objects, the owner's I7 of 2026-10-17 and his answer on Enforce; built with the lead's decisions, open to revision; its index row); minor (D-77 added, the owner's I4 and I5 of 2026-10-17: Alertmanager, the alerts pill by the worst active alert and its number every alert, the alert board; built the same day with the lead's decisions, open to revision; D-54's pill has its source; its index row); minor (D-76 added, the owner's words of 2026-10-17: integrations per cluster, Cluster Settings › Integrations, the question at a new cluster's first connect with the checkbox for the default, everything on by default; the Metrics source moved into the two metrics switches; built with the lead's decisions, open to revision; H-120 opened; its index row); minor (D-78 added, the owner's I6 of 2026-10-17: Trivy Operator's image ratings, the pod drawer's part built with the lead's decisions, open to revision, the Pods list's column not yet; its index row); minor (D-75: an expired client certificate reads "expired" alone in the window, the owner's of 2026-10-17); minor (D-75 added, the owner's F22 of 2026-10-17: a context's client certificate, the time left or "expired", in the navigator's section, on the welcome page and in the hotbar tile's tooltip, for agents in `cluster.contexts` and in `cogpit-cli contexts`; the dates only, never the key; a file in a place macOS protects read after a connect; never blocking a connect; built with the lead's decisions for the owner to confirm; H-119 opened; its index row); minor (D-74 added, the owner's choice of 2026-10-17: the lead decides details and records them, open to revision; every "for the owner to confirm" outside the change log reads "open to revision"); minor (D-73 added, the owner's finding of 2026-10-16 night: Disconnect, the window's Cancel Connecting, ends a connect under way and the credential plugin it waits for; every plugin run bounded by 5 minutes; `connection.waitingForLogin`; the connect's timeout no longer counts the login; built with the lead's decisions for the owner to confirm; D-58 points to it; H-118 opened; its index row); minor (D-72 added: native file panels and macOS folder access, the owner's order of 2026-10-16 night, built the same night with the lead's decisions for the owner to confirm; H-116 opened; its index row); minor (D-39, night run 2026-10-16/17: the namespace-limited user's Pods history by the plan's namespaces not built, A47 standing; the lead's decision and the owner's question); minor (D-71 added, night run 2026-10-16/17: Thanos and VictoriaMetrics found by their Services' names after a Prometheus by its own names and named so, vmselect under the default tenant; the lead's decisions for the owner to confirm, built, checked against a real Thanos and VictoriaMetrics on kind; its index row); minor (D-54: the bar's right end reordered, the toggles at the very right after the bell and a divider, close together, and an alerts pill without a source, the owner's of 2026-10-16 night, built); minor (D-55: a key removed through the Edit tab destructive for every origin, built 2026-10-16 night, the "What it does not cover" bullet closed with the lead's decisions on it; the index row); minor (D-57: the welcome page without its "Connect to Cluster…" button built 2026-10-16 night (N122), the workspace's kept; verified the same night that the navigator shows the section wherever the workspace's button shows, but for a navigator ⌘B hid; the index row); minor (D-4: a check for updates at every start while the automatic checks are on, the owner's of 2026-10-16 night, built); minor (D-55 and D-57: the owner's answers of 2026-10-16 evening, asked one at a time after the audit: a key removed through the Edit tab is destructive for every origin (`object.apply` escalating as for a scale to zero), the welcome page without its "Connect to Cluster…" button and the workspace's kept; both not built yet; their index rows); minor (D-4: the appcast's deploy lets a newer release win over an older item its draft never saw, the owner's correction of F18 after v0.19.0's refused deploy, 2026-10-16); minor (D-58: the selection bar's greyed Delete names the engine's reason in its tooltip, "Delete — connection interrupted", the owner's audit decision of 2026-10-16 (c), built the same day with the build's choices for the owner to confirm; its index row); minor (D-59: the copy icon over a Secret's editor, the owner's audit decision of 2026-10-16 (c), built the same day, every copy through the clipboard rule for Secret values; D-25 says so; their index rows); minor (D-55 and D-59: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16 (N152), built the same day with the lead's decisions for the owner to confirm; a save that removes a key destructive, the review its confirmation; their index rows); minor (D-10 (6): a chat connection's CA file replaces the system's roots for that connection, as kubectl's certificate-authority, the owner's decision in the audit of 2026-10-16, N141, built the same day); minor (D-57: every cluster and kubeconfig command under the menu path `Cluster/`, the inconsistency it noted resolved, the owner's decision in the audit of 2026-10-16, N121); minor (the owner's audit of the night decisions of 2026-10-15/16 (2026-10-16 afternoon): the lead's decisions in D-10, D-11, D-15, D-43, D-55, D-57, D-58, D-59, D-62, D-63, D-64 and D-65 confirmed as built where he chose the built option, the rows the audit did not ask left open; changed by him and not built yet: the copy from a Secret's editor, D-59, and the selection bar's greyed Delete, D-58; to be changed, how not said yet: the welcome page's button, D-57; his four other changes (the checked rows after `ui.navigate`, the Cluster menu's paths, D-10's CA file, D-59's keys) left to the changes that build them; their index rows, the stale duplicate rows of D-43, D-62 and D-63 removed); minor (D-61 withdrawn by the owner 2026-10-16 and removed: Cogpit installs nothing into a cluster for its own features; the stack, its commands and N183 to N192 gone, H-105 closed, the reading improvements kept; its index row); minor (D-69 stage 3 built 2026-10-16, the two settings: a cluster that is not shown holds its credential plugin while its setting "Renew the login while the cluster is not shown" is off, its login then lapsing (`loginLapsed`, not red) until it is shown or logged in again; Preferences › App › Restore the last session, off by default, connecting the clusters of the last quit at start, the shown one first; D-41 and D-42 changed by the owner's decision of 2026-10-16, D-58's background renewal; the lead's decisions for the owner to confirm); minor (D-69 stage 2 built 2026-10-16, the window: switching without reconnecting at every entry point, the marks of item 5 on every dot, each cluster blinking for itself, the dock per cluster as engine state, Disconnect per cluster in its menus, Diagnostics per cluster, a failed connect shows the cluster shown before again, `ConnectedCluster.LoginLapsed` for stage 3; the lead's decisions for the owner to confirm; its index row); minor (D-69 stage 1 built 2026-10-16, the engine: a pool of backends by context, one shown, `cluster.connect` of a connected context only shows it, the left cluster's views warm for 5 minutes and then cold, `cluster.disconnect {context?}`, every command on its own cluster (a reference's, a dock tab's, an optional `context`), the connection watch and the write gate per cluster, `UIState.Connections`; the lead's decisions for the owner to confirm; its index row); minor (D-69 added: several clusters connected at once, the owner's interview of 2026-10-16, not built); minor (D-58 S3: the light Running green #177f4a, the owner's decision 2026-10-16, 3.1:1 on a selected row); minor (D-68, the owner's F17 of 2026-10-16: one short name for a cluster everywhere, the part after the last "@"; the user Cogpit is logged in as in the navigator's root row from a SelfSubjectReview at every connect, the kubeconfig fallback marked, the last known user while not connected, the groups in a tooltip; agents read the username and the groups in `ui_state`; built, the lead's decisions for the owner to confirm; its index row); minor (D-70 added: the disk image's window, the owner's visual review and pipeline choice of 2026-10-16, built); minor (D-66: the connection log, decided by the owner 2026-10-16 and built, the lead's choices for the owner to confirm, H-112 opened, its index row); minor (D-58's S3 amended by the owner, F13 2026-10-16: the connection as a dot, never a word, Connected in the Running green, blinking while (re)connecting with a 3 s minimum, a click opening the connection log, D-66; the lead's decisions for the owner to confirm; D-22 and D-23 follow; its index row); minor (D-67: the demo cluster compiled out of releases by the tag `nodemo`, the owner's decision of 2026-10-16, built); minor (D-4: the appcast's deploy refuses a feed that drops a served item, F18, owner 2026-10-16); minor (F11, owner 2026-10-16: D-4's scheduled update check every hour instead of Sparkle's day; D-54's Update button names the version, "Update to v0.16.0", and says "Update" where the bar has no room for it; its index rows); minor (D-4: the first update through the feed, 2026-10-16); minor (D-36 checked against a live Argo CD 3.5.5 controller on a real cluster, 2026-10-16: the sync windows' check, the project's namespace and the operation's source brought to Argo CD's, the lead's decisions for the owner to confirm; its index row); minor (D-63: Drain built as a background job 2026-10-16, night run: a step per pod with the PodDisruptionBudget's wait, Cancel, a stopped drain kept in the journal as `stopped` and offered as after a crash, an MCP client that gives up no longer stops it; the lead's decisions for the owner to confirm; D-11 and D-58 follow, H-111 opened, its index row); minor (D-65 discovery cached on disk: the lead's decisions of the night run of 2026-10-16 for the owner to confirm, built, measured on a real cluster, its index row; D-13 says the answer holds no object); minor (D-62: checks against a real cluster, the lead's decisions for the owner to confirm, 2026-10-16); minor (D-15: the scorecard built 2026-10-16 in the night run, `make scorecard` and docs/parity/scorecard.md, the lead's choices for the owner to confirm; its index row); minor (D-64: envtest, a real API server in CI without Docker, built 2026-10-16 in the night run with the lead's decisions for the owner to confirm: controller-runtime's envtest v0.25.2, the binaries pinned by SHA-512, SIGSTOP of the API server for D-58's standby case, a job of its own); minor (D-64: envtest, a real API server in CI without Docker, built 2026-10-16 in the night run with the lead's decisions for the owner to confirm: controller-runtime's envtest v0.25.2, the binaries pinned by SHA-512, SIGSTOP of the API server for D-58's standby case, a job of its own); minor (D-61: Cogpit Metrics, the bundled metrics stack of Lens Metrics, the lead's decision for the owner to confirm, built and tried on kind and a real cluster; D-43: a node's network and filesystem from node-exporter, the lead's choices for the owner to confirm); minor (D-63 built 2026-10-16, night run: long commands as background jobs, an action on a selection of more than ten objects with progress in the dock and Cancel for every origin, the lead's decisions for the owner to confirm, with its index row); minor (D-58 standby and lost connections: the owner's decisions S1–S8 of 2026-10-15 evening, the lead's defaults, built 2026-10-15/16 with the build's decisions for the owner to confirm, its index row); minor (D-15: parity-checklist.md generated by hack/parity, built 2026-10-16); minor (D-59: a Secret's values edited in the drawer, the window's only, decided by the owner 2026-10-15 and built the same night; D-55: the owner's audit answers for a Config Map's drawer built); minor (D-55: the owner's audit answers of 2026-10-15 for a Config Map's drawer built: Save rebases by itself when no edited key changed, unsaved values kept as disk drafts; a Secret's values in the drawer decided); minor (D-57: an insecure context's warning icon on its section row; the selection bar in the item count's place); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the warning for `http://` to another machine and a CA file per connection, item 10 revised; F9, a sent message edited and sent again, H-100; the index row); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the warning for `http://` to another machine and a CA file per connection, item 10 revised; the index row); minor (D-10: the owner's audit answers of 2026-10-15 for the chat recorded and built in the night run: send all tools per connection; the index row); minor (D-57 built: choosing a cluster in the navigator's section only, the context picker, "Switch context" and the scope dropdown gone; D-42, D-47 and D-51 follow); minor (D-9: verifying the credential plugins against EKS, GKE and AKS out of scope until long after parity, the owner's decision of 2026-10-15, with its index row; the index brought to the code: D-10 built (M12), the missing rows of D-14 to D-32 added; D-1: S7's re-check half done since CI; D-2: the round's answers built, the token kept in the configuration directory; D-4: Sparkle no longer "not built"; D-44: the built-in agent built; D-48: the releases' Developer ID signature; D-16: the bundled `cogpit-cli` in signed releases since v0.7.0, a quarantined copy not tried; the round's intro says what the night run built); minor (D-4: Sparkle's update key set up by the owner on 2026-10-15, in v0.11.0 to v0.13.0, no signed appcast yet; A10 decided further, the App the tag ruleset's only bypass, the settings not made; confirmed by the owner on 2026-10-15: D-47 as a whole, D-10 item 12's repaired key file and no keychain migration, D-51's ↵ on an agent's palette text; D-51's dropdown bank moot; the index rows of D-2, D-33, D-34, D-36, D-41 and D-44 no longer say "not built", checked against the code); minor (D-24 revised: the glowing C helm as the logo everywhere, every earlier version kept and drawable) Decisions that shape the code, each with its options, the reasons, and its status. A decision moves from **open** to **decided** only by the owner; a recommendation is a proposal, not an @@ -37,7 +37,7 @@ projects' repositories; re-check them before relying on a version number. | [D-22](#d-22-colour-theme) | Colour theme | decided (owner, 2026-10-12): Solarized Dark and Light after VS Code's themes; built 2026-10-12; 2026-10-14 evening: Sync with computer the default (A94, built 2026-10-14), a free cluster colour (A93, built 2026-10-15); the window's palettes replaced by Dark Cockpit's on 2026-10-21 ([D-110](#d-110-dark-cockpit-cogpits-design-language)); the terminal's sixteen colours stay Solarized's | | [D-23](#d-23-a-link-to-the-owner-in-the-status-bar) | A link to the owner in the status bar | decided (owner, 2026-10-12); built 2026-10-12 | | [D-24](#d-24-logo) | Logo | decided (owner, 2026-10-12): the C helm; built 2026-10-12; revised (owner, 2026-10-15): the glowing C helm everywhere, every version kept drawable; built 2026-10-15 | -| [D-25](#d-25-copying-values) | Copying values | decided (owner, 2026-10-12); built 2026-10-12 and 2026-10-13; 2026-10-14 evening: the copy icon over a value's end in the lists and the drawer (A69, A71), built 2026-10-15; 2026-10-16: a copy icon over a Secret's editor in the drawer (D-59), built; 2026-10-17: copy icons by a cluster's name and kubeconfig path on Cluster Settings › General (the owner's F27), built with the lead's decisions, open to revision | +| [D-25](#d-25-copying-values) | Copying values | decided (owner, 2026-10-12); built 2026-10-12 and 2026-10-13; 2026-10-14 evening: the copy icon over a value's end in the lists and the drawer (A69, A71), built 2026-10-15; 2026-10-16: a copy icon over a Secret's editor in the drawer (D-59), built; 2026-10-17: copy icons by a cluster's name and kubeconfig path on Cluster Settings › General (the owner's F27), built with the lead's decisions, open to revision; 2026-10-22: a masked Secret value copied without showing it (the owner's decision, reversing "copyable only once revealed"), built with the lead's details, open to revision | | [D-26](#d-26-binding-a-credential-plugins-approval-to-its-program) | Binding a credential plugin's approval to its program | decided (owner, 2026-10-12): the program's content where a folder's writer can replace it, else its path; built 2026-10-12; 2026-10-14 evening: Cogpit's own proxy for the cluster bound too (A23), built 2026-10-14 | | [D-27](#d-27-an-agents-helm-values-in-the-confirmation) | An agent's Helm values in the confirmation | decided (owner, 2026-10-12): shown in the dialog before the user answers; built 2026-10-12 | | [D-28](#d-28-the-default-kubeconfig-as-sources-as-lens-has-it) | The default kubeconfig as sources, as Lens has it | decided (owner, 2026-10-12); built 2026-10-12; 2026-10-14 evening: Remove from Cogpit on a sync folder's context (A97), built 2026-10-15 | @@ -96,7 +96,7 @@ projects' repositories; re-check them before relying on a version number. | [D-82](#d-82-a-pre-choice-before-any-integration-is-looked-for-and-ask-again) | A pre-choice before any integration is looked for, and Ask again | the owner's WF5 and WF4 (2026-10-17, his walk): consent before looking, and a way to see the question again; built the same evening with the lead's decisions, open to revision: nothing of a cluster without a choice read before the pre-choice is answered (Later and background clusters included), Check all (the default's integrations), Choose (ticks), Don't use (a warning that the resources still show), Back; `ui_state`'s `integrationsStep`, `integrationsLookFor`, `integrationsAskFirst`; `cluster.integrations.step`, `.lookFor`, `.ask`; Ask again in Cluster Settings › Integrations; the CLI and the demo cluster keep the default; changes D-76; H-126 opened; 2026-10-19 (owner, H-126): the step, the ticks and the answer GUI-only, H-126 closed | | [D-83](#d-83-one-hotbar-and-a-drag-that-carries-the-tile) | One hotbar, and a drag that carries the tile | decided (owner, 2026-10-17, WF7): one hotbar without banks, as many tiles as pinned, scrolling, F1–F12 the first twelve, a deliberate deviation from Lens; a file of banks merged; WF6: the dragged tile carried under the pointer while the others slide into place, R2's look replaced; built 2026-10-17 evening (the lead's details, open to revision) | | [D-84](#d-84-undo-and-redo-in-the-yaml-editor) | Undo and redo in the YAML editor | the owner's WF9 (2026-10-17): ⌘Z did nothing in Cogpit's YAML editor; built the same evening with the lead's decisions, open to revision: ⌘Z, ⇧⌘Z and ⌘Y in every YAML editor, a run of typing one step until a pause of a second, a caret move or a new line, a paste, a cut, a deleted selection and an indentation a step each, the caret and the selection restored, the newest 1,000 steps and 32 MiB; a text set from outside clears the history, ⌘Z after a Revert is Undo Revert; the widget's, no command; a Secret's editors drop theirs with the drawer; no Edit menu | -| [D-85](#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion) | Dialogs as tables and an object's state without its resourceVersion | the owner's WF13, WF14, WF16 and WF19 (walk of 2026-10-18), built 2026-10-18 with the lead's decisions, open to revision: no sentence repeating a confirmation's rows, the rows Context, Namespace, Objects, Effect, Requested by (the object's form and an effect a row each since 2026-10-19: D-100); the save review's head as rows with "This cannot be undone." and no workload explanation; no raw resourceVersion in the window ("since your edits began", times); Overwrite; the CSV named by the cluster's short name | +| [D-85](#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion) | Dialogs as tables and an object's state without its resourceVersion | the owner's WF13, WF14, WF16 and WF19 (walk of 2026-10-18), built 2026-10-18 with the lead's decisions, open to revision: no sentence repeating a confirmation's rows, the rows Context, Namespace, Objects, Effect, Requested by (the object's form and an effect a row each since 2026-10-19: D-100); the save review's head as rows with "This cannot be undone." and no workload explanation; no raw resourceVersion in the window ("since your edits began", times); Overwrite; the CSV named by the cluster's short name; since 2026-10-22 the Context row's source label in the kind word's grey (the owner's AW7) | | [D-86](#d-86-the-order-of-an-objects-yaml) | The order of an object's YAML | the owner's WF15 (walk of 2026-10-18), built 2026-10-18 with the lead's decisions, open to revision: apiVersion, kind, metadata (name, generateName, namespace, labels, annotations, then sorted), the body sorted, status last, wherever Cogpit shows an object's YAML; each field written by `sigs.k8s.io/yaml` so the quoting stays | | [D-87](#d-87-cluster-settings-the-integrations-under-a-divider-a-section-each-metrics-their-consumer) | Cluster Settings: the integrations under a divider, a section each, Metrics their consumer | the owner's WF22 and WF28 (2026-10-18, his walk): built the same day with the lead's decisions, open to revision: the list General … Agents, a divider, the heading Integrations (its own section: the rows, the note, Ask again), then Metrics Server, Prometheus, Alertmanager, Trivy Operator, Kyverno, each a section with its switch, its state and its details (Prometheus's fields from Metrics, Alertmanager's address), named as the integration is; Metrics shows the two it reads with their states and links, Lens's Metrics source dropdown gone (`metricsSource` kept for agents); the kubeconfig's path whole and selectable | | [D-88](#d-88-the-metrics-source-row-and-links-to-the-settings-only-when-needed) | The metrics' source row, and links to the settings only when needed | the owner's WF24 and WF25 (2026-10-18, his walk): built the same day with the lead's decisions, open to revision: under the drawers' and the Overview's charts one row "Prometheus ● 30 s ago" left, "Metrics Server ● now" right, the dot in the cluster dots' colours, the details in tooltips, no source line in prose, no namespace and service links (on the integration's section now), no Prometheus… button; a link to the integration's section only while it is not reachable; D-82's undecided cluster offers its question | @@ -108,16 +108,16 @@ projects' repositories; re-check them before relying on a version number. | [D-94](#d-94-the-empty-docks-toggle-opens-a-terminal-and-alert-names-copy) | The empty dock's toggle opens a terminal, and alert names copy | the owner's WF18 and WF21 (walk of 2026-10-18), built 2026-10-18 with the lead's decisions, open to revision: `ui.toggleDock` on an empty dock opens a terminal tab for every origin (D-54 changed); an alertname's copy icon on hover | | [D-95](#d-95-the-window-comes-back-where-it-was) | The window comes back where it was | the owner's WF11 (2026-10-17): the window always opened at 1440 × 900 in the middle; built 2026-10-18 with the lead's decisions, open to revision: its last size, place, display and full screen at every start, whatever Restore the last session says, from `window.json` (written half a second after a change and at quit); the display found by id or name and the frame moved with it, else the one it overlaps most, fitted into its visible area; on no display the first start's window; full screen once Cogpit is active; Windows and Linux the size and full screen only; not engine state, no command | | [D-96](#d-96-the-service-proxys-port-spelled-by-its-number-first) | The service proxy's port spelled by its number first | the owner's mgmt-p finding (2026-10-18 evening) and his choice: Prometheus and Alertmanager asked as `:` first, then `:`; a refusal no longer ends detection; built 2026-10-18 | -| [D-97](#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays) | A connect goes on when another cluster is shown; a failed one stays | the owner's WF39 and WF40 of 2026-10-19: every connect a run of its own; showing another cluster ends only the window's wait, the connect goes on in the background with a toast at its end; a failed connect never shows the cluster shown before (the owner: "Immer"); built 2026-10-19 with the lead's decisions, open to revision | +| [D-97](#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays) | A connect goes on when another cluster is shown; a failed one stays | the owner's WF39 and WF40 of 2026-10-19: every connect a run of its own; showing another cluster ends only the window's wait, the connect goes on in the background with a toast at its end; a failed connect never shows the cluster shown before (the owner: "Immer"); built 2026-10-19 with the lead's decisions, open to revision; since 2026-10-22 (AW15, AW16) neither the user's Cancel Connecting nor a connect left in the background raises a toast, on every path, and a second connect of the cluster the window waits for joins that wait | | [D-98](#d-98-what-holds-a-terminating-namespace-and-remove-finalizers) | What holds a Terminating namespace, and Remove finalizers | the owner's WF43 (walk of 2026-10-19) and his yes to Remove finalizers (Q1); built 2026-10-19 with the lead's decisions, open to revision: the drawer of a Terminating namespace lists, per kind its conditions name, the objects there held by finalizers (a metadata-only watch in that namespace while the drawer shows it), kinds the user may not list there counted from the condition, unavailable API services with their Service; `object.removeFinalizers` on one object being deleted, Destructive, a JSON patch testing the UID and exactly the confirmed finalizers; never a namespace or `/finalize` | -| [D-99](#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts) | Selecting and copying a log tab's text and a toast's | the owner's WF36 and WF41 (walk of 2026-10-19): nothing in a log tab or a toast could be selected and copied; built 2026-10-19 with the lead's decisions, open to revision: a log tab's selection a range in its lines (a drag that scrolls the view at its edges, ⇧-click, a double click, ⌘A for the lines it shows, ⌘C, a right-click's Copy, Select All and Copy All Lines Shown), Follow off when the pointer selects, the dropped lines' part dropped; a search's matches in the find colour; a toast's text selectable, a copy icon before its ×, the toast held while selected; the bell's list the same; the window's, not engine state; 2026-10-21: the agent's column block by block, the owner's choice, built | +| [D-99](#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts) | Selecting and copying a log tab's text and a toast's | the owner's WF36 and WF41 (walk of 2026-10-19): nothing in a log tab or a toast could be selected and copied; built 2026-10-19 with the lead's decisions, open to revision: a log tab's selection a range in its lines (a drag that scrolls the view at its edges, ⇧-click, a double click, ⌘A for the lines it shows, ⌘C, a right-click's Copy, Select All and Copy All Lines Shown), Follow off when the pointer selects, the dropped lines' part dropped; a search's matches in the find colour; a toast's text selectable, a copy icon before its ×, the toast held while selected; the bell's list the same; the window's, not engine state; 2026-10-21: the agent's column block by block, the owner's choice, built; 2026-10-22: Follow switched by scrolling (the owner's AW14): five rows up off, a smaller scroll keeps following behind, back at the newest line on | | [D-100](#d-100-objects-and-effects-in-one-form-and-a-drawers-edited-state-beside-save) | Objects and effects in one form, and a drawer's edited state beside Save | the owner's WF31, WF32 and WF33 (walk of 2026-10-19), built 2026-10-19 with the lead's decisions, open to revision: every dialog names an object "Config Map → walk-cm" (kind muted, name bold, several grouped by kind); a confirmation's effects a row each ("Removes added", bold and red), `Spec.Effects` in place of a Detail sentence; the drawer's edited state as pills beside Revert and Save | | [D-101](#d-101-the-kubeconfig-sources-at-hand-and-a-removed-cluster-leaves-the-hotbar) | The kubeconfig sources at hand, and a removed cluster leaves the hotbar | the owner's WF44 and WF45 of 2026-10-19: a "−" at the right of the navigator's Local Kubeconfigs row opens Kubeconfig Sources…; removing a source or Remove from Cogpit takes its clusters' tiles off the hotbar, a file gone by itself keeps its tile marked missing; built 2026-10-19 with the lead's decisions, open to revision | | [D-102](#d-102-debug-containers-added-from-the-drawer-shown-in-blue-reached-by-logs-shell-and-attach) | Debug containers added from the drawer, shown in blue, reached by Logs, Shell and Attach | the owner's words of 2026-10-19 evening and his answer on the danger level (Destructive): `pod.debug` "Debug" after Shell adds an ephemeral container from the Preferences' debug image (nicolaka/netshoot:v0.16 pinned by digest, the user's only), its dialog the confirmation for the window, the engine's for agents, then the Attach tab on it; blue squares after the regular ones, outlined once finished; Target in the drawer; Logs, Shell and Attach reach them; built 2026-10-19 with the lead's decisions, open to revision; H-134 opened | | [D-103](#d-103-fynes-thread-check-a-build-parameter-off-in-releases) | Fyne's thread check, a build parameter, off in releases | the owner's fast-scroll finding and decisions of 2026-10-19 late evening (audit first, then off in releases only; a build parameter; on a branch): `FYNE_THREAD_CHECKS=on\|off`, off in `make dist-app` by the app's metadata declaring the `fyneDo` migration (Cogpit's tag `nothreadcheck`, not Fyne's `migrated_fynedo`), the repository variable as the releases' way back; the audit of every place the GUI runs off the main goroutine (ui-threads.md) kept by a test; built 2026-10-19 night on the branch `fast-scroll`, merged after the owner's look of 2026-10-20 ("Deutlich besseres Ansprechverhalten"), in releases since v0.30.0 | -| [D-104](#d-104-dialog-fields-their-hints-and-dropdowns-the-gate-walks-gw2-gw5-gw6) | Dialog fields, their hints and dropdowns | the owner's gate walk of 2026-10-20 (GW2, GW5, GW6): a generated dialog's hint the tooltip of a "?" after the field's name, in a person's words beside the schema (`Spec.Dialog`), fields as wide as what they hold, Scale's count a slider from 1 to 30 with the count typed beside it; titles that name an object without the gap after the arrow (`dialogFrame`); every dropdown opens over its field, the current entry checked at its place (`selectField`); built 2026-10-20 with the lead's decisions, open to revision | +| [D-104](#d-104-dialog-fields-their-hints-and-dropdowns-the-gate-walks-gw2-gw5-gw6) | Dialog fields, their hints and dropdowns | the owner's gate walk of 2026-10-20 (GW2, GW5, GW6): a generated dialog's hint the tooltip of a "?" after the field's name, in a person's words beside the schema (`Spec.Dialog`), fields as wide as what they hold, Scale's count a slider from 1 to 30 with the count typed beside it; titles that name an object without the gap after the arrow (`dialogFrame`); every dropdown opens over its field, the current entry checked at its place (`selectField`); built 2026-10-20 with the lead's decisions, open to revision; since 2026-10-22 (the owner's AW1 and AW2) a closed dropdown outlined as an entry, the field outline 2:1 on every surface, and Escape on its list takes the keyboard off the field | | [D-105](#d-105-reverse-video-as-a-state-and-a-keys-modifiers-from-the-key-itself) | Reverse video as a state, and a key's modifiers from the key itself | the owner's GW7 and GW8 of the gate walk of 2026-10-20: SGR 7 a state of the terminal widget, as in xterm, so zsh's highlight of a paste, which oh-my-zsh repeats before every character, is one run; the widget keeps no modifier state, a key takes ⇧ from its own event (a ⇧ whose release the screenshot overlay took had put `;2` into the shell's line and swallowed Return), a drag ⌥ from its press, keys with ⇧ or Ctrl xterm's sequences (Ctrl+↓ had sent `^D`); built 2026-10-20 in the fork with the lead's decisions, open to revision | -| [D-106](#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace) | The gate walk's GW1, GW3, GW4 and GW9: the drawer, ⌘F, moving tabs, a deleted namespace | the owner's findings of 2026-10-20 and his choice on GW9; built 2026-10-20 with the lead's decisions, open to revision: a click below a list's rows closes the drawer, the checked rows stay (GW1); ⌘F opens the find bar of the dock's editor tab the keys are in, or of the open one when nothing has them, the Edit tab with a find bar too (GW3); a namespace the filter names that is deleted reads red until unticked, a terminating one too, the button red (GW9, the owner's choice); every namespace read page by page through `resources.list`'s new `offset` (the first 100 before); tabs moved by dragging, in the tab bar and the dock, `ui.tab.move`, `ui.tab.moveLeft`, `ui.tab.moveRight` (⌘⌥⇧←, ⌘⌥⇧→) and `dock.move`, the tab bar's order kept with the tabs (GW4) | +| [D-106](#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace) | The gate walk's GW1, GW3, GW4 and GW9: the drawer, ⌘F, moving tabs, a deleted namespace | the owner's findings of 2026-10-20 and his choice on GW9; built 2026-10-20 with the lead's decisions, open to revision: a click below a list's rows closes the drawer, the checked rows stay (GW1); ⌘F opens the find bar of the dock's editor tab the keys are in, or of the open one when nothing has them, the Edit tab with a find bar too (GW3); a namespace the filter names that is deleted reads red until unticked, a terminating one too, the button red (GW9, the owner's choice), read again on the engine's `EventNamespaces` since 2026-10-22 (AW11); every namespace read page by page through `resources.list`'s new `offset` (the first 100 before); tabs moved by dragging, in the tab bar and the dock, `ui.tab.move`, `ui.tab.moveLeft`, `ui.tab.moveRight` (⌘⌥⇧←, ⌘⌥⇧→) and `dock.move`, the tab bar's order kept with the tabs (GW4); since 2026-10-22 the keys move the dock's active tab where the keyboard works in the dock (`dock` on `ui.tab.moveLeft` and `ui.tab.moveRight`, the owner's AW10) | | [D-107](#d-107-the-navigator-slides-and-reduce-motion) | The navigator slides, and Reduce motion | the owner's requests of 2026-10-20: drilling into a cluster slides its tree in from the right over All Clusters, ‹ All Clusters slides it out again; a change from one cluster's tree to another's slides vertically in All Clusters' order, the leaving cluster a picture of the window's frame; Preferences › App › Reduce motion (`reduceMotion`, off by default, agents either way) or macOS's Reduce motion stops every motion of Cogpit, the drags' and the blink's too; built 2026-10-20 with the lead's decisions, open to revision | | [D-108](#d-108-cogpit-for-linux-a-deb-and-an-apt-repository-on-pages) | Cogpit for Linux: a .deb and an APT repository on Pages | the owner's request of 2026-10-20 evening and answers (a .deb from the releases kept up to date; the repository on GitHub Pages, silent installs the user's own setting; a signing key in the environment `apt` without a reviewer; amd64 and arm64); built 2026-10-20 night with the lead's decisions, open to revision: the package with both binaries, the launcher, the update helper and the sources file with its key inline (a conffile); the signed repository with Acquire-By-Hash, the two newest releases; Cogpit's Update button reads apt's state and installs through pkexec and the helper, then offers Restart to Update; on Linux only the window runs `app.checkForUpdates` | | [D-109](#d-109-the-menus-in-the-top-bar-on-windows-and-linux) | The menus in the top bar on Windows and Linux | the owner's decision of 2026-10-21 morning after the owner's first look at Cogpit on Ubuntu (three bars: GNOME's title bar, Fyne's menu bar, Cogpit's bar): "zwei Leisten, nativ", the system's title bar stays and the menus' titles move into Cogpit's bar before the logo; built 2026-10-21 with the lead's decisions, open to revision: the window keeps its main menu for the keys only, so menu keys still come before a focused text field; the open menu a layer of its own; Quit at the end of the first menu; Windows the same | @@ -125,8 +125,9 @@ projects' repositories; re-check them before relying on a version number. | [D-111](#d-111-cogpit-for-windows-an-nsis-setup-and-winsparkle) | Cogpit for Windows: an NSIS setup and WinSparkle | the owner's request and answers of 2026-10-21 (an NSIS setup per user with `/allusers`, `/S` and `/D=`; WinSparkle with the update key Sparkle's feed is signed with; the first releases without Authenticode; the toolchain on the owner's Windows workstation; the Update button installs with one click), built on the branch `windows-release`: the setup, its release jobs and CI's Windows Package, WinSparkle's feed and updater, the local terminal on ConPTY, every test passing on Windows, an update checked end to end; released once the branch is merged | | [D-112](#d-112-ci-and-test-time) | CI and test time | the owner's request of 2026-10-21 evening (CI and local test time down at the same coverage, decided by the lead and presented at the end), built on the branch `ci-speed` (PR #67): the build cache saved from main's pushes only, Fyne's Linux build dependencies minimal and in the background, every Linux test run once (under the race detector, without it only what it keeps from running), the UI's tests in parallel shards locally and on Windows, no PNG nobody keeps, the logo drawn once per size; Fyne's font cache reported upstream (fyne#6619, the fix in PR fyne#6620, the owner's, 2026-10-22) | | [D-113](#d-113-image-grades-shields-from-trivys-reports) | Image grades, shields from Trivy's reports | the owner's request of 2026-10-22 and his answers one at a time: S (nothing found, the OS supported), A (at most 10 Low or Unknown), B (Medium, or more), C (High, or an OS at its end of life), D (1 to 5 Critical), E (more), N/A (no report), D and E provisional; from the VulnerabilityReport's own fields only; his pick in the Image Rating Lab (a crest in Docker Scout's colours, S with a gold rim, N/A grey at 1.5:1 in both themes); built in PR #69: the Pods list's column a shield without a header title, 32 points after Containers; each container section of a pod's drawer its grade after the name and a card under its items (the grade, its rule, the counts as a bar, OS, scan, report); the lead's details, open to revision | -| [D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages) | The alpha walk's decisions: a failed connect's page and its stages | decided by the owner 2026-10-22 in his alpha walk, not built: a failed connect's error page in the welcome page's look with the connect as stages (kubeconfig, DNS, TCP, API), also in Connection Updates (AW17); the dialogs' Context label grey (AW7); the welcome page without "Other clusters" (AW13); Follow switched by scrolling (AW14) | +| [D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages) | The alpha walk's decisions: a failed connect's page and its stages | decided by the owner 2026-10-22 in his alpha walk: a failed connect's error page in the welcome page's look with the connect as stages (kubeconfig, a credential plugin's login, DNS, TCP, TLS, API), also in Connection Updates (AW17), built 2026-10-22 on the branch `feat/failed-connect-page` with AW18's fix, the stages measured on client-go's own first request; the welcome page without "Other clusters" (AW13), built with it; the dialogs' Context label grey (AW7), built 2026-10-22; Follow switched by scrolling (AW14), built 2026-10-22, D-99; the lead's details, open to revision | | [D-115](#d-115-a-dock-tab-the-user-opens-takes-the-keys) | A dock tab the user opens takes the keys | the owner's AW5, AW6 and AW8 of his alpha walk of 2026-10-22, built 2026-10-22 on a branch with the lead's decisions, open to revision: a tab the user opens or shows from the window takes the keyboard on its editor, terminal or log once ready, unless the keys moved meanwhile; an agent's tab leaves them; the find bar's first ⌘F repaints and focuses its field through the window's canvas | +| [D-116](#d-116-escape-closes-the-innermost-thing) | Escape closes the innermost thing | the owner's alpha walk of 2026-10-22 (AW3, AW4, AW19; AW2 in D-104): an open dropdown's list, a find bar or a search, then the window's top overlay (a dialog as its Cancel, the drawer behind untouched; a pop-up, the palette, the notifications, the MCP details), then a settings page, then the drawer; every overlay registers its Escape as it shows, every Fyne dialog through `showDialog`, a dialog's fields hand Escape on; built 2026-10-22 with the lead's decisions, open to revision | ## Decision round 2026-10-14 evening @@ -2163,7 +2164,9 @@ drawer, where everything is selectable (values, labels, annotations, events, not Every value in the drawer gets a copy icon, shown on hover, that puts it on the clipboard and says so in a toast; a value made of several entries (labels, annotations, ports, images) copies the one entry, in YAML syntax (`app.kubernetes.io/name: grafana`). A Secret's value can be copied only once -revealed, in the GUI, and the clipboard is cleared 60 seconds later if it still holds that value. +revealed, in the GUI, and the clipboard is cleared 60 seconds later if it still holds that value +(the first half replaced by the owner on 2026-10-22, below: a masked value copies too, without +being shown; the clearing stays). Agents get no copy command (they read values through `object_get` already). This is Cogpit's own approach; how Lens Desktop copies is not captured and not needed. Since 2026-10-18 the alert board's alertnames copy the same way (the owner's WF21, [D-94](#d-94-the-empty-docks-toggle-opens-a-terminal-and-alert-names-copy)). Since 2026-10-19 a log @@ -2230,8 +2233,9 @@ Universal Clipboard); the 60 seconds and the clearing on close stay. Options wei [a long fingerprint](../../internal/ui/fyneui/testdata/drawer_copy_long_light.png)), and the pod's status pill in [`drawer_copy_pill_dark.png`](../../internal/ui/fyneui/testdata/drawer_copy_pill_dark.png). Not tried in a real window again. -- A masked Secret value has no icon; a revealed one has, and copies the value alone (not the note - that a long value was cut). A copy of a Secret value, by the icon or by ⌘C on its selection, goes +- A masked Secret value had no icon until 2026-10-22 (since then it copies without being shown, + below); a revealed one has, and copies the value alone (not the note that a long value was cut; + since 2026-10-22 a value Show cut copies whole through its icon, below). A copy of a Secret value, by the icon or by ⌘C on its selection, goes through `shell.copyText(…, secret=true)`: 60 seconds later (`secretClipboardTTL`; the shell's `secretClipTTL`, shortened in tests) the clipboard is emptied if it still holds that value; a later copy of anything cancels the clearing, and closing the window clears at once @@ -2373,6 +2377,63 @@ lead's decisions (2026-10-17), open to revision: and [`_light.png`](../../internal/ui/fyneui/testdata/cluster_settings_accent_light.png) (the name's icon just used: its checkmark and the toast). Not tried in a real window. +**Changed (owner, 2026-10-22, verbatim):** "Ich stelle gerade fest, dass man nur Passwörter aus +Secrets kopieren kann, bei den man vorher auf 'Show' klickt. Das ist so nicht gewünscht. Ich will +natürlich auch Passwörter direkt in den Zwischenspeicher packen können und dann direkt irgendwo in +ein Passwortfeld ohne es vorher anzuzeigen." It reverses the rule of 2026-10-12 that a Secret's +value is copyable only once revealed, kept above as history: a masked value copies too, without +being shown; the clipboard rules for a Secret's value stay (concealed and this Mac's only on macOS, +cleared after 60 seconds if the clipboard still holds it, at once when the window closes; +[H-25](../security/credentials.md#h-25-a-copied-secret-value-reaches-the-clipboard)). **Built +2026-10-22** ([`secretcopy.go`](../../internal/ui/fyneui/secretcopy.go), +[`copy.go`](../../internal/ui/fyneui/copy.go) `copyHook.fetch`, +[`drawer.go`](../../internal/ui/fyneui/drawer.go) `itemValue`): + +- A masked value in the drawer ("•••••••• (28 B)", Show beside it) has the copy icon on hover, + placed as on any line. A tap runs `secret.reveal` with `whole` from the window, the GUI-only + command Show runs (agents and the CLI are refused before anything is read, `TestRevealIsGUIOnly`), + and puts the answer on the clipboard through `shell.copyText(…, secret=true)`. The value enters no + widget and not the drawer's `revealed` map: the drawer stays masked and Show stays Show. The icon + turns into the checkmark while it is still on the value, and the toast names the key: "Copied the + value of DB_PASSWORD. The clipboard is cleared in 60 seconds." An answer that arrives when the + drawer no longer shows that Secret (it moved on or closed) copies nothing and shows nothing, an + error included. +- The same in the drawer of a Secret whose values can be saved + ([D-59](#d-59-a-secrets-values-edited-in-the-drawer)): a masked value's icon copies it the same + way and opens no editor; a value the user edited or added and hid again ("•••••••• (edited, not + saved)") copies what was typed, from the editor's memory, with no reveal. +- A revealed value that Show cut (4 KiB, 40 lines) copies the whole value through its icon by the + same path, its tooltip "Copy the whole value", the drawer still showing the cut text and its + note; a revealed value Show did not cut copies what it shows, and a selection with ⌘C exactly + the selection, as before (the lead's decision, the table below). +- No command copies (`TestCopyHasNoCommand`). A copy writes no line in the audit log, as a Show + writes none: the audit log records agents' calls, and an agent's `secret.reveal` is refused and + audited with the Secret and the key, never a value. + +The lead's decisions (2026-10-22), open to revision: + +| Question | Options weighed | Chosen | Why | +|---|---|---|---| +| How much is copied | (a) the whole value (`whole`); (b) what Show shows, the first 4 KiB and 40 lines | (a) | A password or a key cut short and pasted unseen fails without saying why; Show says where it cuts, a copy unseen cannot. An answer cut anyway (an engine that ignored `whole`) copies nothing: "The value of was not read whole: nothing was copied." | +| A binary value (not UTF-8, or control characters) | (a) no such icon, as it has no Show; (b) its bytes copied as text | (a) | The engine never hands a binary value out ("binary values are shown by their size only", `secretValueOf`), and the clipboard holds text: bytes that are not UTF-8 arrive altered. Its line "binary data, 1.2 KiB" keeps the plain icon that copies that line, as before | +| An empty value | (a) nothing copied, and the toast says so; (b) "" put on the clipboard | (a) | As the editor's icon does (D-59): a click must not empty the clipboard. "The value of is empty: nothing was copied." | +| The icon over a masked value | (a) the same icon, its tooltip "Copy the value without showing it"; (b) the same icon and the plain "Copy"; (c) another icon | (a) | The same plate and checkmark as every value; the tooltip says what the click does, since nothing on screen changes after it | +| The toast | (a) the key and the clearing; (b) "Copied." as after a revealed value's copy | (a) | The user did not see what went to the clipboard, so the key says which value it was. A key's name is no secret (the Secrets list's Keys column shows it); the value never appears | +| A revealed value Show cut (4 KiB, 40 lines) | (a) its icon copies the whole value by the masked value's path (`secret.reveal` with `whole`, the clipboard for Secret values, the toast naming the key, nothing more shown in the drawer), its tooltip "Copy the whole value"; a value Show did not cut copies what it shows, as before; a selection and ⌘C copy exactly the selection; (b) its icon copies what it shows, the first 4 KiB, as built until then | (a), the lead's decision (2026-10-22), replacing (b) chosen in the build the same day | A password cut in half on the clipboard is wrong whether the value was shown or not, and the icon should mean "this value" wherever it sits; a selection is what the user marked, so it stays exactly that. The drawer keeps the cut text and its note ("[the first 4.0 KiB of 6.0 KiB]") | +| The Create Secret dialog's masked field | (a) it copies nothing while masked, as built; (b) ⌘C copies the masked text | (a) | A field the user types or pastes the value into, whose value came from the user: it copies nothing while masked, as Fyne's password field does, and its eye shows the value to copy (H-70) | +| A removed key's line | (a) no copy; (b) its value copied | (a) | It has Undo, not Show: the value is going, and the window holds it only if it was shown | + +Tests: `TestSecretMaskedValueCopiedWithoutShowing` (a value over 4 KiB copied whole and concealed, +the drawer still masked, no revealed entry, the tooltip, the checkmark, a toast with the key and +never the value, the clipboard cleared after the time), `TestSecretMaskedCopyRefusals` (an empty +value, an answer cut short, an answer for a drawer that moved on or closed), +`TestSecretEditorMaskedValueCopiedWithoutShowing` (D-59: no editor opened; an edited and an added +value hidden again copied as typed, with no reveal), `TestSecretCutRevealedValueCopiedWhole` (a +revealed value over 4 KiB: its icon copies the whole value, the drawer still shows the cut text, +⌘C on a selection copies the selection), `TestSecretRevealedValueCopied` (a revealed value Show did +not cut, as before), `TestCopyHasNoCommand`; in the engine `TestRevealIsGUIOnly`. No render changed: +the icon shows under the pointer only. Not tried in a real window. + ## D-26: Binding a credential plugin's approval to its program **Decided (owner, 2026-10-12, from R-5 of the fourth run's review):** the approval of a kubeconfig's @@ -5182,7 +5243,21 @@ before Agent Chat (⌘I), checked while their part is open. Tests: `TestSyncDock moves because its tab closed; the dock's own arrow and a click on the shown tab of a collapsed dock go through `ui.toggleDock`. Options: a new tab only (logs opened again would not show while the dock is collapsed). The rule is `UIState.SyncDock`, which `UpdateUI` runs after every - change, so it holds whoever changed the dock. + change, so it holds whoever changed the dock. **Since 2026-10-22** (the owner's alpha walk, AW9: + with the dock minimised, Edit on an object whose Edit tab was open "sometimes" did nothing): a + command that shows a tab open already opens the dock also when that tab is the active one, which + `SyncDock` cannot see (nothing in the state changes but the open state). Verified cause, by a test + failing before the fix: every command that reuses a tab set `ActiveDock` to the id it already + had; it worked when another tab was active, hence "sometimes". The lead's details, open to + revision: the rule is `UIState.ShowDockTab` (the tab active and the dock open; a hidden cluster's + tab opens that cluster's dock for when it is shown, never the shown one), against a transient + request in `UIState` that `SyncDock` would read (hidden state in what agents read and the window + clones) and a change of `SyncDock` alone (it cannot tell the command's showing from any other + change); it is used by every command that may reuse a tab: Edit, a pod's and a workload's logs, + Helm Upgrade, Helm Install and its version's reload, the Audit Log, the Diagnostics, a draft + restored into its Edit tab, `dock.activate` and `dock.reconnect`; the commands that always add a + tab stay as they were (a tab added opens the dock). Tests: `TestShowDockTab`, + `TestShowingAnOpenDockTabOpensTheDock`, `TestEditOnTheShownEditTabOpensTheDock`. - *What `workspace.json` keeps:* ★ whether the navigator is hidden and whether the chat column is shown; not the dock's state, since its tabs are not restored and a dock without tabs is closed. Options: the navigator only (the chat column would come back closed after every restart, while @@ -5696,7 +5771,9 @@ section: a red dot). The owner decided: Clusters". 7. **I7, the welcome page keeps its cluster groups** (the hotbar's shown bank, since D-83 the hotbar, Recent up to 6, up to 8 others); only its All Clusters… now shows the section, as ⌘P does (the button itself gone - since the owner's answer of 2026-10-16 evening, below). + since the owner's answer of 2026-10-16 evening, below). Since 2026-10-22 without the 8 others + (the owner's AW13, [D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)): + the hotbar and Recent only, the kubeconfigs' clusters as "Your clusters" on a first start alone. 8. **I8, a visible Add Kubeconfigs in the section:** a "+" in the navigator's header beside the search (tooltip "Add Kubeconfigs…"), at the section only; it replaces the picker's visible button. The Cluster menu's, the welcome page's and the root's right-click stay. @@ -5762,7 +5839,10 @@ changed (the page without it, built 2026-10-16 night, below); the renders were n three commands, and the cluster to go back to is always the connected one (Cogpit holds one connection), which `ui_state` names. - *Escape on a text in ⌘P's search:* ★ clears the text and keeps the search; the next Escape, on the - empty search, goes back. Any other search: Escape clears and closes it, as before. Options: clear + empty search, goes back. Any other search: Escape clears and closes it, as before. (The + navigator's other searches, where it held; the list's search and the editor's find bar, read + into "any other search" by the owner's AW4 of 2026-10-22, never had it until + [D-116](#d-116-escape-closes-the-innermost-thing).) Options: clear and close (the next Escape would land in the list, no longer "on an empty search"). Why: a slip in the text costs one Escape more, never the way back. - *⌘P pressed at the section:* ★ Escape on its empty search closes the search, the section stays. @@ -5798,8 +5878,8 @@ changed (the page without it, built 2026-10-16 night, below); the renders were n workspace's button stays as built.** **Built 2026-10-16 night** (N122): the page without its button ([`welcome.go`](../../internal/ui/fyneui/welcome.go)), "Add Kubeconfigs…" its one button (`TestConnectToClusterButtons`, `TestWelcomePageOverTheEngine`; renders `welcome_*.png`, - `welcome_insecure_*.png`, `welcome_connect_error_dark.png`, `start_restored_*.png` and - `auditlog_*.png`, which show the page). **Verified the same night, the point the answer left + `welcome_insecure_*.png`, `welcome_connect_error_dark.png` (removed 2026-10-22: a failed connect + shows its error page, D-114), `start_restored_*.png` and `auditlog_*.png`, which show the page). **Verified the same night, the point the answer left open** (whether the navigator always shows the section where the workspace's button shows): in the engine's state, yes. The button shows while the shown cluster is neither connected nor connecting ([`tableview.go`](../../internal/ui/fyneui/tableview.go), `updatePlaceholder`), and @@ -6236,7 +6316,8 @@ click copies the editor's whole value as typed so far through the path ⌘C and (`secData.copied`, `shell.copyText(…, secret=true)`: concealed for clipboard managers, cleared after 60 seconds if the clipboard still holds it), never the plain clipboard, and the toast says "Copied. The clipboard is cleared in 60 seconds." (a copy's toast, outside the notification history). A -masked value has no icon; a Config Map's editors have none. The build's choices, open to revision: the icon is always shown with its editor (not only under the pointer, as the drawer's +masked value has no such icon (since 2026-10-22 the drawer's icon on hover copies it without +showing it, D-25); a Config Map's editors have none. The build's choices, open to revision: the icon is always shown with its editor (not only under the pointer, as the drawer's values have it: an editor takes the pointer for its text), its tooltip "Copy the whole value"; an empty value copies nothing ("The value is empty: nothing was copied."), so that the click does not empty the clipboard. ([`secretdata.go`](../../internal/ui/fyneui/secretdata.go) `copyIcon`, @@ -6720,11 +6801,21 @@ Tests: `TestConnectTraceRecordsTheSteps`, `TestConnectTraceNamesTheClientCertifi | How the plugin's standard error is captured | a public option (client-go v0.37.1 has none); replacing the process's `os.Stderr` (every write of the process mixed in, the plugin's runs not told apart); a wrapper program in the plugin's place (changes the command D-26 approved); Cogpit's own exec authenticator (client certificates from a plugin need client-go's TLS callback); setting the unexported field of client-go's own Authenticator | the field, through reflection, under the Authenticator's own lock, once per Authenticator; the output still goes on to Cogpit's standard error as before, a copy of the newest 64 KiB held in memory and dropped after a request that worked | The least invasive way that is correct: the same Authenticator client-go's transport uses (its cache), the plugin's runs told apart by request, the command unchanged; a client-go that renames the field leaves the plugin's standard error where it went before (logged once) and fails `TestPluginStderrOnFailureIsScrubbed` | | The scrubber | the engine's Secret filter (H-82; its values are the connected cluster's Secrets, so it knows no plugin's token and refuses without a connection, which a failed login is); `helm.ScrubValues` (a chart's values); the cluster layer's replacement of known secrets | the cluster layer's replacement (`replaceSecrets`, shared with the proxy's password in errors) for the user entry's own values (its token, password, the plugin's environment values and `--flag=value` arguments, the proxy's password), plus the shapes a credential has (a JWT, a PEM block, a value after `Bearer`/`Basic`, a value after a key that names a secret, a run of at least 32 token characters with letters and digits), every URL without user information, query and fragment, then the cut at 4 KiB | The lead's brief asked to reuse the existing scrubber; none of them can know a token the plugin made, so the shapes are new, in the cluster layer, the only place the text exists unscrubbed ([H-112](../security/credentials.md#h-112-a-credential-plugins-standard-error-in-the-connection-log)) | | A reconnect that waits all night | a line per try; a line per change of reason | a line when a try's reason differs from the last one written | A try every 30 seconds for hours would push everything else out of the 1 MiB | -| Levels | ERROR for every failure | ERROR for a failed connect and for a connection Cogpit closed, as before; WARN for an interruption, its tries and an expired login; since 2026-10-19 INFO for what the user did: Cancel Connecting (the steps it ended, its attempt `cancelled`), a source removed and Remove from Cogpit (a disconnect, outcome `ok`) (the lead's notes of the walk of 2026-10-19: the user's own cancel wrote four ERROR lines, a removal an ERROR and `failed`) | A context is marked (`ConnectProblem`, the navigator's red dot) by a failed connect, as before; an interruption has its own state and banner (D-58); the user's own act failed nothing | +| Levels | ERROR for every failure | ERROR for a failed connect and for a connection Cogpit closed, as before; WARN for an interruption, its tries and an expired login; since 2026-10-19 INFO for what the user did: Cancel Connecting (the steps it ended, its attempt `cancelled`), a source removed and Remove from Cogpit (a disconnect, outcome `ok`) (the lead's notes of the walk of 2026-10-19: the user's own cancel wrote four ERROR lines, a removal an ERROR and `failed`); since 2026-10-22 the window raises no toast for Cancel Connecting either (the owner's AW15: an error toast "connect : connecting cancelled", [D-97](#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays)) | A context is marked (`ConnectProblem`, the navigator's red dot) by a failed connect, as before; an interruption has its own state and banner (D-58); the user's own act failed nothing | | An interruption and the reconnect after it (the owner's WF37 of 2026-10-19, verbatim: "Der letzte Eintrag bei einem erfolgreichen Reconnect sollte auf erfolgreich melden. Es kann nicht sein, das es erfolgreich war aber der letzte Eintrag ist: \"Connection interruped\"") | an attempt's lines newest first too; the interruption as an entry of its own; the head coloured by its outcome only | **the interruption an entry of its own** (`interruption`, outcome `interrupted`, its cause's error picture and a failed plugin's standard error, its header "the connection was lost" in the warning colour), **the reconnect the next attempt** ("Reconnecting to ", its tries, "Reconnected to after 55 ms"), so each entry reads top down, ends in how it ended, and its header in its outcome's colour says the same; one way to write a duration in a header and its lines (`engine.FormatSpan`: "55 ms", "2.4 s", "10 min 2 s"; the line said "after 0s" under "succeeded after 55 ms") | The owner read the block top down as newest first, as the entries are ordered; reversing an attempt's lines would reverse an error picture's chain too; an entry per event keeps both orders right. The lead's decision, open to revision | | Bounds | — | 200 lines per attempt (the rest counted and named), 30 attempts per context and 64 contexts in memory, the dialog the newest 50 attempts; `EventConnectLog` coalesced to one per 100 ms, the dialog reading the log again (memory and the file, at most 1 MiB) one read at a time | The dialog follows a running connect without polling anything, and the file stays the record | | A file that cannot be written | fail the connect; say it | a toast and a log line once per run; the session keeps the log in memory | The log must never cost a connection | +**The connect's stages (2026-10-22, [D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages), +the owner's AW17: "Das gilt auch für die Connection Updates Maske"):** every connect's attempt +keeps its stages beside its lines (`ConnectAttempt.Stages`: kubeconfig, a credential plugin's login, +DNS with the addresses, TCP with the address and port dialled or the proxy's, TLS, the API server's +answer; each ok, failed, not reached, skipped or cancelled, with a sentence and its time), measured on +client-go's own first request; the file keeps one `stage` record each, so a restart reads them back. +The dialog shows them under each connect's header, above its lines, and Copy writes them; +`cluster.connectLog` returns them (`stages`). The lines, the error picture and the whole error +chain at the attempt's end are as before. + **Open:** the owner's confirmation; [H-112](../security/credentials.md#h-112-a-credential-plugins-standard-error-in-the-connection-log) (the scrubber can miss a secret a plugin prints, and the file keeps it for 7 days); a record that another Cogpit process (`cogpit-cli`) appends while this one rewrites the file can be lost; the @@ -6967,7 +7058,10 @@ several clusters connected for hours. 2026-10-19 by the owner's WF40, [D-97](#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays)): the window stays on the failed cluster with its error, Connect Again and Show Connection Updates, and its dots turn red; the cluster shown before stays connected behind it and is never shown by - itself. Until 2026-10-19 the window showed the cluster it showed before again, with a toast. + itself. Until 2026-10-19 the window showed the cluster it showed before again, with a toast. Since + 2026-10-22 the error is the failed cluster's error page over the workspace, with the connect's + stages, whether or not a tab is open ([D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)); + GW13 keeps its tabs hidden under it. - **`ConnectedCluster.LoginLapsed`** (JSON `loginLapsed`) added in [`connections.go`](../../internal/engine/connections.go) for the grey ring; stage 3 sets it. - **Tests:** in the engine `TestDockFollowsTheShownCluster`, `TestAHiddenClustersTabStaysInItsDock`, @@ -8764,6 +8858,27 @@ Tests: `TestSelectionMenu` (the rows' order, no sentence repeating them), (`configmapdata_test.go`, `secretdata_test.go`, `datakeys_test.go`, `editortab_test.go`, `drafts_test.go`). +**AW7, the Context row's source label** (the owner's alpha walk of 2026-10-22, +[D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)). The row's second +line, the label in brackets ("[kubernetes_configs/]", the synced folder's name and the file's, +[D-28](#d-28-the-default-kubeconfig-as-sources-as-lens-has-it)), read to him as a relative path; his +choice after the lead explained it, verbatim: "der Pfad ist vielleicht zu lange. Dann lass es gerne +in dem Format wie es ist, aber grau wäre top." **Built 2026-10-22**; the lead's details, open to +revision: + +| Decision | Options weighed | Chosen | Why | +|---|---|---|---| +| How the label stands | (a) as before, the id one paragraph wrapped at its spaces, only the label's colour new; (b) the label always on a line of its own under the context | **(a)**: the id wraps as it did and the part from "[" on is drawn in the grey (`paragraph.mutedFrom`, [`widgets.go`](../../internal/ui/fyneui/widgets.go)); a label wider than the column breaks anywhere, grey to its end | "in dem Format wie es ist": only the colour changes, and no dialog grows a line where the id fits on one | +| Which grey | the kind word's `colorMuted`; the dock's dim tab text | **`colorMuted`**, the Object row's kind word and the rows' names | The owner named the kind word's grey | +| Where | the confirmations; every dialog's Context row | **every Context row**: `placeRows` draws it (`contextValue`, [`objectnames.go`](../../internal/ui/fyneui/objectnames.go)) for the confirmations, the Config Map's and Secret's save reviews, Helm Install's review, Helm Rollback, Debug, and Argo CD's Sync and Refresh | One row, one look. Checked 2026-10-22: no dialog writes a Context row of its own; the parameter dialogs (Scale, Drain) and the create dialogs have none | +| An id without a label | — | the context alone, as before (the demo; a connector without sources) | Nothing to set apart | + +Tests: `TestContextRowMutesTheSourceLabel` (one line, wrapped, a label broken anywhere, an id +without a label; the paragraph keeps the whole id). PNG: the Edit tab's Apply on a synced folder's +context, [dark](../../internal/ui/fyneui/testdata/confirm_apply_removes_dark.png), +[light](../../internal/ui/fyneui/testdata/confirm_apply_removes_light.png). Not seen in a real +window yet. + **What it does not cover:** the create dialogs and the Preferences' notices were not checked against the rule; Windows and Linux not tried. (The commands' detail texts, sentences in the Effect row until 2026-10-19, are rows of their own since, and Helm's install review is rows: @@ -9472,10 +9587,14 @@ shown before again"). **WF40, the owner's decision, built 2026-10-19:** a failed connect leaves the window on its cluster: `UIState.Context` names it, `Connection` is `error` with the message, its dots are red, the cluster -shown before stays connected behind it. The workspace's placeholder says "Could not connect to +shown before stays connected behind it. The workspace's placeholder said "Could not connect to : " with **Connect Again** (the welcome page's connect of that cluster, a credential plugin's review included) and **Show Connection Updates** (its connection log); the welcome page, -when it shows, says it in its status line and its row's warning icon opens the log. The window's +when it showed, said it in its status line and its row's warning icon opens the log. Since +2026-10-22 ([D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages), the +owner's AW17: the welcome page covered the placeholder whenever no tab was active, a restore's +failure among them) the failed cluster's **error page** shows over the workspace instead, with +both buttons, the cause and the connect's stages, whether or not a tab is open. The window's `followSwitch` and its memory of the cluster shown before are gone; a hotbar tile's failed connect says it in a toast as any failed connect from a tile did. @@ -9495,7 +9614,8 @@ says it in a toast as any failed connect from a tile did. replaces the restore's `background` and `bgCancel`), `Session.connect` and `ConnectBackground` on it, `DisconnectContext` cancelling a run in the background or the window's, `ConnectedCluster.running` (was `restoring`) keeping a run's entry while another cluster is shown, `ErrConnectInBackground`; -the window's [`tableview.go`](../../internal/ui/fyneui/tableview.go) placeholder after a failed connect, +the window's [`tableview.go`](../../internal/ui/fyneui/tableview.go) placeholder after a failed connect +(replaced 2026-10-22 by the error page, [`errorpage.go`](../../internal/ui/fyneui/errorpage.go), D-114), [`clustermarks.go`](../../internal/ui/fyneui/clustermarks.go) without `followSwitch`. Tests: `TestShowingAnotherClusterLeavesTheConnectRunning`, `TestALeftConnectThatFailsSaysSo`, `TestConnectAgainJoinsTheRun`, `TestCancelALeftConnect`, `TestAFailedConnectStaysOnItsCluster` in the @@ -9507,6 +9627,48 @@ engine; `TestAFailedConnectStaysOnItsCluster` in the window; PNGs the walk's fake plugins on kind against this build; several runs in the background at once against real clusters. +**The owner's alpha walk of 2026-10-22 on v0.38.0 (AW15, AW16; the walk notes):** each Cancel +Connecting raised an error toast "connect walk-login-hang [walk-kube/walk-login.yaml]: connecting +cancelled" (AW15; the connection log rated it right since WF37, [D-66](#d-66-the-connection-log)); a +click on another cluster while `walk-login-hang`, later `walk-login-slow`, waited raised at once an +error toast "connect walk-login-hang [walk-kube/walk-login.yaml]: another cluster was shown; the +connect goes on in the background" (AW16). The row above gave `cluster.connect` its `connecting` +answer, but a hotbar tile (`hotbar.openCluster`), a tab (`ui.tab.select`) and the navigator's › +(`ui.setNavigatorScope`) passed the Go error on, and the window toasted every error but a declined +confirmation. A cancel that ended the run at the moment the window's connect saw it said "superseded +by a newer connect" instead, which the tests showed as the common case with a connector that returns +at once. + +**Built 2026-10-22, the lead's decisions, open to revision** ([D-74](#d-74-how-the-leads-decisions-are-reviewed)): + +| Decision | Options weighed | Chosen | Why | +|---|---|---|---| +| What the window says for the user's own Cancel Connecting and for a connect left in the background | an error toast (as built); a neutral line in the cluster's words; nothing | **nothing** | The cluster's dot says it (blinking while the connect goes on, gone after the cancel), and so does its connection log ("cancelled", D-66); a run that ends in the background has its own toast already ("Connected to in the background.", or why it failed); a line about what the user did a moment ago is noise | +| How the window tells these outcomes from a failure | the error's text; typed errors | **typed errors** in the engine, matched with `errors.Is`: `ErrConnectInBackground` (there since 2026-10-19), `ErrConnectCancelled` and `ErrConnectSuperseded` (a newer connect or a show came before this one began), all three `engine.ConnectNotFailed`; the window's `showError` (every dispatch without its own answer, a hotbar tile's) and the `--context` start's answer skip them as they skip `ErrDeclined` | The text changes with the next wording; one predicate for the window and the tests | +| Every path alike | map each path on its own; one rule for every command that connects | **one rule**: a connect left in the background answers without an error, `{context, state: connecting}` from `cluster.connect` (as before) and `hotbar.openCluster` (`connectAnswer` in [`commands/cluster.go`](../../internal/engine/commands/cluster.go)), the UI state from `ui.tab.select`, `ui.tab.next`, `ui.tab.previous` and `ui.setNavigatorScope` (as for a failed connect); a cancel is `ErrConnectCancelled` on every path, also when the run ended at the moment of the cancel; a connect replaced before it began says by what (`ErrConnectSuperseded`, `ErrConnectCancelled`, `ErrClosed`) | The window's toast and an agent's answer follow the outcome, not the path the click took | +| What an agent gets back | a cancel as a result (`state: disconnected`); as an error that says so | **an error that says so**: MCP's code `cancelled` (was `failed`), "… did not finish: its connect was cancelled (cluster_disconnect: the user's Cancel Connecting in Cogpit's window, or an agent's), so the cluster is not connected. Do not connect it again unless the user asks you to."; the built-in agent the same, its tool item stopped; a connect superseded before it began `cancelled` too, "… Nothing failed." The background answer as above | The command did not do what it was asked and will not: an agent must not read it as success, and "failed" invites a retry of what the user stopped (as `declined` asks for none). D-2 and the audit log are unchanged: the audit line records the outcome as before (a cancel not ok with its error; a background `hotbar_openCluster` now ok, as `cluster_connect`'s was) | +| A cancel by an agent (its `cluster_disconnect` of the user's connect) | a toast naming the agent; as the user's | **as the user's**: no toast | An agent's UI operations run freely and none is announced in a toast (D-2), its Disconnect of a connected cluster included; the audit log has its `cluster_disconnect`, the connection log "Connecting cancelled (Disconnect)". Telling the two apart would carry Disconnect's origin to the waiting connect, a mechanism for this one case | +| A second connect of the cluster the window's connect waits for (a second `cluster.connect` from the navigator's section, the palette or an agent; found by another agent on 2026-10-22: it joined the run, no second login, but ended the first connect's wait with `ErrConnectInBackground`, toasted "another cluster was shown" although nothing else was shown) | the first gets a typed "joined" outcome without a toast, `connecting` for agents; the first keeps waiting and both get the run's end | **the first keeps waiting, and the second joins that wait** (`state.connectWait`, [`connect_join.go`](../../internal/engine/connect_join.go)): both answer with the first's answer, connected, failed, in the background once another cluster is shown after all, or cancelled; the second neither ends the first's wait nor counts as a newer connect, and its caller giving up ends only its own wait | The second asks for what the first already does; an agent whose `cluster_connect` waits learns the real end rather than an early `connecting`; no new outcome to name or map | + +Built in [`connect_join.go`](../../internal/engine/connect_join.go) (`windowConnect`: a connect of +the cluster the window's connect waits for joins that wait), [`connect_run.go`](../../internal/engine/connect_run.go) (`ErrConnectCancelled`, +`ErrConnectSuperseded`, `ConnectNotFailed`, `leftRun`: the window's connect that is no longer the +latest when its run ended says closed, cancelled or in the background, never "superseded"; +`tellRunEnd` is skipped when the newer connect showed the same cluster), +[`views.go`](../../internal/engine/views.go) `connect` (replaced before it began), +[`tabs.go`](../../internal/engine/tabs.go) `SelectTab`, [`navscope.go`](../../internal/engine/navscope.go) +`SetNavigatorScope`, [`commands/cluster.go`](../../internal/engine/commands/cluster.go) `connectAnswer` +with [`commands/hotbar.go`](../../internal/engine/commands/hotbar.go), [`mcp/tools.go`](../../internal/mcp/tools.go) +and [`agent/failure.go`](../../internal/agent/failure.go) `failure`, [`fyneui/shell.go`](../../internal/ui/fyneui/shell.go) +`showError` and `autoConnected`. Tests, each failing before the change: +`TestABackgroundConnectIsNoFailureOnEveryPath`, `TestACancelledConnectIsNoFailureOnEveryPath`, +`TestAwaitRunAtTheMomentItsRunEnded`, `TestAConnectReplacedBeforeItBeganSaysWhy`, +`TestAConnectOfTheSameClusterJoinsTheWait` (failing before with the join switched off) and, as a guard, +`TestAFailedConnectStaysAFailureOnEveryPath` (engine); `TestConnectCommandsAnswerABackgroundConnect`, +`TestConnectCommandsAnswerACancel` (commands); `TestConnectOutcomesAreNoFailures` (MCP); +`TestConnectOutcomesThatAreNoFailureRaiseNoToast` (window, the fake engine). **Not verified:** a +real window; the walk's fake plugins on kind against this build. + ## D-98: What holds a Terminating namespace, and Remove finalizers **The owner's wish (walk of 2026-10-19 on v0.26.1, WF43, verbatim):** "ich hatte in der @@ -9653,10 +9815,42 @@ questions stay clickable, not selectable. Tests: `TestChatTextSelectsBlockByBloc ([dark](../../internal/ui/fyneui/testdata/chat_selection_dark.png), [light](../../internal/ui/fyneui/testdata/chat_selection_light.png)). +**Follow by scrolling (2026-10-22, AW14).** The owner's request in his alpha walk +([D-114](#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)), verbatim: "Ich +vergesse immer das Follow-Flag raus zu nehmen wenn ich hoch scrolle. Bekommen wir das automatisiert, +wenn der Nutzer 5-6 Zeilen nach oben scrollt, wird das Follow-Flag entfernt und wenn er wieder runter +scrollt, bis zur aktuellen Zeile im Log, wird Follow wieder aktiviert? Ist er auf der aktuellen Zeile +des Logs und deaktiviert follow über das Flag, bleibt das Log dort einfach stehen (wie heute) und wenn +er irgendwo im Log ist und Follow aktiviert, springt er zur aktuellen Zeile und folgt (wie heute)". +**Built 2026-10-22** (the lead, on the branch `feat/follow-by-scroll-ns-events`; +[`termview/logsfollow.go`](../../internal/ui/fyneui/termview/logsfollow.go), the list's scroller in +`logList`, `Logs.userScrolled`, `Logs.toEnd`). The lead's decisions, open to revision: + +| Question | Options weighed | Chosen | Why | +|---|---|---|---| +| What counts as the user's scroll | (a) the wheel over the lines only (a `Scrolled` handler on the surface); (b) every change of the list's scroll offset that the view did not make itself | **(b)**: the list's own scroller (`container.Scroll`, its `OnScrolled` wrapped) reports every change; the view's own scrolling and layout run "quietly" (`logList.quietly`: the stream's flushes, a jump, a selection's auto-scroll, the rows the scrollback drops, the head row, a resize, a theme change) and are not the user's | (a) would miss the scroll bar: its drag and a click on its track. The wheel, the trackpad (its momentum too), the bar's drag and its track all count; no reflection and no copy of Fyne's scrolling, so the macOS overlay bar still shows while scrolling | +| How far up | five rows; six | **five rows or more above the newest line** (`followOffRows`), rows as the list draws them (a wrapped line's rows each) | The owner's "5-6 Zeilen", its lower end: the first that is plainly deliberate | +| A scroll up by less | snap back at the next lines; stand still with Follow on; keep following that far behind | **keep following, that far behind the newest line** (`Logs.under`): the view moves with every new line, the last few rows below it | Snapping back fights the user: at hundreds of lines a second the view returns every 100 ms, and a wheel's notch on macOS is half a row, so five rows were never reached. Standing still would show Follow ticked on a view that does not move. Follow ticked always means a moving view | +| "At the newest line" | the last row wholly in view; with a tolerance | **the last row at least half in view** (half a row or less below the view's end); a scroll down that ends there turns Follow on and puts the view at the very end | A trackpad seldom stops on the exact pixel; half a row reads as "there" | +| Which way | either way; up to switch off, down to switch on | **off only by a scroll up, on only by a scroll down** | A resize or a shrinking view never decides; the direction is what the user did | +| The stream's own lines while not following | can bring the end into view and switch Follow on; never | **never**: only the user's scroll down switches it on | The owner's "wenn er wieder runter scrollt"; a log that turned Follow on by itself would take the place the user is reading | +| A followed view resized | as before (the end came back at the next lines); kept at the end | **kept at the newest line, or as far behind it as the user scrolled** (`logsRenderer.Layout`) | A quiet log that a smaller dock cut short read as not following; and "behind" must stay what the user made it | +| The checkbox | — | **as before both ways**: unticked the log stands where it is, ticked it jumps to the newest line and follows (and the distance behind it is dropped) | The owner's "wie heute" | +| Keys | Page Up and Down, ⌘↑ and ⌘↓ switch it; none | **none**: the log view has no scrolling keys (its keys go on to the window, above) | Nothing to switch; adding keys is not the request | +| The drawer and the terminal | — | **neither**: every log is a dock logs tab (`termview.Logs`, `logtab.go`); the terminal's scrollback is its own widget (D-14) | — | + +Tests (the first two failing before the change): `TestLogsFollowOffByScrollingUp` (two rows up still +following two rows behind; five rows up off and standing while lines come; a row down far from the end +nothing; down to the end on and following), `TestLogsFollowByTheScrollBar` (the bar's drag up off, to +the end on), `TestLogsFollowCheckboxAsBefore` (unticked at the end stays, a resize there and 10,000 +lines with the scrollback dropping never switch it on, ticked to the end); `TestLogsP5` unchanged +(the slowest batch 5.4 and 6.6 ms in two runs before, 5.0 and 3.1 ms in two after, 10.8 ms once +beside the other selection tests; budget 16 ms). + **What it does not cover:** not tried in a real window: the drag's feel, the auto-scroll's speed, the order in which the desktop driver sends a toast's and its icons' hover events (read in Fyne 2.8.2's source and replayed in the test driver), and the shortcuts a focused log passes on to the -window (the test driver's canvas has no `TypedShortcut`); ⌘A in a toast's or the drawer's text does +window (the test driver's canvas has no `TypedShortcut`); Follow by scrolling (AW14) with a real wheel, a trackpad's momentum and the overlay scroll bar, which the tests drive through Fyne's test driver; ⌘A in a toast's or the drawer's text does nothing (Fyne hands a disabled selectable text only Copy); a selection does not survive the tab's stream opening again (another container, Previous, a Reconnect); the terminal tabs select as their own widget does (D-14). @@ -9923,7 +10117,7 @@ The rule that follows is in [conventions › Dialogs, reviews and status lines]( | The gap after the title's arrow (GW2) | (a) "->"; (b) "›", which Noto Sans has; (c) no space after the arrow; (d) the title as two texts, "Scale Deployment →" and " gate-web" | **(d)** in every dialog whose title names an object: Scale, Drain, Rollback, Debug, Install, the Config Map's and the Secret's save review, Argo CD's Sync and Refresh (`objectDialogTitle`) | Found: the arrow comes from Fyne's symbol font (InterSymbols), which has no space; go-text keeps a space after a glyph in that glyph's font (`ignoreFaceChange`), so it is drawn as the missing glyph, 13.9 points at 14 where Noto Sans's space is 3.6. Every space character is kept so, and Noto Sans has no arrow; (a) to (c) leave D-100's form, (c) runs the arrow into the name | | How a dropdown opens (GW5) | (a), (b), (c) as the lead listed them | **(a)**: over the field, the current entry at the field's place, its text where the field's text is, a check before it; the entries before it above, the rest below; no entry twice ([`selectfield.go`](../../internal/ui/fyneui/selectfield.go)) | The owner's platform does it; (b) still shows the entry twice, (c) changes the list with every choice and hides where the current entry stands | | One widget or a patch per place | Fyne 2.8.2's Select builds its `PopUpMenu` below the field in the unexported `showPopUp`, called from `Tapped` and `TypedKey`; the menu's scroll is unexported and its ↑ ↓ do not scroll, so a list taller than the window cannot be brought to its current entry | **one widget**, `selectField` (`newSelectField`), in all 19 places: it embeds Fyne's Select (the field, its look, `Options`, `Selected`, `SetSelected`, `OnChanged`) and replaces `Tapped` and `TypedKey` with a list of its own in a Fyne pop-up, a row per entry as tall as the field, scrolled so that the current entry still sits at the field when the window has no room (a chart's hundreds of versions) | Embedding keeps every call site's code; the list could not be placed or scrolled through Fyne's menu | -| Keys | — | as Fyne's: Space, ↑ and ↓ open, ← and → step without the list; in the list ↑ ↓, Page Up, Page Down, Home, End, a letter (the next entry starting with it), Return, Enter or Space choose, Escape closes; the field has the keyboard again after | Fyne's keys kept; a letter as a macOS menu takes it | +| Keys | — | as Fyne's: Space, ↑ and ↓ open, ← and → step without the list; in the list ↑ ↓, Page Up, Page Down, Home, End, a letter (the next entry starting with it), Return, Enter or Space choose, Escape closes; the field has the keyboard again after a choice; after Escape it has not since 2026-10-22 (AW2, below) | Fyne's keys kept; a letter as a macOS menu takes it | | What agents see | — | unchanged: a choice reaches the code through `OnChanged` as before, so the same commands and state | AGENTS.md rule 2 | | What else closes the list | — | a click outside it, the field moving or changing its size, the field getting other entries (a chart's versions loaded) | The list would no longer lie over the field or show its entries | | Select entries (an editable field with a list: the create dialogs' names, the time zone, the agent's model) | change them too; leave them | left as they are | An editable field's list stands below it on macOS too (a combo box); the owner's finding is the Select's double | @@ -9939,13 +10133,43 @@ Tests: the engine's `TestDialogFieldHintsAndSliders`, `TestDialogFieldsAreChecke `secret_keys_review_*.png`, `helm_install_preview_dark.png`, `helm_install_preview_origin_dark.png`, `argocd_sync_dialog_dark.png`, `argocd_refresh_dialog_light.png`. +**The owner's AW1 and AW2 (alpha walk of 2026-10-22, v0.38.0, G16), built 2026-10-22** (for the +lead), the lead's decisions, open to revision: + +- AW1: "a closed dropdown field has the background's colour, hard to make out: the Rollback dialog's + 'To revision', Preferences' 'Locale timezone' and 'Update channel' (Dark Cockpit, D-110; a field + needs its own plate or outline)". Found: Fyne's Select draws one rectangle in the input + background, #131a25, which on a dialog's card (#121925) is the card's own colour, and on the stage + (#0d121a) one step off; the time zone is an editable dropdown, Fyne's entry, whose outline (the + input border #263042) stood at 1.33:1 on a card and 1.42:1 on the stage. +- AW2: "Escape closes an open dropdown's list, but the field stays highlighted (focused, blue as + Preferences' Theme in the screenshot); the next Escape goes to it and does nothing, so a mouse + click outside is needed first." Found: the list's Escape closed it and left the field focused (it + took the keyboard at the click that opened the list); Fyne hands a key to the focused widget, and + Fyne's Select ignores Escape. + +| Decision | Options weighed | Chosen | Why | +|---|---|---|---| +| How a closed dropdown reads (AW1) | (a) a plate of its own, the button's colour; (b) the outline Fyne's entry draws; (c) both | **(b)**: `selectField` draws over Fyne's Select the entry's outline, in the input border, the primary colour while it has the keyboard, the disabled colour while disabled (`selectFieldRenderer`, [`selectfield.go`](../../internal/ui/fyneui/selectfield.go)) | A dropdown and the entries beside it in one dialog then look alike, as the time zone and the Theme field in Preferences; a plate alone parts from the card by luminance only, the button's #1a2230 at 1.13:1 on #121925 | +| How strong the outline is | the input border as it was (1.30:1 to 1.49:1 on the surfaces, both themes); a floor of 2:1; WCAG's 3:1 for a control's edge | **2:1** on every surface a field stands on (the stage, the sidebar, the drawer, a dialog's card, a table's header, its own plate): `theme.ColorNameInputBorder` #263042 → **#3e4f6a** dark, #cdd4df → **#a1acbc** light ([`theme.go`](../../internal/ui/fyneui/theme.go)), held by `TestPaletteContrast` | 3:1 draws every field in a bright frame, against the design language's "surfaces part by luminance first, hairlines only where luminance is not enough"; 2:1 reads at a glance in the renders; Fyne's entry, check and radio draw the same token, so the time zone, every text field and every unchecked box read again too: the same fault | +| Which other lines follow the token | the lists' frames, tooltips, cards, the agent's tables, the hotbar's tiles, the alerts pill, a copy icon's frame, the segmented control and the switch's track drew the input border too: raise them with it; keep them | **kept**: a token of their own, `colorHairline` (the old #263042 and #cdd4df), in those 21 places; the agent's input, a field, follows the fields | The finding is the fields'; nothing else was found faint, and a wider change is a look the owner did not ask for | +| What Escape on an open list leaves (AW2) | (a) the field keeps the keyboard and hands the next Escape on; (b) the field gives the keyboard up, no longer drawn focused | **(b)**, and (a) too for a field that has the keyboard otherwise (after a choice, or by Tab): its Escape goes on to the window, a dialog's Cancel or a settings page's close ([D-116](#d-116-escape-closes-the-innermost-thing)) | The owner read the blue as "still open"; macOS's pop-up button shows no ring after Escape unless the keyboard moves through the controls; Return keeps the keyboard there, so Tab goes on from the field | + +Tests (each failing before the change): `TestClosedDropdownHasAnOutline`, `TestPaletteContrast`'s +field outline, `TestEscapeOnAnOpenDropdown`, `TestEscapeOnAnOpenDropdownInPreferences`; +`TestSelectKeys` changed (Escape takes the keyboard off the field). Every render drawn again once, +since the outline is shared chrome: the 523 committed PNGs whose pixels the change moves (a list's +search field, a check, a dropdown, a dialog's fields) updated, among them `rollback_dialog_*.png` and +`preferences_*.png`; a render whose pixels it leaves alone kept as committed. + **What it does not cover:** the "?" takes no keyboard focus: a hint is reached by the pointer, hover or click; Drain's Grace period stays empty at first (its default 0 is left out of the prefill, as before); a single text with a space after the arrow still shows the gap elsewhere (a toast's "8080 → checkout-api:8080", an upgrade's Chart row "web 0.1.0 → 0.2.0", a Secret's "28 B → 27 B"): the same Fyne cause, not changed; an open list closes, not moves, when the window is resized; seen -in offscreen renders and Fyne's test driver only, not yet in a real window; Windows and Linux not -tried. +in offscreen renders and Fyne's test driver only, not yet in a real window (the outline of AW1 and +the Escape of AW2 too); Windows and Linux not tried; the README's showcase pictures (`docs/images`, `make showcase`) are not +drawn again, 28 of the 31 show a field whose outline changed. ## D-105: Reverse video as a state, and a key's modifiers from the key itself @@ -10040,9 +10264,18 @@ Every choice below is the lead's decision (2026-10-20), open to revision. | What the click ends | (a) the shown row and its drawer; (b) also the checked rows (the bulk actions' selection) | **(a)**: `ui.closeDrawer`, so the drawer's row is no longer marked; the checked rows stay ([`tableclick.go`](../../internal/ui/fyneui/tableclick.go)) | The owner decided in A73 that a click on a row keeps the checked rows; a click beside them keeping them too is the same rule. Checked rows are built up one by one for Delete or Restart, and a click below the rows is where one clicks to put the drawer away: (b) would throw them away by accident. The selection bar's Clear and the header's checkbox end them on purpose. Lens's behaviour is not captured | | Where "below the rows" is | the table's own area under its last row; also the gaps between rows | **under the last row, in the table's body** (a short list, or an empty one under its header); the gaps stay Fyne's, which selects nothing there | A gap between two rows is a near miss of a row, not the empty area the owner meant | | Without a drawer | send `ui.closeDrawer` anyway; nothing | **nothing** (`shell.closeDrawer` sends only while one is open) | No command, no audit entry for a click that changes nothing | +| When the click acts (the owner's alpha walk of 2026-10-22, AW12: the drawer closed about 1 s after the click, at once by × and Escape; the lead's decision of 2026-10-22) | (a) close on the press (`MouseDown`, which the driver delivers at once), the table still a `fyne.DoubleTappable`; (b) move the double click to a widget of the header's own; (c) the table counts the header separators' double click itself and is no `fyne.DoubleTappable` | **(c)**: two clicks on the same column's separator within 500 ms fit it (`resourceTable.separatorTapped`, [`tableheader.go`](../../internal/ui/fyneui/tableheader.go), the tab bar's `doubleClickTime` and clock); any other click on the table ends a double click begun there | The cause, verified in Fyne v2.8.2's source: the driver holds every tap on a `fyne.DoubleTappable` for the double-click interval before it calls `Tapped` or `DoubleTapped` (`internal/driver/glfw/window.go`, `mouseClickedHandleTapDoubleTap` and `waitForDoubleTap`; the interval is `NSEvent.doubleClickInterval` on macOS, `driver_darwin.go`, 0.5 s by default, 300 ms elsewhere), and the table was one for the separators' double click; × and Escape never went through it. The owner's "about 1 s" is more than the default hold; what makes up the rest (a longer interval in his settings, the round trip of `ui.closeDrawer`) is not verified. (c) takes the hold off every tap on the table, as the tab bar and the navigator did for theirs, and keeps the release as the moment a click acts. (a) leaves the hold for the next tap the table takes. (b) has no widget to move to: the separators are the gaps between Fyne's header cells, which no header widget covers, and a header cell made a `DoubleTappable` would hold every sort. Rows and headers were not held: their cells take their own taps | +| The window's other held clicks (the lead's follow-up of 2026-10-22: Cogpit's own widgets that are a `fyne.DoubleTappable`; Fyne's own, its Entry and selectable text among them, not surveyed) | for the welcome page's cluster rows (`clusterRow`), whose double click connected as a click does: (a) keep the double tap; (b) drop it and let the row ignore a second click within 500 ms; (c) drop it and let the page connect a cluster whose connect is under way no second time | **(c)**: the row takes clicks only ([`clusterrow.go`](../../internal/ui/fyneui/clusterrow.go)); `welcomePage.connect` ([`welcome.go`](../../internal/ui/fyneui/welcome.go)) does nothing for a cluster whose connect the page began and that has not returned (`pending`, set before the login program's review or the dispatch, cleared by the engine's answer or a declined review) or that the window shows connecting (begun elsewhere: the navigator, an agent); the menu's Connect goes through the same. **Left held:** the sync picker's rows (`fsRow`, [`syncpicker.go`](../../internal/ui/fyneui/syncpicker.go): a click selects, a double click opens a folder or syncs a file) and the log tab's head row (`logSurface`, [`termview/logselect.go`](../../internal/ui/fyneui/termview/logselect.go): "Load older lines" acts on a click, the surface's double click selects a word); the YAML editor and the terminal focus on the press (`MouseDown`), so their held `Tapped` changes nothing that shows | (a) holds every click 0.5 s. (b) misses the second click of a double click: the page rebuilds its rows as soon as the window shows the cluster connecting (the connection is in the page's signature), and the second click lands on a new row. Without a guard a second click sends a second `cluster.connect`, which joins the run under way (the engine reuses `st.runs[name]`, no second login) but ends the first one's wait with `errConnectInBackground`, a toast that names another cluster ("…: another cluster was shown; the connect goes on in the background"); on a login program not allowed yet it opens a second review. Read in the engine's code, not run against it; the guard keeps both from happening. `fsRow` and `logSurface` keep a double click that does something their click does not, and what waits there is rare (a choice in a dialog, loading older lines); the sync picker re-renders its rows at a click, so a count of its own would live in the picker, not the row | Tests: `TestClickBelowTheRowsClosesTheDrawer` (the drawer closes through `ui.closeDrawer`, the checked -row stays, the header and the last row are not below the rows, a full list has no such area). +row stays, the header and the last row are not below the rows, a full list has no such area); +`TestListClicksAreNotHeld` (AW12: a click on a row, a header, a header separator and below the rows +reaches an object that is no `fyne.DoubleTappable`, found as Fyne's driver finds it; failing before +the change), `TestDoubleClickSeparatorFitsColumn` (one click, two clicks 500 ms apart and a double +click between body cells fit nothing); `TestWelcomeRowConnectsOnce` (a welcome row's click reaches a +row that is no `fyne.DoubleTappable`; a second click before the engine answered, on the row +rebuilt while connecting, on a cluster the window shows connecting and on a login program's review +connects or reviews no second time; failing before the change, and without the page's guard). **GW3, ⌘F in the dock's editor tabs** @@ -10077,7 +10310,7 @@ opened by ⌘F, [dark](../../internal/ui/fyneui/testdata/edit_find_dark.png), | The command | one `ui.tab.move` with a place; also left and right | **`ui.tab.move` {id (empty: the active tab), index from 1}**, "Move Tab", `DangerUI`; and **`ui.tab.moveLeft`, `ui.tab.moveRight`** for the keyboard | The order is UI state, so every way of moving goes through a command agents see; `index` is the bar's place as `ui.tab.select`'s is. Left and right are commands of their own as next and previous are, so that a menu item carries the registry's label and shortcut | | Which places count | (a) the place among every tab; (b) among the tabs the bar shows | **(b)**: among the shown cluster's tabs (`TabsShown`, GW11); the tab goes right before the shown tab that is to follow it, or right after the last shown one, so the other clusters' hidden tabs keep their places among the rest; a tab the bar does not show is refused | What the user drags is what the bar shows; an agent's `index` means what `ui.tab.select`'s does | | The keyboard | none; a menu item; a key | **View › Move Tab Left and Right, ⌘⌥⇧← and ⌘⌥⇧→** (Ctrl+Alt+Shift off macOS), greyed with the reason at the bar's ends | Cheap beside ⌘⌥← and ⌘⌥→ (previous and next tab), the same keys with ⇧; they reach a tab beyond the bar's visible part, which the drag does not (below). The keys are not Lens's (not captured) | -| The dock | the tab bar only; the dock's too | **the dock's too**, by its own `dock.move` {id, index among the tabs the dock shows}, the same drag; no keys (the dock has no keyboard tab commands to pair them with) | The lead's detail of the finding; one strip behaviour in the window. The dock's tabs are not kept across a restart (D-41), so neither is their order | +| The dock | the tab bar only; the dock's too | **the dock's too**, by its own `dock.move` {id, index among the tabs the dock shows}, the same drag; no keys (the dock has no keyboard tab commands to pair them with); **since 2026-10-22 the keys too** (the owner's AW10, below) | The lead's detail of the finding; one strip behaviour in the window. The dock's tabs are not kept across a restart (D-41), so neither is their order | | What survives a restart | — | the tab bar's order, with the tabs (`workspace.json` keeps them in their order; `TestMovedTabsSurviveARestart`) | Restored where tabs are restored, as the finding asks | | How the drag looks | (a) the hotbar's ghost over the window; (b) the tab itself carried along the bar | **(b)**: past `minTileDrag` the tab follows the pointer in the bar's line, held where it was grabbed, raised as the active tab with a drop shadow, drawn over the others; the others slide aside (`tileSlide`, eased out) to leave the gap a drop fills; the drop sends the command and the tab glides into its slot; Reduce motion jumps | The hotbar's live movement and drop position (D-83), turned sideways; a tab bar is one row, so a card over the window would only cover the views | | The drop position | the hotbar's fixed pitch; the tabs' own widths | **the slot whose left edge, counted over the other tabs' own widths, is nearest the carried tab's**, fixed for the drag | Tabs differ in width; computed from the widths, not from where the others are drawn, a tab sliding away never flips the choice back | @@ -10093,6 +10326,27 @@ a tab carried, [dark](../../internal/ui/fyneui/testdata/tabbar_drag_dark.png), [dark](../../internal/ui/fyneui/testdata/tabbar_moved_dark.png), [light](../../internal/ui/fyneui/testdata/tabbar_moved_light.png). +**AW10, ⌘⌥⇧← and ⌘⌥⇧→ in the dock** (the owner's alpha walk of 2026-10-22, [G16](../parity/gaps.md#g16-stability-and-the-user-bug-backlog): +the keys "do nothing in the dock"; they moved only the tab bar's active tab. Expected, the lead's +reading: the keys move the active tab of the bar that has the focus.) Built 2026-10-22 +([`engine/tabmove.go`](../../internal/engine/tabmove.go), [`commands/tabmove.go`](../../internal/engine/commands/tabmove.go), +[`tabmovekeys.go`](../../internal/ui/fyneui/tabmovekeys.go)); the lead's decisions, open to revision: + +| Decision | Options weighed | Chosen | Why | +|---|---|---|---| +| The command's shape | (a) `ui.tab.moveLeft` and `ui.tab.moveRight` with an optional `dock`; (b) the same with the id of either bar's tab; (c) `dock.moveLeft` and `dock.moveRight` of their own | **(a)**: `{dock: true}` steps the dock's active tab among the tabs the dock shows (`Session.StepDockTab`, greyed with the reason at the dock's ends, "the tab is the first in the dock"); without it the tab bar's, as before | One key is one command, so one menu item carries the registry's label and shortcut; (c) would need two items on one key. The window passes the bar it means, and an agent names it the same way; (b) would make the tab ids of the two bars a namespace they never were | +| Which bar the keys move | (a) the dock's while the focused widget lies in the dock, else the tab bar's; (b) as (a), and with nothing focused the bar whose tab was clicked last | **(b)**: the dock's while the focused widget lies in it (its tab's terminal, editor, log, a find bar's field, the strip's switch); with nothing focused the bar whose tab was clicked last, the tab bar's once its tabs were switched by the keys (⌘⌥→, ⌘⌥←, ⌘1–⌘9); else the tab bar's (`shell.stepTab`, `keysInDock`) | A click on a tab takes the focus away in Fyne. Since [D-115](#d-115-a-dock-tab-the-user-opens-takes-the-keys) (the same day) a click on a dock tab gives its editor, terminal or log the keys, which (a) covers; the click's memory stays for a tab that takes no keys (the Audit Log, the Diagnostics, a job's progress, an Edit tab's review) or not yet (a session still opening), where the click leaves the keys nowhere and (a) would move the tab bar's tab: AW10 again. The focus decides first: with the keys in the dock, ⌘⌥→ leaves them there and Move Tab stays the dock's (rechecked on the tree with D-115, 2026-10-22). ⌘F goes by the focus alone (GW3) because its "nowhere" case is the open editor tab's; here "nowhere" has two bars to choose from | +| A focused terminal or editor | — | the keys reach the menu item from any focus: main-menu items run before the focused widget is offered the key (AppKit's key equivalents on macOS; Fyne's main-menu lookup on Windows and Linux, read in Fyne 2.8's `glfw/window.go`); a terminal does not swallow them | Checked in the source, not in a real window | +| At a bar's end | — | nothing is sent, as before | As the tab bar's | + +**Gaps:** a drag alone does not make the keys the dock's (a click does); a dock tab clicked, then a +widget outside the dock focused and the focus taken away by a click on a place that takes none, and +the keys move the dock's tab. Tests: `TestDockStep` (engine), `TestTabMoveCommands` (the dock's +steps, its ends, the tab bar untouched), `TestMoveTabKeysMoveTheDocksTab` (the keys in the dock's +editor, after a click on the Edit tab, which gives its editor the keys, in the list's search, after a +click on the bar's tab, after a click on the Audit Log, which takes none, after ⌘⌥→ with nothing +focused and with the keys in the editor), `TestDispatchedParamsMatchTheRegistry`. + **GW9, a deleted namespace in the namespace filter** ([`nsgone.go`](../../internal/ui/fyneui/nsgone.go), [`nsfilter.go`](../../internal/ui/fyneui/nsfilter.go)) The owner's choice stands as he made it (2026-10-20, "Das wäre recht simpel und führt jetzt nicht zu @@ -10105,7 +10359,7 @@ notice line, no "Remove from filter", no automatic removal. | Colour alone or a word too | red only, as the owner said; red and the state after the name | **red and the state**: "cogpit-gate · deleted", "orders · terminating", both in the status error colour (`colorStatusError`, a crashing pod's) | A mark that rests on colour alone is lost to a colour-blind user and asks "why red?"; a word in the row is no button and no logic | | The filter's button | unchanged; red | **red label and arrow while a namespace it names is deleted or terminating**, one or several alike (a theme override on the button, `nsTintTheme`) | The owner's case was a closed filter reading "cogpit-gate" over an empty list: the button is where he looked. No tooltip, no text change: nothing beyond the colour he chose | | Where gone and going come from | the API server; the cache's namespaces through `resources.list`; a new engine field | **the cache through `resources.list`**, as the list's names already came: a row whose status is `terminating` (the namespace's phase or its deletion time), a name the filter holds that the list lacks is deleted | Cache first, no new engine state: the mark is how the window shows data agents read the same way. Nothing is marked while the user may not list namespaces (`namespacesListable`), or before the shown cluster's names are read (`nsFor`), since nothing is known | -| When it is read | at the filter's opening only; on a timer; when the view's rows change | **at the cluster's showing and every opening (as before), and while the filter names namespaces after the view's rows changed, at most every 2 s** (`shell.recheckNamespaces`; a change within the 2 s is read once they are over) | Deleting a namespace deletes its objects, which changes the rows of every view filtered to it, so the button turns red with no click; a timer would poll what nothing changed. **Gap:** a namespace that goes while no row of the view changes (a filter to a namespace without objects of the kind in a quiet cluster) reads red at the filter's next opening or the next change of the rows | +| When it is read | at the filter's opening only; on a timer; when the view's rows change | **at the cluster's showing and every opening (as before), and while the filter names namespaces after the view's rows changed, at most every 2 s** (`shell.recheckNamespaces`; a change within the 2 s is read once they are over) | Deleting a namespace deletes its objects, which changes the rows of every view filtered to it, so the button turns red with no click; a timer would poll what nothing changed. **Gap:** a namespace that goes while no row of the view changes (a filter to a namespace without objects of the kind in a quiet cluster) reads red at the filter's next opening or the next change of the rows. **Replaced 2026-10-22 (AW11, below):** the owner met the gap; the namespaces' own changes read them again, the rows no longer do | | Untick of a deleted one | — | **`ui.setNamespace` without it**, as any untick; the open list is made again when what it offers changed, keeping the typed text and the keyboard | The owner's "leaves the selection and the list", through the engine so agents see it | **The side finding, verified and fixed.** The filter's list came from one `resources.list` without @@ -10127,10 +10381,44 @@ and a terminating namespace selected, another terminating one not, the button re [dark](../../internal/ui/fyneui/testdata/namespace_filter_gone_dark.png), [light](../../internal/ui/fyneui/testdata/namespace_filter_gone_light.png). +**AW11, a deleted namespace noticed late** (the owner's alpha walk of 2026-10-22 on v0.38.0, the +staging cluster; [G16](../parity/gaps.md#g16-stability-and-the-user-bug-backlog)). Seen: after +`kubectl delete ns walk-gw9 --wait=false` (the namespace held Terminating by a ConfigMap's finalizer, +no pods in it), the Pods view filtered to walk-gw9 ("0 of 223 items") turned the filter's button red +only "sehr viel später", and no terminating state showed before. Cause, read in the code (not +reproduced on the cluster): GW9's gap above. The window read the namespaces again only when the +view's rows changed (`shell.recheckNamespaces` after `EventTable`) or when the filter opened; no +row of a Pods view filtered to a namespace without pods changes when the namespace goes. **Built +2026-10-22** (the lead, on the branch `feat/follow-by-scroll-ns-events`): the engine watches the +namespaces and tells the window ([`engine/nswatch.go`](../../internal/engine/nswatch.go), `EventNamespaces`; +`shell.namespacesChanged` in [`nsgone.go`](../../internal/ui/fyneui/nsgone.go)); the rows read +nothing any more, `recheckNamespaces` and its timer are gone. The lead's decisions, open to +revision: + +| Question | Options weighed | Chosen | Why | +|---|---|---|---| +| What tells the window | (a) the view's rows, as before; (b) a timer; (c) the namespaces' own watch events from the cache | **(c)**: a new engine event, `EventNamespaces` (`View` the context), which the window answers by reading the namespaces again through `resources.list` | Cache first: the namespace informer's events are the fact; the rows were a proxy that misses a namespace without the view's objects, and a timer polls what nothing changed | +| When the engine watches | (a) for the life of every connection; (b) while the shown cluster's namespace filter names namespaces | **(b)**: one handle on the namespaces (shared through the cache with the filter's own reads and the access reviews'), taken when a filter names namespaces, given back when it is cleared or another cluster is shown | Then a namespace's state shows (the filter's button); (a) would hold a watch on every connected cluster for marks nobody sees, and add a list and a watch to every connect. The open list's marks of namespaces the filter does not name are read at its opening, as before | +| Which changes send it | every watch event; names and terminating ones changed | **a namespace added or deleted, or one beginning or ending terminating** (its deletion time or its phase, as its row's status reads it); a label or a condition the namespace controller writes sends none | Only these change the filter's marks; the controller writes conditions on a stuck namespace several times | +| How often | each change; coalesced | **at most one per 500 ms** (five snapshot intervals, `nsWatchCoalesce`), the first at once | Each event has the window read every namespace; 300 namespaces created at once send a few events (`TestNamespaceEventsCoalesced`), within the budget of 1,000 watch events a second | +| A user who may not list namespaces | try and let the API server refuse; ask the access reviews | **the access reviews**: the watch starts only once `Backend.Listable` says the user may list namespaces, nothing is listed while they are out (their answer is read from memory as it lands, never asked of the API server); a list the API server refuses all the same ends the watch until `cluster.refreshAccess` or the next connect, as the custom kinds' watch does | Nothing waits on the watch, so a refusal costs no view (a related-objects index once left such users' views waiting); a refused list retried on client-go's backoff would hammer the API server for nothing | +| What the button shows for a Terminating namespace | — | as GW9 built it: **red** (label and arrow) as soon as a namespace it names begins terminating, red still once it is gone; the open list says "· terminating", then "· deleted" | Checked in the code (`filterNamesGone` counts both); what the owner missed was the read, not the mark | + +Tests (each failing before the change): `TestNamespaceEventsWhileFiltered` (the owner's case: +walk-gw9 without pods, Terminating, then gone, an event each; a label none), +`TestNamespaceEventsCoalesced`, `TestNamespaceWatchOnlyWhileFiltered`, +`TestNamespaceWatchOfANamespaceLimitedUser` (rules for pods in team-a only: the view loads, no list +or watch of the namespaces, no event), `TestNamespaceWatchWaitsForTheAccessAnswer`, +`TestNamespaceWatchEndsAtARefusal` (engine); `TestNamespaceDeletedWhileFiltered` rewritten (window: +red at Terminating and once gone with no row changed, the rows and another cluster's event read +nothing). **Not verified:** on a real cluster (Docker was down: no kind run), nor in the owner's +window; a user whose access reviews fail (`no more until refreshed`) gets no watch, so for them a +namespace that goes reads red at the filter's next opening, as before. + **Not verified in a real window**, for any of the four: the drag's feel with the GL driver and a trackpad, ⌘F and ⌘⌥⇧←/→ through AppKit's key equivalents, the red filter button on the owner's -display. A namespace that goes while no row of a view filtered to it changes reads red only at the -filter's next opening (GW9's gap above). +display. A namespace that goes while no row of a view filtered to it changes read red only at the +filter's next opening (GW9's gap above) until AW11's fix of 2026-10-22. ## D-107: The navigator slides, and Reduce motion @@ -10652,7 +10940,9 @@ operator writing `report.os.eosl` on a live cluster is not checked (its source w ## D-114: The alpha walk's decisions: a failed connect's page and its stages -**Status: decided by the owner 2026-10-22, not built.** His walk of v0.38.0 on the staging cluster +**Status: decided by the owner 2026-10-22; AW17 and AW13 built 2026-10-22 on the branch +`feat/failed-connect-page` (AW18 fixed with them), AW7 ([D-85](#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion)) +and AW14 ([D-99](#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts)) built 2026-10-22 on branches of their own.** His walk of v0.38.0 on the staging cluster (the re-walk of every fix that touches the [alpha gate](../parity/roadmap.md#alpha-gate), passed; its findings AW1–AW19 in [G16](../parity/gaps.md#g16-stability-and-the-user-bug-backlog)). Four of them are his decisions; the rest wait as findings. @@ -10685,23 +10975,85 @@ falls es mal zu einem Fehler kommt." To build: marked, the ones after it not reached; - the same stages in Connection Updates ([D-66](#d-66-the-connection-log)) for every connect. -The lead's details, settled at build and recorded here then (D-74): the error line shortened to its -cause with the full chain in the log; a credential plugin's login as a stage of its own; what DNS -and TCP mean behind a proxy (the kubeconfig's `proxy-url`, `HTTPS_PROXY`); DNS and TCP as Cogpit's -own probe of the server's address before client-go's request, reading nothing from the cluster. +**Built 2026-10-22** (branch `feat/failed-connect-page`). The cluster layer measures every connect +in stages ([`cluster/connectstages.go`](../../internal/cluster/connectstages.go)): **kubeconfig** +(the file, the context and its entries load and the client is built from them: certificate and key +files read, a credential plugin allowed), **login** (a credential plugin's run, only for a context +that has one), **dns**, **tcp**, **tls** and **api** (the API server's answer to `GET /version`, +the login accepted or not), each with its result (ok, failed, not reached, skipped, cancelled), a +sentence and its time; the failed one carries the cause, every one after it is not reached. They +reach the connection log through `Options.Trace` (one `ConnectStep` named `stages` at the connect's +end) and the window through the `*ConnectError` (`cluster.StagesOf`); a failure before the cluster +layer runs (no source offers the context, Cogpit's proxy for it not a URL) gets the kubeconfig +stage failed and the rest not reached (`cluster.ConfigStages`, `engine.withConfigStages`). The +engine keeps them in the attempt ([`engine/connectfailure.go`](../../internal/engine/connectfailure.go): +`ConnectAttempt.Stages`, a `stage` record each in the context's file, read back after a restart) +and, after the shown cluster's connect failed, in `UIState.ConnectFailure` (context, time, stages), +with `Connection.Error` the failure's cause in a sentence; `syncWelcome` shows no welcome page then +(only for a failure without a context to name), whether or not a tab is open. The window's error +page ([`fyneui/errorpage.go`](../../internal/ui/fyneui/errorpage.go)) draws it over the workspace as +the welcome page lies there, in its look; Connection Updates shows each connect's stages under its +header and copies them ([`fyneui/connectstages.go`](../../internal/ui/fyneui/connectstages.go)). +AW18, the clipped "Could not" at the navigator's right edge, reproduced in a test before the change +(the view's placeholder line spanned x 128 to 1601 of a view from 289 to 1440, the navigator drawn +before it): the view no longer says the failure (its page does), and its placeholder line fits the +view with an ellipsis ([`fyneui/placeholder_layout.go`](../../internal/ui/fyneui/placeholder_layout.go)). +Tests: `TestConnectStagesOfAConnectThatWorks`, `TestConnectStagesNameTheAddressesOfTheLookup` (a +resolver of the test's own over an in-memory pipe), `TestConnectStagesOfAFailure` (a client +certificate gone, a lookup that fails, a closed port, an unknown authority, a rejected login), +`TestConnectStagesBehindAProxy`, `TestConfigStages` (cluster); `TestARestoreThatFailsShowsTheErrorPage`, +`TestConnectLogKeepsTheStages`, `TestAFailureBeforeConnectHasItsStages`, `TestWelcomeOverAFailedConnect`, +`TestWelcomeFollowsTheConnectionAndTheTabs` (engine); `TestARestoredFailedConnectShowsTheErrorPage`, +`TestAFailedConnectStaysOnItsCluster` (the window's fake engine now derives the welcome page as the +engine does where the connection changes: before, it never did, and the test passed over the bug), +`TestWelcomeShowsAFailedConnect` (a real engine), `TestTheErrorPageWraps`, +`TestThePlaceholderStaysInsideTheView`, `TestConnectLogDialogShowsTheStages`, `TestStageMarks` +(window); PNGs: the page after the failed restore +([dark](../../internal/ui/fyneui/testdata/connect_failed_page_dark.png), +[light](../../internal/ui/fyneui/testdata/connect_failed_page_light.png)), a failed login with +another cluster connected behind it ([dark](../../internal/ui/fyneui/testdata/connect_failed_stays_dark.png), +[light](../../internal/ui/fyneui/testdata/connect_failed_stays_light.png)), Connection Updates with +the stages ([dark](../../internal/ui/fyneui/testdata/connection_updates_stages_dark.png)). + +**The lead's details (D-74), settled at build, open to revision:** + +| Question | Options weighed | Chosen | Why | +|---|---|---|---| +| How DNS and TCP are measured | client-go's own first request, traced with `net/http/httptrace` (its lookup, its dials, its handshake); Cogpit's own probe (`net.Resolver`, `net.Dialer`) of the server's address before client-go's request (this decision's draft, above until the build) | **client-go's own request**: `checkReachable` hands `GET /version` a context with an `httptrace.ClientTrace`; the connection's dialer (connrotation over `net.Dialer`) passes it on, so Go's own hooks report the name looked up and its addresses, each address dialled and how it ended, and the handshake | No connection or lookup of Cogpit's own: the stages are what client-go actually did (its resolver, the address it chose, its timeouts). Behind a proxy the dial goes to the proxy, and the stages say so ("the proxy … at 10.1.1.1:3128 reached", "the proxy resolves api.example.com"), where a probe would have to bypass the proxy (a direct connection attempt the user's network may not expect, and the API server's name sent to the local resolver) or be skipped. Verified in the code: the hooks fire through Cogpit's dialer and the test's resolver (`TestConnectStagesNameTheAddressesOfTheLookup`) and through a proxy (`TestConnectStagesBehindAProxy`) | +| A credential plugin's login | a stage of its own where it runs, after the kubeconfig and before DNS; part of the API server's stage, in the owner's order literally; a stage of its own after TLS | **its own stage, second**, "Login by the credential plugin", only for a context with a plugin; a static login (certificate, token) is the API server stage's "the login accepted" or its 401 | client-go runs the plugin in its round tripper before it dials: a plugin that fails leaves DNS and TCP not reached, which reads true only when the login stands before them. A plugin that returns a client certificate runs inside the TLS handshake (client-go's certificate callback): its run is still the login stage, its time also inside the TLS stage's | +| The error line | the whole chain, as built; the failed stage's sentence as the connection's error, the chain in the log; a second field for the short form | **the failed stage's sentence**: `Connection.Error` (ui_state, `cluster.connect`'s result) is the cause ("the client certificate file /Users/…/client.crt does not exist"); the whole chain stays the attempt's last ERROR line in the connection log (D-66) and `cluster.connect`'s Go error | The owner read the raw chain as noise (AW17); the log already holds the error picture. A kubeconfig client-go finds invalid is said plainly: each missing or unreadable file by its role (client certificate, client key, certificate authority) and its path, its other problems as client-go words them, at most three | +| Secrets in the stages | — | a stage names files, hosts, addresses, the certificate check and a plugin's program, never a token, a key, a password or a plugin's output; error texts pass the URL sanitiser (no user information, query or fragment), and the user entry's secrets, the kubeconfig's and Cogpit's proxy passwords are replaced by ••• | AGENTS.md rule 9; `TestConnectStagesBehindAProxy` checks a refused proxy's password, every stage test the token | +| The page's look | a card on the welcome page (option (c), not chosen); the welcome page's look | **the welcome page's stage**: the logo on its glow, the horizon, the column; the heading "Could not connect to " and "This is an error page: …"; a coral bracket "error · " over the cause; a cyan bracket "the connect · n stages" over the stages on a plate, each a glyph in its result's status token (a tick, a cross, a ring for not reached, a dash for skipped) with its name, its sentence and its time; Connect Again (primary, the welcome page's connect with a plugin's review) and Show Connection Updates; when it was tried | The owner's words; the design language's brackets and status tokens, never colour alone (principle 7). Every text wraps to the column inside the workspace's scroll, so that nothing draws over the navigator (AW18) | +| When it shows | — | the shown cluster's connect failed (`Connection.State` error with a context), the restore's or a click's, whether or not a tab is open; the welcome page only without a chosen cluster, and for a failure without a context to name; it goes when another cluster is shown or the connect is tried again | The owner's (b). D-97 (the window stays on the failed cluster) and GW13 (no tab of a cluster without a connection) hold: the page covers the workspace, the tabs stay hidden | +| Help › Welcome over the error page | nothing happens (the welcome page "shows already" without a connection); refused with a reason; the welcome page, the failed cluster left disconnected | **the welcome page**: `ui.welcome.open` leaves the failed cluster `Disconnected` with its context kept, as Disconnect leaves a cluster; its failure goes, its log and the navigator's red dot stay | A menu item that does nothing reads as broken; Disconnect's state is the welcome page's already; Connect Again on its row (Recent) tries again and shows the page again if it fails | +| D-97's placeholder in the view | keep it under the page; drop it | **dropped**: the view under the page says "Not connected." only; Connect Again and Show Connection Updates are the page's | The page is what shows; the placeholder's long line was AW18's cause | +| Connection Updates | the stages as lines among the others; as a block | **a block under each connect's header**, above its lines, on a plate; Copy writes "Stages:" and a line each | The owner asked for the same sequence there; the lines stay the detail | + +**Not verified:** a real cluster's stages (only fake API servers on loopback, the testkit's +forward proxy, a resolver of the test's own); a real credential plugin's login stage (Pinniped, +kubelogin); a SOCKS proxy; several addresses of one name tried in turn (Happy Eyeballs); the DNS +test's resolver hook on Windows (Go's resolver takes a `Dial` with `PreferGo` there too, by its +source; not run here); the page in a real window. **AW7, the dialogs' Context row.** Its second line, the kubeconfig file's label in brackets ("[kubernetes_configs/wds18-k8s-stage]", the synced folder's name and the file's, D-28), read to him as a relative path. After the explanation: "der Pfad ist vielleicht zu lange. Dann lass es gerne in dem Format wie es ist, aber grau wäre top." To build: the label as it is, in the grey of the Object row's kind word ("Pod"), in every dialog's Context row -([D-85](#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion)). +([D-85](#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion)). **Built +2026-10-22**: the id as it is and wrapped as before, the part from "[" on in the grey, in every +Context row `placeRows` draws; the lead's details in D-85. **AW13, the welcome page's "Other clusters".** "dass ich auf der Welcome-Seite keine 'other Cluster' Sektion mehr haben will." To build: the group goes ([D-57](#d-57-choosing-a-cluster)); the lead's detail (open to revision): on a first start, with no hotbar tile and no recent cluster, the same list titled "Your clusters" stays, else the page offers -nothing to connect. +nothing to connect. **Built 2026-10-22** with AW17 (`welcomePage.groups`, +[`fyneui/welcome.go`](../../internal/ui/fyneui/welcome.go)): the hotbar's group and Recent only, the +navigator's section beside the page listing every cluster; "Your clusters" (up to eight, the +kubeconfig's current one first) only when neither has a row. Tests: `TestTheWelcomePageHasNoOtherClusters`, +`TestWelcomePageOverTheEngine`; PNGs: [a first start](../../internal/ui/fyneui/testdata/welcome_first_start_dark.png), +[the start with restored tabs](../../internal/ui/fyneui/testdata/start_restored_dark.png) (Recent alone). **AW14, Follow by scrolling** (verbatim): "Ich vergesse immer das Follow-Flag raus zu nehmen wenn ich hoch scrolle. Bekommen wir das automatisiert, wenn der Nutzer 5-6 Zeilen nach oben scrollt, wird das @@ -10711,7 +11063,9 @@ bleibt das Log dort einfach stehen (wie heute) und wenn er irgendwo im Log ist u springt er zur aktuellen Zeile und folgt (wie heute)". To build: scrolling up by about five or six lines switches Follow off, scrolling down to the newest line switches it on; the checkbox keeps today's behaviour both ways ([D-99](#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts): a drag that -selects already switches Follow off). +selects already switches Follow off). **Built 2026-10-22** on a branch, the lead's details in +[D-99](#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts) (five rows up off, a smaller +scroll keeps following that far behind, back at the newest line on, the scroll bar too). ## D-115: A dock tab the user opens takes the keys @@ -10760,11 +11114,81 @@ resource tab opened from the window, its editor with the caret, [dark](../../internal/ui/fyneui/testdata/create_dark.png), [light](../../internal/ui/fyneui/testdata/create_light.png). +## D-116: Escape closes the innermost thing + +**The owner's findings (alpha walk of 2026-10-22, v0.38.0, [G16](../parity/gaps.md#g16-stability-and-the-user-bug-backlog)):** +- AW3: "Escape does not cancel the Helm Rollback confirmation; instead the drawer behind it closes. + Expected: Escape = Cancel on every dialog, the drawer untouched." +- AW4: "Escape leaves neither search mode: not the dock editor's find bar (Helm Upgrade tab) and not + the list's search (Pods, ⌘F). Expected: Escape closes the search." +- AW19: "the Connection Updates window does not close with Escape." +- AW2, the dropdown's Escape, is [D-104](#d-104-dialog-fields-their-hints-and-dropdowns-the-gate-walks-gw2-gw5-gw6)'s. + +**Found:** the window's Escape (`installShortcuts`) knew the palette, the notifications, a settings +page and the drawer, nothing else: over a dialog nothing had the keyboard, so the window's handler +closed the drawer behind it (AW3) or, without a drawer, did nothing (AW19); no dialog, Cogpit's +`dialogFrame` or Fyne's, had an Escape of its own. Fyne hands a key to the widget that has the +keyboard and calls the window's handler only while none has (2.8.2's `processKeyPressed`): a field, +a check, a slider or a dropdown that took the keyboard by a click kept every Escape for nothing, and +the list's search and the find bar's field are `searchEntry`s that handed it to Fyne's entry, which +ignores it (AW4). D-57's "Any other search: Escape clears and closes it" was written for the +navigator's searches and held there (`navSearchEntry`); it was read as a rule for every search, and +nothing built it for the others. + +**The rule** (the lead's, D-74, open to revision): Escape closes the innermost thing open, and only +that, outermost last: +1. what has the keyboard, where it closes something of its own: an open dropdown's list (its field + gives the keyboard up, D-104), a find bar, a search, the command palette's filter, a menu; +2. the window's top overlay: a dialog as its Cancel (Close for a dialog without one), a pop-up, the + palette, the notifications, the MCP details; +3. a settings page, then the drawer, as before. + +**Built 2026-10-22** (for the lead), the lead's decisions, open to revision: + +| Decision | Options weighed | Chosen | Why | +|---|---|---|---| +| One mechanism or one per dialog | (a) every dialog its own Escape; (b) the window's Escape asks the top overlay first, and the widgets that take the keyboard hand an Escape they do not use on to the window | **(b)** ([`escape.go`](../../internal/ui/fyneui/escape.go)): every overlay registers what Escape does over it as it shows (`onEscape`, `onShown`), the window's `escape` runs the top one's; a Fyne dialog is shown with `sh.showDialog`, Escape its `Dismiss`; a `dialogFrame` hides; the palette, the notifications, the MCP details, a menu of the top bar, the status filter, the namespace filter, the column list, the Create tab's templates, the chat's history and a dropdown's list register their close | One place says what Escape does; with (a) each of the 26 Fyne dialogs and 9 framed ones would have needed a key handler Fyne's dialogs cannot take. `TestEveryDialogTakesEscape` reads the sources and fails on a Fyne dialog shown otherwise or a pop-up without `onShown` | +| An overlay nothing registered | (a) the window's order as before; (b) Escape does nothing | **(b)** | (a) is AW3: the drawer behind a dialog closed. A Fyne pop-up menu has the keyboard and closes on Escape itself | +| What Escape over a dialog answers | — | **Cancel**: a framed dialog hides, and its `SetOnClosed` answers no, as for every way it closes (a confirmation's `reply(false)`, the install review's `finish(false)`); a Fyne dialog's `Dismiss` calls back false (a file dialog nil); a dialog without Cancel closes (About, Connection Updates, Helm Repositories, Kubeconfig Sources); the integrations question's close is its Later, its warning's its No; "No clusters found"'s Keep Syncing | The owner's "Escape = Cancel on every dialog"; nothing reaches a cluster without the confirm button | +| A dialog whose Cancel drops what was typed (a create dialog's fields, Scale's count, a Secret's values, a sync path) | (a) Escape = Cancel as everywhere; (b) Escape only while nothing was typed; (c) ask before dropping | **(a)** | The owner's expectation, stated for every dialog; (b) makes the key's effect hang on a state the dialog does not show; (c) puts a dialog over a dialog for a few fields typed again in seconds; nothing is sent | +| The widgets that hand Escape on | every focusable in every dialog; Cogpit's own only | the fields of Cogpit's dialogs: `fieldEntry`, `fieldSelectEntry`, `fieldCheck`, `fieldSlider` (escape.go) in the parameter, create, Debug, port forward and Sync Files dialogs, the integrations question's check and Argo CD's Prune; a Secret's value (`secretEntry`); the dropdown everywhere (`selectField`); Cogpit's selectable texts did already | Fyne's widgets keep a key they do not use; only a type of Cogpit's can pass it on, so each such field is one | +| The list's search (⌘F) | (a) cleared and left, the table gets the keys; (b) left with its filter kept; (c) the first Escape clears, the next leaves (D-57's ⌘P search) | **(a)**: the text cleared (the empty filter sent, as typing it away sends it), the table focused; the next Escape, in the table, closes the drawer (`searchEntry`, [`searchkeys.go`](../../internal/ui/fyneui/searchkeys.go)) | The search is always shown, so to close it is to end its filter; the navigator's searches clear and close (D-57); (b) leaves a filtered list one more step from the owner's "closes the search"; (c) asks two Escapes for one intent | +| The logs tab's search and Argo CD's activity filter | as the list's; unchanged | cleared and left, nothing gets the keys (neither has a list that takes them) | The same searches | +| The find bar (Edit, Create, Helm Upgrade and Helm Install tabs) | close from its find field only; from both fields and the editor | closes from its find field, its replace field and the editor while it is open, the editor gets the keys, the find text stays for the next ⌘F; in the editor the bar goes before a selection (a match it found is one) (`yamlview`'s `OnEscape`, [`findbar.go`](../../internal/ui/fyneui/findbar.go)) | VS Code's find widget does so; the selection the bar made is its own | +| A settings page's text fields | hand Escape on (the page closes); keep it | **kept**: Escape in a text field of Preferences or Cluster Settings does nothing, as before; the page's dropdowns hand it on (AW2) | A page's field saves after a pause in typing (`settingsPage.typed`); closing the page under it is a change of its own, not the walk's finding | +| The MCP details panel | — | closes with Escape (it did not) | An overlay, the same rule | + +Tests (each failing before the change): `TestEscapeCancelsTheRollbackDialog`, +`TestEscapeCancelsEveryDialog` (a confirmation, Scale with its count and with its slider focused, +Drain with a check focused, Create Namespace with its name focused, About, the status filter), +`TestEscapeClosesTheConnectionUpdates`, `TestEscapeClosesTheFindBar` (the four editor tabs, from +the find field, the replace field and the editor), `TestEscapeLeavesTheListSearch`; the guard +`TestEveryDialogTakesEscape`. + +**What it does not cover:** a button that has the keyboard by Tab, the items of a check group or a +radio group (Argo CD's Sync and Refresh dialogs), the fields inside Fyne's file and colour dialogs +(where the system has no panel), a settings page's text fields and a selectable label in a +confirmation's review keep Escape: it does nothing there until a click elsewhere; the guard reads +assignments as written, so a Fyne dialog shown through another name than it was assigned to passes +it; seen in Fyne's test driver only, not yet in a real window; Windows and Linux not tried. + ## Revision history | Date | Change | Summary | |---|---|---| | 2026-10-22 | minor | D-115 added and built on the branch `fix/dock-tab-focus`: the owner's AW5, AW6 and AW8 of his alpha walk, the causes verified in the code and in Fyne 2.8.2's source; a dock tab the user opens or shows from the window takes the keys on its editor, terminal or log, an agent's leaves them; the find bar's first ⌘F through the window's canvas; the lead's decisions, open to revision; D-106's GW3 says so; its index row | +| 2026-10-22 | minor | D-116 added and built (the owner's alpha walk, AW3, AW4 and AW19): Escape closes the innermost thing, a dialog as its Cancel with the drawer untouched, a search cleared and left, the find bar closed, an overlay nothing registered taking the key; D-104: a closed dropdown outlined as an entry, the field outline 2:1 on every surface (AW1), Escape on an open list taking the keyboard off its field (AW2); D-57: its "any other search" the navigator's; the lead's decisions, open to revision; their index rows | +| 2026-10-22 | patch | D-106: GW1's row "The window's other held clicks": the welcome page's cluster rows no `fyne.DoubleTappable`, the page connecting a cluster whose connect is under way no second time; `fsRow` and `logSurface` left held, with why; the lead's decision, open to revision | +| 2026-10-22 | patch | D-106: GW1's row "When the click acts" (the owner's AW12): Fyne's driver held every tap on the table, a `fyne.DoubleTappable`, for the double-click interval; the table counts the header separators' double click itself; the lead's decision, open to revision | +| 2026-10-22 | minor | D-114: AW17 and AW13 built on the branch `feat/failed-connect-page` (AW18 fixed with them): a failed connect's error page in the welcome page's look whether or not a tab is open, the connect's stages (kubeconfig, a plugin's login, DNS, TCP, TLS, API) measured on client-go's own first request, in `UIState.ConnectFailure` and every connect's attempt, the error line its cause; the welcome page without "Other clusters"; the lead's details, open to revision; D-97, D-66 and D-57 follow; its index row | +| 2026-10-22 | minor | D-97: the owner's AW15 and AW16 of the alpha walk built: the user's Cancel Connecting and a connect left in the background raise no toast, on every path (`ErrConnectCancelled`, `ErrConnectSuperseded`, `ConnectNotFailed`; `hotbar.openCluster`, `ui.tab.select` and `ui.setNavigatorScope` answer a background connect without an error); agents read a cancel as `cancelled`, not `failed`; a second connect of the cluster the window waits for joins that wait instead of ending it; D-66's Levels row; the lead's decisions, open to revision; its index row | +| 2026-10-22 | minor | D-25: the owner's decision of 2026-10-22, recorded verbatim: a masked Secret value is copied without being shown, reversing the rule of 2026-10-12 that a Secret's value is copyable only once revealed (kept as history); built with the lead's details, open to revision (the whole value, binary and empty values, the tooltip, the toast, the Create Secret dialog's field, a revealed value Show cut copied whole by its icon); its index row; D-59's masked value | +| 2026-10-22 | trivial | D-106: AW10's rule read with D-115 (a clicked dock tab takes the keys): the focus decides first, the click's memory stays for a dock tab that takes no keys or not yet; its tests' scenes | +| 2026-10-22 | minor | D-106: AW10 built, ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab where the keyboard works in the dock (`dock` on `ui.tab.moveLeft` and `ui.tab.moveRight`); the lead's decisions, open to revision; its index row | +| 2026-10-22 | minor | D-54: AW9 built, a command that shows a dock tab open already opens the minimised dock also when that tab is the active one (`UIState.ShowDockTab`); the lead's details, open to revision | +| 2026-10-22 | minor | D-85, D-114: AW7 built, a dialog's Context row draws the source label in the kind word's grey, the id wrapped as before; the lead's details in D-85, open to revision; their index rows | +| 2026-10-22 | minor | D-99: Follow by scrolling, the owner's AW14 (D-114), built: five rows up switch Follow off, a smaller scroll up keeps following that far behind the newest line, a scroll down back to it switches it on; the scroll bar counts, the stream never switches it on; the checkbox as before; the lead's decisions, open to revision; D-114's status; their index rows | +| 2026-10-22 | minor | D-106: AW11 of the owner's alpha walk built: the engine watches the namespaces while the shown cluster's filter names some and emits `EventNamespaces` when one comes, goes or begins terminating, coalesced; the window reads them again on it, the view's rows no longer do (`recheckNamespaces` gone); the lead's decisions, open to revision; its index row | | 2026-10-22 | minor | D-9: the owner's decision of 2026-10-22, recorded verbatim: the cloud providers' credential plugins (EKS, GKE, AKS) and, as the lead reads "komplett", the cloud account integrations are not a target, won't build; it replaces "out of scope until long after parity" (2026-10-15, kept as history); the paid features after the beta now Security Center and cost monitoring; the premium list counted without the cloud account integrations since 2026-10-22 (3 of 10 in breadth); index row D-9 | | 2026-10-22 | minor | D-114 added: the owner's decisions in his alpha walk (AW7, AW13, AW14, AW17), not built; its index row | | 2026-10-22 | trivial | D-113: the image grades' decision, written D-new on its branch, numbered after the owner merged PR #69 | diff --git a/docs/developer/design-language.md b/docs/developer/design-language.md index d1e5b206f..ef5a4781b 100644 --- a/docs/developer/design-language.md +++ b/docs/developer/design-language.md @@ -45,7 +45,9 @@ brackets with end ticks, lowercase labels with a middle dot, a faint perspective The palettes in [theme.go](../../internal/ui/fyneui/theme.go) replace Solarized (D-22) on this branch. Dark: stage `#0d121a`, chrome `#0a0e14`, sidebar `#0b0f16`, drawer `#10161f`, overlay `#121925`, -hairline `#1b2330`; text `#d5dde8`, muted `#8592a5` (5.9:1 on the stage); glow blue `#4aa8ff`, cyan +hairline `#1b2330`, a well's or card's edge `#263042`; a field's outline `#3e4f6a`, light `#a1acbc`, +2:1 on every surface a field stands on, since a closed dropdown on a dialog read as the dialog's own +colour (the owner's AW1 of 2026-10-22, [D-104](decisions.md#d-104-dialog-fields-their-hints-and-dropdowns-the-gate-walks-gw2-gw5-gw6)); text `#d5dde8`, muted `#8592a5` (5.9:1 on the stage); glow blue `#4aa8ff`, cyan `#5ad1e3`, violet `#a48bff`; status mint `#3dd68c`, amber `#f2c14e`, orange `#ff9f5a`, coral `#ff6b74`, rose `#ee82b8` (Terminating; violet is the agent's), blue `#5ab8ff` (Succeeded). Light keeps the same roles on white plates with the lights deepened for 4.5:1 text. Every pair still passes diff --git a/docs/developer/ui-threads.md b/docs/developer/ui-threads.md index 6a9582a1e..480e75027 100644 --- a/docs/developer/ui-threads.md +++ b/docs/developer/ui-threads.md @@ -1,6 +1,6 @@ # The UI's goroutines -> **Last reviewed:** 2026-10-19 · **Last updated:** 2026-10-22 · **Change:** trivial (`dock.showAddMenu`'s row removed: the dock's "+" menu is gone, its terminal chip dispatches on the main goroutine's tap); trivial (a row for the namespace filter's recheck timer, GW9, D-106); new (the audit before +> **Last reviewed:** 2026-10-19 · **Last updated:** 2026-10-22 · **Change:** trivial (the namespace filter's recheck timer's row removed: EventNamespaces reads the namespaces again, AW11, D-106); trivial (`dock.showAddMenu`'s row removed: the dock's "+" menu is gone, its terminal chip dispatches on the main goroutine's tap); trivial (a row for the namespace filter's recheck timer, GW9, D-106); new (the audit before > Fyne's thread check is turned off in releases, [D-103](decisions.md#d-103-fynes-thread-check-a-build-parameter-off-in-releases)) Fyne runs every widget on its main goroutine. Code that runs anywhere else (a goroutine, a timer, @@ -86,7 +86,6 @@ places of the same kind has one row. | `fyneui/tablecheck.go` | `tableView.openSelectionMenu` | go | A | `evaluateSelection` (registry, `commandEnabled`) on references cloned on main; the menu built and shown inside `sh.do`. | | `fyneui/tablecheck.go` | `selectionBar.askReason` | go | A | The registry's label and `commandEnabled` on cloned references; the tooltip set inside `sh.do`. | | `fyneui/tableview.go` | `tableView.searchChanged` | AfterFunc | A | `sh.dispatch(ui.setFilter)` with the text copied; `done` (`filterBusy`, `syncSearch`) runs through `sh.do`. | -| `fyneui/nsgone.go` | `shell.recheckNamespaces` | AfterFunc | A | The timer's function is only `sh.do(...)`: clearing `nsRecheck` and the next read run on the main goroutine (GW9, D-106). | | `fyneui/palette.go` | `cmdPalette.load` | go | A | `Registry.Palette` over a cloned state; `containersFor` reads the engine; results applied inside `sh.do`. | | `fyneui/palette.go` | `shell.runPaletteAction` | go | A | `evaluateActions` and `containersFor` touch the engine only; `runAction` or the toast inside `sh.do`. | | `fyneui/navigator_sections.go` | `navSections.load` | go | A | `Contexts`; render and the hotbar's marks inside `sh.do`. | diff --git a/docs/developer/usage.md b/docs/developer/usage.md index 21948f180..fc1b6eac8 100644 --- a/docs/developer/usage.md +++ b/docs/developer/usage.md @@ -50,14 +50,15 @@ unless it is marked *(planned)*; how far each one goes is measured row by row in - 🪪 One short name per cluster wherever the window names it: the name you gave it in its Settings, else its context's name after the last "@" ("kubernetes-admin@prod-eu" shows as "prod-eu"); the full name in every tooltip, and the navigator's search finds it by either. The navigator's root says who you are logged in as there, as the API server confirms it at every connect (`kubectl auth whoami`'s question), your groups in the tooltip of the small box beside it; "(kubeconfig)" marks the kubeconfig's user name where the API server does not say, and while the cluster connects the last user it confirmed shows dimmed, with when it was last seen ([D-68](decisions.md#d-68-one-short-name-for-a-cluster-and-the-user-cogpit-is-logged-in-as)). - 🏷️ The cluster's Kubernetes version under your user in the navigator's root, ⚠ when upstream's support for its minor has ended, in amber during its last two months (maintenance mode); its tooltip says until when, with the days left. The Nodes list marks a kubelet the same way, and one newer than the API server or more than three minors behind it ([The Kubernetes version and upstream support](#the-kubernetes-version-and-upstream-support)). A gear beside the root's dot opens the cluster's Settings. - ⌨️ A command palette on ⌘⇧P (Ctrl+Shift+P): every action the menus offer, Switch to any view, the hotbar's clusters; ⌘P (Cluster › Connect to Cluster…) to search a cluster by name in the navigator's list, ↵ to connect, Escape to go back. -- 👋 A welcome page whenever no cluster is open (and from Help › Welcome): your clusters one click away, Add Kubeconfigs, the documentation. Disconnect a cluster, or remove it from Cogpit, which unlinks the kubeconfig file you added and never touches the file. +- 👋 A welcome page whenever no cluster is open (and from Help › Welcome): the clusters of your hotbar and the recent ones one click away (on a first start the clusters your kubeconfigs offer; All Clusters beside it lists every one), Add Kubeconfigs, the documentation. Disconnect a cluster, or remove it from Cogpit, which unlinks the kubeconfig file you added and never touches the file. +- 🩺 A connect that fails shows its own error page (since 2026-10-22): why, in a sentence, and the connect stage by stage (the kubeconfig, a login program, DNS with the addresses, TCP to the address and port, TLS, the API server's answer), with Connect Again and Show Connection Updates. - 🪟 The window opens where you closed it (since 2026-10-18): as large, on the same display, in full screen if it was, whatever Restore the last session says; a display that is gone gives 1440 × 900 in the middle of the main one ([details](#the-windows-place-and-size); Windows and Linux: the size and full screen). -- 🗂️ Tabs you arrange (since 2026-10-20): drag a tab along the tab bar, or the dock's, to another place, the others making room as it moves; ⌘⌥⇧← and ⌘⌥⇧→ move the shown tab one place; the tab bar's order comes back with your tabs at the next start. +- 🗂️ Tabs you arrange (since 2026-10-20): drag a tab along the tab bar, or the dock's, to another place, the others making room as it moves; ⌘⌥⇧← and ⌘⌥⇧→ move the shown tab one place, the dock's while you work in the dock (since 2026-10-22); the tab bar's order comes back with your tabs at the next start. - ⚙️ Preferences on ⌘, and a cluster's Settings on ⌘⇧,: the theme switched live (also with the sun and moon left of the bell in the title bar, since 2026-10-21), the time zone, the editor's and the terminal's settings, a cluster's name and icon (a colour or your image), its terminals' folder and namespace, its Prometheus and how it is asked (a query format, empty containers filtered, HTTPS); never written to a kubeconfig. - 🕐 Every timestamp in your time zone and your region's format, as your Mac's region settings write it ("10.09.2026 17:41:01" in Germany): the drawer, events, logs, notifications, charts. - 🔐 Your credentials stay yours: kubectl's own authentication code (certificates, tokens, exec credential plugins); no local proxy, no login. - ⚡ Cache first: views read from a watch-fed cache; switching back to a view costs no API request. -- 📋 Lens's resource views: workloads, config, network, storage, access control, device resources (with each node's devices in its drawer), custom resources; each searchable by words, with match case or a regular expression, and filtered by the states its rows carry (Running, Pending, Not Ready, Degraded…), several at once, cleared with one click; the namespace filter's list has a search field to find your namespaces by typing, a click on a name shows only that namespace, its box adds it to the others. A namespace you filter by that is deleted, or being deleted, reads red there with "deleted" or "terminating", and the filter's button turns red; untick a deleted one and it leaves the list. A click on the empty area below a list's rows closes the drawer; the rows you checked stay checked. +- 📋 Lens's resource views: workloads, config, network, storage, access control, device resources (with each node's devices in its drawer), custom resources; each searchable by words, with match case or a regular expression, and filtered by the states its rows carry (Running, Pending, Not Ready, Degraded…), several at once, cleared with one click; the namespace filter's list has a search field to find your namespaces by typing, a click on a name shows only that namespace, its box adds it to the others. A namespace you filter by that is deleted, or being deleted, reads red there with "deleted" or "terminating", and the filter's button turns red within a second of the deletion, whether or not anything in the list changed (since 2026-10-22); untick a deleted one and it leaves the list. A click on the empty area below a list's rows closes the drawer; the rows you checked stay checked. - 🔏 The certificates in your Secrets decoded in the drawer, PEM or DER, a section per certificate of a chain: subject, issuer, serial, validity (a warning 30 days before it ends), names, key, usages, fingerprint, each field copyable; whether `tls.key` belongs to `tls.crt` and the chain is in order; agents read the same fields, never the PEM text or the private key. - 📜 Logs with follow, filter, timestamps, the previous container, pod and container selectors, older lines and a jump to a time; select their text across lines and copy it (since 2026-10-19: a drag, ⇧-click, a double click, ⌘A, ⌘C, a right-click's Copy All Lines Shown; [details](#selecting-and-copying-a-logs-a-notifications-and-the-agents-text)). - 🔔 Notifications as toasts at the bottom right, and the session's in the bell's list: a toast stays while the pointer is on it or you select in it; drag over its text and ⌘C copies, its copy icon left of the × copies the whole message, an error included (since 2026-10-19). @@ -65,7 +66,7 @@ unless it is marked *(planned)*; how far each one goes is measured row by row in - 🖥️ A node shell, as Lens opens it: a privileged pod in `kube-system` from an image pinned by digest, confirmed every time, deleted when the shell closes. - 🔍 Debug a running pod: Debug in its drawer adds an ephemeral container (by default nicolaka/netshoot:v0.16, pinned by digest, your choice in Preferences) that sees the processes of the container you pick and opens a shell in it; confirmed every time, since it stays in the pod; the Pods list shows such containers as blue squares, outlined once they ended, and Logs, Shell and Attach reach them ([details](#debug-containers)). - 🔐 Create Secret from a dialog, values masked as you type, for you alone: agents can neither create a Secret nor read its values. -- 🗝️ A Secret's values and keys edited in its drawer, for you alone: Show puts a value into an editor, whose copy icon copies the whole value (the clipboard is cleared again after 60 seconds), Add Key adds a key, each key's bin icon removes it, pills beside Revert and Save count what you edited, added and removed; Save shows which keys change, are added or are removed and their sizes, never a value, checks with the server first and, for a removed key, is your confirmation; agents can neither save nor review a Secret's values, and unsaved ones never touch the disk. +- 🗝️ A Secret's values and keys edited in its drawer, for you alone: Show puts a value into an editor, whose copy icon copies the whole value (the clipboard is cleared again after 60 seconds); a masked value's copy icon, under the pointer, copies it without showing it, straight into a password field elsewhere (since 2026-10-22), Add Key adds a key, each key's bin icon removes it, pills beside Revert and Save count what you edited, added and removed; Save shows which keys change, are added or are removed and their sizes, never a value, checks with the server first and, for a removed key, is your confirmation; agents can neither save nor review a Secret's values, and unsaved ones never touch the disk. - 🧰 The terminal's `kubectl` checked against the cluster: more than one minor version off, or none, and one click downloads the matching release from `dl.k8s.io`, verified against its SHA-256, the Kubernetes release's signature and that signature's entry in sigstore's transparency log, for Cogpit's terminals only. - ✏️ YAML editing with a diff and a server-side dry-run before every apply; every object's YAML reads as the Kubernetes docs write a manifest, apiVersion, kind and metadata (name and namespace first) on top, status last; ⌘Z undoes and ⇧⌘Z or ⌘Y redo your typing, pastes and indents in every YAML editor, the drawer's values included, and ⌘Z right after Revert to Original brings your text back; ⌘F opens the find bar of the editor tab you work in (Edit, Create, Helm Install and Upgrade), with the keys in its field; an apply that scales a workload to zero or removes a key of a Config Map or a Secret asks you first, naming the keys. - 📝 A Config Map's values edited right in its drawer, each key above its editor, keys added with Add Key and removed with their bin icon, what you edited, added and removed counted in coloured pills beside Revert and Save, saved with a diff and a dry run (a removal named in red and confirmed by that review, an agent's always asked); when someone else changed other keys meanwhile, Save moves your edits onto the newer version and shows you the diff again; unsaved values survive a quit or a crash as a draft. @@ -609,7 +610,9 @@ clusters that were connected when Cogpit quit: the one you were looking at first connect with its most recently used tab, then the others one after another in the background (`ui_state`'s `connections` lists each as `connecting` meanwhile). Their login programs run as on any connect; one you have not allowed yet, or one whose program changed since, is not run, and the cluster says why (allow it in -the navigator). `--context` shows its own cluster, and the restore connects the others behind it. A +the navigator). When the one you were looking at fails to connect, the window shows its error page +with the connect's stages (since 2026-10-22, [below](#several-clusters-connected)), not the welcome +page. `--context` shows its own cluster, and the restore connects the others behind it. A cluster whose kubeconfig is gone is left out with a notice. The dock's tabs (logs, terminals, editors) are not reopened. The tables' column choice and order, the navigator's collapsed groups, whether the navigator and the chat are shown, and the window's place and size @@ -975,17 +978,42 @@ Mixed environments on; off, the bar shows the shown cluster's tabs only): it sho Cogpit's cache, without asking the cluster or showing its login program again. A cluster that is not connected connects and shows; the others stay connected. A connected cluster's menu (right-click on its tile or row) says **Show** instead of Connect, and **Disconnect** there closes that cluster -alone. A connect that fails leaves the window on that cluster (since 2026-10-19, [D-97](decisions.md#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays)): -"Could not connect to : …" with **Connect Again** and **Show Connection Updates**, its dot -red; Cogpit never shows another cluster by itself, so you never come back to a window that shows a -cluster you did not choose. The cluster shown before stays connected; click it to go back. +alone. A connect that fails leaves the window on that cluster (since 2026-10-19, [D-97](decisions.md#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays)), +its dot red; Cogpit never shows another cluster by itself, so you never come back to a window that +shows a cluster you did not choose. The cluster shown before stays connected; click it to go back. + +**A failed connect's error page** (since 2026-10-22, [D-114](decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages)): +whether you clicked the cluster or the start restored it, and whether or not one of its tabs was +open, the workspace shows the cluster's error page in the welcome page's look: "Could not connect +to ", that this is an error page, the cause in a sentence ("The client certificate file +/Users/…/client.crt does not exist") under the stage it failed in, then the connect stage by stage, +each with a tick, a cross, a ring for not reached or a dash for skipped: + +| Stage | Says | +|---|---| +| Kubeconfig valid and complete | the context, its file, the server and how you log in; or which file is missing or what is wrong | +| Login by the credential plugin | only for a context with a login program: how long it took, or why it failed (it runs before anything is sent) | +| DNS: the API server's name resolved | the name and the addresses it gave; skipped for a server named by its address; behind a proxy the proxy's name, the proxy resolving the server's | +| TCP: the address and port reached | the address and port dialled (or the proxy's), or that it refused or did not answer within the limit | +| TLS handshake | the TLS version and against what the server's certificate is checked; or why it failed (an authority this context does not trust, another name) | +| API server: the login and the first request | `GET /version`'s answer with the server's version, the login accepted; or the 401, 403 or the time it waited | + +**Connect Again** tries again (a login program you have not allowed yet is shown first); +**Show Connection Updates** opens the cluster's connection log with the whole error line by line. +Help › Welcome leaves the failed cluster and shows the welcome page. Agents read the same in +`ui_state`: `connection.error` is the cause, `connectFailure` holds the stages. Showing another cluster while one connects (it waits for your login in a browser, say) does not end that connect (since 2026-10-19, D-97): it goes on in the background, its dot blinking, its tooltip -saying what it waits for, **Cancel Connecting** in its menus. When it is done, a toast says +saying what it waits for, **Cancel Connecting** in its menus. Nothing else says it when you leave it +(since 2026-10-22, the owner's AW16: before, an error toast "connect : another cluster was +shown; the connect goes on in the background"). When it is done, a toast says "Connected to in the background." (or why it failed) and the window stays where you are; click the cluster to show it. Clicking a cluster that connects in the background shows it connecting -and waits for that same connect, without starting the login a second time. +and waits for that same connect, without starting the login a second time; connecting the cluster the +window waits for again (from the navigator's section, the palette or an agent) waits for the same +connect too and says nothing (since 2026-10-22; before, the first connect's wait ended with the +error toast "another cluster was shown"). Every dot of a cluster (its hotbar tile, its row in the navigator and on the welcome page, and the status bar for the one shown; the top bar has none since 2026-10-21, D-54) says how it is; its @@ -1113,7 +1141,9 @@ waits for you to finish there. While it waits: a cluster connecting in the background (restoring the last session, or one you left to show another cluster, D-97) included. It ends the connect at once and the login program Cogpit started for it; the cluster is not connected, and - its connection updates say "cancelled". **Connect** starts the login again, a new browser tab + its connection updates say "cancelled". No toast says it: you cancelled it yourself (since + 2026-10-22, the owner's AW15; before, an error toast "connect : connecting cancelled"). + **Connect** starts the login again, a new browser tab included. A browser window the program opened stays open: close it yourself. A login program that is a wrapper script handing over to the real program (`exec`) is ended too (since 2026-10-19). When Cogpit cannot find the program's process (two logins that start at the same @@ -1146,8 +1176,13 @@ end, `waitingForLogin` has `runsOn: true` and no `until`, and the reason is "wai login through , which Cogpit stopped waiting for and could not end; it has no end time". `cluster_disconnect` of a connecting cluster (its `context` for one connecting in the background) cancels the connect as the window's Cancel Connecting does; agents may run it without asking you (it stops only what your connect started). -`cluster_connect` answers `connecting` when another cluster was shown while it waited: the connect -goes on in the background, and its end is in `ui_state`'s `connections` and its connection updates. +`cluster_connect` and `hotbar_openCluster` answer `connecting` when another cluster was shown while +they waited, `ui_tab_select` and `ui_setNavigatorScope` the UI state without an error (since +2026-10-22; before, those three an error): the connect goes on in the background, and its end is in +`ui_state`'s `connections` and its connection updates. `cluster_connect` of the cluster the window +waits for already waits for that connect and answers with its end. A connect cancelled while it waits (Cancel +Connecting, `cluster_disconnect`) answers an error with the code `cancelled` that says so, not +`failed`, and asks the agent not to connect it again unless you ask. ### Connection Updates: the connection log @@ -1182,6 +1217,10 @@ menu), for any context, connected or not; one with nothing recorded says so. cut to 4 KiB. - While the dialog is open it follows the log: a connect or reconnect that runs adds its lines as they come. **Copy** puts every attempt shown on the clipboard as plain text, for a bug report. +- Each connect shows its stages above its lines (since 2026-10-22, D-114): the same table as on a + failed connect's error page ([above](#several-clusters-connected)), for the ones that worked too; + Copy writes them under "Stages:". Cogpit measures them on the connect's own first request: it + opens no connection or lookup of its own for them. - Agents read the same log with `cluster_connectLog`. ### Choosing files: the system's panels @@ -1409,6 +1448,26 @@ table's newest (accurate to weeks; checked against every minor since 1.19). The gear before the root's dot opens the cluster's Settings, as ⌘⇧, does ([D-92](decisions.md#d-92-a-gear-in-the-navigators-cluster-row)). +### Escape + +Since 2026-10-22 (the owner's alpha walk, [D-116](decisions.md#d-116-escape-closes-the-innermost-thing)), +Escape closes the innermost thing open, and only that; press it again to go one step further out. + +| Where you are | Escape | +|---|---| +| An open dropdown's list | closes it without a choice; the field is no longer highlighted | +| A dialog (a confirmation, Rollback, Scale, a create dialog, Connection Updates, About, …), whatever field has the keyboard | is its Cancel, or its Close where it has none; the drawer behind it stays open | +| A pop-up list (the namespace filter, the status filter, the columns, the agent's history) or the palette, the bell's list, the MCP details | closes it | +| A dock tab's find bar (its fields or the editor) | closes the bar; the editor gets the keys, the find text stays for the next ⌘F | +| A list's search (⌘F) | clears it; the list gets the keys | +| The logs tab's search, Argo CD's activity filter | clears it | +| A settings page (Preferences, Cluster Settings) | closes the page (a text field on it keeps Escape) | +| The list or the navigator | closes the drawer | + +A selected text (a log, a toast, the agent's answer) drops its selection first, and the +navigator's search opened by ⌘P and the namespace filter's search clear a typed text first, as +before. + ### Selecting and copying a log's, a notification's and the agent's text Since 2026-10-19 (the owner's WF36 and WF41, @@ -1425,7 +1484,12 @@ Since 2026-10-19 (the owner's WF36 and WF41, | Escape | drops the selection | Selecting with the pointer turns **Follow** off, so the lines stay where you see them; turn it on -again with its check, and the selection stays on its lines as new ones arrive. The selection keeps +again with its check, and the selection stays on its lines as new ones arrive. Scrolling switches it +too (since 2026-10-22): five lines or more up from the newest line, with the wheel, the trackpad or +the scroll bar, turn Follow off and the log stays where you scrolled; scroll back down to the newest +line and Follow is on again. A smaller scroll up keeps following, that far behind the newest line. +New lines never turn Follow on by themselves. The Follow check works as before: off, the log stays +where it is; on, it jumps to the newest line and follows. The selection keeps its lines through Wrap, a new width, a search and a filter; turning Resource names or Timestamps on or off drops it. A tab keeps its newest 10,000 lines: when older ones go, the part of the selection in them goes too. Copying shows no toast. `/` still jumps to the search. diff --git a/docs/parity/beyond-lens.md b/docs/parity/beyond-lens.md index 8ff3707af..b19764b44 100644 --- a/docs/parity/beyond-lens.md +++ b/docs/parity/beyond-lens.md @@ -1,6 +1,6 @@ # Beyond Lens -> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-22 · **Change:** minor (Cluster integrations: image grades as shields, D-113; no row moves); trivial (Updates: the appcasts signed in `sparkle` without the owner's approval since 2026-10-22 (his choice, H-141); no row moves); minor (Updates: the Windows setup updated through WinSparkle with one click, D-111, on the branch `windows-release`; no row moves); patch (MCP control: the external MCP server is opt-in, off on a new installation until the user switches it on, the owner's security posture of 2026-10-21, D-49; the transport row and the bridge row say so; no row moves); minor (Updates, Cogpit for Linux, D-108: package-manager installs partial, the Linux deb's Update button running apt; the one-click update and the signed manifest say what Linux has; 73 of 74 rows, 61 done and 12 partial); minor (Everyday use: the navigator's slides and Reduce motion, the owner's requests of 2026-10-20, D-107, done; 72 of 74 rows, 61 done and 11 partial); patch (the alerts pill: green "0" without alerts, grey "warn" while none answers, the owner's look of 2026-10-20; no row moves); patch (Standby and lost connections: the logs row's evidence, a pod created again under its name while the connection was down, D-58; no row moves); minor (Everyday use: debug containers, the owner's words of 2026-10-19, D-102); minor (Cluster integrations and Everyday use: the question's steps and answer and switching an integration on the user's alone, a cluster's name and icon too, the owner's decisions on H-126 and H-125; no status or count moves); minor (Everyday use: what holds a Terminating namespace, and Remove finalizers, the owner's WF43, D-98, done; 70 of 72 rows, 59 done and 11 partial); minor (Everyday use: a node's disks as a usage bar per real filesystem, the owner's WF26, D-90, done; 69 of 71 rows, 58 done, after WF30's row); minor (Everyday use: the cluster's Kubernetes version and upstream end of life, the owner's WF30 of 2026-10-18, D-91, done; 68 of 70 rows, 57 done and 11 partial); minor (Cluster integrations: a section per integration under a divider, D-87; no status moved); minor (Everyday use: the empty dock's toggle opens a terminal, WF18, and the toggles a padding apart, WF17; Alerts: an alertname copies, WF21; D-93, D-94; no count moves); minor (Cluster integrations: a pre-choice before any integration is looked for and Ask again, the owner's WF5 and WF4 of 2026-10-17 evening, D-82, done; the question's and the default's rows follow; 67 of 69 rows, 56 done and 11 partial); trivial (agents' confirmations: the removal of a hotbar bank moot since D-83, one hotbar; no status moves); minor (Standby and lost connections: Reconnect, a new connection from the kubeconfig file with the tabs kept, the owner's F28 and F29 of 2026-10-17, D-81, done; 65 of 67 rows, 54 done and 11 partial); minor (Cluster integrations: every pod's worst image rating in the Pods list, the owner's I6, D-78, done; 64 of 66 rows, 53 done and 11 partial); minor (Everyday use: a cluster's accent colour, the owner's F26 of 2026-10-17, D-80, partial (the setting only); 63 of 66 rows, 52 done and 11 partial); minor (Cluster integrations: Kyverno's policy violations on the objects and for agents, the owner's I7 of 2026-10-17, D-79, two rows done; 62 of 65 rows, 52 done and 10 partial); minor (Alerts: a section of Cogpit's own, the owner's I4 and I5 of 2026-10-17, D-77: the title bar's alerts pill from the cluster's Alertmanager and the alert board, both done; 60 of 63 rows, 50 done and 10 partial); minor (Cluster integrations, the owner's words of 2026-10-17, D-76: Cluster Settings › Integrations and the question at a new cluster's first connect partial, the default all on done; 58 of 61 rows, 48 done and 10 partial); minor (Cluster integrations, a section of Cogpit's own: a pod's image ratings in its drawer, the owner's I6 of 2026-10-17, D-78, done; the Pods list's worst rating missing; 55 of 58 rows, 47 done and 8 partial); minor (Everyday use: a row for a context's client certificate, the time left or "expired" in the cluster lists, the owner's F22 of 2026-10-17, D-75, done; 54 of 56 rows, 46 done and 8 partial); minor (Standby and lost connections, a login that expired: a login program that waits ended after 5 minutes or by Cancel Connecting, D-73, the owner's finding of 2026-10-16 night; no status or count moves); minor (the drawer's copy row: a copy icon over a Secret's editor, the owner's audit decision of 2026-10-16, D-59; no count moves); minor (the built-in agent's settings row: a connection's CA file replaces the system's roots, the owner's decision in the audit of 2026-10-16, N141; no count moves); minor (D-69 stage 3, 2026-10-16: two rows of Cogpit's own, a background cluster's login held while its setting says so (Standby and lost connections, partial) and restoring the last session at start (Everyday use, done); 53 of 55 rows, 45 done and 8 partial); minor (Standby and lost connections: the connection log, D-66, 2026-10-16, a row of Cogpit's own, done with F13's dots; 51 of 53 rows, 44 done and 7 partial); minor (Standby and lost connections: the dot blinks green instead of amber and "Reconnecting…", the owner's F13 2026-10-16; no status moved); trivial (`cogpit-cli contexts`: the demo cluster a development build's only, D-67); minor (One-click updates: the scheduled check every hour and the button "Update to v", owner 2026-10-16; no status moved); minor (Updates: the signed update manifest done after the first update through the feed, 2026-10-16; 43 of 52 rows done, 7 partial); minor (Crash recovery and standby: a drain whose background job was stopped kept as `stopped` and offered as after a crash, D-63; no status moved); minor (Cache transparency: the Diagnostics view row done with memory per kind and per cluster, G3, 2026-10-16; 42 of 52 rows done, 8 partial); minor (a section for standby and lost connections, D-58: 8 rows, Cogpit's own since Lens's behaviour is not captured, 5 done and 3 partial; the summary recounted); minor (Crash recovery: a Config Map's unsaved drawer values kept as drafts, the owner's audit answer of 2026-10-15); minor (the built-in agent's actions and navigation rows: a connection may send every command as a tool; its settings row: the `http://` warning and a CA file per connection; the chat row: a sent message edited and sent again (F9); the owner's audit answers of 2026-10-15, built in the night run; no count moves); minor (three rows said "not built" for the owner's decisions of 2026-10-14 evening that the night run built: a chart's README framed for agents (A31), an agent's `cluster.setPrometheus` asking (A16), `cogpit-cli get` warning about an unchecked certificate (A29); no count moves); minor (Updates: the owner's update key set up 2026-10-15 and in the releases since v0.11.0, no signed appcast served yet; no count moves); minor (`dock_read` reads a terminal tab's scrollback too, by stable line numbers, D-56; no count moves); minor (the built-in agent's settings row done: the API keys in an owner-only file on every platform, no keychain, the owner's decision of 2026-10-15; 42 of 44 rows exist, 36 done, 6 partial); minor (Everyday use: the layout toggles at the top bar's right end, the owner's finding F7, done; Updates: the Update button from Sparkle's gentle reminders; 42 of 44 rows exist, 35 done, 7 partial); minor (MCP control's transport and bridge rows: the token and port kept, Regenerate token, the bridge following a new token, F6; the bridge row's D-49 marked built; no count moves); minor (the row about what is sent to the endpoint: H-96 built, a private connection's conversations not kept; no count moves); minor (the several-windows row: R3 postponed by the owner; no count moves); minor (everyday use: A69 built, the lists' copy icon over the cell's end, the text not shortened; A71 built, the drawer's Forward… right after the port, the icon over its end; no count moves); minor (the owner's decision round of 2026-10-14 evening: two rows he required, missing, 29 of 43 rows (24 done, 5 partial): which kind of CA a certificate's chain leads to, and a hotbar tile dragged out of the window opening another window; twelve rows note what he confirmed and decided, not built); minor (cache transparency: the table snapshots counted in the Diagnostics tab only, no longer in the status bar, owner, no row moves); minor (updates: one-click updates of the macOS app through Sparkle 2 and the signed update manifest partial, D-4, 29 of 41 rows, 24 done and 5 partial); minor (; agents: the cached Secrets' values replaced in what agents read, Flux's credential fields withheld from their YAML (owner, H-82, H-63); agents: a terminal tab agents may read carries a flashing marker and its switch ends after 15 minutes without a read, H-83, owner; everyday use: a status filter in every view, the dashboards' states opening their views filtered (owner, D-34), done, 27 of 41 rows, 24 done and 3 partial; agents: `kinds_list` with each kind's actions, its cache state and the kinds not served, done, every MCP row done, 23 done and 3 partial; agents: `dock_read`, the output of logs and terminal tabs (D-44), done, 22 done and 4 partial; agents: every command a tool, checked over Cogpit's whole registry, GUI-only commands refused with their reason, the actions row done, 21 done and 5 partial; everyday use: the drawer's copy icon right after every kind of value, a pill's included (owner, D-25), still partial; everyday use: the certificates row with DER, the key check and the chain check (D-30, the owner's answers), no count moves; everyday use: certificates in Secrets decoded in the drawer and for agents done (D-30), 26 of 40 rows; everyday use: the lists' copy icon only outside a blacklist of columns and right after the text (owner, D-25), still done; `view_rows` waits for a column arrangement too; everyday use: names in the lists copyable with the drawer's copy icon done (D-25); `cogpit-cli contexts` marks an insecure context, no count moves; the Diagnostics tab, still partial; the audit log in the window done; the agent writes allowance in Cluster Settings › Agents done; `object_get` with related objects done; `view_rows` done; crash recovery: unsaved editor content restored from its local draft done; the `cogpit-cli mcp` stdio bridge done; command line: `cogpit-cli contexts` done, `get` partial; the built-in agent's engine side built (M12 (a)): 3 rows done, 5 partial, 37 of 43 rows, 27 done and 10 partial; the built-in agent, the window's half (M12 (b), night): six rows from missing to partial (the chat column, the view and selection's chip, Preferences › Agent, the limits, what was sent, ⌘I), 35 of 43 rows (24 done, 11 partial); the private connection's reads built in the engine (M12 (c)), the row still partial; `cogpit-cli contexts`: an unchecked certificate's approval state, A28; Crash recovery: the Helm row partial, as built since 2026-10-11, A17 built (an interrupted install offered nothing)) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-11 · **Last updated:** 2026-10-22 · **Change:** minor (Everyday use: a masked Secret value copied without being shown, the owner's decision of 2026-10-22, D-25; no row moves); minor (Cluster integrations: image grades as shields, D-113; no row moves); trivial (Updates: the appcasts signed in `sparkle` without the owner's approval since 2026-10-22 (his choice, H-141); no row moves); minor (Updates: the Windows setup updated through WinSparkle with one click, D-111, on the branch `windows-release`; no row moves); patch (MCP control: the external MCP server is opt-in, off on a new installation until the user switches it on, the owner's security posture of 2026-10-21, D-49; the transport row and the bridge row say so; no row moves); minor (Updates, Cogpit for Linux, D-108: package-manager installs partial, the Linux deb's Update button running apt; the one-click update and the signed manifest say what Linux has; 73 of 74 rows, 61 done and 12 partial); minor (Everyday use: the navigator's slides and Reduce motion, the owner's requests of 2026-10-20, D-107, done; 72 of 74 rows, 61 done and 11 partial); patch (the alerts pill: green "0" without alerts, grey "warn" while none answers, the owner's look of 2026-10-20; no row moves); patch (Standby and lost connections: the logs row's evidence, a pod created again under its name while the connection was down, D-58; no row moves); minor (Everyday use: debug containers, the owner's words of 2026-10-19, D-102); minor (Cluster integrations and Everyday use: the question's steps and answer and switching an integration on the user's alone, a cluster's name and icon too, the owner's decisions on H-126 and H-125; no status or count moves); minor (Everyday use: what holds a Terminating namespace, and Remove finalizers, the owner's WF43, D-98, done; 70 of 72 rows, 59 done and 11 partial); minor (Everyday use: a node's disks as a usage bar per real filesystem, the owner's WF26, D-90, done; 69 of 71 rows, 58 done, after WF30's row); minor (Everyday use: the cluster's Kubernetes version and upstream end of life, the owner's WF30 of 2026-10-18, D-91, done; 68 of 70 rows, 57 done and 11 partial); minor (Cluster integrations: a section per integration under a divider, D-87; no status moved); minor (Everyday use: the empty dock's toggle opens a terminal, WF18, and the toggles a padding apart, WF17; Alerts: an alertname copies, WF21; D-93, D-94; no count moves); minor (Cluster integrations: a pre-choice before any integration is looked for and Ask again, the owner's WF5 and WF4 of 2026-10-17 evening, D-82, done; the question's and the default's rows follow; 67 of 69 rows, 56 done and 11 partial); trivial (agents' confirmations: the removal of a hotbar bank moot since D-83, one hotbar; no status moves); minor (Standby and lost connections: Reconnect, a new connection from the kubeconfig file with the tabs kept, the owner's F28 and F29 of 2026-10-17, D-81, done; 65 of 67 rows, 54 done and 11 partial); minor (Cluster integrations: every pod's worst image rating in the Pods list, the owner's I6, D-78, done; 64 of 66 rows, 53 done and 11 partial); minor (Everyday use: a cluster's accent colour, the owner's F26 of 2026-10-17, D-80, partial (the setting only); 63 of 66 rows, 52 done and 11 partial); minor (Cluster integrations: Kyverno's policy violations on the objects and for agents, the owner's I7 of 2026-10-17, D-79, two rows done; 62 of 65 rows, 52 done and 10 partial); minor (Alerts: a section of Cogpit's own, the owner's I4 and I5 of 2026-10-17, D-77: the title bar's alerts pill from the cluster's Alertmanager and the alert board, both done; 60 of 63 rows, 50 done and 10 partial); minor (Cluster integrations, the owner's words of 2026-10-17, D-76: Cluster Settings › Integrations and the question at a new cluster's first connect partial, the default all on done; 58 of 61 rows, 48 done and 10 partial); minor (Cluster integrations, a section of Cogpit's own: a pod's image ratings in its drawer, the owner's I6 of 2026-10-17, D-78, done; the Pods list's worst rating missing; 55 of 58 rows, 47 done and 8 partial); minor (Everyday use: a row for a context's client certificate, the time left or "expired" in the cluster lists, the owner's F22 of 2026-10-17, D-75, done; 54 of 56 rows, 46 done and 8 partial); minor (Standby and lost connections, a login that expired: a login program that waits ended after 5 minutes or by Cancel Connecting, D-73, the owner's finding of 2026-10-16 night; no status or count moves); minor (the drawer's copy row: a copy icon over a Secret's editor, the owner's audit decision of 2026-10-16, D-59; no count moves); minor (the built-in agent's settings row: a connection's CA file replaces the system's roots, the owner's decision in the audit of 2026-10-16, N141; no count moves); minor (D-69 stage 3, 2026-10-16: two rows of Cogpit's own, a background cluster's login held while its setting says so (Standby and lost connections, partial) and restoring the last session at start (Everyday use, done); 53 of 55 rows, 45 done and 8 partial); minor (Standby and lost connections: the connection log, D-66, 2026-10-16, a row of Cogpit's own, done with F13's dots; 51 of 53 rows, 44 done and 7 partial); minor (Standby and lost connections: the dot blinks green instead of amber and "Reconnecting…", the owner's F13 2026-10-16; no status moved); trivial (`cogpit-cli contexts`: the demo cluster a development build's only, D-67); minor (One-click updates: the scheduled check every hour and the button "Update to v", owner 2026-10-16; no status moved); minor (Updates: the signed update manifest done after the first update through the feed, 2026-10-16; 43 of 52 rows done, 7 partial); minor (Crash recovery and standby: a drain whose background job was stopped kept as `stopped` and offered as after a crash, D-63; no status moved); minor (Cache transparency: the Diagnostics view row done with memory per kind and per cluster, G3, 2026-10-16; 42 of 52 rows done, 8 partial); minor (a section for standby and lost connections, D-58: 8 rows, Cogpit's own since Lens's behaviour is not captured, 5 done and 3 partial; the summary recounted); minor (Crash recovery: a Config Map's unsaved drawer values kept as drafts, the owner's audit answer of 2026-10-15); minor (the built-in agent's actions and navigation rows: a connection may send every command as a tool; its settings row: the `http://` warning and a CA file per connection; the chat row: a sent message edited and sent again (F9); the owner's audit answers of 2026-10-15, built in the night run; no count moves); minor (three rows said "not built" for the owner's decisions of 2026-10-14 evening that the night run built: a chart's README framed for agents (A31), an agent's `cluster.setPrometheus` asking (A16), `cogpit-cli get` warning about an unchecked certificate (A29); no count moves); minor (Updates: the owner's update key set up 2026-10-15 and in the releases since v0.11.0, no signed appcast served yet; no count moves); minor (`dock_read` reads a terminal tab's scrollback too, by stable line numbers, D-56; no count moves); minor (the built-in agent's settings row done: the API keys in an owner-only file on every platform, no keychain, the owner's decision of 2026-10-15; 42 of 44 rows exist, 36 done, 6 partial); minor (Everyday use: the layout toggles at the top bar's right end, the owner's finding F7, done; Updates: the Update button from Sparkle's gentle reminders; 42 of 44 rows exist, 35 done, 7 partial); minor (MCP control's transport and bridge rows: the token and port kept, Regenerate token, the bridge following a new token, F6; the bridge row's D-49 marked built; no count moves); minor (the row about what is sent to the endpoint: H-96 built, a private connection's conversations not kept; no count moves); minor (the several-windows row: R3 postponed by the owner; no count moves); minor (everyday use: A69 built, the lists' copy icon over the cell's end, the text not shortened; A71 built, the drawer's Forward… right after the port, the icon over its end; no count moves); minor (the owner's decision round of 2026-10-14 evening: two rows he required, missing, 29 of 43 rows (24 done, 5 partial): which kind of CA a certificate's chain leads to, and a hotbar tile dragged out of the window opening another window; twelve rows note what he confirmed and decided, not built); minor (cache transparency: the table snapshots counted in the Diagnostics tab only, no longer in the status bar, owner, no row moves); minor (updates: one-click updates of the macOS app through Sparkle 2 and the signed update manifest partial, D-4, 29 of 41 rows, 24 done and 5 partial); minor (; agents: the cached Secrets' values replaced in what agents read, Flux's credential fields withheld from their YAML (owner, H-82, H-63); agents: a terminal tab agents may read carries a flashing marker and its switch ends after 15 minutes without a read, H-83, owner; everyday use: a status filter in every view, the dashboards' states opening their views filtered (owner, D-34), done, 27 of 41 rows, 24 done and 3 partial; agents: `kinds_list` with each kind's actions, its cache state and the kinds not served, done, every MCP row done, 23 done and 3 partial; agents: `dock_read`, the output of logs and terminal tabs (D-44), done, 22 done and 4 partial; agents: every command a tool, checked over Cogpit's whole registry, GUI-only commands refused with their reason, the actions row done, 21 done and 5 partial; everyday use: the drawer's copy icon right after every kind of value, a pill's included (owner, D-25), still partial; everyday use: the certificates row with DER, the key check and the chain check (D-30, the owner's answers), no count moves; everyday use: certificates in Secrets decoded in the drawer and for agents done (D-30), 26 of 40 rows; everyday use: the lists' copy icon only outside a blacklist of columns and right after the text (owner, D-25), still done; `view_rows` waits for a column arrangement too; everyday use: names in the lists copyable with the drawer's copy icon done (D-25); `cogpit-cli contexts` marks an insecure context, no count moves; the Diagnostics tab, still partial; the audit log in the window done; the agent writes allowance in Cluster Settings › Agents done; `object_get` with related objects done; `view_rows` done; crash recovery: unsaved editor content restored from its local draft done; the `cogpit-cli mcp` stdio bridge done; command line: `cogpit-cli contexts` done, `get` partial; the built-in agent's engine side built (M12 (a)): 3 rows done, 5 partial, 37 of 43 rows, 27 done and 10 partial; the built-in agent, the window's half (M12 (b), night): six rows from missing to partial (the chat column, the view and selection's chip, Preferences › Agent, the limits, what was sent, ⌘I), 35 of 43 rows (24 done, 11 partial); the private connection's reads built in the engine (M12 (c)), the row still partial; `cogpit-cli contexts`: an unchecked certificate's approval state, A28; Crash recovery: the Helm row partial, as built since 2026-10-11, A17 built (an interrupted install offered nothing)) · **Target:** Lens Desktop 2026.10.51501 What Cogpit does that Lens Desktop does not, or does only in part. These rows are Cogpit's own targets, decided by the owner; they do not count toward the parity numbers in @@ -120,7 +120,7 @@ The owner's requirements of 2026-10-12, 2026-10-13 and 2026-10-14 that Lens Desk | Feature | Status | Evidence | |---|---|---| -| Every value in the detail drawer can be selected, and has a copy icon on hover; an entry of a value with several entries is copied in YAML syntax; a Secret's value only once revealed, and the clipboard cleared after 60 seconds ([D-25](../developer/decisions.md#d-25-copying-values)) | partial (2026-10-12): text lines (names, values, table cells, titles, events), event messages and revealed Secret values select by drag or double click and copy with ⌘C or Ctrl+C; every value, table cell and chip shows a copy icon on hover, a padding after what it draws (2026-10-13, the owner in a real window: a status pill's icon sat at the drawer's right edge), at the value's end with its text shortened with "…" before it when the text leaves no room, over the end of a value with action buttons (A71, below); entries of labels, annotations and other lists copy as `key: value` or a YAML scalar; every chip owns the room between itself and its icon, so the pointer reaches the icon of a label chip, the last chip of a row and a wrapped one; after a copy the icon is a checkmark for 1.5 s (2026-10-12); a masked Secret value has no icon, a revealed one copies and the clipboard is cleared after 60 seconds if it still holds it, a later copy cancels that, closing the window clears at once; since 2026-10-16 a Secret's value in an editor of its drawer (D-59, the owner's audit decision) has a copy icon of its own in the key's line, always shown with the editor, copying the whole value the same way (`TestSecretEditorCopyIcon`); no command. Not drag-selectable: links, chips and status pills (the icon copies them); a selection stays within one line. Decided (owner, 2026-10-14 evening, A71): Forward… sits right after the value as before, the copy icon appears over the value's end on hover; built 2026-10-15, the value's text not shortened for the icon; a link without buttons (a forward's URL) keeps the icon after its text (the lead's reading, open to revision). Confirmed (owner, 2026-10-14 evening): links, chips and pills are not drag-selectable, the icon copies them. | [`selection.go`](../../internal/ui/fyneui/selection.go), [`copy.go`](../../internal/ui/fyneui/copy.go); `TestDrawerCopyIconOnHover`, `TestDrawerCopiesEntriesInYAML`, `TestCopyIconReachableOnLabelChips`, `TestCopyIconReachableOnWrappedChips`, `TestCopyIconTurnsIntoACheckmark`, `TestDrawerCopyIconAfterThePill`, `TestDrawerCopyIconAfterTheText`, `TestDrawerCopyIconAfterTheMessage`, `TestDrawerCopyIconInAnActionRow`, `TestDrawerCopyIconAfterALinkWithoutButtons`, `TestYAMLEntry`, `TestDrawerTextIsSelectable`, `TestDrawerLongNamesSelectUnderTheEllipsis`, `TestSecretValueCopyOnlyOnceRevealed`, `TestSecretClipboardKeepsWhatReplacedIt`, `TestSecretTextSelectionCopiesAsASecret`, `TestCopyHasNoCommand` ([H-25](../security/credentials.md#h-25-a-copied-secret-value-reaches-the-clipboard)) | +| Every value in the detail drawer can be selected, and has a copy icon on hover; an entry of a value with several entries is copied in YAML syntax; a Secret's value revealed or, since 2026-10-22 (the owner's decision), masked without being shown, and the clipboard cleared after 60 seconds ([D-25](../developer/decisions.md#d-25-copying-values)) | partial (2026-10-12): text lines (names, values, table cells, titles, events), event messages and revealed Secret values select by drag or double click and copy with ⌘C or Ctrl+C; every value, table cell and chip shows a copy icon on hover, a padding after what it draws (2026-10-13, the owner in a real window: a status pill's icon sat at the drawer's right edge), at the value's end with its text shortened with "…" before it when the text leaves no room, over the end of a value with action buttons (A71, below); entries of labels, annotations and other lists copy as `key: value` or a YAML scalar; every chip owns the room between itself and its icon, so the pointer reaches the icon of a label chip, the last chip of a row and a wrapped one; after a copy the icon is a checkmark for 1.5 s (2026-10-12); a revealed Secret value copies and the clipboard is cleared after 60 seconds if it still holds it, a later copy cancels that, closing the window clears at once; since 2026-10-22 (the owner's decision, reversing "only once revealed") a masked one has the icon too, its tooltip "Copy the value without showing it", and copies the whole value without showing it, the drawer staying masked and the toast naming the key (`TestSecretMaskedValueCopiedWithoutShowing`, `TestSecretMaskedCopyRefusals`, in a Secret's editable drawer `TestSecretEditorMaskedValueCopiedWithoutShowing`), and a revealed value Show cut at 4 KiB copies the whole value through its icon, "Copy the whole value", a selection still exactly the selection (`TestSecretCutRevealedValueCopiedWhole`); since 2026-10-16 a Secret's value in an editor of its drawer (D-59, the owner's audit decision) has a copy icon of its own in the key's line, always shown with the editor, copying the whole value the same way (`TestSecretEditorCopyIcon`); no command. Not drag-selectable: links, chips and status pills (the icon copies them); a selection stays within one line. Decided (owner, 2026-10-14 evening, A71): Forward… sits right after the value as before, the copy icon appears over the value's end on hover; built 2026-10-15, the value's text not shortened for the icon; a link without buttons (a forward's URL) keeps the icon after its text (the lead's reading, open to revision). Confirmed (owner, 2026-10-14 evening): links, chips and pills are not drag-selectable, the icon copies them. | [`selection.go`](../../internal/ui/fyneui/selection.go), [`copy.go`](../../internal/ui/fyneui/copy.go); `TestDrawerCopyIconOnHover`, `TestDrawerCopiesEntriesInYAML`, `TestCopyIconReachableOnLabelChips`, `TestCopyIconReachableOnWrappedChips`, `TestCopyIconTurnsIntoACheckmark`, `TestDrawerCopyIconAfterThePill`, `TestDrawerCopyIconAfterTheText`, `TestDrawerCopyIconAfterTheMessage`, `TestDrawerCopyIconInAnActionRow`, `TestDrawerCopyIconAfterALinkWithoutButtons`, `TestYAMLEntry`, `TestDrawerTextIsSelectable`, `TestDrawerLongNamesSelectUnderTheEllipsis`, `TestSecretRevealedValueCopied`, `TestSecretMaskedValueCopiedWithoutShowing`, `TestSecretClipboardKeepsWhatReplacedIt`, `TestSecretTextSelectionCopiesAsASecret`, `TestCopyHasNoCommand` ([H-25](../security/credentials.md#h-25-a-copied-secret-value-reaches-the-clipboard)) | | Names in the lists (Pods, Deployments and every other view) are copyable: a list's cells get the drawer's copy icon on hover, at least the Name column's, with the same checkmark after a copy (owner, 2026-10-13, [D-25](../developer/decisions.md#d-25-copying-values)) | done (2026-10-13): in every list (one table for all views), one copy icon, the drawer's, on the cell under the pointer; a click copies the cell's full text (not the text shortened with "…"), turns the icon into the checkmark for 1.5 s and shows the drawer's toast, a plain copy, no command and no audit line. The owner after seeing it (2026-10-13): not on Age, CPU, Memory, Restarts and the like, by a blacklist so that custom resource columns keep it, and right after the text: built, the blacklist one place (`copyColumn`: number, age, until, metric and warning columns, a custom resource's integer, number and date printer columns, and the text ids of state words, booleans, counts and policy words listed in [D-25](../developer/decisions.md#d-25-copying-values), Cogpit's reading of the owner's principle); the icon a padding after the text, at the cell's end when the text leaves no room, never over the next column. Cogpit's defaults, not the owner's decision: none on the checkbox, the ⋮, the warning triangle, container squares, empty cells and `-`, `–`, ``; the click neither selects the row, toggles its checkbox nor opens the drawer, a right-click on the icon opens the row's actions menu as elsewhere on the row; a Secret's list holds no values (Name, Namespace, Labels, the keys' names, Type, Age), so no copy from it carries one. Not tried in a real window. Decided (owner, 2026-10-14 evening, A69): the copy icon lies over the cell's end and the text is no longer shortened for it; built 2026-10-15 (until then the text was shortened with "…" before the icon). Confirmed (owner, 2026-10-14 evening), now the owner's decisions: a checkmark and a toast on each copy; the exclusion list as built, for custom resource columns too. | [`tablecopy.go`](../../internal/ui/fyneui/tablecopy.go), [`copy.go`](../../internal/ui/fyneui/copy.go); `TestListCopyIconByColumn`, `TestCopyColumns`, `TestListCopyIconAfterTheText`, `TestListCopyIconOnHover`, `TestListCopyIconPlaceholders`, `TestListCopyIconCopiesTheFullText`, `TestListCopyIconFollowsTheCells`, `TestSecretsListCopiesNoValue`, `TestListCopyIconHasNoCommand`, `TestCopyHasNoCommand`; PNG [hover dark](../../internal/ui/fyneui/testdata/list_copy_hover_dark.png), [hover light](../../internal/ui/fyneui/testdata/list_copy_hover_light.png), [checkmark dark](../../internal/ui/fyneui/testdata/list_copy_done_dark.png), [checkmark light](../../internal/ui/fyneui/testdata/list_copy_done_light.png), [over a cut-off name dark](../../internal/ui/fyneui/testdata/list_copy_over_end_dark.png), [light](../../internal/ui/fyneui/testdata/list_copy_over_end_light.png) | | Certificates in Secrets decoded, in the drawer and for agents: for every key that holds a PEM certificate, each certificate's information in separate fields, which an agent reads too (owner, 2026-10-13, [D-30](../developer/decisions.md#d-30-certificates-in-secrets-decoded)) | done (2026-10-13): after the Data section a group "Certificates · " per key (`tls.crt` and `ca.crt` first, any Secret type), one section per certificate in the value's order titled by its common name, each field its own value with the drawer's copy icon: Subject and Subject DN, Issuer and Issuer DN, Serial Number, Not Before, Not After (the time left or "expired N days ago", OK, warning at 30 days or fewer, error when expired or not yet valid), DNS Names, IP Addresses, URIs, E-mail Addresses, Public Key, Signature Algorithm, CA with path length, Key Usage, Extended Key Usage, Self-Signed, SHA-256 Fingerprint, Subject and Authority Key ID; times in the Preferences' zone; `object_get` carries the same fields as `certificates` with RFC 3339 UTC times, `expiresInDays` and `expired`, never the PEM text, a value or a private key. The owner's answers of 2026-10-13, built the same day: agents and the built-in agent's endpoint read the certificates (decided, no longer a gap); DER certificates decoded like PEM ones; a Checks section per group, "Key Matches" (`tls.key` parsed in memory and compared with `tls.crt`'s first certificate: Yes, No as an error, or "Key not readable" with the reason; `keyMatches` for agents) and "Chain In Order" (each certificate signed by the next). Cogpit's defaults, not the owner's decision: which keys, the bounds (1 MiB per value, 16 certificates per key, 64 per Secret, 64 KiB per private key), the thresholds, the layout, which keys pair (`.crt` with `.key` or `-key.pem`, else the one certificate key with the one private key), the chain check and when it runs. Not done: a trust store, revocation, encrypted keys. Nothing from Lens, which has no such section. Decided (owner, 2026-10-14 evening) and built that night: a combined PEM (certificate and key in one value) gets the key check too ("Yes (in this value)"); an encrypted private key in the warning colour, "Encrypted key: TLS and Ingress cannot use it". Which kind of CA the chain leads to: the next row. | [`engine/secretcerts.go`](../../internal/engine/secretcerts.go), [`engine/secretcerts_checks.go`](../../internal/engine/secretcerts_checks.go), [`model/certs.go`](../../internal/model/certs.go), [`model/keymatch.go`](../../internal/model/keymatch.go); `TestParseCertificatesChain`, `TestParseCertificatesOnlyCertificateBlocks`, `TestCertificateEvaluate`, `TestSecretCertificateSections`, `TestSecretCertificateStatusesAndBounds`, `TestSecretCertificateEdges`, `TestObjectGetDecodesCertificatesForAgents`, `TestSecretDrawerShowsCertificates`, `TestMatchPrivateKeyPairs`, `TestMatchPrivateKeyReasons`, `TestChainInOrder`, `TestDecodeDERCertificates`, `TestSecretKeyMatchesCertificate`, `TestSecretCertificatePairingAndChain`, `TestSecretDERCertificates`, on kind `TestKindSecretCertificates`; PNG [dark](../../internal/ui/fyneui/testdata/secret_certs_dark.png), [light](../../internal/ui/fyneui/testdata/secret_certs_light.png) | | Certificates in Secrets: whether the chain leads to a public CA, to a CA this Mac trusts (a corporate root counts here) or to an internal or self-signed one, clear at a glance with the root's name, in the drawer and for agents (owner, 2026-10-14 evening) | done (2026-10-14 night, the lead's design, open to revision, [D-30](../developer/decisions.md#d-30-certificates-in-secrets-decoded)): the Checks section's "Chain Leads To" for a checked chain (a leaf, or a value with its key): "A public CA ()" for a root of Mozilla's NSS program (the bundle of `golang.org/x/crypto/x509roots`, embedded, the same on every computer), "A CA this Mac trusts, not a public one ()" for the computer's trust store, "An internal or self-signed CA ()" otherwise; judged at the middle of the first certificate's validity, so an expired certificate still names its anchor; agents read `anchor` (kind, root). Not tried in a real window | [`model/certanchor.go`](../../internal/model/certanchor.go), [`engine/secretcerts_checks.go`](../../internal/engine/secretcerts_checks.go); `TestCertAnchor`, `TestSecretChainAnchor`; [PNG](../../internal/ui/fyneui/testdata/secret_certs_dark.png) | @@ -183,6 +183,7 @@ Cogpit's targets. | Date | Change | Summary | |---|---|---| +| 2026-10-22 | minor | Everyday use: the drawer's copy row, a masked Secret value copied without being shown (the owner's decision, reversing "only once revealed", D-25), a revealed one Show cut copied whole by its icon (the lead's decision); no row moves | | 2026-10-22 | minor | Cluster integrations: a pod's image ratings as grades S to E and N/A, shields in the Pods list's narrow column and in each container section of the drawer (the owner's request and rules, D-113, PR #69); no row moves | | 2026-10-22 | trivial | Updates: the appcasts signed in `sparkle` without the owner's approval since 2026-10-22 (his choice, H-141); no row moves | | 2026-10-21 | minor | Updates (D-111, on the branch `windows-release`): one click updates the Windows setup through WinSparkle, the button installing at once; the row's first cell names WinSparkle instead of an MSI and a portable zip, its "Windows and Linux missing" gone (Linux since 2026-10-20); the package-manager row points at it; no row moves | diff --git a/docs/parity/gaps.md b/docs/parity/gaps.md index 5c3eb92c6..2c8aa7bb3 100644 --- a/docs/parity/gaps.md +++ b/docs/parity/gaps.md @@ -1,6 +1,6 @@ # Where Cogpit falls short of Lens -> **Last reviewed:** 2026-10-15 · **Last updated:** 2026-10-22 · **Change:** minor (G16: the alpha walk's focus findings AW5, AW6 and AW8 built on a branch: a dock tab the user opens takes the keys, the find bar's first ⌘F repaints and focuses its field, D-115; no estimate moves); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): G2's Missing, Evidence and Human, G18's Missing, Evidence and Human, the cloud sections in G5 and G13; no estimate moves); minor (G16: the owner's alpha walk of 2026-10-22 on v0.38.0, the gate's re-walk passed, findings AW1–AW19 none blocking, his decisions in D-114; no estimate moves); minor (G16: the owner's finding of 2026-10-22 on v0.37.3 fixed, a list narrowed while scrolled down drew no row; no estimate moves); minor (G16: the owner's findings of 2026-10-22 on v0.37.0 fixed, a view not read before an expired login or an interruption and the namespaces of the cluster shown before, the drawer's header after another pod; no estimate moves); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (G14's Human: the appcast jobs in `sparkle` sign without the owner's approval since 2026-10-22 (his choice, H-141); no number moves); trivial (G8: the terminal widget's upstream pull requests' state, #155 to #157 merged, #158's requested changes pushed, waiting for review); minor (G22: Cogpit for Windows built on the branch `windows-release`, D-111; what is left on Windows; re-estimated 20–45 h, the full Lens target ~360–900 h; G1, G2 and G14's Windows lines); patch (the external MCP server opt-in, D-49, noted beside A15's build; no gap moves); minor (G22: the Linux deb, Cogpit's APT repository and the updates through apt built 2026-10-20 night, D-108; what is left on Linux and Windows; re-estimated 30–65 h, the full Lens target ~370–920 h; G14's Linux line); minor (G16: GW13, no tab of a cluster without a connection; GW14, the crash on the foot's ?); minor (G16: GW1–GW12 built 2026-10-20, GW10 to GW12 from the owner's use the same day; the namespace filter's 100-row limit real and fixed); minor (G16: the owner's gate walk of 2026-10-20, findings GW1–GW9, not built; no estimate moves until the readiness recount); minor (G16: fast scrolling's proposal 1 in releases since v0.30.0; no estimate moves); minor (G16: fast scrolling's proposal 1 merged after the owner's look of 2026-10-20, in releases from the next one on; no estimate moves); minor (G16: fast scrolling's proposal 1 built on the branch `fast-scroll`, D-103: Fyne's thread check off in releases by a build parameter, the audit; no estimate moves); patch (G8: a log opened again under a name another pod or container instance holds now, checked and fixed: no line twice, a `[cogpit]` line where the log does not go on from its last line; no estimate moves); minor (G16: the owner's fast scrolling that jumps, measured: Fyne's thread check and its 60 Hz timer; his decisions on the proposals, not built); minor (G16: the owner's clicks on a pod that only checked it, as if ⌘ were held, fixed: a click takes ⌘ and ⇧ from its own mouse event; no estimate moves); minor (G16: a colleague's pod with one container square too many after the namespace filter, fixed: a list's cell with new content laid out again; no estimate moves); minor (G16: WF43 built, a Terminating namespace's blocking objects and Remove finalizers, D-98; no estimate moves); minor (G16: WF36 and WF41 built, D-99: a log tab's and a toast's text selected and copied; no estimate moves); minor (G16: the owner's walk of 2026-10-19 on v0.26.1, his findings WF31–WF45, not built yet; no estimate moves); minor (G16: the owner's mgmt-p, the service proxy's port by its number first (D-96), fixed); minor (G12: the source row centred, the owner's correction of WF24); minor (G12: a node's disks as a bar per real filesystem, the Nodes list's Disk the fullest (WF26, D-90); the charts' line as one path (WF23, D-89)); minor (G12: the source row under the charts with links to the settings only when needed, the provider settings on the integrations' own sections of Cluster Settings, D-87 and D-88; estimate not moved); minor (G16: WF15, an object's YAML in the Kubernetes order, built); minor (G16: WF13, WF14, WF16, WF19, the dialogs as tables, no raw resourceVersion, the CSV's name, built); minor (G16: WF20, a namespace filter carried to another cluster, fixed); minor (G13: the scope dropdown's bank note marked gone (D-57, D-83)); minor (G12: a cluster without a choice of integrations asks no metrics until its question's pre-choice is answered, the owner's WF5 of 2026-10-17, D-82; no estimate moves); minor (G13: one hotbar and the drag that carries the tile, the owner's WF7 and WF6 of 2026-10-17, D-83; the banks' two paid rows not a target; no estimate moves); minor (G16: the owner's WF9 of 2026-10-17, undo and redo in the YAML editor, built, D-84; no estimate moves); minor (G16: the owner's WF8 of 2026-10-17, a selection dragged out of the YAML editor lost the keyboard, its cause in Fyne's driver, fixed in the editor; Fyne's own text fields left as they are, the lead's decision; no estimate moves); minor (G2 and G16: the owner's F28 and F29 of 2026-10-17, a renewed client certificate Log in again could not use, its cause, and Reconnect from the kubeconfig file with the tabs kept, built, D-81; no estimate moves); minor (G13 and G16: the owner's F25, F26 and F27 of 2026-10-17, a cluster's uploaded icon on its tabs, a cluster's accent colour (the setting, D-80, H-125) and copy icons by its name and kubeconfig path, built; no estimate moves); minor (G18: Kyverno's policy violations on the objects, D-79, built 2026-10-17, are Cogpit's own, not Lens's Security Center, which reads Trivy's reports; no estimate moves); minor (G12: the cluster's alerts from its Alertmanager, the title bar's pill and the alert board, built 2026-10-17, D-77, beyond Lens and not counted in the gap; what is left of them; no estimate moves); minor (G12: the Metrics source kept as the two metrics integrations' switches, D-76, the owner's words of 2026-10-17; Cluster Settings › Integrations and the question at a new cluster's first connect, rows of beyond-lens; estimate not moved); minor (G16: the owner's F23 and F24 of 2026-10-17, a running container that is not ready orange in the Pods list and "+N" for the squares a narrow Containers cell cannot show, fixed; no estimate moves); minor (G18: Trivy Operator's reports read for a pod's image ratings, the owner's I6 of 2026-10-17, D-78; the gap stands); minor (v0.22.0 released 2026-10-17 08:14 UTC, its appcast waiting for the owner's approval with v0.20.0's and v0.21.0's); minor (G13 and G16: the owner's F22 of 2026-10-17, a context's client certificate, the time left or "expired", in the cluster lists, built, D-75; no estimate moves); minor (G5 and G16: the namespace filter's search field, a click on a name filtering to it alone and a click on a box adding it, the owner's F21 of 2026-10-17, built; estimate not moved); minor (G16: the owner's finding F20 of 2026-10-17, a node condition ending in Ready read as a problem when True, fixed; estimate not moved); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (G2: a login that waits built 2026-10-16 night, D-73, the owner's finding: Cancel Connecting ends a connect under way and its credential plugin, every plugin run bounded by 5 minutes, `waitingForLogin`, the connect's limit below the plugin; what is missing; H-118); minor (G2 and G9: the system's file panels on macOS, D-72; estimates not moved); minor (G12, night run 2026-10-16/17: the area under every chart's series filled, the five Overview rows saying what keeps them partial; G12 re-estimated 1–4 h (was 2–7), the totals within their rounding); minor (G12, night run 2026-10-16/17: a drawer that shows only the network or the filesystem asks for no CPU and memory, built, measured on a real cluster; estimate not moved); minor (G12, night run 2026-10-16/17: the namespace-limited user's Pods history by the plan's namespaces not built, the owner's A47 standing; the Missing entry corrected; estimate not moved); minor (G12, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and named so, D-71, built; Left of Prometheus done; estimate not moved); minor (G12, night run 2026-10-16/17: the Prometheus's namespace and service as links in the source line, built; estimate not moved); minor (G12, night run 2026-10-16/17: the Prometheus setting's fields on Cluster Settings › Metrics in place of the dialog, built; estimate not moved); minor (G17 closed: every cluster command names its cluster to agents, the connection log, the user, the drawer keys and the session settings checked, M9's triage and change workflows over MCP on kind, 2026-10-16 night; beyond Lens ~2–6 h); minor (G13: the welcome page without its "Connect to Cluster…" button, the workspace's kept, the owner's answer of 2026-10-16 evening (N122), built 2026-10-16 night; estimate not moved); minor (G5: a lone checked row's menu ends with Clear Selection, the owner's answer of 2026-10-16 evening (N112), built 2026-10-16 night; estimate not moved); minor (G5 and G13: the owner's answers of 2026-10-16 evening: a lone checked row's menu gains Clear Selection; the welcome page without its "Connect to Cluster…" button, the workspace's kept; not built yet); minor (G14: v0.17.0 to v0.19.0 released 2026-10-16, the feed holds 0.19.0 to 0.15.0); minor (G5: the selection bar's greyed Delete names the reason in its tooltip, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G9: the copy icon over a Secret's editor in the drawer, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G9: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G21: a chat connection's CA file replaces the system's roots, the owner's decision in the audit of 2026-10-16, N141; estimate not moved); minor (G5: each view keeps its checked rows, per tab and cluster, the owner's decision in the audit of 2026-10-16, N111, built the same day; estimate not moved); minor (G1, G2, G3, G4, G5, G9, G13: the owner's audit of the night decisions (2026-10-16) recorded, confirmed where he chose the built option; G5 and G9 gain two items he decided and that are not built, the greyed Delete's tooltip and a copy icon over a Secret's editor; G5's lone checked row's menu and G13's welcome page button to be changed, how not said yet; estimates not moved); minor (G12: Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61: metrics only from what the cluster runs, Lens Metrics not a target; G12 re-estimated 2–7 h (was 3–10), the totals within their rounding; G13 7 of 64 rows); minor (G5: D-69 stage 3 built 2026-10-16, a background cluster's login held while its setting says so and the last session restored at start, the tabs only with the preference on; estimate not moved); minor (G5: the window's part of several connected clusters built 2026-10-16, D-69 stage 2: the marks, switching without reconnecting, the dock per cluster; estimate not moved); minor (G5: several clusters connected at once as Lens keeps them, the engine part built 2026-10-16, D-69 stage 1; the window's part, stage 2, not built; estimate not moved); minor (G14: v0.13.0 has its disk image since a re-run); minor (G14: the disk image's window, D-70, 2026-10-16); minor (G2: the connection log built, D-66, 2026-10-16: every attempt on disk with its steps and error picture, a failed credential plugin's standard error scrubbed; the plugin's standard error no longer open, H-112; estimate not moved); minor (G2's standby entry: the states as dots, no word, blinking green while reconnecting, the owner's F13 2026-10-16; estimate not moved); minor (G14: the first update through the feed, 2026-10-16, the signed manifest done for macOS); minor (G14: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0); minor (G14: v0.14.0 and v0.15.0 notarized with files on 2026-10-16, their appcasts waiting for the owner; v0.13.0 not notarized in 330 minutes); minor (G23: Argo CD checked against a live Argo CD controller on a real cluster, 2026-10-16, night run, five findings fixed, estimate not moved); minor (the night run of 2026-10-15/16 recounted: G2 8–26 h (standby built), the free parity ~220–620 h, the full Lens target ~380–940 h; alpha ~50–200 h and beta ~220–600 h in the roadmap); minor (G4 and G7: Drain as a background job built 2026-10-16, night run, D-63: the cordon and a step per pod, the budget's wait, Cancel leaving the drain `stopped` in its journal, an agent's drain outliving its call); minor (G3: discovery cached on disk, D-65, and memory per kind and per cluster in the Diagnostics view built in the night run of 2026-10-16, measured on a real cluster; the definitions' schemas found holding most of the cache's memory, a candidate; G3 0–4 h (was 4–12), totals not recounted); minor (G6: an owner that is a custom resource links to it in the drawers and the Pods list, 2026-10-16; estimates not moved); minor (G6, G7: what a real cluster showed, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G6, G7: what a real cluster showed, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G1: `make scorecard` built 2026-10-16 in the night run, D-15, the first scorecard committed, removed from Missing; G1 0–2 h (was 3–8), the totals not recounted; G15: the scorecard as a way to measure, estimate not moved); minor (G1: the envtest tier and its CI job built 2026-10-16 in the night run, D-64, removed from Missing; estimate not moved); minor (G1: the envtest tier and its CI job built 2026-10-16 in the night run, D-64, removed from Missing; estimate not moved); minor (G12: Lens Metrics as Cogpit Metrics (D-61), the provider's query format, empty-container filter and HTTPS, a node's Network and Filesystem from node-exporter, built 2026-10-16 night and tried on kind and a real cluster, P13 measured there; G12 3–10 h (was 7–21), the totals recounted with it: free parity ~240–655 h, the full Lens target ~395–980 h); minor (G4: long commands as background jobs built 2026-10-16, night run, D-63: an action on a selection of more than ten objects as a job with progress in the dock and Cancel for every origin; G7, G9 say so; estimates not moved); minor (G2: standby and lost connections built 2026-10-16, D-58, what is left named, estimate not moved); minor (G1: parity-checklist.md generated by hack/parity, refused when stale in CI; estimate not moved); minor (G9, G7, G5: of the owner's audit answers the drawer's built, night run: a Config Map's Save rebasing by itself and its drafts, a Secret's values in the drawer, D-59; 42 of 42 actions); minor (G9: of the owner's audit answers, a Config Map's drawer Save rebasing by itself and its unsaved values kept as drafts built, night run); minor (G21: the owner's audit answers of 2026-10-15 for the chat built in the night run: send all tools per connection, the `http://` warning and a CA file per connection, F9; the estimate); minor (G21: send all tools per connection, the `http://` warning and a CA file per connection built in the night run, the owner's audit answers (4) and (6) of 2026-10-15); minor (G21: send all tools per connection built in the night run, the owner's audit answer (4) of 2026-10-15); minor (D-57 built: G5's navigator and welcome page, G13's choosing a cluster, G2's connect log and insecure mark follow the context picker's removal; estimates not moved); minor (G5: the selection bar from one checked row and `ui.navigate` leaving the checked rows alone, the owner's audit answers (7) and (8), built 2026-10-15 night; G5 9–35 h (was 11–41), the totals recounted at the night run's end); minor (AGENTS.md rule 10: every entry checked against the code at HEAD; the Missing lists rewritten to what is missing today (G2, G3, G4, G5, G6, G7, G8, G9, G13, G17, G23), the "Decided … not built" lines of G1, G5, G6, G8, G9, G11, G12, G13 and G23 brought to what is built, stale "still missing" and "yet" sentences corrected; the owner's decisions of 2026-10-15 added where they open work (standby and lost connections in G2, one list of clusters in G13, the owner's audit answers in G5, G9 and G21; G16's findings), verifying the cloud credential plugins out of scope until long after parity (owner, 2026-10-15); re-estimated 2026-10-15 (the lead's estimate, PhotoCraft's calibration): G2 15–43, G3 4–12, G4 0–3, G5 11–41, G8 7–25, G9 5–17, G12 7–21, G13 28–96, G21 6–18, G23 8–22 h; free parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h); minor (G14: Sparkle's update key set up by the owner 2026-10-15, in the releases since v0.11.0, no signed appcast yet; the signed disk image proven by v0.6.0 to v0.8.0; notarization in a job of its own since 163664f2; G21's summary row and the beyond-Lens total brought to the entry's 3–10 h; estimates not moved); minor (G21: the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), its keychain item for Windows and Linux gone; G22 without the keychain backends; estimates not moved); minor (G5, G9, G16: the owner's F3 built, D-53: data keys above their values, a Config Map's values in editors saved in the drawer through `configMap.saveData`, names wrapping at - . _ /; estimates not moved); minor (G5: the title bar's Update button built, the owner's finding F7; estimate not moved); minor (G5: a copy's confirmation not in the notification log (F5); estimates not moved); minor (G21: H-96 built, a conversation in which a turn ran over a private connection is not kept, files of v0.8.0 to v0.10.0 cleaned at the next start; estimate not moved); minor (G21: H-96 decided, a private connection's conversations not kept, not built; G13: R3 postponed by the owner; estimates not moved); minor (G13: R2 built, hotbar tiles reordered by drag and drop, the paid row partial, the lead's decisions for the owner to confirm; estimate not moved); minor (G13: several windows designed, D-52, the owner's decision pending, estimate not moved); minor (G5: A73, A69 and A71 built, a plain click keeps the checked rows, the copy icon over a list cell's end and over a port's end with Forward… right after it; estimate not moved); minor (G1, G8: the terminal fork's four shell tests under the race detector in CI, A116 built, its races patched; estimates not moved); minor (G1: the README's pictures dark and light, its banner, lossless oxipng and one context name, A110, A111, A112, A114 built); minor (G13: About Cogpit in macOS's application menu, the dialog laid out anew and showing the version the build reports, decision A60 and the owner's finding F2 built; G16: that finding fixed; estimates not moved); minor (the owner's decision round of 2026-10-14 evening: a "Decided" bullet in G1, G2, G5 to G9, G11 to G14, G17 and G23 with what he confirmed and what he decided, not built; his findings in a real window in G12 (no node history from Prometheus, the next implementation's first item), G13 (About shows 0.0.1) and G16; G11: the SQL driver out of scope; G12: ranges beyond 30 days not to be built, the per-range query step answered; G13: the hotbar's drag to reorder and a tile dragged out to another window required; estimates not moved); minor (G14: D-16 revised by the owner, `cogpit-cli` inside the macOS app and the disk image the release's only download besides `SHA256SUMS`, built by agent CLIBUNDLE, not yet proven by a release, estimate not moved; G22: no `cogpit-cli` archives for Windows and Linux any more); minor (G14: Sparkle 2 and the signed appcast built, no update key yet; G15: P1 measured on the engine side; G13: deep links partial on macOS, D-47, estimate not moved; G13: start at login partial on macOS, D-48; G17: the cached Secrets' values and Flux's credential fields kept out of what agents read, H-82 and H-63 (owner), built; G11: credentials over plain http asked once per repository, H-40 (owner), built; G8: a node shell pod a crash left deleted at the next connect, H-71, owner; G7: an agent's role binding always waits for the user, H-27, owner; G14: the signed, notarized disk image built in the release pipeline, no tag run yet; , estimate not moved; G14: the Apple signing material exists, 2026-10-14, no longer a human prerequisite; G6: the workloads' drawers' Pods tables without a Namespace column, D-40 decided by the owner, estimate not moved; G23: Reconcile with Source and Reset built (D-33, decided by the owner), removed from Left, estimate not moved; G23: the views' status filter built, a dashboard's state opens its view filtered (owner, D-34), removed from Left (Flux CD), estimate not moved; G7, G13: D-37 decided by the owner, the node shell's default image the newest supported Alpine release kept current by Renovate and its Maximum duration built, estimates not moved; G12: the Metrics source setting built, removed from Missing, estimate not moved; G12: the Overview's Pods history from kube-state-metrics built (a night decision for the owner to confirm), removed from Missing, estimate down to 8–20 h; G12: history that outlives a closed drawer built (a night decision for the owner to confirm), removed from Missing, estimate not moved; G12: the Nodes list's Disk built (D-43, a night decision for the owner to confirm), removed from Missing, estimate not moved; G12: the Nodes list's usage bars built, removed from Missing, estimate not moved; G11: chart icons built, D-46, removed from Missing, estimate 2–8 h (was 3–10), totals not recounted; G11: the README in the chart's drawer built with a version picker, night build HELM2, estimate not moved; G5, G13: a context that leaves Cogpit takes its dock tabs, a connect under way forgets it, fixed, estimates not moved; G3, G23: the Flux and Argo CD dashboards follow a namespace-limited user's plans and refusals and say when the definitions cannot be listed, a refused label-selected scope not kept warm, fixed, estimates not moved; G17: `kinds_list` completed, every MCP row done, estimate 0–2 h, totals not recounted; G17: `dock_read` built (D-44); G17: every command a tool over the whole registry, GUI-only commands refused under one mark, estimate not moved; G5: no context picker by itself at start (D-42); G5, G13: the tabs and the tables' layout kept across a restart without connecting anything (D-41), a removed cluster's context forgotten, a vanished kubeconfig file's tabs closed with a notice; G6: a Pods table in the workloads' drawers built (D-40, a night decision for the owner to confirm), removed from Missing, from indexes only the open drawer holds, estimate not moved; G12: Prometheus detection follows a namespace-limited user's refusal, fixed; G3: a refused list of the custom resource definitions not retried until a refresh, and the namespace-limited user checked on kind, fixed; G3: views' indexes, an agent's Overviews, `Lookup` and write targets, Helm's releases and the Applications follow a namespace-limited user's plan and refusals, fixed; G12: pod metrics per namespace for a namespace-limited user, D-39, a night decision, built, estimate not moved; G3: one object's read, `object_get`, `cogpit-cli get` and the drawer, takes the object's namespace, fixed; G3: a refused read in all namespaces counts whoever met it, logs, port forwards, one object and `resources_list` follow it at once, fixed; G23: Argo CD built, partial, night build (D-35, D-36), its remainder 3–8 h, the gap's estimate for the lead; G23: Argo CD built, partial, night build (D-35, D-36), its remainder 4–10 h, the gap's estimate for the lead; G23: the Flux CD section built, partial: its views, dashboard and actions, D-33, D-34, Flux's remainder 6–15 h, the table's estimate for the lead; G7, G8, G13: the node shell (D-37) and Cluster Settings › Node Shell partial, 39 of 39 actions, estimates of G7 and G8 down; G9, G7: Create Secret partial, the eighth create dialog, the user's only (D-19), 38 of 39 actions; G1: CI rebuilt as parallel jobs of at most ten minutes, GoSec and cyclomatic complexity added, semantic-release live; G14: each release carries the unsigned app, `cogpit-cli` and `SHA256SUMS`, estimate not moved; G12, G6: a node drawer's Pods table with CPU and Memory and sortable, owner, removed from Missing, estimate not moved; G12: every byte amount in binary units with one decimal, D-32, estimate not moved; G8, G13: every timestamp in the zone and the region's format, D-31, estimates not moved; G6: the Secrets drawer decodes certificates, beyond Lens (D-30), estimate not moved; G5: the lists' copy icon outside a blacklist of columns and right after the text (owner, D-25), estimate not moved; G11: D-29 built, authenticated repositories from Helm's file, estimate 3–10 h; G3: workload logs, port forwards and one object's read follow the access reviews' answers, fixed; G5: copy icons in the lists built (D-25), estimate not moved; G3: the Overviews follow the access reviews' answers, fixed; G6: references to Pod Security Policies, admission policies and Device Resources link, fixed; G2: `cogpit-cli contexts` marks an insecure context; G5, G13: a removed cluster's tabs close, fixed; G13: Cluster › Disconnect follows a reconnect, fixed; G11, G5: the owner's requirements of the morning after the night run (D-29, D-25); G17: `view_rows`, `object_get`'s related objects, the agent writes allowance and the audit log in the GUI built; G17: `view_rows`, `object_get`'s related objects and the agent writes allowance in the GUI built; G17: `view_rows` and `object_get`'s related objects built; G17: `view_rows` built; G9: the Create resource tab's save and search buttons built, Revert to original built, drafts of unsaved editor text built, estimate not moved; G9: Revert to original built, drafts of unsaved editor text built, estimate not moved; G9: drafts of unsaved editor text built, estimate not moved; G3: namespace-scoped informers for users who may not list a kind in all namespaces built, estimate not moved; G11: the ConfigMaps storage driver built, the SQL one left missing with its reason, estimate not moved; G2: the kubeconfig's `proxy-url`, CA, `tls-server-name` and `insecure-skip-tls-verify` verified against TLS test servers, a `proxy-url` password kept out of connect errors, insecure contexts marked, estimate 8–25 h; G13: the kubectl Preferences built; G8: kubectl for terminals built, D-3; G6: the node drawer's Devices section built, estimate not moved; G8: copy and paste with the right mouse button partial, the Windows and Linux copy and paste keys, estimate not moved; G5: the search field's "Aa" and ".*" toggles built, estimate not moved; G13: the non-cluster proxy built, untrusted CAs held back; G13: a cluster's proxy built; G12: hidden metrics built; G5, G13: the navigator's section level, Local Kubeconfigs, and its scope as engine state built, the tab bar showing the scope's tabs, two rows from missing to partial, estimates not moved; G5: the title bar's history arrows, notifications and context menu built; G5: column reorder by dragging built; G5: row checkboxes and the selection's menu built; G9, G7: Delete of a selection built in the engine (`object.deleteMany`), estimates not moved; G5, G13: the welcome page, the Help and Window menus, Disconnect and Remove from Cogpit built, four rows partial, estimates not moved; G8: the log tab's pod and container selectors, older lines and jump to a time partial; G8: the log tab's pod and container selectors and older lines partial; G8: the log tab's pod and container selectors partial; G11: a release upgraded to a version from the user's repositories; G5, G13: the tab bar of cluster views built, its five shortcut rows, the navigator's ⇧↵ fixed tab, estimates not moved; G13: Preferences and Cluster settings built, night run, 11 rows partial, G8's terminal rows 2, estimates not moved; G12: the cluster Overview built, the remainder 15–35 h; G6: Applications, Vertical Pod Autoscalers and the four Device Resources views partial; G6: Vertical Pod Autoscalers and the four Device Resources views partial; G6: the four Device Resources views partial; G11: chart repositories, the Charts view and the install built; G12: the owner's evening requirements built (both providers together, the status line, the fallback, a missing value as an empty cell; measured on kind); G13: the command palette and its shortcuts built, estimate 50–140 h, the summary table not recounted; G2: `cogpit-cli contexts` and `get` built; G5, G13: the navigator's header, root, tooltips and keyboard built; G12: the owner's evening requirements (provider status line, Prometheus history then Metrics Server live) and the open step question; G16: the quit crash fixed; G12: Prometheus in the window, checked against a real Prometheus on kind; G12: Prometheus, backend; G2: Lens's Kubeconfig Syncs captures followed, scope C2; totals not recounted; G21: the built-in agent's engine side built, re-estimated at 20–40 h, the beyond-Lens total ~20–42 h; G12, G1, G16: node history from node-exporter built in the night run (F1, A43, A115); G12: query sets for ranges far apart built (A46); G21: the built-in agent's window half built (the chat column, Preferences › Agent), night run, six rows partial, estimate not moved; G21: the private connection's reads built in the engine (M12 (c)), estimate not moved; G8: Download saves what the logs tab shows (A84) and the Jump to time field's cut placeholder fixed (#169), estimate not moved; G23: Flux and Argo CD from API discovery without the definitions (A90), estimate not moved; G23: Reconcile with Source waits as the flux CLI does (A91), estimate not moved; G8: an application's logs in one merged tab (A81), estimate not moved; G8: kubectl's signature with sigstore-go and its Rekor entry, D-50 built, estimate not moved; G5, G13: the owner's A51–A55, A61, A63, A64, A67 and A113 built 2026-10-15 (the navigator's and the palette's state as engine state, D-51 with night decisions for the owner to confirm; the ring on keyboard navigation only; the dropdown of the hotbar's clusters; collapsible source groups; Disconnect closing the tabs; F1–F12 in the search fields; ⌘F and ⌘⇧T in the View menu; the welcome page's Recent and links), estimates not moved; G2, G13: the plugin approval binds Cogpit's proxy, A23; G2: an unchecked certificate asked once, A28; G2: "TLS not checked" while connected, A29; G11: A39 built; G11: A17 built; G11: A36 built; G11: A14 built 2026-10-15) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-15 · **Last updated:** 2026-10-22 · **Change:** minor (G16: the alpha walk's findings AW1–AW19 all built 2026-10-22, PRs #74 to #82, the owner's re-walk open; the estimate checked, not moved); patch (G16: AW14 built on a branch, Follow switched by scrolling, D-99; no estimate moves); patch (G16: AW11 built on a branch, a deleted namespace the filter names read on the namespaces' own changes, D-106; no estimate moves); minor (G16: AW7, AW9 and AW10 of the owner's alpha walk built 2026-10-22 on a branch, the dialogs' Context label grey, the minimised dock opened by a tab shown again, ⌘⌥⇧← and ⌘⌥⇧→ in the dock; no estimate moves); minor (G16: the owner's AW15 and AW16 of 2026-10-22 built, a cancelled connect and one left in the background raise no toast on any path; no estimate moves); minor (G16: AW13, AW17 and AW18 built on a branch, D-114: a failed connect's error page with the connect's stages, the welcome page without "Other clusters", the stray "Could not" fixed); minor (G16: AW12's welcome page rows no longer hold a click for a double click's, a second click on a cluster connecting connects nothing more; no estimate moves); minor (G16: AW12 built on a branch, a click below a list's rows closes the drawer at once, the table no `fyne.DoubleTappable`; no estimate moves); minor (G16: the alpha walk's AW1–AW4 and AW19 built on a branch, Escape closes the innermost thing and a closed dropdown is outlined, D-116 and D-104); minor (G16: the alpha walk's focus findings AW5, AW6 and AW8 built on a branch: a dock tab the user opens takes the keys, the find bar's first ⌘F repaints and focuses its field, D-115; no estimate moves); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): G2's Missing, Evidence and Human, G18's Missing, Evidence and Human, the cloud sections in G5 and G13; no estimate moves); minor (G16: the owner's alpha walk of 2026-10-22 on v0.38.0, the gate's re-walk passed, findings AW1–AW19 none blocking, his decisions in D-114; no estimate moves); minor (G16: the owner's finding of 2026-10-22 on v0.37.3 fixed, a list narrowed while scrolled down drew no row; no estimate moves); minor (G16: the owner's findings of 2026-10-22 on v0.37.0 fixed, a view not read before an expired login or an interruption and the namespaces of the cluster shown before, the drawer's header after another pod; no estimate moves); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (G14's Human: the appcast jobs in `sparkle` sign without the owner's approval since 2026-10-22 (his choice, H-141); no number moves); trivial (G8: the terminal widget's upstream pull requests' state, #155 to #157 merged, #158's requested changes pushed, waiting for review); minor (G22: Cogpit for Windows built on the branch `windows-release`, D-111; what is left on Windows; re-estimated 20–45 h, the full Lens target ~360–900 h; G1, G2 and G14's Windows lines); patch (the external MCP server opt-in, D-49, noted beside A15's build; no gap moves); minor (G22: the Linux deb, Cogpit's APT repository and the updates through apt built 2026-10-20 night, D-108; what is left on Linux and Windows; re-estimated 30–65 h, the full Lens target ~370–920 h; G14's Linux line); minor (G16: GW13, no tab of a cluster without a connection; GW14, the crash on the foot's ?); minor (G16: GW1–GW12 built 2026-10-20, GW10 to GW12 from the owner's use the same day; the namespace filter's 100-row limit real and fixed); minor (G16: the owner's gate walk of 2026-10-20, findings GW1–GW9, not built; no estimate moves until the readiness recount); minor (G16: fast scrolling's proposal 1 in releases since v0.30.0; no estimate moves); minor (G16: fast scrolling's proposal 1 merged after the owner's look of 2026-10-20, in releases from the next one on; no estimate moves); minor (G16: fast scrolling's proposal 1 built on the branch `fast-scroll`, D-103: Fyne's thread check off in releases by a build parameter, the audit; no estimate moves); patch (G8: a log opened again under a name another pod or container instance holds now, checked and fixed: no line twice, a `[cogpit]` line where the log does not go on from its last line; no estimate moves); minor (G16: the owner's fast scrolling that jumps, measured: Fyne's thread check and its 60 Hz timer; his decisions on the proposals, not built); minor (G16: the owner's clicks on a pod that only checked it, as if ⌘ were held, fixed: a click takes ⌘ and ⇧ from its own mouse event; no estimate moves); minor (G16: a colleague's pod with one container square too many after the namespace filter, fixed: a list's cell with new content laid out again; no estimate moves); minor (G16: WF43 built, a Terminating namespace's blocking objects and Remove finalizers, D-98; no estimate moves); minor (G16: WF36 and WF41 built, D-99: a log tab's and a toast's text selected and copied; no estimate moves); minor (G16: the owner's walk of 2026-10-19 on v0.26.1, his findings WF31–WF45, not built yet; no estimate moves); minor (G16: the owner's mgmt-p, the service proxy's port by its number first (D-96), fixed); minor (G12: the source row centred, the owner's correction of WF24); minor (G12: a node's disks as a bar per real filesystem, the Nodes list's Disk the fullest (WF26, D-90); the charts' line as one path (WF23, D-89)); minor (G12: the source row under the charts with links to the settings only when needed, the provider settings on the integrations' own sections of Cluster Settings, D-87 and D-88; estimate not moved); minor (G16: WF15, an object's YAML in the Kubernetes order, built); minor (G16: WF13, WF14, WF16, WF19, the dialogs as tables, no raw resourceVersion, the CSV's name, built); minor (G16: WF20, a namespace filter carried to another cluster, fixed); minor (G13: the scope dropdown's bank note marked gone (D-57, D-83)); minor (G12: a cluster without a choice of integrations asks no metrics until its question's pre-choice is answered, the owner's WF5 of 2026-10-17, D-82; no estimate moves); minor (G13: one hotbar and the drag that carries the tile, the owner's WF7 and WF6 of 2026-10-17, D-83; the banks' two paid rows not a target; no estimate moves); minor (G16: the owner's WF9 of 2026-10-17, undo and redo in the YAML editor, built, D-84; no estimate moves); minor (G16: the owner's WF8 of 2026-10-17, a selection dragged out of the YAML editor lost the keyboard, its cause in Fyne's driver, fixed in the editor; Fyne's own text fields left as they are, the lead's decision; no estimate moves); minor (G2 and G16: the owner's F28 and F29 of 2026-10-17, a renewed client certificate Log in again could not use, its cause, and Reconnect from the kubeconfig file with the tabs kept, built, D-81; no estimate moves); minor (G13 and G16: the owner's F25, F26 and F27 of 2026-10-17, a cluster's uploaded icon on its tabs, a cluster's accent colour (the setting, D-80, H-125) and copy icons by its name and kubeconfig path, built; no estimate moves); minor (G18: Kyverno's policy violations on the objects, D-79, built 2026-10-17, are Cogpit's own, not Lens's Security Center, which reads Trivy's reports; no estimate moves); minor (G12: the cluster's alerts from its Alertmanager, the title bar's pill and the alert board, built 2026-10-17, D-77, beyond Lens and not counted in the gap; what is left of them; no estimate moves); minor (G12: the Metrics source kept as the two metrics integrations' switches, D-76, the owner's words of 2026-10-17; Cluster Settings › Integrations and the question at a new cluster's first connect, rows of beyond-lens; estimate not moved); minor (G16: the owner's F23 and F24 of 2026-10-17, a running container that is not ready orange in the Pods list and "+N" for the squares a narrow Containers cell cannot show, fixed; no estimate moves); minor (G18: Trivy Operator's reports read for a pod's image ratings, the owner's I6 of 2026-10-17, D-78; the gap stands); minor (v0.22.0 released 2026-10-17 08:14 UTC, its appcast waiting for the owner's approval with v0.20.0's and v0.21.0's); minor (G13 and G16: the owner's F22 of 2026-10-17, a context's client certificate, the time left or "expired", in the cluster lists, built, D-75; no estimate moves); minor (G5 and G16: the namespace filter's search field, a click on a name filtering to it alone and a click on a box adding it, the owner's F21 of 2026-10-17, built; estimate not moved); minor (G16: the owner's finding F20 of 2026-10-17, a node condition ending in Ready read as a problem when True, fixed; estimate not moved); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (G2: a login that waits built 2026-10-16 night, D-73, the owner's finding: Cancel Connecting ends a connect under way and its credential plugin, every plugin run bounded by 5 minutes, `waitingForLogin`, the connect's limit below the plugin; what is missing; H-118); minor (G2 and G9: the system's file panels on macOS, D-72; estimates not moved); minor (G12, night run 2026-10-16/17: the area under every chart's series filled, the five Overview rows saying what keeps them partial; G12 re-estimated 1–4 h (was 2–7), the totals within their rounding); minor (G12, night run 2026-10-16/17: a drawer that shows only the network or the filesystem asks for no CPU and memory, built, measured on a real cluster; estimate not moved); minor (G12, night run 2026-10-16/17: the namespace-limited user's Pods history by the plan's namespaces not built, the owner's A47 standing; the Missing entry corrected; estimate not moved); minor (G12, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and named so, D-71, built; Left of Prometheus done; estimate not moved); minor (G12, night run 2026-10-16/17: the Prometheus's namespace and service as links in the source line, built; estimate not moved); minor (G12, night run 2026-10-16/17: the Prometheus setting's fields on Cluster Settings › Metrics in place of the dialog, built; estimate not moved); minor (G17 closed: every cluster command names its cluster to agents, the connection log, the user, the drawer keys and the session settings checked, M9's triage and change workflows over MCP on kind, 2026-10-16 night; beyond Lens ~2–6 h); minor (G13: the welcome page without its "Connect to Cluster…" button, the workspace's kept, the owner's answer of 2026-10-16 evening (N122), built 2026-10-16 night; estimate not moved); minor (G5: a lone checked row's menu ends with Clear Selection, the owner's answer of 2026-10-16 evening (N112), built 2026-10-16 night; estimate not moved); minor (G5 and G13: the owner's answers of 2026-10-16 evening: a lone checked row's menu gains Clear Selection; the welcome page without its "Connect to Cluster…" button, the workspace's kept; not built yet); minor (G14: v0.17.0 to v0.19.0 released 2026-10-16, the feed holds 0.19.0 to 0.15.0); minor (G5: the selection bar's greyed Delete names the reason in its tooltip, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G9: the copy icon over a Secret's editor in the drawer, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G9: keys added and removed in a Config Map's and a Secret's drawer, the owner's audit decision of 2026-10-16, built; estimate not moved); minor (G21: a chat connection's CA file replaces the system's roots, the owner's decision in the audit of 2026-10-16, N141; estimate not moved); minor (G5: each view keeps its checked rows, per tab and cluster, the owner's decision in the audit of 2026-10-16, N111, built the same day; estimate not moved); minor (G1, G2, G3, G4, G5, G9, G13: the owner's audit of the night decisions (2026-10-16) recorded, confirmed where he chose the built option; G5 and G9 gain two items he decided and that are not built, the greyed Delete's tooltip and a copy icon over a Secret's editor; G5's lone checked row's menu and G13's welcome page button to be changed, how not said yet; estimates not moved); minor (G12: Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61: metrics only from what the cluster runs, Lens Metrics not a target; G12 re-estimated 2–7 h (was 3–10), the totals within their rounding; G13 7 of 64 rows); minor (G5: D-69 stage 3 built 2026-10-16, a background cluster's login held while its setting says so and the last session restored at start, the tabs only with the preference on; estimate not moved); minor (G5: the window's part of several connected clusters built 2026-10-16, D-69 stage 2: the marks, switching without reconnecting, the dock per cluster; estimate not moved); minor (G5: several clusters connected at once as Lens keeps them, the engine part built 2026-10-16, D-69 stage 1; the window's part, stage 2, not built; estimate not moved); minor (G14: v0.13.0 has its disk image since a re-run); minor (G14: the disk image's window, D-70, 2026-10-16); minor (G2: the connection log built, D-66, 2026-10-16: every attempt on disk with its steps and error picture, a failed credential plugin's standard error scrubbed; the plugin's standard error no longer open, H-112; estimate not moved); minor (G2's standby entry: the states as dots, no word, blinking green while reconnecting, the owner's F13 2026-10-16; estimate not moved); minor (G14: the first update through the feed, 2026-10-16, the signed manifest done for macOS); minor (G14: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0); minor (G14: v0.14.0 and v0.15.0 notarized with files on 2026-10-16, their appcasts waiting for the owner; v0.13.0 not notarized in 330 minutes); minor (G23: Argo CD checked against a live Argo CD controller on a real cluster, 2026-10-16, night run, five findings fixed, estimate not moved); minor (the night run of 2026-10-15/16 recounted: G2 8–26 h (standby built), the free parity ~220–620 h, the full Lens target ~380–940 h; alpha ~50–200 h and beta ~220–600 h in the roadmap); minor (G4 and G7: Drain as a background job built 2026-10-16, night run, D-63: the cordon and a step per pod, the budget's wait, Cancel leaving the drain `stopped` in its journal, an agent's drain outliving its call); minor (G3: discovery cached on disk, D-65, and memory per kind and per cluster in the Diagnostics view built in the night run of 2026-10-16, measured on a real cluster; the definitions' schemas found holding most of the cache's memory, a candidate; G3 0–4 h (was 4–12), totals not recounted); minor (G6: an owner that is a custom resource links to it in the drawers and the Pods list, 2026-10-16; estimates not moved); minor (G6, G7: what a real cluster showed, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G6, G7: what a real cluster showed, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G7: a confirmation names its objects by kind, not kind key, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G7: a failed drain that evicted nothing no longer says "partly drained", found on a real cluster 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G6: an event's involved custom resource links to its view, found on a real cluster 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G23: an OCI Helm repository without a status Ready as the flux CLI shows it, the dashboard's counts checked against `flux get` on a real cluster, 2026-10-16; estimates not moved); minor (G1: `make scorecard` built 2026-10-16 in the night run, D-15, the first scorecard committed, removed from Missing; G1 0–2 h (was 3–8), the totals not recounted; G15: the scorecard as a way to measure, estimate not moved); minor (G1: the envtest tier and its CI job built 2026-10-16 in the night run, D-64, removed from Missing; estimate not moved); minor (G1: the envtest tier and its CI job built 2026-10-16 in the night run, D-64, removed from Missing; estimate not moved); minor (G12: Lens Metrics as Cogpit Metrics (D-61), the provider's query format, empty-container filter and HTTPS, a node's Network and Filesystem from node-exporter, built 2026-10-16 night and tried on kind and a real cluster, P13 measured there; G12 3–10 h (was 7–21), the totals recounted with it: free parity ~240–655 h, the full Lens target ~395–980 h); minor (G4: long commands as background jobs built 2026-10-16, night run, D-63: an action on a selection of more than ten objects as a job with progress in the dock and Cancel for every origin; G7, G9 say so; estimates not moved); minor (G2: standby and lost connections built 2026-10-16, D-58, what is left named, estimate not moved); minor (G1: parity-checklist.md generated by hack/parity, refused when stale in CI; estimate not moved); minor (G9, G7, G5: of the owner's audit answers the drawer's built, night run: a Config Map's Save rebasing by itself and its drafts, a Secret's values in the drawer, D-59; 42 of 42 actions); minor (G9: of the owner's audit answers, a Config Map's drawer Save rebasing by itself and its unsaved values kept as drafts built, night run); minor (G21: the owner's audit answers of 2026-10-15 for the chat built in the night run: send all tools per connection, the `http://` warning and a CA file per connection, F9; the estimate); minor (G21: send all tools per connection, the `http://` warning and a CA file per connection built in the night run, the owner's audit answers (4) and (6) of 2026-10-15); minor (G21: send all tools per connection built in the night run, the owner's audit answer (4) of 2026-10-15); minor (D-57 built: G5's navigator and welcome page, G13's choosing a cluster, G2's connect log and insecure mark follow the context picker's removal; estimates not moved); minor (G5: the selection bar from one checked row and `ui.navigate` leaving the checked rows alone, the owner's audit answers (7) and (8), built 2026-10-15 night; G5 9–35 h (was 11–41), the totals recounted at the night run's end); minor (AGENTS.md rule 10: every entry checked against the code at HEAD; the Missing lists rewritten to what is missing today (G2, G3, G4, G5, G6, G7, G8, G9, G13, G17, G23), the "Decided … not built" lines of G1, G5, G6, G8, G9, G11, G12, G13 and G23 brought to what is built, stale "still missing" and "yet" sentences corrected; the owner's decisions of 2026-10-15 added where they open work (standby and lost connections in G2, one list of clusters in G13, the owner's audit answers in G5, G9 and G21; G16's findings), verifying the cloud credential plugins out of scope until long after parity (owner, 2026-10-15); re-estimated 2026-10-15 (the lead's estimate, PhotoCraft's calibration): G2 15–43, G3 4–12, G4 0–3, G5 11–41, G8 7–25, G9 5–17, G12 7–21, G13 28–96, G21 6–18, G23 8–22 h; free parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h); minor (G14: Sparkle's update key set up by the owner 2026-10-15, in the releases since v0.11.0, no signed appcast yet; the signed disk image proven by v0.6.0 to v0.8.0; notarization in a job of its own since 163664f2; G21's summary row and the beyond-Lens total brought to the entry's 3–10 h; estimates not moved); minor (G21: the API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), its keychain item for Windows and Linux gone; G22 without the keychain backends; estimates not moved); minor (G5, G9, G16: the owner's F3 built, D-53: data keys above their values, a Config Map's values in editors saved in the drawer through `configMap.saveData`, names wrapping at - . _ /; estimates not moved); minor (G5: the title bar's Update button built, the owner's finding F7; estimate not moved); minor (G5: a copy's confirmation not in the notification log (F5); estimates not moved); minor (G21: H-96 built, a conversation in which a turn ran over a private connection is not kept, files of v0.8.0 to v0.10.0 cleaned at the next start; estimate not moved); minor (G21: H-96 decided, a private connection's conversations not kept, not built; G13: R3 postponed by the owner; estimates not moved); minor (G13: R2 built, hotbar tiles reordered by drag and drop, the paid row partial, the lead's decisions for the owner to confirm; estimate not moved); minor (G13: several windows designed, D-52, the owner's decision pending, estimate not moved); minor (G5: A73, A69 and A71 built, a plain click keeps the checked rows, the copy icon over a list cell's end and over a port's end with Forward… right after it; estimate not moved); minor (G1, G8: the terminal fork's four shell tests under the race detector in CI, A116 built, its races patched; estimates not moved); minor (G1: the README's pictures dark and light, its banner, lossless oxipng and one context name, A110, A111, A112, A114 built); minor (G13: About Cogpit in macOS's application menu, the dialog laid out anew and showing the version the build reports, decision A60 and the owner's finding F2 built; G16: that finding fixed; estimates not moved); minor (the owner's decision round of 2026-10-14 evening: a "Decided" bullet in G1, G2, G5 to G9, G11 to G14, G17 and G23 with what he confirmed and what he decided, not built; his findings in a real window in G12 (no node history from Prometheus, the next implementation's first item), G13 (About shows 0.0.1) and G16; G11: the SQL driver out of scope; G12: ranges beyond 30 days not to be built, the per-range query step answered; G13: the hotbar's drag to reorder and a tile dragged out to another window required; estimates not moved); minor (G14: D-16 revised by the owner, `cogpit-cli` inside the macOS app and the disk image the release's only download besides `SHA256SUMS`, built by agent CLIBUNDLE, not yet proven by a release, estimate not moved; G22: no `cogpit-cli` archives for Windows and Linux any more); minor (G14: Sparkle 2 and the signed appcast built, no update key yet; G15: P1 measured on the engine side; G13: deep links partial on macOS, D-47, estimate not moved; G13: start at login partial on macOS, D-48; G17: the cached Secrets' values and Flux's credential fields kept out of what agents read, H-82 and H-63 (owner), built; G11: credentials over plain http asked once per repository, H-40 (owner), built; G8: a node shell pod a crash left deleted at the next connect, H-71, owner; G7: an agent's role binding always waits for the user, H-27, owner; G14: the signed, notarized disk image built in the release pipeline, no tag run yet; , estimate not moved; G14: the Apple signing material exists, 2026-10-14, no longer a human prerequisite; G6: the workloads' drawers' Pods tables without a Namespace column, D-40 decided by the owner, estimate not moved; G23: Reconcile with Source and Reset built (D-33, decided by the owner), removed from Left, estimate not moved; G23: the views' status filter built, a dashboard's state opens its view filtered (owner, D-34), removed from Left (Flux CD), estimate not moved; G7, G13: D-37 decided by the owner, the node shell's default image the newest supported Alpine release kept current by Renovate and its Maximum duration built, estimates not moved; G12: the Metrics source setting built, removed from Missing, estimate not moved; G12: the Overview's Pods history from kube-state-metrics built (a night decision for the owner to confirm), removed from Missing, estimate down to 8–20 h; G12: history that outlives a closed drawer built (a night decision for the owner to confirm), removed from Missing, estimate not moved; G12: the Nodes list's Disk built (D-43, a night decision for the owner to confirm), removed from Missing, estimate not moved; G12: the Nodes list's usage bars built, removed from Missing, estimate not moved; G11: chart icons built, D-46, removed from Missing, estimate 2–8 h (was 3–10), totals not recounted; G11: the README in the chart's drawer built with a version picker, night build HELM2, estimate not moved; G5, G13: a context that leaves Cogpit takes its dock tabs, a connect under way forgets it, fixed, estimates not moved; G3, G23: the Flux and Argo CD dashboards follow a namespace-limited user's plans and refusals and say when the definitions cannot be listed, a refused label-selected scope not kept warm, fixed, estimates not moved; G17: `kinds_list` completed, every MCP row done, estimate 0–2 h, totals not recounted; G17: `dock_read` built (D-44); G17: every command a tool over the whole registry, GUI-only commands refused under one mark, estimate not moved; G5: no context picker by itself at start (D-42); G5, G13: the tabs and the tables' layout kept across a restart without connecting anything (D-41), a removed cluster's context forgotten, a vanished kubeconfig file's tabs closed with a notice; G6: a Pods table in the workloads' drawers built (D-40, a night decision for the owner to confirm), removed from Missing, from indexes only the open drawer holds, estimate not moved; G12: Prometheus detection follows a namespace-limited user's refusal, fixed; G3: a refused list of the custom resource definitions not retried until a refresh, and the namespace-limited user checked on kind, fixed; G3: views' indexes, an agent's Overviews, `Lookup` and write targets, Helm's releases and the Applications follow a namespace-limited user's plan and refusals, fixed; G12: pod metrics per namespace for a namespace-limited user, D-39, a night decision, built, estimate not moved; G3: one object's read, `object_get`, `cogpit-cli get` and the drawer, takes the object's namespace, fixed; G3: a refused read in all namespaces counts whoever met it, logs, port forwards, one object and `resources_list` follow it at once, fixed; G23: Argo CD built, partial, night build (D-35, D-36), its remainder 3–8 h, the gap's estimate for the lead; G23: Argo CD built, partial, night build (D-35, D-36), its remainder 4–10 h, the gap's estimate for the lead; G23: the Flux CD section built, partial: its views, dashboard and actions, D-33, D-34, Flux's remainder 6–15 h, the table's estimate for the lead; G7, G8, G13: the node shell (D-37) and Cluster Settings › Node Shell partial, 39 of 39 actions, estimates of G7 and G8 down; G9, G7: Create Secret partial, the eighth create dialog, the user's only (D-19), 38 of 39 actions; G1: CI rebuilt as parallel jobs of at most ten minutes, GoSec and cyclomatic complexity added, semantic-release live; G14: each release carries the unsigned app, `cogpit-cli` and `SHA256SUMS`, estimate not moved; G12, G6: a node drawer's Pods table with CPU and Memory and sortable, owner, removed from Missing, estimate not moved; G12: every byte amount in binary units with one decimal, D-32, estimate not moved; G8, G13: every timestamp in the zone and the region's format, D-31, estimates not moved; G6: the Secrets drawer decodes certificates, beyond Lens (D-30), estimate not moved; G5: the lists' copy icon outside a blacklist of columns and right after the text (owner, D-25), estimate not moved; G11: D-29 built, authenticated repositories from Helm's file, estimate 3–10 h; G3: workload logs, port forwards and one object's read follow the access reviews' answers, fixed; G5: copy icons in the lists built (D-25), estimate not moved; G3: the Overviews follow the access reviews' answers, fixed; G6: references to Pod Security Policies, admission policies and Device Resources link, fixed; G2: `cogpit-cli contexts` marks an insecure context; G5, G13: a removed cluster's tabs close, fixed; G13: Cluster › Disconnect follows a reconnect, fixed; G11, G5: the owner's requirements of the morning after the night run (D-29, D-25); G17: `view_rows`, `object_get`'s related objects, the agent writes allowance and the audit log in the GUI built; G17: `view_rows`, `object_get`'s related objects and the agent writes allowance in the GUI built; G17: `view_rows` and `object_get`'s related objects built; G17: `view_rows` built; G9: the Create resource tab's save and search buttons built, Revert to original built, drafts of unsaved editor text built, estimate not moved; G9: Revert to original built, drafts of unsaved editor text built, estimate not moved; G9: drafts of unsaved editor text built, estimate not moved; G3: namespace-scoped informers for users who may not list a kind in all namespaces built, estimate not moved; G11: the ConfigMaps storage driver built, the SQL one left missing with its reason, estimate not moved; G2: the kubeconfig's `proxy-url`, CA, `tls-server-name` and `insecure-skip-tls-verify` verified against TLS test servers, a `proxy-url` password kept out of connect errors, insecure contexts marked, estimate 8–25 h; G13: the kubectl Preferences built; G8: kubectl for terminals built, D-3; G6: the node drawer's Devices section built, estimate not moved; G8: copy and paste with the right mouse button partial, the Windows and Linux copy and paste keys, estimate not moved; G5: the search field's "Aa" and ".*" toggles built, estimate not moved; G13: the non-cluster proxy built, untrusted CAs held back; G13: a cluster's proxy built; G12: hidden metrics built; G5, G13: the navigator's section level, Local Kubeconfigs, and its scope as engine state built, the tab bar showing the scope's tabs, two rows from missing to partial, estimates not moved; G5: the title bar's history arrows, notifications and context menu built; G5: column reorder by dragging built; G5: row checkboxes and the selection's menu built; G9, G7: Delete of a selection built in the engine (`object.deleteMany`), estimates not moved; G5, G13: the welcome page, the Help and Window menus, Disconnect and Remove from Cogpit built, four rows partial, estimates not moved; G8: the log tab's pod and container selectors, older lines and jump to a time partial; G8: the log tab's pod and container selectors and older lines partial; G8: the log tab's pod and container selectors partial; G11: a release upgraded to a version from the user's repositories; G5, G13: the tab bar of cluster views built, its five shortcut rows, the navigator's ⇧↵ fixed tab, estimates not moved; G13: Preferences and Cluster settings built, night run, 11 rows partial, G8's terminal rows 2, estimates not moved; G12: the cluster Overview built, the remainder 15–35 h; G6: Applications, Vertical Pod Autoscalers and the four Device Resources views partial; G6: Vertical Pod Autoscalers and the four Device Resources views partial; G6: the four Device Resources views partial; G11: chart repositories, the Charts view and the install built; G12: the owner's evening requirements built (both providers together, the status line, the fallback, a missing value as an empty cell; measured on kind); G13: the command palette and its shortcuts built, estimate 50–140 h, the summary table not recounted; G2: `cogpit-cli contexts` and `get` built; G5, G13: the navigator's header, root, tooltips and keyboard built; G12: the owner's evening requirements (provider status line, Prometheus history then Metrics Server live) and the open step question; G16: the quit crash fixed; G12: Prometheus in the window, checked against a real Prometheus on kind; G12: Prometheus, backend; G2: Lens's Kubeconfig Syncs captures followed, scope C2; totals not recounted; G21: the built-in agent's engine side built, re-estimated at 20–40 h, the beyond-Lens total ~20–42 h; G12, G1, G16: node history from node-exporter built in the night run (F1, A43, A115); G12: query sets for ranges far apart built (A46); G21: the built-in agent's window half built (the chat column, Preferences › Agent), night run, six rows partial, estimate not moved; G21: the private connection's reads built in the engine (M12 (c)), estimate not moved; G8: Download saves what the logs tab shows (A84) and the Jump to time field's cut placeholder fixed (#169), estimate not moved; G23: Flux and Argo CD from API discovery without the definitions (A90), estimate not moved; G23: Reconcile with Source waits as the flux CLI does (A91), estimate not moved; G8: an application's logs in one merged tab (A81), estimate not moved; G8: kubectl's signature with sigstore-go and its Rekor entry, D-50 built, estimate not moved; G5, G13: the owner's A51–A55, A61, A63, A64, A67 and A113 built 2026-10-15 (the navigator's and the palette's state as engine state, D-51 with night decisions for the owner to confirm; the ring on keyboard navigation only; the dropdown of the hotbar's clusters; collapsible source groups; Disconnect closing the tabs; F1–F12 in the search fields; ⌘F and ⌘⇧T in the View menu; the welcome page's Recent and links), estimates not moved; G2, G13: the plugin approval binds Cogpit's proxy, A23; G2: an unchecked certificate asked once, A28; G2: "TLS not checked" while connected, A29; G11: A39 built; G11: A17 built; G11: A36 built; G11: A14 built 2026-10-15) · **Target:** Lens Desktop 2026.10.51501 Every known shortfall against Lens Desktop 2026.10.51501, and against Cogpit's own targets beyond Lens, one entry each, ranked by what stands between Cogpit and alpha, then beta. This is the work @@ -2604,30 +2604,76 @@ D-1 is decided for Fyne ([results](../developer/spike-fyne.md#results)). - **Estimate:** 28–66 h (was 30–70; the perf gate no longer hangs on a slow runner, third run). ### G16. Stability and the user bug backlog -- **Found in the owner's alpha walk (2026-10-22, v0.38.0, the staging cluster); not built but the - focus findings (the next bullet).** The +- **Found in the owner's alpha walk (2026-10-22, v0.38.0): Escape and the dropdown field (AW1–AW4, + AW19); built 2026-10-22 on a branch** ([D-116](../developer/decisions.md#d-116-escape-closes-the-innermost-thing), + [D-104](../developer/decisions.md#d-104-dialog-fields-their-hints-and-dropdowns-the-gate-walks-gw2-gw5-gw6)); + tests failing before the change and offscreen renders; not seen in a real window yet. Escape + closes the innermost thing open: over a dialog it is the dialog's Cancel and the drawer behind it + stays (AW3; every Fyne dialog and framed dialog, a field of it with the keyboard included, + `TestEscapeCancelsEveryDialog`, `TestEscapeCancelsTheRollbackDialog`); Connection Updates closes + (AW19, `TestEscapeClosesTheConnectionUpdates`); a list's search is cleared and the table gets the + keys, the find bar closes from its fields and from the editor (AW4, `TestEscapeLeavesTheListSearch`, + `TestEscapeClosesTheFindBar`; D-57's "any other search" had been the navigator's only); Escape on + an open dropdown's list takes the keyboard off the field, so the next Escape goes on (AW2, + `TestEscapeOnAnOpenDropdown`); a closed dropdown has the outline an entry has, and the outline of + every field reads at 2:1 on every surface, both themes (AW1, `TestClosedDropdownHasAnOutline`, + `TestPaletteContrast`; renders `rollback_dialog_*.png`, `preferences_*.png`). Escape still stops + in a settings page's text field, a button reached by Tab, a check group's or a radio group's item + and inside Fyne's file and colour dialogs (D-116's "What it does not cover"). +- **Found in the owner's alpha walk (2026-10-22, v0.38.0, the staging cluster); all nineteen built + 2026-10-22 (PRs #74 to #82, each marked here or in the bullets beside it), the owner's re-walk + open.** The re-walk of every fix that touches the [alpha gate](roadmap.md#alpha-gate) passed; these findings block no workflow. His decisions on AW7, AW13, AW14 and AW17 are [D-114](../developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages). - **Escape:** an open dropdown's Escape leaves the field focused, so the next Escape does nothing - (AW2); Escape does not cancel a confirmation (Helm Rollback's) and closes the drawer behind it - instead (AW3); Escape leaves neither the dock editor's find bar nor a list's search (AW4); the - Connection Updates window does not close with Escape (AW19). **Focus (built 2026-10-22, the next + **Escape** (AW2, AW3, AW4, AW19): built, the bullet above. **Focus (built 2026-10-22, the next bullet):** ⋮ › Edit (AW5) and ⌘⇧T (AW8) opened their dock tab without the keyboard focus in it; ⌘F - in the Edit tab opened its find bar after about 3 s (AW6). **Toasts that are no errors:** the user's own Cancel Connecting (AW15) and - a connect going on in the background when another cluster is shown (AW16) each raise an error - toast in the Go error's form ("connect : connecting cancelled", "…: another cluster was - shown; the connect goes on in the background"). **Each on its own:** a closed dropdown field has - the background's colour (AW1, Dark Cockpit); Edit on an object whose tab is open sometimes does - not open the minimised dock again, not narrowed down (AW9); ⌘⌥⇧← and ⌘⌥⇧→ move the top tab bar's - tab only, not the dock's (AW10); a namespace deleted while the list is filtered to it turns the + in the Edit tab opened its find bar after about 3 s (AW6). **Toasts that are no errors** (built 2026-10-22 on a branch, + [D-97](../developer/decisions.md#d-97-a-connect-goes-on-when-another-cluster-is-shown-a-failed-one-stays); + engine, command, MCP and window tests each failing before the change; not seen in a real window + yet): the user's own Cancel Connecting (AW15) and a connect going on in the background when another + cluster is shown (AW16) each raised an error toast in the Go error's form ("connect : + connecting cancelled", or "superseded by a newer connect" when the run ended at that moment; + "…: another cluster was shown; the connect goes on in the background"), because a hotbar tile, a + tab and the navigator passed the connect's error on where `cluster.connect` answered `connecting`. + Now neither raises a toast on any path, typed outcomes (`ConnectNotFailed`); a failed connect still + does; agents read a cancel as `cancelled`, not `failed`. Found on the way (another agent, the same + day): a second connect of the cluster the window waits for ended the first one's wait the same way + ("another cluster was shown"); it now joins that wait. **Each on its own:** a closed dropdown field with + the background's colour (AW1, Dark Cockpit) built, the bullet above; Edit on an object whose tab is open sometimes does + not open the minimised dock again, not narrowed down (AW9, built: below); ⌘⌥⇧← and ⌘⌥⇧→ move the top tab bar's + tab only, not the dock's (AW10, built: below); a namespace deleted while the list is filtered to it turns the filter red only at the next change of the view's rows or when the filter opens, so a namespace - without pods is noticed late (AW11, `recheckNamespaces`); a click below a list's rows closes the - drawer after about 1 s, × and Escape at once (AW12); a clipped "Could not" drawn at the - navigator's right edge after a failed connect (AW18). **Decided, to build (D-114):** a failed - connect's error page in the welcome page's look with the connect as stages, also in Connection - Updates (AW17); the dialogs' Context label grey (AW7); the welcome page without "Other clusters" - (AW13); Follow switched by scrolling (AW14). + without pods is noticed late (AW11, `recheckNamespaces`; **built 2026-10-22 on a branch**: the + engine watches the namespaces while the filter names some and its `EventNamespaces` reads them + again, the rows no longer do, [D-106](../developer/decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace); + tests failing before, a user who may not list namespaces reads nothing; not on a real cluster or + in a real window yet); a click below a list's rows closed the + drawer after about 1 s, × and Escape at once (AW12; built 2026-10-22 on a branch, not seen in a + real window yet: Fyne's driver holds every tap on a `fyne.DoubleTappable` for the double-click + interval, 0.5 s on macOS by default, and the list's table was one for its header separators' + double click; it counts that double click itself since, as the tab bar does, so the click closes + the drawer at its release, [D-106](../developer/decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace); + `TestListClicksAreNotHeld` fails before the change; clicks on a row or a header were not held; + the welcome page's cluster rows held theirs too, their double click doing what a click does, and + connect at the release since, a second click while the connect is under way, a double click's + or the login program's review included, connecting nothing more, `TestWelcomeRowConnectsOnce`); a clipped "Could not" drawn at the + navigator's right edge after a failed connect (AW18; **fixed 2026-10-22**: reproduced in a test + first, the view's placeholder line "Could not connect to : " centred at its full + width from x 128 to 1601 of a view from 289 to 1440, over the navigator drawn before it; the view + no longer says the failure, its error page does, and every placeholder line fits the view with an + ellipsis, `TestThePlaceholderStaysInsideTheView`). **Decided (D-114):** a failed connect's error + page in the welcome page's look with the connect as stages, also in Connection Updates (AW17, + **built 2026-10-22**: the page whether or not a tab is open, the restore's failure included; the + stages kubeconfig, a credential plugin's login, DNS with its addresses, TCP with the address and + port or the proxy's, TLS and the API server's answer, measured on client-go's own first request; + the error line its cause, the whole chain in the log; tests failing before the change and + offscreen renders, not seen in a real window yet); the dialogs' Context label grey (AW7, built: below); the + welcome page without "Other clusters" (AW13, **built 2026-10-22**: the hotbar and Recent only, + "Your clusters" on a first start alone); Follow switched by scrolling (AW14; **built 2026-10-22 on a branch**, + [D-99](../developer/decisions.md#d-99-selecting-and-copying-a-log-tabs-text-and-a-toasts): five rows + up off, back at the newest line on, the scroll bar too; tests failing before, not in a real window + yet). - **The alpha walk's focus findings AW5, AW6 and AW8 built 2026-10-22 on the branch `fix/dock-tab-focus`** ([D-115](../developer/decisions.md#d-115-a-dock-tab-the-user-opens-takes-the-keys), the lead's decisions, open to revision); tests failing before the change, causes verified in the @@ -2644,6 +2690,26 @@ D-1 is decided for Fyne ([results](../developer/spike-fyne.md#results)). `TestRowMenuLogsGiveTheLogTheKeys`, `TestNewTerminalGetsTheKeys`, `TestStripTabClickGivesTheTabTheKeys`, `TestRestoredDraftGetsTheKeys`, `TestATerminalStillOpeningLeavesKeysMovedMeanwhile`, `TestAnAgentsTabLeavesTheKeys`, `TestFindBarOpensThroughTheWindowsCanvas`. +- **Built 2026-10-22 on a branch, from the owner's alpha walk**; tests failing before each change + and offscreen renders, not seen in a real window yet. **AW7:** a dialog's Context row draws the + context's source label ("[kubernetes_configs/walk-kind.yaml]", D-28) in the grey of the Object + row's kind word, the id as it was and wrapped as before, in every dialog that names a place + (`contextValue`, [`objectnames.go`](../../internal/ui/fyneui/objectnames.go); + `TestContextRowMutesTheSourceLabel`; render + [`confirm_apply_removes_dark.png`](../../internal/ui/fyneui/testdata/confirm_apply_removes_dark.png); + [D-85](../developer/decisions.md#d-85-dialogs-as-tables-and-an-objects-state-without-its-resourceversion)). + **AW9:** reproduced by a test, the cause verified: a command that shows a dock tab open already + (Edit, logs, Helm Upgrade and Install, the Audit Log, the Diagnostics, `dock.activate`) set the + active tab to the one already active, which left the minimised dock collapsed; it worked when + another tab was active, hence "sometimes". Such a command now opens the dock + (`UIState.ShowDockTab`, [`engine/layout.go`](../../internal/engine/layout.go); + `TestShowDockTab`, `TestShowingAnOpenDockTabOpensTheDock`, `TestEditOnTheShownEditTabOpensTheDock`; + [D-54](../developer/decisions.md#d-54-the-layout-toggles-and-the-update-button)). + **AW10:** ⌘⌥⇧← and ⌘⌥⇧→ move the active tab of the bar the keyboard works in, the dock's while + a widget in it has the keys or, with none focused, a dock tab was clicked last + (`ui.tab.moveLeft` and `ui.tab.moveRight` with `dock`, [`tabmovekeys.go`](../../internal/ui/fyneui/tabmovekeys.go); + `TestDockStep`, `TestTabMoveCommands`, `TestMoveTabKeysMoveTheDocksTab`; + [D-106](../developer/decisions.md#d-106-the-gate-walks-gw1-gw3-gw4-and-gw9-the-drawer-f-moving-tabs-a-deleted-namespace)). - **Found in the owner's use (2026-10-22, v0.37.3); fixed the same day on a branch** ([architecture › §4.4](../developer/architecture.md#44-tables-details-editors-and-streams)); tests failing before the change and offscreen renders; not seen in a real window yet. awe-d-pinniped's @@ -3004,8 +3070,10 @@ D-1 is decided for Fyne ([results](../developer/spike-fyne.md#results)). `namespace_filter_search_dark.png` and `_light.png`). Not tried in a real window yet. - **Missing:** PhotoCraft's first public week produced hundreds of issues on features its tests counted as done; this entry reserves the time for the same after Cogpit's first release. -- **Estimate:** 100–200 h to beta. Checked 2026-10-15, not moved: the hang after sleep is counted - in G2, the 401s and what the owner's walks find in this reservation. +- **Estimate:** 100–200 h to beta. Checked 2026-10-15, not moved; checked again 2026-10-22 after the + alpha walk's findings AW1–AW19 were built (about 25 agent-hours, inside this reservation), not + moved: what testers besides the owner find is still ahead. The hang after sleep is counted in G2, + the 401s and what the owner's walks find in this reservation. ## Beyond Lens @@ -3195,8 +3263,19 @@ D-1 is decided for Fyne ([results](../developer/spike-fyne.md#results)). | Date | Change | Summary | |---|---|---| +| 2026-10-22 | minor | G16: the alpha walk's findings AW1–AW19 all built 2026-10-22 (PRs #74 to #82), the owner's re-walk open; the estimate checked after them, not moved (about 25 agent-hours inside the reservation) | | 2026-10-22 | minor | G16: the alpha walk's focus findings built on the branch `fix/dock-tab-focus` (D-115): a dock tab the user opens or shows from the window takes the keys on its editor, terminal or log (AW5, AW8), an agent's leaves them; AW6's two causes, the keys left in the list and the find bar's first opening without a repaint in a real window, fixed; no estimate moves | +| 2026-10-22 | minor | G16: the alpha walk's AW1–AW4 and AW19 built on a branch: Escape closes the innermost thing (a dialog as its Cancel, the drawer behind untouched; Connection Updates; a list's search and the find bar; an open dropdown's list lets the next Escape go on), a closed dropdown outlined as an entry, every field's outline 2:1 on every surface (D-116, D-104) | +| 2026-10-22 | minor | G16, AW12's follow-up: the welcome page's cluster rows were a `fyne.DoubleTappable` too, their click held for the double-click interval; they connect at the release, and the page connects a cluster whose connect is under way no second time (D-106); no estimate moves | +| 2026-10-22 | minor | G16: AW12 built on a branch: a click below a list's rows closed the drawer only after the double-click interval, Fyne's driver holding every tap on the table, a `fyne.DoubleTappable` for its header separators' double click; the table counts that double click itself (D-106); no estimate moves | +| 2026-10-22 | minor | G16: AW13, AW17 and AW18 built on the branch `feat/failed-connect-page` (D-114): a failed connect's error page with the connect's stages, also in Connection Updates; the welcome page without "Other clusters"; the stray "Could not" at the navigator's edge reproduced and fixed; no estimate moves | +| 2026-10-22 | minor | G16: the owner's AW15 and AW16 of the alpha walk built (D-97): the user's own Cancel Connecting and a connect going on in the background raise no error toast on any path (a hotbar tile, a tab, the navigator, `cluster.connect`), a failed connect still does; agents read a cancel as `cancelled`; no estimate moves | +| 2026-10-22 | minor | G16: AW10 of the owner's alpha walk built on a branch: ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab where the keyboard works in the dock (D-106); no estimate moves | +| 2026-10-22 | minor | G16: AW9 of the owner's alpha walk built on a branch: a command that shows a dock tab open already opens the minimised dock also when that tab is the active one (D-54); no estimate moves | +| 2026-10-22 | minor | G16: AW7 of the owner's alpha walk built on a branch: the dialogs' Context row draws the source label in the kind word's grey (D-85, D-114); no estimate moves | | 2026-10-22 | minor | The cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9; out of scope until long after parity since 2026-10-15): G2's Missing without them, its Evidence 7 of 10 rows partial, its Human none; G18's Missing without the EKS, AKS and GKE account integrations, its Evidence without the platform checklist, its Human without cloud accounts; the navigator's cloud sections not a target in G5 and G13; no estimate moves (G2 counted no hours for the plugins, G18's 110–220 h gives no share for the integrations) | +| 2026-10-22 | patch | G16: AW14 built on a branch: Follow switched off by a scroll five rows up, on again at the newest line (D-99); no estimate moves | +| 2026-10-22 | patch | G16: AW11 built on a branch: the namespaces' own changes (the engine's `EventNamespaces`) read the filter's namespaces again, not the view's rows (D-106); no estimate moves | | 2026-10-22 | minor | G16: the owner's alpha walk of 2026-10-22 on v0.38.0: the re-walk of every fix that touches the alpha gate passed; findings AW1–AW19 (Escape, focus of new dock tabs, connect outcomes as error toasts, and nine on their own), none blocking; AW7, AW13, AW14 and AW17 decided by him (D-114), not built; no estimate moves | | 2026-10-22 | minor | G16: the owner's finding of 2026-10-22 on v0.37.3 fixed: a list narrowed while scrolled down ("2 of 200 items", no row drawn) brings its scroll offset back within its rows; no estimate moves | | 2026-10-22 | minor | G16: the owner's findings of 2026-10-22 on v0.37.0 fixed: a view not read before an expired login or an interruption says so (no "Loading…", count, "syncing…" or download), the namespaces of the cluster shown before dropped at a switch, the drawer's header laid out after another pod; no estimate moves | diff --git a/docs/parity/resource-parity.md b/docs/parity/resource-parity.md index 8dc795e25..baa47b70a 100644 --- a/docs/parity/resource-parity.md +++ b/docs/parity/resource-parity.md @@ -1,6 +1,6 @@ # Resource parity: views, columns and actions -> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (Pods: the image ratings as grades and shields, D-113; no status moves); patch (Nodes: EtcdIsVoter True healthy, the owner's GW12 of 2026-10-20; no status moves); trivial (Releases: Rollback's revision dropdown opens over its field, the gate walk's GW5, D-104; no status moved); minor (Deployments, Stateful Sets, Replica Sets: Scale's dialog a slider from 1 to 30 and the count typed, its hint behind a "?"; Nodes: Drain's hints behind a "?", the gate walk's GW2 and GW6, D-104; no status moved); minor (Pods: debug containers checked on a real cluster with Kyverno's refusal, D-102, 2026-10-19 night; no status moved); minor (Pods: ephemeral (debug) containers, blue squares in Containers, Target in the drawer, Logs, Shell and Attach reaching them, and Debug `pod.debug`, the owner's words of 2026-10-19, D-102, Cogpit's own; no status moved); minor (Namespaces: a Terminating namespace's Blocking Deletion list and Remove finalizers, the owner's WF43, D-98, Cogpit's own; no status moved); minor (Delete: the confirmation names each object "Pod → web-0", grouped by kind, and every action's effect a row of its own, the owner's WF32 and WF33, D-100; no status moved); minor (Nodes: the Disk column the fullest real filesystem, the drawer a bar per filesystem, the owner's WF26, D-90; no status moved); minor (Nodes: the kubelet's upstream support and version skew in the Version column and the drawer, the owner's WF30, D-91, Cogpit's own; no status moved); minor (Config Maps: room above the Add Key row and the footer, the owner's WF12, D-93; no status moved); minor (Delete: the window's confirmation as rows only, Context, Namespaces, Objects, the owner's WF16, D-85; no status moved); minor (Pods: the list's Image Rating, each pod's worst image rating, the owner's I6, D-78, Cogpit's own; no count moves); minor (Custom Resources: the policy reports' curated profiles and the Kyverno integration's marks on every kind, Cogpit's own, D-79; no count moves); minor (Pods: a running container that is not ready orange in the Containers column, and "+N" for the squares a narrow cell cannot show, the owner's F23 and F24 of 2026-10-17); minor (Pods: the drawer's Image Ratings from Trivy Operator's reports, the owner's I6 of 2026-10-17, D-78, Cogpit's own; Security Center: the same reports read, the page still missing; no count moves); minor (Nodes: a condition ending in Ready healthy when True, the owner's finding F20 of 2026-10-17; no count moves); minor (Secrets: the copy icon over a value's editor in the drawer, the owner's audit decision of 2026-10-16, D-59; no count moves); minor (Config Maps and Secrets: keys added and removed in the drawer, the owner's audit decision of 2026-10-16, D-55 and D-59; no count moves); minor (Argo CD checked against a live Argo CD 3.5.5 controller on a real cluster, 2026-10-16, night run: the evidence and what it fixed in the row; no count moves); minor (Nodes: Drain as a background job with a step per pod and Cancel, D-63); minor (Every kind › Detail drawer and Pods: an owner that is a custom resource links to it, 2026-10-16; no count moves); minor (the rows checked against a real cluster, 2026-10-16, each with what it showed; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (the rows checked against a real cluster, 2026-10-16, each with what it showed; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Delete, Restart, the Flux and Argo CD actions on a selection: more than ten objects as a background job with progress and Cancel, G4, D-63, 2026-10-16; Restart on a selection named in the Deployments row; no count moves); minor (Secrets: a Secret's values edited in the drawer, the window's only, D-59; Config Maps: Save rebases by itself, unsaved values as drafts; 42 of 42 actions; the owner's audit answers of 2026-10-15, night run); minor (Config Maps: the drawer's Save rebases onto a newer version none of the edited keys changed in, unsaved values kept as drafts, the owner's audit answers of 2026-10-15); minor (every row checked for its current state, AGENTS.md rule 10: Helm Charts' README framed for agents and an agent's install and upgrade waiting, the Create dialogs' drawer after a create, every RBAC kind an agent writes waiting and the grants' wording, all built 2026-10-14, the Secret's dialog no longer listed as not built; Flux's Reconcile with Source waits for the source (A91); the node drawer's devices name their claim (A108); a namespace-limited user's views read per namespace (G3); D-37, D-43 and D-46 decided by the owner, no longer "for the owner to confirm"; the Pods row's actions all exist; the find bar's PNGs linked; no count moves); minor (Config Maps: the drawer captured 2026-10-15, each key above its value in an editor and Save at the end through `configMap.saveData`, the owner's F3, D-55; Secrets: the Data keys above their values; actions 41 of 41, was 40); minor (Copy name: right after the object's name in the drawer's header (F4); no count moves); minor (the owner's decision round of 2026-10-14 evening: Applications, Nodes, Pods, Replication Controllers, Vertical Pod Autoscalers, Resource Claims, Helm Charts and Releases, Flux CD, Argo CD and Create dialogs note what he confirmed and decided, not built; no count moves); minor (Create dialogs: an agent's Role Binding always waits for the user, H-27, owner; Deployments, Replica Sets, Stateful Sets, Daemon Sets, Jobs, Cron Jobs: no Namespace column in the drawer's Pods table, the node drawer keeps it, D-40 decided by the owner, G6, no count moves; Flux CD › Helm Releases, Kustomizations: Reconcile with Source and Reset as the flux CLI does them, D-33 decided by the owner, G23, no count moves; Flux CD › Dashboard and Argo CD: a dashboard's state opens its kind's view filtered to it, through the views' status filter (owner, D-34), no count moves; Nodes: Disk from node-exporter through Prometheus (D-43), G12, no count moves; Nodes: CPU and Memory drawn as usage bars, G12, no count moves; Helm Charts: the charts' icons in the list and the drawer, D-46, G11, no count moves; Helm Charts: the drawer's version picker and the version's README, night build HELM2, G11, no count moves; Deployments, Replica Sets, Stateful Sets, Daemon Sets, Jobs, Cron Jobs: the drawer's Pods table, the node drawer's, from indexes only the open drawer holds (D-40, a night decision for the owner to confirm), G6, no count moves; Argo CD partial (paid, G23): the five lists with Lens's documented columns, the settings an allowlist of non-credential keys (D-35), no free count moves; Flux CD partial: the Dashboard, 13 views of the Flux kinds with curated profiles, Reconcile, Suspend and Resume on objects and selections, D-33, D-34, G23, paid rows, no count moves; Nodes: Shell partial, the node shell as Lens's privileged pod (D-37), 39 of 39 actions exist, G7, G8; Secrets: Create partial, the eighth create dialog, `secret.create` for the user in the window only (D-19), 38 of 39 actions exist, G7, G9; Nodes: the drawer's Pods with CPU and Memory from the metrics and sortable by every column, owner, G12, no count moves; every byte amount in binary units with one decimal, D-32: Nodes, Pods, Persistent Volumes and Claims, Stateful Sets, Config Maps, Resource Quotas, Limit Ranges, Horizontal and Vertical Pod Autoscalers, Runtime Classes, Resource Slices, Secrets' value sizes, no count moves; Events: Last Seen in the user's zone and region format, D-31; Secrets: the certificates in its keys decoded in the drawer and for agents, beyond Lens (D-30), no count moves; Helm Charts: the repositories from Helm's repositories.yaml, authenticated ones included, D-29 built, G11; Pod Security Policies, admission policies, Device Resources: references to them link, no count moves; Helm Releases: releases kept in ConfigMaps, `HELM_DRIVER=configmap`, listed and acted on with their own driver, new installs by the Preferences' driver, G11; Pod Security Policies partial, offered only where the cluster serves `policy/v1beta1`, 64 of 64 views exist, G6; Nodes: the drawer's Devices (DRA) partial, G6; Delete of a selection in the window: the row checkboxes, the selection bar and menu, G5; Delete of a selection in the engine, `object.deleteMany`, G7, G9; Helm Releases: the Upgrade tab offers the versions of a repository that lists the release's chart and upgrades to them, G11; the cluster Overview partial, 56 of 64 views, G12; Applications, Vertical Pod Autoscalers and the four Device Resources views partial, from Lens's documentation, G6; Vertical Pod Autoscalers and the four Device Resources views partial, from Lens's documentation, G6; the four Device Resources views partial, from Lens's documentation, G6; Helm Charts and Install partial, G11; Pods and Nodes: CPU and Memory from the Metrics Server, Prometheus only while it fails, a missing part an empty cell; create dialogs of seven kinds partial, G7; the counts await the lead's recount; Flux CD and Argo CD: their kinds from API discovery without the definitions, A90 built, no count moves; Flux CD: Reconcile with Source waits as the flux CLI does, A91 built, no count moves; Applications, Argo CD and Flux CD: Logs in one merged tab, A81 built, no count moves; Helm Releases: A39 built, the both-drivers note in the owner's wording; Helm Releases: A17 built, nothing offered after an interrupted install; Helm Charts: A36 built, repositories with a dot; Helm Charts: A14 built 2026-10-15, origins marked) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (Secrets: a masked value copied without being shown, the owner's decision of 2026-10-22, D-25; no status moves); minor (Pods: the image ratings as grades and shields, D-113; no status moves); patch (Nodes: EtcdIsVoter True healthy, the owner's GW12 of 2026-10-20; no status moves); trivial (Releases: Rollback's revision dropdown opens over its field, the gate walk's GW5, D-104; no status moved); minor (Deployments, Stateful Sets, Replica Sets: Scale's dialog a slider from 1 to 30 and the count typed, its hint behind a "?"; Nodes: Drain's hints behind a "?", the gate walk's GW2 and GW6, D-104; no status moved); minor (Pods: debug containers checked on a real cluster with Kyverno's refusal, D-102, 2026-10-19 night; no status moved); minor (Pods: ephemeral (debug) containers, blue squares in Containers, Target in the drawer, Logs, Shell and Attach reaching them, and Debug `pod.debug`, the owner's words of 2026-10-19, D-102, Cogpit's own; no status moved); minor (Namespaces: a Terminating namespace's Blocking Deletion list and Remove finalizers, the owner's WF43, D-98, Cogpit's own; no status moved); minor (Delete: the confirmation names each object "Pod → web-0", grouped by kind, and every action's effect a row of its own, the owner's WF32 and WF33, D-100; no status moved); minor (Nodes: the Disk column the fullest real filesystem, the drawer a bar per filesystem, the owner's WF26, D-90; no status moved); minor (Nodes: the kubelet's upstream support and version skew in the Version column and the drawer, the owner's WF30, D-91, Cogpit's own; no status moved); minor (Config Maps: room above the Add Key row and the footer, the owner's WF12, D-93; no status moved); minor (Delete: the window's confirmation as rows only, Context, Namespaces, Objects, the owner's WF16, D-85; no status moved); minor (Pods: the list's Image Rating, each pod's worst image rating, the owner's I6, D-78, Cogpit's own; no count moves); minor (Custom Resources: the policy reports' curated profiles and the Kyverno integration's marks on every kind, Cogpit's own, D-79; no count moves); minor (Pods: a running container that is not ready orange in the Containers column, and "+N" for the squares a narrow cell cannot show, the owner's F23 and F24 of 2026-10-17); minor (Pods: the drawer's Image Ratings from Trivy Operator's reports, the owner's I6 of 2026-10-17, D-78, Cogpit's own; Security Center: the same reports read, the page still missing; no count moves); minor (Nodes: a condition ending in Ready healthy when True, the owner's finding F20 of 2026-10-17; no count moves); minor (Secrets: the copy icon over a value's editor in the drawer, the owner's audit decision of 2026-10-16, D-59; no count moves); minor (Config Maps and Secrets: keys added and removed in the drawer, the owner's audit decision of 2026-10-16, D-55 and D-59; no count moves); minor (Argo CD checked against a live Argo CD 3.5.5 controller on a real cluster, 2026-10-16, night run: the evidence and what it fixed in the row; no count moves); minor (Nodes: Drain as a background job with a step per pod and Cancel, D-63); minor (Every kind › Detail drawer and Pods: an owner that is a custom resource links to it, 2026-10-16; no count moves); minor (the rows checked against a real cluster, 2026-10-16, each with what it showed; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (the rows checked against a real cluster, 2026-10-16, each with what it showed; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Every kind › Delete, and every action's confirmation: the message names each object by its kind, "Delete Pod web-0", not by its kind key, 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Nodes: Cordon, Uncordon, Drain and Shell checked against a real cluster, a failed drain that evicted nothing no longer says "partly drained", 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Events: an involved custom resource links to its kind's view, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Flux CD › Sources: an OCI Helm repository without a status Ready as the flux CLI shows it, found on a real cluster 2026-10-16; no count moves); minor (Delete, Restart, the Flux and Argo CD actions on a selection: more than ten objects as a background job with progress and Cancel, G4, D-63, 2026-10-16; Restart on a selection named in the Deployments row; no count moves); minor (Secrets: a Secret's values edited in the drawer, the window's only, D-59; Config Maps: Save rebases by itself, unsaved values as drafts; 42 of 42 actions; the owner's audit answers of 2026-10-15, night run); minor (Config Maps: the drawer's Save rebases onto a newer version none of the edited keys changed in, unsaved values kept as drafts, the owner's audit answers of 2026-10-15); minor (every row checked for its current state, AGENTS.md rule 10: Helm Charts' README framed for agents and an agent's install and upgrade waiting, the Create dialogs' drawer after a create, every RBAC kind an agent writes waiting and the grants' wording, all built 2026-10-14, the Secret's dialog no longer listed as not built; Flux's Reconcile with Source waits for the source (A91); the node drawer's devices name their claim (A108); a namespace-limited user's views read per namespace (G3); D-37, D-43 and D-46 decided by the owner, no longer "for the owner to confirm"; the Pods row's actions all exist; the find bar's PNGs linked; no count moves); minor (Config Maps: the drawer captured 2026-10-15, each key above its value in an editor and Save at the end through `configMap.saveData`, the owner's F3, D-55; Secrets: the Data keys above their values; actions 41 of 41, was 40); minor (Copy name: right after the object's name in the drawer's header (F4); no count moves); minor (the owner's decision round of 2026-10-14 evening: Applications, Nodes, Pods, Replication Controllers, Vertical Pod Autoscalers, Resource Claims, Helm Charts and Releases, Flux CD, Argo CD and Create dialogs note what he confirmed and decided, not built; no count moves); minor (Create dialogs: an agent's Role Binding always waits for the user, H-27, owner; Deployments, Replica Sets, Stateful Sets, Daemon Sets, Jobs, Cron Jobs: no Namespace column in the drawer's Pods table, the node drawer keeps it, D-40 decided by the owner, G6, no count moves; Flux CD › Helm Releases, Kustomizations: Reconcile with Source and Reset as the flux CLI does them, D-33 decided by the owner, G23, no count moves; Flux CD › Dashboard and Argo CD: a dashboard's state opens its kind's view filtered to it, through the views' status filter (owner, D-34), no count moves; Nodes: Disk from node-exporter through Prometheus (D-43), G12, no count moves; Nodes: CPU and Memory drawn as usage bars, G12, no count moves; Helm Charts: the charts' icons in the list and the drawer, D-46, G11, no count moves; Helm Charts: the drawer's version picker and the version's README, night build HELM2, G11, no count moves; Deployments, Replica Sets, Stateful Sets, Daemon Sets, Jobs, Cron Jobs: the drawer's Pods table, the node drawer's, from indexes only the open drawer holds (D-40, a night decision for the owner to confirm), G6, no count moves; Argo CD partial (paid, G23): the five lists with Lens's documented columns, the settings an allowlist of non-credential keys (D-35), no free count moves; Flux CD partial: the Dashboard, 13 views of the Flux kinds with curated profiles, Reconcile, Suspend and Resume on objects and selections, D-33, D-34, G23, paid rows, no count moves; Nodes: Shell partial, the node shell as Lens's privileged pod (D-37), 39 of 39 actions exist, G7, G8; Secrets: Create partial, the eighth create dialog, `secret.create` for the user in the window only (D-19), 38 of 39 actions exist, G7, G9; Nodes: the drawer's Pods with CPU and Memory from the metrics and sortable by every column, owner, G12, no count moves; every byte amount in binary units with one decimal, D-32: Nodes, Pods, Persistent Volumes and Claims, Stateful Sets, Config Maps, Resource Quotas, Limit Ranges, Horizontal and Vertical Pod Autoscalers, Runtime Classes, Resource Slices, Secrets' value sizes, no count moves; Events: Last Seen in the user's zone and region format, D-31; Secrets: the certificates in its keys decoded in the drawer and for agents, beyond Lens (D-30), no count moves; Helm Charts: the repositories from Helm's repositories.yaml, authenticated ones included, D-29 built, G11; Pod Security Policies, admission policies, Device Resources: references to them link, no count moves; Helm Releases: releases kept in ConfigMaps, `HELM_DRIVER=configmap`, listed and acted on with their own driver, new installs by the Preferences' driver, G11; Pod Security Policies partial, offered only where the cluster serves `policy/v1beta1`, 64 of 64 views exist, G6; Nodes: the drawer's Devices (DRA) partial, G6; Delete of a selection in the window: the row checkboxes, the selection bar and menu, G5; Delete of a selection in the engine, `object.deleteMany`, G7, G9; Helm Releases: the Upgrade tab offers the versions of a repository that lists the release's chart and upgrades to them, G11; the cluster Overview partial, 56 of 64 views, G12; Applications, Vertical Pod Autoscalers and the four Device Resources views partial, from Lens's documentation, G6; Vertical Pod Autoscalers and the four Device Resources views partial, from Lens's documentation, G6; the four Device Resources views partial, from Lens's documentation, G6; Helm Charts and Install partial, G11; Pods and Nodes: CPU and Memory from the Metrics Server, Prometheus only while it fails, a missing part an empty cell; create dialogs of seven kinds partial, G7; the counts await the lead's recount; Flux CD and Argo CD: their kinds from API discovery without the definitions, A90 built, no count moves; Flux CD: Reconcile with Source waits as the flux CLI does, A91 built, no count moves; Applications, Argo CD and Flux CD: Logs in one merged tab, A81 built, no count moves; Helm Releases: A39 built, the both-drivers note in the owner's wording; Helm Releases: A17 built, nothing offered after an interrupted install; Helm Charts: A36 built, repositories with a dot; Helm Charts: A14 built 2026-10-15, origins marked) · **Target:** Lens Desktop 2026.10.51501 Every Kubernetes resource view Lens Desktop has, with the columns of its list and the actions it offers, against Cogpit. The layout around these views (sidebar, tables, detail drawer, dock) is in @@ -93,7 +93,7 @@ related resources) are superseded by Cogpit's built-in agent | View | API | Lens columns | Actions | Status | |---|---|---|---|---| | Config Maps; checked against a real cluster, 2026-10-16: 210 config maps, Keys naming as many keys as kubectl's Data counts (165 for one) | `v1` ConfigMap | Name, Namespace, Keys, Age | Save the drawer's values `configMap.saveData` (Cogpit's id) | partial: view as documented, not checked against a running Lens (capture needed); Keys lists data and binary-data keys sorted, comma-separated; no status token (inferred: a Config Map has no state); drawer: each value up to 4 KiB and 40 lines, 32 KiB and 400 lines in all, 100 keys, with a note where cut; binary data by size only (Cogpit's, inferred) ([`configmaps.go`](../../internal/model/kinds/configmaps.go), `TestGolden`, `TestConfigMapTexts`, `TestConfigMapDrawerCaps`); binary data sizes and the cut notes in binary units since 2026-10-13 ("3 B", "4.0 KiB", [D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal)); drawer captured 2026-10-15 (the owner's screenshot of Lens's ConfigMap drawer on a real cluster's `cilium-config`): Properties, then under Data each key on a line of its own and its value below in a code editor with line numbers, colours by the value's type (strings blue, `true` and `false` ochre), about five lines high even for a one-line value, a resize handle at its bottom right; captured: that layout and the editor's look; inferred: the Save at the end of the data and that it writes the values (not in the capture). Built 2026-10-15 (the owner's F3, [D-55](../developer/decisions.md#d-55-a-config-maps-values-edited-in-the-drawer)): each key above its value in a `yamlview` editor of Cogpit's drawing (plain scalars as strings, line numbers, 3 to 12 lines high, a grip that drags it from 1 to 40), the values whole from `configMap.readData` (the drawer model's cut values above stay for agents), Revert and Save at the end of the data; Save reviews the diff against the cached object and a server dry run (`configMap.reviewData`), then `configMap.saveData` writes with the resourceVersion the values are based on as precondition; a Config Map that changed meanwhile shows the values against the newer version and is written only by a second Save; values only until 2026-10-16 (keys too since, below), binary data and a Helm release record by size and never editable, an immutable Config Map, the demo cluster and a user without `update` read-only with the reason ([`configmapdata.go`](../../internal/ui/fyneui/configmapdata.go), [`engine/configmapdata.go`](../../internal/engine/configmapdata.go); `TestConfigMapDataSave`, `TestConfigMapDataNeverOverwritesUnasked`, `TestConfigMapDataRefusals`, `TestConfigMapDataAgents`, on kind `TestKindConfigMapDataSave`, `TestConfigMapDrawerKeysAboveValues`, `TestConfigMapDrawerEditAndSave`, `TestConfigMapDrawerConflict`, `TestConfigMapDrawerKeepsUnsavedEdits`; PNGs [dark](../../internal/ui/fyneui/testdata/configmap_drawer_dark.png), [light](../../internal/ui/fyneui/testdata/configmap_drawer_light.png), [review](../../internal/ui/fyneui/testdata/configmap_save_dark.png)); Binary Data's keys above their sizes too; since the night of 2026-10-15 (the owner's audit answers, beyond what Lens is known to do: not captured) Save rebases the edited values onto a newer version none of the edited keys changed in, the diff and the dry run against it shown in the review before Save writes, the conflict as before otherwise, and the unsaved values are kept in memory and as a draft offered at the next connect, restored into the drawer ([`engine/drafts_drawer.go`](../../internal/engine/drafts_drawer.go); `TestConfigMapDataRebases`, `TestConfigMapDrawerDrafts`, `TestConfigMapDrawerRebases`, `TestConfigMapDrawerTakesARestoredDraft`; PNG [rebased](../../internal/ui/fyneui/testdata/configmap_rebased_dark.png)); since 2026-10-16 (the owner's audit decision, D-55; Lens's adding and removing of keys in a drawer inferred, not captured) the drawer adds keys (Add Key, the name checked as the API server checks it; since 2026-10-18 an inner padding of room above the Add Key row and the footer, the owner's WF12, [D-93](../developer/decisions.md#d-93-room-in-the-drawers-data-footer-between-the-layout-toggles-and-in-the-navigators-back-row)) and removes them (a bin icon on each key's line, Undo), saved with the values in one write through `configMap.saveData`'s `add` and `remove`; a save that removes a key is destructive, the review naming the keys removed with the Config Map, its namespace and its context and serving as the confirmation, an agent's always asked ([`fyneui/datakeys.go`](../../internal/ui/fyneui/datakeys.go), [`engine/datakeys.go`](../../internal/engine/datakeys.go); `TestConfigMapDataAddsAndRemovesKeys`, `TestConfigMapDataKeyRefusals`, `TestConfigMapDataKeysRebase`, `TestConfigMapDataAgentRemovalAsks`, on kind `TestKindConfigMapDataSave`, `TestConfigMapDrawerAddsAndRemovesKeys`, `TestConfigMapDrawerKeysConflict`; PNGs [drawer](../../internal/ui/fyneui/testdata/configmap_keys_drawer_dark.png), [review](../../internal/ui/fyneui/testdata/configmap_keys_review_dark.png), [light](../../internal/ui/fyneui/testdata/configmap_keys_review_light.png)) | -| Secrets; checked against a real cluster, 2026-10-16: 261 secrets, Type and Keys as kubectl's Type and Data; a TLS Secret's drawer decodes a chain of three certificates | `v1` Secret | Name, Namespace, Labels, Keys, Type, Age | Create `secret.create`, Save the drawer's values `secret.saveData` (Cogpit's id; Lens's Save inferred) | partial (2026-10-12): view as documented, not checked against a running Lens (capture needed), from a full watch on every Secret since the owner revised [D-13](../developer/decisions.md#d-13-cache) (2026-10-12; before, 2026-10-11, a metadata-only watch with Keys and Type empty): Name, Namespace, Labels (`key=value`, sorted, comma-separated), Keys (the names of the keys, sorted, comma-separated; the cell format inferred), Type and Age, as in Lens's documentation; no status token (inferred: a Secret has no state); the cache drops the `last-applied-configuration` annotation from Secrets, which repeats their values ([`secrets.go`](../../internal/model/kinds/secrets.go), `TestGolden`, `TestSecretTexts`, `TestSecretDetailShowsNoValue`, `TestSecretsLoseTheLastAppliedAnnotation`, [PNG](../../internal/ui/fyneui/testdata/secrets_list_dark.png)); one initial list or streaming watch of every Secret, counted on the fake API server (`TestBudgetSecretsViewAndDrawer`) and on kind (`TestKindSecretsView`). Drawer (Cogpit's, inferred; Lens's not captured): read from the cache, no request (2026-10-12; the GET per open is gone); Properties with the Type, a Data section that lists every key with its value masked (`••••••••` and the size; binary values by size only; 100 keys) and a Show button that reveals one value in place, up to 4 KiB and 40 lines, until Hide, another object or closing the drawer; revealing is GUI-only (`secret.reveal` refuses agents and the CLI) and reads the cache; no value reaches `object_get`, `resources_list`, `resources_find`, `table_exportCsv`, the YAML, the audit log, a toast or a log ([`secretdata.go`](../../internal/engine/secretdata.go), [`secretreveal.go`](../../internal/ui/fyneui/secretreveal.go), `TestSecretDrawerReadsTheCacheAndMasks`, `TestRevealIsGUIOnly`, `TestAgentsReadSecretsRedacted`, `TestSecretRevealInDrawer`, PNGs [dark](../../internal/ui/fyneui/testdata/secrets_dark.png), [light](../../internal/ui/fyneui/testdata/secrets_light.png)); Edit and Create from YAML work in the GUI only, agents and the CLI are refused (D-19, `TestSecretEditAndCreateAreGUIOnly`, `TestSecretEditIsRefusedToAgentsAndTheCLI`); beyond Lens (2026-10-13, the owner's [D-30](../developer/decisions.md#d-30-certificates-in-secrets-decoded), not counted here: [beyond Lens](beyond-lens.md#everyday-use)): after the Data section, the certificates its keys hold decoded, a group "Certificates · " per key with one section per certificate and each field its own value, and for agents the same fields in `object_get`'s `certificates`, never the PEM text or a private key ([`secretcerts.go`](../../internal/engine/secretcerts.go), `TestSecretCertificateSections`, `TestSecretDrawerShowsCertificates`, PNG [dark](../../internal/ui/fyneui/testdata/secret_certs_dark.png)); Create partial (2026-10-13): the "+" opens the Create Secret dialog ([Create dialogs](#create-dialogs)): name, namespace, type, the data as rows of a key and a value, labels and annotations as rows (inferred from Lens's documentation; the dialog is not captured); a value is masked as typed or pasted, may span lines, and the eye at its end shows it (Fyne's password revealer); a type fills in the keys it needs, a service account token its annotation (Cogpit's default); `secret.create` checks the name, the keys, the type's required keys, the labels and annotations and the sizes before anything is sent, then dry-runs and creates, the values base64-encoded in `data` (Cogpit's default, [credentials](../security/credentials.md#secret-values-in-the-create-secret-dialog)); the user's only (D-19): agents and the CLI are refused before anything is asked or sent, and the audit line of a refused call names the Secret, its type and its keys, never a value ([`commands/secretcreate.go`](../../internal/engine/commands/secretcreate.go), [`createdialog_secret.go`](../../internal/ui/fyneui/createdialog_secret.go); `TestSecretCreateFromTheGUI`, `TestSecretCreateIsGUIOnly`, `TestSecretCreateChecksBeforeSending`, `TestSecretCreateErrorsNeverQuoteValues`, `TestSecretCreateFollowsAccessReviews`, `TestSecretDialogSendsTheSecret`, `TestSecretDialogTypeFillsItsKeys`, `TestSecretDialogRevealsOneValue`; PNGs [dark](../../internal/ui/fyneui/testdata/create_secret_dialog_dark.png), [light](../../internal/ui/fyneui/testdata/create_secret_dialog_light.png)); the drawer's value sizes in binary units since 2026-10-13 ("•••••••• (38 B)", "binary data, 1.2 KiB", [D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal)); since 2026-10-15 (the owner's F3, [D-55](../developer/decisions.md#d-55-a-config-maps-values-edited-in-the-drawer)) the drawer's Data puts each key on a line of its own and its masked value, Show and a revealed value below it at the full width, as Lens's ConfigMap drawer lays out its data (Lens's Secret drawer is not captured: inferred) (`TestSecretDrawerKeysAboveValues`, `TestSecretRevealInDrawer`; PNGs [dark](../../internal/ui/fyneui/testdata/secret_longkeys_dark.png), [light](../../internal/ui/fyneui/testdata/secret_longkeys_light.png)); since the night of 2026-10-15 (the owner's audit answer, [D-59](../developer/decisions.md#d-59-a-secrets-values-edited-in-the-drawer); Lens's editing inferred, not captured) a Secret's values are edited in the drawer, in the window only: where the user may save the Secret, Show reads the whole value into an editor below its key (the Config Map's), Hide masks it again (an edited one stays, masked), Revert and Save at the end of the data; Save reviews a masked diff (the keys that change and their sizes, never a value) and a server dry run (`secret.reviewData`), then `secret.saveData` writes with the resourceVersion the values are based on as precondition, rebasing onto a newer version none of the edited keys changed in and showing the conflict otherwise; both commands GUI-only (agents and the CLI refused, the audit line of a refused call with the Secret and its keys only), the unsaved values in the window's memory only, never on disk; elsewhere Show reveals read-only as before, the reason under the data ([`secretdata.go`](../../internal/ui/fyneui/secretdata.go), [`engine/secretdataedit.go`](../../internal/engine/secretdataedit.go); `TestSecretDrawerDataSave`, `TestSecretDrawerDataIsGUIOnly`, `TestSecretDrawerDataConflictAndRebase`, `TestSecretDrawerDataRefusals`, on kind `TestKindSecretDataSave`, `TestSecretDrawerEditAndSave`, `TestSecretDrawerKeepsUnsavedInMemory`, `TestSecretDrawerRebaseAndConflict`, `TestSecretDrawerReadOnly`; PNGs [drawer](../../internal/ui/fyneui/testdata/secret_edit_dark.png), [masked diff](../../internal/ui/fyneui/testdata/secret_save_dark.png)); since 2026-10-16 (the owner's audit decision, D-59; inferred, not captured) keys are added and removed there too, as a Config Map's, the window's only: an added key's value typed as text, a key removed without showing its value, the masked diff naming both (a removal in red), a save that removes a key destructive with the review as its confirmation (`TestSecretDrawerDataAddsAndRemovesKeys`, `TestSecretDrawerDataKeysConflict`, `TestSecretDrawerDataKeysAudit`, on kind `TestKindSecretDataSave`, `TestSecretDrawerAddsAndRemovesKeys`; PNGs [drawer](../../internal/ui/fyneui/testdata/secret_keys_drawer_dark.png), [review](../../internal/ui/fyneui/testdata/secret_keys_review_dark.png), [light](../../internal/ui/fyneui/testdata/secret_keys_review_light.png)); since 2026-10-16 (the owner's audit decision, D-59; Cogpit's, inferred) each value in an editor, an added key's too, has a copy icon in its key's line that copies the whole value as typed through the clipboard for Secret values (concealed, cleared after 60 seconds), as ⌘C and ⌘X copy a selection; a Config Map's editors have none (`TestSecretEditorCopyIcon`, `TestConfigMapEditorsHaveNoCopyIcon`; PNGs [dark](../../internal/ui/fyneui/testdata/secret_edit_dark.png), [light](../../internal/ui/fyneui/testdata/secret_edit_light.png)) | +| Secrets; checked against a real cluster, 2026-10-16: 261 secrets, Type and Keys as kubectl's Type and Data; a TLS Secret's drawer decodes a chain of three certificates | `v1` Secret | Name, Namespace, Labels, Keys, Type, Age | Create `secret.create`, Save the drawer's values `secret.saveData` (Cogpit's id; Lens's Save inferred) | partial (2026-10-12): view as documented, not checked against a running Lens (capture needed), from a full watch on every Secret since the owner revised [D-13](../developer/decisions.md#d-13-cache) (2026-10-12; before, 2026-10-11, a metadata-only watch with Keys and Type empty): Name, Namespace, Labels (`key=value`, sorted, comma-separated), Keys (the names of the keys, sorted, comma-separated; the cell format inferred), Type and Age, as in Lens's documentation; no status token (inferred: a Secret has no state); the cache drops the `last-applied-configuration` annotation from Secrets, which repeats their values ([`secrets.go`](../../internal/model/kinds/secrets.go), `TestGolden`, `TestSecretTexts`, `TestSecretDetailShowsNoValue`, `TestSecretsLoseTheLastAppliedAnnotation`, [PNG](../../internal/ui/fyneui/testdata/secrets_list_dark.png)); one initial list or streaming watch of every Secret, counted on the fake API server (`TestBudgetSecretsViewAndDrawer`) and on kind (`TestKindSecretsView`). Drawer (Cogpit's, inferred; Lens's not captured): read from the cache, no request (2026-10-12; the GET per open is gone); Properties with the Type, a Data section that lists every key with its value masked (`••••••••` and the size; binary values by size only; 100 keys) and a Show button that reveals one value in place, up to 4 KiB and 40 lines, until Hide, another object or closing the drawer; revealing is GUI-only (`secret.reveal` refuses agents and the CLI) and reads the cache; no value reaches `object_get`, `resources_list`, `resources_find`, `table_exportCsv`, the YAML, the audit log, a toast or a log ([`secretdata.go`](../../internal/engine/secretdata.go), [`secretreveal.go`](../../internal/ui/fyneui/secretreveal.go), `TestSecretDrawerReadsTheCacheAndMasks`, `TestRevealIsGUIOnly`, `TestAgentsReadSecretsRedacted`, `TestSecretRevealInDrawer`, PNGs [dark](../../internal/ui/fyneui/testdata/secrets_dark.png), [light](../../internal/ui/fyneui/testdata/secrets_light.png)); Edit and Create from YAML work in the GUI only, agents and the CLI are refused (D-19, `TestSecretEditAndCreateAreGUIOnly`, `TestSecretEditIsRefusedToAgentsAndTheCLI`); beyond Lens (2026-10-13, the owner's [D-30](../developer/decisions.md#d-30-certificates-in-secrets-decoded), not counted here: [beyond Lens](beyond-lens.md#everyday-use)): after the Data section, the certificates its keys hold decoded, a group "Certificates · " per key with one section per certificate and each field its own value, and for agents the same fields in `object_get`'s `certificates`, never the PEM text or a private key ([`secretcerts.go`](../../internal/engine/secretcerts.go), `TestSecretCertificateSections`, `TestSecretDrawerShowsCertificates`, PNG [dark](../../internal/ui/fyneui/testdata/secret_certs_dark.png)); Create partial (2026-10-13): the "+" opens the Create Secret dialog ([Create dialogs](#create-dialogs)): name, namespace, type, the data as rows of a key and a value, labels and annotations as rows (inferred from Lens's documentation; the dialog is not captured); a value is masked as typed or pasted, may span lines, and the eye at its end shows it (Fyne's password revealer); a type fills in the keys it needs, a service account token its annotation (Cogpit's default); `secret.create` checks the name, the keys, the type's required keys, the labels and annotations and the sizes before anything is sent, then dry-runs and creates, the values base64-encoded in `data` (Cogpit's default, [credentials](../security/credentials.md#secret-values-in-the-create-secret-dialog)); the user's only (D-19): agents and the CLI are refused before anything is asked or sent, and the audit line of a refused call names the Secret, its type and its keys, never a value ([`commands/secretcreate.go`](../../internal/engine/commands/secretcreate.go), [`createdialog_secret.go`](../../internal/ui/fyneui/createdialog_secret.go); `TestSecretCreateFromTheGUI`, `TestSecretCreateIsGUIOnly`, `TestSecretCreateChecksBeforeSending`, `TestSecretCreateErrorsNeverQuoteValues`, `TestSecretCreateFollowsAccessReviews`, `TestSecretDialogSendsTheSecret`, `TestSecretDialogTypeFillsItsKeys`, `TestSecretDialogRevealsOneValue`; PNGs [dark](../../internal/ui/fyneui/testdata/create_secret_dialog_dark.png), [light](../../internal/ui/fyneui/testdata/create_secret_dialog_light.png)); the drawer's value sizes in binary units since 2026-10-13 ("•••••••• (38 B)", "binary data, 1.2 KiB", [D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal)); since 2026-10-15 (the owner's F3, [D-55](../developer/decisions.md#d-55-a-config-maps-values-edited-in-the-drawer)) the drawer's Data puts each key on a line of its own and its masked value, Show and a revealed value below it at the full width, as Lens's ConfigMap drawer lays out its data (Lens's Secret drawer is not captured: inferred) (`TestSecretDrawerKeysAboveValues`, `TestSecretRevealInDrawer`; PNGs [dark](../../internal/ui/fyneui/testdata/secret_longkeys_dark.png), [light](../../internal/ui/fyneui/testdata/secret_longkeys_light.png)); since the night of 2026-10-15 (the owner's audit answer, [D-59](../developer/decisions.md#d-59-a-secrets-values-edited-in-the-drawer); Lens's editing inferred, not captured) a Secret's values are edited in the drawer, in the window only: where the user may save the Secret, Show reads the whole value into an editor below its key (the Config Map's), Hide masks it again (an edited one stays, masked), Revert and Save at the end of the data; Save reviews a masked diff (the keys that change and their sizes, never a value) and a server dry run (`secret.reviewData`), then `secret.saveData` writes with the resourceVersion the values are based on as precondition, rebasing onto a newer version none of the edited keys changed in and showing the conflict otherwise; both commands GUI-only (agents and the CLI refused, the audit line of a refused call with the Secret and its keys only), the unsaved values in the window's memory only, never on disk; elsewhere Show reveals read-only as before, the reason under the data ([`secretdata.go`](../../internal/ui/fyneui/secretdata.go), [`engine/secretdataedit.go`](../../internal/engine/secretdataedit.go); `TestSecretDrawerDataSave`, `TestSecretDrawerDataIsGUIOnly`, `TestSecretDrawerDataConflictAndRebase`, `TestSecretDrawerDataRefusals`, on kind `TestKindSecretDataSave`, `TestSecretDrawerEditAndSave`, `TestSecretDrawerKeepsUnsavedInMemory`, `TestSecretDrawerRebaseAndConflict`, `TestSecretDrawerReadOnly`; PNGs [drawer](../../internal/ui/fyneui/testdata/secret_edit_dark.png), [masked diff](../../internal/ui/fyneui/testdata/secret_save_dark.png)); since 2026-10-16 (the owner's audit decision, D-59; inferred, not captured) keys are added and removed there too, as a Config Map's, the window's only: an added key's value typed as text, a key removed without showing its value, the masked diff naming both (a removal in red), a save that removes a key destructive with the review as its confirmation (`TestSecretDrawerDataAddsAndRemovesKeys`, `TestSecretDrawerDataKeysConflict`, `TestSecretDrawerDataKeysAudit`, on kind `TestKindSecretDataSave`, `TestSecretDrawerAddsAndRemovesKeys`; PNGs [drawer](../../internal/ui/fyneui/testdata/secret_keys_drawer_dark.png), [review](../../internal/ui/fyneui/testdata/secret_keys_review_dark.png), [light](../../internal/ui/fyneui/testdata/secret_keys_review_light.png)); since 2026-10-16 (the owner's audit decision, D-59; Cogpit's, inferred) each value in an editor, an added key's too, has a copy icon in its key's line that copies the whole value as typed through the clipboard for Secret values (concealed, cleared after 60 seconds), as ⌘C and ⌘X copy a selection; a Config Map's editors have none (`TestSecretEditorCopyIcon`, `TestConfigMapEditorsHaveNoCopyIcon`; PNGs [dark](../../internal/ui/fyneui/testdata/secret_edit_dark.png), [light](../../internal/ui/fyneui/testdata/secret_edit_light.png)); since 2026-10-22 (the owner's decision, [D-25](../developer/decisions.md#d-25-copying-values), beyond Lens) a masked value's copy icon on hover copies the whole value without showing it, the drawer staying masked and no editor opened, and an edited value hidden again copies what was typed (`TestSecretMaskedValueCopiedWithoutShowing`, `TestSecretEditorMaskedValueCopiedWithoutShowing`) | | Resource Quotas | `v1` ResourceQuota | Name, Namespace, Age | Create `resourceQuota.create` | partial (2026-10-11): view with the documented columns, not checked against a capture ([`resourcequotas.go`](../../internal/model/kinds/resourcequotas.go), `TestResourceQuotasStatusTexts`, `TestResourceQuotaAtLimit`, `TestGolden`, `TestKindConfigViews`); inferred: the status rule (a warning when a resource's use reached its hard limit, a limit of zero that nothing uses not counted; pending until the quota controller has counted the use; uncoloured without limits) and the drawer (Scopes, Scope Selector and the resources at their limit in Properties, then a Quotas table of Resource, Used, Hard); Create partial (2026-10-12): a dialog with the name, the namespace and hard limits as rows of a resource (Kubernetes' standard names offered) and a quantity, without scopes (inferred, not captured; [Create dialogs](#create-dialogs)); `resourceQuota.create` checks the quantities, the dry run the resource names (`TestCreateDialogsSendRulesAndLimits`, `TestCreateDialogRefusedByTheDryRun`, `TestKindCreateDialogs`; [PNG](../../internal/ui/fyneui/testdata/create_resourcequota_dialog_dark.png)); Used and Hard of memory, storage and ephemeral storage in binary units with one decimal since 2026-10-13 ([D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal)), counts and CPU as written | | Limit Ranges | `v1` LimitRange | Name, Namespace, Age | – | partial (2026-10-11): view with the documented columns, not checked against a capture ([`limitranges.go`](../../internal/model/kinds/limitranges.go), `TestLimitRangesStatusTexts`, `TestLimitRangeTable`, `TestGolden`, `TestKindConfigViews`); inferred: no status token (a limit range has no state) and the drawer's Limits table (a row per type and resource: Min, Max, Default Request, Default Limit, Max Limit/Request Ratio); the bounds of memory and storage in binary units with one decimal since 2026-10-13, the ratio as written ([D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal), `TestLimitRangeTable`) | | Horizontal Pod Autoscalers | `autoscaling/v2` HorizontalPodAutoscaler | Name, Namespace, Metrics, Min Pods, Max Pods, Replicas, Age, Status | – | partial (2026-10-11): view with the documented columns, not checked against a capture ([`horizontalpodautoscalers.go`](../../internal/model/kinds/horizontalpodautoscalers.go), `TestHorizontalPodAutoscalersStatusTexts`, `TestGolden`, `TestKindConfigViews`); inferred, capture needed: Metrics in kubectl's TARGETS form with each metric named ("cpu: 45%/80%", a container resource as "cpu (app)", "" before the first reading, the first two, then "+ N more...", "" without metrics), each metric's current value found by type and name rather than by position; Min Pods 1 when unset (the API's default); Replicas the current count; Status the True condition types, sorted ("AbleToScale ScalingActive"), with the rule: cannot scale its target or compute its metrics an error, held at Max Pods while it wants more a warning, held at Min Pods fine, switched off because the target is scaled to zero uncoloured, no conditions yet pending; the drawer (Reference as a link to the target, Min and Max Pods, current and desired replicas, Last Scale, the scale-up and scale-down behaviour; a Metrics table of Metric, Type, Current, Target; Conditions); a memory or ephemeral-storage resource metric in binary units since 2026-10-13 ("memory: 288.0 MiB/512.0 MiB", [D-32](../developer/decisions.md#d-32-every-byte-amount-in-binary-units-with-one-decimal)) | @@ -278,6 +278,7 @@ uninstall), not on a grant's (`TestCreateDialogsDryRunThenCreate`, `TestCreateDi | Date | Change | Summary | |---|---|---| +| 2026-10-22 | minor | Secrets: a masked value's copy icon copies the whole value without showing it, in the drawer and in its editable Data (the owner's decision, reversing "only once revealed", D-25); no status moves | | 2026-10-22 | minor | Pods: the image ratings as grades S to E and N/A, a shield in the list's narrow column and in each container section of the drawer (the owner's request, D-113, PR #69); no status moves | | 2026-10-20 | trivial | Releases: Rollback's revision dropdown opens over its field, the current revision checked at its place (the owner's GW5, D-104); no status moved | | 2026-10-20 | minor | Deployments (and through it Stateful Sets and Replica Sets): Scale's dialog a slider from 1 to 30 with the count typed beside it, its hint behind a "?"; Nodes: Drain's options with their hints behind a "?", the numbers five digits wide (the owner's GW2 and GW6, D-104); no status moved | diff --git a/docs/parity/roadmap.md b/docs/parity/roadmap.md index 88b67fa8d..04520a473 100644 --- a/docs/parity/roadmap.md +++ b/docs/parity/roadmap.md @@ -1,6 +1,6 @@ # Roadmap -> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): the Connect row and result, the gate's note, M1, M13, Current focus items 7 and 13, What's next's Alpha row; the cloud-plugin discount removed); minor (the readiness recount: ready for real work ~47%, estimated 2026-10-22, inside the alpha band; the stability discount ×0.85; Current focus item 7 and What's next's Alpha row); minor (the alpha gate passed: the owner's re-walk of 2026-10-22 of every fix that touches it, each passed, findings AW1–AW19 none blocking, D-114; the gate's cells, its result, the stage text and Current focus items 6 and 7; the readiness recount next); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (the Windows jobs in `sparkle` sign without the owner's approval since 2026-10-22 (his choice, H-141); no number moves); trivial (Current focus item 11 as Upstream: Fyne's font cache fix, PR fyne#6620, and the terminal pull requests' state); minor (Cogpit for Windows, D-111, on the branch `windows-release`: the stage line, M0's Windows tests, M11 with the Windows setup, WinSparkle and the terminal on ConPTY, 20–45 h left; Current focus item 15; What's next); minor (Cogpit for Linux, D-108: the stage line, M11 in progress with the Linux deb, Cogpit's APT repository and the updates through apt, 30–65 h left; Current focus item 14; What's next); minor (the stage line and Current focus item 6: GW1–GW9 built 2026-10-20 with GW10 and GW11 from the owner's use); minor (the alpha gate, the stage line and Current focus items 6 and 7: the gate walk of 2026-10-20, every workflow walked and passed, findings GW1–GW9 in G16; the gate's cells for WF31–WF33, WF35 and WF38–WF40 brought to "built 2026-10-19, re-walk open"); minor (Current focus item 7: fast scrolling in releases since v0.30.0); minor (Current focus item 7: fast scrolling merged after the owner's look, in releases from the next one on); minor (Current focus item 7, 2026-10-20 night: fast scrolling built on the branch `fast-scroll`, waiting for the owner's look); minor (Current focus items 6 and 7, 2026-10-19 evening: the colleague's container square and the stuck ⌘ built, the walks on hold, the fast-scroll finding); minor (Current focus items 2, 5, 6 and 7, the alpha path: WF31–WF45 built 2026-10-19, WF42 in the owner's visual review; his re-walk next); minor (Triage a failing pod: WF36 built, a log's text selected and copied, D-99); minor (the alpha gate and the path to beta brought to the owner's walks of 2026-10-17 to 2026-10-19: per workflow what a person walked and what is open, a gate walk of the open five as item 6, the walk's findings WF31–WF45 in item 7, the readiness and the hours marked as of before the walks; Current focus items 2, 3, 5, 6, 7); minor (Current focus item 5: walked 2026-10-17 and 2026-10-18, WF1–WF30 built, the walk goes on at W30); trivial (captures needed: the hotbar's bank arrows gone with D-83, one hotbar); minor (Current focus: the banner's Reconnect connects anew since D-81, 2026-10-17; no item moves); minor (v0.22.0 released 2026-10-17 08:14 UTC, its appcast waiting for the owner's approval with v0.20.0's and v0.21.0's); minor (Current focus 8: the review of the lead's details decided by the owner, D-74); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (Current focus: item 8 built in the night run of 2026-10-16/17 with the owner's orders of that night, D-72 and D-73; the walk script); minor (M7, night run 2026-10-16/17: G12 1–4 h left, was 2–7); minor (M9 done 2026-10-16 night: G17 closed, the triage and change workflows of an external agent over MCP on kind); minor (Current focus item 8: the Edit tab's key removal destructive, built 2026-10-16 night; the item's three answers built); minor (Current focus items 3 and 8: the welcome page without its button built 2026-10-16 night); minor (Current focus item 8: a lone checked row's Clear Selection built 2026-10-16 night); minor (Current focus item 8: the owner's answers of 2026-10-16 evening to build (a lone checked row's Clear Selection, the welcome page's button, the Edit tab's key removal destructive); how the lead's details are reviewed from now on waits for the owner, not as another round of details); minor (item 1: v0.17.0 to v0.19.0 released 2026-10-16, the feed holds 0.19.0 to 0.15.0); minor (item 8: the Edit tab's key removal and the lead's decisions of 2026-10-16 day to ask); minor (Current focus: the owner's audit of the night decisions (2026-10-16), items 2 and 3 confirmed but D-57's menu path and welcome page button; item 8 gains his two open "change, how?" answers); minor (M7: Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61; 2–7 h left, G12); minor (Current focus: D-69 stage 3 built 2026-10-16, the two settings); minor (current focus: D-69 stage 2, the window with several connected clusters, built 2026-10-16); minor (Current focus: several clusters at once, the owner's F16, decided in his interview and its engine part built 2026-10-16, D-69 stage 1; the window's part next); minor (item 1: v0.13.0 has its disk image since a re-run, 2026-10-15 23:52 UTC); minor (Current focus: the day run of 2026-10-16, the owner's F10 to F18 built, F16 waiting for its interview); minor (the standby item: a blinking green dot instead of the amber dot and "Reconnecting…", the owner's F13 2026-10-16); minor (item 1: the first update through the feed went through on 2026-10-16, the owner's MacBook from 0.15.0 to 0.16.0); minor (item 1: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0, the first update pending on the owner's MacBook); minor (item 1: v0.14.0 and v0.15.0 notarized with files, appcasts waiting for the owner); minor (Current focus updated after the night run of 2026-10-15/16: item 1 v0.13.0 not notarized in 330 minutes, v0.14.0 and v0.15.0 waiting at Apple; item 4 built; item 7 the night's depth and foundation work; alpha ~50–200 h); minor (Alpha gate, Maintain a node: the drain as a background job with a step per pod and Cancel, D-63); minor (M0 and item 12: `make scorecard` built 2026-10-16, D-15, by hand; no estimate moves); minor (M0: the generated checklist page and the envtest job built 2026-10-16, D-64; no estimate moves); minor (M0: the generated checklist page and the envtest job built 2026-10-16, D-64; no estimate moves); minor (M7: Cogpit Metrics, the provider's query settings and a node's network and filesystem built (G12, night run of 2026-10-15/16), 3–10 h left, beta ~235–640 h); minor (Current focus item 2, standby and lost connections, built 2026-10-16 (D-58), the owner's check in a real window left); minor (Current focus item 4: the drawer's audit answers built, night run 2026-10-15: a Config Map's Save rebasing and drafts, a Secret's values in the drawer); minor (Current focus item 4: a Config Map's drawer Save rebasing by itself and its drafts on disk built, night run 2026-10-15); minor (M12 and current focus item 4: the chat's audit answers built in the night run: send all tools, the `http://` warning and CA file, F9); minor (M12 and current focus item 4: the chat's send all tools, `http://` warning and CA file built in the night run); minor (M12 and current focus item 4: the chat's send all tools built in the night run); minor (current focus item 3, choosing a cluster, built 2026-10-15 in the night run (D-57); no estimate moves); minor (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate: alpha ~50–200 h plus the walks, beta ~240–650 h; M7, M8, M12 and GitOps' remainders from G12, G5 and G13, G21 and G23); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): no longer an alpha step, the Connect row, M1 and What's next say so; the night run of 2026-10-15/16 named in the current focus); major (Current focus rewritten as the path to alpha after the owner's audit and two interviews with the owner on 2026-10-15 (standby and lost connections, choosing a cluster; decided, not built); the alpha gate's Connect row and result with the hang after sleep, the node drawer's metrics, the download row with the releases since v0.6.0; milestones M1, M2, M6, M10, GitOps and M12 brought to what is built; Sparkle's update key set up by the owner; alpha and beta hours as ROADMAP's estimate of 2026-10-13; What's next rebuilt); minor (Current focus: the chat's API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), the keychain on Windows and Linux no longer open; M11 without keychain backends); minor (Current focus: the chat's H-96 built, a private connection's conversations not kept); minor (Current focus: H-96 decided, R3 postponed by the owner); minor (Current focus: the owner's audit of the night run's decisions first; the chat and the evening's decisions built but R3 and A10); minor (Current focus: the About dialog of item 1 fixed, A60 built with it); minor (Current focus: the owner's findings in a real window of 2026-10-14 evening first (node history from Prometheus, the About dialog), his decision round of the same evening as item 8 after the agent chat; the open questions answered; the terminal fork's two newer patches offered upstream later); minor (M10: `cogpit-cli` inside the app and the disk image the release's only download, D-16 revised by the owner, built, no tag run yet); minor (M10 in progress: the signed, notarized disk image built, no tag run yet; Current focus: the node shell as built confirmed by the owner, D-37; GitOps: Flux CD's section built, the milestone in progress, G23; M3, M4: the node shell built, D-37, a night decision for the owner to confirm; Current focus: its confirmation replaces the owner's decision on H-7; alpha gate: the downloadable macOS build exists since v0.1.0, for Apple silicon; Current focus after the day run: D-29 and the copy icons built; M6: a release upgraded to a version from the user's chart repositories; M7: the cluster Overview built; M1 and 0.1: `cogpit-cli contexts` and `get` built; M9: the stdio bridge built; current focus after the fifth run and the owner's smoke test; M12 in progress: the built-in agent's engine side built, 20–40 h left; Current focus item 1: the node history from Prometheus built in the night run (G12, A43)) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (Current focus item 6: the alpha walk's findings AW1–AW19 all built 2026-10-22, PRs #74 to #82, the re-walk next); minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): the Connect row and result, the gate's note, M1, M13, Current focus items 7 and 13, What's next's Alpha row; the cloud-plugin discount removed); minor (the readiness recount: ready for real work ~47%, estimated 2026-10-22, inside the alpha band; the stability discount ×0.85; Current focus item 7 and What's next's Alpha row); minor (the alpha gate passed: the owner's re-walk of 2026-10-22 of every fix that touches it, each passed, findings AW1–AW19 none blocking, D-114; the gate's cells, its result, the stage text and Current focus items 6 and 7; the readiness recount next); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (the Windows jobs in `sparkle` sign without the owner's approval since 2026-10-22 (his choice, H-141); no number moves); trivial (Current focus item 11 as Upstream: Fyne's font cache fix, PR fyne#6620, and the terminal pull requests' state); minor (Cogpit for Windows, D-111, on the branch `windows-release`: the stage line, M0's Windows tests, M11 with the Windows setup, WinSparkle and the terminal on ConPTY, 20–45 h left; Current focus item 15; What's next); minor (Cogpit for Linux, D-108: the stage line, M11 in progress with the Linux deb, Cogpit's APT repository and the updates through apt, 30–65 h left; Current focus item 14; What's next); minor (the stage line and Current focus item 6: GW1–GW9 built 2026-10-20 with GW10 and GW11 from the owner's use); minor (the alpha gate, the stage line and Current focus items 6 and 7: the gate walk of 2026-10-20, every workflow walked and passed, findings GW1–GW9 in G16; the gate's cells for WF31–WF33, WF35 and WF38–WF40 brought to "built 2026-10-19, re-walk open"); minor (Current focus item 7: fast scrolling in releases since v0.30.0); minor (Current focus item 7: fast scrolling merged after the owner's look, in releases from the next one on); minor (Current focus item 7, 2026-10-20 night: fast scrolling built on the branch `fast-scroll`, waiting for the owner's look); minor (Current focus items 6 and 7, 2026-10-19 evening: the colleague's container square and the stuck ⌘ built, the walks on hold, the fast-scroll finding); minor (Current focus items 2, 5, 6 and 7, the alpha path: WF31–WF45 built 2026-10-19, WF42 in the owner's visual review; his re-walk next); minor (Triage a failing pod: WF36 built, a log's text selected and copied, D-99); minor (the alpha gate and the path to beta brought to the owner's walks of 2026-10-17 to 2026-10-19: per workflow what a person walked and what is open, a gate walk of the open five as item 6, the walk's findings WF31–WF45 in item 7, the readiness and the hours marked as of before the walks; Current focus items 2, 3, 5, 6, 7); minor (Current focus item 5: walked 2026-10-17 and 2026-10-18, WF1–WF30 built, the walk goes on at W30); trivial (captures needed: the hotbar's bank arrows gone with D-83, one hotbar); minor (Current focus: the banner's Reconnect connects anew since D-81, 2026-10-17; no item moves); minor (v0.22.0 released 2026-10-17 08:14 UTC, its appcast waiting for the owner's approval with v0.20.0's and v0.21.0's); minor (Current focus 8: the review of the lead's details decided by the owner, D-74); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (Current focus: item 8 built in the night run of 2026-10-16/17 with the owner's orders of that night, D-72 and D-73; the walk script); minor (M7, night run 2026-10-16/17: G12 1–4 h left, was 2–7); minor (M9 done 2026-10-16 night: G17 closed, the triage and change workflows of an external agent over MCP on kind); minor (Current focus item 8: the Edit tab's key removal destructive, built 2026-10-16 night; the item's three answers built); minor (Current focus items 3 and 8: the welcome page without its button built 2026-10-16 night); minor (Current focus item 8: a lone checked row's Clear Selection built 2026-10-16 night); minor (Current focus item 8: the owner's answers of 2026-10-16 evening to build (a lone checked row's Clear Selection, the welcome page's button, the Edit tab's key removal destructive); how the lead's details are reviewed from now on waits for the owner, not as another round of details); minor (item 1: v0.17.0 to v0.19.0 released 2026-10-16, the feed holds 0.19.0 to 0.15.0); minor (item 8: the Edit tab's key removal and the lead's decisions of 2026-10-16 day to ask); minor (Current focus: the owner's audit of the night decisions (2026-10-16), items 2 and 3 confirmed but D-57's menu path and welcome page button; item 8 gains his two open "change, how?" answers); minor (M7: Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61; 2–7 h left, G12); minor (Current focus: D-69 stage 3 built 2026-10-16, the two settings); minor (current focus: D-69 stage 2, the window with several connected clusters, built 2026-10-16); minor (Current focus: several clusters at once, the owner's F16, decided in his interview and its engine part built 2026-10-16, D-69 stage 1; the window's part next); minor (item 1: v0.13.0 has its disk image since a re-run, 2026-10-15 23:52 UTC); minor (Current focus: the day run of 2026-10-16, the owner's F10 to F18 built, F16 waiting for its interview); minor (the standby item: a blinking green dot instead of the amber dot and "Reconnecting…", the owner's F13 2026-10-16); minor (item 1: the first update through the feed went through on 2026-10-16, the owner's MacBook from 0.15.0 to 0.16.0); minor (item 1: the signed feed served since 2026-10-16 with 0.16.0 and 0.15.0, the first update pending on the owner's MacBook); minor (item 1: v0.14.0 and v0.15.0 notarized with files, appcasts waiting for the owner); minor (Current focus updated after the night run of 2026-10-15/16: item 1 v0.13.0 not notarized in 330 minutes, v0.14.0 and v0.15.0 waiting at Apple; item 4 built; item 7 the night's depth and foundation work; alpha ~50–200 h); minor (Alpha gate, Maintain a node: the drain as a background job with a step per pod and Cancel, D-63); minor (M0 and item 12: `make scorecard` built 2026-10-16, D-15, by hand; no estimate moves); minor (M0: the generated checklist page and the envtest job built 2026-10-16, D-64; no estimate moves); minor (M0: the generated checklist page and the envtest job built 2026-10-16, D-64; no estimate moves); minor (M7: Cogpit Metrics, the provider's query settings and a node's network and filesystem built (G12, night run of 2026-10-15/16), 3–10 h left, beta ~235–640 h); minor (Current focus item 2, standby and lost connections, built 2026-10-16 (D-58), the owner's check in a real window left); minor (Current focus item 4: the drawer's audit answers built, night run 2026-10-15: a Config Map's Save rebasing and drafts, a Secret's values in the drawer); minor (Current focus item 4: a Config Map's drawer Save rebasing by itself and its drafts on disk built, night run 2026-10-15); minor (M12 and current focus item 4: the chat's audit answers built in the night run: send all tools, the `http://` warning and CA file, F9); minor (M12 and current focus item 4: the chat's send all tools, `http://` warning and CA file built in the night run); minor (M12 and current focus item 4: the chat's send all tools built in the night run); minor (current focus item 3, choosing a cluster, built 2026-10-15 in the night run (D-57); no estimate moves); minor (hours re-estimated 2026-10-15 from the gap entries, the lead's estimate: alpha ~50–200 h plus the walks, beta ~240–650 h; M7, M8, M12 and GitOps' remainders from G12, G5 and G13, G21 and G23); minor (verifying the credential plugins on EKS, GKE and AKS out of scope until long after parity (owner, 2026-10-15): no longer an alpha step, the Connect row, M1 and What's next say so; the night run of 2026-10-15/16 named in the current focus); major (Current focus rewritten as the path to alpha after the owner's audit and two interviews with the owner on 2026-10-15 (standby and lost connections, choosing a cluster; decided, not built); the alpha gate's Connect row and result with the hang after sleep, the node drawer's metrics, the download row with the releases since v0.6.0; milestones M1, M2, M6, M10, GitOps and M12 brought to what is built; Sparkle's update key set up by the owner; alpha and beta hours as ROADMAP's estimate of 2026-10-13; What's next rebuilt); minor (Current focus: the chat's API keys in an owner-only file on every platform, no keychain (the owner, 2026-10-15), the keychain on Windows and Linux no longer open; M11 without keychain backends); minor (Current focus: the chat's H-96 built, a private connection's conversations not kept); minor (Current focus: H-96 decided, R3 postponed by the owner); minor (Current focus: the owner's audit of the night run's decisions first; the chat and the evening's decisions built but R3 and A10); minor (Current focus: the About dialog of item 1 fixed, A60 built with it); minor (Current focus: the owner's findings in a real window of 2026-10-14 evening first (node history from Prometheus, the About dialog), his decision round of the same evening as item 8 after the agent chat; the open questions answered; the terminal fork's two newer patches offered upstream later); minor (M10: `cogpit-cli` inside the app and the disk image the release's only download, D-16 revised by the owner, built, no tag run yet); minor (M10 in progress: the signed, notarized disk image built, no tag run yet; Current focus: the node shell as built confirmed by the owner, D-37; GitOps: Flux CD's section built, the milestone in progress, G23; M3, M4: the node shell built, D-37, a night decision for the owner to confirm; Current focus: its confirmation replaces the owner's decision on H-7; alpha gate: the downloadable macOS build exists since v0.1.0, for Apple silicon; Current focus after the day run: D-29 and the copy icons built; M6: a release upgraded to a version from the user's chart repositories; M7: the cluster Overview built; M1 and 0.1: `cogpit-cli contexts` and `get` built; M9: the stdio bridge built; current focus after the fifth run and the owner's smoke test; M12 in progress: the built-in agent's engine side built, 20–40 h left; Current focus item 1: the node history from Prometheus built in the night run (G12, A43)) · **Target:** Lens Desktop 2026.10.51501 Forward-looking plan: the alpha gate, the milestones, the **current focus** and what's next with estimates. Where Cogpit stands is in [`target-app-parity.md`](target-app-parity.md); the ranked @@ -203,7 +203,9 @@ windows (item 10). step; plan's "Alpha-Abschluss-Walk"): the fixes of WF31–WF33, WF35, WF38–WF40 and GW1–GW14 that touch the gate, each passed; findings AW1–AW19, none blocking, in [G16](gaps.md#g16-stability-and-the-user-bug-backlog), his decisions in - [D-114](../developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages). Done. + [D-114](../developer/decisions.md#d-114-the-alpha-walks-decisions-a-failed-connects-page-and-its-stages). Done. The + findings AW1–AW19 all built 2026-10-22 (PRs #74 to #82; D-114 built, D-115, D-116); the owner's + re-walk of them is next. 7. **What the walks find, and the depth the gate needs** ([G16](gaps.md#g16-stability-and-the-user-bug-backlog) and the gaps marked *blocks alpha*, G1–G11 and part of G13): the bulk of the ~50–200 h. Alpha also needs ready for real work in the ~40–75% band ([stages](README.md#stages)); it is ~47% @@ -352,6 +354,7 @@ Beside the path to alpha: | Date | Change | Summary | |---|---|---| +| 2026-10-22 | minor | Current focus item 6: the alpha walk's findings AW1–AW19 all built 2026-10-22 (PRs #74 to #82; D-114 built, D-115, D-116), the owner's re-walk next | | 2026-10-22 | minor | Stage: alpha, declared by the owner 2026-10-22 ("Ja, dann sind wir jetzt Alpha") after the gate's re-walk and the readiness recount; the stage texts brought to it | | 2026-10-22 | minor | The cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9; out of scope until long after parity since 2026-10-15): the Connect row and its result, the gate's closing note, M1's state and definition of done, M13's scope (its 110–220 h not re-estimated), Current focus item 7 (the cloud-plugin discount ×0.7 removed: mainstream ~59%, essentials ~69%) and item 13, What's next's Alpha row | | 2026-10-22 | minor | The readiness recount after the gate's re-walk (the lead's estimate, open to revision, D-74): ready for real work ~47% (range 42–52, estimated; was ~30% of 2026-10-13), inside the ~40–75% band, so both alpha conditions hold and alpha is declared on the owner's word; the stability discount ×0.85 (was ×0.7), the cloud-plugin discount ×0.7 the owner's pending decision; Current focus item 7's readiness sentences and What's next's Alpha row | diff --git a/docs/parity/target-app-parity.md b/docs/parity/target-app-parity.md index a4577836e..ba56b39bc 100644 --- a/docs/parity/target-app-parity.md +++ b/docs/parity/target-app-parity.md @@ -1,6 +1,6 @@ # Cogpit vs Lens Desktop: target-app parity -> **Last reviewed:** 2026-10-16 · **Last updated:** 2026-10-22 · **Change:** minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): the three plugin rows not a target, authentication 7 of 10, the paid features 3 of 10 (the cloud account integrations out of the premium list's count), weighted breadth 87.8%, breadth ~88%; the interface's two paid cloud rows not a target; the cloud-plugin discount removed: mainstream ~59%, essentials ~69%; the scope table, the connectivity row and the human steps); minor (the readiness recount after the owner's re-walk of the gate, the lead's estimate of 2026-10-22: ready for real work ~47% (42–52), mainstream ~42% with stability ×0.85, essentials ~48%, the full Lens target ~31%; every dimension's, area's and feature's evidence; the Interface, Connectivity and Helm rows' hours brought to the gap entries; the stage texts: the gate passed, both alpha conditions hold, alpha on the owner's word); trivial (Interface fidelity: 8 of the free rows done, was 9, the dock's "New tab" menu replaced by two chips at the owner's request; the weighted shares unchanged); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (Needs a human: the owner's approval of each release's appcast jobs dropped, they sign without it since 2026-10-22 (his choice, H-141); no number moves); minor (Cogpit for Windows, D-111: the platforms 9 of 13 package rows, 86.0% weighted, breadth ~86%; G22 20–45 h, the full Lens target ~360–900 h; the scope's Windows and Linux row; the human steps); minor (Cogpit for Linux, D-108: the platforms 8 of 13 package rows, breadth ~86%, 85.6% weighted; G22 30–65 h, the full Lens target ~370–920 h; the scope's Windows and Linux row; the human steps); minor (the interface: 119 of 122 free rows, a log tab's text selected and copied a new row, the owner's WF36, D-99; weighted 84.8% unchanged); minor (the interface: 118 of 121 free rows, the window opening where it was closed a new row, D-95; weighted 84.8% unchanged); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (the platform row: v0.13.0 to v0.19.0 with files, the signed feed and the first update, 2026-10-16); minor (the interface row Lens Metrics not a target, Cogpit Metrics withdrawn by the owner 2026-10-16, D-61: 117 of 120 free rows, weighted breadth 84.8%; G12 2–7 h, the hours within their rounding); minor (Platforms: v0.14.0 and v0.15.0 notarized with their disk images on 2026-10-16); minor (hours recounted after the night run of 2026-10-15/16: alpha ~50–205, beta ~220–600, free parity ~220–620, the full Lens target ~380–940 agent-hours); minor (Foundation 3–15 h, was 7–23: G3's discovery cache on disk and memory per kind built 2026-10-16; totals not recounted); minor (the foundation row and How to re-measure: the generated checklist page, `make scorecard` and the envtest tier built 2026-10-16; no number moves); minor (the interface row Lens Metrics partial, Cogpit Metrics, G12, D-61: 118 of 121 free rows, weighted breadth 84.8%; G12 3–10 h, beta ~235–640, full parity ~240–655, the full Lens target ~395–980 h, 2026-10-16 night); minor (the Essentials user's standby and lost connections built 2026-10-16, D-58; numbers not moved); minor (Resource actions 42 / 42: the Secrets row names the drawer's Save, secret.saveData, D-59; breadth not moved); minor (beyond Lens ~2–8 h: G21 2–6 h, the owner's audit answers for the chat built in the night run); minor (AGENTS.md rule 10: checked against the code and gaps.md at HEAD; the remaining hours re-estimated from gaps.md's entries of 2026-10-15 (the lead's estimate, PhotoCraft's calibration): alpha ~65–240 h, beta ~240–650 h, free parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours, the audiences' hours and the feature areas' share of G6 and G7; the evidence text of the readiness, audience and area tables brought to what is built; 10 counted rows done, not 9; the human prerequisites current; verifying the cloud credential plugins out of scope until long after parity (owner, 2026-10-15); the readiness percentages and the ×0.7 discounts not changed, a decision pending with the owner); minor (Feature breadth's opening sentence brought to the table's 84.6% (it still said ~57% of 2026-10-12); beyond Lens ~3–12 h as G21's entry and ROADMAP say; no number re-measured); minor (Resource actions 41 / 41: the Config Maps row names the drawer's Save, `configMap.saveData`, the owner's F3; breadth not moved); minor (Sparkle 2 and the signed appcast built, no update key yet, D-4: interface 114 of 120, platforms and packages 6 of 13, weighted 84.2%, breadth ~84%); minor (paid features 3 of 11 with the Flux CD and Argo CD sections, partial: weighted 82.4%, breadth ~82%; the node shell and Cluster Settings › Node Shell partial: actions 39 of 39, interface 113 of 120, weighted 80.6%, breadth ~81%; Create Secret partial: actions 38 of 39; G12: the cluster's Prometheus setting, partial: interface 56 of 120, breadth ~57%; earlier: fourth measurement, by `make parity`: breadth ~56%, ready ~26%; beyond Lens re-estimated at ~20–42 h after the built-in agent's engine side) · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-16 · **Last updated:** 2026-10-22 · **Change:** trivial (Logs: Follow switched by scrolling built, AW14, D-99; no estimate moves); minor (Stage: alpha, declared by the owner 2026-10-22 after the gate's re-walk and the readiness recount; the stage texts brought to it); minor (the cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): the three plugin rows not a target, authentication 7 of 10, the paid features 3 of 10 (the cloud account integrations out of the premium list's count), weighted breadth 87.8%, breadth ~88%; the interface's two paid cloud rows not a target; the cloud-plugin discount removed: mainstream ~59%, essentials ~69%; the scope table, the connectivity row and the human steps); minor (the readiness recount after the owner's re-walk of the gate, the lead's estimate of 2026-10-22: ready for real work ~47% (42–52), mainstream ~42% with stability ×0.85, essentials ~48%, the full Lens target ~31%; every dimension's, area's and feature's evidence; the Interface, Connectivity and Helm rows' hours brought to the gap entries; the stage texts: the gate passed, both alpha conditions hold, alpha on the owner's word); trivial (Interface fidelity: 8 of the free rows done, was 9, the dock's "New tab" menu replaced by two chips at the owner's request; the weighted shares unchanged); trivial (A10 made (2026-10-22): the tag ruleset, the App its only bypass, a probe tag refused; `release`'s admin bypass off; no number moves); trivial (Needs a human: the owner's approval of each release's appcast jobs dropped, they sign without it since 2026-10-22 (his choice, H-141); no number moves); minor (Cogpit for Windows, D-111: the platforms 9 of 13 package rows, 86.0% weighted, breadth ~86%; G22 20–45 h, the full Lens target ~360–900 h; the scope's Windows and Linux row; the human steps); minor (Cogpit for Linux, D-108: the platforms 8 of 13 package rows, breadth ~86%, 85.6% weighted; G22 30–65 h, the full Lens target ~370–920 h; the scope's Windows and Linux row; the human steps); minor (the interface: 119 of 122 free rows, a log tab's text selected and copied a new row, the owner's WF36, D-99; weighted 84.8% unchanged); minor (the interface: 118 of 121 free rows, the window opening where it was closed a new row, D-95; weighted 84.8% unchanged); minor (v0.20.0 and v0.21.0 released in the night of 2026-10-16/17, their appcasts waiting for the owner's approval); minor (the platform row: v0.13.0 to v0.19.0 with files, the signed feed and the first update, 2026-10-16); minor (the interface row Lens Metrics not a target, Cogpit Metrics withdrawn by the owner 2026-10-16, D-61: 117 of 120 free rows, weighted breadth 84.8%; G12 2–7 h, the hours within their rounding); minor (Platforms: v0.14.0 and v0.15.0 notarized with their disk images on 2026-10-16); minor (hours recounted after the night run of 2026-10-15/16: alpha ~50–205, beta ~220–600, free parity ~220–620, the full Lens target ~380–940 agent-hours); minor (Foundation 3–15 h, was 7–23: G3's discovery cache on disk and memory per kind built 2026-10-16; totals not recounted); minor (the foundation row and How to re-measure: the generated checklist page, `make scorecard` and the envtest tier built 2026-10-16; no number moves); minor (the interface row Lens Metrics partial, Cogpit Metrics, G12, D-61: 118 of 121 free rows, weighted breadth 84.8%; G12 3–10 h, beta ~235–640, full parity ~240–655, the full Lens target ~395–980 h, 2026-10-16 night); minor (the Essentials user's standby and lost connections built 2026-10-16, D-58; numbers not moved); minor (Resource actions 42 / 42: the Secrets row names the drawer's Save, secret.saveData, D-59; breadth not moved); minor (beyond Lens ~2–8 h: G21 2–6 h, the owner's audit answers for the chat built in the night run); minor (AGENTS.md rule 10: checked against the code and gaps.md at HEAD; the remaining hours re-estimated from gaps.md's entries of 2026-10-15 (the lead's estimate, PhotoCraft's calibration): alpha ~65–240 h, beta ~240–650 h, free parity ~240–665 h, the full Lens target ~400–990 h, beyond Lens ~6–20 h, every dimension's hours, the audiences' hours and the feature areas' share of G6 and G7; the evidence text of the readiness, audience and area tables brought to what is built; 10 counted rows done, not 9; the human prerequisites current; verifying the cloud credential plugins out of scope until long after parity (owner, 2026-10-15); the readiness percentages and the ×0.7 discounts not changed, a decision pending with the owner); minor (Feature breadth's opening sentence brought to the table's 84.6% (it still said ~57% of 2026-10-12); beyond Lens ~3–12 h as G21's entry and ROADMAP say; no number re-measured); minor (Resource actions 41 / 41: the Config Maps row names the drawer's Save, `configMap.saveData`, the owner's F3; breadth not moved); minor (Sparkle 2 and the signed appcast built, no update key yet, D-4: interface 114 of 120, platforms and packages 6 of 13, weighted 84.2%, breadth ~84%); minor (paid features 3 of 11 with the Flux CD and Argo CD sections, partial: weighted 82.4%, breadth ~82%; the node shell and Cluster Settings › Node Shell partial: actions 39 of 39, interface 113 of 120, weighted 80.6%, breadth ~81%; Create Secret partial: actions 38 of 39; G12: the cluster's Prometheus setting, partial: interface 56 of 120, breadth ~57%; earlier: fourth measurement, by `make parity`: breadth ~56%, ready ~26%; beyond Lens re-estimated at ~20–42 h after the built-in agent's engine side) · **Target:** Lens Desktop 2026.10.51501 The authoritative answer to "how close is Cogpit to Lens, and how much work is left". The one-page summary is [`ROADMAP.md`](../../ROADMAP.md); the ranked work list is @@ -120,7 +120,7 @@ conservative value of every row gives 42%, the optimistic 52%. | Resource views and actions in depth | 28% | 45% (was 29%) | 18–91 | 64 of 64 views (one done) and 42 of 42 actions, the rest partial (`make parity`; 55 of 64 and 29 of 39 on 2026-10-12); every kind's cells checked by agents against the API server's own tables on the staging cluster (D-62, 2026-10-16); walked by the owner on real clusters 2026-10-17 to 2026-10-22: Pods, Deployments, Nodes, Services, Config Maps, Secrets, Namespaces and Helm releases, and the gate's actions (scale, restart, delete, cordon, drain, uncordon); the rarer views (Device Resources, the Gateway API's generic views, access control, storage) checked by agents or on kind only; most texts and rules inferred, not checked against a capture | [resource-parity](resource-parity.md), G6, G7 | | Interface fidelity and feel | 15% | 45% (was 23%) | 42–148 | 119 of 122 free rows (8 done; 54 of 120 on 2026-10-12); about half of them seen by the owner in a real window in his walks (WF1–WF45, GW1–GW14, AW1–AW19), the rest offscreen only; Cogpit's own title bar in his daily use since 2026-10-16; Dark Cockpit (D-110, 2026-10-21) leaves Lens's look by the owner's choice; open from the alpha walk (G16): Escape and the focus of new dock tabs inconsistent (AW2–AW5, AW8, AW19), ⌘F in the Edit tab after about 3 s (AW6), a click below the rows after about 1 s (AW12) | [ui-parity](ui-parity.md), G5, G9, G13 | | Cluster connectivity and authentication | 15% | 55% (was 28%) | 8–26 | 7 of 10 rows partial (4 of 13 on 2026-10-12); the hang after sleep fixed (D-58) and checked by the owner after real sleeps (2026-10-19; the log's resume re-walked 2026-10-22); walked on real clusters: kubeconfig files and a synced folder, client certificates expiring and expired (D-75), the owner's Pinniped credential plugins, several clusters at once (D-69), Reconnect and Log in again (D-81), a login that waits, cancellable and bounded (D-73), a connect going on in the background and a failed one staying (D-97, re-walked 2026-10-22); open: connect outcomes as error toasts and a failed connect's page (AW15–AW17, D-114) | [platform-parity](platform-parity.md#cluster-authentication-and-connectivity), G2 | -| Logs, terminal, shells, port forwarding | 10% | 65% (was 47%) | 9–31 | walked by the owner on the staging cluster: a followed log, a previous container's log (the gate walk), its download, its resume after a real sleep (re-walked 2026-10-22), its text selected and copied (D-99); a pod shell opened again after a reconnect; kubectl in a cluster terminal (the gate walk), its pasting and keys re-walked 2026-10-22 (GW7, GW8); a Service's port forwarded into the browser (the gate walk); debug containers checked by agents on the staging cluster only (D-102); open: a new terminal tab without the keyboard focus (AW8), Follow switched by scrolling (AW14, D-114) | [ui-parity](ui-parity.md#logs), G8, G10 | +| Logs, terminal, shells, port forwarding | 10% | 65% (was 47%) | 9–31 | walked by the owner on the staging cluster: a followed log, a previous container's log (the gate walk), its download, its resume after a real sleep (re-walked 2026-10-22), its text selected and copied (D-99); a pod shell opened again after a reconnect; kubectl in a cluster terminal (the gate walk), its pasting and keys re-walked 2026-10-22 (GW7, GW8); a Service's port forwarded into the browser (the gate walk); debug containers checked by agents on the staging cluster only (D-102); open: a new terminal tab without the keyboard focus (AW8); Follow switched by scrolling built 2026-10-22 on a branch, not walked yet (AW14, D-99) | [ui-parity](ui-parity.md#logs), G8, G10 | | Performance and API load | 10% | 40% (was 25%) | 28–66 | `make scorecard` (2026-10-16): 13 of 16 budgets measured, all met, offscreen against fakes (P3, P6, P7 not measured there); fast scrolling of the Pods list at 10,000 px/s from 6.3 to 60.3 frames per second (D-103, Fyne's thread check off in releases since v0.30.0), "Deutlich besseres Ansprechverhalten" (the owner, 2026-10-20); no comparison with Lens, no real cluster's round trips; Fyne draws at 60 Hz on 120 Hz displays; open: ⌘F after about 3 s (AW6), a click below the rows after about 1 s (AW12) | [testing](../developer/testing.md#performance-budgets-proposed-not-measured), G15 | | Stability | 10% | 30% (was 11%) | 100–200 | the owner on real clusters 2026-10-17 to 2026-10-22 (the staging cluster, his own Pinniped clusters): 78 findings in his walks (WF1–WF45, GW1–GW14, AW1–AW19), none blocking a workflow; the gate passed and every fix touching it re-walked; against it: a crash on a tooltip's hover (GW14, 2026-10-20), two real defects found in his use on 2026-10-22 (a narrowed list drew no row; a view kept "Loading…" after an expired login; both fixed, not seen in a real window yet), one tester, Fyne's thread check off in releases (D-103); race-clean tests and CI on every push | [gaps](gaps.md#g16-stability-and-the-user-bug-backlog), G16 | | Helm releases and metrics | 5% | 55% (was 25%) | 3–12 | walked by the owner in the gate walk on the staging cluster: a release's values, an upgrade from the Helm Upgrade tab, a rollback, the cluster's history agreeing; the rollback's dropdown and ⌘F re-walked 2026-10-22; install and uninstall checked by agents there only (`TestRealHelm`); metrics from the Metrics Server and Prometheus, Thanos or VictoriaMetrics, their sources, charts and a node's disks walked on the staging cluster (2026-10-18, 2026-10-19) | G11, G12 | @@ -279,6 +279,7 @@ integrations are not a target (owner, 2026-10-22: won't build). | Date | Change | Summary | |---|---|---| +| 2026-10-22 | trivial | Logs, terminal, shells, port forwarding: Follow switched by scrolling built on a branch (AW14, D-99), not walked yet; no estimate moves | | 2026-10-22 | minor | Stage: alpha, declared by the owner 2026-10-22 ("Ja, dann sind wir jetzt Alpha") after the gate's re-walk and the readiness recount; the stage texts brought to it | | 2026-10-22 | minor | The cloud providers' credential plugins and cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): the EKS, GKE and AKS plugin rows of the platform checklist not a target, authentication 7 of 10 (was 7 of 13), 70.0%; the paid features 3 of 10 (was 3 of 11), 30.0%, the cloud account integrations out of the premium list's count (D-9), and the readiness row Paid-plan integrations 3 of 10; weighted breadth 87.8% (was 86.0%), breadth ~88%; the interface's paid rows Preferences › Integrations and the navigator's cloud sections not a target (8 of 10 paid rows); the cloud-plugin discount ×0.7 removed: mainstream practitioner ~59% (was ~42%), essentials user ~69% (was ~48%); ready for real work ~47% and the full Lens target ~31% unchanged; the scope table, the connectivity row's evidence and the human steps | | 2026-10-22 | minor | Readiness re-estimated by the lead after the owner's re-walk of the gate (2026-10-22), by counting the gate and the checklists; estimated, open to revision (D-74). Ready for real work ~47% (range 42–52; was ~26%): resource views and actions 45%, interface 45%, connectivity 55%, logs and terminal 65%, performance 40%, stability 30%, Helm and metrics 55%, platforms (macOS) 60%, paid integrations 10%, a row walked by a person counting above one tested on kind or offscreen, inferred texts below captured ones. Mainstream practitioner ~42% (was ~25%): depth ~70%, the stability discount ×0.85 (was ×0.7, the lead's re-assessment after the walks), the cloud-plugin discount ×0.7 kept, its removal the owner's pending decision (~59% without it). Essentials user ~48% (was ~34%): depth ~81%, ~69% without the cloud-plugin discount. Full Lens target ~31% (was ~17%; the ratio of 2026-10-12 applied). The Interface, Connectivity and Helm rows' hours brought to the gap entries (42–148, 8–26, 3–12; the total 358–900 already was their sum). The stage stays pre-alpha: the gate passed and ~47% is inside the ~40–75% band, so alpha is declared on the owner's word | diff --git a/docs/parity/ui-parity.md b/docs/parity/ui-parity.md index a3c6ef7d4..2931ea182 100644 --- a/docs/parity/ui-parity.md +++ b/docs/parity/ui-parity.md @@ -1,6 +1,6 @@ # UI parity: layout, navigation, tables, dock and feel -> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** minor (Dock, Edit tab, Search in the tab and Terminal session: a dock tab the user opens takes the keys, the find bar's first ⌘F at once, the owner's AW5, AW6 and AW8, D-115; no status moves); minor (the cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): Preferences' Integrations with AWS EKS, Azure AKS and Google GKE and the navigator's cloud sections, two paid rows, from missing to not a target, 127 of 132 rows, 8 of 10 paid rows; the navigator rows' notes on the cloud sections; the summary); minor (Dock › "New tab" menu done → partial: the menu is gone at the owner's request, a terminal chip after the tabs opens a terminal, the create chip creates); patch (Layout › Title bar, Preferences › Terminal and Update channel on Windows, D-111: the Update button's one click, PowerShell on ConPTY, the shell field's placeholder; no status moves); patch (Tables › Resize columns: the warning column a fixed width, the owner's of 2026-10-21; no status moves); patch (Layout › Title bar and Application menu: on Windows and Linux the menus' titles in the top bar, D-109; no status moves); patch (Layout › Title bar: the light and dark toggle; Welcome page: the kubeconfig file only for shared names); patch (Layout › Title bar and Status bar: the title bar names no cluster, no dot and no kubeconfig file, the status bar and the navigator do, the owner's request of 2026-10-21, D-54; no status moves); patch (Layout › Title bar's Update button, Help › Check for Updates… and Preferences › Update channel on Linux: apt, Restart to Update, D-108; no status moves); patch (Clusters › Drill into: the tree slides in and out, vertically between clusters, D-107; Hotbar › Reorder: Reduce motion Cogpit's preference too; no status moves); minor (Layout › Tab bar: no tab of a cluster without a connection, the owner's GW13 of 2026-10-20); minor (Layout › Tab bar, Clusters › Drill into: the tab bar shows the shown cluster's tabs at the section too, the owner's GW11 of 2026-10-20; no status moves); trivial (Layout › Tab bar and Dock: tabs moved by dragging, `ui.tab.move` and `dock.move`, Move Tab Left and Right, the owner's GW4, D-106; no status moves); trivial (Tables › Namespace filter: a deleted or terminating namespace red in the list and the button red, the owner's GW9, D-106; every namespace read, not the first 100; no status moves); trivial (Keyboard shortcuts › Search in the tab and Editor › Edit tab: ⌘F opens a dock editor tab's find bar, the Edit tab has one, the owner's GW3, D-106; no status moves); trivial (Tables › Select rows: a click below a list's rows closes the drawer, the checked rows stay, the owner's GW1, D-106; no status moves); patch (Title bar: the alerts pill green "0" without alerts, grey "warn" while none answers, the owner's look of 2026-10-20; no status moves); trivial (Tables › Select rows: ⌘ and ⇧ from the click's own mouse event, the owner's clicks that only toggled, G16; no status moves); trivial (Cluster settings: General's name and icon and Metrics' source the user's alone for agents, the owner's decisions on H-125 and H-126; no status moves); minor (Logs: a new row, the lines' text selected and copied, partial, the owner's WF36, D-99; a search's matches in the find colour; Appearance › Notifications in the title bar: a toast's and a notification's text selectable with a copy icon, WF41; 127 of 134 rows, 119 of 122 free rows); minor (Metrics charts in drawers and Cluster overview: the source row centred, the owner's correction of 2026-10-18 evening; no status moved); minor (Layout: the window opens where it was closed, a new free row, partial, the owner's WF11, D-95: 126 of 133 rows, 118 of 121 free rows); minor (Cluster overview and charts and Metrics charts in drawers: one path per series with round joins (WF23, D-89), a node's disks as a bar per filesystem (WF26, D-90); no status moved); minor (Layout › Navigator header: the cluster's Kubernetes version on the root's third line, the owner's WF30, D-91, and a gear before the root's dot to the cluster's Settings, WF29, D-92, Cogpit's own; no status moved); minor (Cluster settings and Cluster overview and charts: the integrations as sections, the kubeconfig's path selectable, the metrics' source row, D-87 and D-88; no count moves); minor (Clusters › Navigator header: ‹ All Clusters across the whole row, the owner's WF27, D-93; no status moved); minor (Editor and create resource › Edit tab: the YAML in the Kubernetes order, the owner's WF15, D-86; no status moved); minor (Tables › Export as CSV: the file named by the cluster's short name, the owner's WF19, D-85; no status moved); minor (Layout › Tab bar: no filter crosses to another cluster, the owner's WF20 of 2026-10-18, fixed; no status moved); minor (Cluster settings: the question's pre-choice and Ask again, D-82, Cogpit's own; no count moves); minor (Hotbar: one hotbar, the owner's WF7 of 2026-10-17, D-83: the banks' row and the palette's bank commands not a target, a deliberate deviation; the drag carries the tile, WF6; 125 of 132 rows, 8 of the 12 paid); minor (Editor and create resource › Edit tab and Diff view: ⌘Z, ⇧⌘Z and ⌘Y in the YAML editor, ⌘Z after a Revert as Undo Revert, the owner's WF9 of 2026-10-17, D-84; no status moved); minor (Editor and create resource › Edit tab: a selection dragged out of the YAML editor keeps the keyboard, the owner's WF8 of 2026-10-17, fixed; no status moved); minor (Layout › Welcome page: the checkbox of Restore the last session, WF1); minor (Status bar: "Not connected" in both bars, the owner's walk WF2); minor (Clusters › Cluster menu: Reconnect beside Disconnect, the owner's F29 of 2026-10-17, D-81, Cogpit's own; no count moves); minor (Layout's tab bar, Clusters' cluster identity and Dock's tab icons: a cluster's uploaded image on its tabs, the owner's F25; Cluster settings › General: copy icons by the name and the kubeconfig's path, F27, and the cluster's accent colour, F26, D-80; no status moved); minor (Tables › the warning column and Detail drawer › sections: the Kyverno integration's mark and its "Policy violations" sections, Cogpit's own, D-79; no status or count moves); minor (Title bar and Notifications in the title bar: the alerts pill has its source since 2026-10-17, the cluster's Alertmanager, and opens the alert board, Cogpit's own (beyond Lens › Alerts, D-77); no row or count moves); minor (Cluster settings: Cogpit's own Integrations section and the question at a new cluster's first connect named in the introduction, rows of beyond-lens; the Metrics provider row's Metrics source kept as the two metrics integrations' switches, D-76, the owner's words of 2026-10-17; no status or count moves); minor (Clusters › Navigator sections: a context's client certificate, the time left or "expired", in the section's rows, the welcome page's and the hotbar tile's tooltip, Cogpit's own, D-75, the owner's F22 of 2026-10-17; no status or count moves); minor (Tables › Namespace filter, the owner's F21 of 2026-10-17, built: a search field on top of the list that has the keyboard at once, typing narrows the namespaces, a click on a name filters to it alone and closes the list, a click on a box adds or removes it; the lead's decisions in the row; no status moved); minor (Clusters › Cluster menu: Cancel Connecting in Disconnect's place while a cluster connects, and on the connecting workspace with the login it waits for, D-73, the owner's finding of 2026-10-16 night, built; no status moved); minor (Kubeconfig Syncs, the icon, the CSV, the Create tab's save, Download logs, the kubectl and terminal folders: the system's panels on macOS, D-72; no status moved); minor (Cluster overview and charts, G12, night run 2026-10-16/17: the area under every chart's series filled; each of the five rows says what keeps it partial; no status moved); minor (Cluster settings › Hide metrics from the UI, G12, night run 2026-10-16/17: a drawer showing only the network or the filesystem asks for no CPU and memory; no status moved); minor (Cluster settings › Metrics provider, G12, D-71, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and named so; no status moved); minor (Cluster overview and charts, G12, night run 2026-10-16/17: the source line's Prometheus namespace and service as links; no status moved); minor (Cluster settings › Metrics provider, G12, night run 2026-10-16/17: the Prometheus setting's fields on the page, the dialog gone; no status moved); minor (Title bar and Notifications: the right end reordered, the toggles at the very right, an alerts pill prepared, the owner's of 2026-10-16 night; no status moves); minor (Layout › Title bar: the version beside the wordmark about 30% smaller, on its baseline, the owner's of 2026-10-16 night); minor (Welcome page: without its "Connect to Cluster…" button, the workspace's kept, the owner's answer of 2026-10-16 evening (N122), built 2026-10-16 night; no status moved); minor (Tables › Select rows and Actions menu per row: a lone checked row's menu ends with Clear Selection after a separator, the owner's answer of 2026-10-16 evening (N112), built 2026-10-16 night; no status moved); minor (Welcome page and Tables › Select rows: the owner's answers of 2026-10-16 evening (the welcome page without its "Connect to Cluster…" button, the workspace's kept; a lone checked row's menu gains Clear Selection); not built yet); minor (Tables › Select rows: the selection bar's greyed Delete names the reason in its tooltip, the owner's decision in the audit of 2026-10-16, D-58; no status moved); minor (Command palette › ⌘⇧P opens it: every cluster and kubeconfig command under the category Cluster, the owner's decision in the audit of 2026-10-16, N121; no status moved); minor (Tables › Select rows and Layout › Tab bar: each view keeps its checked rows, per tab and cluster, the owner's decision in the audit of 2026-10-16, N111, built the same day; no status moved); minor (Welcome page, Navigator sections, Select rows: the owner's audit of the night decisions (2026-10-16) recorded, D-57's tooltip lines confirmed, the welcome page's button and a lone checked row's menu to be changed, the greyed Delete's tooltip to name the reason, not built; no status moved); minor (Cluster settings: Lens Metrics partial → not a target, Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61; the General row's page list; 127 of 134 rows, 117 of the 120 free rows, 8 not a target); minor (Tab bar: the tabs of the last run come back only with the preference Restore the last session on, D-69 item 8, 2026-10-16; no status moved); minor (Hotbar, Navigator sections, Tab bar, Status bar, Bottom dock: the window with several connected clusters, D-69 stage 2, built 2026-10-16: the marks on every dot, switching without reconnecting, a tab muted only without a connection, the dock per cluster); minor (Tab bar: several clusters connected at once, the engine part built 2026-10-16, D-69 stage 1: a tab of another connected cluster shows it from its cache; the window's marks and the dock per cluster not built); minor (Navigator header and Tab bar, the owner's F17, D-68: one short name for a cluster everywhere, the root row's user from a SelfSubjectReview with its groups in a tooltip, the kubeconfig fallback marked, the last known user dimmed; Cogpit's own, no status or count moves); minor (Kubeconfig Syncs: the connection log, Cogpit's own additions of D-66 marked, 2026-10-16: the dialog for every context, every attempt on disk with its steps, live, Copy; a failed plugin's standard error scrubbed; no count moves); minor (Status bar, navigator rows and hotbar tiles: the connection as a dot, never a word, Connected in the Running green, blinking while reconnecting, a click opening the connection log, the owner's F13 2026-10-16, Cogpit's own; no count moves); minor (Layout › Title bar: the build's version right of the wordmark, Cogpit's own, F12 2026-10-16; no count moves); trivial (Welcome page and Navigator sections: `--demo` and the demo cluster a development build's only, releases have none, D-67); minor (the Update button's and the update rows' text: the first update through the signed feed, 2026-10-16); minor (Layout › Title bar: the Update button says "Update to v" and sits on the bar's centre line, the line under the bar directly under it, F11 2026-10-16; no count moves); minor (Dock: a drain's job tab with a step per pod and the budget's wait, D-63; no count moves); minor (Cluster settings: Lens Metrics missing → partial, Cluster Settings › Cogpit Metrics (D-61), and the page list naming it; the Metrics provider row's query format, empty-container filter and HTTPS built; the drawer charts row: a node's Network and Filesystem from node-exporter, G12, 2026-10-16 night); minor (Dock: a job tab with its progress and Cancel, every action on a selection of more than ten objects in one, G4, D-63, 2026-10-16; no count moves); minor (the status bar's connection states of D-58, no count moves); minor (Tables: the selection bar takes the item count's and CSV button's place, Delete and Clear as icons; no count moves); minor (D-57 built: choosing a cluster in the navigator's section only; the header's dropdown deviates from Lens by the owner's decision; no count moves); minor (Tables: the selection bar from one checked row and `ui.navigate` leaving the checked rows alone, the owner's audit answers (7) and (8) of 2026-10-15, built; no count moves); minor (every row checked for its current state, AGENTS.md rule 10: the owner's decisions of 2026-10-14 evening that the night run built no longer "not built" (Actions menu's Restart on a selection, the terminal's kubectl hand-over for bash and fish and its enforcement, `HELM_DRIVER`'s release in both drivers, `cluster.setPrometheus` asking agents, the Overview waiting for the access reviews, Sync with computer the default, a deep link's ask before another cluster); D-41, D-42 and the owner's 2026-10-15 answers on D-47 and D-51 no longer "for the owner to confirm", the navigator's scope dropdown to go (not built); Ask AI from missing to partial, ⌘I opening Cogpit's agent chat now that the agent is built, 127 of 135 rows, 10 of the 14 paid rows, the free rows unchanged at 117 of 121; the non-cluster proxy's traffic, the releases' update key, the cluster settings page over the tab bar, a definition's link, links to Secrets, the hotbar's bank removal by agents and the title bar seen in a real window as the code has them); minor (the Update button and Preferences › App's update rows: the owner's update key in the releases since v0.11.0, no signed appcast served yet; no count moves); minor (Terminal and shells: a row for scrolling back through a terminal's earlier output, done, D-56; the counts follow the new row); minor (Detail drawer: names without spaces wrap at - . _ / within the name column, data keys above their values, the owner's F3, D-53; no count moves); minor (Layout and Dock, the owner's finding F7: the title bar's Update button built, while Sparkle holds an update; the navigator hidden with ⌘B; the dock's collapse as engine state, ⌘J; the layout toggles themselves counted in beyond Lens; no count moves); minor (Status bar: the MCP item's gear and the MCP details, the top bar's MCP button gone, F6; Help › Copy MCP command opens the details; no count moves); minor (Drawer actions: Copy right after the object's name (F4); no count moves); minor (Notifications: a copy's confirmation not recorded (F5); no count moves); minor (Hotbar and Several windows: R3 postponed by the owner; no count moves); minor (Hotbar › Reorder tiles by dragging them partial: R2 built, a tile dropped into the gap between two tiles moves through `hotbar.moveCluster`, the lead's decisions for the owner to confirm; 125 of 134 rows, 9 of the 14 paid rows, the free rows unchanged at 116 of 120); minor (Tables: A73 built, a plain click keeps the checked rows; A69, the lists' copy icon over the cell's end; Detail drawer: A71, Forward… right after the port; no count moves); minor (Application menu and Help: About Cogpit in macOS's application menu, Cogpit's own dialog laid out anew with the version the build reports, decision A60 and finding F2 built; no count moves); minor (the owner's decision round of 2026-10-14 evening: about fifty rows note what the owner confirmed and what he decided, not built (navigator, tab bar, hotbar, menus, tables, logs, terminal, Preferences, Cluster settings, the Overview, the drawers' charts, deep links, notifications); his findings in a real window in Metrics charts in detail drawers (no node history from Prometheus) and Application menu (About shows 0.0.1); Hotbar: a paid row for reordering tiles by dragging, missing, 124 of 134 rows, the free rows unchanged at 116 of 120); minor (Status bar: the count of table snapshots removed, shown in the Diagnostics tab only, owner, no count moves); minor (Preferences › Update channel partial: Stable only, with Check for updates automatically beside it, D-4, 114 of 120 free rows; Help › Check for Updates…, no count moves); minor (; Appearance and application › Deep links partial, macOS only, D-47, a free row from missing to partial, the summary's numbers left to the lead's recount; Preferences › Start at login partial, macOS only, D-48, a free row from missing to partial, the summary's numbers left to the lead's recount; Tables, the namespace filter's row: Cogpit's status filter beside it, beyond Lens (owner, D-34), no count moves; Cluster settings › Node shell: the default image the newest supported Alpine release kept current by Renovate, and Maximum duration, owner, D-37, D-38, no count moves; Status bar: 30 points high, its items centred by their letters, owner; Cluster settings › Metrics provider: the Metrics source dropdown built, G12, no count moves; Cluster overview: the Pods chart's history from kube-state-metrics through Prometheus, G12, no count moves; Metrics charts in drawers: a closed drawer's chart kept for the next, G12, no count moves; Cluster settings › Hide metrics from the UI: the Nodes list's Disk hidden with the nodes or the filesystem, G12, D-43, no count moves; Detail drawer: a name wider than its column wraps, no count moves; Dock: a context that leaves Cogpit takes its dock tabs, a node shell's pod deleted, an editor's unsaved text kept as a draft, no count moves; Layout › Welcome page: no context picker by itself at start (D-42), no count moves; Layout › Tab bar: the tabs kept across a restart (D-41), shown without connecting, the tabs of a vanished kubeconfig file closing with a notice; Tables › Sort by a column header: a workload drawer's Pods table sorts as a node's (D-40), a sortable drawer table at most 500 rows, no count moves; Cluster sidebar: the Argo CD group (paid, G23) after Flux CD, inferred, no count moves; Cluster sidebar: the Flux section, its Dashboard and sub-groups as captured, left out without Flux, G23, no count moves; Dock › Pod shell, attach and node shell: the node shell too; Cluster settings › Node shell partial, the page as captured, 113 of 120 free rows; Editor › Dialogs instead of YAML: the Secret's too, eight of eight, no count moves; Tables › Sort by a column header: a node drawer's Pods table sorts too, owner, G12, no count moves; the charts' bytes in binary units with one decimal, D-32: the drawers' charts and the cluster Overview's Memory, no count moves; Preferences › Locale timezone, Logs › Show timestamps, Download logs and Jump to a time: every timestamp in the zone and the region's format, D-31, no count moves; Title bar: the window buttons centred in Cogpit's bar (owner); Tables › tooltip of a cut-off cell: the lists' copy icon now sits after the text and is absent from blacklisted columns (D-25), no count moves; Preferences › Helm repositories: Helm's repositories.yaml as the source built, the dialog read-only, D-29, G11; Tables › tooltip of a cut-off cell: the copy icon of the lists (beyond Lens, D-25) shortens the hovered cell's text, which then has the tooltip too, no count moves; Cluster menu: a removed cluster's tabs close, no count moves; Cluster menu: Disconnect follows a reconnect, no count moves; Help › Audit Log and Diagnostics named, the welcome page not over the dock; Editor and create resource: the Create resource tab's save and search buttons, the diff view's Revert to Original with an undo, the Edit tab keeps drafts of unsaved text, G9, no count moves; Editor and create resource: the diff view's Revert to Original with an undo, the Edit tab keeps drafts of unsaved text, G9, no count moves; Editor and create resource: the Edit tab keeps drafts of unsaved text, G9, no count moves; Cluster settings, G3 and G13: Accessible namespaces from missing to partial, the page list with Namespaces; Preferences, G11: `HELM_DRIVER` partial, secret and configmap, sql missing with the reason; Preferences › kubectl partial, D-3; kubectl for terminals, D-3: the terminal row notes the check and the offer; Terminal and shells: copy and paste with the right mouse button partial (a preference, off by default), the Windows and Linux copy and paste keys updated, G8, the counts not redone; Tables › Search field with its "Aa" and ".*" toggles partial, G5, the counts not redone; Preferences, G13: HTTP proxy for non-cluster traffic partial, untrusted CAs not built with the reason; Cluster settings, G12 and G13: Proxy and Hide metrics from the UI partial; Cluster settings, G12 and G13: Hide metrics from the UI partial; the navigator's section level and scope, G5, G13: Navigator sections and Drill into a section or cluster from missing to partial, the Navigator header, Tab bar, Search clusters by name and Navigator keyboard rows updated, the counts not redone; the title bar, G5: its history arrows and context menu, Notifications in the title bar partial; column reorder by dragging partial, G5; row checkboxes and actions on a selection, G5, G7, G9: Tables › checkbox column partial, the actions menu row updated, the counts not redone; the welcome page, the Help and Window menus, Disconnect and Remove from Cogpit, G5, G13: the Welcome page, Window and Help › Welcome rows from missing to partial, the zoom and full screen row partial (full screen only), the Cluster menu row updated, the counts not redone; Logs, G8: the pod and container selectors, loading older lines and jumping to a time partial, timestamps carried by every stream; Logs, G8: the pod and container selectors and loading older lines partial, timestamps carried by every stream; Logs, G8: the pod and container selectors partial, timestamps carried by every stream; the tab bar of cluster views, G5, G13: its Layout row, the navigator keyboard's ⇧↵ and five shortcut rows partial, the counts not redone; Preferences and Cluster settings, G13: the two pages, their shortcuts, the application menu's Preferences, cluster identity, the theme, time zone, editor, tables and terminal preferences, the cluster's General and Terminal settings partial; the cluster Overview, G12: its four rows partial, 71 of 120 free rows; Cluster sidebar: Applications, the Device Resources group and the Vertical Pod Autoscalers' profile, G6; Cluster sidebar: the Device Resources group and the Vertical Pod Autoscalers' profile, G6; Cluster sidebar: the Device Resources group, G6; Helm › Charts, the Helm Install tab and the repositories dialog partial, G11; cluster settings › Metrics provider partial: the Prometheus setting, 56 of 120 free rows; drawer charts, G12 fourth slice: both providers together, a status line per provider, the variant held by the engine; the command palette, G13: its two free rows and five shortcut rows partial; the navigator, G5 and G13: its header row and its keyboard row partial; Cluster overview and charts: node history from node-exporter built in the night run (G12, F1, A43); drawer charts far apart get query sets of their own (A46); the Ask AI shortcut row: the agent chat's ⌘I built in the window, the row stays missing until the agent ships, no count moves; Notifications in the title bar: A18 and A19 marked built, its tests' names as they are, the built-in agent's private connection reading the list in full; Logs: Download saves what the tab shows, its filter applied, A84 built; the Jump to time field's cut placeholder fixed, #169; no count moves; Dock: a background job's tab, A91, no count moves; Logs: an application's logs in one merged tab with a Workload selector, A81, no count moves; Preferences › kubectl: the signature with sigstore-go and its Rekor entry, D-50 built; the owner's A51–A55, A61, A63, A64, A67 and A113 built 2026-10-15 in Layout, Clusters, Hotbar, Command palette and Keyboard shortcuts: the navigator's search and keyboard row and the palette's text as engine state, the ring on keyboard navigation only, the scope dropdown of the hotbar's clusters, collapsible source groups kept across restarts, Disconnect closing the cluster's tabs, F1–F12 in the search fields, ⌘F and ⌘⇧T as View menu items, the welcome page's Recent and two links; no status changes, no count moves; Cluster settings › Proxy: the plugin approval binds it, A23; Status bar: "TLS not checked", A29; Helm repositories: A36 built, repositories with a dot; Helm repositories: A14 built 2026-10-15, the dialog's mark "insecure TLS") · **Target:** Lens Desktop 2026.10.51501 +> **Last reviewed:** 2026-10-12 · **Last updated:** 2026-10-22 · **Change:** trivial (Logs › Follow: switched by scrolling, AW14, D-99); trivial (Tables › Namespace filter: read again on the engine's `EventNamespaces`, not on the view's rows, AW11, D-106); minor (Layout › Tab bar of cluster views and Dock › Bottom dock with tabs: ⌘⌥⇧← and ⌘⌥⇧→ move the dock's active tab while the keyboard works in the dock, the owner's AW10; Layout › Dock along the bottom: a tab a command shows again that was the active one opens the minimised dock, the owner's AW9; the rows stay partial); minor (Clusters › Cluster menu: Cancel Connecting and a connect left in the background raise no toast, the owner's AW15 and AW16 of 2026-10-22, D-97; no count moves); minor (Layout › Welcome page and Kubeconfig Syncs: a failed connect's error page with the connect's stages, also in Connection Updates, the welcome page without "Other clusters", the owner's AW17 and AW13, D-114); minor (Tables › Double-click a column separator: two clicks the table counts itself, so a click below the rows is not held, the owner's AW12, D-106; no status moves); minor (Escape closes the innermost thing, the owner's AW3 and AW4, D-116: Tables › Keyboard, Editor and create resource › Dialogs, Keyboard shortcuts › Search in the tab, no status changes); minor (Dock, Edit tab, Search in the tab and Terminal session: a dock tab the user opens takes the keys, the find bar's first ⌘F at once, the owner's AW5, AW6 and AW8, D-115; no status moves); minor (the cloud account integrations not a target (owner, 2026-10-22: won't build, D-9): Preferences' Integrations with AWS EKS, Azure AKS and Google GKE and the navigator's cloud sections, two paid rows, from missing to not a target, 127 of 132 rows, 8 of 10 paid rows; the navigator rows' notes on the cloud sections; the summary); minor (Dock › "New tab" menu done → partial: the menu is gone at the owner's request, a terminal chip after the tabs opens a terminal, the create chip creates); patch (Layout › Title bar, Preferences › Terminal and Update channel on Windows, D-111: the Update button's one click, PowerShell on ConPTY, the shell field's placeholder; no status moves); patch (Tables › Resize columns: the warning column a fixed width, the owner's of 2026-10-21; no status moves); patch (Layout › Title bar and Application menu: on Windows and Linux the menus' titles in the top bar, D-109; no status moves); patch (Layout › Title bar: the light and dark toggle; Welcome page: the kubeconfig file only for shared names); patch (Layout › Title bar and Status bar: the title bar names no cluster, no dot and no kubeconfig file, the status bar and the navigator do, the owner's request of 2026-10-21, D-54; no status moves); patch (Layout › Title bar's Update button, Help › Check for Updates… and Preferences › Update channel on Linux: apt, Restart to Update, D-108; no status moves); patch (Clusters › Drill into: the tree slides in and out, vertically between clusters, D-107; Hotbar › Reorder: Reduce motion Cogpit's preference too; no status moves); minor (Layout › Tab bar: no tab of a cluster without a connection, the owner's GW13 of 2026-10-20); minor (Layout › Tab bar, Clusters › Drill into: the tab bar shows the shown cluster's tabs at the section too, the owner's GW11 of 2026-10-20; no status moves); trivial (Layout › Tab bar and Dock: tabs moved by dragging, `ui.tab.move` and `dock.move`, Move Tab Left and Right, the owner's GW4, D-106; no status moves); trivial (Tables › Namespace filter: a deleted or terminating namespace red in the list and the button red, the owner's GW9, D-106; every namespace read, not the first 100; no status moves); trivial (Keyboard shortcuts › Search in the tab and Editor › Edit tab: ⌘F opens a dock editor tab's find bar, the Edit tab has one, the owner's GW3, D-106; no status moves); trivial (Tables › Select rows: a click below a list's rows closes the drawer, the checked rows stay, the owner's GW1, D-106; no status moves); patch (Title bar: the alerts pill green "0" without alerts, grey "warn" while none answers, the owner's look of 2026-10-20; no status moves); trivial (Tables › Select rows: ⌘ and ⇧ from the click's own mouse event, the owner's clicks that only toggled, G16; no status moves); trivial (Cluster settings: General's name and icon and Metrics' source the user's alone for agents, the owner's decisions on H-125 and H-126; no status moves); minor (Logs: a new row, the lines' text selected and copied, partial, the owner's WF36, D-99; a search's matches in the find colour; Appearance › Notifications in the title bar: a toast's and a notification's text selectable with a copy icon, WF41; 127 of 134 rows, 119 of 122 free rows); minor (Metrics charts in drawers and Cluster overview: the source row centred, the owner's correction of 2026-10-18 evening; no status moved); minor (Layout: the window opens where it was closed, a new free row, partial, the owner's WF11, D-95: 126 of 133 rows, 118 of 121 free rows); minor (Cluster overview and charts and Metrics charts in drawers: one path per series with round joins (WF23, D-89), a node's disks as a bar per filesystem (WF26, D-90); no status moved); minor (Layout › Navigator header: the cluster's Kubernetes version on the root's third line, the owner's WF30, D-91, and a gear before the root's dot to the cluster's Settings, WF29, D-92, Cogpit's own; no status moved); minor (Cluster settings and Cluster overview and charts: the integrations as sections, the kubeconfig's path selectable, the metrics' source row, D-87 and D-88; no count moves); minor (Clusters › Navigator header: ‹ All Clusters across the whole row, the owner's WF27, D-93; no status moved); minor (Editor and create resource › Edit tab: the YAML in the Kubernetes order, the owner's WF15, D-86; no status moved); minor (Tables › Export as CSV: the file named by the cluster's short name, the owner's WF19, D-85; no status moved); minor (Layout › Tab bar: no filter crosses to another cluster, the owner's WF20 of 2026-10-18, fixed; no status moved); minor (Cluster settings: the question's pre-choice and Ask again, D-82, Cogpit's own; no count moves); minor (Hotbar: one hotbar, the owner's WF7 of 2026-10-17, D-83: the banks' row and the palette's bank commands not a target, a deliberate deviation; the drag carries the tile, WF6; 125 of 132 rows, 8 of the 12 paid); minor (Editor and create resource › Edit tab and Diff view: ⌘Z, ⇧⌘Z and ⌘Y in the YAML editor, ⌘Z after a Revert as Undo Revert, the owner's WF9 of 2026-10-17, D-84; no status moved); minor (Editor and create resource › Edit tab: a selection dragged out of the YAML editor keeps the keyboard, the owner's WF8 of 2026-10-17, fixed; no status moved); minor (Layout › Welcome page: the checkbox of Restore the last session, WF1); minor (Status bar: "Not connected" in both bars, the owner's walk WF2); minor (Clusters › Cluster menu: Reconnect beside Disconnect, the owner's F29 of 2026-10-17, D-81, Cogpit's own; no count moves); minor (Layout's tab bar, Clusters' cluster identity and Dock's tab icons: a cluster's uploaded image on its tabs, the owner's F25; Cluster settings › General: copy icons by the name and the kubeconfig's path, F27, and the cluster's accent colour, F26, D-80; no status moved); minor (Tables › the warning column and Detail drawer › sections: the Kyverno integration's mark and its "Policy violations" sections, Cogpit's own, D-79; no status or count moves); minor (Title bar and Notifications in the title bar: the alerts pill has its source since 2026-10-17, the cluster's Alertmanager, and opens the alert board, Cogpit's own (beyond Lens › Alerts, D-77); no row or count moves); minor (Cluster settings: Cogpit's own Integrations section and the question at a new cluster's first connect named in the introduction, rows of beyond-lens; the Metrics provider row's Metrics source kept as the two metrics integrations' switches, D-76, the owner's words of 2026-10-17; no status or count moves); minor (Clusters › Navigator sections: a context's client certificate, the time left or "expired", in the section's rows, the welcome page's and the hotbar tile's tooltip, Cogpit's own, D-75, the owner's F22 of 2026-10-17; no status or count moves); minor (Tables › Namespace filter, the owner's F21 of 2026-10-17, built: a search field on top of the list that has the keyboard at once, typing narrows the namespaces, a click on a name filters to it alone and closes the list, a click on a box adds or removes it; the lead's decisions in the row; no status moved); minor (Clusters › Cluster menu: Cancel Connecting in Disconnect's place while a cluster connects, and on the connecting workspace with the login it waits for, D-73, the owner's finding of 2026-10-16 night, built; no status moved); minor (Kubeconfig Syncs, the icon, the CSV, the Create tab's save, Download logs, the kubectl and terminal folders: the system's panels on macOS, D-72; no status moved); minor (Cluster overview and charts, G12, night run 2026-10-16/17: the area under every chart's series filled; each of the five rows says what keeps it partial; no status moved); minor (Cluster settings › Hide metrics from the UI, G12, night run 2026-10-16/17: a drawer showing only the network or the filesystem asks for no CPU and memory; no status moved); minor (Cluster settings › Metrics provider, G12, D-71, night run 2026-10-16/17: Thanos and VictoriaMetrics found by name and named so; no status moved); minor (Cluster overview and charts, G12, night run 2026-10-16/17: the source line's Prometheus namespace and service as links; no status moved); minor (Cluster settings › Metrics provider, G12, night run 2026-10-16/17: the Prometheus setting's fields on the page, the dialog gone; no status moved); minor (Title bar and Notifications: the right end reordered, the toggles at the very right, an alerts pill prepared, the owner's of 2026-10-16 night; no status moves); minor (Layout › Title bar: the version beside the wordmark about 30% smaller, on its baseline, the owner's of 2026-10-16 night); minor (Welcome page: without its "Connect to Cluster…" button, the workspace's kept, the owner's answer of 2026-10-16 evening (N122), built 2026-10-16 night; no status moved); minor (Tables › Select rows and Actions menu per row: a lone checked row's menu ends with Clear Selection after a separator, the owner's answer of 2026-10-16 evening (N112), built 2026-10-16 night; no status moved); minor (Welcome page and Tables › Select rows: the owner's answers of 2026-10-16 evening (the welcome page without its "Connect to Cluster…" button, the workspace's kept; a lone checked row's menu gains Clear Selection); not built yet); minor (Tables › Select rows: the selection bar's greyed Delete names the reason in its tooltip, the owner's decision in the audit of 2026-10-16, D-58; no status moved); minor (Command palette › ⌘⇧P opens it: every cluster and kubeconfig command under the category Cluster, the owner's decision in the audit of 2026-10-16, N121; no status moved); minor (Tables › Select rows and Layout › Tab bar: each view keeps its checked rows, per tab and cluster, the owner's decision in the audit of 2026-10-16, N111, built the same day; no status moved); minor (Welcome page, Navigator sections, Select rows: the owner's audit of the night decisions (2026-10-16) recorded, D-57's tooltip lines confirmed, the welcome page's button and a lone checked row's menu to be changed, the greyed Delete's tooltip to name the reason, not built; no status moved); minor (Cluster settings: Lens Metrics partial → not a target, Cogpit Metrics withdrawn by the owner 2026-10-16 and removed, D-61; the General row's page list; 127 of 134 rows, 117 of the 120 free rows, 8 not a target); minor (Tab bar: the tabs of the last run come back only with the preference Restore the last session on, D-69 item 8, 2026-10-16; no status moved); minor (Hotbar, Navigator sections, Tab bar, Status bar, Bottom dock: the window with several connected clusters, D-69 stage 2, built 2026-10-16: the marks on every dot, switching without reconnecting, a tab muted only without a connection, the dock per cluster); minor (Tab bar: several clusters connected at once, the engine part built 2026-10-16, D-69 stage 1: a tab of another connected cluster shows it from its cache; the window's marks and the dock per cluster not built); minor (Navigator header and Tab bar, the owner's F17, D-68: one short name for a cluster everywhere, the root row's user from a SelfSubjectReview with its groups in a tooltip, the kubeconfig fallback marked, the last known user dimmed; Cogpit's own, no status or count moves); minor (Kubeconfig Syncs: the connection log, Cogpit's own additions of D-66 marked, 2026-10-16: the dialog for every context, every attempt on disk with its steps, live, Copy; a failed plugin's standard error scrubbed; no count moves); minor (Status bar, navigator rows and hotbar tiles: the connection as a dot, never a word, Connected in the Running green, blinking while reconnecting, a click opening the connection log, the owner's F13 2026-10-16, Cogpit's own; no count moves); minor (Layout › Title bar: the build's version right of the wordmark, Cogpit's own, F12 2026-10-16; no count moves); trivial (Welcome page and Navigator sections: `--demo` and the demo cluster a development build's only, releases have none, D-67); minor (the Update button's and the update rows' text: the first update through the signed feed, 2026-10-16); minor (Layout › Title bar: the Update button says "Update to v" and sits on the bar's centre line, the line under the bar directly under it, F11 2026-10-16; no count moves); minor (Dock: a drain's job tab with a step per pod and the budget's wait, D-63; no count moves); minor (Cluster settings: Lens Metrics missing → partial, Cluster Settings › Cogpit Metrics (D-61), and the page list naming it; the Metrics provider row's query format, empty-container filter and HTTPS built; the drawer charts row: a node's Network and Filesystem from node-exporter, G12, 2026-10-16 night); minor (Dock: a job tab with its progress and Cancel, every action on a selection of more than ten objects in one, G4, D-63, 2026-10-16; no count moves); minor (the status bar's connection states of D-58, no count moves); minor (Tables: the selection bar takes the item count's and CSV button's place, Delete and Clear as icons; no count moves); minor (D-57 built: choosing a cluster in the navigator's section only; the header's dropdown deviates from Lens by the owner's decision; no count moves); minor (Tables: the selection bar from one checked row and `ui.navigate` leaving the checked rows alone, the owner's audit answers (7) and (8) of 2026-10-15, built; no count moves); minor (every row checked for its current state, AGENTS.md rule 10: the owner's decisions of 2026-10-14 evening that the night run built no longer "not built" (Actions menu's Restart on a selection, the terminal's kubectl hand-over for bash and fish and its enforcement, `HELM_DRIVER`'s release in both drivers, `cluster.setPrometheus` asking agents, the Overview waiting for the access reviews, Sync with computer the default, a deep link's ask before another cluster); D-41, D-42 and the owner's 2026-10-15 answers on D-47 and D-51 no longer "for the owner to confirm", the navigator's scope dropdown to go (not built); Ask AI from missing to partial, ⌘I opening Cogpit's agent chat now that the agent is built, 127 of 135 rows, 10 of the 14 paid rows, the free rows unchanged at 117 of 121; the non-cluster proxy's traffic, the releases' update key, the cluster settings page over the tab bar, a definition's link, links to Secrets, the hotbar's bank removal by agents and the title bar seen in a real window as the code has them); minor (the Update button and Preferences › App's update rows: the owner's update key in the releases since v0.11.0, no signed appcast served yet; no count moves); minor (Terminal and shells: a row for scrolling back through a terminal's earlier output, done, D-56; the counts follow the new row); minor (Detail drawer: names without spaces wrap at - . _ / within the name column, data keys above their values, the owner's F3, D-53; no count moves); minor (Layout and Dock, the owner's finding F7: the title bar's Update button built, while Sparkle holds an update; the navigator hidden with ⌘B; the dock's collapse as engine state, ⌘J; the layout toggles themselves counted in beyond Lens; no count moves); minor (Status bar: the MCP item's gear and the MCP details, the top bar's MCP button gone, F6; Help › Copy MCP command opens the details; no count moves); minor (Drawer actions: Copy right after the object's name (F4); no count moves); minor (Notifications: a copy's confirmation not recorded (F5); no count moves); minor (Hotbar and Several windows: R3 postponed by the owner; no count moves); minor (Hotbar › Reorder tiles by dragging them partial: R2 built, a tile dropped into the gap between two tiles moves through `hotbar.moveCluster`, the lead's decisions for the owner to confirm; 125 of 134 rows, 9 of the 14 paid rows, the free rows unchanged at 116 of 120); minor (Tables: A73 built, a plain click keeps the checked rows; A69, the lists' copy icon over the cell's end; Detail drawer: A71, Forward… right after the port; no count moves); minor (Application menu and Help: About Cogpit in macOS's application menu, Cogpit's own dialog laid out anew with the version the build reports, decision A60 and finding F2 built; no count moves); minor (the owner's decision round of 2026-10-14 evening: about fifty rows note what the owner confirmed and what he decided, not built (navigator, tab bar, hotbar, menus, tables, logs, terminal, Preferences, Cluster settings, the Overview, the drawers' charts, deep links, notifications); his findings in a real window in Metrics charts in detail drawers (no node history from Prometheus) and Application menu (About shows 0.0.1); Hotbar: a paid row for reordering tiles by dragging, missing, 124 of 134 rows, the free rows unchanged at 116 of 120); minor (Status bar: the count of table snapshots removed, shown in the Diagnostics tab only, owner, no count moves); minor (Preferences › Update channel partial: Stable only, with Check for updates automatically beside it, D-4, 114 of 120 free rows; Help › Check for Updates…, no count moves); minor (; Appearance and application › Deep links partial, macOS only, D-47, a free row from missing to partial, the summary's numbers left to the lead's recount; Preferences › Start at login partial, macOS only, D-48, a free row from missing to partial, the summary's numbers left to the lead's recount; Tables, the namespace filter's row: Cogpit's status filter beside it, beyond Lens (owner, D-34), no count moves; Cluster settings › Node shell: the default image the newest supported Alpine release kept current by Renovate, and Maximum duration, owner, D-37, D-38, no count moves; Status bar: 30 points high, its items centred by their letters, owner; Cluster settings › Metrics provider: the Metrics source dropdown built, G12, no count moves; Cluster overview: the Pods chart's history from kube-state-metrics through Prometheus, G12, no count moves; Metrics charts in drawers: a closed drawer's chart kept for the next, G12, no count moves; Cluster settings › Hide metrics from the UI: the Nodes list's Disk hidden with the nodes or the filesystem, G12, D-43, no count moves; Detail drawer: a name wider than its column wraps, no count moves; Dock: a context that leaves Cogpit takes its dock tabs, a node shell's pod deleted, an editor's unsaved text kept as a draft, no count moves; Layout › Welcome page: no context picker by itself at start (D-42), no count moves; Layout › Tab bar: the tabs kept across a restart (D-41), shown without connecting, the tabs of a vanished kubeconfig file closing with a notice; Tables › Sort by a column header: a workload drawer's Pods table sorts as a node's (D-40), a sortable drawer table at most 500 rows, no count moves; Cluster sidebar: the Argo CD group (paid, G23) after Flux CD, inferred, no count moves; Cluster sidebar: the Flux section, its Dashboard and sub-groups as captured, left out without Flux, G23, no count moves; Dock › Pod shell, attach and node shell: the node shell too; Cluster settings › Node shell partial, the page as captured, 113 of 120 free rows; Editor › Dialogs instead of YAML: the Secret's too, eight of eight, no count moves; Tables › Sort by a column header: a node drawer's Pods table sorts too, owner, G12, no count moves; the charts' bytes in binary units with one decimal, D-32: the drawers' charts and the cluster Overview's Memory, no count moves; Preferences › Locale timezone, Logs › Show timestamps, Download logs and Jump to a time: every timestamp in the zone and the region's format, D-31, no count moves; Title bar: the window buttons centred in Cogpit's bar (owner); Tables › tooltip of a cut-off cell: the lists' copy icon now sits after the text and is absent from blacklisted columns (D-25), no count moves; Preferences › Helm repositories: Helm's repositories.yaml as the source built, the dialog read-only, D-29, G11; Tables › tooltip of a cut-off cell: the copy icon of the lists (beyond Lens, D-25) shortens the hovered cell's text, which then has the tooltip too, no count moves; Cluster menu: a removed cluster's tabs close, no count moves; Cluster menu: Disconnect follows a reconnect, no count moves; Help › Audit Log and Diagnostics named, the welcome page not over the dock; Editor and create resource: the Create resource tab's save and search buttons, the diff view's Revert to Original with an undo, the Edit tab keeps drafts of unsaved text, G9, no count moves; Editor and create resource: the diff view's Revert to Original with an undo, the Edit tab keeps drafts of unsaved text, G9, no count moves; Editor and create resource: the Edit tab keeps drafts of unsaved text, G9, no count moves; Cluster settings, G3 and G13: Accessible namespaces from missing to partial, the page list with Namespaces; Preferences, G11: `HELM_DRIVER` partial, secret and configmap, sql missing with the reason; Preferences › kubectl partial, D-3; kubectl for terminals, D-3: the terminal row notes the check and the offer; Terminal and shells: copy and paste with the right mouse button partial (a preference, off by default), the Windows and Linux copy and paste keys updated, G8, the counts not redone; Tables › Search field with its "Aa" and ".*" toggles partial, G5, the counts not redone; Preferences, G13: HTTP proxy for non-cluster traffic partial, untrusted CAs not built with the reason; Cluster settings, G12 and G13: Proxy and Hide metrics from the UI partial; Cluster settings, G12 and G13: Hide metrics from the UI partial; the navigator's section level and scope, G5, G13: Navigator sections and Drill into a section or cluster from missing to partial, the Navigator header, Tab bar, Search clusters by name and Navigator keyboard rows updated, the counts not redone; the title bar, G5: its history arrows and context menu, Notifications in the title bar partial; column reorder by dragging partial, G5; row checkboxes and actions on a selection, G5, G7, G9: Tables › checkbox column partial, the actions menu row updated, the counts not redone; the welcome page, the Help and Window menus, Disconnect and Remove from Cogpit, G5, G13: the Welcome page, Window and Help › Welcome rows from missing to partial, the zoom and full screen row partial (full screen only), the Cluster menu row updated, the counts not redone; Logs, G8: the pod and container selectors, loading older lines and jumping to a time partial, timestamps carried by every stream; Logs, G8: the pod and container selectors and loading older lines partial, timestamps carried by every stream; Logs, G8: the pod and container selectors partial, timestamps carried by every stream; the tab bar of cluster views, G5, G13: its Layout row, the navigator keyboard's ⇧↵ and five shortcut rows partial, the counts not redone; Preferences and Cluster settings, G13: the two pages, their shortcuts, the application menu's Preferences, cluster identity, the theme, time zone, editor, tables and terminal preferences, the cluster's General and Terminal settings partial; the cluster Overview, G12: its four rows partial, 71 of 120 free rows; Cluster sidebar: Applications, the Device Resources group and the Vertical Pod Autoscalers' profile, G6; Cluster sidebar: the Device Resources group and the Vertical Pod Autoscalers' profile, G6; Cluster sidebar: the Device Resources group, G6; Helm › Charts, the Helm Install tab and the repositories dialog partial, G11; cluster settings › Metrics provider partial: the Prometheus setting, 56 of 120 free rows; drawer charts, G12 fourth slice: both providers together, a status line per provider, the variant held by the engine; the command palette, G13: its two free rows and five shortcut rows partial; the navigator, G5 and G13: its header row and its keyboard row partial; Cluster overview and charts: node history from node-exporter built in the night run (G12, F1, A43); drawer charts far apart get query sets of their own (A46); the Ask AI shortcut row: the agent chat's ⌘I built in the window, the row stays missing until the agent ships, no count moves; Notifications in the title bar: A18 and A19 marked built, its tests' names as they are, the built-in agent's private connection reading the list in full; Logs: Download saves what the tab shows, its filter applied, A84 built; the Jump to time field's cut placeholder fixed, #169; no count moves; Dock: a background job's tab, A91, no count moves; Logs: an application's logs in one merged tab with a Workload selector, A81, no count moves; Preferences › kubectl: the signature with sigstore-go and its Rekor entry, D-50 built; the owner's A51–A55, A61, A63, A64, A67 and A113 built 2026-10-15 in Layout, Clusters, Hotbar, Command palette and Keyboard shortcuts: the navigator's search and keyboard row and the palette's text as engine state, the ring on keyboard navigation only, the scope dropdown of the hotbar's clusters, collapsible source groups kept across restarts, Disconnect closing the cluster's tabs, F1–F12 in the search fields, ⌘F and ⌘⇧T as View menu items, the welcome page's Recent and two links; no status changes, no count moves; Cluster settings › Proxy: the plugin approval binds it, A23; Status bar: "TLS not checked", A29; Helm repositories: A36 built, repositories with a dot; Helm repositories: A14 built 2026-10-15, the dialog's mark "insecure TLS") · **Target:** Lens Desktop 2026.10.51501 How Cogpit's interface compares with Lens Desktop 2026.10.51501: the window layout, clusters and hotbar, the cluster sidebar, list tables, the detail drawer, the bottom dock with its editor, log @@ -52,24 +52,24 @@ hotbar, navigator, tab bar, workspace, dock, status bar. | Hotbar down the left edge ([Hotbar](#hotbar)); captured: one tile per cluster with its icon or image and a short label, and a bank switcher ("‹ 1 ›") at the bottom | paid | partial (2026-10-12, built although paid: owner, G13): a bar at the window's left edge, left of the navigator, between the top bar and the status bar, with one tile per pinned cluster, as captured; Lens's bank switcher ("‹ 1 ›") is gone since 2026-10-17: Cogpit has one hotbar, which scrolls when its tiles do not fit, the "+" below the last (the owner's decision WF7, a deliberate deviation, [D-83](../developer/decisions.md#d-83-one-hotbar-and-a-drag-that-carries-the-tile)); a tile is the context's initials badge in the sidebar header's colours, its name cut to the tile as the short label, a dot for the connection's state (status tokens; since 2026-10-16 the Running green, blinking while the cluster reconnects, its own tooltip, and a click on it opens the connection log instead of the cluster, the owner's F13, `TestDotClickOpensTheConnectionLog`), and the full context id with its state and F-key (F1–F12, the first twelve tiles) as tooltip. Since 2026-10-13 a tile is the cluster's identity, its initials in its icon colour or its uploaded image (the Cluster identity row, [`hotbar.go`](../../internal/ui/fyneui/hotbar.go), `TestIdentityFromTheClusterSettings`); inferred, Cogpit's: a tile whose context no kubeconfig source offers any more stays, outlined in the warning colour; the "+" below the tiles that pins the connected cluster; the bar is hidden in a session without a hotbar. Confirmed (owner, 2026-10-14 evening): the "+" below the tiles, now the owner's decision. Since 2026-10-16 ([D-69](../developer/decisions.md#d-69-several-clusters-connected-at-once) stage 2) each tile's dot carries its cluster's mark: filled green for the shown cluster and a connected one whose views are warm, blinking while it (re)connects (a cluster in the background too), a green ring once its views are released (cold), a grey ring while its login lapsed unrenewed, red after a failed connect; the shown cluster's tile alone is raised, a click on a connected one shows it at once, and its menu says Show and offers Disconnect for that cluster (the lead's decisions, open to revision). | [`fyneui/hotbar.go`](../../internal/ui/fyneui/hotbar.go), [`engine/hotbar.go`](../../internal/engine/hotbar.go); `TestHotbarShowsItsTiles`, `TestHotbarHiddenWithoutAHotbar`, `TestHotbarPastTwelveScrolls`; PNG [tiles dark](../../internal/ui/fyneui/testdata/hotbar_tiles_dark.png), [tiles light](../../internal/ui/fyneui/testdata/hotbar_tiles_light.png), [empty dark](../../internal/ui/fyneui/testdata/hotbar_empty_dark.png), [empty light](../../internal/ui/fyneui/testdata/hotbar_empty_light.png); `TestDotsShowEachClustersMark`, `TestABackgroundReconnectBlinksItsDots`, PNGs [dark](../../internal/ui/fyneui/testdata/hotbar_marks_dark.png), [light](../../internal/ui/fyneui/testdata/hotbar_marks_light.png), `TestAConnectedClusterIsShownWithoutAReview`, `TestDisconnectInAClustersMenuNamesIt` | | Navigator with the cluster's resource tree ([Cluster sidebar](#cluster-sidebar)) | free | partial: its width is the user's (owner requirement, built 2026-10-12): drag the edge, 160 to 480 points, kept in the preferences; Lens's behaviour here is not captured. Since 2026-10-13 the tree is Cogpit's own rows in place of Fyne's tree (whose rows keep their hover and keyboard highlight private), with the same look: a long title is cut with an ellipsis, its tooltip shows it whole. Since 2026-10-15 (the owner's finding F7, Cogpit's own: [beyond Lens](beyond-lens.md#everyday-use)) hidden and shown with ⌘B, View › Navigator and the top bar's first layout toggle (`ui.toggleNavigator`, `UIState.NavigatorHidden`, kept across restarts), the hotbar staying | [`sidebar.go`](../../internal/ui/fyneui/sidebar.go), [`navigator.go`](../../internal/ui/fyneui/navigator.go), [`panelwidths.go`](../../internal/ui/fyneui/panelwidths.go); `TestSidebarWidthByDraggingItsEdge`, `TestPanelWidthsSurviveARestart`; hidden: [`layoutbar.go`](../../internal/ui/fyneui/layoutbar.go), `TestLayoutTogglesThroughTheEngine`, PNG [dark](../../internal/ui/fyneui/testdata/layout_navigator_hidden_dark.png), [light](../../internal/ui/fyneui/testdata/layout_navigator_hidden_light.png) | | Navigator header: a dropdown of the scope the tree shows, one cluster or a section such as "Local Kubeconfigs", and a search button; the tree's root is the cluster, with its icon, a connection dot and a ›, and a ‹ to go back; hovering an item shows " - " (captures, 2026-10-11) | free | partial (2026-10-13, night run): since 2026-10-18 the header's "‹ All Clusters" takes the whole row up to the search button (the owner's WF27, [D-93](../developer/decisions.md#d-93-room-in-the-drawers-data-footer-between-the-layout-toggles-and-in-the-navigators-back-row)); a search button above the tree, as captured; the scope dropdown deviates from Lens by the owner's decision since 2026-10-15 ([D-57](../developer/decisions.md#d-57-choosing-a-cluster), the night run): Cogpit's header has none, at a cluster the button "‹ All Clusters" in its place, the one way up to the section (the cluster stays connected), at the section the title "All Clusters" with a "+" (Add Kubeconfigs…) beside the search. The tree's root is the cluster: its badge (the cluster's identity, as the hotbar's tiles draw it), its name and kubeconfig, a connection dot and a › (its ‹ went with D-57; ← on the root still goes up, the keyboard's way). Since 2026-10-16 ([D-68](../developer/decisions.md#d-68-one-short-name-for-a-cluster-and-the-user-cogpit-is-logged-in-as), the owner's F17; Cogpit's own: Lens's root row is not captured for a name or a user) the root names the cluster by the name the window gives it everywhere, its display name, else the part of its context name after the last "@" ("kubernetes-admin@prod-eu" → "prod-eu"), the full id in the row's tooltip; its second line is the user Cogpit is logged in as, from a SelfSubjectReview at every connect and reconnect, with a small box whose tooltip lists the user's groups; " (kubeconfig)" with "Not confirmed by the API server" where the API server does not know the review (404) or refuses it (403); while the cluster connects, the last user the API server confirmed for it, dimmed, its tooltip "Last seen