Skip to content

Add provider/harness/model configuration schema and binding validator #658

Closed as not planned

Description

@aviggiano

Part of #653 (provider-agnostic harness umbrella). Design source: Proposed Configuration Boundary and Proposed Capability Contract, proposal A. The Markdown source is published by #665.

Scope

Introduce [providers.*], [harnesses.*], and independent harness / provider / model fields on model profiles. Implement ProviderBinding, HarnessCapabilities, and QualifiedHarnessBinding, plus a binding validator that runs before workflow launch.

The capability contract carries:

  • tools: fs / shell
  • events: "jsonl" | "rpc" | "final-text-only"
  • sessions: "none" | "resume" | "tree"
  • usage: tokens / cache / cost
  • isolation: native | external

Nodes declare what they require (node.requires = { events: "jsonl" }) and the validator matches requirement against capability before launch.

Map every legacy agent = "…" profile forward. No default changes and no new harness in this issue — it is deliberately reviewable in isolation (Phase 0 of the sequencing).

Credential and state rules the schema must encode

  • Child environment built from an empty or tightly allowlisted base, never inherited wholesale.
  • Exactly one provider credential present, matching the endpoint the harness will actually call.
  • Credentials never appear in argv.
  • Every harness gets a run-scoped state root (CODEX_HOME, DSH_HOME, …) outside the operator's real home.
  • The state root must not live inside a region the harness's own sandbox leaves writable.

Acceptance criteria

  • A profile can name a harness and a provider independently; model stays an opaque provider catalogue ID with no static allowlist.
  • Unsupported wire protocol, unsupported reasoning level, missing executable/version, missing credential, missing required cloud portability, or an event class below the node's requirement fails before launch with an actionable diagnostic naming the offending profile field.
  • Every existing profile — including CodexAgent, ClaudeAgent, DeepSeekAgent, and KimiAgent — resolves to the same runtime behavior as today, proven by tests.
  • Resolved config, snapshots, and artifacts contain no credential values.
  • ultrafuzz validate and ultrafuzz doctor report the resolved binding.

Dependencies

None. This is the root of the tree; every other child issue depends on it.

Credentials

Not blocked. No real provider request is required for this issue.

Activity

  1. aviggiano commented on Aug 20, 2026

    @aviggiano
    CollaboratorAuthor

    Closing as superseded by the tight-adapter ruling.

    Every axis this issue proposes to introduce — independent harness, provider and opaque model fields, plus a capability contract — already exists in Smithers. The harness is the agent class, the provider is baseURL + apiKey, the model is an opaque provider-catalogue ID, and smithers agents capabilities already publishes each of the 14 built-in harnesses' binary, emitted flags, option mappings and resume kind, with smithers agents doctor and smithers agents test validating reachability.

    Ultrafuzz config is also already open where it matters: the model profile's agent field is an open agent-ref schema and [agents.*] is a generic record, so adding a harness needs no schema work at all.

    PR #682 implemented this issue and is closed alongside it. Its own acceptance criterion — that every existing profile resolves to the same runtime behaviour as today — conceded that it changes nothing at execution.

    The one durable requirement worth keeping from here (credentials never in argv, run-scoped state roots, no wholesale environment inheritance) is an adapter obligation enforced per-adapter by tests, not a schema. It is carried into the rescoped #653 and its children.

  2. added a commit that references this issue on Aug 24, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions