Files
Philippe Loulidi 9f57046c86 refs: check the review setup's own code citations on every run (#50)
* refs: check the review setup's own code citations on every run

Reviewer prompts cite real paths and symbols, and nothing kept those true. When
the code moves the prompt keeps citing it, so the reviewer reasons from a fiction
on every PR.

`ecr ref-check` makes each citation checkable: pin it with `@ref <target>`, where
a target is a file, a dir, a glob, a `file#symbol` or a `doc.md#heading`, never a
line number. A backticked token that looks like a repo path must be a ref, so the
citations nobody thought about are covered too; extensionless tokens count when
they name something real, which keeps model ids out. `ecr review`/`ecr ci` run the
same check and only advise, since a stale prompt is not a defect in the PR.

The engine's own `./ref-check` now shares the grammar (glob targets, `<placeholder>`
targets, fenced examples), and this repo's setup is annotated to pass both.

* refs: format config-refs with oxfmt

* refs: read the enforceAgents roster from the manifest's own setup dir

Under `ecr ci` the setup comes from a trusted base-ref checkout while the code
tree is the PR head, so building the roster from the code tree judged
enforceAgents against a different (or missing) agents/ dir. Found by ecr
reviewing this PR.

* refs: leave LLP targets to their own checker, and see uncommitted files

`LLP NNNN#anchor` is a design-corpus target owned by a different mechanism. ecr
now parses it correctly (it is one target containing a space, so the old parse
left a bare `LLP` that read as a broken path) and then skips it: not resolved,
not counted. So a scaffolded repo passes `ecr ref-check` on day one while the
templates keep their engine annotations.

Glob targets now list tracked AND untracked-not-ignored files, matching what a
plain path ref already saw via stat — a freshly scaffolded tree reported its own
workflows as matching nothing.

Also fixes the three template spots the checker caught on a fresh scaffold.

* ref-check: refuse a flag-shaped --root value

`--root --json` silently checked a nonexistent directory and reported "all
resolve" while swallowing --json. Matches the verify-config convention.
2026-08-03 15:11:09 -06:00
..