Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz Source: /opt/alga-psa on psa.joliet.tech
29 lines
3.3 KiB
JSON
29 lines
3.3 KiB
JSON
[
|
|
{ "id": "F001", "description": "Define normalized in-app inbound email processing contract: {tenantId, providerId, emailData}", "implemented": true },
|
|
{ "id": "F002", "description": "Implement server-only service `processInboundEmailInApp` that routes reply vs new-ticket logic", "implemented": true },
|
|
{ "id": "F003", "description": "Parse/sanitize email body via `parseEmailReplyBody` with safe fallbacks", "implemented": true },
|
|
{ "id": "F004", "description": "Threading: resolve existing ticket by reply token (`findTicketByReplyToken`) then by headers (`findTicketByEmailThread`)", "implemented": true },
|
|
{ "id": "F005", "description": "Reply path: create ticket comment from email (including HTML→BlockNote conversion when available)", "implemented": true },
|
|
{ "id": "F006", "description": "Reply path: process reply attachments best-effort via `processEmailAttachment`", "implemented": true },
|
|
|
|
{ "id": "F010", "description": "New-ticket path: resolve provider-specific inbound ticket defaults via `resolveInboundTicketDefaults(tenant, providerId)`", "implemented": true },
|
|
{ "id": "F011", "description": "New-ticket path: match sender email to existing contact via `findContactByEmail` (exact match)", "implemented": true },
|
|
{ "id": "F012", "description": "New-ticket path: define and implement behavior when sender email is unmatched (per PRD Open Questions)", "implemented": true },
|
|
{ "id": "F013", "description": "New-ticket path: create ticket via `createTicketFromEmail` and store `email_metadata` for threading", "implemented": true },
|
|
{ "id": "F014", "description": "New-ticket path: create initial comment via `createCommentFromEmail` containing the email body", "implemented": true },
|
|
{ "id": "F015", "description": "New-ticket path: process attachments best-effort via `processEmailAttachment`", "implemented": true },
|
|
|
|
{ "id": "F020", "description": "Idempotency: ensure reply comment creation is idempotent per {tenant, ticketId, messageId}", "implemented": true },
|
|
{ "id": "F021", "description": "Idempotency: ensure new-ticket creation is idempotent per {tenant, providerId, messageId}", "implemented": true },
|
|
{ "id": "F022", "description": "Preserve provider-level dedupe bookkeeping (Gmail historyId + Microsoft processed message records)", "implemented": true },
|
|
|
|
{ "id": "F030", "description": "Wire Gmail webhook handler to call `processInboundEmailInApp` instead of publishing `INBOUND_EMAIL_RECEIVED` to Redis workflow streams", "implemented": true },
|
|
{ "id": "F031", "description": "Wire Microsoft webhook handler to call `processInboundEmailInApp` instead of publishing `INBOUND_EMAIL_RECEIVED` to Redis workflow streams", "implemented": true },
|
|
|
|
{ "id": "F040", "description": "Add feature flag (tenant/provider scoped) to switch between old workflow-stream publish vs in-app processing", "implemented": true },
|
|
{ "id": "F041", "description": "Rollout: allow enabling in-app processing per providerId for staged deployment", "implemented": true },
|
|
|
|
{ "id": "F050", "description": "Default workflow-worker runtime to v2-only (set `WORKFLOW_WORKER_MODE=v2` in deployment configs) after inbound email no longer depends on worker", "implemented": true },
|
|
{ "id": "F051", "description": "Remove/disable legacy email workflow registrations once verified unused (follow-up cleanup)", "implemented": true }
|
|
]
|