Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ All notable changes are documented here. This project follows Semantic Versionin

### Fixed

- Preserved ignored-file path identity across platforms when enforcing immutable workspace alignment. POSIX filenames containing literal backslashes are no longer rewritten as directory separators, so a distinct ignored runtime input such as `coverage\proof.lcov` cannot alias an explicitly allowed `coverage/proof.lcov` data artifact and bypass the pre-execution fail-closed gate.
- Failed closed on unattributed targeted-runner process failures even when another qualified batch target is unavailable. An unavailable target can no longer act as a sink that lets unrelated observed passes survive an ambiguous process-level failure; only explicitly failed targets retain localized failure attribution.
- Failed closed on deletion-only zero-context hunks when attributing current changed symbols and call references. Git represents a deletion-only hunk with a zero-length new-side range anchored to a neighboring current line; ProofDiff now reconciles reconstructed current-line spans with Git numstat additions before treating those anchors as changed current code.
- Preserved precise changed-line hunks across renames by scoping per-file Git diffs to both the previous and current path. This prevents a rename with content edits from being reinterpreted as a whole-file addition and overstating changed-line or call-reference evidence.
Expand Down
2 changes: 1 addition & 1 deletion dist/selection-workspace.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions dist/selection-workspace.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion dist/selection-workspace.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions src/selection-workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import path from "node:path";
import { diffTargetCommit, GitError, gitNullDevice, listUntrackedFiles, resolveRevisionCommit } from "./git.js";
import { runProcess, safeExecutablePath, type ProcessResult } from "./process.js";
import type { DiffSelection } from "./types.js";
import { normalizeRepoPath } from "./util.js";

const ROOT_DISCOVERY_METADATA = new Set([
"package.json",
Expand Down Expand Up @@ -112,7 +113,7 @@ async function ignoredFiles(root: string, pathspecs: string[], exclusions: strin
const message = result.stderr.trim() || result.error || `git ls-files exited with ${String(result.exitCode)}`;
throw new GitError(`Could not inspect ignored immutable-workspace inputs: ${message}`);
}
return [...new Set(result.stdout.split("\0").filter(Boolean).map((file) => file.replaceAll("\\", "/")))].sort();
return [...new Set(result.stdout.split("\0").filter(Boolean).map(normalizeRepoPath))].sort();
}

function isPythonDiscoveryPath(repoPath: string): boolean {
Expand All @@ -130,7 +131,7 @@ function repoLocalDataArtifact(root: string, artifact: string): string | null {
const absolute = path.isAbsolute(artifact) ? path.normalize(artifact) : path.resolve(root, artifact);
const relative = path.relative(root, absolute);
if (!relative || relative.startsWith("..") || path.isAbsolute(relative)) return null;
const normalized = relative.replaceAll("\\", "/");
const normalized = normalizeRepoPath(relative);
return isDiscoverySensitivePath(normalized) ? null : normalized;
}

Expand Down
Loading