Skip to content

AI Quotation triage tools (ai 1.14.0) — Production Readiness Audit

FieldValue
Date2026-09-16
StatusGo for production — Backend + Docs; no SPA/Mobile code
ScopeAsk EloSync Quotation tools: get_quotation, confirmed writes update_quotation_status / assign_quotation / add_quotation_note; catalog ai 1.13.0 → 1.14.0
CompanionAI deployment · AI Estimate triage · AI Lead assign + note · AI tools · Tenant AI API · User guide · Quotations · CHANGELOG

Executive summary

Additive AI tools depth on the existing AIGateway + AIToolRegistry + PendingAiActionService path. Reads: fetch one quotation (by UUID; payload includes title — quotations have no number field). Writes: three low-risk tools that propose pending actions; mutations run only after POST /ai/actions/{id}/confirm. Status changes call QuotationService::changeStatus (same as HTTP POST …/status). Status auth mirrors the controller: Sent → send, Accepted → accept, else → update. Registry visibility for status uses AiToolAnyOfPermissions (quotations.update | quotations.send | quotations.accept). Assign uses quotations.assign + EligibleOpportunityAssignee at propose and confirm. Notes are text-only with confirm-time max:5000. No new Spatie permissions, no Quotations catalog bump, no Frontend/Mobile changes.

Go / No-Go: Go. Cutover: migrate-only catalog bump to 1.14.0, entitle ai + quotations, staging smoke propose→confirm.

GateResult
Platform freeze (no parallel AI stack)Pass
UUID quotation lookup; soft-deleted excludedPass
Payload uses title (no number)Pass
Status propose/confirm: target-dependent send/accept/update + changeStatusPass
Status tool visible with any of update/send/acceptPass
Assign gated by quotations.assign + EligibleOpportunityAssignee (propose and confirm)Pass
Note gated by quotations.update + policy update + body max 5000 on confirmPass
Propose does not mutatePass
Catalog migrate-only ai 1.14.0 + CatalogSeeder syncPass
Docs (tools, API, user tip, Quotations cross-links, overview, ops, roadmap, changelog, upgrade, VitePress)Pass
Pest write confirmation + registryPass
Playwright AI e2eN/A — no SPA surface change

Locked-decision matrix

DecisionBackendFrontendMobileDocs
Read tool: get one quotationPassPass
Confirmed writes via existing pending actionsPassPass (generic UI)Pass (generic UI)Pass
Status via HTTP /status semanticsPassPass
AiToolAnyOfPermissions for status visibilityPassPass
Catalog MINOR ai 1.14.0 only (not quotations)PassPass

Authz map (HTTP ↔ AI)

ActionHTTPAI tool / confirm
Get oneview (assignee-scoped unless assign / superadmin)get_quotation
Change statustarget-dependent (send / accept / update) + POST …/statusupdate_quotation_statusQuotationAiSupport::authorizeStatusChange + changeStatus
Assign / unassignassignassign_quotation + EligibleOpportunityAssignee at propose and confirm
Note (text)updateadd_quotation_note + confirm max:5000

Upgrade & staging smoke

  1. php artisan migrate --force — catalog ai1.14.0 (do not db:seed).
  2. Entitle ai + quotations.
  3. Smoke: Ask EloSync fetch quotation → propose status/assign/note → Confirm.

Rollback

Roll back the catalog bump migration (down1.13.0). Tools remain in code but version claim reverts; no schema change.

Monitoring

Unchanged from AI platform readiness (Nightwatch / logs on AI gateway + pending action confirm failures).

Official documentation for the EloSync SaaS Platform.