Repository navigation
Conversation
Phase 1, PR 3 of .agents/plans/skill-evals-and-packages.plan.md. - web/lib/skillStaticChecks.ts (static-v1): deterministic checks over every file of a skill. Agent Skills frontmatter rules (upstream spec and the skills-ref validator), hidden Unicode (bidirectional controls, zero-width and tag characters, stacked variation selectors), download-and-run steps (curl | sh, iwr | iex, bash <(curl ...)), values that look like secrets, and password-protected zip archives. Findings never contain file content, and the URL inventory keeps host names only. - skill_static_checks table (additive, PK tree_hash + checks_version). The checks run after a publish, a new version, and every mirror sync, also when the mirror skips the AI review. - static_checks trust signal (pass, warn, or unknown; never fail) on the skill page and in /api/check, which also returns the report as static_checks. recommendedActionFromSignals does not read it. - scripts/backfill-skill-static-checks.ts covers versions stored before this change (dry run by default; --apply writes). - Docs: web/public/skill.md (2.3.0), docs/AGENT_REFERENCE.md, the plan. Reading taken for open question Q8: follow the plan's proposal (a display-only signal on the site). Q8 stays open for evaluation evidence and packages. Verified: format:check, lint, web and CLI typecheck, web vitest (165 files, 1660 tests), CLI vitest (17 files, 137 tests), Python vectors. Mutation checks: the || rule, the archive bypass, the leading byte order mark, and the flag-emoji rule each make a test fail when broken. next build --webpack compiled and ran TypeScript, then stopped at the /sitemap.xml prerender without DATABASE_URL. Not verified: the backfill has not run on production. Until it runs, existing skills show "Static checks: n/a".
This branch was successfully deployed
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.
What this changes
Phase 1, PR 3 of
.agents/plans/skill-evals-and-packages.plan.md. Independent of #274.New static checks (
web/lib/skillStaticChecks.ts, versionstatic-v1). They read every file of a skill, so they also cover the part of a large tree that the AI scan cuts off. They need no model and cost nothing.nameanddescription,compatibilityover 500 characters, fields outside the spec. Rules come from the upstream spec and theskills-refvalidator (checked 2026-11-04).curl … | sh,wget … | sudo bash,bash <(curl …),sh -c "$(curl …)",iwr … | iex, and similar.||andcurl … | jqare not flagged.static_checksispass(nothing above low),warn(any medium finding), orunknown(no checks on record). It never givesfail.skill_static_checkstable, primary key(tree_hash, checks_version), the same pattern asskill_scans./api/checkchecks uploaded files without storing them, and uses the cache for stored skills.GET /api/skills/{id}(static_checks), and/api/check(static_checksplus the signal). Browse cards do not change.After merge: run the backfill once
Existing skills show "Static checks: n/a" until their checks exist. From
web/on the Mac:It prints the database host first. It reads stored trees directly, so it records no download events. Large mirrored trees can fail to read until #274 merges, because #274 fixes the stored-tree read limits.
Verified
npm run format:check,npm run lint,npm run typecheck, CLItsc --noEmit.npm test: web 165 files, 1,660 tests; CLI 17 files, 137 tests.||, placeholders). A test confirms that awarnnever changesrecommended_action.||as a pipe, running the archive check before the text checks, keeping a leading byte order mark, and the old flag-emoji rule each make a test fail.next build --webpackcompiled and ran TypeScript, then stopped at the/sitemap.xmlprerender because this workspace has noDATABASE_URL. The Vercel preview is the real build check.Not verified
Notes for merging
web/public/skill.mdto version 2.3.0. That is the same line change, so it merges cleanly.Generated by Claude Code