audit-langfuse-llm
Skill9 starsChanged 43 days agoMITView on GitHub
PDCA quality audit of LLM features: traces, prompts, costs, evals, grounding, hallucination. Use for "audit LLM quality", "check Langfuse", or "audit AI costs". Jailbreaks → audit-llm-security. Cost caps → plan-llm-cost-guardrails.
- Reads credentials
1 other project uses a version of this.
Adopted by
Most recently taken up by
- kensaurus/skillsword for word, first seen Oct 1, 2026
Other versions1 project uses a version of this.
Word for word · 1
- kensaurus/skills★ 9100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository165 other files it gives its agents.
- AGENTS.mdAGENTS.md
- .cursor/rules/approved-plan-execution.mdcCursor rule
- .cursor/rules/skill-workflows.mdcCursor rule
- .cursor/rules/verification-before-completion.mdcCursor rule
- llms.txtllms.txt
- audit-accessibilitySkill
- audit-agent-speedSkill
- audit-analyticsSkill
- audit-auth-flowsSkill
- audit-backend-architectureSkill
- audit-bundle-sizeSkill
- audit-cicdSkill
- audit-codemod-safetySkill
- audit-code-qualitySkill
- audit-code-reviewSkill
- audit-db-schemaSkill
- audit-doctrineSkill
- audit-env-paritySkill
- audit-fe-apiSkill
- audit-gate-logicSkill
- audit-i18nSkill
- audit-infra-costSkill
- audit-llm-securitySkill
- audit-monetization-iapSkill
- audit-payment-systemSkill
- audit-performanceSkill
- audit-realworldSkill
- audit-registry-listingSkill
- audit-resilienceSkill
- audit-responsiveSkill
- audit-securitySkill
- audit-skill-conflictsSkill
- audit-ui-statesSkill
- audit-uiux-design-systemSkill
- audit-ux-journeysSkill
- audit-uxSkill
- backend-db-performanceSkill
- backend-error-handlingSkill
- backend-observabilitySkill
- backend-patternsSkill
- backend-realtimeSkill
- burndown-fullSkill
- complete-everythingSkill
- data-pipelineSkill
- data-visualizationSkill
- debug-errorSkill
- debug-fe-be-integrationSkill
- debug-sentry-monitorSkill
- deploy-npmSkill
- deploy-verifySkill
- design-apiSkill
- design-canvasSkill
- design-emailSkill
- design-frontendSkill
- design-generative-artSkill
- design-mobile-firstSkill
- design-motionSkill
- design-prdSkill
- design-systemSkill
- design-themeSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
7 rules. About 0 are common, 7 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 48
Search for environment variables and config files (in order):
- Distinctive: line 206
If prompts are hardcoded in source code instead of managed via Langfuse:
- Distinctive: line 247
No scores at all → no quality feedback loop
- Distinctive: line 248
Only manual scores, no automated → quality is not continuously monitored
- Distinctive: line 249
All scores are identical → eval criteria too loose or rubric too vague
- Distinctive: line 295
After triggering each feature, wait 5-10 seconds, then verify the trace landed:
- Distinctive: line 327
If the project stores AI outputs in the database:
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Langfuse LLM Quality Audit
Degree of freedom: MIXED — Phases 0–1, 4 [HIGH freedom]; Phases 2–3
CLI traces and playwright [LOW freedom — run exactly]. Read
protocol-browser-anti-stall before any browser step. Phase 0 first: Phases 2–3 verify the feature map it produces.
How to reason
- Observe — quote the trace, prompt version, token/cost, or live output
- Interpret — is quality, cost, or the pipeline actually broken?
- Classify — missing-trace / prompt / cost / eval / grounding / correct
- Severity — pipeline break or untraced prod feature = P0; cost/eval gap = P1
Worked example
Observe: after Playwright chat,
langfuse-cli api traces listshows no new row;app/api/chat/route.tscallsopenai.chatwith no Langfuse wrap. Interpret: the live path is uninstrumented — the static map was wrong. Classify: missing instrumentation (pipeline break). Severity: P0 — prod chat is invisible. Finding: chat | P0 | no trace after live send | wrap the SDK call.
Self-critique before reporting [LOW freedom — do not skip]
- Concrete numbers — model + $/call or tokens, not "costs seem high"
- Live, not static — trigger the feature; missing post-trigger trace = P0
- Severity justified — P0 = pipeline break or untraced user-facing call
- Right owner — jailbreak/OWASP →
audit-llm-security; token caps →plan-llm-cost-guardrails - Keys stay in env — report host + presence, never secret values
Phase 0: Auto-Detect Langfuse Integration
0a. Find Langfuse Configuration
Search for environment variables and config files (in order):
.env,.env.local,.env.production— look forLANGFUSE_PUBLIC_KEY,LANGFUSE_SECRET_KEY,LANGFUSE_BASE_URL,LANGFUSE_HOSTlangfuse.config.ts,langfuse.config.js— dedicated config filesinstrumentation.ts/instrumentation.js— Next.js instrumentation with Langfuse- Supabase Edge Functions —
Glob("**/supabase/functions/**/index.ts")and search forLangfuseimports
Grep(pattern: "LANGFUSE_PUBLIC_KEY|LANGFUSE_SECRET_KEY|LANGFUSE_BASE_URL|LANGFUSE_HOST", glob: ".env*")
Grep(pattern: "langfuse|Langfuse|@langfuse", glob: "*.{ts,js,tsx,jsx,py,rb,go}")Record: LANGFUSE_HOST, public-key present (never the secret), import sites, CLI env ready.
0b. Detect LLM Framework and Provider
Grep(pattern: "openai|OpenAI|anthropic|Anthropic|@google/generative-ai|gemini|cohere|mistral|groq|together|replicate", glob: "*.{ts,js,py}")
Grep(pattern: "langchain|LangChain|@langchain|vercel/ai|ai/core|createOpenAI|createAnthropic", glob: "*.{ts,js,py}")Record: providers, frameworks, and the exact model ID strings in use, with each one's tier (frontier, mid, or small).
0c. Map AI Features
SemanticSearch(query: "Where are LLM/AI features called in the codebase?", target_directories: [])Build a feature map:
| Feature | File(s) | Provider | Model | Traced? |
| e.g. Chat | app/api/chat/route.ts | OpenAI | <model id> (frontier) | Yes |
0d. Detect Eval and Prompt Management Setup
Grep(pattern: "createScore|langfuse.score|annotation|eval|judge|dataset", glob: "*.{ts,js,py}")
Grep(pattern: "getPrompt|langfuse.prompt|fetchPrompt|compilePrompt", glob: "*.{ts,js,py}")Record: prompt source (Langfuse vs hardcoded vs config), eval setup, version/label.
Phase 1: Research LLM Best Practices
1a. Firecrawl Research
firecrawl:firecrawl_search
{
"query": "LLM observability best practices production monitoring [current year]",
"limit": 5
}firecrawl:firecrawl_search
{
"query": "prompt engineering evaluation scoring hallucination detection [current year]",
"limit": 5
}firecrawl:firecrawl_search
{
"query": "LLM cost optimization token usage model selection production [current year]",
"limit": 5
}Scrape the top 2–3 results:
firecrawl:firecrawl_scrape
{
"url": "<BEST_RESULT_URL>",
"formats": ["markdown"]
}1b. Langfuse Documentation
Langfuse docs for the detected setup:
firecrawl:firecrawl_search
{
"query": "site:langfuse.com docs tracing prompts evaluation scores",
"limit": 5
}1c. Context7 for LLM Framework Docs
context7:resolve-library-id
{
"libraryName": "<DETECTED_FRAMEWORK e.g. langchain or vercel-ai>"
}context7:query-docs
{
"libraryId": "<RESOLVED_ID>",
"query": "Langfuse integration tracing observability"
}Phase 2: Audit via Langfuse CLI
Shell + Langfuse CLI. Require LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY in the env.
2a. Trace Completeness
npx langfuse-cli api traces list --limit 50For each AI feature identified in Phase 0c, verify:
- Trace exists with a matching name/metadata
- Trace has spans/generations (not just a top-level trace with no children)
- Trace includes input/output (not empty)
- Trace has proper metadata (userId, sessionId, tags)
- Latency is recorded
Red flags:
- AI feature exists in code but produces no traces → missing instrumentation
- Traces exist but have no generations → incomplete tracing (wrapper created but LLM call not captured)
- Traces with empty output → output not being captured (fire-and-forget pattern)
2b. Prompt Quality Audit
npx langfuse-cli api prompts listFor each prompt:
npx langfuse-cli api prompts get --name "<PROMPT_NAME>"Evaluate:
- Versioning: Are prompts versioned (v1, v2, v3+) or stuck at v1?
- Labels: Is there a
productionlabel? Are therestaging/experimentlabels for A/B testing? - System message quality: Clear role definition, constraints, output format instructions?
- Few-shot examples: Does the prompt include examples for complex tasks?
- Guardrails: Does the prompt include instructions to refuse off-topic/harmful requests?
- Variables: Are dynamic parts properly templated with
{{variables}}not string concatenation? - Freshness: When was the prompt last updated? Stale prompts may not use newer model capabilities.
If prompts are hardcoded in source code instead of managed via Langfuse:
Grep(pattern: "You are|system.*message|systemPrompt|SYSTEM_PROMPT", glob: "*.{ts,js,py}")Flag hardcoded prompts as a finding — they should be migrated to Langfuse for versioning and A/B testing.
2c. Model and Cost Efficiency
From trace data, analyze:
npx langfuse-cli api traces list --limit 50Build a cost table from generation details (model, tokens, latency, cost):
| Feature | Model | Avg Input Tokens | Avg Output Tokens | Avg Latency | Est. Cost/Call |
Red flags:
- Frontier-tier model used for simple classification/extraction → recommend the provider's small tier
- High input token counts → check for unnecessary context stuffing
- Output tokens much larger than needed → add an output-token cap or response format constraints
- High latency on user-facing features → consider streaming, caching, or smaller model
- Same content sent repeatedly → implement semantic caching
2d. Eval Score Health
npx langfuse-cli api scores list --limit 50Evaluate:
- Score existence: Are evals running at all?
- Score types: What's being measured (relevance, faithfulness, toxicity, custom)?
- Score distribution: Are scores clustered (all 1.0 = useless eval) or distributed?
- Annotation queues: Are humans reviewing AI outputs?
- Judge LLM: If using LLM-as-judge, which model? Is the judge prompt well-designed?
Red flags:
- No scores at all → no quality feedback loop
- Only manual scores, no automated → quality is not continuously monitored
- All scores are identical → eval criteria too loose or rubric too vague
- Scores declining over time → model degradation or prompt drift
2e. Session and User Attribution
npx langfuse-cli api sessions list --limit 20Verify:
- Sessions group related interactions (multi-turn conversations have one session ID)
- User IDs are attributed (not all anonymous)
- Session metadata is useful (page, feature, user segment)
2f. Dataset Health
npx langfuse-cli api datasets listEvaluate:
- Datasets exist: Are there regression test datasets?
- Dataset freshness: When were items last added?
- Coverage: Do datasets cover all AI features or just one?
- Expected outputs: Do dataset items have expected outputs for automated comparison?
Phase 3: Live Verification
3a. Trigger AI Features via Playwright
For each Phase 0c feature, trigger it live. Timeouts 15s; sleep 2 → snapshot (not one long block).
PW="npx --yes @playwright/cli@latest"
$PW -s=langfuse-audit open --headed "<APP_URL>"Navigate to the feature, interact with it (fill form, click button, send message), and capture:
- The AI-generated response (via
snapshot) - Console messages (via
console) — look for errors - Network requests (via
requests) — look for failed API calls
3b. Verify Trace Pipeline
After triggering each feature, wait 5-10 seconds, then verify the trace landed:
npx langfuse-cli api traces list --limit 5Check:
- New trace appeared with correct name
- Trace has generations with model and token data
- Trace latency matches observed UX latency
- Input/output captured correctly
3c. Cross-Check with Sentry
sentry:search_issues
{
"organizationSlug": "<ORG_SLUG>",
"projectSlugOrId": "<PROJECT_SLUG>",
"query": "is:unresolved ai OR llm OR openai OR anthropic OR langfuse OR completion OR embedding"
}Check for:
- LLM timeout errors
- Rate limiting (429) errors
- Token limit exceeded errors
- Langfuse SDK errors (failed to send trace)
- JSON parse errors on LLM responses
3d. Cross-Check with Supabase (if AI results stored in DB)
If the project stores AI outputs in the database:
supabase:list_tables
{
"schemas": ["public"]
}Find tables that store AI outputs and verify data landed:
supabase:execute_sql
{
"query": "SELECT id, created_at, <ai_output_column> FROM <table> ORDER BY created_at DESC LIMIT 5"
}3e. Grounding / Hallucination Check
For features where the AI should reference source data (RAG, summarization, data extraction):
- Get the source data from the database (Supabase
execute_sql) - Trigger the AI feature via Playwright
- Compare the AI output against the source data
Red flags:
- AI mentions facts not in the source data → hallucination
- AI omits critical facts from the source data → incomplete extraction
- AI contradicts the source data → grounding failure
- AI generates plausible but wrong numbers → numerical hallucination
Phase 4: Report
Generate a structured report with the following sections.
═══════════════════════════════════════════════════════
LANGFUSE LLM QUALITY AUDIT REPORT
Project: <PROJECT_NAME>
Date: <DATE>
Langfuse Host: <HOST_URL>
═══════════════════════════════════════════════════════
## 1. TRACE COVERAGE
| Feature | Traced? | Generations? | Input/Output? | Metadata? | Status |
|---------|---------|-------------|---------------|-----------|--------|
| ... | ... | ... | ... | ... | ✅/❌ |
Coverage: X/Y features traced (Z%)
Missing instrumentation: [list features with no traces]
## 2. PROMPT QUALITY
| Prompt | Version | Label | System Msg | Few-Shot | Guardrails | Variables | Score |
|--------|---------|-------|------------|----------|------------|-----------|-------|
| ... | ... | ... | ... | ... | ... | ... | A-F |
Hardcoded prompts found: [list files with inline prompts]
Recommendations: [specific improvements per prompt]
## 3. COST EFFICIENCY
| Feature | Model | Avg Tokens (in/out) | Avg Latency | Est. Cost/Call | Recommendation |
|---------|-------|---------------------|-------------|----------------|----------------|
| ... | ... | ... | ... | ... | ... |
Monthly estimate: $X (at current usage rate)
Savings opportunity: $Y (by implementing recommendations)
## 4. EVAL HEALTH
| Metric | Status | Details |
|------------------|-----------|----------------------------------|
| Automated evals | ✅/❌ | [count and types] |
| Manual reviews | ✅/❌ | [annotation queue status] |
| Score distribution| ✅/❌ | [healthy spread vs clustered] |
| Datasets | ✅/❌ | [count, freshness, coverage] |
| Regression tests | ✅/❌ | [dataset run frequency] |
## 5. PIPELINE INTEGRITY
| Step | Status | Evidence |
|-------------------------|--------|-------------------------------------|
| FE triggers AI feature | ✅/❌ | [Playwright observation] |
| API receives request | ✅/❌ | [network request captured] |
| LLM call executes | ✅/❌ | [trace generation exists] |
| Trace lands in Langfuse | ✅/❌ | [CLI verification] |
| Result stored in DB | ✅/❌ | [Supabase query result] |
| Result displayed in FE | ✅/❌ | [Playwright snapshot] |
| Eval score recorded | ✅/❌ | [score attached to trace] |
## 6. GROUNDING & HALLUCINATION
| Feature | Source Data | AI Output Match | Hallucinations | Score |
|---------|-------------|-----------------|----------------|-------|
| ... | ... | ... | ... | A-F |
## 7. SENTRY LLM ERRORS
| Issue | Error Type | Events | Impact | Fix Needed |
|-------|------------|--------|--------|------------|
| ... | ... | ... | ... | ... |
## 8. CRITICAL FINDINGS (Action Required)
P0 — Must fix immediately:
1. [finding with evidence]
P1 — Should fix this sprint:
1. [finding with evidence]
P2 — Improvement opportunity:
1. [finding with evidence]
## 9. RECOMMENDATIONS
| # | Category | Current State | Recommended State | Effort | Impact |
|---|----------|---------------|-------------------|--------|--------|
| 1 | ... | ... | ... | S/M/L | S/M/L |
## 10. PDCA IMPROVEMENT RESULTS
| Prompt | Baseline Score | Iter 1 Score | Iter 2 Score | Iter 3 Score | Final Score | Action Taken |
|--------|---------------|-------------|-------------|-------------|-------------|--------------|
| ... | ... | ... | ... | ... | ... | Promoted / Rolled back / Needs manual |Further reading
- Improvement Details and more
Related
audit-llm-security— OWASP LLM Top 10 (injection, agency, leaks) — not quality/evalsplan-llm-cost-guardrails— token budgets and quota abuseplan-privacy-compliance— PII in tracesbackend-observability/debug-sentry-monitor— non-LLM telemetry
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

