Breaking Changes

  • The command is hnl and everything you see says HarnessLink. superpi, harnesslink and hlk are gone; data moves from ~/.superpi to ~/.hnl and the installed tree from ~/.superpi-src to ~/.hnl-src. Environment variables are HNL_* (SUPERPI_* and HARNESSLINK_* are no longer read), logs are ~/.hnl/logs/hnl.YYYY-MM-DD.<PID>.log, the background service is sh.hnl.daemon (macOS), hnl.service (Linux) or the hnl logon task (Windows), and the MCP entry in every harness is hnl, so its tools appear as mcp__hnl_*. The CLI sends X-HNL-* headers and User-Agent: hnl/<version>; the local gateway answers on /_hnl/*.
  • The move is automatic. The installer, hnl update, the service restart and hnl migrate (run it yourself any time; a second run does nothing) stop and replace the old background service, move ~/.superpi to ~/.hnl (when both hold data, ~/.hnl is kept and the old folder is left for you), move ~/.superpi-src, rename the MCP entry and point the context hooks at hnl in omp, Claude Code, Codex and Cursor, move the omp extension to hnl-context.ts, and remove the old superpi, harnesslink and hlk commands 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 update runs the new installer, which does the move. If you added the qmd add-on, run hnl add qmd once so qmd indexes the moved memories folder.
  • superpi.sh, superpi.app and their www. and api. 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 reads X-HNL-* headers (and X-SuperPi-* from older CLIs) and answers with X-HNL-*. The source tarball is /hnl-src.tar.gz, and the registry's playbook skill is now hnl (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 own hnl 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 with POLICY_SIGNING_KEY first); 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 .git and the repository config from disk, so no git command 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 say hnl, and harness configs, hooks and the background service run hnl.
  • 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/me still 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 pi installs ~/.pi/agent/extensions/hnl-policy.ts (deny blocks, prompt asks you, blocked without a UI); hnl harness context cursor adds preToolUse, beforeShellExecution, beforeMCPExecution and beforeReadFile hooks to ~/.cursor/hooks.json with failClosed: true (deny blocks; prompt asks for shell and MCP calls). hnl cloud status and plain hnl say 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) to POST /v1/policy/events and 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_locked until 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/audit pages the audit log together with device events. PUT /v1/policies/settings sets the org's stale_tolerance_hours (1–720). Policy writes refuse API and device tokens (403 policy_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 hnl CLI 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/policies is 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=1 opens "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's mcp.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. g then a letter goes to a section (g o Overview, g h History, g p Policies, g u Usage, g m Memory, g d Devices, g t Team), / 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 hnl commands, 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.json that failed to start (a slow bunx download, 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.

Update HarnessLink and every installed harness to its current release:

hnl update

New machine? Install with:

curl -fsSL https://harnesslink.sh/install.sh | bash

Newer: 17.5.86 · Older: 17.5.84 · All releases · Atom feed

Flag notifications