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/); + }); + } +});