Skip to content

Changelog ​

Operator-relevant changes to VeloxSaarthi. Engineering-internal changes (test infrastructure, refactors with no observable behavior change) are omitted.


2026-07-13 ​

Rate-limit aware pause: session-limit errors no longer burn the escape budget

  • A session-limit rate limit (AnthropicTransientError("rate_limited", …), either adapter) now pauses the run instead of failing it — the run status becomes waiting, no attempt is consumed, and Auto-escape's requeue budget is untouched. The reset time is parsed from the error message when present ("resets 2:40pm (Asia/Calcutta)"); otherwise the daemon falls back to exponential backoff (5min, doubling, capped at 60min). The interrupted stage automatically resumes once the resume time passes, including across a daemon restart. Surfaced via attention.opened / attention.cleared in the console only — deliberately no Telegram ping, since it needs no operator judgment. See Run a story — Rate-limit pauses.

ACP usage telemetry captured and mirrored to the console

  • Token usage is no longer discarded. claude_code (ACP) sessions now aggregate each turn's prompt-response token breakdown (input/output/cache read/cache write) plus the local cost snapshot per stage session, persisted in SQLite so totals survive a daemon restart. On session completion (including failed/cancelled sessions and the restart sweep) one usage.reported runtime telemetry event — attributed to the model that actually executed, never the configured one — is emitted to the console's Usage page (usage.unpriced when no executed-model identity was captured). Sessions with no usage emit nothing; claude_cli remains unpriced (no usage surface).

2026-07-12 ​

Fast-path pipeline profile for small / docs-only stories

  • Three new ADO tags collapse and trim the pipeline for work the operator marks small — vlx-small (combine Think+Plan into one session, shallow Review skipping /codex, APPROVAL/Build/Test kept), vlx-skip-review (bypass Review), and vlx-skip-test (bypass Test — docs-only changes only). Tags are case/bracket-insensitive and independent; no LLM decides the path and untagged stories are unaffected. Every skip is recorded (audit event) and disclosed (a Pipeline profile section in the PR body). An optional fast_path.enabled kill-switch (default true) ignores all tags when false. See Pipeline — Fast-path profile and Configure — fast_path.

Per-stage model + reasoning-effort configuration

  • New optional stages: config block routes each LLM-backed stage (think, plan, build, review, test, reflect, and the PR-comment respond) to its own model at its own reasoning effort (low | medium | high). Omit the block — or any single stage — to inherit the agent's default model; behavior is unchanged when unset. Unknown stage keys and fields are rejected at startup. See Configure — stages.

2026-06-22 ​

Teams channel, web dashboard, spec/plan verifiers, init wizard improvements

Init wizard ​

  • Telegram is now optional. vlx init presents three human-channel choices: telegram (default), teams, and web. You can skip Telegram entirely.
  • Teams init path prompts for tenant ID, client ID, client secret env var, team ID, channel ID, and optionally a list of authorized AAD user IDs. Absent → fails-closed (all input ignored).
  • Web init path requires no credentials — the dashboard runs on http://127.0.0.1:8787 with a generated token.

Microsoft Teams channel (adapters.human_channel: "teams") ​

  • New Teams adapter replaces Telegram for human-in-the-loop. Configure via teams: section in vlx.yaml (see Configure).
  • Slash commands — the same commands available in Telegram now work in Teams:
    • /respin <storyId> — address reviewer comments on an open PR
    • /requeue <storyId> — re-run a failed story
    • /cancel <storyId> — abort an active run
    • /history <storyId> — show the recent event log
    • /restart <storyId> <stage> — restart from a specific pipeline stage
  • Approvals and clarifications are posted as Adaptive Cards in the story thread. The operator replies approve / reject (or types a free-text clarification answer) in that thread. No bot endpoint required — the daemon polls the Graph API.
  • authorized_user_ids is a whitelist of AAD object IDs (GUIDs). Leave it empty and the adapter ignores all input — fail-closed by design.
  • Poll interval is configurable (teams.poll_interval_ms, default 5 000 ms).

