Imported from
api/docs/PROGRESS.md. Edit source file, then re-run sync.
Nova Platform — Progress
Last updated: 2026-03-13
Current Delivery Stage
Phase: Task-Orchestrated Runtime Hard Cutover (stabilization + gap audit)
Path Audit (Runtime Entry Points)
Status: verified
POST /v2/agent/runsroutes throughTaskOrchestratorServiceand returns backward-compatibleAgentRunV2Resultwith task linkage indetails.POST /v2/task-orchestrator/runsis active as explicit orchestration endpoint.POST /v1/telegram/app/webhooknatural-language path routes throughTaskOrchestratorService, with deferred queue handoff for async/timeout-prone instructions.- Dashboard chat worker (
PROCESS_CHAT_MESSAGE) routes throughTaskOrchestratorService. POST /v1/assistants/:id/instructexecutes throughAgentActionsService->TaskOrchestratorService.- Task settings/debug routes are stable and non-colliding:
GET /v1/tasks/settings/notificationsPATCH /v1/tasks/settings/notificationsGET /v1/tasks/settings/automationPATCH /v1/tasks/settings/automationGET /v1/tasks/digests/latest
Completed in This Tranche
Orchestration + task lifecycle
- Implemented
TaskOrchestratorServiceas orchestration gateway for taskful instructions. - Added task thread/event history (
task_thread_entries) and task run/thread linking (task_links). - Added lifecycle policy + online lazy backfill for legacy task documents.
- Added inbound reply-to-task matching via
externalThreadIdthenconversationIdfallback.
Execution binding
- Kept
agent-v2as execution kernel collaborator. - Every orchestrated run now links runtime output to task state/thread history.
- Approval actions and high-risk confirmation events append task-thread audit entries.
/v2/agent/runsnow includes non-breakingrunMode(immediate|deferred) and consistent task linkage fields indetails(taskId,taskState,taskOwnerAgent,operationId).
Async callback runtime
- Added
async_operationsas callback source-of-truth for deferred/background execution. - Added
TaskCallbackServiceto reconcile terminal callbacks (succeeded,failed,timed_out) idempotently into task lifecycle + thread + notifications. - Telegram Google-connect now registers task-bound async operations and passes callback metadata to
sync-gmail-full. SyncWorker.syncGmailFullnow marks operation running and emits success/failure callbacks with normalized Gmail error classes (api_disabled,auth_error,quota,unknown).- Timeout-path Telegram failures now defer to queued background execution and user receives immediate acknowledgement.
Scheduler, digest, notifications
- Added scheduler jobs on existing queue/worker stack for lifecycle ticks, backfill, digest ticks, and notification dispatch.
- Implemented concrete task notifiers:
- Telegram notifier
- in-app websocket notifier
- Notification queue/log is used as source-of-truth + delivery audit with deterministic delivery keys.
- Queue dedupe IDs for incremental Gmail/Calendar sync now use a minute-epoch bucket (BullMQ-safe, no
:in job IDs). - Notification dispatcher now atomically claims pending items (
pending -> processing -> sent|failed) to prevent duplicate delivery under concurrent workers. - Digest delivery now suppresses empty digests and deduplicates both per digest ID/channel and by repeated content to prevent spam.
- Digest generation now enforces user-local window + catch-up tolerance + minimum interval throttle (
AGENT_DIGEST_MIN_INTERVAL_MINUTES) for daily-style cadence. - Digest copy is now agentic/narrative (LLM-generated with deterministic fallback), prioritizing actionable items over raw counters.
- Notification dispatch now defers during quiet hours instead of silently dropping pending items.
E2E harness hardening
test:e2eis now infra-backed by default (scripts/run-api-e2e-with-infra.sh) for deterministic local behavior.- Added explicit E2E profiles:
critical(default): CI-critical infra suitesall: full infra-backed E2E matrix
- Added Redis queue reset in infra runner to prevent cross-run BullMQ contamination.
- Modernized
app.e2e-spec.tsto assert/v1/healthinstead of legacy root route assumptions.
Dashboard experience
- Assistant page reworked to chat-style interaction (ChatGPT-like transcript/composer flow).
/v2/agent/runsresponse details are typed and consumed with task linkage metadata.- Legacy Rules navigation was removed from dashboard entrypoints;
/dashboard/rulesnow shows migration guidance to task-native surfaces. - Added browser-level dashboard E2E journeys (assistant chat send + approvals path) with Playwright and CI execution.
Quality Gate Status
Latest local verification:
- API quality gates:
build,typecheck,lint:check,format:check,quality:todo-check-> pass. - API unit tests:
npm test -- --runInBand-> pass (62/62suites,252tests). - API infra E2E (critical profile):
npm run test:e2e:infra-> pass (9/9suites,31tests). - API infra E2E (all profile):
npm run test:e2e:infra:all-> pass (13 passed,1 skipped,65 total,2 skippedtests). - Focused E2E regressions repaired and green:
telegram-natural-language.e2e-spec.tslife-graph.e2e-spec.tsqueue.e2e-spec.tstask-orchestrated-journeys.e2e-spec.tsasync callback success/failure journeys
- API perf gate suite:
npm run test:e2e:perf-> enforced with explicit thresholds (CALENDAR_PERF_*) in CI. - Dashboard:
lint,build-> pass. - Dashboard browser E2E:
npm --prefix dashboard run test:e2e-> pass (2/2). - Docs:
docs:build,docs:check-> pass.
Gap Audit (Open)
- Digest preference UX controls (P2)
- Runtime supports smarter cadence and narrative digests, but dashboard settings do not yet expose advanced toggles (e.g., heartbeat/no-news mode).
Next Check Targets
- Expose digest strategy controls in dashboard settings (daily heartbeat vs reactive-only).
- Expand browser E2E assertions from assistant chat to tasks and notification surfaces.