Frontmatter
| title | feat(claude): wire Claude Code harness (#10059) |
| author | tobiu |
| state | Merged |
| createdAt | Apr 18, 2026, 3:06 PM |
| updatedAt | Apr 18, 2026, 3:19 PM |
| closedAt | Apr 18, 2026, 3:19 PM |
| mergedAt | Apr 18, 2026, 3:19 PM |
| branches | dev ← claude/goofy-tu-f83d87 |
| url | https://github.com/neomjs/neo/pull/10060 |

Input from Claude Opus 4.7 (Claude Code):
❋ # PR Review Summary
Status: Approved (self-review — awaiting human merge)
Self-Review Opening: Self-review of #10059. This implementation chose
.claude/CLAUDE.md → ../AGENTS.md(symlink inside the subdirectory) over repo-root placement or content copying. Rationale: Claude Code memory docs confirm.claude/CLAUDE.mdis auto-loaded with identical precedence to./CLAUDE.md, the subdirectory placement groups all Claude-Code-specific metadata under one roof (settings.local.json,skills/,CLAUDE.md), and symlinks guarantee single-source-of-truth against AGENTS.md drift. Key trade-offs and gaps noted below.Detection note:
query_raw_memories(#10059, sessionId=f018be49-cbf9-4f99-9119-2510fc5bb8d8)returned 0 matches, which strictly would route to peer-review mode. This is a false negative — I authored this PR in the current session but failed to calladd_memoryduring the turn cycle per AGENTS.md §4. Self-review mode applied honestly. See[TOOLING_GAP]below.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 90 — Uses Claude Code's native auto-load convention (documented behavior). Symlinks preserve single-source-of-truth with AGENTS.md. Penalty: branch nameclaude/goofy-tu-f83d87does not follow theagent/<ticket-id>-<descriptor>mandate in pull-request-workflow.md §2 — harness-generated naming. Captured as follow-up.[CONTENT_COMPLETENESS]: 88 — Fat Ticket #10059 covers Intent, Architectural Reality, Scope, Avoided Traps, Verification, Follow-ups. PR body mirrors and extends. No JSDoc applicable (no code added). Minor gap: Claude Code memory-docs URL appears in PR body but not commit message — acceptable since commits are for change-intent, not architectural citation.[EXECUTION_QUALITY]: 85 — Symlinks use correct relative paths (verified post-creation); explicitgit addprevented accidental staging of.claude/settings.local.json. No automated test exists or was added — symlinks are structurally verified by git, semantic verification ("do the gates load?") requires a fresh Claude Code session, documented in the PR verification steps. Automating this would be overkill for the change scope.[PRODUCTIVITY]: 95 — All three in-scope deliverables from #10059 delivered (CLAUDE.md symlink, skills symlinks, gitignore). Four new follow-up gaps were surfaced during execution and captured as explicit out-of-scope tickets rather than scope-crept into this PR.[IMPACT]: 60 — Meaningful contributor-experience improvement (Claude Code becomes a first-class swarm node), but narrow in framework terms: affects only contributors using Claude Code harness, not end-users of Neo.mjs or the core engine. Could rise to 70 once Claude Code adoption among contributors is measured.[COMPLEXITY]: 20 — 13 filesystem ops + 3.gitignorelines. Cognitive load was protocol adherence (Fat Ticket + pull-request skill + Conventional Commits + Pre-Commit Gates), not the mechanics.[EFFORT_PROFILE]: Quick Win — low complexity, clear per-contributor benefit, unblocks all future Claude Code agent flows in the repo.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #10059
- Related Graph Nodes:
.agent/skills/pull-request,.agent/skills/pr-review,.agent/skills/ticket-intake,AGENTS.md §3(Pre-Commit Hard Gates),AGENTS.md §7(Pull Request Mandate),AGENTS.md §9(Swarm Fat Ticket Protocol),AGENTS_STARTUP.md §5(Skills discovery),.gemini/settings.json(parallel harness wiring for comparison). Origin Session ID:f018be49-cbf9-4f99-9119-2510fc5bb8d8.
🧠 Graph Ingestion Notes
[TOOLING_GAP]— Three distinct harness/workflow friction points surfaced during this PR's lifespan, all worth encoding structurally:
- First commit attempt was rejected by the user because it used
chore(claude)(should befeat), placed the ticket ID in a trailingRefs #10059paragraph (should be(#10059)appended to the subject), and included aCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>footer (project-forbidden). Root cause: I did not read.agent/skills/pull-request/references/pull-request-workflow.md§3 before runninggit commit, despite that skill'sSKILL.mdline 10 explicitly mandating it. Secondary cause:AGENTS.md§3 Pre-Flight Check enumerates a Ticket Gate and Contextual Completeness Gate but has no commit-format gate — making it possible to satisfy the documented gates while still violating the skill's commit protocol. Follow-up ticket will add Gate 3 and document feat/chore selection + noreply prohibition.mcp__neo-mjs-memory-core__get_context_frontierfailed with a schema error during session initialization (data must NOT have additional properties). Did not block this PR since no prior session state was relevant, but worth flagging — the Context Priming Engine is advertised as a mandatory Step 6 boot action inAGENTS_STARTUP.mdand is currently a no-op due to the validator rejection.mcp__neo-mjs-github-workflow__list_issuesreturned 57KB of issue bodies for a 30-issue page — exceeded the tool-result inline budget and required persisted output. Pagination default of 10 issues (with the option to expand) would match typical triage scope better and reduce context bloat.[KB_GAP]— Two documentation gaps observed:
AGENTS_STARTUP.md§5 lists.agent/skills/as the discovery directory but makes no mention of Claude Code's auto-load rules for.claude/CLAUDE.mdvs./CLAUDE.md. A future Claude-Code-spawned agent will have to re-research this same question unless captured. Suggest adding a short paragraph under §5 naming the harness→memory-file mapping for each supported harness (Claude Code:.claude/CLAUDE.md; Gemini CLI:.gemini/GEMINI.md; Antigravity: ?).- Harness-vs-project commit-hygiene conflicts are not documented anywhere. The Claude Code harness system-prompt template mandates a
<noreply@anthropic.com>co-author footer by default. Without a counter-rule in AGENTS.md, harness-following agents will violate project style. The PR's first follow-up ticket will fix this.[RETROSPECTIVE]— Two architectural takeaways worth permanent ingestion:
- Harness-specific subdirectories (
.claude/,.gemini/,.antigravity/) should host their own metadata alongside shared-source symlinks pointing to canonical.agent/skills/. This pattern scales: each new harness gets a clean discovery root while the skill library remains single-sourced. Applies any time a new CLI-driven agent harness is added to the repo..claude/CLAUDE.md(subdirectory) beats./CLAUDE.md(root) when the harness supports both. Root-level project-meta files mislead contributors into treating them as separate documents fromAGENTS.md/AGENTS_STARTUP.md; the subdirectory placement makes the relationship ("this is harness-specific auto-load for AGENTS.md") obvious.
📋 Required Actions
No blocking actions. This PR is mergeable as-is.
Follow-up items captured as separate tickets (not in this PR — scope-creep avoidance):
- Update
.agent/skills/pull-request/references/pull-request-workflow.md§3 — documentfeat/fix/choreselection rules and forbid<noreply@*>Co-Authored-Byfooters.- Add Gate 3 to
AGENTS.md§3 Pre-Flight Check: commit-format compliance (consult pull-request skill beforegit commit).- Accept harness-prefixed branch names (
claude/...,antigravity/...,gemini/...) alongsideagent/<ticket>-<desc>in the branching mandate.- Document the harness→memory-file mapping in AGENTS_STARTUP.md §5.
- Fix
get_context_frontierschema validator regression (separate infrastructure ticket).- Optimize AGENTS.md + AGENTS_STARTUP.md startup-cache footprint (~47KB combined per session).
Ready for human merge. Handing off.
Summary
Wires Claude Code as a first-class swarm node alongside Antigravity and Gemini CLI, by auto-loading
AGENTS.mdat session start, committing the existing.claude/skills/symlink bundle, and preventing worktree checkouts from pollutinggit statusin the main checkout.See #10059 for the full Fat Ticket rationale, architectural reality, and rejected alternatives.
Changes
.claude/CLAUDE.md→../AGENTS.md(symlink). Claude Code auto-loads both./CLAUDE.mdand./.claude/CLAUDE.mdwith identical precedence per the Claude Code memory docs. Placed inside.claude/to keep the repo root uncluttered..claude/skills/— 11 symlinks to../../.agent/skills/*coveringcreate-skill,debugging-antigravity,ideation-sandbox,neural-link,pr-review,pull-request,self-repair,tech-debt-radar,ticket-intake,unit-test,whitebox-e2e. Feature parity with Gemini CLI's.agent/skills/discovery..gitignore— added.claude/worktrees/so per-agent Claude Code worktree checkouts don't appear as nested untracked files in the main checkout.Verification
git statusin the main checkout ondevafter future Claude-Code-spawned worktrees → expect no.claude/worktrees/<name>/noise.git cloneas symlinks whencore.symlinks=true; otherwise they materialize as text files containing the target path — content is stillAGENTS.md, acceptable fallback.Follow-ups (separate tickets — not in this PR)
Discovered during the commit cycle of this PR:
.agent/skills/pull-request/references/pull-request-workflow.md§3 to explicitly documentfeatvsfixvschoreselection rules and forbid<noreply@*>Co-Authored-Byfooters (the Claude Code harness injects these by default).AGENTS.md§3 Pre-Flight Check for commit-format compliance (consult pull-request skill beforegit commit).claude/...,antigravity/...,gemini/...) alongsideagent/<ticket>-<desc>in the branching mandate.AGENTS.md+AGENTS_STARTUP.mdstartup-cache footprint (~47KB combined per session).Resolves #10059