Skip to content

feat(harness): H9 to H11, MCP host names, env detection, Board Rules ask (awaiting Danny) - #211

Merged
scrimshawlife-ctrl merged 6 commits into
mainfrom
feat/52-harness-h9-h11
Oct 26, 2026
Merged

scrimshawlife-ctrl merged 6 commits into
mainfrom
feat/52-harness-h9-h11

Conversation

@prabu-openclaw

@prabu-openclaw prabu-openclaw commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Follow-up to ticket 52. These are the three harness additions Aaron approved, which #205 carried and #209 left out to wait on your decision. They are ported onto #209's code and kept clear of #210's files: a local merge of the two is clean. The spec has them as v0.2.45, proposed in a new section, with its own Needs Danny list. Refs #205, #209, #210.

  • H9, MCP host names. Known MCP clientInfo ids become display names: claude-code → Claude Code, claude-desktop-3p → Claude Desktop, hermes-agent → Hermes, openclaw-bundle-mcp → OpenClaw. Generic SDK defaults (mcp 0.1.0 and the @modelcontextprotocol/sdk example names) send no harness, so the Agent's declaration applies. Placeholder versions such as 0.0.0 are dropped. JCHAIN_HARNESS still overrides all of this. The server's own client also turns off env detection, so an unknown host never borrows the environment.
  • H10, env detection in the TypeScript and Python clients. This is used only when there is no harness option. The order is the option, then AI_AGENT, then AGENT (a falsy value opts out), then CLAUDECODE=1, then CODEX_THREAD_ID/CODEX_SESSION_ID with CODEX_VERSION, then nothing. claude-code_2-1-308_agent reads as Claude Code 2.1.308. Only those six variables are read, and harness: null turns detection off.
  • H11, the Board Rules ask. CT-12 gains a separate provenance field ({ rule_version: "2026-10-26", rule }) beside authorship, so instructions is unchanged. /join, /join.md, /start, /llms.txt, QUICKSTART, and the client READMEs ask for the harness on each Post and say it is optional.

There is no migration and no spend. There is no new binding, secret, or policy key. SPEC_VERSION and the README status are untouched.

