diff options
| author | Craig Jennings <c@cjennings.net> | 2026-07-27 13:38:24 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-07-27 13:38:24 -0500 |
| commit | 4241d23fc4fb7d59d2f0fa4b6c1e4e3549bb8480 (patch) | |
| tree | 40896e97e589dba9975dcfe73c3403aea09f99e1 | |
| parent | 41e1507358726bcb4cee7dc2ea13b549836d78e8 (diff) | |
| download | archsetup-4241d23fc4fb7d59d2f0fa4b6c1e4e3549bb8480.tar.gz archsetup-4241d23fc4fb7d59d2f0fa4b6c1e4e3549bb8480.zip | |
docs: record repository-scoped publish-lock decision
I chose one repository-scoped lock for sessions sharing a clone. It protects reconcile through commit without blocking ordinary edits.
| -rw-r--r-- | todo.org | 22 |
1 files changed, 5 insertions, 17 deletions
@@ -79,25 +79,13 @@ What's off is the *grouping* for multi-line messages. Thirteen =systemd-coredump Consequence is modest: the digest's top-N rows get eaten by near-duplicates, so genuinely distinct errors fall off the evidence list sooner. It doesn't affect the metric's value or severity. The question is what you'd want: group coredumps by the binary named in the first line (a special case for =systemd-coredump=), signature only the *first line* of any multi-line message (a general rule, and arguably the right one — the first line is the error, the rest is context), or leave it alone. The middle option is the smallest general change and I'd lean that way, but it changes grouping for every multi-line error, so it's yours to call. -** VERIFY [#B] Two agent sessions sharing one git repo :chore:tooling: -SCHEDULED: <2026-07-27 Mon> -Twice on 2026-07-22/23 a session swept the other's uncommitted work into its commit while both worked the dotfiles tree. The dotfiles session pathspec'd around mine once; my 2bd7d56 then carried their settings-panel window-rule revert (100%-854 → 100%-584) under a message describing only hypridle. Nothing needed undoing — the change was wanted — but the commit misdescribes itself, and the next collision may not be benign. +** DONE [#B] Two agent sessions sharing one git repo :chore:tooling: +CLOSED: [2026-07-26 Sun] +Craig approved the shared-rules-layer solution on 2026-07-26. -Root of it: =git commit -- <path>= commits the *working tree* state of that path, so a pathspec guards against other files but not against another session's edits to the same file. The shared =.git/index= is the deeper half — one session's =git add= disturbs the other's staging even when their files don't overlap. +Use one repository-scoped publish lock for every session and worktree sharing a clone. Derive the lock name from the real Git common-directory path; hold it across reconcile, stage, staged review, and commit; track the owning session and reviewed staged-tree fingerprint; refresh it after conversational waits; and repeat the staged review if ownership or the fingerprint changed. Ordinary working-tree edits remain concurrent. -Worktrees are the standard answer but fight this repo: stow symlinks point at =~/.dotfiles=, so only that clone is live and a worktree edit isn't real until it lands back there. A file-ownership split needs renegotiating whenever work crosses a boundary, which is most interesting work. - -The unintuitive part, worth stating plainly because both sessions built habits on the wrong model: a pathspec commit reads the *working tree*, not the index. The dotfiles session's pathspec habit carried the same exposure the whole time and only held because I never edited a file on one of their lists. Neither side had a mechanism, just different luck. - -*Options, after their skeptical review (their read is better than my first two):* - -1. =GIT_INDEX_FILE= per session — real but heavier than it looks. It only helps if both sessions also stop pathspec-committing (otherwise the working tree still wins, so it isn't coordination-free), it needs seeding from =.git/index= or git sees every tracked file as new, and it confuses hooks and anything reading default-index state. -2. "Read the staged hunks, not the stat" — *already on the books*. The publish flow requires =/review-code --staged= before a commit, and that reviews the diff. So this is an existing rule that didn't run, not a missing rule. I skipped it on both speedrun commits (2bd7d56, f9b6404) after Craig waived approvals — waiving the approval gate is not the same as waiving the review, and I collapsed the two. The question worth answering is why it was skipped, not what new habit to add. - - *Both sessions agree this is the finding that matters more than the lock shape*, and that the durable version should state it in one line: *an approval waiver never waives the review, because the review is the gate that reads hunks.* Two gates that both stand between an edit and a commit collapse into one the moment either is waived. -3. *Their proposal, and the best of the three:* a =dotfiles-commit= lock via the existing =.ai/scripts/agent-lock= (already used for sentry's runner and roam-write), held across stage → review → commit. It serializes the only window where sweeping happens, needs no change to how either session commits, and self-clears on a crashed holder. It doesn't stop a concurrent edit mid-window, but that window is seconds rather than minutes. - -Craig's call: whether this becomes a durable rule in the shared rules layer (it's cross-project — any repo two sessions touch), which shape, and which session implements it. Both sessions have offered to own it. +An approval waiver never waives the staged review, because that review is the gate that reads the actual hunks entering the commit. Rulesets owns the implementation in =commits.md=, =agent-lock=, and its Bats coverage; archsetup sent the approved implementation package through the rulesets inbox. ** TODO [#B] World face: orientation + hour-format pickers in the settings panel :feature:dotfiles: The world face (=settings/faces/world.html=, shipped 6afbe09) already supports both orientations and 12/24-hour via =?layout= and =?hour12= query params, defaulting vertical/12h. What's missing is letting Craig CHOOSE them from the desktop-settings panel. Build: (1) two new fields in the wallpaper state (world_layout, world_hour12) with the vertical/12h defaults; (2) =project.py build_uri("world")= appends =&layout=&hour12== read from state; (3) panel controls in the world channel's config section (=gui.py _conf_projected=, currently just a preview) — an orientation toggle and a 12/24 toggle; (4) TDD the URI-building and state round-trip. Solo — buildable, agent-verifiable (URI + state tests, headless render), no open design question (the two faces already exist and are approved). Requested by Craig 2026-07-23; deferred so the vertical face could ship first. |
