Breaking Changes
- The command is
hnland everything you see says HarnessLink.superpi,harnesslinkandhlkare gone; data moves from~/.superpito~/.hnland the installed tree from~/.superpi-srcto~/.hnl-src. Environment variables areHNL_*(SUPERPI_*andHARNESSLINK_*are no longer read), logs are~/.hnl/logs/hnl.YYYY-MM-DD.<PID>.log, the background service issh.hnl.daemon(macOS),hnl.service(Linux) or thehnllogon task (Windows), and the MCP entry in every harness ishnl, so its tools appear asmcp__hnl_*. The CLI sendsX-HNL-*headers andUser-Agent: hnl/<version>; the local gateway answers on/_hnl/*. - The move is automatic. The installer,
hnl update, the service restart andhnl migrate(run it yourself any time; a second run does nothing) stop and replace the old background service, move~/.superpito~/.hnl(when both hold data,~/.hnlis kept and the old folder is left for you), move~/.superpi-src, rename the MCP entry and point the context hooks athnlin omp, Claude Code, Codex and Cursor, move the omp extension tohnl-context.ts, and remove the oldsuperpi,harnesslinkandhlkcommands when they point at HarnessLink (a command another program owns is left alone). Codex asks you to trust the renamed hooks once in/hooks. Updating from 17.5.84 or earlier works as before:superpi updateruns the new installer, which does the move. If you added the qmd add-on, runhnl add qmdonce so qmd indexes the moved memories folder. - superpi.sh, superpi.app and their
www.andapi.hosts send every browser path to the same path on harnesslink.sh (301; 308 for anything but GET), while API calls from older CLIs are still served there. The server readsX-HNL-*headers (andX-SuperPi-*from older CLIs) and answers withX-HNL-*. The source tarball is/hnl-src.tar.gz, and the registry's playbook skill is nowhnl(hnl add hnl). - Org policy fails closed on a signed-in machine. The control plane now signs every policy bundle (Ed25519) and binds it to your device and a validity window (the org's stale tolerance, 24 hours by default). Every tool call at the hooks and every model call at the gateway verifies the signature, the device and the expiry; a policy that is missing, edited, copied from another device, expired, or from a suspended organization now blocks every tool and model call with how to recover (
hnl cloud status,hnl gateway service restart) instead of letting calls through. Your ownhnl cloud|gateway|daemon …commands still run. A hook check that crashes or times out also blocks the call when you're signed in. Not being signed in still means no org policy. The control plane must serve signed bundles (deploy the Worker withPOLICY_SIGNING_KEYfirst); caches written by earlier versions are unsigned and are refetched.
Added
- History knows which project each prompt and session belongs to. Every synced prompt and transcript now carries a workspace: the git repository it was typed in (any subfolder, worktree or machine of the same repository counts as one; the repository is named by its origin remote, with any user name, password or token in the remote address dropped before anything is sent), the repository folder when it has no remote, or the folder itself outside git. The CLI reads
.gitand the repository config from disk, so nogitcommand runs per prompt. Codex prompts, which used to arrive without a folder, now take it from their session's rollout. The API lists workspaces (GET /v1/history/workspaces: prompts, sessions, devices, harnesses and last activity for each), filters prompt search and the transcript list to one workspace (workspace=), and returns the harness and workspace of a session. Prompts and transcripts synced before this update are grouped by the folder they were typed in until the updated CLI syncs something from that folder on the same machine; from then on they join that repository's workspace. - The command is
hnl: help, hints, errors and shell completions sayhnl, and harness configs, hooks and the background service runhnl. - The Owner console can suspend and unsuspend a whole organisation. While it is suspended, its members see a "This organization is suspended" screen for that organisation (they can still switch to their other organisations, change theme or delete their account), and its machines stop: sync, uploads and every other API call are refused with
org_suspended,GET /v1/mestill answers and says why, and the signed policy bundle turns deny-all, so every harness HarnessLink enforces in and the local gateway refuse tool, command and model use until the organisation is unsuspended. Nothing is deleted. - The Owner console can also unlink any device (its tokens are revoked), change a member's role in any organisation, and read and edit any organisation's policy. Editing a locked policy item needs an explicit override and a written reason, and the change is recorded both in the organisation's policy history and in the owner audit trail. The owner audit log now also shows every organisation's policy changes and the tamper and enforcement reports machines send, filterable by organisation, user, action, source and date.
- Team owners and admins can change a member's role and remove a member (
PUT /v1/org/members/:id/role,DELETE /v1/org/members/:id). Admins move people between member and admin; only an owner can make or change an owner, and an organisation always keeps at least one owner. Removing a member signs them out of that organisation and unlinks their devices there. Owners and admins can also list every member's devices (host, platform, last seen, harnesses:GET /v1/org/devices) and each member's model spend and tokens this month (GET /v1/org/spend). Role changes and removals are in the team audit log. - Org policy is enforced in pi and Cursor.
hnl harness context piinstalls~/.pi/agent/extensions/hnl-policy.ts(deny blocks, prompt asks you, blocked without a UI);hnl harness context cursoraddspreToolUse,beforeShellExecution,beforeMCPExecutionandbeforeReadFilehooks to~/.cursor/hooks.jsonwithfailClosed: true(deny blocks; prompt asks for shell and MCP calls).hnl cloud statusand plainhnlsay Antigravity cannot be enforced. - Policy hooks repair themselves. While your org's policy has something to enforce, the service checks every installed harness at start, every five minutes and when their config changes, and puts back a removed or altered policy hook (Claude Code and Codex
PreToolUse, the omp and pi extensions, the Cursor hooks) and HarnessLink's MCP entry where it was registered. It also puts back a deleted or replaced policy cache. Repairs, refusals and failed verifications are reported (rate-limited, never with the call's arguments) toPOST /v1/policy/eventsand appear in the org's policy audit log. - Policy items are locked. Every rule, instruction and limit is created locked; changing or deleting a locked one answers 409
policy_lockeduntil an owner or admin unlocks it (POST /v1/policies/<rules|instructions|limits>/:id/unlock,/lock). Locks, unlocks and every change are audited with who, how and why;GET /v1/policies/auditpages the audit log together with device events.PUT /v1/policies/settingssets the org'sstale_tolerance_hours(1–720). Policy writes refuse API and device tokens (403policy_write_requires_session). - The dashboard's History and Archive pages are workspace first. The list of your workspaces (repository or folder, last activity, prompt and session counts, devices and harnesses) sits beside the open workspace, and nothing is shown until you pick one: each workspace's history is kept apart. Inside a workspace, filter by text, harness, device and date, sort by newest or best match, and switch to archived prompts; every filter is in the address, so a filtered view is a link. Results are grouped by session with the matching words marked; open a session, preview it in a window, or select prompts to archive, restore or delete. A session shows its workspace, harness, devices and time range, and Back returns to the same workspace and filters. The command palette (⌘K or Ctrl+K) opens any workspace by name, clears filters and archives or restores the selection.
- The dashboard's Owner console and Team page offer the organisation suspension, member and device controls above. Owner console: the Users and Orgs lists are sortable tables with filters in the address (search, plan, and suspended or active, also
GET /v1/admin/orgs?suspended=true|false), and the command palette opens any listed organisation. An organisation's page has Overview, Members, Devices, Policy and Audit tabs: a banner while it is suspended, Suspend and Unsuspend (also "Suspend org…" in the palette), a role change per member, Revoke per device, and its policy with each item's lock state, where editing, turning off or deleting a locked item is sent as an override. Every one of these asks for a written reason. The Audit section is the platform audit log, filterable by organisation, user, source, action and date, and paged. Team page: owners and admins pick a member's role in the members table, remove a member after a confirmation that says what is revoked, open a member to see their devices and spend, and use the Devices and Spend tabs (this month's total and per member, with tokens on unpriced models counted separately); refusals such as removing the last owner say why in plain words. Plain members see the list read-only. When your active organisation is suspended, the dashboard shows that inside the usual frame and offers your other organisations to switch to. - The dashboard's Policies page is an enforcement console. Tabs (in the address) for tool and command rules, model rules, usage limits, instructions, settings, coverage and audit; each item list is a dense table with filters for kind, effect, scope, lock and status kept in the address, and the open item's editor beside it. Every item shows whether it is locked. A locked item is read-only: "Unlock to edit" asks first (saying that agents, sync and the
hnlCLI can never change policy and that the unlock is audited, with an optional reason), then the editor opens with a prominent "Lock again", suggested again right after each save. New items are locked unless you untick "Lock after creating". If someone locks an item while you edit it, the page reloads it and says your change wasn't saved. Settings sets the stale tolerance (devices that can't refresh policy within it block tool and model calls) and holds the organisation-wide on/off switch behind a typed confirmation; Coverage shows, per harness, what is enforced (Claude Code, Codex, omp, pi and Cursor; Antigravity can't be) and how policy fails closed; Audit pages admin changes and device reports (tamper repaired, call refused, policy cache invalid, with their harness), filterable. Members see the same page read-only. The command palette has New rule, New limit, Open audit and Unlock <item>.PUT /v1/policiesis now a partial update: fields you leave out keep their stored values, so turning policy off and on no longer clears the organisation instructions. - The rest of the dashboard is rebuilt on the same dense, keyboard-first look. Every page starts with the same header and its main action, registers its actions in the command palette, and shows a loading, empty, error and "no access" state (a 403 says who can change it instead of offering Retry). Overview shows its four figures in one quiet strip, sortable tables for spend by model and recent prompts, and a new "Recent workspaces" list that opens each workspace's history. Usage keeps the range, stacking and device, harness and model filters in the address, with sortable tables and a new cost breakdown under the chart. Runs, Memory and Devices show the list beside the open item (the item is in the address, so Back closes it), with filters in the address: Runs by text, harness, roster and date; Devices by text, status, platform and harness; Memory searches as you type. Agents lists your files and the team's shared files in tables with type, status and harness filters and the open file beside them; sharing asks first. Ask keeps the last question in the address (opening such a link fills the box and does not spend an ask until you press Ask), opens a source from its link, and adds "Copy answer". Settings tabs use one layout of labelled rows, with tokens, devices and linked accounts in tables;
/settings/tokens?new=1opens "Create token". Plans compares every plan in one table with the current plan marked, Setup is a compact checklist with the next command to copy, and Feedback asks for a message instead of disabling Send.
Changed
- The policy cache (
~/.hnl/agent/cloud-policy.json) holds the signed envelope as served and is written read-only; a 304 no longer extends how long it is valid. Restored MCP servers are pre-approved only by a verified policy'smcp.allow, never by a hand-edited cache. - The website, dashboard and owner console have HarnessLink's own look, dense and keyboard-first: dark first with a matching light theme, quiet greys and one indigo accent, Inter type at 13px, 28px buttons and fields, and status colours only where something has a status. Every text and control colour meets WCAG AA in both themes. The sidebar runs the full height with your organisation at the top (switch organisations there) and the last sync at the bottom; it can be resized, collapsed with Ctrl+[, and on a phone the bottom tab bar stays. The top bar shows where you are and a search box: ⌘K (Ctrl+K) opens a command palette that jumps to any page and runs the current page's actions, with your recent choices first.
gthen a letter goes to a section (g oOverview,g hHistory,g pPolicies,g uUsage,g mMemory,g dDevices,g tTeam),/searches the page, and?lists every shortcut; none of them fire while you type in a field. Notifications sit in the bottom-left corner (errors stay until you dismiss them), tooltips are reachable with the keyboard, and pages fit a phone without sideways scrolling. - The public site is rebuilt on the same look. The home page leads with the install command (Copy, with a macOS/Linux or Windows switch) beside a terminal of real
hnlcommands, then what HarnessLink does, links to every harness page and the figures measured on our machines; the 3D picture, the scrolling video and their 2.1 MB of images and video are gone. Pricing adds a table comparing every plan's limits and features, read from the same plan table the API enforces. The harness comparison marks support with a filled, half or empty dot beside Yes, Partly or No, and keeps the feature column in place while the table scrolls on a phone. Every command sample on the site has Copy, and Harnesses is in the top navigation.
Fixed
- An MCP server in HarnessLink's
mcp.jsonthat failed to start (a slowbunxdownload, a locked password manager, no network) stayed missing from every harness until the service restarted, and one that crashed repeatedly was given up on for good. The hub now keeps retrying a server until it connects, waiting longer each time up to once a minute, and a crash loop pauses reconnects for 5 minutes instead of stopping them. A server that exits right after listing its tools is now noticed and restarted too. - Windows installs create
hnl.cmd, so the command the website and guides use works on Windows.