devdock-development
Use DevDock to run changed services in development, configure their routing, and prepare the environment for verification.
SKILL.mdSkills/Skills/devdock-development/SKILL.md
GitHubDevDock development
Use the configured DevDock MCP. A repository is the checkout on the execution host; a workload is an API, worker, cron, or UI. A deployed pod and an active development session are separate states. The development session enables code synchronization and the development runtime.
Tools and lifecycle
Inspect the available tool schemas for exact arguments.
| Tool | Purpose |
|---|---|
| list / status | Discover repositories, workloads, and their current state |
| checkout | Inspect checkout path, branch, revision, and local changes |
| start | Start development for an existing deployment |
| build_start | Deploy a workload and start development |
| run | Execute a command in the pod and obtain its exit result |
| logs / wait | Read output and wait for readiness or a known condition |
| operation_status | Check completion of a durable operation |
| instances / move_plan / move | List linked machines, preview and move a deployment between them |
An exec acknowledgment only proves command submission. Check completion and exit status before claiming success. Likewise an operation receipt or RUNNING_MANAGED is not completion: check operation_status, ready replicas with a stable restart count, and the mounted route. Prove sync by editing a file and reading it back in the pod, and check workload logs after adding a dependency.
- Inspect state and checkout before changing anything. Reuse healthy running development sessions. When the user says not to restart, adopt the running workload; do not
restartorbuild_start. - If the pod exists but development is stopped, start development only.
- If a changed repository's pod is absent or purged, deploy it and start development.
- Unchanged dependencies without development pods use the environment's UAT-US fallback. If UI is needed, deploy and start the relevant UI too.
- Do not routinely purge or restart healthy workloads. If DevDock fails, report the operation ID and useful error to the user. Do not bypass it with direct infrastructure changes.
- If a start hangs in building with no helm output, check that
lastContext.namespacein the checkout's.devspace/cache.yamlmatches the target namespace; a mismatch opens an interactive picker that waits forever.
Machines
DevDock may be linked across machines, such as the laptop and a Linux workspace. instances lists them with their online and auth status. Every tool takes an optional instance UUID; omit it for the machine the MCP runs on. Each machine has its own checkout, and linking copies no code or .env files: a deploy or start builds from the target machine's checkout.
Each deployment is claimed by one machine. Run lifecycle actions, logs, and terminals on the owner. An action on another machine fails with "owned by instance"; do not retry it there. With more than one machine online, replica_create needs an explicit instance.
Move a deployment only when the user asks for it on another machine:
- Run
move_planwith the repository, workload, and target UUID. It returns the owner, whether it is reachable, whether a dev session is live, both checkouts' branch, commit, and dirty state, and the follow-up. - Tell the user if the checkouts differ in branch or commit, or if the source checkout has uncommitted changes. The target runs its own code, so those changes do not move.
- If the owner is unreachable, the move takes the claim over. Confirm with the user that the owner is really gone first; a laptop that is only offline may still be running it.
- Run
move. A reachable owner stops its dev session and releases the claim; the deployment stays. A live session then starts on the target, with build + start when the commits differ. PassfollowUponly to override that choice. Track the returned operation withoperation_status.
Sandboxes
A sandbox is a per-ticket preview: only the ticket's PRs run in it, and every other service falls back to UAT-US. Each sandbox leases one namespace from a fixed pool, so its URLs come from that namespace's ingresses. The personal namespace saibhushan is listed as the default sandbox; keep using the ordinary tools above for it.
| Tool | Purpose |
|---|---|
| sandbox_list / sandbox_status | Sandboxes with slot, power, URLs, members, builds, expiry, activity |
| sandbox_discover | Open PRs whose branch matches a ticket key, as proposed members |
| sandbox_create | Lease a slot and build members; discover: true adds matching PRs |
| sandbox_update | Add or remove members |
| sandbox_build | Rebuild stale members, or rebuild an expired sandbox into a new slot |
| sandbox_wake / sandbox_sleep | Scale members up or down |
| sandbox_expire / sandbox_delete | Free the slot and keep the record / remove it entirely |
| sandbox_head | Record a new head SHA or merge for a member |
| sandbox_controller | Which machine runs the poller, when it last polled, its last error |
Every mutation needs actor: a short name for who asked, such as the ticket key or agent. It shows in the activity log the user reads. logs and run accept sandbox to target a sandbox member; run there also needs actor.
- Before creating,
sandbox_listand reuse the ticket's sandbox if it exists. Rebuild an expired one withsandbox_build; do not create a second. - Create asleep by default. Wake only when you are about to verify, and sleep when done. The controller sleeps idle sandboxes after 30 minutes and expires them after a day unused.
- New pushes to member PRs are picked up by the controller and rebuilt; check
sandbox_statusfordeployedShabefore verifying a fix, rather than rebuilding by hand. - Delete a sandbox only when the user asks or the ticket is done. Merging does not delete it.
- A full pool or a member held by a live dev session fails the operation. Report it; do not free another ticket's slot.
- Builds and wakes return an operation ID; follow it with
operation_status.
Environment hours
Development and UAT-US pods run on EKS nodes that opsbot turns off. When they are off, nothing can be deployed, started, or verified. Do not work around this by rescheduling pods onto always-on nodes or running dependencies elsewhere.
| When (IST) | What happens |
|---|---|
| 09:00 Mon-Fri | Nodes start |
| 22:30 daily | Nodes stop |
| 01:00, 03:00, 05:00, 07:00 daily | Nodes stop again if someone started them |
| 01:00, 07:00 daily | -devspace development pods scale to 0 |
| 12:30-23:15, every 15 min | -devspace pods Available for more than 10 hours scale to 0 |
A scheduled stop is skipped within 105 minutes of the last start. Weekends are off from Friday 22:30 to Monday 09:00, and daytime weekend starts stay up until 22:30.
Nodes are up when kubectl get nodes -l workload=development,type=gp lists Ready nodes (type=mo for UIs). Someone else may have started them; use that window. After nodes return, start brings development pods back. Do not restart.
When verification is blocked by the off window:
- Tell the user it is blocked by environment hours and continue work that does not need pods.
- Only when the user decides it is really needed, they run
/manage-env start eks-uat-usin #ops-manage-env. It is a Slack slash command, so posting that text as a message does not run it. It starts every environment node for everyone. - When the work is done, remind the user to run
/manage-env stop eks-uat-us. Whoever starts off-hours must stop it; missing that three times removes them from the channel. Do not ask for a stop when someone else started it.
Routing and verification
Run every changed repository in development. Set the relevant environment values to saibhushan so API calls reach that user's development pods; preserve unrelated values. Inspect actual network requests and pod logs. A personal frontend URL can still call UAT, so confirm the changed service handled the request. A passing /auth phase proves OIDC only, not that the service handled it.
| Surface | Development | UAT-US |
|---|---|---|
| Dashboard | https://dashboard-saibhushan.vmock.dev | https://dashboard-uat-us.vmock.dev |
| Admin / coach | https://admin-saibhushan.vmock.dev | https://admin-uat-us.vmock.dev |
| Candidate API | https://api-saibhushan-candidate.vmock.dev/<service>/ | https://api-uat-us-candidate.vmock.dev/<service>/ |
| CMC API | https://api-saibhushan-cmc.vmock.dev/<service>/ | https://api-uat-us-cmc.vmock.dev/<service>/ |
| Capabilities API | https://api-saibhushan-capabilities.vmock.dev/<service>/ | https://api-uat-us-capabilities.vmock.dev/<service>/ |
Confirm the app's route and environment configuration before using these URLs. Local checkout paths are supplied by DevDock; do not invent localhost routes.
For deeper setup and routing details, read the DevSpace guidelines.