Skip to content

Flag stalls and ceremony on the board; sequence only branches that conflict - #3623

Merged
trissim merged 4 commits into
mainfrom
feat/board-self-flagging
Oct 29, 2026
Merged

trissim merged 4 commits into
mainfrom
feat/board-self-flagging

Conversation

@trissim

@trissim trissim commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Waste flags itself on the board now instead of waiting for someone to read #comms. 2 commits, 7 files, +310/−25.

SEQUENCE → CONFLICT, only when Git says so

Before: SharedFileBranches emitted one SEQUENCE … who goes first? row per shared file between two held orders. No answer could clear it, because sharing a file is ordinary parallel work. Tonight's board carried 12 of these across 8 order pairs, and units learned to skim the board.

After: ConflictingBranches emits one CONFLICT row per order pair, and only when git merge-tree --write-tree of the two branch heads conflicts. The row names both orders, both branches and the conflicting paths, and says "merge one into the other and resolve". The merge clears it.

  • HolderBranch.parallel_to owns the pair filter (different holders, same repository, different branches, shared files), and both PreparedBranch and HeldBranch inherit it. merge-tree runs only on candidates.
  • merge-tree runs in prepare, before the cut. HeldBranchRule.prepare hands each member the prepared branches via prepare_captured (a no-op except on ConflictingBranches). The answer is captured in ProgressRead under the unordered commit pair, and derive reads it with require_branch_conflicts. The scan opens no Git, as test_held_branch_rules_consume_the_complete_cut_after_worktree_mutation requires.
  • Repo.merge_conflicts owns merge-tree's exit contract: 0 merges cleanly, 1 lists the conflicting paths, anything else is a FailedGitCommand.
  • DriftOverlapRulesPhase evidence now names ConflictingBranches, and the fleet-replay seed is renamed to match.

Replay on tonight's actual heads (read-only):

pair merge-tree row
P927 × P957, P927 × P924, P954 × P958, P954 × P924, P957 × P958 clean none
P957 × P918 3 conflicts (commander_hud.py, order_tools.py, turn_digests.py) CONFLICT
P918 × P958 4 conflicts (bus.py, goal_scheduler.py, maintenance_barrier.py, …) CONFLICT
P918 × P924 5 conflicts (codex_protocol.py, external_transcript.py, harness_delivery_states.py, …) CONFLICT

12 rows → 3. All three are P918, which is already decided to land last.

BlockedTalk (rules/no-blocking.md)

A commanded unit's published message that announces a stop gets a named row citing its message id. The phrases are declared once in BlockedTalk.words ("waiting on", "awaiting", "blocked on", "frozen for", "until root", …). A message is skipped when it names an owner (an @thread or a recorded mention), carries a file:line, or negates the phrase ("not waiting on").

Replay of the last 6 hours: 14 rows, for example:

One false positive: board-commander quoting the phrase "'waiting on the run' labels". Bare "freeze"/"preserving"/"pending" were dropped after the first replay, which hit "the author freeze is superseded" and "preserving your … behaviour".

Ceremony

A unit holding pending work that published more than Ceremony.per_commit = 6000 characters per commit over the last hour gets a row naming both numbers. The rule reads the bus sent index and the held orders' existing progress sources; no new store.

Replay over 6 hours: 0 rows for units holding work. The busiest was claude-nra, 19,166 characters over 7 commits. board-commander, which holds no order and is forbidden to code, is excluded by the pending-work condition.

Shape

UnitTalk is one window over a unit's observation, and UnitTalkRule is a FamilyScan over the heartbeat's existing UnitState observations. Its members BlockedTalk (dated by the message) and Ceremony (undated) are discovered via the agent_comms.commander package. No kind strings, and no new reads beyond the bus sent index.

Proof

  • tests/test_unit_talk.py: 10 passed. It covers unowned waits flagging; owned, located, negated and ordinary messages not flagging; and the ceremony threshold, including the no-pending case.
  • The fleet-replay seed for ConflictingBranches uses an add/add conflict on shared.py.

Assumed: merge-tree --write-tree leaves unreachable tree and blob objects in the order's repository during prepare, which git gc prunes; no ref moves. The replay above read the bus with sqlite3 -readonly and computed commits with git log in each unit's worktrees, mirroring what the rules read through Core. Row counts on the live board appear only after install.

🤖 Generated with Claude Code

…t conflict

SharedFileBranches emitted one SEQUENCE row per shared file between two
held orders and no answer could clear it: 12 such rows on tonight's board
asked who goes first about pairs that merge cleanly. ConflictingBranches
emits one row per order pair, only when git merge-tree of the two heads
conflicts, naming the conflicting paths; merging one into the other
clears it. Repo.merge_conflicts owns the merge-tree exit contract.

BlockedTalk (rules/no-blocking.md) names a unit whose message announces a
stop (waiting on, awaiting, frozen for, until root...) with neither an
owner nor a file:line. Ceremony names a unit holding pending work that
published more than 6000 characters per commit in the last hour. Both read
the heartbeat's existing unit observations: the bus sent index and the
held orders' progress sources.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
Copilot AI balanced review requested due to automatic review settings October 29, 2026 22:44

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@trissim
trissim enabled auto-merge October 29, 2026 22:44
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

debt-src at 2951e35, every finding:

grew BooleanChainTerms:src/agent_comms/standing_rules.py +4
::warning file=src/agent_comms/commander/unit_talk.py::LintFindings +1 (warns, never blocks)
grew LongBooleanChain +1
::warning file=src/agent_comms/commander/unit_talk.py::Unformatted +1 (warns, never blocks)
found BooleanChainTerms:src/agent_comms/standing_rules.py at src/agent_comms/standing_rules.py:422 src/agent_comms/standing_rules.py:422 src/agent_comms/standing_rules.py:422 src/agent_comms/standing_rules.py:422
found LongBooleanChain at src/agent_comms/standing_rules.py:422 src/agent_comms/todos.py:4133

trissim and others added 3 commits October 29, 2026 18:53
The scan must consume only what prepare captured: running merge-tree in
derive opened Git after the cut and broke the complete-cut guarantee.
HeldBranchRule.prepare now hands each member the prepared branches;
ConflictingBranches reads merge-tree there into ProgressRead's cut
(keyed by the unordered commit pair) and derive requires the captured
answer. HolderBranch owns the parallel-pair test for both the prepared
and the held branch. UnitTalk reads the sent index on comms.bus.bus,
where Bus owns it, and unpacks each record's deliveries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
HolderBranch.parallel_to decided a pair by a hand-written chain over
holder, repository, branch and files. The only fact that selects a
candidate is a common (repository, file); HolderBranch.touching indexes
branches by it and yields each pair once. merge-tree answers the rest: a
pair on one branch merges cleanly, and two orders of one holder that do
conflict are still a conflict to resolve. unit_talk.py formatted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
@trissim
trissim added this pull request to the merge queue Oct 29, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 29, 2026
@trissim
trissim added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit f3ae591 Oct 29, 2026
9 checks passed
trissim added a commit that referenced this pull request Oct 29, 2026
…t died decoding them

#3623 replaced SharedFileBranches with ConflictingBranches, but 785 stored commander
packets still hold rule pings naming 'shared_file_branches'. Every CommanderHeartbeat
pass since the 068c963 install died in CommanderUpdate.latest with 'Unknown
StandingRule name', so the HUD refused for everyone. The cutover drops those pings
once, exactly as RetiredStorageRulePings did for the quota rule; the heartbeat raises
real conflicts again under ConflictingBranches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RnH6dR85kyFKcc2tQAJLhK
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants