From 94f15fd9b755fdd82d5cdf7a7823215f678b1f56 Mon Sep 17 00:00:00 2001 From: "SYM.BOT" Date: Fri, 2 Oct 2026 10:54:51 +0100 Subject: [PATCH] Docs: the product name is xmesh, all lowercase Founder ruling, 2026-10-02: "all XMesh letter must be lowercase. No any camel case, especially no small case X and uppercase M." Five spellings in README.md, CHANGELOG.md, docs/reference.md and docs/research-team-scenario.md. tests/docs-name-lowercase.test.js walks every Markdown doc (root, docs/, .github/, the bundled skills) and fails on XMesh, xMesh, Xmesh or XMESH in prose. Code identifiers (the XMesh class, _handleXMeshInsight) and the log strings and comments in lib/ and bin/ are out of this change's scope, which was README and docs only. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014y3qC1m9acDVaerca56dvV --- CHANGELOG.md | 2 +- README.md | 4 ++-- docs/reference.md | 2 +- docs/research-team-scenario.md | 2 +- tests/docs-name-lowercase.test.js | 34 +++++++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 tests/docs-name-lowercase.test.js diff --git a/CHANGELOG.md b/CHANGELOG.md index a102029a..19a63fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -687,7 +687,7 @@ disconnected. ### Changed - **Tenant-suffixed room names are legal.** The room grammar accepts a double hyphen as a - segment separator (`x-review--team-02779b…`) — the shape xMesh scopes recipe rooms with. + segment separator (`x-review--team-02779b…`) — the shape xmesh scopes recipe rooms with. Before this, `sym join`, the daemon, and `sym_invite_create` all refused the very rooms the product creates, and only a direct service-type bypass made them work. Triple hyphens, leading/trailing hyphens and bare suffixes stay invalid. diff --git a/README.md b/README.md index 23df92cd..1d93b579 100644 --- a/README.md +++ b/README.md @@ -102,12 +102,12 @@ Run `sym --help` for the full command surface. - **SYM** is the open runtime and CLI. It carries the complete open core in its own tree — records, signing, baseline admission, default coupling — with no closed dependency, and the admission and coupling engines are injectable. -- **xMesh** is the agent mesh runtime built on this foundation. The free +- **xmesh** is the agent mesh runtime built on this foundation. The free [Developer Runtime](https://www.npmjs.com/package/@sym-bot/xmesh) runs locally or in any pod, and a coding agent drives it through MCP (`xmesh-mcp`): offer a mission, follow the board. - **Enterprise:** visit **[xmesh.bot](https://xmesh.bot)**. -The xMesh source is private; its Developer Runtime is a free compiled artifact. SYM and +The xmesh source is private; its Developer Runtime is a free compiled artifact. SYM and mesh-channel are open source. ## Security, and what the relay can and cannot see diff --git a/docs/reference.md b/docs/reference.md index 337c0fb7..6eac44a6 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -46,7 +46,7 @@ SYM is the runtime and CLI. It implements the open [Mesh Memory Protocol (MMP)]( There is no central orchestrator deciding which agent matters. Each receiving peer evaluates incoming categories against its own state and retains its own decision boundary. -> For headless, model-configured peers that run without a host IDE, see the public [`@sym-bot/xmesh-agent`](https://github.com/sym-bot/xmesh-agent) runtime. For enterprise AI integration, visit [xmesh.bot](https://xmesh.bot). The xMesh enterprise product and its codebase are private. +> For headless, model-configured peers that run without a host IDE, see the public [`@sym-bot/xmesh-agent`](https://github.com/sym-bot/xmesh-agent) runtime. For enterprise AI integration, visit [xmesh.bot](https://xmesh.bot). The xmesh enterprise product and its codebase are private. ## Why do you need it? diff --git a/docs/research-team-scenario.md b/docs/research-team-scenario.md index 309218fb..5f30b084 100644 --- a/docs/research-team-scenario.md +++ b/docs/research-team-scenario.md @@ -39,7 +39,7 @@ This is not configuration. It's cognition. The validator doesn't see the data-ag **5. Emergent idea** — synthesis agent produces: *"emergence is evaluation-dependent — a property of the measurement apparatus, not the model."* -> **What the mesh does:** This is where mesh cognition happens. The synthesis agent's xMesh LNN has been processing CMBs from all agents. It detects **convergence in the intent and motivation fields across agents with different perspectives:** +> **What the mesh does:** This is where mesh cognition happens. The synthesis agent's xmesh LNN has been processing CMBs from all agents. It detects **convergence in the intent and motivation fields across agents with different perspectives:** > - explorer-a's motivation: "scaling law research needs reframing" > - explorer-b's motivation: "fix the lens before interpreting" > - validator's intent: "reject until correct method" diff --git a/tests/docs-name-lowercase.test.js b/tests/docs-name-lowercase.test.js new file mode 100644 index 00000000..7d0f3081 --- /dev/null +++ b/tests/docs-name-lowercase.test.js @@ -0,0 +1,34 @@ +'use strict'; + +// The product name is xmesh, all lowercase, in every README and doc (founder, 2026-10-02: "all XMesh letter +// must be lowercase. No any camel case"). This covers prose only: code identifiers (the XMesh class, the +// _handleXMeshInsight handler) and XMESH_* names are not the product's name in prose and are not checked here. + +const { describe, it } = require('node:test'); +const assert = require('node:assert'); +const fs = require('node:fs'); +const path = require('node:path'); + +const ROOT = path.join(__dirname, '..'); +const walk = (dir) => fs.readdirSync(dir, { withFileTypes: true }).flatMap((e) => { + if (e.name === 'node_modules' || e.name === '.git') return []; + const p = path.join(dir, e.name); + return e.isDirectory() ? walk(p) : [p]; +}); +const docs = [ + ...fs.readdirSync(ROOT).filter((f) => f.endsWith('.md')).map((f) => path.join(ROOT, f)), + ...['docs', '.github', '.agents', '.claude'].filter((d) => fs.existsSync(path.join(ROOT, d))) + .flatMap((d) => walk(path.join(ROOT, d))).filter((f) => f.endsWith('.md')), +]; + +describe('docs spell the product name xmesh', () => { + it('finds the docs it checks', () => { + assert.ok(docs.length >= 8, `scanned ${docs.length} docs`); + }); + for (const f of docs) { + it(path.relative(ROOT, f), () => { + const text = fs.readFileSync(f, 'utf8').replace(/XMESH_[A-Z0-9_]*/g, ''); + assert.doesNotMatch(text, /\bXMesh\b|\bxMesh\b|\bXmesh\b|\bXMESH\b/); + }); + } +});