Your app generates its own verified UI transition graph — screens as nodes, guarded (event, effect) edges. Proof-gated verification, trust tiers, model-free MCP for AI agents.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http counts 26 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
describe_screen
-
diff
-
diff_since_last
-
gen_spec
-
get_coverage
-
get_freshness
-
get_frontier
-
get_graph
-
get_grounding
-
get_loop_status
-
get_proposal_graph
-
get_proposals
-
get_state
-
list_cases
-
list_scenarios
-
mark_unverifiable
-
next_to_verify
-
park_edge
-
plan_path
-
propose
-
reconcile_proposals
-
report_observation
-
set_scenario
-
unpark_edge
-
update_graph
-
withdraw_proposal
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit c4f8b83 · analyzer v33 · 3d ago
skills & prompt files 2
- agent-rules kanetran29-uigraph-c4f8b83/CLAUDE.md
- skill kanetran29-uigraph-c4f8b83/kit/SKILL.md
danger signals1
- dynamic code execution new Function() kanetran29-uigraph-c4f8b83/packages/cli/src/runner.ts :717
const loc = new Function('page', `return page.${expr}`)(page) as PwLocator
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 262
filesystem 24
- fs kanetran29-uigraph-c4f8b83/packages/adapter-angular/src/index.ts :6
import { existsSync, readFileSync, readdirSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-next/src/index.ts :12
import { existsSync, readFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-next/src/layout-nav.ts :13
import { existsSync, readFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-react/src/index.ts :5
import { readFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-react/src/resolve.ts :9
import { readFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-vue/src/extract.ts :16
import { readFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-vue/src/index.ts :6
import { existsSync, readFileSync, readdirSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/adapter-vue/src/project.ts :4
import { readdirSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/packages/cli/src/cli.test.ts :7
import { existsSync, mkdtempSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/cli/src/cli.ts :9
import { existsSync, realpathSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/cli/src/commands.ts :6
import { readFileSync, writeFileSync, mkdirSync, existsSync, statSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/cli/src/server.ts :7
import { existsSync, readFileSync, statSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/packages/core/src/fingerprint.test.ts :2
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, symlinkSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/packages/core/src/node.test.ts :2
import { mkdtempSync, rmSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/core/src/node.ts :5
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/packages/core/src/registry.test.ts :2
import { mkdtempSync, rmSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/core/src/registry.ts :8
import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/core/src/store.ts :11
import { mkdirSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/core/tsup.config.ts :7
import { existsSync, readFileSync, writeFileSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/mcp/src/kit.ts :7
import { existsSync, readFileSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/packages/mcp/src/tools.test.ts :6
import { mkdtempSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/mcp/src/tools/diff.ts :6
import { existsSync } from 'node:fs' - fs kanetran29-uigraph-c4f8b83/packages/mcp/src/tools/loop.ts :7
import { existsSync } from 'node:fs' - fs (weak) kanetran29-uigraph-c4f8b83/scripts/gauntlet.ts :7
import { readFileSync } from 'node:fs'
shell / exec 2
- shell kanetran29-uigraph-c4f8b83/packages/cli/src/cli.ts :8
import { spawn } from 'node:child_process' - shell (weak) kanetran29-uigraph-c4f8b83/scripts/check.mjs :6
import { spawnSync } from 'node:child_process'
network 7
- net kanetran29-uigraph-c4f8b83/apps/dashboard/src/api.ts :30
const res = await fetch('/api/workspaces') - net (weak) kanetran29-uigraph-c4f8b83/examples/sample-form-app/src/api.ts :12
const res = await fetch('/api/signup', { - net (weak) kanetran29-uigraph-c4f8b83/examples/sample-gauntlet-react/src/pages/ProductDetail.tsx :21
await fetch('/api/checkout', { method: 'POST' }) - net (weak) kanetran29-uigraph-c4f8b83/examples/sample-react-app/src/pages/Checkout.tsx :29
await fetch('/api/orders', { method: 'POST', body: JSON.stringify({ email, notes }) }) - net (weak) kanetran29-uigraph-c4f8b83/packages/adapter-react/src/extract.test.ts :316
'/C.tsx': `import { useState } from 'react'\nimport { useNavigate } from 'react-router-dom'\nfunction Dialog(p){ return p.open ? <div>x</div> : null }\nexport default function C(){ const navigate = us - net (weak) kanetran29-uigraph-c4f8b83/packages/cli/src/cli.test.ts :14
import type { Server } from 'node:http' - net kanetran29-uigraph-c4f8b83/packages/cli/src/server.ts :6
import { createServer as createHttpServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http'
tool registrations 26
- get_graph kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :70
- get_proposals kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :75
- get_grounding kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :90
- get_proposal_graph kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :101
- describe_screen kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :106
- get_coverage kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :115
- next_to_verify kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :120
- gen_spec kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :131
- list_scenarios kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :144
- set_scenario kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :149
- get_state kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :158
- list_cases kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :167
- get_frontier kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :179
- plan_path kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :187
- update_graph kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :201
- report_observation kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :212
- propose kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :245
- diff kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :279
- diff_since_last kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :291
- get_loop_status kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :296
- get_freshness kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :301
- reconcile_proposals kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :306
- withdraw_proposal kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :311
- mark_unverifiable kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :323
- park_edge kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :335
- unpark_edge kanetran29-uigraph-c4f8b83/packages/mcp/src/server.ts :347
declared dependencies 8
- @types/node@catalog:
- eslint@^10.5.0
- playwright-core@^1.60.0
- tsup@catalog:
- tsx@catalog:
- typescript@catalog:
- typescript-eslint@^8.61.0
- vitest@catalog:
perm:untrusted 1
- untrusted (weak) kanetran29-uigraph-c4f8b83/packages/cli/src/cli.test.ts :623
const ga = (await (await fetch(`${base}/api/graph?ws=a`)).json()) as UiGraph