Release v1.9.3 to main - #683
Merged
Merged
Conversation
Back-merge main after v1.9.2
… sort (#671) (#678) * dashboard: workers-table sort headers are real buttons — keyboard can sort (#671) The header's click target moves from a bare <th onClick> to a native <button> inside the th, per the #657 house pattern: native buttons are focusable and activate on Enter/Space, firing the same onSort path the mouse takes. The button absorbs the th padding and inherits its typography, so the whole cell stays clickable and the header looks unchanged; aria-sort/arrow rendering (#656/#665) is untouched. Closes #671 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * shrink: drop no-op inherit lines (ponytail-review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Disk readout switches to TB at 1 TB (#677) A 4 TB drive read "408.6 / 3666.4 GB" on the system card. A shared format_disk_size helper (1024-based, matching the collector's BYTES_IN_GB) now scales used and total together to TB once the volume reaches 1024 GB, on both the dashboard card and the Telegram /system reply. Collector output, stored telemetry, and the Prometheus surface are unchanged. Closes #677 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Drop redundant GB-side wiring test (ponytail-review) The helper tests already prove GB below 1024; one wiring test per surface is enough. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ontent, not presence (#681) * fix(#679): config editor saves rejected — key on populated worker lists, not present ones The dashboard config editor merges config.reference.json (which ships BOTH workers.list and dashboard.workers as empty-array schema defaults) under the operator's config and round-trips the merged doc on save, so every staged editor config carries both keys — and validate_worker_endpoints refused it on mere presence. Every save through the editor failed, Form and JSON alike, since the v1.7.0 hard error. - One selection rule (WORKER_LIST_JQ / worker_list) for every descriptor reader in pithead: workers.list wins unless empty/absent, then the deprecated dashboard.workers; the guard, dup check, control_preview token restore and control_worker_apply all route through it. - Refuse / warn only on POPULATED keys; an empty array beside the populated one is the schema default, never an operator choice. - load_worker_endpoints mirrors the rule (falls back on unset OR empty). - control_service.submit sheds read_config's own _core_keys/_editable_keys metadata from the intent — the commit-side closed-schema gate refuses a config carrying them, the second latent break of the same save path. - Stack tests: all four quadrant cases + the editor contract itself (the shipped reference merged under a valid config must survive the preview dry-run); unit tests for the loader fallback and the submit strip. Closes #679 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(#679): apply migrates deprecated dashboard.workers[] to workers.list[] in place A validated legacy list is moved on the next apply: entries land under workers.list, the old key is deleted, and the pre-migration file is kept beside the config as config.json.bak-workers (the .bak-control naming). Write-back rules follow persist_node_credentials: never on a dry run (#556) — which covers every control-channel preview — atomic temp+mv under umask 077, best-effort (a failed write warns and the run continues on the legacy key via worker_list). The pre-migration owner is restored after the mv so a root control-runner apply cannot strand config.json root-owned (#480 class); the backup also joins control_reown_operator_files' list. The legacy mask/restore black-box block moves to the post-migration reality: a live config carries dashboard.workers only between a hand-edit and the next apply, so the masked prefill is rendered directly (no apply) and the commit leg now asserts the migration lands through the control runner — tokens preserved under workers.list, backup kept, no sentinel dicts. Stack tests: migrate + announce + backup, sibling workers.* keys and tokens preserved, owner-only mode kept, idempotent second apply, dry run never writes, invalid legacy config refused untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Straight develop→main merge for the published v1.9.3 (tag commit 7a5cd25 = develop tip; no post-cut commits). Real merge, never squash — main stays released-only and an ancestor of develop.
🤖 Generated with Claude Code