Start with your agent
- Enter vault or have the agent call
enter_vault - Each lock registers one tool (see inspector below the stage)
- Human and agent act together on each lock
Cooperative computing
HUMANLOCK is an experiment: a web app where neither human nor agent has sufficient capability alone. The vault requires both.
Humans: perception, intuition, judgment, physical interaction
Agents: computation, search, verification, structured execution
Dynamic WebMCP
Each lock registers one tool when active, unregisters on solve. The page changes what the agent can do as you progress.
freeze_frame → solved → filter_by_vibe → solved → sonify_to_spectrogram …
Deterministic
No LLM judge, no backend. Locks are pure JS that validate inputs. No hallucination, no cheating.
Pure client state. Same DOM for human and agent.
THE BLUR
240fps flash, freeze to reveal
THE SWARM
5000 buttons, one truth
THE WHISPER
Ultrasonic, see the sound
THE LIE
Display lies, ledger tells truth
THE HANDSHAKE
50ms human and agent sync
WEBMCP TOOL BUS
Dynamic — only the active lock's tool is exposed. The rest are waiting or consumed.The page changes what the agent can do as you progress. No static tool list.
Prove it: try alone
Neither human nor agent has the complete capability set.
Agent prompt
Open this URL in ChatGPT desktop browser, then send:
List my WebMCP tools and help me open this vault. Start with THE BLUR, call freeze_frame at the glitch. Then filter_by_vibe, sonify_to_spectrogram, audit_truth, and align_quantum_lock together with me.
How WebMCP makes this possible
Each lock registers one
document.modelContext.registerTool() tool. The agent
discovers it via getTools() or
toolchange event, calls it with structured args, and
the page mutates shared DOM state. Human and agent see the same
vault. Neither can cheat: tools validate inputs and locks judge
deterministically.
freeze_frame({ timestamp: 300 }) -> Revealed digit 7
filter_by_vibe({ description: "most trustworthy" }) -> 12 candidates
sonify_to_spectrogram() -> image with code 42
audit_truth() -> Real: $999 vs Display: $10
align_quantum_lock({}) -> 12ms window, success