Operate
Ota Assist
Guided contract editing that reduces YAML burden without turning ota into chat or hidden mutation.
Recommended next
Why assist exists
Ota already knows how to validate contracts, inspect declared topology, and explain readiness truth. ota assist exists so ota can turn that knowledge into one reviewed mutation at a time instead of making maintainers hand-author every YAML block.
ota assist is not chat and must not become a second source of truth. It is a deterministic contract operation surface above the same ota.yaml the rest of ota already trusts.
Preview is the default. ota assist ... only shows the proposed contract change. Nothing is written until you rerun that same command with --write.
- use preview mode first to inspect the exact proposal, then rerun with
--writeonly when you want ota to update the contract - assist proposes one bounded change instead of broad contract inference
- assist refuses when contract or repo truth is too weak for a safe proposal
- assist uses the same validator and doctor surfaces after apply instead of inventing a parallel authoring engine
Current shipped operations
The current shipped assist surface has seven deterministic operations: ota assist declare-readiness, ota assist declare-service, ota assist bind-task, ota assist wire-setup, ota assist declare-env, ota assist add-task, and ota assist normalize.
ota assist declare-readinesstargets a task runtime with--task <name>or a top-level managed service with--service <name>ota assist declare-servicecreates or refines one top-level managed service with--name <service>plus either explicit local manager/endpoint inputs or one canonical workspace producer binding through--producer-repo <repo> --producer <task>[:listener]ota assist bind-taskcreates or refines onetasks.<consumer>.targets.<name>edge to a producer task runtime listenerota assist wire-setupcreates or refinestasks.setupwith one explicit setup body plus an optionalsetup.requires_servicespre-setup service phaseota assist declare-envcreates or refines one root env requirement, one declared env source, or one explicittasks.<name>.env.<KEY>overrideota assist add-taskcreates one newtasks.<name>entry with an explicit execution body and optional fixed service listener inputsota assist normalizemoves one existing setup-like task into the canonicaltasks.setupslot- use
--member <name>when the contract lives in a monorepo member overlay - use
--jsonwhen an editor, agent, or CI tool needs the machine proposal instead of review text - use
--style spring-http|http|tcpfor task readiness shape selection, and--style compose-healthfor compose-managed service health state
ota assist declare-readiness --task devota assist declare-service --name postgres --manager compose --port 5432 --style tcpota assist declare-service --name api --manager compose --compose-file docker-compose.yml --port 3000 --style http --writeota assist declare-service --name worker --manager compose --compose-file docker-compose.yml --style compose-healthota assist declare-service --name user-api --producer-repo api --producer dev:http --writeota assist bind-task --task smoke --target api --to dev:httpota assist wire-setup --run "npm install" --service postgresota assist declare-env --name APP_PORT --required true --default 8080ota assist add-task --name smoke --run "cargo test"ota assist normalize --task bootstrap --into setupTask runtime examples
Task-targeted readiness works best when the service task and listener are already declared in the contract.
- for a Spring Boot task, ota can usually infer the
httplistener and propose the strongerspring-httpprofile - for a single TCP listener, ota can propose TCP readiness without inventing an HTTP path
- for mixed-listener runtimes, ota now derives the style from the selected readiness listener instead of guessing from the runtime abstractly
ota assist declare-readiness --task dev --style spring-httpota assist declare-readiness --task postgres --style tcpManaged service examples
Top-level managed services are stricter because a service endpoint only proves address and port projection, not protocol truth.
- if a managed service already has structured readiness, assist can refine that shape
- if the service does not already carry structured readiness, pass
--styleexplicitly - use
--style compose-healthwhen the service is compose-managed and container health state is the truthful readiness source - use
ota assist declare-servicewhen the service block itself does not exist yet or still needs manager and endpoint truth ota assist declare-service --style compose-healthis valid for compose-managed services and writesreadiness.kind: compose_healthwithout forcing a host endpoint projection- use
ota assist declare-service --producer-repo <repo> --producer <task>[:listener]when the service is canonically owned by another repo in the same workspace and local manager/readiness YAML would only duplicate that truth - this keeps assist from quietly proposing an HTTP
/healthprobe for a plain TCP service such as Postgres or Redis
ota assist declare-readiness --service api --style httpota assist declare-readiness --service postgres --style tcpota assist declare-service --name worker --manager compose --compose-file docker-compose.yml --style compose-healthota assist declare-service --name postgres --manager compose --compose-file docker-compose.yml --port 5432 --style tcpota assist declare-service --name cache --manager host --port 6379ota assist declare-service --name user-api --producer-repo api --producer dev:httpMonorepo member behavior
When you pass --member, assist writes only the targeted member overlay while validating the merged member contract through the root monorepo path.
- this keeps the write narrow to the member file that actually owns the override
- validation still uses the merged contract truth, so assist does not pretend the member overlay is a standalone repo contract
ota assist declare-readiness --member api --task dev --style spring-httpota assist bind-task --member api --task smoke --target api --to dev:http --writeTask binding examples
ota assist bind-task is the current assist slice for wiring one consumer edge to one producer runtime listener through the contract.
- use it when the producer task runtime already exists and the remaining gap is one truthful
targets.<name>binding - use
--to <task>only when the producer exposes exactly one declared listener or the existing target already pins one safe listener - use
--to <task>:<listener>when the producer has multiple listeners and you need one explicit edge - the current shipped slice binds to producer task runtimes, not directly to top-level managed service endpoints
ota assist bind-task --task smoke --target api --to dev:httpota assist bind-task --task smoke --target api --to dev --jsonota assist bind-task --task smoke --target api --to dev:http --address-view host --activation ensure_readySetup wiring examples
ota assist wire-setup is the narrow assist slice for the phased ota up model.
- create
tasks.setuponly when you have an explicit setup body to declare - use
--service <name>to define which managed services must start before setup runs - use
--clear-serviceswhen setup should no longer have a pre-setup service phase - assist preserves unrelated existing setup fields instead of rewriting the whole task
ota assist wire-setup --run "npm install"ota assist wire-setup --run "npm install" --service postgres --service redisota assist wire-setup --member api --run "npm install" --service postgres --writeEnv declaration examples
ota assist declare-env is the narrow assist slice for reviewed env requirements, declared source files, and one task-local env override at a time.
- use root env requirements when one value should stay visible, reviewable, and enforceable in the contract
- use declared env sources only when the repo intentionally depends on that file instead of ambient shell state
- use task-local env only for one explicit task override such as a fixed API base URL or
CI=true --prependand--appendare restricted toPATHso list-style env composition stays narrow and truthful--memberstill validates the merged monorepo contract even though assist only writes the targeted member overlay
ota assist declare-env --name APP_PORT --required true --default 8080ota assist declare-env --source-kind dotenv --source-path .env.local --must-exist true --jsonota assist declare-env --task smoke --name API_BASE --value http://127.0.0.1:3000 --writeTask creation examples
ota assist add-task is the narrow assist slice for one new task declaration at a time.
- use it when the contract needs a new task entry and the right next move is a reviewed starter task instead of raw YAML authoring
- use
--runor--scriptfor every kind exceptsandbox, which can use the boundedecho sandboxstarter body - use
--kind serviceonly when you can declare one explicit listener, protocol, and port instead of asking assist to guess runtime shape - use
--memberwhen the new task belongs in a monorepo member overlay instead of the root contract
ota assist add-task --name smoke --run "cargo test"ota assist add-task --name dev --kind service --run "npm run dev" --listener http --protocol http --port 3000 --jsonota assist add-task --name sandbox --kind sandboxota assist add-task --member api --name smoke --run "npm test" --writeCanonical setup normalization
ota assist normalize is the narrow assist slice for moving one existing setup-like task into the canonical tasks.setup slot.
- use it when the repo already has one setup-like task under a local name such as
bootstrapand the right next move is to make that truth canonical - the current shipped scope is only
--into setup - assist deletes the original
tasks.<name>entry in the same write target and writes the moved task undertasks.setup - member-scoped normalize only works when the selected task is declared in that member overlay file, not inherited from the root contract
ota assist normalize --task bootstrap --into setupota assist normalize --member api --task bootstrap --into setup --writeWhen assist refuses
Refusal is part of the trust model. When repo truth is too weak, ota should stop instead of guessing.
- multiple candidate listeners with no safe selection
- managed service with no protocol signal and no explicit
--style - a new managed service without an explicit manager kind
- a service with multiple endpoint projections and no explicit
--endpointwhen assist cannot choose safely - a producer task binding with multiple listeners and no safe explicit or inherited listener selection
- a new setup declaration without an explicit
--runor--scriptbody - an
ota assist wire-setupservice name that is not already declared underservices - an
ota assist declare-env --task <name> --name <ENV>request without--valuefor the task-local env write - an
ota assist declare-envrequest that tries to use--prependor--appendon anything exceptPATH - an
ota assist declare-envrequest that combines--secret truewith a new--defaultvalue - an
ota assist add-taskrequest for a task name that already exists in the effective contract - an
ota assist add-task --kind servicerequest without--listener,--protocol, or--port - an
ota assist add-task --kind setuprequest that does not target--name setup - an
ota assist normalize --task <name> --into setuprequest whentasks.setupalready exists - a member-scoped
ota assist normalizerequest where the selected task is inherited from the root contract instead of declared in the member overlay - task or service target that does not exist in the declared contract
- explicit
--style httpagainst a selected TCP listener - replacement that would be surprising still shows the current readiness block before the proposed one in text preview
JSON and schema
Editors, agents, and CI should consume the assist JSON contract instead of scraping review text.
- use
mode,subject,inputs,assumptions,changes,validation, andnextas the stable machine fields - the live schemas for the current shipped assist surface are
assist-declare-readiness.json,assist-declare-service.json,assist-bind-task.json,assist-wire-setup.json,assist-declare-env.json,assist-add-task.json, andassist-normalize.json - use the JSON Output page when you need the public schema URL and the exact payload contract
ota assist declare-readiness --task dev --jsonota assist declare-service --name cache --manager host --port 6379 --jsonota assist bind-task --task smoke --target api --to dev --jsonota assist wire-setup --run "npm install" --service postgres --jsonota assist declare-env --source-kind dotenv --source-path .env.local --jsonota assist add-task --name dev --kind service --run "npm run dev" --listener http --protocol http --port 3000 --jsonota assist normalize --task bootstrap --into setup --json