Skip to content

Knowledge Base — Production Readiness Audit

FieldValue
Date2026-08-13 (re-audit after e2e + UI hardening)
StatusGo — ready for staging → production after CI on companion PRs
ScopeKnowledge Base module knowledge-base v1.0.0
Branchfeature/knowledge-base-module-22e6
CompanionKB production · Developer guide · User guide · API

PRs: Backend #103 · Frontend #101 · Docs #125 · Website #23


Executive summary

Knowledge Base is a free Operations Marketplace SKU ($0). It is not default-included. Workspaces install from Marketplace after migrate; existing tenants are unchanged until they opt in.

Locked v1 scope is implemented: internal workspace only, flat categories, no public portal / Help Desk links / attachments / nested categories / dashboard widget / Automation triggers.

Go / No-Go: Go for staging → production after CI on companion PRs. Prior HIGH UI blockers (detail/edit failure paths) are fixed and covered by headed Playwright. Remaining items are residual / fast-follow quality work, not ship blockers.

GateResult
Catalog: operations / knowledge-base / 1.0.0 / book-open / sort 60 / free opt-inPass
Module + verified + RBAC middleware on tenant routesPass
Published-only visibility for view-only rolesPass
Editor drafts / archived / trash list filters (API + UI)Pass (trash filter includes update; status filter gated on update)
MySQL-safe notes/activities index & FK namesPass
Slug unique ignore on update (camelCase route param)Pass
Detail/edit error handling (trashed 404 / failed body fetch)Pass (fixed)
Pest tests/Feature/Tenant/KnowledgeBasePass (6)
Playwright headed test:e2e:knowledge-base:headedPass (expanded one-session workflow)
Docs + marketing SKUPass
Notes/timeline readable by view-onlyAccepted residual (product: internal transparency)
Cross-tenant isolation Pest caseRecommended fast-follow

Locked-decision matrix

DecisionBackendFrontendDocsWebsite
Internal-onlyPassPassPassPass
Free Operations opt-in (not default, not billable)PassPassPassPass
v1.0.0 · book-open · sort 60PassPassPassPass
No public portalPassPassPass (deferred)Pass (soft “yet” — Low)
No Help Desk shippingPassPassPassPass (planned)
No attachments / nested cats / dashboard / AutomationPassPassPassPass

Findings (re-audit)

Resolved since first audit

IDWasNowEvidence
F1HIGH — infinite skeleton on failed/trashed showFixedknowledge-base-detail-sheet.tsx ErrorState; e2e asserts “Unable to load article”
F2HIGH — edit could wipe body on failed detail fetchFixedForm blocks Save until body loads; ErrorState on detailQuery.isError
F3MEDIUM — trash UI vs docs (update editors)FixedcanManageTrash includes canUpdate; status filter gated on canUpdate
F13LOW — missing hub / Playwright rowsFixedDeveloper guide index + playwright.md

Open (non-blocking)

IDSeverityAreaFindingRecommendation
F4MEDIUMBackend / ProductView-only users can read notes + activity timeline (incl. body snapshots) via show / timeline; write notes requires updateAccept as internal transparency or gate read to update in a follow-up
F5MEDIUMTestsIsolation Pest only covers module entitlement 403Add Announcements-style cross-tenant ID access test
F6MEDIUMBackendSoft-deleted slugs still unique (same as Products)Document; purge/force-delete to free slug
F7MEDIUMBackendInactive categories still assignable via existsOptionally require is_active
F8MEDIUMBackendCategory update/destroy lack trashed guardsMirror article controller guards
F9MEDIUMBackendNo platform audit for restore / force-deleteAdd events if ops needs them
F10MEDIUMBackendEmpty auto-slug edge case for symbol-only titlesFallback slug / validation
F11MEDIUMFrontendCategories dialog Edit/Delete lack per-action gatesAdd PermissionGate (Products parity gap)
F12MEDIUMFrontendCategories/stats secondary loading/error states thinPolish
F14LOWDocsdatabase.md notes/activities field list incompleteExpand
F15LOWWebsite“portal yet” softens deferralTighten copy
F16LOWA11yFilter accessible names / Label htmlForPolish

Accepted / intentional

ItemNotes
force.delete not on admin default mapDocumented owner/custom grant; vocabulary via ensurePermissionVocabulary()
Trashed show → 404Products parity; list trash + restore/force remain; UI ErrorState + no View menu for trashed
HTML body + SPA DOMPurify sanitizeSame class as email/announcements
No dashboard / Automation / portalLocked v1 exclusion
Activity full-body snapshots in propertiesAccept for v1; monitor growth

Test evidence

SuiteResultNotes
php artisan test --compact tests/Feature/Tenant/KnowledgeBase6 passedCRUD, draft hide, module gate, slug update, category guard
xvfb-run -a npm run test:e2e:knowledge-base:headed1 passed (~38s)One login session

Headed e2e coverage (single session):

  1. Empty submit → Title/Body required
  2. Title-only submit → Body required
  3. Create category
  4. Create draft + KPI Draft
  5. Status filter Draft / Published / All
  6. Edit → body loaded → publish
  7. Create second article as Published
  8. Notes + Activity tabs
  9. Soft delete → Deleted only
  10. Trashed title → “Unable to load article”
  11. Restore → Active only
  12. Archive → Archived filter
  13. KPI + page healthy

Deploy order

  1. Backendphp artisan migrate --force (schema + catalog + permissions)
  2. SPA — Knowledge Base nav + pages + tour
  3. Docs + marketing site
  4. Staging smoke below before production traffic

Suggested merge: Backend → Frontend → Docs → Website.
No new queues, schedulers, or env vars.


Pre-flight checklist

#CheckOwnerPass?
1Migrations applied (knowledge_base_* + register + permissions)Ops
2Catalog: published, Operations, not default-included, not billable, $0Ops
3New workspace lacks KB until Marketplace installQA
4SPA RequireAccess (module=knowledge-base, knowledge-base.view)QA
5Pest KB suite green in CIEng
6Playwright test:e2e:knowledge-base green on stagingQA
7Smoke steps below signed offQA / Ops

Staging smoke (human)

  1. Marketplace → install Knowledge Base (free)
  2. Sidebar shows Knowledge Base for knowledge-base.view
  3. Manage categories → create
  4. New article → validation errors → create draft
  5. Publish via Edit
  6. View-only staff: published only; no draft access
  7. Editor: note + Activity
  8. Soft delete → trash → restore (admin/owner with restore)
  9. Module uninstalled → routes 403
  10. Optional: force.delete only when explicitly granted

Rollback

LayerAction
FrontendRedeploy previous SPA
Backend codeRedeploy previous release; keep additive migrations
Module disableMarketplace uninstall (rows retained)
SchemaDo not roll back KB migrations in prod without a data plan

Monitoring

  • Platform audit: knowledge_base_article_created / _updated / _deleted / _note_added
  • Spatie log: knowledge-base
  • Domain timeline: knowledge_base_article_activities
  • Watch activity properties size under heavy HTML edits

Sign-off

RoleNameDateDecision
EngineeringGo / No-Go
ProductAccept F4 residual / request gate
OpsStaging migrate + smoke ☐

Recommendation: Merge companions after CI green; run staging smoke; treat F4–F12 as post-GA polish unless Product wants notes/timeline gated before launch.

Official documentation for the EloSync SaaS Platform.