0.2.0 - 2026-08-04
Added
- Tool & skill usage capture (
src/capture/tool-usage.ts) — every run now records
which MCP tools the agent called and which skills it loaded, not just what it was
given. A green run that never reached for the configured MCP server is a different
result from one that called it a dozen times, and that distinction is the metric the
testbed exists to produce.- Per-tool aggregates (calls / errors / total duration), split into
mcp/skill/
builtin, plus an ordered timeline of the first 500 invocations. - Never-used lists: MCP servers that were configured but never called, and installed
skills (.agents/skills/+.claude/skills/) that were never invoked. - Read from opencode's SQLite store (
<data dir>/opencode/opencode.db) read-only, so
a live interactive session's store is never write-locked. Falls back to parsing the
permission lines in<data dir>/opencode/log/*.log(markedsource: "log", no timings
or error status) when the db can't be read, and recordsnullrather than a misleading
all-zero result when neither is readable. - Headless/matrix entries collect once right after the agent exits; interactive sessions
(which have no observable end) refresh on the stats collector's 30-second tick. - Surfaced in the History grid (
MCP·Skillcolumn — amber when some configured tooling
went unused, red when none of it was touched), the History detail panel,report.html
andsummary.json(tools.mcp,tools.skills,tools.serversUnused,
tools.skillsUnused— assertable from CI), both history exports, and a one-line run-log
summary.
- Per-tool aggregates (calls / errors / total duration), split into
- Prompt images — attach reference mockups, sketches, Figma exports or screenshots to
the agent's prompt, so "build this screen from the picture" becomes testable.- New read-write bind mount
./prompt-images/→/prompt-images(PROMPT_IMAGES_DIR),
created byrun.sh/run.ps1. Read-write on purpose: browser uploads land in the same
host folder a terminal-driven matrix config reads from — one folder, one namespace. - A Prompt images picker in both the Interactive and Matrix setup forms: thumbnails of
what's in the folder, click to attach, upload straight from the browser, delete, rescan. - New pipeline stage attach-images (4c) copies the selection into the generated
project'sprompt-images/(deliberately not dot-prefixed, so opencode's file browser and
@-mentions can see it). Headless runs pass them to the agent as real attachments
(opencode run "<prompt>" --file <img> …); interactive runs stage the copies and log the
@prompt-images/<file>mentions. - REST surface:
GET /api/prompt-images(list),GET /api/prompt-images/file?name=
(serve one),POST /api/prompt-images?name=(raw bytes — no multipart dependency),
DELETE /api/prompt-images?name=. - Matrix config gains an
imagesfield (aliaspromptImages) applied to every entry; an
entry may name a single file or a whole folder, expanded to the images inside. - The attached set is recorded per run in History (with thumbnails in the detail panel) and
in a matrix'sreport.html/summary.json. - Tunables:
PROMPT_IMAGE_MAX_BYTES(per-file upload cap, default 10 MB) and
PROMPT_IMAGE_MAX_COUNT(images per run, default 8;0disables the feature and the UI
picker with it). - Vision is a paid-model feature: opencode's free/keyless hosted models silently drop
attachments, so an image run on one degrades to a text-only prompt that still reports
success. The pipeline warns when images are attached with no API key, and both setup
forms and the README say so. - New reference doc
prompt-images/README.md.
- New read-write bind mount
- Token breakdown — the input / output / reasoning / cache split now travels alongside
the total, in the matrixreport.html,summary.json(per-entry objects and the matrix
totals, astokensBreakdown), the History detail panel's per-model usage, and both
history exports.
Changed
- Form controls across both setup views switched to the
outlinedIgnite UI variant
(inputs, textareas, combos), the matrix prompt field moved from a hand-styled<textarea>
toigc-textarea, and placeholder text got a legible color. run.sh/run.ps1create and mount./prompt-images, and their--helpoutput now
lists all bind-mounted host folders.- The stats SSE stream replays the last tool-usage frame on connect, so a reconnecting client
isn't blank until the next 30-second tick. - History grid column widths reduced to eliminate the horizontal scrollbar.
vendor/entry.jsexplicitly registersIgcFileInputComponent: as of
igniteui-webcomponents 7.2.4 it is exported from the package index but missing from
defineAllComponents(), so without this the upload control never upgrades.
Fixed
- Turning skills off actually turns skills off.
ig newruns its ownai-configpass
internally, and with--agents/--assistantsabsent it fell back to the CLI's
interactive checkbox defaults (generic+claude) rather than to nothing — so a
"no skills" run got the full.agents/skills/+.claude/skills/+AGENTS.mdset
installed at scaffold time, which the laterig ai-config --agents nonecould not undo.
Every such baseline was silently contaminated, invalidating any matrix comparison against
it. The scaffold now passes--agents={{agents}} --assistants=generic, and the prune stage
additionally sweeps.agents/skills/,AGENTS.mdand.claude/as a guarantee
(stripGeneratedAgentConfig). - The prompt-image picker no longer shows stale entries after an upload or delete.
- Restored a missing import in
src/pipeline/pipeline.ts. - Removed a leftover
AGENTS.mdshipped by the locally installed skills.
Security
- Bumped
body-parser1.20.5 → 1.20.6 (Dependabot).
Full Changelog: 0.1.0...0.2.0