Models & Algorithms•SOTAAZ Lab••KR

Claude Code, Codex, OpenCode, Hermes: How Many of the Eight Harness Parts Do They Open Up?

We compared four agent harnesses (Claude Code, Codex, OpenCode, Hermes Agent) against the eight parts named in the Harness² paper, checking in each tool's official documentation whether a part is exposed as a file or setting, and opening some of the installed tools ourselves. In the docs we read, none of the four opens all eight.

Claude Code, Codex, OpenCode, Hermes: How Many of the Eight Harness Parts Do They Open Up?

Claude Code, Codex, OpenCode, Hermes: How Many of the Eight Harness Parts Do They Open Up?

Two coding agents running the same model can leave very different amounts for the user to change. Part 1 defined the harness as everything except the model and listed the eight editable parts named in the Harness² paper. This post uses those eight as a ruler on four tools. The question is narrow: does the tool's documentation say this part can be changed through a file or a setting?

How we counted

We rate each part in three steps. It is "open" when the official documentation names a file, a directory, a configuration key or a command-line flag that the user edits directly. It is "partial" when only an indirect route exists (a custom tool of the same name replacing a built-in one, or something the agent creates through call arguments) or when we could not confirm the structure. Instruction files (CLAUDE.md, AGENTS.md) count as human-written memory, and memory the agent accumulates itself is listed on top of that. If the pages we read do not mention it, we write "not in the docs" and do not claim it is absent, because another page may cover it.

How we checked differs by tool. Claude Code (2.1.302), Codex (0.41.0) and OpenCode (v2.0.32) are installed on this server. For Claude Code we read the flags in claude --help, for OpenCode the instructions key in opencode.json, and for Codex we only looked at the folders under ~/.codex. We installed Hermes Agent (v0.22.2) in an isolated container with no mounts and opened its ~/.hermes folder, config file and source. The specific paths otherwise come from the current official documentation as read on 21 October 2026, and an installed Codex or OpenCode is not guaranteed to match it. We did not confirm that the hooks file and the subagent folder described in the Codex docs work on the installed 0.41.0.

The four tools side by side