Web dashboard (adapters.human_channel: "web") ​

  • Embedded web dashboard served on http://127.0.0.1:8787 (localhost only, never 0.0.0.0). Enable via web.enabled: true in vlx.yaml; web.port overrides the default 8787.
  • Token security: every /api/* request must include the token via ?token= query param or x-vlx-token header.
  • API endpoints: GET /api/runs, GET /api/story/:id, POST /api/story/:id/requeue|cancel|restart|respin|vetomerge, POST /api/clarification/:cid/answer, POST /api/approval/:cid.
  • ACP permission prompts (allow/ask/deny tool approvals from the agent) are now persisted to the DB so the web dashboard can surface Approve / Reject buttons for in-flight permission requests. Approving in the dashboard unblocks the waiting agent session immediately across all active channels (Telegram, Teams, or Web).

Spec and plan verifiers (automatic quality gates) ​

After each Architect turn in the Think and Plan stages, a two-layer verifier now runs automatically before the pipeline advances:

  • Layer 1 — structural check (zero model cost, pure TypeScript). Gates the semantic pass. For specs: frontmatter with ui: true|false, numbered ACs, ## Problem/## Goal heading, ## Out of scope heading. For plans: ## Files section, traceability table with one row per spec AC, [AC-N] labels in the test approach, ## Docs impact, ## Rollback, and ## Test approach sections.
  • Layer 2 — semantic pass (single Haiku call, no tools). Runs only when structural passes. For specs: checks testable + specific ACs, concrete problem statement, story-sized scope, and genuine risks (if a risks section is present). For plans: checks AC traceability completeness, real file paths (no src/tbd.ts or angle brackets), real test paths, [AC-N] labels, docs-impact vs. file list consistency, and internal consistency with the spec.
  • Retry loop: on failure, verifier findings are injected verbatim into the Architect's next prompt under ## Spec/Plan verifier findings — MUST fix before proceeding. The Architect retries up to 3 times. On the third failure the run escalates to the operator instead of looping indefinitely.
  • Verifier findings are written to stories/<storyId>/spec-verifier-findings.json and plan-verifier-findings.json — they persist across daemon restarts.
  • Before drafting a spec, the Architect now receives a ## Possibly related prior work section listing the top-3 matching entries from project memory and agent-brain corrections. Matching is keyword-based on the story title and acceptance criteria.
  • The same note is posted once to the story's Telegram/Teams/Web thread so the operator can see which prior stories were surfaced.

Config changes ​

KeyTypeDefaultDescription
teams.tenant_idstring—Azure AD tenant GUID
teams.client_idstring—App registration client ID
teams.client_secret_envstring—Env var holding the client secret
teams.team_idstring—Target Teams team ID
teams.channel_idstring—Target channel ID
teams.poll_interval_msnumber5000Graph poll interval
teams.authorized_user_idsstring[][]AAD object ID whitelist (fail-closed if empty)
web.enabledbooleanfalseEnable embedded web dashboard
web.portnumber8787Dashboard port (localhost only)
web.tokenstring—Bearer token for API access

2026-06-13 ​

Docs site: versioned downloads, header version, simpler nav

  • Downloads and Install now link directly to all three per-OS binaries via immutable, versioned URLs (…/releases/v<version>/…) and show the current release — no more guessing the binary URL from the manifest.
  • The current release version now appears in the site header, as a red label inside the VELOXSAARTHI logo panel.
  • The top nav is trimmed to Home and Install — Downloads and Changelog live in the left sidebar.
  • Docs/UI changes now deploy without a version bump: a docs-only push rebuilds and republishes the site without cutting a new binary release.

2026-06-13 ​

Docs site: actor prompts + pipeline internals

  • Added an Actors page reproducing every actor prompt verbatim (mirrored from actors/*.md at build time, so it never drifts), with the actor↔skill split and the per-actor roster / forbidden-invocation rules.
  • Added Pipeline internals — the story pipeline stages, which actor runs at each, the routing/outcome table, fix-up budgets, the post-Ship event-driven handlers, and operator commands + auto-escape.
  • Added Release pipeline — how vlx binaries and these docs are built and published (version bump, cross-compile, blob publish, SWA deploy, self-update).

2026-06-12 ​

Docs site: published at docs.saarthi.bot + restyled

  • This documentation site is published to an Azure Static Web App (Free tier) with managed HTTPS at https://docs.saarthi.bot. The release pipeline rebuilds and republishes it on every release (push to main).
  • Restyled to the VeloxSaarthiBot "Swiss Ledger × Poster" design system — paper + ink + a single red accent, Archivo display type, Instrument Sans body, zero border-radius, no shadows.
  • Added a Downloads page listing the latest per-OS binaries and install commands, alongside the changelog.

2026-06-12 ​

UI-proof Test stage + configurable approval gate

  • Browser evidence for UI stories: when a story's spec declares ui: true (Architect sets it for anything user-visible in a browser), the Test stage now starts the app under test (new ui_test config section), and the Inspector authors and runs real Playwright flows per acceptance criterion with video recording and screenshots. A failed flow routes back to Build like any other defect. UI stories with no ui_test config or no flow evidence escalate fail-closed — they never silently ship untested.
  • Mockup validation: images attached to the work item (or inline in the description) are downloaded to stories/<id>/mockups/; the Inspector compares each against the implemented UI and records a structured verdict. An ac_breaking mismatch routes to Build for ONE fix attempt on its own budget; if still mismatched the run ships flagged — Telegram warning, ADO comment, and a prominent PR-body section — for the human to judge. Cosmetic drift is reported without gating.
  • Evidence published where you are: flow videos, screenshots, and mockup side-by-sides are posted to the story's Telegram topic and attached to the ADO work item. The PR body now includes a per-AC verdict table and a UI-flows table.
  • Harness hardening: the orchestrator now verifies that required_gates includes the harness floor (bun test), that every story AC appears in ac_coverage, and that every cited evidence file exists on disk — violations escalate fail-closed instead of trusting the Inspector's claims.
  • Approval gate now optional (default OFF): Plan routes straight to Build unless approval_gate.enabled: true. vlx init asks during setup (60s of silence → disabled); an interactive daemon start with an older config asks once and persists the answer.

2026-06-12 ​

Binary distribution + self-update (PR 1755, v0.0.1)

  • vlx now ships as a single self-contained binary for Windows x64, macOS (Apple Silicon), and Linux x64 — no Node, Bun, or source tree needed on the machine. Download from the release channel: https://dl.saarthi.bot/releases.
  • Self-update: every vlx daemon start checks the channel, verifies the SHA-256, swaps the binary, and restarts itself. Opt out per-run with --no-update / VLX_NO_UPDATE=1; force with the new vlx update command.
  • State home moved to ~/.vlx/: config (vlx.yaml), state (state.db), backups, worktrees, and secrets (secrets/global.env, auto-loaded at startup) all live under one root (VLX_HOME to override). The daemon can be started from any directory. Migration note: existing installs with ./vlx.yaml / ./state.db in the repo must move them to ~/.vlx/ (or set VLX_CONFIG / VLX_DB_PATH) — the daemon warns when it detects the legacy layout.
  • vlx init is now a guided wizard: prompts for ADO + Telegram details, resolves the repo ID, clones the client repo, writes config + secrets, and migrates — replacing the copy-the-template flow.
  • Releases are automated: the vlx-release Azure Pipeline builds and publishes all three targets (plus a versioned rollback copy) on every push to main.

2026-06-11 ​

VLX-047 — Product documentation site (AB#4042)

  • Shipped this documentation site (VitePress + Azure Static Web Apps pipeline).
  • Added docs-as-code policy: Critic flags major on user-facing diffs without paired docs-site/ updates; Builder mirror rule enforces docs updates in the same branch.

2026-06-10 ​

Architecture cleanup (15 stories shipped)

Adapters added ​

  • GitHub adapter (tracker + SCM host): adapters.tracker: "github" and adapters.scm_host: "github" now work. Supports GitHub Issues as a tracker and GitHub PRs as the SCM host. Configure via github: section in vlx.yaml.
  • Jira adapter (tracker): adapters.tracker: "jira" polls Jira Cloud issues. Configure via jira: section in vlx.yaml.
  • Microsoft Teams adapter (human channel): adapters.human_channel: "teams" uses Teams channels instead of Telegram for human-in-the-loop. Configure via teams: section in vlx.yaml.

New features ​

  • Auto-merge (VLX-034, AB#4038): opt-in auto-merge for approved PRs with no unresolved comments. Eligibility: auto-merge-ok tag + trust score ≥ threshold + cooldown elapsed. Operator escape hatch: /vetomerge <storyId>. Off by default; enable via auto_merge.enabled: true in vlx.yaml.
  • Trust score (VLX-033, AB#4037): per-project trust score (0.0–1.0) computed from the event log. Used as the auto-merge eligibility gate.
  • Candidate ledger (VLX-024b, AB#4025): tracks tool promotion proposals and rejection history so the agent cannot re-propose the same bad tool after a [brain] PR is rejected.
  • Memory hygiene report (vlx memory report, AB#4027): scans project memory for stale / large / duplicate entries.
  • Auto-merge PR tracking (AB#4036): daemon tracks auto-merge-eligible PRs in tracked_prs and merges after cooldown.
  • PR archive and DB archive (vlx db archive, AB#4030): event log archival for old terminal runs.
  • Browser-driven QA flow (AB#4039, AB#4040): Designer and browser-flow handlers for stories tagged [ui].
  • Conditional actors — Designer, Sentinel, Tuner actor files added (AB#4029, AB#4028, AB#4033): invoked on tag/scope triggers, not on every story.
  • Cancel command (/cancel <storyId>, AB#4031): kills the active run cleanly. Cancelled runs are excluded from auto-escape.

Operator-visible changes ​

  • vlx db archive subcommand added.
  • vlx memory report subcommand added.
  • /vetomerge <storyId> Telegram command added.
  • /cancel <storyId> Telegram command fixed (previously did not actually cancel the run).
  • Respin model changed: the vote-state-driven respin was replaced by a comment-quiescence-driven model. The 10-minute debounce (RESPIN_DEBOUNCE_MS) starts when the reviewer goes quiet, not when they vote. /respin bypasses the debounce immediately. Per-comment Responder actor added (AB#4032): one-shot classification + in-thread reply per new reviewer comment.
  • Telegram button answers now persist the option label, not the option index (fixes a bug where restoring from a different option count would map to the wrong answer).

Removed ​

  • Docker QA sandbox (AB#4020): the QaSandboxPort, Docker adapter, and adapters.qa_sandbox config key were removed. The Test stage runs the Inspector inside the ACP session (handlers/test.ts). No Docker dependency for running tests.
  • Secrets capability broker (AB#4020): the SecretStore, CapabilityBroker, and vlx secret CLI were removed. RequestCredential now uses the plaintext clarification path (see Security — Credential relay). The secrets table was dropped in migration 0010.
  • Per-run file logging (createRunLogger, vlx logs prune): removed; daemon logs to stdout/journald only.
  • Drizzle ORM dependency removed; migrations are plain SQL files applied by src/db/migrate.ts using bun:sqlite directly.

Breaking changes ​

  • adapters.qa_sandbox config key removed — remove it from vlx.yaml if present.
  • vlx secret CLI subcommand removed.
  • vlx logs prune subcommand removed.
  • deps and secrets tables dropped from state.db in migrations 0010+. The migration runs automatically at daemon startup.

Internal Veloxcore tool — not a public product.