deepPairingBLOCK
Review what Claude Code is about to change on a rich visual surface — inline comments, evidence, and a gate that remembers the approaches you rejected.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Hand Claude Code the implementation without handing it the decisions that matter. It shows you the evidence, you make the call in a local review UI, and what you turn down is checked against what the agent proposes next in that repo.
Who it's for: engineers who let Claude Code write most of the code but want to own the architecture — the calls that are expensive to reverse.
The expensive problem: an agent working alone quietly makes the load-bearing choices (a global singleton for config, a new queue, a schema change). You meet them in a 500-line diff, after the code is built on top of them. Or you reject an idea on Tuesday, and on Thursday a fresh session proposes it again.
What you get instead: before it builds, Claude Code shows you what it found (with file:line evidence), the options it weighed, and the plan. You comment, pick, or reject in the companion UI. When you reject an approach with a reason, this project's gate checks later proposals against it and refuses a match, quoting your reason back. The run ends with a debrief of what changed and what still needs your eyes.
What the gate does, and what it doesn't (the details are in Your taste compounds):
- *In-protocol (`present_` tools) — refused.* Reject "global mutable state
for config", and "keep config in global mutable states"* is refused before the artifact is recorded.
- Matching is on words, not meaning. It uses stemmed words plus a small,
hand-audited synonym list (delete↔remove, directory↔folder). "A module-level mutable settings object" shares too few words with that concept, so it gets through. False positives happen too: "remove global mutable state from config" is refused, because it contains every word of the concept. One click on "Retire this stance" clears it.
- Direct `Edit`/`Write`/`MultiEdit` — you're asked, not refused. A
PreToolUse
hook pauses a matching edit with a permission prom
d5c928be8124OBSERVED · 2026-10-11Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add deeppairing --env AWS_KEY=${AWS_KEY} --env DP_FIXTURE_CHILD_SECRET=${DP_FIXTURE_CHILD_SECRET} -- npx -y [email protected]{
"mcpServers": {
"deeppairing": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"AWS_KEY": "${AWS_KEY}",
"DP_FIXTURE_CHILD_SECRET": "${DP_FIXTURE_CHILD_SECRET}"
}
}
}
}Exposed tools (5)
5 read · 0 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
concept | read | Short name for the pattern you |
mode | read | Which surface to read: |
query | read | Concept or substring to look up (e.g. |
reason | read | Why you |
recall | read | Query your philosophy ledger (cross-project stances) and past sessions. Surfaces what you |
Trust audit
BLOCKgrade F · trust 43/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | FAIL |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (5 observation(s))
- Network
- declared (7 observation(s))
- Shell
- none-observed
- Dependencies
- not all pinned
- Secrets in source
- found
Findings (25)
?)[ \r ]*`,$i=`[̀-ͯ]`,ea=RegExp($i+`+$`),ta=`(`+Ji+`+)|`+(Qi+`|`)+`([!-\\[\\]-‧-豈-]`+($i+`*`)+`|[\ud800-\udbff][\udc00-\udfff]`+($i+`*`)+`|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5`+(`|`+Zi)+(
history. Now the file is snapshotted to `....corrupt-<timestamp>` and writes are
const res = await fetch(`http://127.0.0.1:${info.port}/`, { signal: AbortSignal.any([AbortSignal.timeout(1e3), cancel]) });const res = await fetch(`http://127.0.0.1:${port}/api/demo/run`, {var e=Uint8Array.from(atob(`AGFzbQEAAAABoQEWYAJ/fwF/YAF/AX9gA39/fwF/YAR/f39/AX9gAX8AYAV/f39/fwF/YAN/f38AYAJ/fwBgBn9/f39/fwF/YAd/f39/f39/AX9gAAF/YAl/f39/f39/f38Bf2AIf39/f39/f38Bf2AAAGAEf39/fwBgA39+fwF+
`),P(`\r`),P(` `),P(`\v`),P(` `),P(`\xA0`),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(` `),P(`\u2028`),P(`\u2029`),P(` `),P(` `),P(` `),P(``)],_a=/[0-9a-fA-F]/,va=/
\r \v \xA0 \u2028\u2029 `.split(``);function Oa(e){let t=typeof e==`string`?new RegExp(e):e;return Da.some(e=>t.test(e))}o(Oa,`isWhitespace`);function ka(e){return e.replace(/[.*+?^${}()|const token = "review-post-test-token";
lines: [{ kind: "add", content: " token: ghp_abcdefghijklmnopqrstuvwxyz012345", newLine: 1 }],files: [{ hunks: [{ lines: [{ content: "ghp_abcdefghijklmnopqrstuvwxyz012345" }] }] }],const GH_TOKEN = "ghp_abcdefghijklmnopqrstuvwxyz012345";
hunks: [{ header: "@@ -1 +1 @@", lines: [{ kind: "add", content: " token: ghp_abcdefghijklmnopqrstuvwxyz012345", newLine: 1 }] }],expect(warning).not.toContain("ghp_abcdefghijklmnopqrstuvwxyz012345");const m = scanForSecrets("-----BEGIN RSA PRIVATE KEY-----\nMIIE...\n-----END RSA PRIVATE KEY-----");runtime.json.gz
.gitguardian.yaml
check-feedback-payload-agreement.test.ts
const gitBlob = createHash("sha1").update(`blob ${bytes.length}\0`).update(bytes).digest("hex");const token = crypto.createHash("sha1").update(String(sessionId)).digest("hex").slice(0, 8);`&&r++}n&&t.length>0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),n=0,r=t.length;if(r===0)ret${JSON.stringify(Object.fromEntries(e))}`));return}let n=parseInt(t);if(isNaN(n)){this.fireError(Error(`Content-Length value must be a number. Got ${t}`));return}this.nextMessageLength=n}let e=this.bu`,c;(function(e){function t(e){let t=e;return t&&n.func(t.dispose)&&n.func(t.onClose)&&n.func(t.onError)&&n.func(t.write)}o(t,`is`),e.is=t})(c||(e.MessageWriter=c={}));var l=class{static{o(this,`Abstr${n}`);let i=n.substr(0,r),a=n.substr(r+1).trim();l.set(e?i.toLowerCase():i,a)}return l}tryReadBody(e){if(!(this._totalLength<e))return this._read(e)}get numberOfBytes(){return this._totalLength}_readlockfileSha256: digest(await fs.readFile(path.resolve(packageRoot, "../../pnpm-lock.yaml"))),
this.baseURL = `http://127.0.0.1:${meta.port}`;Gates applied: no_behavioural_pass.
d5c928be8124full audit observations/trust-audit/mcp-server/mitchjablonski__deeppairing.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | d5c928be8124 | BLOCK | F | 43 | first audit |
Questions
What is the deepPairing MCP server?
Review what Claude Code is about to change on a rich visual surface — inline comments, evidence, and a gate that remembers the approaches you rejected.
What tools does deepPairing expose?
5 in total: 5 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.
Is deepPairing safe to connect to an agent?
No — not without reading the findings first. The audit graded it F (43/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.
What credentials does deepPairing need?
It reads AWS_KEY and DP_FIXTURE_CHILD_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does deepPairing run?
It speaks stdio, so it runs as a local process your client starts. It is published on npm as deeppairing at 0.0.2.
How current is this page?
The grade is for one exact copy of the source (d5c928be8124), read on 2026-10-11. The repository is watched and re-audited when it changes.