Skip to content

Provenance and safety

Not every tool is equally trustworthy. appctl tags each one with a provenance level and gives you safety flags to match.

The source itself described the tool.

  • OpenAPI operation in the spec.
  • Django ModelViewSet registered on a DefaultRouter.
  • MCP tools/list entry.
  • Strapi content-type schema.

High trust. The source publisher has committed to this contract.

appctl guessed from static files without running anything.

  • A Rails resources :foo line without a matching controller.
  • An ASP.NET .cs scan without a swagger document.
  • A URL-login form whose target endpoint is never touched.

Medium trust. The tool might not exist.

A live request returned a non-404 response.

Produced by appctl doctor --write.

Terminal window
appctl doctor --write

Highest trust. The endpoint definitely exists and is reachable as described.

FlagWhat it doesUse when
--read-onlyremoves every mutation tool from the loopshared or demo environments
--dry-runLLM plans calls; runtime fabricates a responsetesting or cost control
--confirmprompts before each mutation (CLI default)CLI dev work
--strictblocks inferred tools until verifiedproduction
  • Dev laptop, trusted app: no flags. appctl chat.
  • Shared serve, internal team: --strict --confirm for ops, --read-only for viewers.
  • Customer-facing serve: --strict --read-only by default, open a separate endpoint or token for writes.
  • CI, regression testing: --dry-run --strict to catch contract drift without side effects.

Every tool call writes to .appctl/history.db. Each row records:

  • Timestamp
  • Tool name
  • Arguments
  • HTTP status / SQL rowcount
  • Provider + model
  • User or serve client id

Export with sqlite3:

Terminal window
sqlite3 .appctl/history.db 'select ts, tool, status from tool_calls order by ts desc limit 20;'