Skip to main content

AI Agent Documentation Standards

Applies to: New documentation, updates, and release notes. These standards ensure all BeatPass documentation is factual, accurate, and based on verified information—not assumptions.

Core Principles

  1. Verify existence first — Search codebase to confirm feature exists before documenting
  2. Never assume — Always verify before writing
  3. Never hallucinate — If you can’t verify it, don’t document it
  4. Be specific — Use exact UI labels, button text, and navigation paths
  5. Stay current — Database configurations change; always verify current values
  6. Stay non-technical — Help docs are for users, not developers
  7. Font Awesome 6 icons only — The icon library is fontawesome. Never use Lucide names.
  8. WCAG AA colors — All theme colors must pass 4.5:1 contrast ratio minimum.
  9. Use reusable snippets — Import from /snippets/ for repeated content (fees, warnings, support sections). Never duplicate snippet content inline.

Audience & Location Rules

CRITICAL DISTINCTION:
LocationAudienceContent Type
Documentation/help/End usersNon-technical, user actions
Documentation/developers/DevelopersTechnical, code, API details
Documentation/help/release-notes/End usersNon-technical, benefits
Documentation/help/ requirements:
  • NO code examples
  • NO API endpoints
  • NO database references
  • NO technical architecture
  • YES user actions
  • YES plain English
  • YES benefits and outcomes
When technical details are needed:
  • Reference /developers/ docs: “See API Docs for technical details”
  • Keep main content focused on what users do, not how it works

Universal Pre-Documentation Checklist

Step 1: Feature Existence Verification

NEVER document a feature without verifying it exists in the codebase.

Required Searches

# Search for UI components
grep -r "featureName" resources/client/ --include="*.tsx" --include="*.ts"

# Search for backend logic
grep -r "featureName" app/ --include="*.php"

# Search for routes
grep -r "featureName" routes/ --include="*.php"

# Search for database migrations
grep -r "featureName" database/migrations/ --include="*.php"

What to Verify

  • UI components implementing the feature exist
  • Backend controllers/services powering it exist
  • Database tables/columns for data storage exist
  • Routes exposing the feature exist
If you cannot find:
  • No UI components implementing it
  • No backend controllers handling it
  • No database tables storing it
  • No routes exposing it
Then the feature DOES NOT EXIST. Do not document it based on assumptions.

Step 2: UI Navigation & Labels Verification

Source: Frontend codebase (resources/client/, common/resources/client/)

Key Files to Check

