Context
Discovered by the first real consumer integration (wrightkit/agent-lab #68): wright analyze findings carry only a numeric span.file index, while wright lint resolves span.path — and lint is inconsistent: absolute inputs produce the basename, relative inputs produce the path as given.
Repro
Fixture loop.opy:
rule "loop":
@Event eachPlayer
while (true):
wait(0.016)
wright lint /abs/path/loop.opy -f json → finding span.path: "loop.opy" (basename)
wright lint loop.opy -f json → finding span.path: "loop.opy"
wright lint dir/loop.opy -f json → finding span.path: "dir/loop.opy" (path as given)
wright analyze <any> -f json → finding span has NO path (only file: 0)
Impact
Consumers composing analyze + lint (as agent-lab does) cannot derive one deterministic file identity per finding, so dedup/attribution across commands is unreliable.
Expected
Both commands resolve span.path consistently (e.g. root-relative to the input/--root), and analyze findings carry the same path as lint for the same source location.
Context
Discovered by the first real consumer integration (wrightkit/agent-lab #68):
wright analyzefindings carry only a numericspan.fileindex, whilewright lintresolvesspan.path— and lint is inconsistent: absolute inputs produce the basename, relative inputs produce the path as given.Repro
Fixture
loop.opy:wright lint /abs/path/loop.opy -f json→ findingspan.path: "loop.opy"(basename)wright lint loop.opy -f json→ findingspan.path: "loop.opy"wright lint dir/loop.opy -f json→ findingspan.path: "dir/loop.opy"(path as given)wright analyze <any> -f json→ finding span has NOpath(onlyfile: 0)Impact
Consumers composing
analyze+lint(as agent-lab does) cannot derive one deterministic file identity per finding, so dedup/attribution across commands is unreliable.Expected
Both commands resolve
span.pathconsistently (e.g. root-relative to the input/--root), andanalyzefindings carry the same path aslintfor the same source location.