Appearance
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 becomeswaiting, 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 viaattention.opened/attention.clearedin 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) oneusage.reportedruntime telemetry event — attributed to the model that actually executed, never the configured one — is emitted to the console's Usage page (usage.unpricedwhen no executed-model identity was captured). Sessions with no usage emit nothing;claude_cliremains 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), andvlx-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 optionalfast_path.enabledkill-switch (defaulttrue) ignores all tags whenfalse. 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-commentrespond) 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 initpresents three human-channel choices:telegram(default),teams, andweb. 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:8787with a generated token.
Microsoft Teams channel (adapters.human_channel: "teams")
- New Teams adapter replaces Telegram for human-in-the-loop. Configure via
teams:section invlx.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_idsis 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, never0.0.0.0). Enable viaweb.enabled: trueinvlx.yaml;web.portoverrides the default 8787. - Token security: every
/api/*request must include the token via?token=query param orx-vlx-tokenheader. - 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/## Goalheading,## Out of scopeheading. For plans:## Filessection, traceability table with one row per spec AC,[AC-N]labels in the test approach,## Docs impact,## Rollback, and## Test approachsections. - 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.tsor 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.jsonandplan-verifier-findings.json— they persist across daemon restarts.
Related prior work surfacing (Think stage)
- Before drafting a spec, the Architect now receives a
## Possibly related prior worksection 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
| Key | Type | Default | Description |
|---|---|---|---|
teams.tenant_id | string | — | Azure AD tenant GUID |
teams.client_id | string | — | App registration client ID |
teams.client_secret_env | string | — | Env var holding the client secret |
teams.team_id | string | — | Target Teams team ID |
teams.channel_id | string | — | Target channel ID |
teams.poll_interval_ms | number | 5000 | Graph poll interval |
teams.authorized_user_ids | string[] | [] | AAD object ID whitelist (fail-closed if empty) |
web.enabled | boolean | false | Enable embedded web dashboard |
web.port | number | 8787 | Dashboard port (localhost only) |
web.token | string | — | 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/*.mdat 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 (newui_testconfig 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 noui_testconfig 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. Anac_breakingmismatch 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_gatesincludes the harness floor (bun test), that every story AC appears inac_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 initasks 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 daemonstart 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 newvlx updatecommand. - 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_HOMEto override). The daemon can be started from any directory. Migration note: existing installs with./vlx.yaml/./state.dbin the repo must move them to~/.vlx/(or setVLX_CONFIG/VLX_DB_PATH) — the daemon warns when it detects the legacy layout. vlx initis 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-releaseAzure Pipeline builds and publishes all three targets (plus a versioned rollback copy) on every push tomain.
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
majoron user-facing diffs without paireddocs-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"andadapters.scm_host: "github"now work. Supports GitHub Issues as a tracker and GitHub PRs as the SCM host. Configure viagithub:section invlx.yaml. - Jira adapter (tracker):
adapters.tracker: "jira"polls Jira Cloud issues. Configure viajira:section invlx.yaml. - Microsoft Teams adapter (human channel):
adapters.human_channel: "teams"uses Teams channels instead of Telegram for human-in-the-loop. Configure viateams:section invlx.yaml.
New features
- Auto-merge (VLX-034, AB#4038): opt-in auto-merge for approved PRs with no unresolved comments. Eligibility:
auto-merge-oktag + trust score ≥ threshold + cooldown elapsed. Operator escape hatch:/vetomerge <storyId>. Off by default; enable viaauto_merge.enabled: trueinvlx.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_prsand 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 archivesubcommand added.vlx memory reportsubcommand 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./respinbypasses 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, andadapters.qa_sandboxconfig 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, andvlx secretCLI were removed.RequestCredentialnow uses the plaintext clarification path (see Security — Credential relay). Thesecretstable 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.tsusing bun:sqlite directly.
Breaking changes
adapters.qa_sandboxconfig key removed — remove it fromvlx.yamlif present.vlx secretCLI subcommand removed.vlx logs prunesubcommand removed.depsandsecretstables dropped fromstate.dbin migrations 0010+. The migration runs automatically at daemon startup.