# Reported issues for orangerail

Pod holds 16 of 32 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [orangerail](/mcp/orangerail).

## Most discussed

### ONT-112: Bring the npm page to the new front door, and cut 0.1.5

## Problem

#180 moved this project's front door from the approval gate to the generated tool surface, and
published the register of claims that failed when they were measured. **None of it has reached npm.**

npm renders a package page from the published tarball, so `npmjs.com/package/orangerail` still opens
with the framing ten measured runs say is the weaker half:

```console
$ npm view orangerail version
0.1.5-not-yet   # today: 0.1.4, whose tarball still says "Decide once what your agent ma

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/181) · 2026-08-04 · closed · 0 comments

### ONT-110: List orangerail on the official MCP registry

## Problem

`0.1.4` put `mcpName` on npm, which was the one thing that had to ship before a registry entry was
possible:

```console
$ npm view orangerail mcpName
io.github.KimHyeongRae0/orangerail
```

npm versions are immutable, so that field could not be added to `0.1.3` after the fact and the
listing was blocked on the release existing. It no longer is, and nothing else is stopping it.

The registry at `registry.modelcontextprotocol.io` is where an agent host resolves a server by name
rather

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/177) · 2026-08-04 · closed · 0 comments

### ONT-108: The README is 649 lines and the npm page is a different document with no images

## Problem

`README.md` is 649 lines and `## Quickstart` alone is 226 of them.

```console
$ awk '/^## /{if(h)print NR-1-s" lines\t"h; h=$0; s=NR} END{if(h)print NR-s" lines\t"h}' README.md
226 lines	## Quickstart
62 lines	## The run this is built for
47 lines	## Wire it into your agent host
43 lines	## Declaring a rule the generator cannot derive
26 lines	## v0 commands
```

The Quickstart's problem is not the eleven commands. It is the ~150 lines of prose between them
explaining why each one i

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/171) · 2026-08-04 · closed · 0 comments

### ONT-101: The MCP server tells every client it is 0.1.0

## Problem

The MCP server reports a version it has not been since three releases ago.

```console
$ node -p "require('orangerail/package.json').version"
0.1.3

$ printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"probe","version":"0"}}}' \
    | ./node_modules/.bin/orangerail mcp
{"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"orangerail","version":"0.1.0"}},"js

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/163) · 2026-08-04 · closed · 0 comments

### ONT-102: The README nav line shows raw HTML entities off GitHub

## Problem

The README's nav line separates its five links with `&nbsp;·&nbsp;`. GitHub resolves the entity;
a renderer that escapes ampersands first does not — and one is now showing it to strangers.

```console
$ curl -sL https://glama.ai/mcp/servers/KimHyeongRae0/orangerail | grep -oE '.{40}nbsp.{30}'
<strong>Quickstart</strong> &amp;nbsp;·&amp;nbsp; <a …>What it does not govern</a>

$ curl -sL https://glama.ai/mcp/servers/KimHyeongRae0/orangerail | grep -c nbsp
10
```

The reader sees this a

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/161) · 2026-08-04 · closed · 0 comments

### ONT-093: The Quickstart cannot reach the write it promises

## Problem

#140 put the Quickstart on the first screen. #142 made every `examples/` README run as written.
Nothing does that for the README's own Quickstart, and following it verbatim from a cold start does
not work.

**The promised payoff never happens.** The Quickstart closes (L191-196) with a human approving a
staged delete and the agent's next `check_approval` executing it. Reproduced against `0.1.2`
through a real MCP client:

```
--- call deleteCustomer {"id":1} ---
Action staged for huma

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/152) · 2026-08-03 · closed · 0 comments

### ONT-088: The README's first paragraph promises an OpenAPI path that does not exist in v0

## Problem

`README.md:12`, the third sentence a visitor reads:

> `orangerail init` turns a `prisma/schema.prisma` **or an OpenAPI spec** into an MCP server: a
> `get` and a `list` per object, one action per write with a zod input schema, and nothing else.

Both halves are false for the OpenAPI input. Against the shipped CLI, on a spec with
`components.schemas`, a collection GET, an item GET, a POST and a DELETE:

```console
$ orangerail init --yes --preset approval-for-writes --no-studio
opena

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/143) · 2026-08-03 · closed · 0 comments

### ONT-081: Move the rules-file argument out of the README so the install comes first

## Problem

`README.md` is 656 lines and the first command a reader can run is on line 281.

```console
$ grep -n 'npx orangerail init --yes' README.md
281:$ npx orangerail init --yes --preset approval-for-writes --no-studio
```

Everything above it is argument. 158 of those lines — `### What a rules file already gets you`,
`### What the tie does not survive`, `### The one that survived on its own terms` — are one
sustained answer to a single question: *why not just write the rules in a `CLAUDE.

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/129) · 2026-08-02 · closed · 0 comments

## Most recent

### ONT-079: The Quickstart's prerequisites omit the adapter Prisma 7 requires

## Problem

A first-time reader on Prisma 7 who follows the README Quickstart exactly as written meets `exit 1` at the first command it asks them to run. Reproduced cold on `2f5d1e3`, from `pnpm pack`ed `0.1.1` tarballs, in a throwaway project holding a Prisma 7 SQLite schema and nothing else:

```console
$ npx orangerail init --yes --preset approval-for-writes --no-studio
orangerail init: this repo is on Prisma 7+ (@prisma/client 7.9.1 (installed)) and no driver adapter for `sqlite` is installe

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/125) · 2026-08-02 · closed · 0 comments

