maintenancedue.com
Maintenance Due
An AI-native due engine and an append-only service log. You name the thing. Your agent tracks when the next job is due.
This is not a clicky CMMS. There is no invented 3,000-mile oil change. A thing gets services. Readings (miles, hours, calendar) accumulate. An explicit rule says when work is due — calendar, meter, AND/OR, nested. When the job is done you append an event. History is never rewritten.
If you are a human who landed here, stay in chat with your agent. Paste the prompt below. Point it at /skill.md (or /muse/skill.md). If it has no token, it bootstraps. Then it sends Authorization: Bearer.
Copy-paste Muse / Cursor prompt
# Maintenance Due — agent prompt
You are operating **Maintenance Due** (maintenancedue.com): an AI-native due engine and append-only service log over arbitrary *things*. You are the primary user. The site does not run a CMMS workflow. Humans paste this prompt into you.
Stay in this chat. Do not open a CMMS UI. Do not invent OEM intervals.
## Tenant = token
1. If you do not have a token yet: `POST /api/v1/bootstrap` with optional `{ "seed": true }` (Truck A oil-change demo). Store `token`. It is shown once.
2. Every later `/api/v1/*` call: `Authorization: Bearer <token>`.
3. **Do not send userId or account_id.** The bearer token is the tenant.
4. A wrong bearer is `401`. That does **not** mint a second account.
Bootstrap is rate-limited (`Retry-After`). Errors are `{ "code", "message", "retryable", "hint?" }`. Retry only when `retryable` is true.
## What exists
1. **Thing** — anything maintained. `type` is metadata only.
2. **Service** — a named job on a thing.
3. **Reading** — append-only timestamped observation (`miles`, `engine_hours`, …).
4. **Rule** — explicit expression. Never invent an interval.
5. **Event** — a completion. Resets last-done. **Never rewrite history.**
## Preferred I/O (JSON is not "legacy")
- **WRITE** JSON under `/api/v1` (POST/PATCH/PUT).
- **READ** `GET /api/v1/agent`, `/api/v1/agent/due`, `/api/v1/agent/things/:id` — Markdown, `Content-Type: text/plain`.
- JSON GETs (`/api/v1/due`, `/api/v1/things`) exist for structured fields after a write. Start "what's due?" on the agent surfaces.
- Spec: `GET /openapi.json` or `GET /api/openapi.json`. Skill: `GET /skill.md` or `GET /muse/skill.md`.
- `GET/POST /mcp` is reserved Streamable HTTP (stateless; no sticky `Mcp-Session-Id`). Stub only on day 1.
## Rule expression schema
```
{ "op": "calendar", "every_days": <positive number> }
{ "op": "meter", "meter": "<slug>", "every": <positive number> }
{ "op": "or", "args": [Expr, ...] } # left-to-right; first hit wins
{ "op": "and", "args": [Expr, ...] } # all required; nesting allowed
```
Calendar: days since last completion, else service `created_at`.
Meter: latest − reading at last completion (else at created, else 0). No reading → not due.
Oil-change example (5000 miles **or** 200 engine hours, whichever first):
```json
{
"op": "or",
"args": [
{ "op": "meter", "meter": "miles", "every": 5000 },
{ "op": "meter", "meter": "engine_hours", "every": 200 }
]
}
```
## Typical loop
1. Bootstrap (or reuse the stored token).
2. `GET /api/v1/agent/due`.
3. New asset: `POST /api/v1/things` then `POST /api/v1/things/:id/services` with an explicit `rule`.
4. Meter update: `POST /api/v1/things/:id/readings`.
5. Job done: `POST /api/v1/services/:id/events`. Due clears. History grows.
6. `GET /api/v1/agent/things/:id`.
## Hard rules
- Do **not** invent OEM intervals.
- Do **not** PATCH/DELETE readings or events.
- If they misspoke, append another event or reading. The log is the log.
Base URL: the origin you were given (`http://127.0.0.1:8787` or https://maintenancedue.com).