Repository navigation
lean-jev: require the docs reads, refuse an unnamed blob of state - #26
Merged
Merged
Conversation
A session sent about 400 questions with its whole input as one plain string, having read no TypeSafe docs page, and drew conclusions from the answers. The skill allowed it. A fallback clause said the request contract was enough when a fetch failed, the fetch was never attempted, and the rule meant to catch that asked the agent which skipped the reads to disclose that it had. The docs section moves above the contract as a precondition, naming concepts/state.md every time plus the page for each question type in use, and states that the contract is not a substitute for it. A page that will not load is now a reason to stop and tell the user. jev.py refuses a state over 400 characters passed as unnamed text, names concepts/state.md, and offers --state-format text for a genuine single blob. Prose cannot make an agent read a page, so the one mechanical check goes where the missed read does its damage, before the call is spent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
wzslr321
approved these changes
Oct 5, 2026
wzslr321
left a comment
Member
There was a problem hiding this comment.
sorry for late review, somehow I missed this PR :(
Contributor
Author
No worries |
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.
A session used
ask-jevto find duplicate and contradicting entries in a lessons log, sent about 400 questions over five runs, and produced findings that did not hold. It reported itself afterwards, which is how this got found.What happened
The agent read
SKILL.mdand nothing else. It never fetchedprimitives/choice.md,primitives/noul.mdorconcepts/state.md, although step 2 of the loop told it to. It sent the whole log as one plain string ("L1. ... L2. ...") and referred to entries in prose as "lesson L3", with choice options labelledLesson L3. It then drew conclusions about which question shapes work from a state that was badly framed to begin with, and presented them as findings.What let it happen
README.md.What changes
The docs section moves above the contract as Before the first call:
concepts/state.mdevery time, plus the page for each question type in use. It says outright that the contract is not a substitute, because a request can satisfy it, ignore the pages, and return a confident number about the wrong thing with nothing in the response to mark it. A page that will not load is now a reason to stop and tell the user, and the disclosure clause goes with the fallback it served.Both examples now pass an object and point a question at one of its fields, matching the shape
evaluating-a-test.mdalready uses.jev.pyrefuses a state over 400 characters passed as unnamed text, namesconcepts/state.md, and offers--state-format textfor a genuine single blob such as a diff or a log. This is the only part that is actually enforced. Prose cannot make an agent read a page, so the check goes where the missed read does its damage: it fires before the network call and exits 1, so the guidance arrives at the one moment an agent cannot skip.It catches the blob, not the skipped read. An agent can still write poor criteria over a well shaped state. Worth stating rather than treating the skill as now safe.
Verification
The documented example runs verbatim:
jev-1.13.0,is_bug0.97, 300 input tokens. The refusal path exits 1 before spending a call, with the guidance in the message. 25 tests pass, four of them new: long blob refused, long blob allowed when declaredtext, long object untouched, blob from a file refused too.claude plugin validate . --strictpasses.A
README.mdtroubleshooting row covers the new refusal. Version 0.3.0.Note for the internal marketplace
I opened the same change as leancodepl/ai-plugins-internal#126 before noticing the plugin had already moved here, and have closed it.
plugins/lean-jevstill needs adding toincludePathsin the internalsync-policy.jsonfor this to flow inward.🤖 Generated with Claude Code