Follow-up from #1112 (17dc91a). Automatic reconcile demand (hooks, background refresh, startup catch-up) on a linked worktree without the sync.watch_linked_worktrees opt-in is now correctly refused, but the refusal still maps to retained_unavailable("code_index_scheduler_unavailable") — the same string a genuinely absent scheduler produces — and run_startup_catch_up_sync logs a WARN for every linked-worktree open, which is normal operation under the default policy, not a fault.
Make the refusal a typed watch-policy state (the code index already has CodeIndexAutomaticAdmissionV1::LinkedWorktreeDisabled and search answers reason: linked_worktree_disabled): hooks/host admission should receive that typed reason, the startup catch-up should log it at info (or not at all) rather than WARN, and the daemon unit test added in 17dc91a should assert the typed reason instead of the unavailable string. Path hints on the same route have carried the same mislabel since before #1112; fix both call sites together.
Follow-up from #1112 (17dc91a). Automatic reconcile demand (hooks, background refresh, startup catch-up) on a linked worktree without the
sync.watch_linked_worktreesopt-in is now correctly refused, but the refusal still maps toretained_unavailable("code_index_scheduler_unavailable")— the same string a genuinely absent scheduler produces — andrun_startup_catch_up_synclogs a WARN for every linked-worktree open, which is normal operation under the default policy, not a fault.Make the refusal a typed watch-policy state (the code index already has
CodeIndexAutomaticAdmissionV1::LinkedWorktreeDisabledand search answersreason: linked_worktree_disabled): hooks/host admission should receive that typed reason, the startup catch-up should log it at info (or not at all) rather than WARN, and the daemon unit test added in 17dc91a should assert the typed reason instead of the unavailable string. Path hints on the same route have carried the same mislabel since before #1112; fix both call sites together.