Team capabilities
Generic agents don’t know your system
Out-of-the-box agents are impressive—until you need them to work with your codebase. They don’t know:
- Your custom component library exists
- That all dropdowns should use
custom-dropdown.tsx, not native<select> - Your API conventions, naming patterns, or architectural decisions
- The tribal knowledge your team repeats in every code review
Without this context, agents produce technically correct but organizationally wrong outputs. You end up re-prompting the same instructions repeatedly—or worse, fixing the same mistakes in review.
Tip
Team capabilities encode what your team already knows into prompts that agents always follow. No more “remember to use our custom dropdown” in every conversation.
Who this is for: Teams with established codebases, internal libraries, or domain-specific conventions. Solo developers building personal productivity packs. Anyone tired of repeating context to AI.
The capability layering model
Valdr capabilities are designed to stack. Start with a generic foundation, then add team-specific overlays that encode your institutional knowledge.
┌─────────────────────────────────────────────┐
│ Team-specific capability │
│ "Always use custom-dropdown.tsx" │
│ "Follow our API naming conventions" │
├─────────────────────────────────────────────┤
│ Domain capability │
│ "TypeScript best practices" │
│ "React component patterns" │
├─────────────────────────────────────────────┤
│ Base capability │
│ "Code review standards" │
│ "Testing requirements" │
└─────────────────────────────────────────────┘Each layer adds specificity without replacing what’s below. The agent inherits general best practices and your team’s specific conventions.
Pack naming conventions
The pack attribute groups related capabilities together. Valdr uses these conventions:
| Pack | Use for | Examples |
|---|---|---|
valdr | Valdr-provided capabilities and general-purpose prompts | typescript.core, review.code |
{team} | Team-specific capabilities | acme.ui.components, mycompany.api |
{domain} | Domain-specific packs you maintain | healthcare.hipaa, fintech.compliance |
Default pack: Use pack="valdr" for capabilities that follow Valdr’s standard patterns and could be reused across projects. Use your team or domain name for capabilities encoding organization-specific knowledge.
Tip
Pack names are normalized to lowercase. pack="Valdr" and pack="VALDR" both resolve to valdr.
Example: TypeScript agent with UI specialization
The problem
You have a TypeScript codebase with a custom component library. Every time you ask an agent to build UI, it:
- Uses native HTML elements instead of your components
- Ignores your design tokens
- Creates inconsistent patterns across the codebase
You keep saying “use our CustomDropdown” but it doesn’t stick across sessions.
The solution: capability layering
Base agent: Generic TypeScript capabilities
<!--<capability id="typescript.core" pack="valdr" role="core">-->
# TypeScript Core
- Use strict TypeScript with explicit return types
- Prefer composition over inheritance
- Follow ESLint rules defined in the repo
<!--</capability>-->Team overlay: UI component conventions
<!--<capability id="acme.ui.components" pack="acme" role="context">-->
# ACME UI Component Standards
## Required components
Always use our custom components instead of native HTML or third-party libraries:
| Instead of | Use |
| --- | --- |
| `<select>` | `CustomDropdown` from `@acme/ui/custom-dropdown` |
| `<input type="text">` | `TextInput` from `@acme/ui/text-input` |
| `<button>` | `Button` from `@acme/ui/button` |
| `<dialog>` | `Modal` from `@acme/ui/modal` |
## Design tokens
- Colors: import from `@acme/tokens/colors`
- Spacing: use `spacing.sm`, `spacing.md`, `spacing.lg`
- Typography: use `Text` component with `variant` prop
## Component patterns
- All form fields must use `FormField` wrapper for consistent labels/errors
- Modals must include `aria-labelledby` pointing to the title
- Loading states use `Skeleton` component, not spinners
<!--</capability>-->The result
When you bind both capabilities to your TypeScript agent:
capabilities:
- typescript.core # Generic foundation
- acme.ui.components # Team-specific overlayThe agent now always knows to use CustomDropdown. No repeated prompting. No review corrections. The institutional knowledge is baked in.
What to encode in team capabilities
Codebase conventions
- Component libraries and when to use each component
- API patterns (REST conventions, error handling, pagination)
- File/folder structure expectations
- Naming conventions (variables, files, routes)
Architectural decisions
- State management patterns (Redux, Zustand, context usage)
- Data fetching strategies (React Query, SWR, custom hooks)
- Error boundary placement
- Feature flag conventions
Quality standards
- Testing requirements specific to your stack
- Accessibility standards beyond WCAG defaults
- Performance budgets and optimization patterns
- Security practices for your domain
Tribal knowledge
- “We tried X approach and it failed because Y”
- “Always check Z before deploying to production”
- “The legacy module requires special handling”
- Undocumented but critical integration points
Capability examples by team type
Frontend team
<!--<capability id="acme.frontend.react" pack="acme" role="context">-->
# ACME React Conventions
## State management
- Global state: Zustand stores in `src/stores/`
- Server state: React Query with custom hooks in `src/hooks/queries/`
- Form state: React Hook Form with Zod validation
## Component structure
- Colocate styles with components using CSS modules
- Props interfaces exported from component file
- Storybook stories required for all shared components
## Testing
- Unit tests for hooks and utilities
- Integration tests for user flows using Testing Library
- E2E critical paths in Playwright
<!--</capability>-->Backend team
<!--<capability id="acme.backend.api" pack="acme" role="context">-->
# ACME API Conventions
## Endpoint patterns
- RESTful routes: `/api/v1/{resource}/{id}`
- List endpoints return `{ data: [], meta: { total, page, limit } }`
- Errors return `{ error: { code, message, details } }`
## Database access
- All queries through repository pattern
- Use transactions for multi-table writes
- Soft deletes with `deleted_at` timestamp
## Authentication
- JWT validation middleware on all `/api/` routes
- Rate limiting: 100 req/min for authenticated, 20 for anonymous
- Audit logging for all write operations
<!--</capability>-->Platform/DevOps team
<!--<capability id="acme.platform.infra" pack="acme" role="context">-->
# ACME Infrastructure Conventions
## Deployment
- All services deploy via GitHub Actions
- Staging auto-deploys on merge to `main`
- Production requires manual approval + tag
## Observability
- Structured logging with correlation IDs
- Metrics exposed on `/metrics` for Prometheus
- Distributed tracing with OpenTelemetry
## Secrets
- Never hardcode secrets; use environment variables
- Secrets stored in AWS Secrets Manager
- Rotate credentials quarterly
<!--</capability>-->Building your first team capability
1. Identify repeated instructions
Start with pain points:
- What do you keep telling the AI?
- What mistakes do reviewers catch repeatedly?
- What context does every new team member need?
2. Write the capability prompt
Keep it focused. One capability = one domain. Use tables for quick reference, prose for nuance. Don’t try to encode everything at once—capabilities work best when they capture high-frequency, high-impact rules.
<!--<capability id="yourteam.domain.focus" pack="yourteam" role="context">-->
# Your Team Domain Focus
## Quick reference
| Rule | Implementation |
| --- | --- |
| ... | ... |
## Detailed guidance
...
<!--</capability>-->3. Register and bind
Register the capability in PM MCP, then bind it to relevant agents:
# Agent charter binds capabilities
capabilities:
- typescript.core # Generic
- review.code # Generic
- yourteam.domain.focus # Team-specific4. Iterate based on results
After a few sessions:
- Did the agent follow the new rules?
- Were there edge cases you didn’t cover?
- Does the capability need to be split or combined?
Capabilities evolve with your team’s knowledge.
Why this matters
| Without team capabilities | With team capabilities |
|---|---|
| Repeat context every session | Context is always present |
| Inconsistent outputs across agents | Uniform adherence to standards |
| Review catches avoidable mistakes | Mistakes prevented at generation |
| New team members need onboarding | Knowledge is encoded and enforced |
| Tribal knowledge lives in heads | Tribal knowledge lives in prompts |
The compound effect
Every capability you encode:
- Saves time on every future session
- Reduces review burden
- Improves consistency
- Captures knowledge that might otherwise be lost
Over time, your team builds a capability library that makes agents genuinely productive—not just impressive demos.
Verified, not just declared
When team capabilities use structured tags, Valdr’s scoring system can verify that agents actually followed your conventions. You don’t just hope the agent used your custom dropdown—you can prove it did.
Sharing and evolving capabilities
Within your team
- Store capabilities in your repo (
agents/prompts/team/) - Version alongside code
- Review changes like any other PR
Across teams
- Extract common patterns into shared packs
- Publish to internal capability registry
- Let other teams benefit from your knowledge
Contributing to the community
When you’ve battle-tested a capability:
- Generalize team-specific details
- Contribute to the open-source Valdr Packs repository
- Help others skip the learning curve you already climbed
Getting started
- Audit your last 10 agent sessions — what context did you repeat?
- Pick one high-frequency pain point — start small
- Write a focused capability — 50-200 words is often enough
- Bind it to your agent and test — does behavior improve?
- Iterate and expand — build your capability library over time
The goal isn’t to encode everything on day one. It’s to capture knowledge incrementally, turning your team’s expertise into agent infrastructure.
The goal isn’t to make agents smarter—it’s to make them aligned with how you already work.
Product view
Read Team Capabilities for AI Agents for the platform-level positioning behind this feature.