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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

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

Copy link
Copy Markdown
MemberAuthor

@jack-champagne

@jack-champagnejack-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
MemberAuthor

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
Rchari1force-pushed the rchari/fix-agent-instructions branch from a8277e4 to c7dd17bCompareJune 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

Copy link
Copy Markdown
MemberAuthor

@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-champagnejack-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 mainJune 26, 2026 20:09
@Rchari1
Rchari1 merged commit 48a8b4a into mainJun 26, 2026
3 checks passed
Sign up for freeto 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

@Rchari1@jack-champagne