PartClaude CodeCodexOpenCodeHermes Agent
system promptopen: replace and append flags (--system-prompt, --append-system-prompt)open: model_instructions_file (replace) and developer_instructions (append) in config.tomlopen: per-agent prompt field; instruction files via the instructions keyopen: ~/.hermes/SOUL.md and agent.system_prompt in config.yaml
guardrailsopen: permissions allow, ask and deny rules in settings.jsonopen: prefix_rule() in rules/*.rules, sandbox_mode, approval_policyopen: permission key in opencode.jsonopen: approvals.mode and approvals.deny in config.yaml
memoryopen: CLAUDE.md, .claude/rules/, agent-written auto memoryopen: AGENTS.md; ~/.codex/memories/ is generated state, off by defaultopen: AGENTS.md as an instruction file; no agent-accumulated memory store in the docsopen: MEMORY.md and USER.md under ~/.hermes/memories/
tool guidancenot in the docs: editing built-in tool descriptions not found; --tools only controls exposurenot in the docs: only on/off keys under tools.*partial: a custom tool with the same name replaces a built-in toolnot in the docs: no setting or source entry for editing descriptions found, only toolset selection
subagentsopen: .claude/agents/*.mdopen: TOML files in .codex/agents/open: .opencode/agents/*.mdpartial: no file definition; created on the fly through delegate_task arguments (goal, context, toolsets, model) and the delegation settings
skillsopen: .claude/skills/<name>/SKILL.mdopen: .agents/skills/open: .opencode/skills/open: ~/.hermes/skills/ (58 SKILL.md files right after install)
scripts and hooksopen: hooks in the settings filesopen: hooks.jsonpartial: custom commands and plugin event hooks; no standalone hooks file in the docsopen: shell commands registered under hooks: in config.yaml (11 events)
pluginsopen: bundles defined by .claude-plugin/plugin.jsonpartial: .codex-plugin/plugin.json (structure not confirmed on an official page)open: .opencode/plugins/open: ~/.hermes/plugins/<name>/ (no folder right after install; managed with hermes plugins)

Counting in three categories, Claude Code has 7 open and 1 not in the docs (tool guidance). Codex has 6 open, 1 partial (plugins) and 1 not in the docs. OpenCode has 6 open and 2 partial (tool guidance, scripts and hooks). Hermes has 6 open, 1 partial (subagents) and 1 not in the docs. In the documentation we read, none of the four was confirmed open on all eight parts. Command-line flags count as open, so read Claude Code's system prompt, which is flags only, with that in mind.

What the table tells us

We found no route to edit a built-in tool's description in any of the four tools' docs. Only OpenCode documents an indirect one: replacing a built-in tool with a custom tool of the same name. In the others the only route we found is to write into an instruction file how a tool should be used. The Harness² paper puts tool guidance among its eight editable parts, which is a contrast.

On the system prompt, Claude Code and Codex document replacing and appending as separate flags or keys. Claude Code's docs state the difference: appending preserves the default tool guidance, safety instructions and coding conventions, while "Replacing drops all of the default prompt, including tool guidance and safety instructions". Replacing the whole prompt removes that protection too.

Memory is two different things mixed together: instruction files that people write (CLAUDE.md, AGENTS.md) and memory that the agent accumulates itself (Claude Code's auto memory, Codex's memories/, Hermes's MEMORY.md). Codex's docs treat the second kind as generated state and advise against making hand edits the primary control. That a human can edit what the agent writes does not mean they should. Hermes goes the other way: the config file we installed lists, on by default, a gate that asks a human before the agent writes to instruction files such as AGENTS.md or SOUL.md.

Harness²'s eight parts are not any tool's native layout

The eight parts do not map one-to-one onto any tool's default folders. In the released code, the OpenCode substrate stages systemprompt.md, guardrails.md, LongTermMEMORY.md, tool_descriptions/tool_guidance.md, scripts/, sub_agents/<name>/AGENT.md, plugin/ and skills/<name>/SKILL.md in a workspace, then renders them at run time into what the tool reads: an appended AGENTS.md, .opencode/{skills,agent} and so on. That rendering is the JobBench install path; WorkBuddy uses a different template, and the Codex substrate sets its own 8,000-character cap on the always-on text. So the paper's eight parts are an editing surface the paper lays over the tool, not a structure the tool opens by itself. That is why tools can differ in how open they are in the table while the substrate still treats all eight as editable.

What this table cannot say

  • Open is not the same as useful. We counted whether the docs name a file or key, not whether editing it changes the agent's behavior.
  • Claude Code's docs describe CLAUDE.md and auto memory as "context, not enforced configuration" and point to a PreToolUse hook for anything that must be blocked. The same "open" carries different force.
  • We did not check whether the Codex paths in the docs (hooks.json, .codex/agents/, plugins) work on the installed 0.41.0. For Hermes we opened the folders and settings but did not read the whole source, so "not in the docs" means not found in what we read.

What comes next

Part 3 reads the loop that edits these eight parts, the Harness² paper, and runs its released demo.

Method note

  • Documentation checked on 21 October 2026: code.claude.com/docs/en/cli-reference and /memory for Claude Code, developers.openai.com/codex for Codex (its memory page redirects to learn.chatgpt.com/docs/customization/memories), opencode.ai/docs for OpenCode, and the GitHub README plus hermes-agent.nousresearch.com/docs for Hermes. The system-prompt flag text, the "context, not enforced configuration" sentence and Codex's "generated state" sentence were checked against the source pages.
  • Checked directly: Claude Code 2.1.302 claude --help (--system-prompt, --append-system-prompt, --agents, --plugin-dir); the ~/.codex folders skills, plugins and memories on the server with Codex 0.41.0 (we could not tell which version created them); OpenCode v2.0.32 opencode.json; and, for Hermes v0.22.2 installed in an isolated container, ~/.hermes (SOUL.md, config.yaml, skills/, memories/) plus the config defaults, delegate_task and approvals source.
  • Not checked: the official Codex plugin-structure page, whether each documented path works on the installed Codex and OpenCode versions, and the whole Hermes source. Some pages were too long to read to the end, so "not in the docs" means not found in what we read.
  • Code evidence for the eight parts: substrate/opencode.py in google-research/harness2, commit 1cfe254. The 8,000-character Codex cap is in substrate/codex.py.

References

Stay Updated

Follow us for the latest posts and tutorials

Subscribe to Newsletter