claude-bot
98528710d4
CI / test (push) Successful in 45s
CI / test (pull_request) Successful in 43s
feat(fs): legacy root-owned ownership detect + actionable worktree error (ORCH-057)
...
Follow-up ORCH-040: legacy root:root files in /repos broke worktree creation
under uid 1000 with a raw "Permission denied" (agent never started, no diagnosis).
Three additive, kill-switch-reversible layers; STAGE_TRANSITIONS / QG_CHECKS /
check_* / machine-verdict keys / DB schema are byte-for-byte unchanged.
- D1: ensure_worktree classifies the permission class and raises an actionable
RuntimeError (cause + chown command + INFRA.md ref); non-permission errors keep
the prior raw-stderr contract; kill-switch off -> contract 1:1 as before ORCH-057.
- D2: new never-raise leaf src/fs_normalize.py — scan_ownership (TTL-cached,
early-exit per root), applies()-first scope (empty CSV -> self-hosting only),
opt-in normalize() that chowns ONLY when privileged (no-op under uid 1000).
- D3: best-effort startup detect in main.lifespan (WARNING + Telegram on mismatch,
never-fatal); read-only fs_ownership block in GET /queue; POST /fs-normalize/check.
Claim is NOT blocked — the clear early outcome is delivered by D1 at launch.
- Docs/config: .env.example flags + CHANGELOG (architecture README / adr-0031 /
INFRA.md procedure already landed on the branch).
- Tests: test_fs_normalize.py, test_git_worktree_perm.py,
test_fs_normalize_startup.py, test_api_queue.py (TC-01..TC-12). Full suite green.
Refs: ORCH-057
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-06-10 02:53:15 +03:00
..
2026-06-09 15:08:27 +03:00
2026-05-19 15:57:00 +03:00
2026-06-09 00:57:08 +03:00
2026-06-08 22:00:54 +03:00
2026-06-09 17:46:27 +03:00
2026-06-05 17:58:00 +00:00
2026-06-05 17:50:47 +03:00
2026-06-03 22:58:18 +03:00
2026-06-05 17:50:47 +03:00
2026-06-10 02:53:15 +03:00
2026-06-09 12:31:24 +03:00
2026-06-09 12:31:24 +03:00
2026-06-09 12:31:24 +03:00
2026-06-09 12:31:24 +03:00
2026-06-09 21:31:56 +03:00
2026-06-09 19:55:00 +03:00
2026-06-10 02:09:19 +03:00
2026-06-08 06:41:52 +00:00
2026-06-10 01:26:24 +03:00
2026-06-09 23:41:24 +03:00
2026-06-07 07:46:19 +00:00
2026-06-08 08:45:31 +00:00
2026-06-07 07:46:19 +00:00
2026-06-07 14:40:06 +00:00
2026-06-06 21:07:35 +00:00
2026-06-06 21:07:35 +00:00
2026-06-08 08:45:31 +00:00
2026-06-06 21:07:35 +00:00
2026-06-06 21:07:35 +00:00
2026-06-09 23:41:24 +03:00
2026-06-09 23:41:24 +03:00
2026-06-09 23:41:24 +03:00
2026-06-09 19:04:36 +03:00
2026-06-05 17:50:47 +03:00
2026-06-09 14:14:30 +03:00
2026-06-10 02:53:15 +03:00
2026-06-10 02:53:15 +03:00
2026-06-10 02:53:15 +03:00
2026-06-02 21:12:06 +03:00
2026-06-06 20:55:25 +00:00
2026-06-07 07:46:19 +00:00
2026-06-07 16:14:45 +00:00
2026-06-09 12:31:24 +03:00
2026-06-09 10:06:17 +03:00
2026-06-09 01:32:53 +03:00
2026-06-03 09:53:55 +03:00
2026-06-07 22:02:45 +00:00
2026-06-08 16:30:46 +03:00
2026-06-08 19:17:44 +03:00
2026-06-09 22:47:20 +03:00
2026-06-07 16:14:45 +00:00
2026-06-09 22:47:20 +03:00
2026-06-10 02:09:19 +03:00
2026-06-09 10:06:17 +03:00
2026-06-05 17:58:00 +00:00
2026-06-05 17:50:47 +03:00
2026-06-08 10:34:33 +00:00
2026-06-07 22:02:45 +00:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-08 19:17:44 +03:00
2026-06-09 02:26:49 +03:00
2026-06-06 15:02:33 +00:00
2026-06-08 16:30:46 +03:00
2026-06-08 16:30:46 +03:00
2026-06-08 16:30:46 +03:00
2026-06-08 16:30:46 +03:00
2026-06-08 16:30:46 +03:00
2026-06-08 16:30:46 +03:00
2026-06-09 22:47:20 +03:00
2026-06-09 00:57:08 +03:00
2026-06-09 13:25:39 +03:00
2026-06-03 22:42:53 +03:00
2026-06-03 10:53:25 +03:00
2026-06-08 06:41:52 +00:00
2026-06-08 10:34:33 +00:00
2026-06-08 05:18:46 +00:00
2026-06-07 19:20:41 +00:00
2026-06-07 22:02:45 +00:00
2026-06-10 01:26:24 +03:00
2026-06-09 12:31:24 +03:00
2026-06-07 22:02:45 +00:00
2026-06-09 11:24:48 +03:00
2026-06-07 22:02:45 +00:00
2026-06-09 23:41:24 +03:00
2026-06-07 14:40:06 +00:00
2026-06-05 17:50:47 +03:00
2026-06-02 22:30:51 +03:00
2026-06-08 11:24:01 +00:00
2026-06-08 08:45:31 +00:00
2026-06-08 19:17:44 +03:00
2026-06-10 01:26:24 +03:00
2026-06-07 18:04:50 +00:00
2026-06-09 14:14:30 +03:00
2026-06-07 12:39:00 +00:00
2026-06-09 11:24:48 +03:00
2026-06-07 16:14:45 +00:00
2026-06-09 16:33:33 +03:00
2026-06-09 23:41:24 +03:00
2026-06-09 02:26:49 +03:00
2026-06-09 02:26:49 +03:00
2026-06-03 00:12:17 +03:00
2026-06-08 22:50:47 +03:00
2026-06-08 22:00:54 +03:00
2026-06-06 04:42:11 +00:00
2026-06-09 14:14:30 +03:00
2026-06-09 23:41:24 +03:00
2026-06-09 11:24:48 +03:00
2026-06-09 11:24:48 +03:00
2026-06-09 11:24:48 +03:00
2026-06-09 21:31:56 +03:00
2026-06-08 06:41:52 +00:00
2026-06-07 19:20:41 +00:00
2026-06-07 18:04:50 +00:00
2026-06-10 01:26:24 +03:00
2026-06-07 22:02:45 +00:00
2026-06-10 01:26:24 +03:00
2026-06-08 08:45:31 +00:00
2026-06-07 12:39:00 +00:00
2026-06-06 21:07:35 +00:00
2026-06-05 17:50:47 +03:00
2026-06-05 17:50:47 +03:00
2026-06-05 17:50:47 +03:00
2026-06-05 17:50:47 +03:00
2026-06-03 22:18:24 +03:00
2026-06-09 11:24:48 +03:00
2026-06-09 21:31:56 +03:00
2026-06-03 22:42:53 +03:00
2026-06-09 10:06:17 +03:00
2026-06-08 10:34:33 +00:00
2026-06-06 10:13:49 +00:00
2026-06-09 10:06:17 +03:00
2026-06-10 00:17:26 +03:00
2026-06-08 10:34:33 +00:00
2026-06-09 22:08:52 +03:00
2026-06-09 22:08:52 +03:00
2026-06-04 11:17:58 +03:00
2026-06-03 22:18:24 +03:00
2026-06-03 18:18:26 +03:00
2026-06-04 22:38:09 +03:00