Repository navigation
Ghost Hands v0.6.0 — the phone-decides wave
The phone-decides wave: the last roadmap approver lands. This release brings the repo current — v0.4.0 and v0.5.0 were built and verified but never got their own releases, so their changes ship here too (summarized below).
v0.6.0 — PhoneApprover
- PhoneApprover (
phone_approver.py) — consequential asks route to Ryan's phone through the Ghost Hands bridge in MrGhosty v1.7.0. On an ask it POSTs a redacted approval request and polls for the phone's decision; approved → the action runs, and denied / expired / timeout / unreachable / 401 all mean it never does. Trail approval events carrychannel: "phone", request + decision phases, anddecided_by: "phone". - Redacted summaries, by construction. Requests carry kind, classification, target descriptor, and current URL/package only;
typeshows the target + character count (never the text — it may be a password),fill_formshows field names (never values). The contract tests prove a secret string never appears in the payload the bridge receives. - Bridge protocol addition —
POST /v1/approvalsandGET /v1/approvals/<id>. There is intentionally no decision endpoint: a token holder can create a request but can never approve their own — decisions exist only in MrGhosty's notification actions and Device-tab card. - CLI —
ghost-hands run --approver phoneworks with every driver (the phone can approve web runs too); conflicting approver flags exit 2. Newghost-hands phone-approval-testsends one harmless test approval and exits 0 only when the phone approves — the one-command on-device proof. - Bus agent —
--approval-channel bus|phone(envGHOST_HANDS_APPROVAL_CHANNEL). Withphone, consequential asks route to the phone; the agent posts a bus comment noting the phone decision and never requests an approval from the bus. - MrGhosty v1.7.0 (companion app) — approval store (JVM-tested core), the two bridge endpoints, a high-importance "Ghost Hands approvals" notification with Approve/Deny actions, and a Device-tab approvals card.
- Verification — pytest 299/299, offline bench 88/88 (new v6 phone-approval case), live bench 2/2. Wheel 123,802 B / sdist 454,640 B.
Also in this release — v0.5.0 (the real-hands wave)
- AndroidDriver — the real Android body: HTTP/JSON to the Ghost Hands bridge in MrGhosty v1.6.0 (loopback
127.0.0.1:8378, pairing token, never logged or trailed). Bridge protocolGET /v1/status,POST /v1/perceive,POST /v1/act; the bridge's target-missing/mismatch replies feed the Runner's self-healing unchanged. Web-only actions fail honestly, never faked. - CLI —
ghost-hands android-statusandrun --driver android. - Verified: 269 pytest, bench 87/87, live bench 2/2.
Also in this release — v0.4.0 (the collaboration wave)
- GhostBus agent mode —
ghost-hands bus-agentregisters on a GhostBus workspace, claims tagged tasks (respecting claim leases,blockedBy, and the bus's needs-approval gate), runs them through the unchanged Runner/Governor/Trail, uploads the JSONL trail as a shared bus file, and completes with a structured report. Approvals over the bus: deny/timeout denies. - Body Protocol —
docs/BODY_PROTOCOL.md: the formal driver contract, proven by SimPhoneDriver, an in-memory Android-style body driven unchanged by the existing Runner/Governor/deciders; conformance passes on all three bodies (Fake, Chromium, SimPhone). - Policy packs —
readonly/standard/strictpresets (--policy-pack, MCPGHOST_HANDS_POLICY). - Verified: 225 pytest, bench 86/86, live bench 2/2.
Honest status
On-device proof is still pending Ryan's install of MrGhosty v1.7.0 + accessibility grant — no phone was attached during these builds. The install above is the Python package; ghost-hands phone-approval-test is the one-command proof once the phone side is set up.
Full details: CHANGELOG.md