Skip to content

AI Task triage tools (ai 1.5.0) — Production Readiness Audit

FieldValue
Date2026-09-15
Re-audited2026-09-15 (remediations closed — staff complete/reopen parity)
StatusGo for production — Backend + Docs; no SPA/Mobile code
ScopeAsk EloSync Task tools: get_task, confirmed writes update_task_status / assign_task / add_task_note; catalog ai 1.4.0 → 1.5.0
CompanionAI deployment · AI production readiness (platform) · AI Help Desk triage · AI tools · Tenant AI API · User guide · CHANGELOG

Executive summary

Additive AI tools depth on the existing AIGateway + AIToolRegistry + PendingAiActionService path. One read tool and three low-risk writes that propose pending actions; mutations run only after POST /ai/actions/{id}/confirm. Status confirm reuses Task complete/reopen/update gates. update_task_status is visible with tasks.update or tasks.complete (AiToolAnyOfPermissions); complete/reopen still require tasks.complete, other statuses require tasks.update. Notes are text-only with confirm-time max:5000. Confirm-time assign re-validates EligibleTaskAssignee. No new Spatie permissions, no Tasks catalog bump, no Frontend/Mobile changes.

Go / No-Go: Go. Cutover: migrate-only catalog bump to 1.5.0, entitle ai (Tasks is default-included), staging smoke propose→confirm (owner/manager and complete-only staff).

GateResult
Platform freeze (no parallel AI stack)Pass
UUID task lookup; soft-deleted excludedPass
Status confirm mirrors controller complete/reopen/updatePass
Staff with only tasks.complete can propose/confirm complete/reopen via AIPass
Complete-only staff cannot propose non-complete status changesPass
Assign gated by tasks.assign + eligible assignee (propose and confirm)Pass
Note gated by tasks.update + policy update + body max 5000 on confirmPass
Propose does not mutatePass
Catalog migrate-only ai 1.5.0 + CatalogSeeder syncPass
Docs (tools, API, user tip, Tasks cross-links, roadmap, changelog, upgrade, VitePress)Pass
Pest write confirmation + registry authzPass
Playwright AI e2eN/A — no SPA surface change

Locked-decision matrix

DecisionBackendFrontendMobileDocs
Four tools only (no Task Copilot)PassPass
Confirmed writes via existing pending actionsPassPass (generic UI)Pass (generic UI)Pass
Status tool any-of update or complete; authorize per targetPassPass
No Task status transition graph (parity with TaskService)PassPass
Catalog MINOR ai 1.5.0 only (not tasks)PassPass

Findings

Closed (audit remediations)

IDSeverityFindingResolution
A1MediumStatus tool required tasks.update only — staff with tasks.complete could HTTP complete/reopen but not via Ask EloSyncAiToolAnyOfPermissions + UpdateTaskStatusTool any-of tasks.update|tasks.complete; adapter + registry; Pest complete-only propose/confirm + registry
R1LowReopen propose/confirm deny not coveredPest: propose + confirm reopen without tasks.complete → deny

Accepted (intentional / ops — not defects)

IDSeverityNotes
A2InfoAI requires tasks.complete for complete/reopen; HTTP PATCH can set status=completed with only tasks.update. AI remains stricter on that path — intentional.
A3Infocancelled uses update auth (no special perm) — matches HTTP PATCH.
A4InfoConfirm assign returns assignee_name from TaskService::updatefresh(['assignee', …]) — OK.
A5OpsPlatform AI still needs Central ai_api_key + adequate FPM timeouts (unchanged from AI platform readiness).

Authz map (HTTP ↔ AI)

ActionHTTPAI tool / confirm
Get oneviewget_task
Status (non-complete)updateupdate_task_statusauthorizeStatusChangeupdate
Completecompleteupdate_task_status (visible with update or complete) → complete
Reopen (completed→open)completesame → complete
Assign / unassignassignassign_task + EligibleTaskAssignee at propose and confirm
Note (text)updateadd_task_note + confirm max:5000

Done (engineering)

ItemResult
TaskAiSupport + tools + confirm path + assign eligibility + note maxPass
AiToolAnyOfPermissions + staff complete/reopen parityPass
Migration + CatalogSeeder ai 1.5.0Pass
Docs same-PR + sidebar discoverabilityPass
Pest (complete deny, reopen deny, complete-only happy path, non-complete deny)Pass

Test evidence

bash
php artisan test --compact tests/Feature/Tenant/Ai/AiWriteConfirmationTest.php tests/Feature/Tenant/Ai/AiAuthorizationTest.php
vendor/bin/pint --dirty --format agent

Upgrade / staging smoke

After migrate (2026_09_15_050000_bump_ai_module_version_to_1_5_0):

  1. Confirm central catalog ai.version = 1.5.0 (do not db:seed).
  2. Workspace has AI entitled; Tasks is default-included; user has ai.use, ai.confirm, and Task domain perms as needed.
  3. Ask EloSync (manager): overdue / due-today → fetch → propose status/assign/note → Confirm.
  4. Ask EloSync (staff with tasks.complete only): propose complete → Confirm; propose in_progress → denied.
  5. User without tasks.assign never gets assign tool.
  6. Optional: propose assign, suspend assignee, Confirm → 422.

See Upgrade Guide · AI deployment.


Operator remaining

#ActionOwnerStatus
1Merge Backend + Docs PRs (if not already on main)EngTodo
2Deploy Backend; migrate catalog ai → 1.5.0OpsTodo
3Staging smoke (manager + complete-only staff)OpsTodo

Rollback

Redeploy previous Backend release. Catalog version may remain 1.5.0 (display-only); tools disappear with the code rollback. Pending actions for removed tools fail confirm with unsupported tool — cancel or let expire (24h).


Monitoring

Unchanged from AI platform readiness: credit wallet / ai_usage_events, ai.chat_completed, HTTP 402 when credits exhausted. Task domain events still fire on confirm mutations.


Verdict

Go for production after migrate-first Backend deploy + staging smoke. All fixable audit findings (A1, R1) closed; A2–A5 remain intentional parity / ops.

Official documentation for the EloSync SaaS Platform.