Feature AreaKey Files
Navigationcommon/resources/client/ui/navigation/navbar/navbar-auth-menu.tsx
Account Settingscommon/resources/client/auth/ui/account-settings/account-settings-sidenav.tsx
Billingcommon/resources/client/billing/billing-page/panels/*.tsx
Producer Dashboardresources/client/web-player/backstage/*.tsx

Verification Commands

# Get profile dropdown menu items (auth-dropdown)
php artisan tinker --execute="$menus = json_decode(\DB::table('settings')->where('name', 'menus')->first()->value, true); foreach($menus as $menu) { if (in_array('auth-dropdown', $menu['positions'] ?? [])) { foreach($menu['items'] as $item) { echo $item['label'] . ' → ' . $item['action'] . PHP_EOL; } } }"

# List all menu positions
php artisan tinker --execute="$menus = json_decode(\DB::table('settings')->where('name', 'menus')->first()->value, true); foreach($menus as $m) { echo $m['name'] . ': ' . implode(', ', $m['positions'] ?? []) . PHP_EOL; }"

Verified UI Elements Reference

Profile Menu (Auth Dropdown)
Menu ItemRouteNotes
Edit Profile/account-settingsMain account settings
Management/adminRequires admin permission
Backstage/producer-dashboardRequires producer status
Billing/billingAlways visible (hardcoded)
Account Settings Page
Sidenav LabelPanel TitleKey Buttons
Account details(varies)Save
Social login(varies)Connect, Disconnect
PasswordUpdate passwordUpdate password
Two factor authenticationTwo factor authenticationEnable, Disable
Active sessionsActive sessionsLogout other sessions
Location and language(varies)Save
Developers(varies)Create, Delete
Delete accountDanger zoneDelete account
⚠️ Critical: Sidenav labels differ from panel titles. Use sidenav labels when directing users to scroll, panel titles when describing the section. Billing Page
SectionElements
Current plan (Active)Plan name, price, “Renews on [date]”, Change plan, Cancel plan
Current plan (Cancelled)Plan name, “Access ends [date]”, Renew plan
Scheduled Plan ChangePending plan, “Takes effect on [date]”, Cancel scheduled change
Payment methodCard brand, last 4 digits, expiration, Update
Payment historyInvoice list with date, amount, status

Step 3: Database Configuration Verification

Contact & Company

# Contact email
php artisan tinker --execute="echo settings('mail.contact_page_address');"
Current: contact@beatpass.ca

Subscription Plans

# Products (plans)
php artisan tinker --execute="echo json_encode(\DB::table('products')->select('id', 'name', 'free')->get()->toArray(), JSON_PRETTY_PRINT);"

# Prices (billing intervals)
php artisan tinker --execute="echo json_encode(\DB::table('prices')->select('id', 'product_id', 'amount', 'currency', 'interval', 'interval_count')->get()->toArray(), JSON_PRETTY_PRINT);"
Current verified plans:
PlanPriceInterval
ExplorerFree-
Classic$29 CADMonthly
Plus$45 CADMonthly
Pro$59 CADMonthly
⚠️ Important: No yearly plans exist. Do not document yearly billing.

Upload Formats

# Blocked extensions
php artisan tinker --execute="echo \DB::table('settings')->where('name', 'uploads.blocked_extensions')->first()->value;"

# Allowed extensions
php artisan tinker --execute="echo \DB::table('settings')->where('name', 'uploads.allowed_extensions')->first()->value;"
Current: MP3 and ZIP are blocked. Only WAV, FLAC, AIFF are accepted for uploads.

Revenue Model

# Check payout configuration
php artisan tinker --execute="echo json_encode(config('beatpass.payouts'), JSON_PRETTY_PRINT);"
Current: Producers keep 100% of their set price. 12% + $3 CAD flat fee is added ON TOP for buyers.

Writing Standards (All Documentation)

Language & Tone

  • Non-technical — Write for users, not developers
  • Clear — Use simple, direct language
  • Actionable — Guide users step-by-step
  • Accurate — Every claim must be verifiable

Avoiding Technical Jargon

NEVER include internal system terminology:
Avoid (Technical)Use Instead (User-Friendly)
music.create permissionAbility to upload tracks
admin.access permissionAdmin access
Database column namesPlain English description
Internal IDs or slugsFeature names
Code variablesHuman-readable labels
Route paths like /api/v1/...”the API” or feature name
Model names (e.g., Artist, Track)“producer profile”, “beat”
Rule: If a user cannot see or interact with the term in the UI, do not include it in documentation. Tooltip rule: When a term IS user-facing but may be unfamiliar (e.g., “contribution value”, “tokens”, “Stripe Express”), wrap the first occurrence per page in a <Tooltip> to provide an inline definition. See Mintlify Reference — Tooltips for syntax and rules. Additional rule for /help/ documentation: If it’s technical enough for developers, it belongs in /developers/ — not in /help/.
Use in /help/Move to /developers/
“Your payment is processed”Implementation details
”Upload your track”Code examples
”Click BillingAPI endpoint paths
”You’ll receive an email”Database schemas
”See API docsTechnical architecture

UI References

Always use exact labels:
Element TypeHow to Reference
ButtonsBold: **Change plan**
Menu itemsBold: **Billing**
SectionsBold: **Current plan** section
Page namesTitle case: Billing page
Click your **profile avatar** in the top navigation bar, then select **Billing** from the menu.
NOT:
Go to Settings → Subscription

Common Mistakes to Avoid

❌ Don’t Do This

  1. Document features that don’t exist
    • Wrong: Creating docs for “demo downloads”, “watermarked previews”
    • Fix: Search codebase FIRST
  2. Trust backend config without verifying frontend
    • Wrong: “Legendary achievements don’t exist” (config says rarity 5)
    • Fix: Check frontend code for actual display mapping
  3. Assume navigation paths
    • Wrong: “Go to Settings → Subscription”
    • Fix: Verify actual menu structure
  4. Invent menu item names
    • Wrong: “Select Settings from the menu”
    • Fix: Check database for actual labels
  5. Use generic section names
    • Wrong: “the Localization section”
    • Fix: Use exact labels: “Location and language”
  6. Confuse sidenav with panel titles
    • Wrong: “the Delete Account section” (panel is “Danger zone”)
    • Fix: Read both sidenav and panel component files
  7. Use inconsistent capitalization
    • Wrong: “This Device”, “Log Out Other Devices”
    • Fix: “This device”, “Logout other sessions”
  8. Document features without verification
    • Wrong: “Select monthly or yearly billing”
    • Fix: Query database to confirm intervals
  9. Use generic button names
    • Wrong: “Click the Cancel button”
    • Fix: Use exact text: “Click Cancel plan
  10. Use technical terminology
    • Wrong: “You need the music.create permission”
    • Fix: “You need the ability to upload tracks”

Universal Quality Checklist

Before submitting ANY documentation:

Content Verification

  • Feature existence verified via codebase search
  • UI elements verified in actual components
  • Database values verified via queries (if applicable)
  • Navigation paths verified
  • No hallucinated features
  • No assumed navigation
  • No invented labels

Writing Quality

  • All claims verifiable
  • No technical jargon users don’t see
  • Exact UI labels used and bolded
  • User-focused language (“you”, not “we”)
  • Active voice (present tense for features, past for fixes)
  • Specific numbers instead of vague terms

Reusable Snippets

  • Snippets checked — applicable snippets from /snippets/ imported and used
  • No inline duplication — content that exists as a snippet is not written inline
  • Import paths absolute — all snippet imports use /snippets/... (not relative paths)
  • Import names PascalCase — e.g., PlatformFee, NeedHelp, ApiInviteOnly
  • Imports after frontmatter — import statements go between --- and first content

Technical Requirements

  • Frontmatter complete with all required fields
  • Internal doc links use root-relative paths (/help/path not ../path)
  • App page links use full URLs (https://open.beatpass.ca/login not /login)
  • All icon names verified against Font Awesome 6 (not Lucide)
  • All Card href targets verified (.mdx file exists + in docs.json nav)
  • Mintlify components used correctly
  • Tooltips added for domain jargon and technical terms (first occurrence per page)
  • No duplicate tooltips for the same term on the same page
  • No emoji (use Mintlify icons only)
  • Proper Markdown/MDX syntax
  • If colors changed in docs.json: WCAG AA verified via mint a11y

Cross-References

  • Related documentation linked
  • Parent/child pages connected
  • No orphaned content

Documentation Folder Structure

Documentation/
├── snippets/                        # Reusable content (auto-hidden by Mintlify)
│   ├── callouts/                    # Info/Note/Warning callout blocks
│   │   ├── platform-fee.mdx
│   │   ├── platform-fee-note.mdx
│   │   ├── subscription-required.mdx
│   │   └── stripe-connect-required.mdx
│   ├── warnings/                    # Warning blocks
│   │   ├── api-invite-only.mdx
│   │   ├── no-public-sandbox.mdx
│   │   └── producer-only.mdx
│   ├── sections/                    # Reusable page sections
│   │   ├── need-help.mdx
│   │   ├── still-need-help.mdx
│   │   ├── support-contact.mdx
│   │   ├── api-getting-help.mdx
│   │   ├── release-feedback.mdx     # Release notes feedback footer
│   │   └── security-trust.mdx       # Security trust closing block
│   ├── developer/                   # Developer-specific blocks
│   │   ├── bearer-auth-example.mdx
│   │   ├── http-status-codes.mdx
│   │   └── rate-limit-headers.mdx
│   └── data/                        # Exported constants and data tables
│       ├── platform-constants.mdx
│       └── plan-comparison-table.mdx
├── help/
│   ├── index.mdx                    # Main help landing
│   ├── account-settings/
│   │   ├── index.mdx                # Overview
│   │   └── [specific-pages].mdx
│   ├── billing/
│   │   ├── index.mdx
│   │   └── [specific-pages].mdx
│   ├── producer-dashboard/
│   │   ├── index.mdx
│   │   └── [specific-pages].mdx
│   └── [other-sections]/
├── developers/                      # API & developer docs
└── release-notes/
    ├── index.mdx                    # Landing page
    ├── changelog.mdx                # Unified changelog (Update components + RSS feed)
    ├── v3.0/                        # Current version
    │   ├── index.mdx                # v3.0 overview
    │   └── {version}.mdx            # Individual release pages (e.g., 3.0.8-25.mdx)
    └── v2.x/                        # Legacy version
        ├── index.mdx
        └── {version}.mdx
Release notes workflow: Every release requires both an individual page in release-notes/v3.0/ AND an Update component entry at the top of release-notes/changelog.mdx. See template.mdx for the complete workflow.

Quick Verification Commands

# Search for a feature in UI
grep -r "featureName" resources/client/ --include="*.tsx"

# Search for backend controller
grep -r "featureName" app/Http/Controllers/ --include="*.php"

# Check database for settings
php artisan tinker --execute="echo settings('setting.key');"

# Get menu items
php artisan tinker --execute="$menus = json_decode(\DB::table('settings')->where('name', 'menus')->first()->value, true); foreach($menus as $menu) { if (in_array('auth-dropdown', $menu['positions'] ?? [])) { foreach($menu['items'] as $item) { echo $item['label'] . PHP_EOL; } } }"

# Check plans
php artisan tinker --execute="echo json_encode(\DB::table('products')->get(['name', 'free'])->toArray());"

Critical Reminder: The most damaging documentation errors come from:
  1. Documenting features that don’t exist
  2. Using wrong navigation paths
  3. Trusting backend config without frontend verification
  4. Using Lucide icon names instead of Font Awesome 6 — icons silently fail to render
  5. Using bare app paths (/login) instead of full URLs — resolves as doc paths and 404s
  6. Changing theme colors without WCAG AA verification — fails accessibility audits
Always verify icons, links, colors, AND content. Always.

Last modified on February 7, 2026