Agent coordination¶
Several AI coding agents work on this repository at the same time: cloud sessions and agents in local editors. This page is how they avoid undoing each other's work, cancelling each other's CI, or shipping a release or a production deploy without the latest fixes. Read it before you push, merge, tag, release or deploy, and add a line to the log at the bottom when you do one of those.
Rules¶
- No direct pushes to
main. Work on a branch and open a pull request; merge only whenCI OKandCodeQL OKare green on the PR's head. - One release at a time, run by one agent. The maintainer pushes the
vX.Y.Ztag; the agent that owns the release (see Current owners) dispatches.github/workflows/release.ymlon it. Nobody else dispatches, re-runs or re-tags it. - Between a tag and its published release, nothing merges to
main. The release waits forCI OKon the tagged commit, and a new push tomaincancels that CI run (one concurrency group per branch). That is what delayed v0.1.7 by an hour. - Claim before you edit. Add your files or area to Current owners first; stay off files another agent has claimed until their PR merges, or ask them.
- Production runs published releases only. Deploy a release's images by version
(
VEGADUTA_VERSION=X.Y.Z); never images built from a branch or frommain. - Never change
APP_ENCRYPTION_KEYon a deployment that has data (AGENTS.md, rule 5).
Current owners¶
| Agent | Where | Owns |
|---|---|---|
| Release / install agent | cloud session, branch claude/why-the-hell-k4tttl |
installer (installer/), launchers (scripts/vegaduta, scripts/vegaduta.ps1), deploy/compose/ personal and local-AI overlays, .github/workflows/release.yml, releases and tags; PR #13 (platform-model warm-up: core/chat/PlatformPoolWarm*, web/app/lib/warmPlatformModel.ts, web/app/components/chat/ModelWakingUpNotice.tsx) |
| Local-model agent | cloud session, branches ccr-*, feat/chat-threads-list |
local-model performance (docker-compose.local-ai.yml keep-alive, Ollama options, web/app/components/assistant/LocalModelTip.tsx); chat history kept by default (#15); the Assistant's stored history (branch feat/chat-threads-list: core/agents-turn/.../branching/ChatThreads*, ChatBranchFlagGate, ChatTranscriptService, tenant migration V661, web/app/components/assistant/useAssistantThreads.ts, useAssistantTurn.ts, web/app/lib/api/assistant.ts, regenerated OpenAPI/SDK/contract files), through PRs |
| Reels / marketing agent | cloud session, branch claude/great-ptolemy-qcq7ve, continuing on a local machine |
docs/marketing/reels/ (promo reel scripts, recorder, assembler, demo data); touches nothing else |
| Personal start-up agent | local session on this machine, working tree of branch claude/great-ptolemy-qcq7ve (the PR will come from a clean branch off main) |
personal-tier start time and first-install size: the health checks and JVM flags in deploy/compose/personal.yml and docker-compose.search.yml, the model-probe step of scripts/vegaduta, the core/Dockerfile jar layer, and the start-up switches in core/app-config/.../application-personal.yml. These overlap the release / install agent's launcher and compose files, so the change goes through a PR the release / install agent reviews before it merges |
| Release-readiness lead (v1.0.0) | local editor (Claude Code on the maintainer's Mac), branches rr/* |
the v0.1.9 → v1.0.0 readiness audit and its fixes, one small PR per area, each listing its files: image dependency CVEs (core/pom.xml dependency management, web/package.json and web/Dockerfile, the Node runner and browser-runner Dockerfiles and package.json files, and only the Node toolchain stages of core/Dockerfile); web/proxy.js, web/app/** fixes and tests/e2e/tests/**; channel and webhook hardening in core/omnichannel*, core/security, core/tenancy (erasure), core/audit, core/agents-tools (MCP URL checks), core/agents-interop; .github/workflows/{ci,zap,static-gates,pypi-release}.yml, .github/dependabot.yml, scripts/ci/**, Makefile; sdk/**, CITATION.cff, contracts/; documentation under docs/, root policy files and docs/maintainers/v1.0.0-definition-of-done.md. Files claimed by the release / install agent and the personal start-up agent (installer/, scripts/vegaduta*, install.sh, release.yml, deploy/compose personal and local-AI overlays, core/Dockerfile apart from the Node toolchain stages, tests/install/) are only touched in PRs that say so in their title and wait for that owner's review before merging. Never tags, dispatches or re-runs a release; merges nothing. Runs stacks only under its own Compose project names (rr-*) |
| Lean personal edition agent | local session, branches lean/* merged into feat/personal-lean-edition (a pull request off main follows; nothing is pushed yet) |
the edition switch and what a personal install leaves out: core/security/.../edition/ (@ConditionalOnEditionFeature, EditionFeature, EditionInfo) and the one-line class annotations it adds across core/tenancy, core/payments, core/billing, core/platform, core/templates, core/admin (SCIM), core/omnichannel (Slack, Discord, Teams, X), core/mcpserver, core/agents-interop (A2A, directory), core/sarvam, core/elevenlabs, core/voice, core/workflow (share voice), core/imagegen (video and demo media); PublicStatusController (the edition object); web/app/lib/edition.ts and the route table, web/proxy.js, the channel, card and platform-admin allowlist changes; VEGADUTA_EDITION in deploy/compose/personal.yml, .env.example and scripts/vegaduta; scripts/ci/boot-check.sh / startup-profile.sh; CHANGELOG.md, docs/configuration.md, docs/personal-mode.md. Overlaps the personal start-up agent's application-personal.yml and the release / install agent's launcher and compose files: the change goes through a PR they review before it merges. ci.yml (a personal boot-check job) and the release workflows stay with the release agent |
| IDE plugins / console pagination agent (Devin) | local editor, branch feat/web-list-pagination |
pagination-only edits in web/app/: admin/instructions/PromptRegistryPanel.tsx, PromptHistory.tsx, promptRegistry.test.tsx, ai-models/page.tsx, components/AdminAccessMatrix.tsx, SentinelsPanel.tsx, clips/ClipStudio.tsx, knowledge/SemanticSearchPanel.tsx, knowledge/FaceEnrollmentControls.tsx - overlaps the release-readiness lead's web/app/** claim, so the PR says so in its title and waits for their review |
| App Builder change-turn agent (Devin) | local editor, branch feat/build-change-progress |
the /build change turn: POST /generate/stream (SSE stages) + summary + parallel file reads in services/app-builder, the summary field in core/agents-studio/.../appbuilder (generate-files contract), and web/app/build/** (lib.ts generateStream, ChatPane.tsx progress/revert, ChatResultEntry.tsx summary + per-file +/-, edgeFiles.ts, studio/{patch,engine,useProjectSession}.ts, suggestions.ts diffFileStats) - overlaps the release-readiness lead's web/app/** claim, so the PR says so in its title and waits for their review. Java compiles on CI only (no JDK 21 on this machine) |
| Production agent | local editor | the production deployment: which release it runs, its configuration and its verification. Does not change application code without a PR |
What production must run¶
| Release | Status | What it brings |
|---|---|---|
| v0.1.7 | published 2026-10-21 | Setup and install fixes. These reach users through the Setup app and the release downloads, not through the server: the console's /downloads page reads the latest GitHub release at request time (cached up to an hour), so it offers 0.1.7 without a redeploy. Production should still run the 0.1.7 images. |
| v0.1.8 | published 2026-10-21 07:16 UTC, latest; production deploys it next (Rollout below) | Platform model warm-up: POST /api/platform-llm/warm loads the pool model when someone signs in, and the chat says "The model is starting up..." after 8 s without a reply. This fixes the 70 s first reply in production only once production runs 0.1.8. |
After a production deploy, check¶
GET /actuator/healthisUPon core, and the console loads./downloadslistsVegaDuta-Setup-<latest>.dmgandvegaduta-setup-windows-amd64.zipfor the latest release.- From 0.1.8: signed in,
POST /api/platform-llm/warmanswers202, and core logsPlatform model '<model>' warmed in <n> ms. The next first chat answers without the long wait. Turn it off withAPP_PLATFORM_LLM_WARM_ENABLED=falseif the pool provider bills per request and that matters. - The core image tag in use matches the release you meant to deploy.
Production setting: the admin host¶
There is no separate admin app since v0.1.3: the platform-admin console is web at
/platform-admin. admin.vegaduta.ai works only when the Container App that has that custom
domain bound sets PLATFORM_ADMIN_HOST=admin.vegaduta.ai (web/proxy.js then redirects the host
to /platform-admin; the chart and docker-compose.domain.yml set it, Container Apps do not).
Without it the host shows the normal start page. Keycloak's agentic-ai-web client must also
list https://admin.vegaduta.ai/* as a redirect URI. Check: https://admin.vegaduta.ai lands on
/platform-admin. Until then: https://app.vegaduta.ai/platform-admin.
Rollout: v0.1.8 (production is Azure Container Apps)¶
Production (vegaduta-ai-az-rg, images in vegadutaaiazacr.azurecr.io) runs the Container Apps
listed by the production agent, not the Compose stack or the Helm chart. That matters for one
setting below. What is live before this rollout is SHA 9a8139f2; v0.1.8 is 24 commits after
it and changes no Flyway migration, so the new core revision boots with no schema change
and can serve beside the old one while Container Apps switches traffic.
- Order: core first, then web and web-admin (same image), then sidecar and
mcp-stdio-runner. Pull
ghcr.io/cd-lc/<image>:0.1.8, retag into ACR,az containerapp update --image. Single revision mode with the liveness probe keeps the old revision serving until the new one passes its probes;minReplicas: 1keeps capacity during the roll. - Set the chat-history flag on core in the same update. #15 turns
APP_CHAT_BRANCHING_ENABLEDon by default indocker-compose.ymland the chart only; a Container App's env is its own, and core's built-in default is off. Check first (az containerapp show -n vegaduta-ai-az-core -g vegaduta-ai-az-rg --query properties.template.containers[0].env) and add--set-env-vars APP_CHAT_BRANCHING_ENABLED=trueto the core update, so one revision roll carries both the image and the flag. Nothing else is needed: the warm-up (#13) is on by default (APP_PLATFORM_LLM_WARM_ENABLED=falseopts out); the tables it writes to exist since tenant migration V450. - What changes for people: the chat page's conversations are kept in Postgres for 30 days
(
app.chat.branching.retention-days) instead of expiring from Redis after 24 h; edit and regenerate appear on the chat page. A conversation still inside its 24 h window is absorbed in full the first time it is opened after the rollout; one that had already expired is gone and cannot be recovered. The Assistant page does not record its turns yet and its thread list is still per browser: that comes withfeat/chat-threads-listin 0.1.9. - Rollback:
az containerapp update --image vegadutaaiazacr.azurecr.io/<svc>:9a8139f2per service, core last. Leaving the flag on during a rollback is harmless (rows stay until the purge); removing it only stops new rows. - Checks after the roll (in addition to the list above): core logs show no Flyway migration
applied; signed in,
GET /api/agents/<any agent id>/chat-branching/capabilitiesanswers{"enabled":true}(proves the env var took effect); open an existing chat, send one message, reload: it is still there;POST /api/platform-llm/warmanswers202. Then add a Log line.
Log¶
Newest first. One line per push, merge, tag, release or deploy: time (UTC), agent, what.
- 2026-10-23 09:44, release-readiness lead: merged the v1.0.0 readiness pull requests at the maintainer's
request, each squash-merged with
CI OKandCodeQL OKgreen on its head: #27, #100, #105, #91, #103, #113, #90, #87, #108, #106, #102, #95, #98, #96, #109, #89, #110, #111, #112, #115, #117, #94, #104, #107, #114, #97, #93, #92, #88, and the release-notes PR #134 (the readiness PRs' CHANGELOG bullets, taken out of them so they stopped conflicting). Not merged: the Spring Boot 4 port #99 (draft, waits for the soak decision), Dependabot and other agents' PRs. No tag and no release in flight. Generated docs (module graph, config reference, bundled platform guide) had drifted onmainand were regenerated inside #92, #93 and #97. - 2026-10-23 02:37, release-readiness lead: merged #118 (
next16.4.2: two critical RCE advisories and a DoS published 2026-10-22, main and the published 0.1.9 web image shipped 16.3.6) at the maintainer's request, afterCI OKandCodeQL OKwere green on its head5293fa37; result56e3411f. No tag and no release in flight. A patch release of the web image is still needed for installs to get the fix: the release agent decides. #88 also bumpsnextand needs a trivial rebase. - 2026-10-22, lean personal edition agent: nothing pushed or merged to
mainyet. Claimed the areas in the row above (tenancy, payments, billing, platform, omnichannel, mcpserver, web, deploy/compose personal files, the three docs). The work sits on local brancheslean/*merged intofeat/personal-lean-edition; the release / install agent and the personal start-up agent are asked to review it before the pull request merges. Not run on a stack yet; see the CHANGELOG entry for what was verified. -
2026-10-22 11:52 UTC, personal start-up agent: merged #83 (
personal --minimaland--no-valkeyno longer exit in silence) and #86 (plan page for a lighter personal install) after green CI. Open and waiting on CI: #82 (start-up budget), #84 (preparing an install never stops another install), #85 (core image stores the jar once). Claimed the files in the row above; the release / install agent's review of #82 and #84 is welcome. Measured on one laptop with Docker Desktop, empty database, local Ollama: published 0.1.9 took 39-64 s from launcher start to a healthy console, the branch 23-28 s. -
2026-10-21 15:05, release agent: the v0.1.9 Release run on
3c3ce0bstopped at the voice-agent image scan (critical GHSA-6q48-6c7w-9gw2 in certifi 2026.7.22, published after 0.1.8); nothing was published (no draft, floating tags unmoved). Merged #26 and #16, bumped certifi in five service locks; v0.1.9 is re-tagged on the result. Closed #20, its log line is below. - 2026-10-21 08:45, production agent: deployed v0.1.8 to the Azure Container Apps production
(core, web, web-admin, sidecar, mcp-stdio-runner; all revisions Healthy, public endpoints 200,
/downloadslists 0.1.8). Watch-outs hit on the way: GHCR pulls on an arm64 machine need the linux/amd64 manifest digest (docker buildx imagetools createregistry-to-registry is the fastest correct route),az containerapp update --imageneeds--container-name, and web-admin listens onPORT=3001. Also repaired the whatsapp-qr bridge app (wrong env names, scaled to zero) and setAPP_WHATSAPPQR_*on core. One stalewqr_*external account still polls a tenant schema missing V27 - cleanup needs DB access. - 2026-10-21 07:30, release agent: v0.1.8 published (tag on
3dbf32a) and verified: latest release;.dmg, Windows zip and source tarball matchSHA256SUMS; no symlinks in the tarball;coreandweb0.1.8 images on GHCR for amd64 and arm64. Merged #17 (rollout note).mainis open again; #18 waits until production runs 0.1.8, then goes out as 0.1.9. - 2026-10-21 05:55, release agent: v0.1.7 published and verified (installers, checksums, no symlinks in the source tarball, images pull). PR #13 marked ready for 0.1.8.
- 2026-10-21 03:58, local-model agent: merged #12 to
main, which cancelled the v0.1.7 tag's CI; the release agent re-ran it. Rule 3 above comes from this. - 2026-10-23, IDE plugins / console pagination agent (Devin): opened a PR off
mainadding the standardusePagination+PaginationControlsto the record lists that did not page (AI Model Control features, prompt registry catalog, prompt history, admin access matrix, Sentinels synced events, Clip Studio image picker, semantic-search scope chips, face enrollments) and updated the registry test for the pager's secondrole=statuslive region. Everything else already pages client- or server-side. Merged as #138 (15c449ae9) after greenCI OK/CodeQL OK; the PR also regenerateddocs/architecture/core-module-graph.md(stale onmainsince the agents-jobs/providers additions).