Files
gitdan-actions/scripts
claude dc0fef71f8 test(seed): force scenario 8's interleaving instead of racing for it
Scenario 8 started a real publisher once a consumer's clone was observed
past a fraction of the tree, then asserted the consumer ended up holding
the NEW generation. That premise is racy: when the publish lands after the
consumer's last identity read, the consumer legitimately completes a whole,
consistent generation 1 — and the assertion called that "the seeded tree is
truncated". The one gate this repo has was failing intermittently in the
most alarming direction available.

Replaced with two scenarios that place the interference deterministically,
the way prune-cache-selftest.sh scenario 12 places a marker inside the
check-to-unlink window: the consumer's own `cp` is stubbed, so whatever the
stub does happens strictly after hardlink_clone_into read the source's
entry count and inode and strictly before it reads that inode again.

  8a  the stub runs the real copy, then the real publish-snapshot.sh
      concurrently, and returns only once the swap is on disk. The copy
      succeeds and the staging tree is whole, so the source's identity is
      the only witness.
  8b  the stub renames a subtree out of the source's listing before the
      walk starts and back before the retry. The copy exits 0 and the
      source's identity never changes, so the entry count is the only
      witness — the silent truncation this whole guard exists for.

Each asserts WHICH of the clone's checks reported the tear (assert_tear),
so neither stays green if the check it exercises is deleted and another
happens to fire in its place.

Closes #3
2026-08-24 10:56:42 -05:00
..