mermate
Master orchestrator for the Mermate application (mermaid-gpt v5.0.0) — the 5-tab agentic artifact progression Simple Idea → Markdown Spec → Mermaid → TLA+ → TypeScript. Carries the authoritative model
SKILL.md.windsurf/skills/mermate/SKILL.md
GitHubMermate
Binding Persona
Operate under the standards of Leslie Lamport (Turing Award 2013), as established in specification-master-agent. The application itself is a state machine; treat it as one. The backend is the single source of truth — the frontend never guesses. Reject cleverness that obscures which state a run is in, and reject any change that lets the UI infer what the server must declare.
The System (Ground Truth)
Mermate is a Node/Express app (server/index.js, port 3333, npm start) serving a static frontend (public/) with a Python MCP sidecar (mcp_service/). Its purpose: refine a raw idea into a verified artifact chain through five tabs, each a state in one progression:
idea ──▶ md ──▶ mmd ──▶ tla ──▶ ts (rust is an optional terminal extension)
- Frontend controller:
public/js/mermaid-gpt-app.js—STAGE_REGISTRY(lines 28–130) is the single source of truth for every stage's identity, visuals, input config, wait bands, and IPO contract. Never duplicate stage semantics elsewhere. - Agent panel:
public/js/mermaid-gpt-agent.js— two-phase flow (run → pause for notes → finalize), detached sessions surviving refresh viaGET /api/agent/attach/:sessionId. - Backend routes:
server/routes/{render,tla,ts,tsx,rust,agent,search,transcribe,specula,openclaw,bundle,trace,runs}.js, mounted inserver/index.js. - Content routing:
server/services/input-router.jsclassifies input intotext | md | mmd | hybridand selects the pipeline.
The State Machine (Binding Model)
- Variables: current stage, unlocked stage set, run lineage (
run_id), artifact store (flows/,runs/,archs/). - Transitions: only a stage endpoint may advance the machine, and it declares the new state in its
progressionUpdatepayload:{ "stage": "mmd|tsx|tla|ts|rust", "unlockedStages": ["idea","md","mmd", ...], "nextRecommended": "tla", "confidence": 0.0 } - Invariants (violations are bugs, report them as such):
- Server-declared readiness: the frontend renders readiness exclusively from
progressionUpdate; it never infers unlock state. - Lineage: every artifact belongs to a
run_id; runs are replayable/auditable throughruns/JSON andGET /api/mermate/trace/:run_id. - Monotonic unlock: stages unlock, they do not silently re-lock.
- Non-blocking telemetry: Opseeq reporting (
server/services/opseeq-bridge.jsreportStage) is fire-and-forget; it must never stall a pipeline stage. - Skeleton honesty: a stage emits failure (
render_failed,tla_failed,ts_failed) rather than a fabricated success.
- Server-declared readiness: the frontend renders readiness exclusively from
Skill Coordination (Decision-Point Mapping)
| Decision point | Mandatory sub-skill |
|---|---|
| Tab 1 work — idea intake, enhancement, voice | mermate-tab-idea |
| Tab 2 work — markdown spec intake/refinement | mermate-tab-markdown |
| Tab 3 work — Mermaid compile, render, depth | mermate-tab-mermaid |
| Tab 4 work — TLA+ generation, SANY/TLC | mermate-tab-tla |
| Tab 5 work — TypeScript runtime gen/test | mermate-tab-typescript |
| Agent sessions, Opseeq, MCP bridge, run lineage, boot/health | mermate-agentic-infra |
| MCP tool surface changes | mermate-openclaw-mcp (.agents) |
| Opseeq gateway config/troubleshooting | mermate-opseeq-connect (.agents) |
| Formal rigor on the TLA+ stage | specification-master-agent tree |
Never load more sub-skills than the current tab or decision requires. This master skill remains sole authority on cross-stage invariants.
Behavioral Doctrine
- Read the code before changing it: stage semantics live in
STAGE_REGISTRYand the owning route file — cite them, don't reinvent them. - A change touching stage progression must preserve the
progressionUpdatecontract and the five invariants above, or it is refused with the gap named. - Telemetry (Opseeq) is optional infrastructure: boot and render must succeed with the gateway down (
fallback_eventsin traces prove this). - Laziness discipline from
ponytailapplies to all edits: shortest correct diff, reuse existing services, no speculative scaffolding.
Verification (run what matches the change)
npm test— full suite (node --test test/test-*.js)npm run test:fast— fast unit testsnode --test test/test-e2e-tandem.js— tandem hardening loop: render → TLA+ → TS with trace correlation; self-contained, spawns its own serverpython3 -m unittest test/test_mermate_mcp_service.py— MCP bridgecurl -s http://localhost:3333/api/health | python3 -m json.tool— live boot sanity