Evaluation report · Hallucination audit
work/ Directory The Phase 2 brief said the content loader should read work/*.md, cases/*.md and evals/*.md. Two of those paths existed after scaffolding; work/ never did. A model that "helpfully" creates the directory would fork the source of truth. This audit checked the filesystem first, mapped Work to the existing projects/ collection, and kept every published URL intact.
The loader can read
work/*.md.
work/, cases/ and evals/ exist.find . -maxdepth 2 -type d \
-not -path './node_modules*' \
-not -path './.git*' \
-not -path './.vitepress/dist*'| Declared path | Exists? | Actual path | Decision |
|---|---|---|---|
work/*.md | No | projects/*.md | Map to kind: 'work' |
cases/*.md | Yes (created) | cases/*.md | Use as-is |
evals/*.md | Yes (created) | evals/*.md | Use as-is |
There was no hidden work/ directory, no symlink and no previous rename in git history. The Work label in the navigation refers to /projects/, which already serves the eight published project pages in both languages.
The loader owns the mapping:
const SOURCES = [
'projects/*.md', // exposed as kind: 'work'
'cases/*.md',
'evals/*.md',
// zh/ mirrors...
]This keeps:
/projects/... URLs and inbound links stable;It does not satisfy the literal work/*.md path from the brief.
Conditional. The intent — one loader spanning work, cases and evals — is met, and no hallucinated directory was created. The literal path requirement is not met.
A future rename is possible, but it must be a deliberate migration: create work/, move the files, add redirects from /projects/*, update the sidebar and nav, then delete the old directory. Doing that silently inside a loader would break links and split the source of truth.
| Check | Result |
|---|---|
| Declared collections | 3 |
| Existing collections | 2 |
| Mapped collections | 1 |
| Invented directories | 0 |
| Broken Work links | 0 |
| Duplicate project pages | 0 |