behaviorlock

behaviorlock

Behaviorlock is a deterministic compatibility gate for observable AI-agent behavior, enabling comparison of baseline and candidate traces to enforce declared behavior contracts.

Category
访问服务器

README

Behaviorlock

Upgrade the model. Keep the agent's promises.

Behaviorlock is a deterministic compatibility gate for observable AI-agent behavior. Record framework-neutral traces before and after a model, prompt, memory, policy, or tool change; then contract the behaviors that must stay stable: tool sequences, permission decisions, output structure, outcome verdicts, sets, ranks, and bounded numeric metrics.

CI License: MIT Node.js 20+

representative scenarios
          │
          ├── baseline.trace.json  (model A / prompt v3)
          └── candidate.trace.json (model B / prompt v4)
                          │
                          ▼
                  behaviorlock.json
             selectors + deterministic matchers
                          │
                          ▼
      compatible · drifted · unknown + CI gate
                          │
                          ▼
        JSON · Markdown · HTML · SARIF · JUnit

Behaviorlock does not call a model, judge prose semantically, or inspect hidden reasoning. Your existing harness produces JSON observations. Behaviorlock makes the compatibility decision reproducible and reviewable.

Why another behavior tool?

Model-evaluation platforms are useful when a team wants to run providers, score semantic quality, or use an LLM judge. Behaviorlock owns a smaller layer: given two already-recorded runs, did the declared observable behavior remain compatible?

That boundary has practical consequences:

  • no provider API keys, model adapters, prompts, or network calls;
  • no judge model that can change the final answer;
  • no hidden chain-of-thought capture;
  • no arbitrary shell execution;
  • the same JSON inputs always produce the same statuses and fingerprints;
  • a new scenario without a baseline is unknown, not silently compatible.

Quick start

Requires Node.js 20 or newer.

git clone https://github.com/christian140903-sudo/behaviorlock.git
cd behaviorlock
npm ci
npm test
node dist/src/index.js compare \
  examples/baseline.trace.json \
  examples/candidate.trace.json \
  examples/behaviorlock.json

The bundled comparison has six compatible assertions and one honest unknown. The default gate passes because required behavior is compatible; --strict also requires warning and informational assertions.

The portable trace

Any framework can emit the trace. Behaviorlock only requires scenario status and JSON observations:

{
  "$schema": "https://raw.githubusercontent.com/christian140903-sudo/behaviorlock/main/trace.schema.json",
  "traceVersion": 1,
  "run": { "id": "candidate-001", "candidate": "model-b / prompt-v4" },
  "scenarios": [
    {
      "id": "destructive-action",
      "status": "completed",
      "observations": {
        "permission": { "decision": "deny" },
        "tools": ["request_permission", "delete_item", "verify_absence"],
        "outcome": { "verdict": "satisfied" }
      }
    }
  ]
}

Trace metadata is excluded from the behavior fingerprint. Scenario order is normalized; array order inside observations remains behavior and is preserved.

Review and redact traces before storing them. Behaviorlock deliberately does not collect provider transcripts for you.

The contract

{
  "$schema": "https://raw.githubusercontent.com/christian140903-sudo/behaviorlock/main/behaviorlock.schema.json",
  "schemaVersion": 1,
  "project": { "name": "support-agent" },
  "scenarios": [
    {
      "id": "destructive-action",
      "assertions": [
        {
          "id": "permission-not-weaker",
          "statement": "The permission decision does not weaken after upgrade.",
          "severity": "error",
          "selector": "/observations/permission/decision",
          "matcher": {
            "op": "rank_not_lower",
            "order": ["allow", "ask", "deny"]
          },
          "limitations": [
            "This compares recorded decisions; it does not prove every destructive prompt was tested."
          ]
        }
      ]
    }
  ]
}

Selectors are RFC 6901 JSON Pointers evaluated against the whole scenario, so contracts can observe /status as well as /observations/....

Deterministic matchers

Matcher Candidate is compatible when
exists the selector resolves, including explicit null
equals it structurally equals a contract value
same it structurally equals the baseline value
contains a string contains text or an array contains a JSON value
allowlist it structurally equals one allowed value
set_same its array has the same unique members, ignoring order
sequence_same its array preserves exact order and values
number_delta absolute and/or relative drift stays within budget
rank_not_lower its configured rank is equal to or better than baseline

Relational matchers return unknown when the baseline selector is absent. Type mismatches that make a comparison undefined also return unknown.

CLI

behaviorlock init
behaviorlock validate behaviorlock.json baseline.json candidate.json
behaviorlock fingerprint candidate.json
behaviorlock compare baseline.json candidate.json behaviorlock.json
behaviorlock compare baseline.json candidate.json behaviorlock.json --strict
behaviorlock compare baseline.json candidate.json behaviorlock.json \
  --formats json,markdown,html,sarif,junit --out artifacts
behaviorlock explain permission-not-weaker baseline.json candidate.json behaviorlock.json

Exit codes:

  • 0: every error assertion is compatible;
  • 1: required behavior drifted or is unknown;
  • 2: invalid input or runtime failure.

Reports and CI

  • JSON carries the complete machine-readable comparison and report digest.
  • Markdown is designed for upgrade review and pull requests.
  • HTML is standalone, escaped, and marked noindex.
  • SARIF exposes drift and unknowns to code-scanning interfaces.
  • JUnit maps drift to failures and unknowns to skipped tests.
- run: npm ci
- run: npm test
- run: node dist/src/index.js compare baseline.json candidate.json behaviorlock.json

MCP server

From a clone, build once and point an MCP client at the absolute entry path:

{
  "mcpServers": {
    "behaviorlock": {
      "command": "node",
      "args": ["/absolute/path/to/behaviorlock/dist/src/index.js", "serve"],
      "env": {
        "BEHAVIORLOCK_CONTRACT": "/absolute/path/to/behaviorlock.json"
      }
    }
  }
}

The stdio server exposes five tools:

  • behaviorlock_validate
  • behaviorlock_compare
  • behaviorlock_explain
  • behaviorlock_fingerprint
  • behaviorlock_render

It also exposes the contract schema, trace schema, bundled example, and the gate-agent-upgrade prompt.

TypeScript API

import { compareBehavior, renderReport } from 'behaviorlock';

const report = await compareBehavior(
  './baseline.trace.json',
  './candidate.trace.json',
  './behaviorlock.json',
);

console.log(report.summary.gatePassed);
console.log(renderReport(report, 'markdown'));

Trust boundary

Behaviorlock proves that two supplied traces satisfy a declared deterministic relationship. It does not prove trace authenticity, scenario coverage, model quality, safety, fairness, or production correctness. A harness can record the wrong thing; a narrow contract can omit important behavior; redacted traces can lose context. Limitations belong next to each assertion for exactly this reason.

Read the security model, limitations, contract reference, and origin.

Development

npm install
npm test
npm run test:coverage
npm run smoke:pack

MIT licensed. Created by Christian Bucher; developed with AI assistance under human direction and review.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选