tenuo-ai/tenuo/tenuo-warrant
Claude Code and agent skill by tenuo-ai/tenuo
- community
Checking that the SKILL.md file is still in the repository.
Create or delegate Tenuo warrants from natural-language authority requirements. Use when designing capabilities and constraints, minting a warrant, or narrowing authority for a child agent. Do not use for integrating enforcement into an application or tool boundary (use tenuo-agent-authorization), or for a review-only audit (use tenuo-audit).
Install
npx vskill@latest install tenuo-ai/tenuo/tenuo-warrantSKILL.md
Tenuo Warrant Creator
Help developers create tenuo warrants by translating natural language intent into capability tokens with the right constraints. Warrants are a new authorization primitive — most developers haven't seen them before — so this skill bridges the gap between "I want my agent to do X" and the actual warrant code.
Announce at start: "I'm using the tenuo-warrant skill to help you create a warrant for your agent."
The Core Idea
A warrant is like an API key that can only get weaker. Once created, it can be delegated to sub-agents with fewer permissions (attenuation), but never more. Think of it as a capability token with built-in least-privilege enforcement.
For developers familiar with other auth systems:
- OAuth: Warrants are like scopes, but scopes are static strings — warrants carry semantic constraints (e.g., "files under /data" not just "files:read")
- IAM: Warrants are like IAM policies attached to a session token, but they're cryptographically chained so each delegation provably narrows scope
- RBAC: Instead of roles with fixed permissions, warrants carry exactly the permissions needed, bound to a specific agent and expiration
Flow
Phase 1: Discover Context
Before asking questions, scan the codebase:
- Check for existing tenuo usage — search Python and TypeScript manifests and sources for
import tenuo,from tenuo,@tenuo/core,tenuo_cloud,Warrant,SigningKey,createTenuo,session, andnarrow - Detect the installed SDK and version — inspect manifests, lockfiles, and existing warrant construction before choosing minting or delegation APIs
- Check for tenuo-cloud — look for
tenuo_cloudimports,tc_prefixed env vars, orAsyncTenuoCloudClient
This tells you which warrant source and resolved SDK surface to use. Do not generate application or tool-boundary enforcement from this skill.
Route by the detected runtime. For TypeScript, read references/typescript.md and use TypeScript names throughout; never make the developer translate Python builders or vocabulary. For Python, verify the installed Python API before using the examples below.
Phase 2: Persona Check
Infer persona from context first — if the codebase scan, the user's language, or a prior message makes it obvious, skip the question. Only ask if genuinely ambiguous:
"Before we start — are you a developer building agent integrations, a platform engineer setting up infrastructure, or a security engineer reviewing permissions?"
- Developer → continue only for warrant design, minting, or delegation. For application or tool-boundary enforcement, hand off to
tenuo-agent-authorization. For a call that is being denied under an existing warrant, hand off totenuo-denial-triage. - Security engineer → suggest
/tenuo-auditinstead ("That skill is designed for reviewing and explaining existing warrants — it'll frame everything in IAM/RBAC terms you're used to") - Platform engineer → continue, but note the sidecar + policy file workflow is coming soon. For now, help them create warrants via the SDK
Phase 3: Natural Language Intake
Ask the developer to describe what their agent needs to do in plain language. Encourage them to be specific about:
- What tools/actions the agent needs for this specific task (not what it might ever need)
- What data or systems it accesses
- Any boundaries (file paths, URLs, environments)
- How long it should be valid
Example prompt: "Describe what your agent needs to be authorized to do. Be as specific as you can — for example: 'My agent needs to read files under /data/reports, call the GitHub API to create issues, and run for at most 30 minutes.'"
TTL guidance: Always ask about task duration and push for the shortest plausible TTL. If the user gives a long TTL (> 1 hour), push back:
"You said 24 hours — that means if this warrant or key is compromised, it's valid for a full day with no revocation path (open-source) or until manually added to the SRL (cloud). Could this task complete in 15–30 minutes? A short TTL with re-issuance is safer than a long-lived credential."
Default to task-duration + a small buffer (e.g., 5 minutes for a 2-minute task). Only accept long TTLs if the user explicitly understands the trade-off.
Phase 4: Draft the Warrant
Take the natural language description and produce a draft warrant spec. Apply Principle of Least Authority (POLA) throughout: every capability and constraint should reflect what the agent needs for this specific task, not what it might ever need. If a capability is mentioned but not clearly required for the stated task, challenge it:
"You listeddelete_file— do you need that for this task, or is it something the agent might use in other contexts? It's easy to add later; it's hard to narrow once it's in use."
For each capability and constraint, explain what you chose and why using this mapping:
| What they said | Constraint you pick | Why this one | |
|---|---|---|---|
| "files in /path" or "read from /dir" | Subpath("/path") | Prevents path traversal — ../../etc/passwd gets blocked. Like an S3 bucket policy with resource path. | |
| "call API at X" or "hit endpoint X" | All([UrlSafe(), UrlPattern("X")]) | UrlSafe blocks private IPs and cloud metadata endpoints (SSRF protection). UrlPattern restricts to the specific API. Like an API gateway allowlist. | |
| "search the web" or "fetch URLs" or any network access | UrlSafe() (at minimum) | Any capability that touches the network MUST have UrlSafe() — even if no specific URL pattern is needed. Without it, the agent could hit internal services or cloud metadata endpoints (SSRF). Like requiring a VPC endpoint policy. | |
| "run for N minutes/hours" | .ttl(seconds) | Warrant expires automatically. No revocation needed for short-lived tasks. Like a session timeout. | |
| "only these tools" | Explicit capability list | Closed set — anything not listed is denied. Like OAuth scopes. | |
| "values between X and Y" | Range(min, max) | Numeric bounds on arguments. Like input validation rules. | |
| "shell commands, but only..." | Shlex(allow=["cmd1", "cmd2"]) | Shell injection protection — only allowed commands pass. Like a sudoers allowlist. | |
| "only in production" or "staging only" | OneOf(["prod"]) | Enum constraint. Like environment-scoped IAM roles. | |
| "IP range 10.0.0.0/8" | Cidr("10.0.0.0/8") | Network range constraint. Like a security group or firewall rule. | |
| "custom rule: if X then Y" | CEL("expression") | Arbitrary evaluation logic. Like an OPA/Rego policy. Needs human review. | |
| "files matching *.json" | path_glob("/allowed/root", "*.json") (or All([Subpath("/allowed/root"), Pattern("*.json")])) | Pattern is a generic string glob: * crosses /, so Pattern("*.json") alone admits /etc/passwd.json. Never use it alone as a filesystem boundary. The glob is tested against the whole path, so it matches at any depth under the root. Supports delegation narrowing: a child may narrow to a tighter root or to an Exact path the parent already admits. | |
| "exactly this value" | Exact("value") | Literal match only. Like an enum with one option. | |
| "match pattern [regex]" | Regex("pattern") | Regex match. Cannot be narrowed during delegation — prefer Pattern if the warrant will be delegated further. | |
| "anything except X" | Not(Exact("X")) or Not(OneOf([...])) | Negation — rejects values matching the inner constraint. Attenuation direction reverses: child's inner must be wider than parent's inner. | |
| "any one of these patterns / either A or B" | AnyOf([c1, c2]) | OR composite — passes if any inner constraint matches. Useful for allowlisting multiple valid formats or values. |
Present the draft like this:
Phase 5: Validate Each Mapping
Walk through each constraint and ask for confirmation:
"I interpreted 'read files under /data/reports' as a Subpath("/data/reports") constraint. This means:
- ✅
/data/reports/q4.csv— allowed - ✅
/data/reports/2024/summary.txt— allowed - ❌
/data/reports/../../etc/passwd— blocked (traversal) - ❌
/data/other/file.txt— blocked (outside scope)
Does that match what you intended?"
Fill gaps with targeted questions:
- "You mentioned API access — should the agent be able to write (POST/PUT) or just read (GET)?"
- "Should the agent be able to delegate this warrant to sub-agents? If so, how deep?"
- "Any time limit on how long this authorization should last?"
Safety check — always verify: Any capability that involves network access (fetching URLs, calling APIs, web search, webhooks) MUST have UrlSafe() applied, even if no specific URL pattern is needed. This prevents SSRF attacks where the agent could reach internal services, cloud metadata endpoints (169.254.169.254), or localhost. If a network-facing capability is missing UrlSafe(), flag it and add it. This is the single most common constraint omission.
Phase 6: Explain the Full Warrant
Present a complete plain-language summary:
Phase 7: Closed-World Mode
If any constraints were added, explain the trust cliff:
"Because you added constraints, tenuo is now in closed-world mode for those capabilities. This means any argument you didn't explicitly constrain will be rejected by default. This is a security feature — it prevents unexpected argument values from slipping through.
If there are arguments you want to leave unconstrained, I'll add Wildcard() for those explicitly.
⚠️ `_allow_unknown=True` disables closed-world mode entirely — any argument value passes through unchecked, which voids the main constraint safety property. This is a security override, not a convenience flag. Treat any request to use it like a request to disable input validation globally: require an explicit justification and document it in a code comment. Only the Python SDK can set it, so do not offer it to TypeScript users as an option — but it rides on the wire, so a warrant minted with it keeps the flag wherever it is imported."
Phase 8: Choose Minting Source
Ask: "Where should this warrant come from?"
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/tenuo-warrant/SKILL.md
Popularity
- Repository stars
- 77
- Repository forks
- 5
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/tenuo-ai/tenuo/tenuo-warrant)