> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fabro.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Sandbox inventory, model tests, and run approvals

<Warning>
  **Optional integration secrets are now vault-only in the server runtime.** GitHub App, Slack, Daytona, Brave Search, and LLM provider secrets no longer fall back to process environment variables or `server.env` when Fabro is running as a server.

  To migrate:

  1. Store optional integration credentials with `fabro secret set`.
  2. Re-run the GitHub App install flow if you want Fabro to write GitHub App secrets into the vault for you.
  3. Remove any server-runtime dependency on optional integration secrets coming from process env or `server.env`.
</Warning>

<Warning>
  **`POST /api/v1/demo/toggle` was removed.** Demo mode remains available through the `X-Fabro-Demo: 1` request header or a manually set `fabro-demo=1` browser cookie.

  To migrate:

  1. Stop calling `POST /api/v1/demo/toggle`.
  2. Send `X-Fabro-Demo: 1` on demo requests that should use fixture-backed behavior.
</Warning>

## Provider-backed sandbox inventory

Fabro can now list managed sandboxes directly from configured providers instead of relying only on run projections. The new inventory API queries Docker and Daytona, returns partial provider failures in metadata, and can retrieve a specific provider-native sandbox ID when exactly one provider owns it.

```http theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
GET /api/v1/sandboxes
GET /api/v1/sandboxes/{id}
```

This gives operators a live view of the sandbox fleet even when a run record is missing, stale, or no longer the easiest way to answer "what is running right now?"

## Settings can test models in place

Settings > Models now has a real model table, default and priority provider labels, and a Test models sweep that checks configured providers from the UI. The server exposes a provider test endpoint that returns per-provider results without turning one provider failure into a failed request.

```http theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
POST /api/v1/providers/test
```

The Settings area also gained a linked overview page and a cleaner navigation structure. Model configuration, integrations, monitoring, security, storage, and sandboxes now sit in a more predictable operations surface.

## Run approvals are available everywhere

Pending runs can now be approved or denied from the CLI and MCP run tools, not only from the web app. That lets operators and agents move approval-gated workflows forward from automation scripts, terminals, or MCP clients.

```bash theme={"languages":{"custom":["/languages/dot.json","/languages/fabro.json"]}}
fabro approve <run-id>
fabro deny <run-id> --reason "Not approved for execution"
```

The runs list also exposes approval and delete actions closer to the rows you are already reviewing. Children now use the shared runs list view, with size sorting, per-row actions, and a simpler sub-tab toolbar.

## More

<Accordion title="API">
  * New `GET /api/v1/sandboxes` endpoint lists Fabro-managed sandboxes directly from configured providers
  * New `GET /api/v1/sandboxes/{id}` endpoint retrieves a managed sandbox by provider-native ID
  * New `POST /api/v1/providers/test` endpoint tests every configured LLM provider with provider-level failures returned in the response body
  * Removed `POST /api/v1/demo/toggle`; demo mode is now header or cookie driven
</Accordion>

<Accordion title="CLI">
  * Added `fabro approve` and `fabro deny` commands for pending workflow runs
  * Added `fabro graph --allow-invalid` for rendering DOT graphs while keeping validation diagnostics visible
</Accordion>

<Accordion title="Workflows">
  * Added the bundled `goal` workflow for auditing and continuing active work
  * Structured output docs now clarify fallback behavior when a model cannot produce valid schema-conforming output
</Accordion>

<Accordion title="Fixes">
  * Fixed stage inference and tool timing values always reporting as zero
  * Fixed Settings > Monitoring showing active runs instead of scheduler slots used
  * Fixed the runs list pager appearing when pagination was not relevant
  * Fixed run diff stats and run size chips displaying inconsistently across board and list surfaces
</Accordion>

<Accordion title="Improvements">
  * Added `gemini-3.5-flash` to the model catalog
  * Added size sorting, per-row actions, and a bulk More menu to run lists
  * Added priority-provider and default-model labels to Settings > Models
  * Removed the redundant time filter and archived toggle from the run Children sub-tab
</Accordion>
