132a5a2269
Every agent's model assignment now lives in a single-line text file at
.opencode/models/<name>.txt; default.txt is the 27-agent catch-all.
opencode.json's agent.<name>.model uses
{file:./.opencode/models/<name>.txt} interpolation, and
tools/_opencode_worker.py reads the same files at session-create to
stamp the resolved model on the session record (observability + drift
sentinel; OpenCode does NOT propagate session-level model to
prompt_async — schema for that is undocumented and deferred to Stage
2). 39 .md frontmatter `model:` lines stripped; the two intentional
inheritors (task-implementor, agent-evolution-pool-supervisor) keep
their model-less frontmatter.
Operator workflow for swapping a model is now: edit
.opencode/models/<role>.txt, restart OpenCode so opencode.json's
{file:...} re-resolves, run the dispatcher. Live-swap without restart
was attempted (override on prompt_async); OpenCode 0.x silently
dropped those requests (200 OK, no assistant message) and the
prompt_async override was reverted. The session-create override
remains for observability + drift detection.
End-to-end validation (2026-05-10): dispatch_review.py on PR #25 with
default.txt=openai/gpt-5-mini produced a clean REQUEST_CHANGES review
in 26 s for ~$0.016; dispatch_implementer.py on PR #30 with
tier-qwen-* files remapped to openai/{gpt-5-nano, gpt-5-mini,
gpt-5-codex} ran the full implementation-worker → tier-dispatcher →
estimator-implementation → tier-qwen-med → task-implementor →
git-isolator-util chain in 16 min with model=gpt-5-mini end-to-end.
Also documents the printenv VAR form as the only allowed env-read in
implementation-worker.md and task-implementor.md (live testing
showed the worker burning 2–4 turns on permission-denied
trial-and-error trying printf and echo variants).
Tests: 21 in tests/auto_agents/test_opencode_worker_models.py
(resolver semantics with caplog assertions on every malformed-input
path; session-create body shape; prompt_async body never carries
model; three repo-level invariants — every {file:...} reference
resolves, every .md is wired or in the inheritor allowlist, no .md
has a model: frontmatter). 1027 auto_agents tests pass / 3 skipped.
Note: .opencode/models/default.txt and the three tier-qwen-*.txt
files are committed with their OpenAI swaps in place (gpt-5-mini,
gpt-5-nano, gpt-5-mini, gpt-5-codex respectively) because the
CleverThis HuggingFace endpoints are paused. Revert with `git diff
HEAD~1 -- .opencode/models/*.txt | git apply -R` if/when they come
back.
Co-authored-by: Cursor <cursoragent@cursor.com>
4.8 KiB
4.8 KiB
description, mode, hidden, temperature, reasoningEffort, color, permission
| description | mode | hidden | temperature | reasoningEffort | color | permission | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Git push utility — primitive. Inside an existing /tmp/ clone, pushes the named branch to `origin`. Authentication uses the PAT-in-URL pattern set up by the original `git-clone-util` call (no extra credentials needed). Optionally performs `--force-with-lease` for safe force pushes. | subagent | false | 0.0 | high | #5555FF |
|
Git Push Util
You are the push primitive for the git-utilities skill. Execute these
steps exactly.
Parameters
| Name | Required | Default |
|---|---|---|
repo_dir |
yes | |
branch |
yes | |
force_with_lease |
no | false |
Procedure
-
Safety check. If
{repo_dir}does not start with/tmp/, return:ok: false error: "repo_dir must be under /tmp/" -
Push.
If
force_with_leaseisfalseor not provided:git -C {repo_dir} push origin {branch}If
force_with_leaseistrue:git -C {repo_dir} push origin {branch} --force-with-lease -
On lease violation (exit code non-zero, message contains "stale info" or "rejected" or "non-fast-forward"):
ok: false error: "lease violation: remote has commits not present locally on {branch}" -
On success, get remote SHA:
git -C {repo_dir} rev-parse origin/{branch}Store as
{remote_sha}. -
Return:
ok: true remote_sha: {remote_sha}
On any other failure:
ok: false
error: <one-line description>
Fallback to environment variables
For optional parameters not provided in your prompt, you may fall back to the environment variables listed below. Always give precedence to values explicitly passed in the prompt. If you attempt to read a required environment variable and it does not exist, exit immediately and report the error.
| Information | Env Variable | Required? | Local Variable |
|---|---|---|---|
| Git name | GIT_USER_NAME |
Yes | git_user_name |
| Git email | GIT_USER_EMAIL |
Yes | git_user_email |
| Forgejo PAT | FORGEJO_PAT |
Yes | forgejo_pat |
| Repository base url | FORGEJO_URL |
No | forgejo_url |
| Repository owner | FORGEJO_OWNER |
No | forgejo_owner |
| Repository name | FORGEJO_REPO |
No | forgejo_repo |
CRITICAL Rules
- CRITICAL: Never under any circumstances are you to ask any questions of the user. If you have a question, use your best judgement and answer it yourself. Even if you are completely unsure of the answer, make your best guest. It is COMPLETELY FORBIDDEN for you to ever ask a question.