ff442a0e

Skip a build directory by its whole name, not by a prefix of it

Independent of #11 and #12.

The discovery walk skipped any directory whose name started with `result`, meaning to skip a nix build output:

```haskell
|| "result" `isPrefixOf` name
```

It also skipped one called `results`, and every package under it went missing from discovery **with nothing reported**. That is what makes it worth a PR rather than a line: a walk that finds no cabal file and a walk that refused to look return the same answer to a caller.

The fixture fails on master with `Right []` where it wants `Right [PackageName "thing"]`. I checked that before keeping the fix.

## Why anything is skipped at all

Nothing here matters inside a Nix build. The source there is a store path copied from the git tree, so an ignored directory never arrives — I checked, and the flake's own source path holds no `dist-newstyle`, `node_modules`, `.git` or `result`.

It matters for a working tree, which is what the development loop and `scripts/corpus-run.sh` are pointed at. And there `dist-newstyle` earns its place, concretely: cabal unpacks a `source-repository-package` into `dist-newstyle/src`, cabal file and all. sydtest has one right now, `opt-env-conf-test-0.0.0.3`, and walking into it takes sydtest from 51 findings to 64 — the 13 extra being a file nobody in sydtest wrote. A hidden directory is the same story, `.stack-work` most of all.

## Two names are gone rather than corrected

**`result`.** It is a symlink to a build output that holds no cabal file: in this repository it points at `facts.db`, `report.json`, `report.txt`, and a nix source derivation is a tarball. So the walk follows it, finds nothing, and moves on. An earlier version of this replaced the name test with a symlink test — that was wrong in the same way as the bug, because a repository that links a package in on purpose has one to find there, and refusing the link loses it just as silently.

**`node_modules`.** Nothing puts a Haskell package there, so naming it only added something this could be wrong about.

Both are asserted as walked, so adding a name back is a decision rather than a default.

## Testable

`skippedByName :: Path Rel Dir -> Bool` is top-level and exported, where the walk had it in a `where` clause with no signature and no test. It is pure, so the prefix case is a unit test rather than a walk over a fixture.

188 tests, 10 new. Corpus findings are unchanged: nix-ci 0, sydtest 51, centjes 46, hopinion 0.

## One thing worth knowing

The fixture needed a line in `.gitignore`. Your global ignore file has `result*`, which hides a directory called `results` exactly the way this walk did — this repository's own `.gitignore` gets it right with `result` and `result-*`. Same bug one level up, silently untracking anything named that way in every repository. I have not touched it.

## Review loop

```
nix flake check
nix develop --command cabal test hopinion-test --test-options="--ai-executor"
```

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 9s 9s 11s 0s
Build 10s 0s 0s 10s 0s
Suite 0s 11s 11s 11s 0s

Timeline

0s10s