gabriel / muse public
blame-false-attribution.md markdown
52 lines 1.7 KB
Raw
sha256:fbbb1b49f0a5cbab5da21bb2c31d03f5e71168773ffe796f917f20d047df3a06 docs: track muse#84 blame false-attribution repro Sonnet 5 8 days ago

Summary

muse blame <file> --range attributes lines to a commit whose own files_modified list does not include that file, and whose blobs for the file are byte-identical to its parent — i.e. the blamed commit provably never touched the file.

Repro

cd ~/ecosystem/musehub
muse blame src/scss/_layout.scss --range 38-41 --json

Returns attribution to sha256:659f09b2a6570076b0ec01897c95ce391467b1a11fb8fa6d3c12e88b2e0e1c77 ("fix: update all list_domains/list_repos callers to cursor pagination API").

muse read sha256:659f09b2a6570076b0ec01897c95ce391467b1a11fb8fa6d3c12e88b2e0e1c77 --json \
  | jq '.files_modified'
[
  "musehub/api/routes/musehub/ui_domains.py",
  "musehub/mcp/dispatcher.py",
  "musehub/mcp/resources.py",
  "musehub/services/musehub_mcp_executor.py"
]

src/scss/_layout.scss is not in that list. Confirming the file content is identical between the blamed commit and its parent:

diff <(muse cat src/scss/_layout.scss --at sha256:659f09b2a6570076b0ec01897c95ce391467b1a11fb8fa6d3c12e88b2e0e1c77) \
     <(muse cat src/scss/_layout.scss --at sha256:9a6e44e84b66174d5e1a275f1d011bb9b100a3bbafc102f7620b36e8db53d1df)
# zero output — byte-identical

Expected

muse blame should attribute each line to the nearest ancestor commit that actually changed it (per its manifest / diff), never a commit whose files_modified excludes the file entirely.

Impact

Blame output cannot be trusted for archaeology (e.g. "why does this rule exist, when was it introduced") — it silently returns plausible-looking but false commit history, which is worse than an error since it's not obviously wrong without independent verification.

File History 1 commit
sha256:fbbb1b49f0a5cbab5da21bb2c31d03f5e71168773ffe796f917f20d047df3a06 docs: track muse#84 blame false-attribution repro Sonnet 5 8 days ago