### ONT-074: A row that drifts from its declared schema opens the gate

## Version

`0.1.1` (`062e527`)

## What happened

`packages/core/src/policy/where.ts:23-25` documents the `where` gate as fail-closed:

> a `null`/`undefined` object (target not found) fails closed — we cannot confirm the condition
> holds, so the action is refused (§4.5 secure-by-default).

It fails **closed** on *no row* and **open** on a *wrong row*. Measured on `062e527` against the
repo's own flagship fixture policy (`packages/core/test/fixtures.ts:64`,
`where: { field: 'status', op: 'neq'

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/115) · 2026-08-02 · closed · 0 comments

### ONT-071: Two surfaces still render a stored value unguarded, and one tells the agent the wrong thing

## Version

`0.1.1`, on the merge of #104 (ONT-068) and #105 (ONT-069)

## What happened

Two surfaces still render a stored value unguarded. Each was found by a sibling ticket that
stopped at a file it did not own, and named the gap rather than reaching across.

**1. `audit_unrecorded` reaches the agent as `"Unexpected execute result."`**

#105 added an `ExecuteResult` variant at `packages/core/src/lifecycle/engine.ts:105-113` for the
honest outcome *"the side effect landed and nothing about it

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/107) · 2026-08-01 · closed · 0 comments

### ONT-067: The Prisma 7 default generator produces a green `init` and an ontology where every tool fails

## Version

`0.1.1` (`752ff7b`)

## What happened

`npx prisma init` on prisma 7.9.1 writes this generator block:

```prisma
generator client {
  provider = "prisma-client"
  output   = "../generated/prisma"
}
```

`prisma generate` emits the client into `./generated/prisma` and puts nothing into
`node_modules/@prisma/client`. `orangerail init` then prints its full success banner and
exits 0:

```
✓ scanned your sources — 2 object(s), 6 action(s)
✓ --gate delete: 2 of 6 write action(s) gated
✓ r

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/99) · 2026-08-01 · closed · 0 comments

### ONT-061: mcp: publish the action input contract, and name what it refuses

## Version

`main` @ `8af6078` (the unreleased successor to `0.1.0`), on a project generated
by `orangerail init` against a local Postgres.

## What happened

Two things, and they compound into one failure.

**1. The published `inputSchema` erases the type of every OPTIONAL field.**
Verbatim from `tools/list` on a generated project:

```jsonc
createorder_item → {"id":{"type":"string"},"order_id":{"type":"string"},"product_id":{"type":"string"},"qty":{"type":"number"},"unit_cents":{"type":"number

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/89) · 2026-07-30 · closed · 0 comments

### ONT-060: Report the MCP servers mounted next to this project

## Problem

Nothing in this product reads any host agent configuration.

```console
$ grep -rn "\.mcp\.json\|claude_desktop_config\|cursor/mcp" packages/*/src/
$ # (nothing)
```

`orangerail init` scans data sources — `schema.prisma`, an OpenAPI spec — and nothing
else. So a user can run

```console
$ orangerail init --models customer,order,order_item,product
```

get exactly the narrow governed surface they asked for, and have their agent's exposure
change by **exactly zero**, because a wide SQ

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/85) · 2026-07-30 · closed · 0 comments

### ONT-056: `orangerail init` picks a gating posture instead of gating everything

## Problem

`orangerail init` emits `policy: { approval: 'required' }` on every write action it
generates. That reads as the safe default. It is the wrong one, and the reason is not
theoretical — it is what an operator does next.

On a six-action schema, nothing an agent calls ever completes. Every `create`, every
`update`, every `delete` returns `approval_pending` and waits for a human. So the first
thing anyone does after `init` is open the generated files and delete the gate from most of
them

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/82) · 2026-07-30 · closed · 0 comments

### ONT-057: core: record what a governed write changed *from*

## Problem

An orangerail audit record for a successful write carries the **input** and the
**resulting row**, and never the **prior** one. Verbatim from a live run against a
real Postgres:

```jsonc
{"phase":"succeeded","action":"updateproduct","input":{"id":"p3","stock":25},
 "result":{"id":"p3","sku":"SKU-CABLE","title":"USB-C cable","price_cents":1500,"stock":25}}
```

`p3.stock` was `0` before that call, and nothing on the chain says so.

Two consequences, and the second is worse than the f

[Read the thread](https://github.com/KimHyeongRae0/orangerail/issues/80) · 2026-07-30 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/KimHyeongRae0/orangerail/issues).
