Skip to main content

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/runs routes through TaskOrchestratorService and returns backward-compatible AgentRunV2Result with task linkage in details.
  • POST /v2/task-orchestrator/runs is active as explicit orchestration endpoint.
  • POST /v1/telegram/app/webhook natural-language path routes through TaskOrchestratorService, with deferred queue handoff for async/timeout-prone instructions.
  • Dashboard chat worker (PROCESS_CHAT_MESSAGE) routes through TaskOrchestratorService.
  • POST /v1/assistants/:id/instruct executes through AgentActionsService -> TaskOrchestratorService.
  • Task settings/debug routes are stable and non-colliding:
    • GET /v1/tasks/settings/notifications
    • PATCH /v1/tasks/settings/notifications
    • GET /v1/tasks/settings/automation
    • PATCH /v1/tasks/settings/automation
    • GET /v1/tasks/digests/latest

Completed in This Tranche

Orchestration + task lifecycle

  • Implemented TaskOrchestratorService as 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 externalThreadId then conversationId fallback.

Execution binding

  • Kept agent-v2 as 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/runs now includes non-breaking runMode (immediate|deferred) and consistent task linkage fields in details (taskId, taskState, taskOwnerAgent, operationId).

Async callback runtime

  • Added async_operations as callback source-of-truth for deferred/background execution.
  • Added TaskCallbackService to 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.syncGmailFull now 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:e2e is 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 suites
    • all: full infra-backed E2E matrix
  • Added Redis queue reset in infra runner to prevent cross-run BullMQ contamination.
  • Modernized app.e2e-spec.ts to assert /v1/health instead of legacy root route assumptions.

Dashboard experience

  • Assistant page reworked to chat-style interaction (ChatGPT-like transcript/composer flow).
  • /v2/agent/runs response details are typed and consumed with task linkage metadata.
  • Legacy Rules navigation was removed from dashboard entrypoints; /dashboard/rules now 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/62 suites, 252 tests).
  • API infra E2E (critical profile): npm run test:e2e:infra -> pass (9/9 suites, 31 tests).
  • API infra E2E (all profile): npm run test:e2e:infra:all -> pass (13 passed, 1 skipped, 65 total, 2 skipped tests).
  • Focused E2E regressions repaired and green:
    • telegram-natural-language.e2e-spec.ts
    • life-graph.e2e-spec.ts
    • queue.e2e-spec.ts
    • task-orchestrated-journeys.e2e-spec.ts async 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)

  1. 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

  1. Expose digest strategy controls in dashboard settings (daily heartbeat vs reactive-only).
  2. Expand browser E2E assertions from assistant chat to tasks and notification surfaces.