Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add agents/multiplex-term/multiplex/bind-hostgit clone --depth 1 https://github.com/multiplex-term/MultiplexWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.01436 |
| Opus 5 | $0.00000 | $0.00718 |
| Sonnet 5 | $0.00000 | $0.00287 |
| Haiku 4.5 | $0.00000 | $0.00144 |
Grade A, and why
bind-host scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 82 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Bind Host & the mpx CLI
Load-bearing decisions split from AGENTS.md.
- A bound host is one the machine itself vouched for; the app's key goes
out, never a private key (
Models/Bind/,Services/Bind/; protocol + shared vectors in the companion repomultiplex-term/multiplex-cli,spec/bind-v1.md).mpx bindruns on the machine being added and offers itself three ways: terminal QR, Bonjour announcement, and opt-in clipboard (mpx bind --copy— the payload is credential-grade and must not ride Universal Clipboard by default; the pane prints the command beside its Paste button). The app generates an ed25519 keypair; the CLI appends the public half toauthorized_keyswith themultiplex:bind:<8 hex>:<device-slug>comment (mpx unbind's handle). Distribution is three repos: closed source inmultiplex-term/multiplex-cli(never promise it will open; [email protected] does not exist — problems go to the releases repo's issues), archives inmultiplex-term/multiplex-cli-releases, andmultiplex-term/homebrew-tap(thehomebrew-prefix is brew's own resolution rule for the tapmultiplex-term/tap— renaming 404s every documented install line). Av*tag builds four targets (musl + darwin, x86_64/aarch64), publishesSHA256SUMS, opens a formula bump; needs the cross-repoRELEASE_TOKEN.multiplexterm.dev/install-mpx-cli(multiplex-home repo) covers macOS AND Linux and refuses SHA mismatches. The OFFER carries the host's SSH key fingerprints intoHost.pinnedHostKeys, whichHostKeyVerifierenforces on every connection — so a bound host is verified from its first dial, against a set the machine itself vouched for, while a manually added host only gets trust-on-first-use. That is the security argument for binding, and it is why the OFFER'shostkeysarray must stay complete: the validator refuses an algorithm no pin covers (HostKeyPin.decide), so a machine that offers a key type its OFFER omitted cannot connect until the user forgets its keys in Host Settings. Load-bearing: the free host limit is checked before the handshake (a key must not land inauthorized_keysfor a host this tier can't use); a payload from outside the modal never auto-binds (onOpenURL→BindController.receiveonly adds a candidate row and raises the pane for an explicit ENROLL — amultiplex://b/…URL is attacker-suppliable; the pane's own scan/paste keep auto-confirm, and the machine still asks[Y/n]); the machine's own address list outranks wherever its listener answered (BindNaming.hostname;mpx bind --addrcovers NAT — the reached address wins only when the machine endorses it); the PIN proof is transcript-bound (HKDF over PIN + both public keys, 3 attempts then the session locks) while a wrong token closes silently (counting 128-bit guesses would gift a LAN spammer a DoS). Two announcements claiming one name raise a caution on both rows (BindAnnouncement.contestedNames; discovery dedupes by session key, so a shared name means two keys claiming one machine). It is a tell, not a control — do not let it grow into one: the same unauthenticated mDNS lets an attacker forge a goodbye for the real row or answer for its instance name and leave a single row standing, and twompx bindruns on one machine contest their own name, which is why the copy says "if you started only one". The fix that doesn't depend on someone noticing is a SAS overspub(spec/bind-v1.md§3). The whole flow is one modal: Add Host opens on BIND | MANUAL (AddHostSheet.Mode); the deck has no bind surface at all (chip, rail, and ghost tiles shipped and were withdrawn 2026-07-28). Discovery browses only whilebindSurfaceOpenOR an enrollment is in flight — in-flight specifically, or a row parked on FAILED holds the browser open behind a closed modal. A row retires when the machine withdraws its announcement — every waympx bindends does that (Ctrl-C via the CLI'scancelmodule); fix endings in the CLI, never with an app-side liveness probe (tried and rejected 2026-07-28: Bonjour resolves to dead aliases and deleted live machines). The one non-false-positive backstop:BindOfferLifetimeretires rows older than the CLI's--expiresceiling (600 s) + margin — keep in step with the CLI's clamp or move the expiry into the TXT record.--offline(a VPS reachable only over SSH) inverts the key direction — the CLI ships a private key in the payload — so the app retires it on first connection (BindRotationStore: append BEFORE remove; a failure between the steps must leave a working key). The bind key passphrase lives in the app, nowhere else (BindPaneKEY PASSPHRASE; applies to handshake and offline-seed alike). Empty = plaintext store. Set → the key is sealed as encrypted openssh-key-v1 byBindSSHKey.sealedPrivateOpenSSH(vendoredmpxbind_-prefixed OpenBSD bcrypt-pbkdf + CommonCrypto; Citadel's independent bcrypt is the decrypt side, making the round-trip test a real cross-check); the passphrase saves into the host's settings (synced Keychain, the same slot Host Settings shows/clears) so the probe connects immediately. A sealed key is never rotated, andsave()skips the probe for a sealed key with no passphrase on file. The CLI knows nothing about passphrases (a CLI-side variant shipped and was reverted 2026-07-29).
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 82 lines · 0 tokens per session scan A 489e0b18a8cf
bind-host is an agent published in the GitHub repository multiplex-term/Multiplex (10 stars, last pushed 5d ago), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 1,436 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other agents, from other repositories
layer3-issue-detection
Layer 3 systematically scans ALL entry points from Layer 1 and applies issue detection rules. Unlike Layer 2 (which traces specific flows in depth), Layer 3 does a breadth-first scan to categorize issues across the entire codebase.
layer4-semantic-evaluation
Layer 4 evaluates workflows from the user's perspective. While Layers 1-3 analyze code structure, Layer 4 asks: "Does this workflow help the user achieve their goal?".
layer2-methodology
Layer 2 takes entry points from Layer 1 and traces the complete user journey.
mobile-architect
Mobile architecture expert. Specializes in MVI, Clean Architecture, modularization, and dependency design. Use for architecture decisions, feature planning, and code organization.
Native SwiftUI Builder
Builds complex custom SwiftUI views using standard SwiftUI components with TTBaseUIKit design tokens (XView/XSize/XFont). Does NOT use TTBaseSUI wrapper components.
kmp-architect
KMP architecture expert. Designs shared module structures, expect/actual patterns, navigation, and DI for Kotlin Multiplatform projects.