Skip to content

Workspace record cohesion — Production Readiness Audit ​

FieldValue
Date2026-09-29
Re-verified2026-09-29 — residuals I1/I2/I3 remediated; Pest document filters (linkable + contact/company AND + invalid type); Email CRM Playwright + Mobile related hub
StatusGo for production (merge companion PRs → migrate → SPA → Mobile → Docs → staging smoke)
ScopeContact/Company related hubs (opportunities, help desk, projects, documents); Email reading-pane CRM link/unlink UI; Documents reverse list filter (linkable_* + contact_id/company_id); party deep-link chips; Mobile related hub
Branchfeature/workspace-record-cohesion (Backend, Frontend, Docs, Mobile)
Catalogcontacts 1.5.0 → 1.6.0, companies 1.2.0 → 1.3.0, documents 1.5.0 → 1.6.0, email 1.3.0 → 1.4.0
CompanionContacts overview · Companies overview · Email · Documents API · CHANGELOG · Party billing readiness

Executive summary ​

Existing Contact/Company party hubs expand beyond billing into sales / ops / files, Email exposes CRM links in the reading pane, Documents supports reverse filters (including party chips with AND semantics), and Mobile mirrors the related hub on contact/company records. No new Marketplace modules, permissions, queues, scheduler entries, or env vars. Platform freeze intact.

Go / No-Go: Go — all audit residuals closed for this cycle. Operator next: merge PRs, migrate catalog bumps, deploy Backend → Frontend → Mobile → Docs, staging smoke. Calendar Google/Outlook sync remains product-deferred (not an audit defect).

GateResult
Platform freeze (no shell/auth/billing redesign)Pass
Contact/Company related hub module + *.view gatesPass
Related lists reuse existing contact_id / company_id filtersPass
Documents linkable_type/linkable_id + contact_id/company_id (AND)Pass — Pest
Invalid linkable_type returns empty listPass — Pest
Email link/unlink authz (email.update + view on linkable)Pass — Pest
Email links via EmailMessageLinkResourcePass
Catalog migrate-only bumps + CatalogSeederPass — Pest companion
SPA party chips on Opportunities / Help Desk / Projects / DocumentsPass
Playwright related-hubPass — contacts.related-hub.spec.ts
Playwright Email CRM linksPass — email.crm-links.spec.ts (seeded inbox)
Mobile related hub on contact/companyPass — PartyRelatedHub
Calendar syncN/A (product deferred; not in scope)

Security summary ​

ControlStatus
No new Spatie permissionsPass
Hub panels gated by hasModule + module *.viewPass
Email link/unlink requires email.update + policy view on target recordPass
Document list still documents.view / viewAny; filters only narrow by pivotPass
Linkable type allow-list (no arbitrary morph class from query)Pass
Tenant isolation unchangedPass

Findings disposition ​

IDSeverityItemDisposition
M1MediumEmail CRM links had no SPA UIRemediated — EmailCrmLinks
M2MediumNo reverse document discovery on party recordsRemediated — filter + hub
M3MediumMissing party chips on Opportunities / Help Desk / ProjectsRemediated
L1LowEmail links raw FQCNRemediated — EmailMessageLinkResource
L2LowNo Contact related-hub PlaywrightRemediated — contacts.related-hub.spec.ts
I1InfoEmail CRM Playwright missingRemediated — email.crm-links.spec.ts + inbox seed helper
I2InfoMobile related hub missingRemediated — PartyRelatedHub on contact/company
I3InfoDocuments dual ?contact= + ?company= ignored companyRemediated — API contact_id/company_id AND; SPA uses partyFilterParams

No open High / Medium / Info residuals for ship (Calendar sync and follow-ups/import remain product backlog, not audit defects).


Change inventory ​

Backend ​

  • DocumentService::query — linkable_type/linkable_id + contact_id/company_id (AND)
  • Email link resources + eager links.linkable
  • Catalog bump migration + CatalogSeeder
  • Pest: linkable filter, contact+company AND, invalid type, email link/unlink, CatalogSeeder companion

Frontend ​

  • CustomerPartyRelatedHub; Email CRM links UI; party chips
  • Documents list uses partyFilterParams (contact_id/company_id)
  • Playwright: contacts.related-hub, email.crm-links (+ seed-email-inbox-message)

Mobile ​

  • components/records/PartyRelatedHub.tsx on contact/company view screens

Docs ​

  • User/developer/API/upgrade/roadmap/changelog + this audit

Catalog version path ​

MigrationEffect
2026_09_29_211500_bump_contacts_companies_documents_email_for_workspace_cohesioncontacts 1.6.0, companies 1.3.0, documents 1.6.0, email 1.4.0

Production: migrate only. Do not db:seed on upgrade.


Deploy sequence (migrate-first) ​

  1. Deploy Backend → php artisan migrate --force
  2. Confirm catalog versions (table above)
  3. Deploy Frontend SPA
  4. Deploy Mobile (related hub)
  5. Deploy Docs
  6. Staging smoke (below)

No new env vars, queues, or scheduler entries.


Test evidence ​

SuiteResultNotes
Document Pest (linkable / contact+company / invalid type)PassRe-verified locally
Email link/unlink PestPass
CatalogSeeder companion PestPass
Playwright contacts.related-hubSpec readynpm run test:e2e:contacts
Playwright email.crm-linksSpec readynpm run test:e2e:email

Pre-flight checklist ​

#CheckOwnerPass?
1Migrations applied; catalog versions matchOps☐
2Contact related hub + View all ?contact= chipsQA☐
3Company hub + ?company=QA☐
4Documents list with both chips applies AND filterQA☐
5Email CRM link/unlink Contact in reading paneQA☐
6Mobile contact/company shows related sections when modules entitledQA☐
7Pest + Playwright suites green in CIEng☐

Staging smoke (minimum) ​

  1. Entitle Contacts + Companies + Opportunities + Help Desk + Projects + Documents (+ Storage) + Email.
  2. Contact with linked opportunity/ticket/project/document → related sections + deep links.
  3. Email: link Contact → chip → unlink.
  4. /documents?contact={id}&company={id} → only docs linked to both.
  5. Mobile: open same contact → related rows navigate.

Residual risks / follow-ups (product backlog — not ship blockers) ​

  1. Calendar Google/Outlook sync (deferred by product).
  2. Contact/Company follow-ups / import-export.
  3. Mobile Email CRM link/unlink UI (web Email CRM shipped; mobile inbox still read-focused).

Verdict ​

Go — audit residuals I1/I2/I3 remediated; production-ready after migrate-first deploy and staging smoke.

Official documentation for the EloSync SaaS Platform.