
Sextant
- Updated July 10, 2026
- love-lena/sextant
sextant is a Claude Code skill in the AI & Agent Building category. Be a first-class sextant client: bus verbs as tools, live messages as channel events, and a skill teaching the conventions.
Key points
- sextant
- AI & Agent Building
- AI-coding skill
Sextant by the numbers
- Data as of Jul 10, 2026 (Skillselion catalog sync)
/plugin marketplace add love-lena/sextant/plugin install sextant@sextantAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Last updated | July 10, 2026 |
|---|---|
| Repository | love-lena/sextant ↗ |
What it does
Be a first-class sextant client: bus verbs as tools, live messages as channel events, and a skill teaching the conventions.
README.md
sextant — the Claude Code plugin
Makes a Claude Code session a first-class sextant client (ADR-0028): the bus verbs as MCP tools under one verified identity, inbound messages pushed into the session as channel events, a skill teaching the conventions, and an auth/signing hook (ADR-0030) that stamps inbound messages with their verified author and a trust level.
The trust hook (ADR-0030)
A UserPromptSubmit hook (hooks/hooks.json → sextant-mcp attest) runs on
each woken turn. It reads new inbound messages on this session's own inbox
(msg.client.<self>) and its principal DM (the 2-party topic
msg.topic.dm.<sorted ids>, ADR-0034), stamps each by its unforgeable
bus-stamped author ULID with a trust level —
principal (operator-equivalent), verified peer (cooperate, not obey), or
unknown (untrusted data) — and delivers them as trusted, unwrapped
additionalContext, so a validated message never reaches the agent under the
harness's untrusted-channel wrapper. Trust is the ULID alone, never message
content: an operator-styled task from a non-principal ULID is a peer, never the
principal. A per-session cursor (under CLAUDE_PLUGIN_DATA, keyed on
CLAUDE_CODE_SESSION_ID) makes each message deliver once and survive --resume.
Set the bus's principal with sextant principal set <ulid> (operator-only).
The hook degrades silently (no injected context, never blocks the turn) on any
bus error and is bounded well under the hard 30s UserPromptSubmit timeout.
The Stop-nudge hook
Stop and SubagentStop hooks (hooks/hooks.json → hooks/nudge.sh) run
when any sextant agent finishes a turn. The hook injects a soft reminder as
additionalContext — it never sets "decision": "block", so the agent stops
normally after considering it. The nudge asks the agent to verify three things
before ending:
- Subscriptions — subscribed to every subject it should be following?
- Messages — posted status, decisions, and hand-off information to the bus?
- Review flags — marked artifacts and PRs that need the operator's judgment
as
review_state=review?
SubagentStop is included so spawned workers (workflow steps, agentic
subagents) get the same reminder — making this universal across the whole
crew, not just the top-level session.
The hook degrades silently (no output, exit 0) when the session has no bus
identity (a non-bus session) or when jq is unavailable. It never blocks a
turn.
Verify the hook fires:
# Simulate a Stop event with an identity file present
mkdir -p /tmp/test-nudge && touch /tmp/test-nudge/mysession.identity.json
CLAUDE_PLUGIN_DATA=/tmp/test-nudge CLAUDE_CODE_SESSION_ID=mysession \
bash clients/claude-code/hooks/nudge.sh \
<<< '{"hook_event_name":"Stop"}' | jq '.hookSpecificOutput.additionalContext'
Demo
clients/claude-code/demo.sh
Throwaway bus, two identities, a CLI peer that auto-replies, and a live session with channel push on. Follow the three printed steps; exit for the bus-side transcript.
Install
The root quickstart has the setup: binaries on
PATH, a reachable bus (sextant up), then the marketplace add + install. The
session provisions its own per-session bus identity automatically (ADR-0029) —
no agent register step. The GitHub add clones with your git credential
helper, so gh auth covers the private repo. Offline, or from an unpacked release tarball, add
this directory instead: claude plugin marketplace add ./clients/claude-code
(keep the ./ — a bare a/b parses as a GitHub repo).
Tools work everywhere. The channel push path is a Claude Code research preview behind an allowlist — start sessions with
claude --dangerously-load-development-channels plugin:sextant@sextant
Without the flag the harness drops pushed events silently; the skill's
verification step (the subscribed notice after message_subscribe) catches
that, and message_read polling is the fallback. Pin a per-project identity
with SEXTANT_CONTEXT in the project's .mcp.json env block.
Updating to a new version
Updating is two independent pieces — the binaries (Homebrew) and the plugin (skills, hooks, MCP wiring; Claude Code) — plus restarting the long-lived processes, because none of them reload in place.
- Binaries.
sextant update(wrapsbrew update && brew upgrade love-lena/sextant/sextant) installs the newsextant,sextant-mcp, andsextant-dash. Confirm withsextant version. - The bus service. A
brew servicesbus keeps running the old binary until restarted:brew services restart sextant. (Running it in the foreground withsextant up? Stop and rerun it instead.) - The plugin. Skills, hooks, and the MCP tool surface ship in the plugin,
not the formula, so the brew upgrade does not touch them. Pull the new plugin
version:
/plugin→ manage → update (orclaude plugin marketplace update sextant && claude plugin update sextant@sextant). - Active Claude Code sessions. A session spawns its
sextant-mcpat startup and keeps using that process — an upgrade does not swap a running server. Restart the session (exit and relaunchclaude --dangerously-load-development-channels plugin:sextant@sextant) so it spawns the new MCP server and loads the updated skills and trust hook. - The web dash. The
sextant-dashbinary is long-lived too: stop it (Ctrl-C) and rerun it to serve the new UI over the new binary.
Layout
.claude-plugin/plugin.json— the plugin manifest.claude-plugin/marketplace.json— lets this directory be added as a local marketplace.mcp.json— runssextant-mcp(stdio MCP server,cmd/sextant-mcp)hooks/hooks.json— theUserPromptSubmittrust hook,sextant-mcp attest; theStop/SubagentStopnudge hookhooks/nudge.sh— the Stop-nudge script (soft pre-stop reminder: subs, messages, review flags)skills/sextant/SKILL.md— conventions, topics/DMs/inboxes, verb selection, record shapes, identity setupskills/startup/SKILL.md— unattended-worker startup: connect, subscribe to the principal DM, handle inbound by trust levelskills/live-verify-v053/—/live-verify-v053: prove the v0.5.3 runtimes are operational on the live setup (SKILL.md +verify.sh)