Skip to content

entire status reports "Checkpoints sync to: origin" when the git hooks are not installed #2264

Open

Description

@2bTwist

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

  1. Fresh repo with a lefthook.yml declaring a pre-push command; git commit
  2. lefthook install, then entire enable; confirm .git/hooks/pre-push contains the Entire CLI hooks marker
  3. lefthook install -f (or delete .git/hooks/pre-push by hand; the cause does not matter)
  4. entire status → ● Enabled … Checkpoints sync to: origin
  5. entire 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:

  1. 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.
  2. GitHooksAbsent in a repo that never opted in. checkGitHooks deliberately stays silent unless settings.IsSetUpAny, so a diagnostic never nags a repo that did not ask. status only 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

  1. peyton-alt commented on Sep 4, 2026

    @peyton-alt
    Contributor

    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.

  2. added 3 commits that reference this issue on Sep 11, 2026
    bbb12e1
    721a71a
    9a9f9d1
  3. 2bTwist commented on Sep 19, 2026

    @2bTwist
    Author

    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: status prints Checkpoints sync to: origin while doctor prints Git hooks: NOT INSTALLED.

    #2388 fixes it, including the causes that have nothing to do with Lefthook. I built fix/lefthook-integration at 024b6db53 and 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:

    Cause 0.10.6 status #2388 status #2388 --json
    lefthook install -f Checkpoints sync to: origin, no warning Git hooks · via Lefthook hooks_deliver: true, hooks_manager: "Lefthook"
    manual rm of Entire's hooks, no hook manager no warning ! Checkpoints are NOT being captured: Entire's Git hooks are not installed. · run 'entire doctor' hooks_deliver: false
    core.hooksPath pointed elsewhere no warning same warning hooks_deliver: false
    fresh clone of an enabled repo, before entire enable no warning same warning hooks_deliver: false

    On 0.10.6 doctor says NOT INSTALLED in all four rows while status says 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 that via Lefthook is true and not just registered:

    • After lefthook install -f, a commit runs entire.sh under Lefthook for prepare-commit-msg, commit-msg and post-commit, and a push runs it for pre-push alongside the repo's own pre-push command.
    • Registration present but nothing to dispatch it: after lefthook uninstall, status flips to ! Checkpoints are NOT being captured: Lefthook has no hook file for pre-push, so nothing runs Entire there. and doctor reports NOT DELIVERING (Lefthook). Same with core.hooksPath moved in a Lefthook repo, where it names all five hooks. So the registration check does not reintroduce this issue one level up.
    • The first Lefthook sync after entire enable renames 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 second install -f, a lefthook.yml edit followed by a commit, and a plain lefthook install all sync cleanly, and entire doctor --force removes the .old files.

    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 --json there carries a bare hooks_deliver: false with 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.toml repo (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 two TestRunStatus_CheckpointPushDisabledDestinations subtests pre-existing on main.

    The script is sandboxed (HOME and repos under mktemp -d) and takes ENTIRE=/path/to/build. Happy to paste it or open it as a gist.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions