Skip to content

Ghost Hands v0.6.0 — the phone-decides wave

Choose a tag to compare

@littlestjames82-sys littlestjames82-sys released this 09 Oct 01:28

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 carry channel: "phone", request + decision phases, and decided_by: "phone".
  • Redacted summaries, by construction. Requests carry kind, classification, target descriptor, and current URL/package only; type shows the target + character count (never the text — it may be a password), fill_form shows field names (never values). The contract tests prove a secret string never appears in the payload the bridge receives.
  • Bridge protocol addition — POST /v1/approvals and GET /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 phone works with every driver (the phone can approve web runs too); conflicting approver flags exit 2. New ghost-hands phone-approval-test sends one harmless test approval and exits 0 only when the phone approves — the one-command on-device proof.
  • Bus agent — --approval-channel bus|phone (env GHOST_HANDS_APPROVAL_CHANNEL). With phone, 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 protocol GET /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-status and run --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-agent registers 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 / strict presets (--policy-pack, MCP GHOST_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