Skip to content

fix: chat actually runs solves — inject AGENTS.md via opencode instructions - #12

Merged
Rchari1 merged 1 commit into
mainfrom
rchari/fix-agent-instructions
Jun 26, 2026
Merged

fix: chat actually runs solves — inject AGENTS.md via opencode instructions#12
Rchari1 merged 1 commit into
mainfrom
rchari/fix-agent-instructions

Conversation

@Rchari1

@Rchari1 Rchari1 commented Jun 17, 2026

Copy link
Copy Markdown
Member

Fixes the amicode chat behaving like vanilla opencode — it "explored the codebase" and never authored a script or ran amico-run, so the Run Inspector was never fed. Stacked on #11 (β.6); base rchari/beta6-demo.

Root cause (from ~/.local/share/opencode/log)

The extension writes the amico AGENTS.md (the "author a Julia script → run amico-run" workflow) into a temp project dir and starts opencode serve there. But opencode loads agent instructions from the session's working directory, and its embedded web UI runs the session in the VS Code workspace folder (observed cwd=/Users/raghavchari/amico), which has no AGENTS.md. So the agent got zero amico context → generic opencode exploring the vault, never touching solve_template.jl or amico-run. Secondary: amicode.juliaProject's "" default slipped past ?? "UNSET", rendering a blank --project.

Fix — directory-independent instruction injection

Inject the amico AGENTS.md via opencode's instructions config, which is loaded for every session regardless of cwd:

  • buildOpencodeConfigContent(agentsPath)OPENCODE_CONFIG_CONTENT spawn env. Verified empirically that this merges over the user's global config — the Bedrock model/provider survive, instructions is added.
  • {{TEMPLATE_PATH}} placeholder in AGENTS.md substituted to the bundled absolute template path (session cwd is the workspace, not the temp dir). The solve script already writes to /tmp/amicode-work, so it's cwd-independent.
  • resolveJuliaProject(config) defaults to ~/.amico/julia (the β.4-provisioned project) when unset.
  • Dropped the now-vestigial temp-dir template copy and .opencode/opencode.json.

No vault pollution, no clobbering the user's opencode config — just one spawn-env var.

