Repository navigation
entire status reports "Checkpoints sync to: origin" when the git hooks are not installed #2264
Description
What happened?
entire status reports ● Enabled and Checkpoints sync to: origin when Entire's git hooks are not installed at all. entire doctor on the same repo correctly reports Git hooks: NOT INSTALLED. status is the command people actually run, so the one surface a user checks reports health while capture is off.
Reproduced on the released 0.10.4 binary. I let lefthook remove the hooks (lefthook install -f, the same thing lefthook's npm postinstall runs, see #2263; #1349 is the config-edit trigger), confirmed Entire's wrapper was gone from .git/hooks/pre-push, then ran both commands:
$ entire status
● Enabled · branch main
Agents · Claude Code
Checkpoints sync to: origin
$ entire doctor
✓ Metadata branches: OK (no remote-tracking metadata ref found)
Git hooks: NOT INSTALLED
Commits in this repository are not captured as checkpoints.
Fix: reinstall the managed git hooks (any non-Entire hook is backed up).
Run `entire doctor --force` to apply it.
✓ Claude Code hook config: OK
Nothing is enabled in the sense that matters: no hook will run, so no checkpoint will be captured and none will be pushed. In a repo with pending checkpoints the line goes further and promises "N checkpoints not yet on origin — they sync with your next git push origin", which cannot happen.
In the source, strategy.CheckGitHookState is what doctor uses (checkGitHooks in cmd/entire/cli/doctor.go). It appears zero times in cmd/entire/cli/status.go at v0.10.3, v0.10.4 and current main. status.go does already render agent hook-config drift (! <agent> hooks out of date), so the shape exists; it never consults the git-hook state that doctor uses two files away.
Steps to reproduce
- Fresh repo with a
lefthook.ymldeclaring apre-pushcommand;git commit lefthook install, thenentire enable; confirm.git/hooks/pre-pushcontains theEntire CLI hooksmarkerlefthook install -f(or delete.git/hooks/pre-pushby hand; the cause does not matter)entire status→● Enabled … Checkpoints sync to: originentire doctor→Git hooks: NOT INSTALLED
Scripted, re-runnable: repro-status-blind.sh. Happy to paste it.
Entire CLI version
Entire CLI 0.10.4 (Go 1.26.6, darwin/arm64)
OS and architecture
macOS 26.6.2 (Darwin 25.6.0) arm64
Agent
Claude Code
Additional context
Why this is worth separating from #1349. #1349 is about hook ownership: who wins the file, and how to stop the fight. This is about the diagnostic being wrong afterwards, whatever caused it. Any cause has the same effect: a manual rm, a core.hooksPath change, a fresh clone before entire enable, a teammate's tooling. That doctor already has this check is the reason I think status is worth its own issue: the project has already decided the signal is worth surfacing, and status is simply the surface that did not get it.
Suggested fix. status.go calls strategy.CheckGitHookState(ctx) and renders a line for GitHooksAbsent / GitHooksOutdated, pointing at entire doctor. Read-only; the fix stays in doctor.
Two judgement calls I would want your steer on before writing it:
- Suppress the sync line, or add a warning beside it? Suppressing removes a false statement; warning keeps the information for someone mid-diagnosis. I lean warning.
GitHooksAbsentin a repo that never opted in.checkGitHooksdeliberately stays silent unlesssettings.IsSetUpAny, so a diagnostic never nags a repo that did not ask.statusonly prints this block when enabled, so the same guard probably applies for free; worth confirming rather than assuming.
Related: #1349 (how the hooks go missing), #1965 (a different silent-capture failure: hooks present but no session recorded).
Activity
peyton-alt commentedon Sep 4, 2026
Thanks for filing this, we've seen it and it's on our radar. We'll update this issue as we investigate. If you have additional context or logs, feel free to add them here.
refactor(hooks): drop proactive hook-health warnings from this change
Merge origin/main into fix/lefthook-durable-hooks
fix(hooks): require a hook file that reaches Entire, and verify Lefth…
2bTwist commentedon Sep 19, 2026
Following up with the context you asked for. Two things: this still reproduces on the current release, and I ran #2388 against it, since that PR names this issue as the symptom.
Still reproduces on 0.10.6 (lefthook 2.1.10, macOS 27.0 arm64). Same output as the original report:
statusprintsCheckpoints sync to: originwhiledoctorprintsGit hooks: NOT INSTALLED.#2388 fixes it, including the causes that have nothing to do with Lefthook. I built
fix/lefthook-integrationat024b6db53and ran the same script against 0.10.6 and the PR build. The issue argued the diagnostic is wrong whatever removed the hooks, so I drove four causes rather than one:statusstatus--jsonlefthook install -fCheckpoints sync to: origin, no warningGit hooks · via Lefthookhooks_deliver: true,hooks_manager: "Lefthook"rmof Entire's hooks, no hook manager! Checkpoints are NOT being captured: Entire's Git hooks are not installed. · run 'entire doctor'hooks_deliver: falsecore.hooksPathpointed elsewherehooks_deliver: falseentire enablehooks_deliver: falseOn 0.10.6
doctorsaysNOT INSTALLEDin all four rows whilestatussays nothing, which is this issue. On the PR build the two agree in every row.Because the Lefthook row is now answered by registration rather than by
.git/hooks/*, I checked thatvia Lefthookis true and not just registered:lefthook install -f, a commit runsentire.shunder Lefthook forprepare-commit-msg,commit-msgandpost-commit, and a push runs it forpre-pushalongside the repo's ownpre-pushcommand.lefthook uninstall,statusflips to! Checkpoints are NOT being captured: Lefthook has no hook file for pre-push, so nothing runs Entire there.anddoctorreportsNOT DELIVERING (Lefthook). Same withcore.hooksPathmoved in a Lefthook repo, where it names all five hooks. So the registration check does not reintroduce this issue one level up.entire enablerenames Entire's four native wrappers to<hook>.old. I expected that to set up the entire and lefthook fight over the pre-push hook; session push gets silently disabled #1349 rename failure. It does not: a secondinstall -f, alefthook.ymledit followed by a commit, and a plainlefthook installall sync cleanly, andentire doctor --forceremoves the.oldfiles.On the two judgement calls from the issue: #2388 warns beside the sync line rather than suppressing it, and prints no warning in a repo that was never set up or has been disabled (
status --jsonthere carries a barehooks_deliver: falsewith no reason, which seems fine). Both are what I would have picked.Not covered: Windows, any Lefthook other than 2.1.10, and a
lefthook-local.tomlrepo (the PR says it refuses to shadow one; I did not drive it). I also did not look into the three failing checks on the PR beyond noting its description calls twoTestRunStatus_CheckpointPushDisabledDestinationssubtests pre-existing onmain.The script is sandboxed (
HOMEand repos undermktemp -d) and takesENTIRE=/path/to/build. Happy to paste it or open it as a gist.fix(hooks): register Entire with Lefthook instead of owning its hook …
fix(hooks): require a hook file that reaches Entire, and verify Lefth…
fix(status): stop promising a push will sync when no hook runs it