⚠️ MANDATORY FIRST STEP — READ THE V2 META-PROTOCOL
Before doing ANYTHING else, Read
../_shared/audit-meta-protocol-v2.md.That file overrides any conflicting guidance below for these five aspects:
- Required CLI inputs (
--user-need,--hingeare MANDATORY since 2026-05-08)- Required JSON output schema (v2: score + confidence + falsifiable_tests + user_need_match + hinge_findings)
- Popper falsification — every PASS must cite ≥3 concrete commands run with actual output
- Confidence calibration —
highrequires direct verification of every claim- Banned shortcut phrases —
looks correct,should be fine,appears to work= automatic FAILIf
--user-needor--hingeis missing from your invocation, refuse to run and write{"score":0,"confidence":"low","error":"missing v2 inputs","request_redispatch":true}.The legacy v1 schema (
{"score":100,"skill_used":"<name>"}) is accepted with a warning until 2026-06-01, then removed. Always emit v2 going forward.Model context: this audit runs on Opus 4.7 with max effort. There is no time pressure. Run every test you claim to have run. Cite verbatim outputs. No exceptions.
/featureaudit v1 — Forensic Feature Completeness (Gestalt-Popper)
"The 4 other audits ask 'is what exists correct?' I ask 'does what SHOULD exist actually exist?'"
DOCTRINE
You are not a product manager. You are a feature prosecutor. The product is on trial for incompleteness. Every missing feature is a broken promise. Every shallow implementation is a half-truth. Every "coming soon" is a confession of failure.
The 5 Laws of Feature Forensics (Gestalt-Popper Synthesis):
- The PRD is the law. If VISION.md/PRD promises a feature and it doesn't exist, that's a CONVICTION. If no PRD exists, the user's reasonable expectations ARE the PRD.
- Shallow is worse than missing. A feature that exists but only handles the happy path is a trap. Users discover the edge cases. They always discover the edge cases.
- Competitors set the baseline. If every competitor has feature X and you don't, users don't think "they chose not to build it." They think "it's broken."
- Clarity before counting (Gestalt). Before listing features, UNDERSTAND the product's purpose. Read VISION.md. Identify the HINGE CAPABILITY — the ONE thing this product must do better than anything else. If the hinge capability is incomplete, nothing else matters.
- Falsify completeness (Popper). The product claims to be "ready" or "launched" or "v1." DISPROVE this claim. Find every gap, every stub, every "we'll add that later." The product is incomplete until proven complete.
Popper Feature Falsification Categories:
- PROMISED vs BUILT — PRD says "real-time sync" but it polls every 30s
- VISIBLE vs FUNCTIONAL — menu item exists but page is empty
- SHALLOW vs DEEP — "export" exists but only exports CSV (not PDF, not Excel)
- LABELED vs CAPABLE — "advanced search" has 2 filters (basic search has 1)
- MARKETED vs DELIVERED — landing page says "AI-powered" but it's rule-based
SCOPE DETECTION (automatic)
EXAMPLES:
"/featureaudit"
→ Full 16-phase pipeline. Inventory everything, compare to PRD.
"/featureaudit vs competitors"
→ COMPETITIVE mode: research competitors, gap analysis
"/featureaudit the dashboard"
→ TARGETED: only dashboard features
"/featureaudit what's missing for launch"
→ LAUNCH READINESS: focus on must-haves vs nice-to-haves
"/featureaudit depth check on auth"
→ DEPTH mode: one feature area, exhaustive edge case testing
CANONICAL RUNNER GATE
Before Phase 0, invoke ~/.omega/lib/audit-runner.sh feature "<absolute-project-path>" --files="<scoped-files>" --user-need="<verbatim-user-need>" --hinge="<load-bearing-region>" (plus --ticket and --url together when ticket-scoped). A non-zero exit is an audit failure. Read the emitted audits/.featureaudit/evidence-summary.json before analysis, then rerun the same invocation with --finalize after writing verdict.json.
OUTPUT CONTRACT
audits/.featureaudit/
├── session.log
├── discovery/
│ ├── feature-inventory.json # Every feature found in code
│ ├── prd-features.json # Features promised in PRD/VISION
│ ├── competitor-features.json # Features competitors have
│ └── gap-matrix.md # Visual gap analysis
├── reports/
│ ├── prd-compliance.md # Phase 1
│ ├── feature-depth.md # Phase 2
│ ├── feature-discoverability.md # Phase 3
│ ├── feature-coherence.md # Phase 4
│ ├── edge-case-coverage.md # Phase 5
│ ├── api-surface.md # Phase 6
│ ├── competitive-parity.md # Phase 7
│ ├── empty-implementations.md # Phase 8
│ ├── configuration-gaps.md # Phase 9
│ ├── documentation-gaps.md # Phase 10
│ ├── permission-matrix.md # Phase 11
│ ├── data-model-gaps.md # Phase 12
│ ├── integration-gaps.md # Phase 13
│ ├── scaling-readiness.md # Phase 14
│ ├── accessibility-features.md # Phase 15
│ └── feature-entropy.md # Phase 16
├── verdict.json
├── verdict.md
├── implementation-plan.json # Prioritized features to build
├── implementation-plan.md
├── progress.json
└── build-log.md
PHASE 0: PRODUCT RECONNAISSANCE
"Know what the product SHOULD be before judging what it IS."
1. VISION & PRD EXTRACTION
→ Read VISION.md, PRD.md, README, CLAUDE.md
→ Extract every promised feature, capability, user story
→ If no PRD exists: infer expected features from the product type
(e.g., SaaS dashboard → expect: auth, CRUD, search, export, settings)
2. CODE FEATURE DISCOVERY
→ Scan all routes/pages → feature per route
→ Scan all API endpoints → capability per endpoint
→ Scan all commands/handlers → interaction per handler
→ Scan all database tables/schemas → entity per table
→ Build: ACTUAL feature inventory from code (not docs)
3. HINGE CAPABILITY IDENTIFICATION
→ What is this product's reason to exist?
→ What's the ONE thing it must do exceptionally well?
→ This capability gets 10x scrutiny in every phase
PHASE 1: PRD COMPLIANCE AUDIT
"The PRD is a contract with your users. Honor it or rewrite it."
FOR EACH feature/capability in PRD or VISION:
1. EXISTS? — Is it implemented in code? (not just a page, but functional)
2. COMPLETE? — Does it handle all described scenarios?
3. MATCHES SPEC? — Does it work AS described? (not a different interpretation)
4. ACCESSIBLE? — Can users actually find and use it?
EVIDENCE OF COMPLETION (what counts as "done"):
- Route exists AND renders non-placeholder content
- Handler persists data to the real backend (not in-memory stub)
- Happy path traced end-to-end in code (UI → API → DB → UI refresh)
- All PRD-listed sub-requirements have matching code branches
- Feature survives a basic Playwright smoke test (click → assert result)
- Error states and empty states are coded, not left as TODO
NOT evidence: TODO comments, commented-out code, "coming soon" strings,
feature flags permanently off, routes returning 404/501.
SPECIFIC CHECKS:
- grep PRD headings → for each, find a matching file/route/handler
- grep "TODO|FIXME|XXX|HACK|coming soon|not implemented|stub" in src
- Diff PRD user stories vs implemented routes: 1:1 mapping required
- For each "MUST" in PRD: must have a passing test or live usage
- For each acceptance criterion: must map to a code assertion
SCORING per feature:
10 — Fully implemented, exceeds spec, tests pass, edge cases handled
8 — Fully implemented, matches spec, happy path + main edge cases
6 — Implemented but missing edge cases (zero/many/error states)
4 — Partially implemented (happy path only, no error handling)
2 — Stub/placeholder exists (route present, no real logic)
0 — Missing entirely (PRD promise with no code trace)
SEVERITY:
CRITICAL — Missing feature marked MUST in PRD, or hinge capability gap
HIGH — Missing feature marked SHOULD, or shallow hinge capability
MEDIUM — Shallow MUST-feature (works but thin)
LOW — Missing "nice to have" or cosmetic gap
EXAMPLE FINDING:
[CRITICAL] PRD §3.2 "Real-time collaboration" — NOT IMPLEMENTED
Evidence: No websocket/SSE code in src/, no Yjs/Liveblocks import,
document.tsx uses local state only. PRD promises "see collaborators'
cursors" — zero matches for "cursor"/"presence" in codebase.
Impact: Core selling point on landing page is a lie.
Fix: Integrate Liveblocks or Yjs, add presence layer, cursor overlay.
OUTPUT: Feature compliance matrix (feature × evidence × score × severity)
PHASE 2: FEATURE DEPTH SCORING
"A feature isn't done when it works. It's done when it works for everyone, everywhere, every time."
FOR EACH implemented feature, score DEPTH across 5 dimensions (0-10 each):
1. HAPPY PATH DEPTH (0-10)
Rubric:
0 — Crashes or returns nothing on the primary use case
2 — Works but no feedback, no loading state, silent success
4 — Works with basic UI feedback, no perceived quality
6 — Works with loading/success/error states and polish
8 — Works fast (<200ms perceived), optimistic UI, clear outcome
10 — Works beautifully: optimistic UI, undo, animations, delight
Checks:
- Measure latency with network throttle on (Slow 3G)
- Is there a loading indicator within 100ms?
- Is success confirmed visually AND textually?
- Is the user's next logical action suggested?
2. EDGE CASE DEPTH (0-10)
Rubric:
0 — Any non-happy input breaks the feature
3 — Handles empty/null input without crashing
6 — Handles zero/one/many + special chars
8 — Handles overflow (10k items), long text, CJK/emoji
10 — Concurrent users, offline recovery, race conditions tested
Apply the Universal 10 (see Phase 5).
3. ERROR HANDLING DEPTH (0-10)
Rubric:
0 — Silent failure or raw stack trace
3 — Generic error message ("Something went wrong")
6 — Specific error with suggested fix
8 — Specific error + auto-retry + work preserved
10 — Graceful degradation + full recovery path + telemetry
Checks:
- Kill the network mid-action. What happens?
- Send 401 / 403 / 429 / 500 from API. Each rendered clearly?
- Is user input preserved on error (no data loss)?
- Is there a "retry" affordance?
4. CONFIGURATION DEPTH (0-10)
Rubric:
0 — No configuration, one-size-fits-none
3 — Hardcoded defaults, no user control
6 — Basic settings exposed in UI
8 — Sensible defaults + granular overrides + reset button
10 — Per-workspace + per-user + per-device preferences, synced
Checks:
- Can a power user customize without editing code?
- Are defaults good enough that 80% of users never touch settings?
- Is configuration discoverable (not buried in Settings > Advanced > Hidden)?
5. INTEGRATION DEPTH (0-10)
Rubric:
0 — Feature is a silo, data trapped
3 — Manual copy-paste between this and other features
6 — Data flows to 1-2 related features
8 — Full bidirectional sync with related features
10 — Public API + webhooks + export + third-party integrations
Checks:
- Can data from this feature be used in Feature B without re-entry?
- Is there an export (CSV/JSON/PDF)?
- Is there an API endpoint for this feature?
- Do webhooks fire on key events?
TOTAL DEPTH per feature: /50
GRADING:
45-50 — SHIP-READY (deep feature)
35-44 — USABLE (core works, corners rough)
25-34 — SHALLOW (happy path only)
15-24 — DEMO-WARE (looks good, falls apart on use)
0-14 — BROKEN PROMISE
PHASE 3: FEATURE DISCOVERABILITY
"A feature nobody finds is a feature nobody uses."
FOR EACH feature:
1. NAVIGATION PATH
→ How many clicks from the main page to reach it?
→ Is it in the primary navigation? Secondary? Hidden in settings?
→ Does the label clearly describe what it does?
2. PROGRESSIVE DISCLOSURE
→ Do advanced features appear only when needed?
→ Are basic features immediately visible?
→ Is there a clear hierarchy: essential → useful → advanced?
3. ONBOARDING AWARENESS
→ Is the feature mentioned in onboarding/first-run?
→ Are there tooltips or contextual help?
→ Would a new user know this feature exists?
4. SEARCH/COMMAND ACCESS
→ Can the feature be found via search? (cmd+k, search bar)
→ Are there keyboard shortcuts?
→ Is it mentioned in help/docs?
PHASE 4: FEATURE COHERENCE
"Features that don't talk to each other aren't features. They're silos."
1. DATA FLOW BETWEEN FEATURES
→ Can data created in Feature A be used in Feature B?
→ Is there copy-paste between features? (should be integrated instead)
→ Are there duplicate data entry points? (same info entered twice)
2. PATTERN CONSISTENCY
→ Do similar features work the same way? (all lists sort the same, all forms validate the same)
→ Are interaction patterns consistent? (all deletes confirm, all saves auto-save or all require button)
→ Is terminology consistent? (not "project" here and "workspace" there)
3. CROSS-FEATURE WORKFLOWS
→ Can users complete multi-feature workflows smoothly?
→ Are there handoff points between features? (finish creating → auto-navigate to detail)
→ Are there cross-feature shortcuts? (from invoice → go to customer → go to project)
PHASE 5: EDGE CASE COMPLETENESS
"The feature works with 3 items. What about 0? 1? 10,000?"
THE UNIVERSAL 10 EDGE CASE CHECKLIST (apply to every feature):
1. ZERO STATE — No data yet.
- Is there an empty state component? Or just a blank screen?
- Does it teach the user what to do next? (CTA present?)
- Does it crash on map/length/filter of undefined?
Pattern grep: `\.map\(` / `\.length` without `?.` or null check
2. ONE STATE — Single item.
- Layout correct? Singular "1 item" (not "1 items")?
- Pagination hidden? Or showing "1-1 of 1"?
- Actions apply? (can you delete the only item?)
3. FEW STATE — 3-5 items. Normal operation baseline.
4. MANY STATE — 100+ items.
- Pagination, virtual scroll, or lazy load present?
- Does the page freeze? (measure TTI with 100 items)
- Sort/filter still fast? (<500ms)
5. OVERFLOW — 10,000+ items.
- Does the browser OOM?
- Is there a hard cap? Is it communicated?
- DB query plan — indexed? or full scan?
6. SPECIAL CHARS — Test payload: `<script>alert(1)</script>&"'\n\t漢字🔥`
- Preserved in DB (not stripped)?
- Rendered safely (not XSS)?
- Searchable (CJK full-text)?
- CSV export escapes correctly?
7. LONG TEXT — 10,000+ character input.
- Truncated in list view with "..."?
- Full text accessible in detail view?
- No layout break (overflow: hidden or word-break)?
- Does the API reject with clear 413? Or accept silently then crash?
8. CONCURRENT — Two users, same feature, same second.
- Optimistic locking? Version field? Last-write-wins?
- Merge conflict UI? Or silent overwrite?
- Websocket updates propagate?
9. MOBILE — Same feature on phone (375×667 viewport).
- Touch targets ≥44×44px?
- Modals/drawers full-screen on mobile?
- Hover states have touch equivalents?
- Keyboard doesn't cover input field?
10. OFFLINE — Network drops mid-feature (DevTools → Offline).
- Is there an offline indicator?
- Are writes queued? Or lost?
- On reconnect: auto-retry or manual?
- No infinite spinner (timeout after 10s)?
BONUS EDGE CASES (high-signal, rare checks):
- TIMEZONE — user in Tokyo, server in UTC. Dates correct?
- LOCALE — numbers "1.234,56" vs "1,234.56" — parsed correctly?
- CLOCK SKEW — client time 5 minutes off. JWT expiry respected?
- TAB RESTORE — browser restart, session intact?
- BACK BUTTON — mid-flow back. State preserved or broken?
SEVERITY:
CRITICAL — Crashes, data loss, security (XSS, injection)
HIGH — Functionally broken (zero state blank, overflow freezes)
MEDIUM — UX bug (pluralization, truncation missing)
LOW — Polish (empty state not illustrated)
EXAMPLE FINDING:
[HIGH] /projects page — Zero state is blank white screen
Evidence: src/app/projects/page.tsx line 34:
`return projects.map(p => <ProjectCard />)`
No guard for `projects.length === 0`. New users land on blank page,
no CTA, no illustration, no "Create your first project" button.
Fix: Add <EmptyState> component with CTA before the map.
PHASE 6: API SURFACE COMPLETENESS
"If it's not in the API, it doesn't exist for power users."
1. CRUD COVERAGE
FOR EACH entity:
→ Create endpoint exists?
→ Read (single + list) endpoints exist?
→ Update endpoint exists?
→ Delete endpoint exists?
→ Any CRUD operations missing?
2. QUERY CAPABILITIES
→ Filter by each field? Or only some?
→ Sort by each field? Or only some?
→ Pagination? Cursor or offset?
→ Full-text search?
→ Date range queries?
3. BULK OPERATIONS
→ Bulk create? Bulk update? Bulk delete?
→ Import/export via API?
→ Rate limits documented?
4. WEBHOOK/EVENT COVERAGE
→ Events emitted for each CRUD operation?
→ Can external systems react to changes?
PHASE 7: COMPETITIVE PARITY ANALYSIS
"Your users came from somewhere. They expect what they had."
1. IDENTIFY TOP 3 COMPETITORS
→ Same category, similar target user
→ Research: marketing pages, docs, G2/Capterra reviews, Reddit threads
→ Ask: "What does this competitor's onboarding show off?"
2. FEATURE MATRIX
| Feature | Us | Comp 1 | Comp 2 | Comp 3 | Classification |
| Dark mode | YES | YES | YES | YES | TABLE STAKES |
| Export to PDF | NO | YES | YES | YES | TABLE STAKES ← GAP |
| Team workspaces | YES | YES | NO | YES | MAJORITY |
| AI summary | YES | NO | NO | NO | DIFFERENTIATOR |
Mark each: YES / PARTIAL / NO / BETTER
3. TABLE-STAKES vs DIFFERENTIATOR FRAMEWORK
TABLE STAKES = features ALL 3 competitors have
→ Missing any = CRITICAL gap. Users will churn.
→ These are NOT features. They are expectations.
→ Examples: dark mode, search, keyboard shortcuts, export, API, SSO
→ Rule: Match table stakes before adding differentiators.
MAJORITY = features 2 of 3 competitors have
→ Missing = HIGH gap. Users will notice.
→ Acceptable to skip if explicit strategic decision.
MINORITY = features 1 of 3 competitors have
→ Optional. Build if it fits hinge capability.
DIFFERENTIATORS = features ONLY you have
→ Must be prominent in marketing (hero section, onboarding)
→ If hidden, differentiator is wasted
→ Rule: Every differentiator gets 3x the UI real estate
4. SWITCHING COST AUDIT
→ Can users import from each competitor? (CSV, API, OAuth)
→ Is there a "switch from X" landing page?
→ Does the UI use vocabulary familiar to switchers?
5. REVIEW MINING
→ Read top 20 reviews of each competitor
→ Extract their #1 complaint → can we solve it?
→ Extract their #1 praise → do we match or beat it?
SEVERITY:
CRITICAL — Missing table-stakes feature
HIGH — Missing majority feature OR differentiator hidden from UI
MEDIUM — Feature matches competitor but UX is worse
LOW — Missing minority feature with no user demand signal
EXAMPLE FINDING:
[CRITICAL] No "Export to PDF" — all 3 competitors have it
Evidence: Notion, Coda, Craft all have one-click PDF export.
Our /documents page has no export menu at all.
Impact: Enterprise evaluators will fail this on checklist day 1.
Fix: Add export-to-pdf action via react-pdf or Puppeteer route.
PHASE 8: EMPTY IMPLEMENTATION DETECTION
"A button that does nothing is worse than no button at all."
SPECIFIC GREP PATTERNS (run each):
1. STUB ROUTES & PLACEHOLDERS
grep -rn "coming soon\|Coming Soon\|COMING_SOON" src/
grep -rn "TODO\|FIXME\|XXX\|HACK\|WIP" src/ --include="*.tsx" --include="*.ts"
grep -rn "not implemented\|not yet\|placeholder" src/ -i
grep -rn "return null" src/app/ --include="page.tsx"
grep -rn "<div />\|<></>" src/app/ --include="page.tsx"
2. NO-OP HANDLERS
grep -rn "onClick={() => {}}" src/
grep -rn "onClick={() => console" src/
grep -rn "onSubmit={() => {}}" src/
grep -rn "// TODO: implement" src/
Regex: `on[A-Z]\w+=\{?\(\s*\)\s*=>\s*\{?\s*\}?\s*\}?`
API: grep for "return new Response" where body is empty/mock
API: grep for "return NextResponse.json({})"
3. PARTIAL CRUD DETECTION
For each entity/route group:
- Does `POST` exist? (Create)
- Does `GET` (list + single) exist? (Read)
- Does `PATCH`/`PUT` exist? (Update)
- Does `DELETE` exist? (Delete)
Missing any = partial CRUD = HIGH severity
4. PARTIAL EXPORT/IMPORT
- If export exists, does it support >1 format?
- If import exists, does it mirror export formats?
- Bulk operations: create/update/delete in bulk?
5. PARTIAL SEARCH/FILTER
grep -rn "search" src/app/api/ → count search fields queried
If search only matches 1 field when entity has 10, that's partial
Filter with only 1 option = probably incomplete
6. FEATURE FLAG GRAVEYARD
grep -rn "featureFlag\|FEATURE_\|isEnabled\|flags\." src/
For each flag: is it ever set to true in any env?
Code gated by permanently-false flag = DEAD CODE
7. UNREACHABLE UI CODE
- Pages that exist in src/app/ but no nav link points to them
- Components exported but never imported
- API endpoints called from nothing (grep for route string in src/)
8. MOCK DATA LEFT IN PROD
grep -rn "mockData\|fakeData\|dummyData\|lorem ipsum" src/
grep -rn "MOCK_\|FAKE_\|TEST_DATA" src/
grep -rn "hardcoded\|HARDCODED" src/
SEVERITY:
CRITICAL — Handler returns success but persists nothing (data loss)
HIGH — Visible UI element that does nothing on click
MEDIUM — Partial CRUD (missing delete, missing update)
LOW — TODO comment in non-user-facing code
EXAMPLE FINDING:
[CRITICAL] POST /api/invite silently drops invites
Evidence: src/app/api/invite/route.ts line 12:
`export async function POST() { return NextResponse.json({ ok: true }) }`
No DB write, no email send, no queue push. Returns 200 OK.
User sees "Invite sent!" toast. Invitee never hears anything.
Fix: Persist to `invites` table, enqueue email via Resend, return invite ID.
PHASE 9: CONFIGURATION GAPS
Settings that SHOULD exist but don't:
- Notification preferences (email/push/in-app toggles per event)
- Default view (list vs grid, sort order, filter presets)
- Timezone + locale + date format
- Theme (light/dark/system)
- Keyboard shortcuts override
- Per-workspace defaults
- Data retention period
- Export format default
CHECKS:
- grep Settings page → count exposed options
- Compare against competitor settings pages
- Every hardcoded constant in code = potential missing setting
SEVERITY:
HIGH — Missing notification controls (users can't opt out of noise)
MEDIUM — Missing theme/locale (users expect these in 2026)
LOW — Missing power-user configs
PHASE 10: DOCUMENTATION GAPS
For each feature, check:
- Tooltip on hover? (<Tooltip> present?)
- Help link in context? ("Learn more →")
- Documentation page exists?
- Empty state explains what the feature does?
- Keyboard shortcut discoverable? (Cmd+/ menu)
- API endpoint documented? (OpenAPI/Swagger?)
- Changelog entries for new features?
CHECKS:
- grep for <Tooltip|title=|aria-label on interactive elements
- Count docs pages vs count features. Ratio?
- New user test: can they use Feature X with zero external help?
SEVERITY:
HIGH — Hinge feature has zero docs or tooltips
MEDIUM — Feature buried with no onboarding mention
LOW — Nice-to-have feature missing tooltip
PHASE 11: PERMISSION MATRIX COMPLETENESS
Build the RBAC matrix:
| Action | Owner | Admin | Member | Viewer | Guest |
| Create project | Y | Y | Y | N | N |
...
For EACH entity × EACH operation × EACH role → is it enforced?
CHECKS:
- grep "role ===" or "permissions.includes" in API routes
- For each destructive operation: is it restricted?
- For each billing operation: is it Owner-only?
- Is there a "share with read-only" option?
- Can admins delegate without becoming owners?
SEVERITY:
CRITICAL — Missing permission check (anyone can delete anything)
HIGH — Over-permissive defaults (new members get full access)
MEDIUM — Missing role tier (only 2 roles when product needs 4)
LOW — Role labels unclear ("User" vs "Member")
PHASE 12: DATA MODEL GAPS
Schema gaps to check:
- Entities missing fields users expect (e.g., Task without dueDate)
- Missing soft-delete (deletedAt column)
- Missing audit trail (createdBy, updatedBy, updatedAt)
- Missing version field (optimistic locking)
- Missing tenancy field (workspaceId on every row)
- Foreign keys that should cascade but don't
- Indexes missing on common filter fields
- Enum fields that should be lookup tables
CHECKS:
- Read schema.prisma / convex/schema.ts / migrations
- For each entity: ownership, timestamps, soft-delete, versioning
- Compare to competitor's data model (often inferable from API)
SEVERITY:
CRITICAL — Missing tenancy (multi-tenant data leak risk)
HIGH — Missing audit trail (can't debug user reports)
MEDIUM — Missing soft-delete (accidental permanent deletion)
LOW — Missing indexes (slow but working)
PHASE 13: INTEGRATION GAPS
Third-party connections users expect:
- Auth: Google, Apple, Microsoft, GitHub, SSO/SAML
- Payments: Stripe, Paddle, LemonSqueezy
- Email: Resend, Postmark, SendGrid
- Analytics: PostHog, Mixpanel, Plausible
- Storage: S3, R2, Cloudinary, UploadThing
- Comms: Slack, Discord, Teams, email digest
- Data: CSV import/export, Zapier, webhooks, public API
- Calendar: Google Cal, Outlook, ICS feed
CHECKS:
- Settings → Integrations page exists?
- For each "table stakes" integration in the category: present?
- Webhook configuration UI?
- OAuth app credentials documented for self-hosters?
SEVERITY:
HIGH — Missing SSO for B2B product (enterprise dealbreaker)
MEDIUM — Missing Zapier/webhook (power users can't extend)
LOW — Missing niche integration
PHASE 14: SCALING READINESS
Features that work now but won't at 10x/100x:
- Lists without pagination (breaks at 1k+ rows)
- Full-table scans (no indexes on filter fields)
- Client-side sort/filter on 10k items (freezes UI)
- Unbounded file uploads (no size limit, no scanning)
- Unbounded query parameters (no LIMIT clause)
- Sync operations that should be async (email send in request thread)
- No rate limiting (easy to DoS or run up costs)
- No caching layer (every page re-renders from DB)
- Single-region deployment when users are global
CHECKS:
- Load test feature with 10k records
- Review DB query plans for full scans
- Check background job queue presence
- Check rate limit middleware
SEVERITY:
CRITICAL — Core feature freezes at realistic scale
HIGH — No rate limiting on expensive endpoints
MEDIUM — Missing pagination (works but loads slowly)
LOW — Missing caching (fast enough for now)
PHASE 15: ACCESSIBILITY FEATURES (per-feature a11y)
For each feature, verify:
- Keyboard-only reachable?
- Screen reader announces state changes?
- Color not the only signal?
- Focus trap in modals?
- Skip links for long lists?
- prefers-reduced-motion respected?
- Error messages linked to fields (aria-describedby)?
NOTE: /a11yaudit does a deep dive. Here we check if each FEATURE has
a11y coverage, not the pixel-level WCAG checks.
SEVERITY:
HIGH — Hinge feature is keyboard-unreachable
MEDIUM — Feature works but screen readers silent
LOW — Motion not reduced for users who opt out
PHASE 16: FEATURE ENTROPY (naming + pattern consistency)
Inconsistencies across features:
- Terminology drift: "project" vs "workspace" vs "board" vs "space"
- Verb drift: "delete" vs "remove" vs "archive" vs "trash"
- Same concept, different UI: some lists sort in place, others paginate
- Confirmation pattern drift: some deletes confirm, others don't
- Save pattern drift: some auto-save, some need explicit button
- Modal vs drawer vs route for the same type of flow
- Icon drift: + icon means "add" here, "expand" there
- Date format drift: "Jan 1, 2026" here, "2026-01-01" there
- Empty state drift: illustrated here, blank there
CHECKS:
- Build a glossary of terms from UI strings
- Flag synonyms (project=workspace=board)
- Screenshot each list → compare sort/filter/pagination controls
- Screenshot each destructive action → compare confirm patterns
SEVERITY:
HIGH — Same entity named differently in 2+ places (users confused)
MEDIUM — Inconsistent interaction patterns for similar actions
LOW — Cosmetic icon/label inconsistency
PHASE 17: VERDICT
SCORING MATRIX (320 max):
Phase 1 (PRD Compliance) × 3.0 = max 30
Phase 2 (Feature Depth) × 3.0 = max 30
Phase 3 (Discoverability) × 2.0 = max 20
Phase 4 (Coherence) × 2.5 = max 25
Phase 5 (Edge Cases) × 2.5 = max 25
Phase 6 (API Surface) × 2.0 = max 20
Phase 7 (Competitive Parity) × 2.5 = max 25
Phase 8 (Empty Implementations)× 3.0 = max 30
Phase 9 (Configuration) × 1.5 = max 15
Phase 10 (Documentation) × 1.5 = max 15
Phase 11 (Permissions) × 2.0 = max 20
Phase 12 (Data Model) × 2.0 = max 20
Phase 13 (Integrations) × 1.5 = max 15
Phase 14 (Scaling) × 1.5 = max 15
Phase 15 (Accessibility) × 1.5 = max 15
Phase 16 (Entropy) × 1.0 = max 10
TOTAL = max 320 (excl N/A)
NORMALIZE: score = (raw / applicable_max) × 100
GRADE:
90-100: S — Complete. Production-ready, nothing missing.
80-89: A — Solid. Minor gaps, all core features deep.
70-79: B — Good. Some features shallow, most present.
60-69: C — Gaps. Notable missing features or stubs.
50-59: D — Incomplete. Major features missing or shallow.
<50: F — MVP at best. Significant work remaining.
PHASE 18-20: FIX PLAN → IMPLEMENTATION → RE-AUDIT
Phase 18: Generate prioritized implementation plan
→ CRITICAL: missing core features, empty implementations
→ HIGH: shallow features needing depth
→ MEDIUM: missing edge cases, config, docs
→ LOW: competitive nice-to-haves, polish
Phase 19: Implementation (spawn agents)
─── SAFETY GATE: DO NO HARM (MANDATORY before EVERY fix) ──────────────
The audit MUST NOT introduce new bugs. A fix that breaks the code is worse than
the original finding. Every fix goes through this gate BEFORE commit.
PRE-FIX ANALYSIS (before writing ANY code):
a. Read the ENTIRE target file (not just the target line)
b. SCOPE COLLISION CHECK — if adding/renaming a variable or import:
→ Grep the ENTIRE file for that name (all occurrences)
→ Check: is this name already used as a local, parameter, or reassigned?
→ Check: does this name get shadowed later in the same scope?
→ If collision found → use a different name or fully-qualified reference
c. IMPORT SHADOW CHECK — if adding `from X import Y` inside a function:
→ This makes Y a LOCAL variable for the ENTIRE function scope
→ If Y is also used from module-level import → UnboundLocalError
→ Fix: use the module-level import, don't re-import locally
d. CROSS-REFERENCE CHECK — if modifying a function signature, class, or export:
→ Grep the ENTIRE project for all callers/importers of that symbol
→ Verify every caller still works with the new signature
→ If callers exist outside the file → update them ALL or don't change
POST-FIX VERIFICATION (after writing code, BEFORE commit):
a. SYNTAX CHECK:
→ Python: `python -c "import ast; ast.parse(open('FILE').read())"`
→ JS/TS: `npx tsc --noEmit` or `node -c FILE`
b. IMPORT CHECK — verify the module actually loads without error:
→ Python: `python -c "import MODULE"` (catches UnboundLocalError, NameError, etc.)
→ JS: `node -e "require('./FILE')"`
c. RUNTIME SMOKE TEST — if the project has a service (bot, server, API):
→ Start it briefly and verify it doesn't crash on init
→ Python: `timeout 10 python main.py` or systemctl restart + is-active check
→ Node: `timeout 10 node server.js` or `npm run build`
→ If service crashes → git revert HEAD → mark NEEDS_REVIEW
d. TEST SUITE — if tests exist:
→ Run the relevant test file(s): `pytest FILE -x` / `vitest run FILE`
→ If tests fail → git revert HEAD → investigate
IF ANY POST-FIX CHECK FAILS:
→ `git revert HEAD` immediately
→ Log the failure in audits/.featureaudit/fix-log.md with exact error
→ Mark as NEEDS_REVIEW (never retry same approach blindly)
→ Try alternative approach OR skip this fix
────────────────────────────────────────────────────────────────────────
FOR EACH implementation task:
a. Read the ENTIRE target file (full context)
b. Run PRE-FIX ANALYSIS (scope collision, import shadow, cross-reference)
c. Implement the feature/depth
d. Run POST-FIX VERIFICATION (syntax, import, smoke test, tests)
e. If all green → commit
f. If any red → revert → log → mark NEEDS_REVIEW
Phase 20: Re-audit
1. SERVICE HEALTH GATE (mandatory):
→ If project has systemd service: restart it, wait 10s, check is-active + logs for errors
→ If project has build step: full build must pass
→ If project has tests: full test suite must pass
→ If ANY fails: identify which fix broke it, revert
2. Re-run failing phases, compare scores
3. Loop until score >= 80
CROSS-COMMAND BRIDGE
THE QUALITY QUINTFECTA:
/codeaudit → Is the CODE solid? (preventive, static)
/flowaudit → Does the EXPERIENCE work? (preventive, logical)
/uiuxaudit → Is the INTERFACE beautiful? (preventive, visual)
/debugaudit → What is BROKEN right now? (detective, runtime)
/featureaudit → Is the product COMPLETE? (strategic, gaps)
Together: Code × Flow × Design × Runtime × Completeness = Ship-Ready.
/featureaudit finds missing features → implements them
/featureaudit finds shallow features → deepens them
/featureaudit finds stubs → completes or removes them
LAWS
- Missing is worse than broken. A broken feature can be fixed. A missing feature means users leave.
- Shallow is a lie. "We have search" means users expect search to WORK. A search bar that searches one field is a lie.
- The PRD is a promise. Every unpromised feature is a bonus. Every promised but missing feature is a betrayal.
- Competitors set expectations. Users don't evaluate your product in isolation. They compare.
- Edge cases are not edge cases. They're the experience of your most engaged users.
- Empty states are first impressions. The zero-data experience IS the onboarding.
- The product is incomplete until proven complete (Popper). Default verdict: NOT READY.
"/featureaudit v1 — Inventory. Score. Gap. Build. Every feature, every depth, every competitor. /320."
COMPLIANCE & CRITICAL ADDENDA (v1.1 — 2026-04-14T10:35:36Z)
Quality Arsenal Preamble Compliance
This audit implements contracts defined in ../_shared/QUALITY-ARSENAL-PREAMBLE.md v1.0:
- ✅ Gestalt-Popper doctrine — hinge point, falsification, evidence chain, adversarial thinking
- ✅ Concurrency lock — canonical runner
flockataudits/.featureaudit/.runner.lock - ✅ 5-iteration cap — fix-and-reaudit loop bounded at 5 iterations (rule 43 step 8b alignment). On cap: NEEDS_REVIEW + Telegram SOS. No silent infinite loops.
- ✅ Scoped invocation flags —
--url=,--files=,--scope=,--ticket=,--no-fix,--focus= - ✅ Non-UI context gate — Non-UI contexts: feature audit works on any project type (library features, CLI features, API features all valid).
- ✅ Output contract verification — emits
audits/.featureaudit/verdict.json,verdict.md,fix-plan.json,fix-plan.md,iterations.md,progress.json,telemetry.json,fix-log.md. Output gate runs at end; missing/malformed files = audit did NOT succeed. - ✅ Telegram progress notifications —
start/progress(every 3 phases) /iteration/verdict/abort/sosevents via~/.omega/bin/audit-notify.sh - ✅ Discovery drift check — on resumed runs, if
audits/.featureaudit/discovery/> 1h old, re-verify inventory or abort with user-confirm - ✅ Self-telemetry —
audits/.featureaudit/telemetry.jsonemitted at completion (duration, tokens, phases, fixes, model, preamble_version) - ✅ Deprecation registry — cross-references checked against
${OMEGA_DIR:-$HOME/.omega}/skills/audits/_shared/DEPRECATED.md; stale refs flagged as findings - ✅ Rule-46 compliance — NO
--quick/--streamlined/--lightweightvariants. Narrower scope uses--focus <area>flags with FULL phase depth. Orchestrator prompts containing rule-46 banned phrases are REFUSED. - ✅ Score normalization — raw score divided by applicable-phase-max × 100 = /100 normalized score
- ✅ preamble_version — emitted as
"1.0"in verdict.json for/metauditcompliance scan
Audit-Specific Critical Addendum — No-PRD Fallback + WebSearch Budget
No PRD exists? Generate an implicit PRD from:
README.mdfeatures section (grep## Features|## What)package.jsondescription + keywords- Routes/pages discovered via Glob on
src/app/**/page.{tsx,jsx},pages/** - Convex schema (if present) — entity → feature inference
- API endpoints (if present) — endpoint → feature inference
Label each finding as "inferred-PRD" vs "explicit-PRD" — confidence differs.
WebSearch budget (per preamble §9 telemetry):
- Max 10 queries per audit (competitive parity research)
- Emit
websearch_count+websearch_queries[]in telemetry.json - Abort phase 12 (parity check) if quota exceeded; do not degrade to zero.
Scoring addenda
Normalized score = (raw_score / applicable_raw_max) × 100.
Applicable max excludes phases marked N/A for project type (see preamble §5).
verdict.json.preamble_version = "1.0" is MANDATORY. Missing field = /metaudit flags as non-compliant.
/metaudit Compliance Badge
Run /metaudit --focus arsenal to verify this audit against the 11-point preamble checklist. Target score: 11/11.
v1.1 compliance round 2026-04-14 — shared-blindspot gaps closed via preamble, audit-specific critical addendum applied.
§ 100/100 COMPLIANCE CERTIFICATE — v1.2 — 2026-04-14T10:43:29Z
Final gap-closure layer. Every finding from the prior /flowaudit-of-all-audits analysis (featureaudit-specific section) is now explicitly resolved below.
Compliance Matrix (machine-verifiable by /metaudit)
{
"audit": "featureaudit",
"preamble_version": "1.0",
"compliance_version": "1.2",
"compliance_score": 100,
"shared_blindspots_closed": {
"S1_concurrency_lock": true,
"S2_reaudit_cap_5_iter": true,
"S3_non_ui_context_handling": true,
"S4_telegram_progress": true,
"S5_scoped_invocation_flags": true,
"S6_output_contract_verification": true,
"S7_self_telemetry": true,
"S8_phase_count_rationale_documented": true,
"S9_discovery_drift_check": true,
"S10_deprecation_registry_reference": true
},
"audit_specific_gaps_closed": true,
"rule_46_com
…(truncated)