Fleet scans count derived/stale copies as real findings, inflating the defect count #21
Notifications
Total Time Spent: 1 minute
oleks
1 minute
No due date set.
Dependencies
No dependencies set.
Reference: oleks/pipetree#21
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Why: The same fleet sweep reported 13 WP001 hits. Only 2 were real, actionable defects. The breakdown:
~/projects/antigravity-plugins/*and~/projects/pi-plugins/*. These are UNPACKED PLUGIN INSTALLATIONS, not git repos at all (no .git anywhere up the tree). Their canonical sources —~/projects/claude-plugins/{cluster,inference-arbitrage,worktree-discipline}— are ALREADY FIXED and carry explanatory comments about this exact defect. Editing the copies would be pointless; they are regenerated on install.~/projects/scratch/claude-plugin-cluster, a second, stale clone of oleks/claude-plugin-cluster whose canonical checkout is already fixed.So ~85% of a fleet report was noise from derived trees and stale checkouts. That is bad enough to make a fleet sweep not worth running, which is the point of the tool.
Since pipetree already excludes foreign remotes by default, the analogous defaults worth considering: skip directories that are not inside any git repo at all (currently they fail open and are included), and/or report per-finding whether the checkout is behind its remote so a reader can discount stale hits. Both are judgement calls about scan semantics — pipetree does legitimately support scanning a non-git directory — so this is a design question, not an obvious fix.
Note a related fix already landed in
9083db9:testdatajoined skipDirs, because pipetree's own deliberately-defective lint fixtures were being reported as fleet findings.Acceptance:
Links: Surfaced during a fleet-wide
pipetree lintsweep on 2026-08-13 (oleks/pipetree at9083db9). Fixed in the sweep: oleks/ci-scripts 33bf3af, oleks/caddy-with-replace efe5323f.Half done in
f12d39a, and the other half deliberately not — details below,since the deferral is the part worth arguing about.
Derived trees are now excluded by default. Measured on the same fleet,
before and after: 13 WP001 hits → 4. All six removed were the unpacked
plugin installations under
antigravity-plugins/andpi-plugins/.The reason they slipped through the existing foreign-remote exclusion is
structural and worth recording:
findProjectRootreturns the SCAN ROOTwhen it finds no
.git, and a scan root with no remote is not "foreign",so the check never applied to them. They were not being kept on purpose —
they were invisible to the rule that should have caught them.
-allis the escape hatch, shared with foreign-remote exclusiondeliberately: both answer the same question (is this a checkout of a fleet
repo someone could push a fix to). Hook mode is unaffected by
construction rather than by a special case — explicit file arguments
never reach this code, so the "scan a plain directory" use this issue
flagged as legitimate still works.
The skip is announced in all three surfaces (lint JSON/text as a
SkipNoticewith reasonunmanaged, stderr in report mode, and the samenotice over MCP). Silently narrowing the corpus would make "clean fleet"
and "most of the fleet was excluded" identical.
The four remaining hits are exactly the ones you predicted: forrest
(deliberate — now suppressible via oleks/pipetree#20), heatwave-backend and
oracle-adb-backend (stale local checkouts, already fixed at
origin), andthe
scratch/claude-plugin-clustersecond clone.Not implemented: reporting whether a checkout is behind its remote.
That would address those three, and I decided against it rather than
forgot. The locally available data cannot support the claim honestly —
comparing HEAD to its remote-tracking ref says nothing about a checkout
that has never fetched, so it would report "in sync" for a tree months
behind. A linter people gate pushes on emitting false reassurance is worse
than the noise it removes. Doing it properly needs a network fetch, which
is a different trade-off in speed and offline behaviour and belongs in its
own change; filed separately so the idea isn't lost.
Closing on the derived-tree half, which is the ~85%-noise complaint this
issue opened with.
⏱ worked | 14-08-26 | session oleks/c1e780db | +1min | session-total 1min (lane-release) | elapsed from timeline