Decision sheet D1-D10: hub CHANGELOG, architecture notes (01, 04, 05, 07, 08, 10), register (VERIFY states, R-912), STATUS, report; decoy suite runs in a git worktree
gates / gates (push) Successful in 4m32s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-08 15:17:02 +02:00
parent 87af859fc3
commit fe0dc0d03f
14 changed files with 241 additions and 16 deletions
+7
View File
@@ -1,3 +1,10 @@
## gates — the decoy suite runs in a linked git worktree (2026-10-08, fixed without a row)
- `test_gate_decoys.py` took its lock at `ROOT/.git/decoy-suite.lock`; in a `git worktree add` copy `.git` is a FILE, so
the suite crashed (`NotADirectoryError`) and `repo_gates.py` went red for every helper working in a worktree. The lock
now lives in `git rev-parse --absolute-git-dir` (per worktree — each worktree mutates its own files), falling back to
`ROOT/.git`. Measured: the full `repo_gates.py --fast` run green inside `worktrees/hub-integ`.
## gates — site gate 20: the one picture viewer (2026-10-08)
- Every `data-gallery` opener must be an `<a href>` to an existing file under `website/assets/`; a page with openers must
+9 -1
View File
@@ -39,7 +39,15 @@ ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# already mutated, and B's "restore" then wrote A's decoy back for good: website/en/apps.html was left without its
# Radicale logo, one step from a push. An exclusive lock makes a second run WAIT for the first.
import fcntl
_LOCK = open(os.path.join(ROOT, ".git", "decoy-suite.lock"), "w")
# The lock lives in THIS worktree's git dir: in a linked worktree (`git worktree add`) `.git` is a FILE, and the old
# `ROOT/.git/decoy-suite.lock` crashed with NotADirectoryError (2026-10-08). Each worktree mutates its own files, so a
# per-worktree lock is the right scope.
try:
_GITDIR = subprocess.run(["git", "rev-parse", "--absolute-git-dir"], cwd=ROOT, capture_output=True, text=True,
check=True).stdout.strip()
except (OSError, subprocess.CalledProcessError):
_GITDIR = os.path.join(ROOT, ".git")
_LOCK = open(os.path.join(_GITDIR, "decoy-suite.lock"), "w")
fcntl.flock(_LOCK, fcntl.LOCK_EX)
# ── WHAT THIS FILE COVERS ────────────────────────────────────────────────────────────────────────