0%

Four-Provider Walking Skeleton

Goal

  • Prove one pinned instruction and skill reaches every provider in the recorded required-provider set before the storage and projection contracts harden. The four named provider families are the initial inventory; the required set derives from recorded supported-status, so a vendor-withdrawn provider changes the set only by an explicit recorded decision and never by silently failing this gate.

Files

  • CREATE scripts/harness_dist/providers.json
  • CREATE scripts/harness_dist/providers.schema.json
  • CREATE scripts/harness_dist/provider_projection.py
  • CREATE scripts/harness_dist/provider_probe.py
  • CREATE scripts/harness_dist/tests/provider_fixtures/
  • CREATE scripts/harness_dist/tests/test_four_provider_skeleton.py

Work Items

  • Define providers.json and providers.schema.json rows for Claude Code, OpenCode, Codex CLI, and Gemini CLI with binary, supported version range, discovery paths, adapter form, repository layouts, and symlink rules.
  • Define one provider_projection.py interface that renders a synthetic core skill plus project overlay into an isolated fixture; later activation must consume this interface without a provisional renderer.
  • Probe each client’s static native instruction and skill discovery from repository root, nested directory, worktree, and monorepo layouts.
  • Pin Gemini’s physical in-tree adapter constraint and the supported symlink semantics for Claude, OpenCode, and Codex with actual client-version receipts.
  • Fail closed when a client binary, required discovery path, effective instruction receipt, or skill receipt is absent; persist actionable evidence.
  • Record provider distribution/fork identity and immutable build identity (source revision and/or allowed binary digest) SEPARATELY from the supported compatibility range, and resolve which binary a shell actually selects rather than trusting a version string.
  • Model provider SUPPORTED-STATUS and succession as first-class row data (supported | deprecated-by-vendor | superseded-by ), so a client the vendor has retired is represented as a state the platform handles rather than an assumption the acceptance gate silently fails on. Live instance: gemini-cli 0.42.0 returns reasonCode UNSUPPORTED_CLIENT for its individual tier and directs migration to a successor product.
  • Treat headless workspace-trust gating as part of the discovery contract: a client that refuses to run non-interactively without an explicit trust opt-in (gemini requires GEMINI_CLI_TRUST_WORKSPACE or —skip-trust) must be probed with that opt-in recorded in the receipt, and its absence must fail closed with actionable evidence rather than reading as a discovery miss.

Verification

  • Write failing positive, negative, interruption, concurrency, and idempotency cases before implementation.
  • Pin the consumer-visible outcome through the real CLI/runtime entry point.
  • Run focused pytest and the owning runtime self-test with a 150-second test timeout.
  • Run python -m scripts.harness_dist verify --root . when distributed artifact classification changes.