io.github.icohangar-ops/chp-mcp
OfficialREADME.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.