feat: multi-document harness YAML, render command, profiles consolidation - #66
Merged
Conversation
- Move agent configs from agents/ to profiles/agent-*.yaml (flat, prefixed) - Move sandbox/ to profiles/images/sandbox-default/ - Move agents/ci.yaml to test/ci-agent.yaml (test fixture) - Remove unused profiles/providers/atlassian-user.yaml - Agent resolution walks harnessDir to find agent-<name>.yaml - Fix gwsProfileScopes reading from wrong path (code bug) - Fix SPEC.md: correct step order, TTY default, payload description, file paths, config table completeness - Add observability & tracing section to TODO.md (Langfuse, MLflow, SigNoz, OCSF, OTel investigation results) - Add multi-document YAML design (k8s-style kind: field) to TODO.md - Add docs/langfuse-setup.md for local Langfuse + Claude Code OTel
Add Harness type that supports k8s-style multi-document YAML with kind field dispatch (agent, provider, gateway, policy). Single-document agent YAMLs continue to work unchanged (backwards compatible). - Harness struct holds agent config + co-located provider/gateway/policy definitions as raw YAML blobs - ParseHarness/ParseHarnessFile parse multi-doc YAML via yaml.Decoder loop - RenderHarness outputs complete harness YAML with built-in vs custom provider distinction - harness render command outputs full harness YAML to stdout or file --include-defaults adds the effective gateway even when not set in config - Resolution chain: harness-local definitions take priority over profiles/ - Provider profiles from harness YAML imported to temp dir before profiles/ Example: harness up -f harness.yaml with a single file containing agent + provider + gateway + policy definitions.
robbycochran
added a commit
that referenced
this pull request
Aug 27, 2026
* docs: fix inaccurate/stale facts across docs, specs, and comments Repo-wide accuracy audit; every corrected fact validated against code: - SPEC.md: payload is task.md + bin/ (run.sh removed in PR5); version floor v0.0.59 -> v0.0.110; registry ghcr.io -> quay.io/rcochran/openshell; render-payload/payload-tree describe the adapter-built bash -lc command - CHANGELOG.md: correct [0.1.2] date (06-09 -> 06-08); add the missing [0.3.0] section from git log v0.2.0..v0.3.0 (render excluded -- added in #66, removed in #68, never shipped in 0.3.0) - README.md: unit tests 5 -> 16 packages; test-suite 23 -> 33 tests - AGENTS.md: test-flow.sh targets (local-container/openshift), kind via kind-lifecycle.sh -- the local/kind args never existed - .agents/skills/validate/SKILL.md: 27+ -> 33 tests; primary command list matches main.go (drop nonexistent stop/start); 6 -> 16 packages - docs/release-plan.md: historical-plan banner noting harness init and the ~/.config/harness-openshell fallback diverge from the original plan - internal/agent/agent.go: payload/config kind error messages use the actual header.Kind instead of hardcoding "payload" - internal/openshell/sdkclient/auth.go: drop nonexistent "oidc-human" from the branchDefault comment * docs: address CodeRabbit review on doc-accuracy PR - SPEC.md: entrypoint list is now non-exhaustive and adds codex (adapter has a codexAdapter); render-payload documents real task dispatch verified against internal/agent/adapter.go (opencode -> `run`, claude/codex/custom -> `--print` headless, `-p` interactive); document the primary `init`, `doctor`, `plan`, and `migrate` commands that were registered in main.go but undocumented - README.md: add `plan` and `migrate` to the command reference - .agents/skills/validate/SKILL.md: sample output config-suite line 27/27 -> 33/33 (make test-suite = 33/33, 0 skipped) All primary commands from main.go now appear in both README.md and SPEC.md.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
kind:field dispatch (agent,provider,gateway,policy) lets you define everything in one file.harness up -f harness.yamljust works. Single-doc agent YAMLs remain backwards compatible.harness rendercommand -- exports a complete harness YAML from an agent config with all referenced providers and gateways. Built-in OpenShell providers labeled separately from custom ones.--include-defaultsadds the effective gateway.profiles/agent-*.yaml, gateways/providers/images in subdirectories. Agent resolution walks harnessDir (no hardcoded paths).gwsProfileScopeswas reading from wrong path (agents/providers/profiles/instead ofprofiles/providers/).docs/langfuse-setup.mdfor local Langfuse + Claude Code OTel tracing.Changes
internal/agent/Harnesstype,ParseHarness/ParseHarnessFile,RenderHarnesswith built-in vs custom provider labelingcmd/resolve.goresolveHarness,resolveGatewayConfigWithHarness,findFilefor flexible agent resolutioncmd/render.goharness rendercommandcmd/up.go,cmd/create.goHarnessinstead of rawAgentConfig, thread through gateway/provider resolutioncmd/providers.goprofiles/agent-*.yaml), sandbox moved toimages/sandbox-default/test/test/ci-agent.yaml, test-flow.sh uses--agent-profile.github/workflows/Test plan
go build ./...passesgo test ./...passes (all packages)go vet ./...passes