Documentation Index
Fetch the complete documentation index at: https://mintlify.com/tankpkg/tank/llms.txt
Use this file to discover all available pages before exploring further.
Overview
Every published skill receives an Audit Score from 0-10 based on 8 weighted checks. This score is displayed in the registry UI and CLI before installation to help users make informed decisions. Source:apps/web/lib/audit-score.ts (167 lines)
Scoring Rubric
Total possible points: 10| Check | Points | Description |
|---|---|---|
| 1. SKILL.md present | 1 | Manifest file exists |
| 2. Description present | 1 | Non-empty description field |
| 3. Permissions declared | 1 | Permissions object is non-empty |
| 4. No security issues | 2 | No critical/high findings from scan |
| 5. Permission extraction match | 2 | Code capabilities match declared perms |
| 6. File count reasonable | 1 | Fewer than 100 files |
| 7. README documentation | 1 | README field is non-empty |
| 8. Package size reasonable | 1 | Tarball under 5 MB |
Check Details
Check 1: SKILL.md Present (1 point)
What: Verifies the skill has a valid manifest Logic:SKILL.md is required for all skills. If this fails, the skill wasn’t properly packaged.
Passes: manifest.name is a non-empty string
Fails: manifest.name is empty or missing
Check 2: Description Present (1 point)
What: Checks for a description in the manifest Logic:manifest.description is a non-empty string
Fails: Description is empty or missing
Check 3: Permissions Declared (1 point)
What: Checks if the skill declares any permissions Logic:permissions = {} are suspicious — they either forgot to declare or are hiding capabilities.
Passes: At least one permission category declared
Fails: permissions is {} or undefined
Check 4: No Security Issues (2 points)
What: Checks if the security scan found any issues Logic:- No security scan ran yet (default pass for new skills)
- Security scan found 0 issues
Check 5: Permission Extraction Match (2 points)
What: Compares code-extracted permissions vs declared permissions Logic:network permission declared).
Passes:
- No permission extraction ran yet (default pass)
- All extracted permissions exist in declared permissions
- Extracted permissions are a subset of declared
Check 6: File Count Reasonable (1 point)
What: Ensures the skill has fewer than 100 files Logic:- Overly complex (code smell)
- Accidentally including
node_modules/or other large directories - Potential zip bomb attempts
fileCount < 100
Fails: fileCount >= 100
Note: This limit may be increased based on community feedback.
Check 7: README Documentation (1 point)
What: Checks if the skill has a README Logic:README.md exists and is non-empty
Fails: No README or empty README
Check 8: Package Size Reasonable (1 point)
What: Ensures tarball is under 5 MB Logic:tarballSize < 5 MB
Fails: tarballSize >= 5 MB
Note: The global limit is 50 MB (enforced by Stage 0), but the audit score uses a stricter 5 MB threshold for quality.
Score Interpretation
| Score | Meaning | CLI Display | Install Behavior |
|---|---|---|---|
| 10/10 | Perfect | 🟢 Excellent | No warnings |
| 8-9 | Great | 🟢 Great | No warnings |
| 6-7 | Good | 🟡 Good | Warnings shown |
| 4-5 | Fair | 🟠 Fair | Confirmation required |
| 0-3 | Poor | 🔴 Poor | Strong warning + confirmation |
API Response Format
FromAuditScoreResult interface:
Default Pass Behavior
Checks 4 and 5 have default pass logic: Why? Skills are scored immediately after publish, but the security scanner runs asynchronously (can take 5-10 seconds). Rather than showing “Score: N/A” or delaying publish, Tank:- Assigns initial score with checks 4 & 5 = PASS (default)
- Re-scores after security scan completes
- Updates the registry UI
Score vs Verdict
Audit Score and Scan Verdict are different:| Metric | Purpose | Values | Who Sees |
|---|---|---|---|
| Audit Score | Quality + security signal | 0-10 | Users (install time) |
| Scan Verdict | Publish gate | PASS, PASS_WITH_NOTES, FLAGGED, FAIL | Registry admins |
- Skill has 2 medium findings
- Verdict: PASS_WITH_NOTES (allowed to publish)
- Audit Score: 8/10 (check 4 fails, loses 2 points)
- Skill has 1 critical finding
- Verdict: FAIL (cannot publish)
- Audit Score: N/A (skill rejected before scoring)
Improving Your Score
If your skill scores below 8/10, here’s how to fix each check:| Check | How to Fix |
|---|---|
| SKILL.md present | Ensure name field is non-empty in SKILL.md frontmatter |
| Description present | Add description field to manifest |
| Permissions declared | Add permissions object with required capabilities |
| No security issues | Fix or suppress findings (see Best Practices) |
| Permission extraction match | Ensure declared permissions match code usage |
| File count reasonable | Remove unnecessary files, add to .tankignore |
| README documentation | Add a README.md with usage instructions |
| Package size reasonable | Reduce tarball size (exclude assets, use .tankignore) |
False Negative Risks
Can a malicious skill get 10/10? Yes, if the attacker:- Includes valid SKILL.md and README
- Declares permissions honestly
- Obfuscates malicious code to evade Stage 2-5 scanners
- Keeps package under 5 MB and 100 files
- Audit score is ONE signal, not the only signal
- Users should also review:
- Skill author reputation
- Download count
- Community reviews
- Source code (if browsing registry)
- Tank’s 6-stage scanner catches most obfuscation (see Pipeline)
- Author reputation score
- Community upvotes/downvotes
- Verified author badges
- AI-powered code review (GPT-4 analysis of semantics)
Next Steps
Security Pipeline
How the 6-stage scanner produces findings
Best Practices
Tips for achieving 10/10 score