feat(harness): fail a project Skill that points at a path it invented - #155
Merged
Merged
Conversation
harlan-zw
added this pull request to stack #157
September 22, 2026 04:06
harlan-zw
removed this pull request from stack #157
September 22, 2026 04:07
An Agent cannot verify its own file pointers. A project Skill that names `src/server/routes.ts` reads exactly like one that names a real file, and the Agent has no way to tell the difference after the fact. The Harness already prepares the project source, so it knows every path the Agent could have seen. Anything else in an inline code span is invention, and promotion now fails with the path named. A line that reports a path as missing passes. "The project has no `src/lib.rs`" is a fact about the project, not a pointer. Adds `evals/`, which scores the same Skills on the direct path, where no check runs. Three cases, each run with and without the Skills loaded.
harlan-zw
changed the base branch from
feat/project-skill-discovery
to
main
September 22, 2026 04:07
harlan-zw
force-pushed
the
feat/project-skill-checks
branch
from
September 22, 2026 04:07
5a142dc to
3856000
Compare
Contributor
🤖 MERGED
GitHub merged this pull request.
46fb9903-be57-4d90-a5e7-2c9ee44562da |
This was referenced Sep 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
🔗 Linked issue
Related to #33
❓ Type of change
📚 Description
#154 gave
generate-project-skillsharper navigation rules, and I had no way to know whether an Agent follows them. A project Skill that namessrc/server/routes.tsreads exactly like one that names a real file. The Agent cannot check its own pointers, and neither could we.The Harness already prepares the project source, so it knows every path the Agent could have seen. Anything else in an inline code span is invention, and promotion fails with the path named.
evals/scores the same Skills on the direct path, where no check runs. Three cases, each run with the Skills loaded and without, so the delta is the value the Skills add rather than the model's baseline.package-not-projectproject-skill-real-pathsproject-skill-rustTwo runs per arm, Claude Code 2.1.278, $4.64. Not in CI: each run is a real Agent session.
The suite paid for itself on the first pass. Both Rust failures were a false positive I had written into the check: a run had reported that
src/lib.rsis absent, which is a fact about the project, and the check called it an invented path. A line that denies a path now passes.Loose ends:
package-not-projectis the weakest case. Baseline scored 0.67 there, so it is close to measuring the model..claude-plugin/plugin.jsonexists soclaude plugin evalcan resolveskills/as a target. It makes the repository loadable as a Claude Code plugin, which nothing else here relies on. Question: do you want that as a real distribution path, or should the manifest live somewhere that does not imply it?