feat(display): per-profile workspace→output pins (item 15c)
All checks were successful
Check / eval (push) Successful in 3m0s
Lock bump / bump (push) Successful in 2m53s

A display profile can now pin workspaces to outputs:

  docked = {
    monitors   = [ … ];
    workspaces = { "1" = "DP-3"; "9" = "eDP-1"; };
  };

The bare list-of-monitors shape still works (either-type; hyprland.nix
normalizes — coercedTo refuses list-of-submodule sources). Pins bake as
Hyprland `workspace` rules from the active profile and apply instantly
on `nomarchy-display-profile apply`: keyword sets the session rule,
moveworkspacetomonitor moves open workspaces over. Pins from a
previously applied profile linger in-session until reload/rebuild
(hyprctl can only add) — inert if the output is absent, noted in the
applier.

V1: flake check green (checks.display-profiles now asserts
workspaceRule) + scratch-downstream eval: baked settings carry both
rule sets, the generated applier has the keyword+dispatch pairs
(bash -n), match/list correct with mixed shapes. V3 queued in
HARDWARE-QUEUE (rides the dock test). Item 15 complete — deleted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-07-05 23:09:14 +01:00
parent 096440a7d7
commit edd0bd38ce
9 changed files with 121 additions and 62 deletions

View File

@@ -17,6 +17,27 @@ Template:
---
## 2026-07-05 — display-profile workspace pins (iteration #47, item 15c)
- **Task:** item 15 slice (c), the last one — per-profile workspace →
output pinning. Item 15 deleted (a/b/c all shipped; V3s queued).
- **Did:** a profile is now `{ monitors; workspaces = { "1" = "DP-3"; }; }`
(bare list still accepted — either-type + normalization in
hyprland.nix; coercedTo refuses list-of-submodule sources). Pins bake
as Hyprland `workspace` rules and apply instantly on profile switch
(`hyprctl keyword workspace` + `dispatch moveworkspacetomonitor`).
monitor-rules.nix gained pure `workspaceRule`; template + README
updated.
- **Verified:** V1 flake check green (incl. the extended
checks.display-profiles assert) + scratch-downstream eval: baked
settings render both rule sets, the generated applier carries the
keyword+dispatch pairs (bash -n OK), match/list still correct with
mixed profile shapes.
- **Pending:** V3 queued (workspace-pins entry in HARDWARE-QUEUE, rides
the slice-a dock test). Stale-pin note documented in the applier.
- **Next suggestion:** backlog is now human/event-gated (28 taste
calls, 14 Monday, 18 Decision, 20 KVM) — idle the loop or triage
PROPOSED.
## 2026-07-05 — icon-weight A/B for the human call (iteration #46, item 28)
- **Task:** item 28's last `[human]` blocker — make the color-vs-
symbolic menu-icon decision cheap.