Skip to main content
Glama
icohangar-ops

io.github.icohangar-ops/chp-mcp

Official
README.md
# `@cubiczan/chp`

Consensus Hardening Protocol for TypeScript — **Profile B** capital gate,
canonical JSON, and signed audit ledger.

**Canonical protocol repo:** [icohangar-ops/consensus-hardening-protocol](https://github.com/icohangar-ops/consensus-hardening-protocol)
(spec, golden vectors, Python reference)

## Install

### npm (this package)

```bash
npm install @cubiczan/chp
```

- Registry: [npmjs.com/package/@cubiczan/chp](https://www.npmjs.com/package/@cubiczan/chp)

### PyPI (Python reference)

```bash
pip install consensus-hardening-protocol
```

- Registry: [pypi.org/project/consensus-hardening-protocol](https://pypi.org/project/consensus-hardening-protocol/)
- Profile A deliberation + the normative spec. This npm package is the
  installable TypeScript surface for spend/mandate gates — same channel shape as
  `@cubiczan/codesentinel-mcp`.

## How the pieces fit

CHP is the **engine**. MCP servers are the **transport**.

```text
MCP client (Cursor / Claude / …)
        │  tools/call
        ▼
┌───────────────────────────┐
│  MCP server (transport)   │  ← agent-conductor, codesentinel-mcp, …
│  decision_gate            │
│  decision_adversary       │
│  evaluate_spend_gate      │
└─────────────┬─────────────┘
              │ depends on
              ▼
┌───────────────────────────┐
│  Published CHP packages   │
│  PyPI: consensus-hardening-protocol  (Profile A)
│  npm:  @cubiczan/chp                 (Profile B)  ← you are here
└───────────────────────────┘
```

This package is Profile B (`evaluateGate` / `approveHuman`). Wire it into an
MCP server as something like `evaluate_spend_gate`. Profile A deliberation
tools (`decision_gate`, `decision_adversary`) live on
[agent-conductor](https://github.com/icohangar-ops/agent-conductor), which
depends on the PyPI package behind a stdio bridge.

## MCP one-liner

For Cursor / Claude without writing glue code:

```bash
npx -y @cubiczan/chp-mcp
```

Registry name: `io.github.icohangar-ops/chp-mcp`. Source: [cubiczan-chp-mcp](https://github.com/icohangar-ops/cubiczan-chp-mcp).

**Conformance:** Profile B **30/30** · Profile A (Python) **70/70**.

## Quick start

```ts
import { evaluateGate, approveHuman } from "@cubiczan/chp";

const policy = {
  max_notional: 500,
  daily_cap: 2500,
  hitl_threshold: 250,
  min_confidence: 0.55,
  allowed_actions: ["LONG", "SHORT"],
};

const decision = evaluateGate(
  { action: "LONG", asset: "ETH", notional: 300, confidence: 0.9 },
  policy,
);
// → { state: "HITL_REQUIRED", requires_human: true, ... }

const locked = approveHuman(
  { action: "LONG", asset: "ETH", notional: 300, confidence: 0.9 },
  policy,
  "cfo@example.com",
);
// → { state: "LOCKED", allowed: true, ... }
```

Hard rule failures (`max_notional`, `daily_cap`, `min_confidence`, …) are
collected **before** the HITL threshold test. A human may cross the threshold;
they may not approve a policy violation (spec §6.3 / §6.5).

## Cross-language hashes

CHP content hashes are SHA-256 over [canonical JSON](https://github.com/icohangar-ops/consensus-hardening-protocol/blob/main/spec/CHP-v1.0.md)
(spec §3.1). Python emits whole floats as `100.0`; JavaScript's `JSON.stringify`
emits `100`. This package formats Profile B hashed field sets the Python way so
audit digests match the golden vectors and the Python reference.

## Conformance adapter

```bash
npm run build
python3 path/to/spec/conformance/run_conformance.py \
  --adapter-cmd "node dist/adapter.js" \
  --profile B
```

Profile A ops are reported `unsupported` (SKIP), not FAIL.

## Licence

MIT.