Verification

  • Unit/guard (CI): 45 amico-run + 37 extension green. New tests cover resolveJuliaProject (default + trim), buildOpencodeConfigContent, {{TEMPLATE_PATH}}/{{JULIA_PROJECT}} substitution with no residual placeholders, no temp-dir copy/.opencode write, and the AGENTS.md absolute-path guard.
  • Mechanism (dev machine): started opencode with the injection in an empty workspace (no AGENTS.md); GET /config showed instructions:[…/AGENTS.md] and the global Bedrock model (merge confirmed).
  • Behavioral (dev machine): a live probe in that empty workspace — "In one sentence, what is your job?" — returned "help a quantum-control researcher synthesize optimal-control pulses with Piccolo (Julia) by authoring and launching Julia scripts… while the Run Inspector renders the live solve." — the injected persona, proving directory-independent delivery. (The amico-run solve-execution path itself is already proven in β.6: demo dry-run + failure fallback (closes #6) #11 Task 6 at F=0.9998. A full live solve turn intermittently stalls on Bedrock streaming — environmental, unrelated to this change.)

🤖 Generated with Claude Code

@Rchari1

Rchari1 commented Jun 17, 2026

Copy link
Copy Markdown
Member Author

@jack-champagne

@jack-champagne jack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave it a look — right fix, and it closes the real β.3 gap where the chat never actually ran a solve (AGENTS.md was written where opencode never read it). The injection path is now tested (opencode_config.test.ts), CI green. Nothing blocking.

Taste / non-blocking

  • resolveJuliaProject doesn't expand a leading ~, so amicode.juliaProject=~/foo reaches --project literally; the sibling resolveRunsRoot already handles ~.
  • boot_smoke.mjs still synthesizes the pre-fix config layout — harmless (liveness gate only) but stale.

* does NOT catch — hence an explicit empty check rather than a nullish one.) */
export function resolveJuliaProject(configValue: string): string {
const v = configValue.trim();
return v === "" ? path.join(os.homedir(), ".amico", "julia") : v;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doesn't expand a leading ~~/foo reaches --project literally. resolveRunsRoot already handles this.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in e21539c (on #23, stacked above) — resolveJuliaProject now expands a leading ~ (~ → home, ~/foo → join(home, foo)), matching resolveRunsRoot. Test added in opencode_config.test.ts. Folded into #23 rather than restacking the chain for a one-liner.

…tually runs solves

The chat behaved like vanilla opencode — 'exploring the codebase', never
authoring a script or running amico-run, so the Run Inspector was never fed.
Root cause: the extension wrote AGENTS.md into a temp project dir, but
opencode runs the chat session in the VS Code workspace folder (e.g. ~/amico),
which has no AGENTS.md — so the amico solve workflow never reached the agent.

Fix (directory-independent): inject the amico AGENTS.md via opencode's
`instructions` config, loaded for every session regardless of its cwd.
- buildOpencodeConfigContent(agentsPath) → OPENCODE_CONFIG_CONTENT spawn env;
  merges over the user's global config (Bedrock model/provider preserved).
- AGENTS.md references the template by absolute {{TEMPLATE_PATH}} (session cwd
  is the workspace, not the temp dir); solve script already goes to /tmp.
- resolveJuliaProject defaults to ~/.amico/julia when unset (the VS Code config
  default '' slipped past the old `?? "UNSET"`, rendering a blank --project).
- Drop the now-vestigial temp-dir template copy + .opencode/opencode.json.

Verified: /config shows instructions merged with the global model; and a live
probe in an empty workspace (no AGENTS.md) had the agent answer 'help a
quantum-control researcher synthesize optimal-control pulses with Piccolo...'
— the injected persona, confirming directory-independent delivery.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1
Rchari1 force-pushed the rchari/beta6-demo branch from 2363f8c to ddec597 Compare June 21, 2026 01:46
@Rchari1
Rchari1 force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17b Compare June 21, 2026 01:46
Rchari1 added a commit that referenced this pull request Jun 22, 2026
…ck review nits

The real "plots never display" bug: LiveRunSink shared one counter between
image() and iter(). run.log AMICODE_ITER lines stream once per iteration and
race the counter to max BEFORE the lagging PNG frames land (solver logs iter=k,
then writes iter_k.png), so every image() hit `k <= latest` and was dropped —
blank inspector for the whole solve. Split into SinkDedup: frames dedup only
against frames; log lines advance a separate high-water mark for the status bar.

Extracted SinkDedup to the pure, vscode-free run_dir_reader layer so the live
path is finally unit-tested (Jack #9: "no test covering the live status-bar /
incremental inspector path" — the exact gap this regression slipped through).

Also folds in the remaining non-blocking review nits (kept here rather than
restacking the 7-deep chain to place one-liners on their home branches):
- #13: #runlabel was styled but never populated → setRunLabel + webview handler.
- #12: resolveJuliaProject now expands a leading ~ (parity with resolveRunsRoot).
- #9:  server_manager ServerOptions.env comment no longer cites the removed
       AMICODE_EXTENSION_URL/MCP-callback env.
- #9/#11: AGENTS.md step-2 author path now matches step-3 run path
       (/tmp/amicode-work/solve.jl) and the invocation passes --lab default
       (run provenance — amico-run supports --lab).

Plus the cold-start display polish already in flight on this branch: launch
stays idle for a prior finished run (no stale plot), and the placeholder toggles
via style.display (the [hidden] attr was overridden by .placeholder{display:flex}).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Rchari1

Rchari1 commented Jun 22, 2026

Copy link
Copy Markdown
Member Author

@jack-champagne both non-blocking items noted — the ~-expansion is fixed in e21539c (on #23, with a test). Leaving the stale boot_smoke.mjs config-layout synthesis as a follow-up since it's liveness-gate-only. Thanks!

@jack-champagne

Copy link
Copy Markdown
Member

Instruction-injection fix is right — OPENCODE_CONFIG_CONTENT merges over the user's global config (instructions added, Bedrock model/provider preserved), and resolveJuliaProject closes the blank---project bug from #10. One change worth making here before this is settled:

  • [important, in-PR] boot_smoke.mjs is now stale — it writes .opencode/opencode.json + a generic AGENTS.md and never sets OPENCODE_CONFIG_CONTENT, i.e. it boots the layout this PR deleted. The only server-booting test would stay green even if instruction injection were ripped out. Update it to assert GET /config shows the injected instructions AND the preserved global model.
  • [ask] "chat actually runs solves" is verified only by a manual dev-machine probe, with the full solve noted as intermittently stalling on Bedrock. Track the integrated chat→solve gate (the 0.1 smoke-corpus work) rather than leaving it to manual checks.

@jack-champagne jack-champagne left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving — the instruction-injection fix is correct. One thing to fix soon (not blocking the unit): boot_smoke.mjs is now a stale/false-green test — see comment above.

@Rchari1
Rchari1 changed the base branch from rchari/beta6-demo to main June 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into main Jun 26, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants