Skip to content

merge-queue batch q-1785784982 - #755

Closed
matt82198 wants to merge 3 commits into
mainfrom
integrate/q-1785784982
Closed

matt82198 wants to merge 3 commits into
mainfrom
integrate/q-1785784982

Conversation

@matt82198

Copy link
Copy Markdown
Owner

Merge-queue batch built by tools/merge_queue.py.

Members: #752, #754

Members are closed only after git merge-base --is-ancestor proves their content landed on main.

matt82198 and others added 3 commits August 3, 2026 14:12
#751 moved the per-tool index out of tools/CLAUDE.md into the generated
tools/INDEX.md, because the inline list was the top merge-queue conflict
surface. The sync gate still recognised only CLAUDE.md as a domain's
documentation surface, so every post-#751 PR that touches a tool and
regenerates tools/INDEX.md was reported as "code changes without CLAUDE.md
update" and blocked at pre-push and in CI.

Recognise CLAUDE.md and INDEX.md as documentation surfaces (basename match,
so a lookalike like MY_INDEX.md is still code). The gate is not weakened: a
tool change with no documentation change is still drift, and INDEX.md only
moves when the tool's own INDEX: line moves.

Tests: 4 regression cases covering both directions, including the
fail-closed case for an undocumented tool change.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rd test, make epoch fencing real

Deep-scan findings B1/B2/B3 in the multibox coordination layer.

B1 (split-brain): LeaseStore derived claim keys with case_policy="platform",
which case-folds when os.name == 'nt' and preserves case otherwise. Two
instances sharing one coordination db therefore derived DIFFERENT keys for the
same file ('tools/Runner.py' -> 'tools/runner.py' on Windows, 'tools/Runner.py'
on Linux), so _check_conflicts (exact match) missed and BOTH were granted the
claim. Case policy is now configuration, not a property of the host OS, resolved
explicit-arg > multibox.case_policy > $AESOP_CLAIM_CASE_POLICY > "insensitive".
An unrecognized policy raises ValueError (fail-closed).

B2 (vacuous guard): the heterogeneity guard called canonical_claim_path directly
with case_policy="insensitive" -- a value production never passed -- and never
touched _normalize_path, so it stayed green while B1 was live and survived
mutating _normalize_path to the identity function. Rewritten to exercise the real
production entry point, plus an end-to-end LeaseStore split-brain reproducer.

B3 (inert epoch): nothing in the repo ever incremented the persisted epoch, so
get_identity_with_epoch returned 1 forever and could not distinguish a pre- from
a post-crash instance, while the module documented it as a monotonic boot
counter. Acquisition now increments and durably persists the epoch (temp file +
fsync + os.replace), fail-closed on persist failure (EpochPersistError, a
subclass of IdentityCorruptionError) and on a non-integer epoch. Existing
corrupt-file fail-closed hardening and fresh-box epoch=1 are preserved.
release_own_stale() now raises NotImplementedError instead of returning an
unconditional True while doing nothing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@matt82198 matt82198 added the merge-queue-batch Integration batch PR opened by the merge-queue advancer label Aug 3, 2026
@matt82198

Copy link
Copy Markdown
Owner Author

Dissolving merge-queue batch: required check(s) absent from rollup: windows

@matt82198 matt82198 closed this Aug 3, 2026
@matt82198
matt82198 deleted the integrate/q-1785784982 branch August 3, 2026 19:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-queue-batch Integration batch PR opened by the merge-queue advancer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant