mace ← overview

For the judge · The WebMCP Challenge

Everything, on one page.

No signup, no keys, no clone. Every number below is one you can check in the next few minutes, and the last section is what this project has not proved.

01The claim

mace is a clerk's bench for a meeting under Robert's Rules where the registered WebMCP tool set is the motion stack — an action that is out of order does not exist to be called.

Most agent apps hand over every tool and reject illegal calls at runtime. mace removes the tool instead. The panel “What is in order now” renders its left column directly from document.modelContext.getTools() — the API's own return value — so the screen and the API cannot disagree.

02The 30-second path

Use Chrome 149+ with WebMCP enabled. The banner top-right must read WebMCP live · document.modelContext. If it says “not detected”, the panel falls back to the internal state machine and says so — the product never pretends the API is there when it is not.

  1. Open pointoforder.netlify.app. The count next to In order reads 5.
  2. Click Widest frontier17. Click The tangle15.
  3. At the tangle, look for move_to_amend_the_amendment. It is not greyed out and not refused — it is absent, and the right column prints the rule that removed it: §12, a first-degree amendment must be the immediately pending question.
  4. Type 4 into Members in the room and press Record attendance. Quorum is 5, so 17 → 9 on one integer. The phase never moves; the whole agenda does (§40).
  5. Open the console and check the panel is not lying:
    (await document.modelContext.getTools()).length — it equals the badge, at every checkpoint.

03The receipts

Measured against the live deploy in Chrome 151.0.7922.171, not estimated.

WhatValueWhere it comes from
getTools() at the four checkpoints5 / 17 / 15 / 9identical to the on-screen count; zero divergence
Tools registered in total234 always-on reads + 17 gated imperative + 2 gated declarative
Rule rows behind them19src/ronr.data.js — one factory, no per-tool code
Tests213npx vitest run
Legality cells asserted1527 phases × 19 gated tools, plus a 19-cell sub-quorum sweep
Quorum cliff removal87 by aborting the registration AbortSignal, 1 by dropping a toolname attribute
explain_path_to searchdepth 6 · 399 nodesAND-OR over vote outcomes; completes in a few ms (the screen prints the exact figure)
Runtime dependencies0no framework, no bundler, no transpile

04Reproduce it

The real path — the same suite CI runs on every push:

# 306 tests, no network, no keys
git clone https://github.com/edycutjong/mace.git && cd mace
npm install
npx vitest run

To run the bench locally, serve it statically — there is no build step:

python3 -m http.server 8000   # then open http://localhost:8000

A local copy needs Chrome's WebMCP flag rather than the origin-trial token: the token is bound to pointoforder.netlify.app and will not activate on localhost.

05What this has not proved

Recorded because the honest absence is worth more than a tick.

06Links