Verified sources

  • Claude Code: the local 2.1.261 binary sends { name: "claude-code", title: "Claude Code", version } and sets CLAUDECODE=1 and AI_AGENT=claude-code_<ver>_<role>. A live session showed claude-code_2-1-308_agent.
  • Hermes: the Hermes source (Aaron's check).
  • OpenClaw: openclaw@2026.10.7 sends version 0.0.0 (Aaron's check).
  • Codex: openai/codex codex-rs (commit 9b73858) sets CODEX_THREAD_ID, CODEX_SESSION_ID, and CODEX_VERSION.
  • Claude Desktop: claude-desktop-3p found in Claude.app 3.6556.2 (third-party mode).

Left unmapped: Claude Desktop's default-mode name, Cursor (no primary source), and the Codex CLI's MCP clientInfo name.

Tests (all pass):

Suite Result
Root npm test 64 files, 585 tests (+2 new for AT-96)
Root typecheck clean
Docs lint 0 issues
clients/typescript 74 tests (+7)
clients/mcp 34 tests (+6)
clients/python 130 passed, 2 skipped (+12); mypy --strict clean

Overlap with #210: both PRs touch clients/mcp/README.md, in different hunks. Here it is the JCHAIN_HARNESS row; in #210 it is the whoami row.

🤖 Generated with Claude Code

luna and others added 4 commits October 26, 2026 10:23
…roposed v0.2.45, H11)

GET /v1/boards/{id}/rules and GET /v1/rules gain provenance
{ rule_version: "2026-10-26", rule } beside authorship, the U3 pattern, so
the instructions string the clients compare stays unchanged. /join,
/join.md, /start, and /llms.txt ask for the harness on each Post and say it
is optional. AT-96 through the HTTP seam.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…known (proposed v0.2.45, H9)

claude-code, claude-desktop-3p, hermes-agent, and openclaw-bundle-mcp
become Claude Code, Claude Desktop, Hermes, and OpenClaw. mcp 0.1.0 (the
Python SDK default) and the @modelcontextprotocol/sdk example client names
send no harness, so the Agent's declaration applies, and placeholder
versions such as 0.0.0 are dropped. The server's own JChainClient turns
off environment detection, so an unknown host never borrows it.
JCHAIN_HARNESS still overrides. AT-95 (MCP half).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… is given (proposed v0.2.45, H10)

Order: the explicit harness option, then AI_AGENT, then AGENT (a falsy
value opts out), then CLAUDECODE=1, then CODEX_THREAD_ID or
CODEX_SESSION_ID with CODEX_VERSION, then nothing. Claude Code's
AI_AGENT=claude-code_2-1-308_agent reads as Claude Code 2.1.308. Only
these named variables are read. harness null / None turns detection off;
the connect helpers use the same result. Tests pin the env so they do not
depend on the host. AT-95 (client half).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new section after v0.2.44 with H9 (MCP host names), H10 (client
environment detection), H11 (the Board Rules provenance field), AT-95,
AT-96, and a Needs Danny list. QUICKSTART gains a Harness section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@prabu-openclaw prabu-openclaw added the needs-danny Blocked on a Danny decision label Oct 26, 2026
@prabu-openclaw

Copy link
Copy Markdown
Contributor Author

@scrimshawlife-ctrl: this is the smaller PR you suggested when closing #205. It's on top of main (#209) and only adds H9 to H11, with no migration and no spend.

  • H9: the MCP server translates known host names (Claude Code, Claude Desktop third-party mode, Hermes, OpenClaw) and sends no harness for generic SDK defaults.
  • H10: the TS and Python clients detect the harness from AI_AGENT / AGENT / CLAUDECODE / the Codex markers when none is set. An explicit setting wins.
  • H11: Board Rules get a separate provenance ask to name the harness on each Post. instructions is unchanged.

It stays clear of #210 (a local merge of the two is clean). The spec section is marked v0.2.45, proposed and awaiting your decision. Accept, change, or drop any of the three.

Separately, still your call from the #205 body: a hosted MCP endpoint (j-chain.net/mcp) for cloud agents such as Dots and Grok Bot.

scrimshawlife-ctrl added a commit that referenced this pull request Oct 26, 2026
Production runs spec v0.2.44 since #209 (migration 0031). The header lines
said v0.2.43, and the Now list still called the harness proposal unaccepted.
They now name v0.2.44 and ticket 52, and the Shipped list logs #209, the
#205 follow-ups in #210, and the GitHub Actions bump in #197, with H9 to H11
waiting on Danny in #211.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
scrimshawlife-ctrl and others added 2 commits October 26, 2026 13:36
…s the name only

- MCP host aliases match case-insensitively, exactly or as a prefix at a
  separator, longest first; adds gemini-cli-mcp-client (Gemini CLI).
- mcp is generic at any version; 0.1.0 and 1.0.0 join the placeholder
  versions, which drop the version and keep the name.
- TypeScript and Python env detection send only the harness name: no
  version from @Version, Claude Code's AI_AGENT, or CODEX_VERSION, which
  is no longer read.
- Spec H9, H10 and AT-95 and the client READMEs say the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@scrimshawlife-ctrl
scrimshawlife-ctrl merged commit ee22810 into main Oct 26, 2026
7 checks passed
@scrimshawlife-ctrl
scrimshawlife-ctrl deleted the feat/52-harness-h9-h11 branch October 26, 2026 21:03
scrimshawlife-ctrl added a commit that referenced this pull request Oct 26, 2026
Marks the harness additions accepted as built in #211, ticks the
Needs Danny boxes, drops "proposed" and "awaiting Danny" from code
comments, READMEs and the OpenAPI summary, and logs #211 in TICKETS.md.
No behavior change.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-danny Blocked on a Danny decision

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants