You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* fix(imports): a markdown link is not an import
The capture ran through `[@user](https://…)` link syntax into the URL,
picked up a `/`, and passed the looks-like-a-path gate. Biome's CLAUDE.md
credits twenty-two maintainers that way, and every one was an AGF004 error.
No real import target contains a `]`, so the capture stops there now.
* fix(imports): resolve an import from the file that declares it
Measured on Claude Code 2.1.238: a chain of imports loads sub/leaf.md from
sub/mid.md while an identically named file at the repository root stays
unloaded. Resolution is file-relative, and root-relative is not a fallback.
The old resolver used the directory the file governs, which for
.github/CLAUDE.md is the root — so n8n's `@../AGENTS.md`, a real 18KB file
one directory up, escaped the repository and was reported missing. The same
measurement cuts the other way: an import that only resolves against the
root is genuinely broken and is now reported. One that escapes the
repository is never reported, because a bounded scan cannot prove absence.
* fix(frontmatter): read skills, commands, and rules the way the programs do
The 2.1.0 lenient parser went to one of five call sites. trigger.dev's
drizzle skill — an unquoted description carrying `conventions: ` — loads in
Claude Code and echoes its description back verbatim, while agentfile
reported a parse error and a missing description. Measured per surface: a
command with `description: uses: colons, badly: everywhere` is listed with
exactly that description, and a .claude/rules file with the same shape still
loads its body. An unclosed fence is still an error in either reading.
* fix(skills): a name the loader ignores cannot be an error
Measured on Claude Code 2.1.238: a skill named n8n:create-pr in a create-pr/
directory loads and is invoked as create-pr; a skill in a directory named
My_Weird.Skill loads and is invoked as exactly that; a SKILL.md with no
frontmatter at all is listed with its first heading standing in for the
description and resolves when invoked by name. The directory is the identity.
So AGF101's grammar and directory-mismatch findings drop to warning, a name
that breaks both is one finding rather than two, and AGF102's default drops
to warning: missing metadata degrades discovery, it does not break the
skill. n8n's 22 namespaced skills were 44 errors; they are 22 warnings.
* fix(injection): an emoji's joiner is rendered, not hidden
AGF505 flagged the ZERO WIDTH JOINER inside PostHog's 🧑💻 — the codepoint
that makes two pictographs one glyph. A well-formed emoji ZWJ sequence is
exempt now; a joiner that joins nothing is still a finding.
The same finding pointed at lines 306 and 311 when the characters sat on 317
and 322: skill and subagent text starts after the frontmatter, and the
scanner numbered it from 1. Both now carry bodyLine through the IR, the same
anchor instructions already had.
* test: every fix carries the measurement that grounds it
Each regression case names the repository it came from and the behaviour
measured on Claude Code 2.1.238, and each keeps a mutation guard: the
unclosed fence still errors, the bare joiner still fires, the root-relative
import that never loads is now a true positive.
* release: 2.1.1
A patch by docs/stability.md: no new codes, no meaning changes — severity
defaults and heuristic reach are documented as not stable. Ten popular
repositories produced 69 error-severity findings on 2.1.0; all 69 were
wrong, in six ways, and each fix in this release carries its measurement.
Internal ranges move with the version, as they did last time.
* fix(action): plant a defect that is still a defect
The fixture's frontmatter stopped being an error when the readers went
lenient — correctly, since the programs load it. The self-test now plants a
broken import instead: CLAUDE.md promising a file that does not exist stays
an error on every measured path, so the gate has something real to gate on.
* chore(deps): take the six open dependabot bumps into the release
biome 2.5.11, semver ^7.8.5, react-query ^5.102.8, plugin-react ^6.1.1,
lucide-react ^1.35.0, zod ^4.5.2 (core and ui), open ^11.0.2, diff ^9.0.0,
checkout@v7 and setup-node@v7 in the action and its self-test.
The two red checks on the open and diff PRs were not those dependencies:
2.1.0 reached npm at 13:38:02 and their runs started at 13:38:09, the first
runs to resolve latest after the fixture's planted defect stopped being an
error. The corrected fixture in this branch is the fix.
Closes#16. Closes#17. Closes#18. Closes#19. Closes#20. Closes#21.
---------
Co-authored-by: Dennis Havermans <dennis.havermans@ae.be>
0 commit comments