Repository navigation
feat(validate): guard skills against T3 provider discovery pitfalls - #34
Merged
Merged
Conversation
T3 Code lists provider-discovered skills. Cursor and Antigravity drop a
skill whose frontmatter YAML fails to parse (only Claude repairs it), and
T3's composer only forms a skill chip for names matching
[a-zA-Z0-9][a-zA-Z0-9:_-]* with a letter. validate.mjs now rejects plain
name/description scalars that are invalid YAML (': ', ' #', leading
indicator) and names outside the chip pattern, leaving quoted and block
scalars alone.
Also add docs/session-context/T3-CODE.md, an opt-in advisory routing note
for sessions where the t3-code MCP tools are present.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Flag conditional indicators (-, ?, : followed by a space or tab), validate continuation lines of multi-line plain scalars, and use [ \t] instead of \s so Unicode spaces such as NBSP are not misread as YAML separators. Replace the nested-mapping fixture with a genuine multiline string and add regression cases including CRLF. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…alars Report comment-only or empty name/description values, require quoted scalars to terminate with only a comment after the closing quote, and require block scalar headers to carry only indent/chomp indicators. Reword the ' #' problem to say it truncates the value and document that this is deliberately stricter than YAML. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Reject double-quoted escapes outside the YAML 1.2 set (and \x, \u, \U with the wrong digit count), and check that a block scalar has a non-empty body indented under its key and at least as deep as an explicit indentation indicator. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
When the key's own line holds no value, treat a leading | or > on the next value-bearing line as the block header and validate its body. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A comment-only line indented below the block body ends the scalar instead of failing as under-indented body text. Comment lines between a key and its value are also ignored. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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.
Problem
T3 Code lists provider-discovered skills. Cursor's and Antigravity's scanners silently drop a skill whose frontmatter YAML fails to parse (for example an unquoted
description: foo: bar); only Claude repairs it. T3's composer also only forms a skill chip for names matching[a-zA-Z0-9][a-zA-Z0-9:_-]*that contain a letter. Nothing in mstack stopped a canonical skill from shipping frontmatter that these providers drop. T3 sessions also had no mstack guidance for preferring the app-ownedt3-codeMCP tools.Solution
scripts/skill-compat-lib.mjsexportsskillCompatProblems, a dependency-free check that flags plainname/descriptionscalars that are invalid YAML (:,#, leading indicator) and names outside the T3 chip pattern. Quoted and block scalars are accepted.validate.mjscalls it in the existing frontmatter loop (one import, one line), andscripts/skill-compat.test.mjscovers it table-driven and is added tonpm test.docs/session-context/T3-CODE.mdis advisory, opt-in routing for sessions where thet3-codeMCP tools are present:delegate_taskoverrun-role,link_pull_request+watch_pull_request(andunwatch_pull_requestbefore handback) over the Bun watcher, not3_thread_launch/create_threadsfor plain subagent requests, plus the T3 AGENTS.md hazards when the task is T3 Code itself. Tool names and rules were checked against the T3 source. It ships through the existingsession-contextartifact directory; no installer, profile, or skill changes.Verification
npm test: 314 tests pass; validator passes all 53 skills.npm run check-package: 274 files.Model: Claude Sonnet 5.5
Harness: Claude Code
🤖 Generated with Claude Code