Summary
When a skill declares requires.capabilities: [browser] but no Chromium binary is found (or the egress proxy failed to start), the runner logs an Error and continues serving — leaving the LLM with a skill that instructs browser use and no tools to do it (forge-cli/runtime/runner.go, browser registration block; decision in browserRegistrationDecision).
This is inconsistent with the requires.bins posture, where a missing required binary fails startup validation (validateSkillRequirements returns an error). It's also weaker than PR #260's own fail-closed framing.
Options
- Fail startup when a browser capability is active but no Chromium resolves (or the proxy is unavailable) — matches
requires.bins semantics. Simplest and most consistent.
- Gate the leniency on dev mode — fail in prod, warn-and-continue in dev for iteration ergonomics.
Leaning toward (1) for consistency, but flagging the dev-ergonomics tradeoff for a maintainer call. It's roughly a one-liner either way.
Context
Medium finding from the PR #260 review; deferred as non-blocking pending a decision on ergonomics.
Summary
When a skill declares
requires.capabilities: [browser]but no Chromium binary is found (or the egress proxy failed to start), the runner logs an Error and continues serving — leaving the LLM with a skill that instructs browser use and no tools to do it (forge-cli/runtime/runner.go, browser registration block; decision inbrowserRegistrationDecision).This is inconsistent with the
requires.binsposture, where a missing required binary fails startup validation (validateSkillRequirementsreturns an error). It's also weaker than PR #260's own fail-closed framing.Options
requires.binssemantics. Simplest and most consistent.Leaning toward (1) for consistency, but flagging the dev-ergonomics tradeoff for a maintainer call. It's roughly a one-liner either way.
Context
Medium finding from the PR #260 review; deferred as non-blocking pending a decision on ergonomics.