API Endpoints
The Instar server exposes a REST API on localhost:4040 (configurable). All endpoints except /health require authentication via Authorization: Bearer TOKEN header.
Health & Status
Section titled “Health & Status”| Method | Path | Description |
|---|---|---|
| GET | /health | Health check (public, no auth). Returns version, session count, scheduler status, memory usage |
| GET | /status | Running sessions + scheduler status |
Sessions
Section titled “Sessions”| Method | Path | Description |
|---|---|---|
| GET | /sessions | List all sessions (filter by ?status=) |
| GET | /sessions/tmux | List all tmux sessions |
| GET | /sessions/:name/output | Capture session output (?lines=100) |
| POST | /sessions/:name/input | Send text to a session |
| POST | /sessions/spawn | Spawn a new session (rate limited). Body: name, prompt, model?, jobSlug? |
| DELETE | /sessions/:id | Kill a session |
| GET | /orphaned-work | Worktrees holding uncommitted work whose owning session died (the OrphanedWorkSentinel findings). 503 when the feature is dark, 200 when live |
| Method | Path | Description |
|---|---|---|
| GET | /jobs | List jobs + queue |
| POST | /jobs/:slug/trigger | Manually trigger a job |
Relationships
Section titled “Relationships”| Method | Path | Description |
|---|---|---|
| GET | /relationships | List relationships (?sort=significance|recent|name) |
| GET | /relationships/stale | Stale relationships (?days=14) |
| GET | /relationships/:id | Get single relationship |
| DELETE | /relationships/:id | Delete a relationship |
| GET | /relationships/:id/context | Get relationship context (JSON) |
Telegram
Section titled “Telegram”| Method | Path | Description |
|---|---|---|
| GET | /telegram/topics | List topic-session mappings |
| POST | /telegram/topics | Programmatic topic creation |
| POST | /telegram/reply/:topicId | Send message to a topic |
| GET | /telegram/topics/:topicId/messages | Topic message history (?limit=20) |
Evolution
Section titled “Evolution”| Method | Path | Description |
|---|---|---|
| GET | /evolution | Full evolution dashboard |
| GET | /evolution/proposals | List proposals (?status=, ?type=) |
| POST | /evolution/proposals | Create a proposal |
| PATCH | /evolution/proposals/:id | Update proposal status |
| GET | /evolution/learnings | List learnings (?applied=, ?category=) |
| POST | /evolution/learnings | Record a learning |
| PATCH | /evolution/learnings/:id/apply | Mark learning applied |
| GET | /evolution/gaps | List capability gaps |
| POST | /evolution/gaps | Report a gap |
| PATCH | /evolution/gaps/:id/address | Mark gap addressed |
| GET | /evolution/actions | List action items |
| POST | /evolution/actions | Create an action item |
| GET | /evolution/actions/overdue | List overdue actions |
| PATCH | /evolution/actions/:id | Update action status |
Memory & Search
Section titled “Memory & Search”| Method | Path | Description |
|---|---|---|
| GET | /memory/search?q= | Full-text search across agent knowledge |
| POST | /memory/reindex | Rebuild the search index |
| GET | /memory/status | Index stats |
| GET | /topic/search?q= | Search across topic conversations |
| GET | /topic/context/:topicId | Topic context (summary + recent messages) |
| GET | /topic/summary | List all topic summaries |
| POST | /topic/summarize | Trigger summary regeneration |
Intent & Coherence
Section titled “Intent & Coherence”| Method | Path | Description |
|---|---|---|
| GET | /intent/journal | Query the decision journal |
| POST | /intent/journal | Record a decision |
| GET | /intent/drift | Detect behavioral drift |
| GET | /intent/alignment | Alignment score |
| GET | /project-map | Auto-generated project territory map |
| POST | /coherence/check | Pre-action coherence verification |
EXO 3.0 Governance
Section titled “EXO 3.0 Governance”The endpoints behind the EXO 3.0 Alignment capabilities. See the Meridian and Ironwood case studies for the controlled proof.
| Method | Path | Description |
|---|---|---|
| POST | /intent/org/test-action | Run the refusal + endorsement tests on a proposed action against the org intent |
| POST | /intent/tradeoff-resolve | Resolve a value tradeoff via the org’s tradeoff hierarchy |
| GET | /passport | The agent’s digital passport (identity, trust level, forbidden actions) |
| POST | /passport/verify | Verify a peer’s proposed action against its passport |
| POST | /agent-readiness/score | Score a task or workflow on its coordination-vs-judgment ratio |
| GET | /metrics/learning-velocity | Learning-velocity metric (the EXO 3.0 KPI inversion) |
Updates & Dispatches
Section titled “Updates & Dispatches”| Method | Path | Description |
|---|---|---|
| GET | /updates | Check for updates |
| GET | /updates/last | Last update check result |
| GET | /updates/auto | AutoUpdater status |
| GET | /dispatches/auto | AutoDispatcher status |
Self-Healing
Section titled “Self-Healing”| Method | Path | Description |
|---|---|---|
| GET | /triage/status | Stall triage nurse status |
| GET | /triage/history | Recovery attempt history |
| POST | /triage/trigger | Manually trigger triage |
Infrastructure
Section titled “Infrastructure”| Method | Path | Description |
|---|---|---|
| GET | /capabilities | Feature guide and metadata |
| GET | /events | Query events (?limit=50&since=24&type=) |
| GET | /quota | Quota usage + recommendation |
| GET | /agents | List all agents on this machine |
| GET | /tunnel/status | Cloudflare tunnel status |
| POST | /tunnel/start | Start a tunnel |
| POST | /tunnel/stop | Stop the tunnel |
| GET | /messages/inbox | Inter-agent inbox |
| GET | /messages/outbox | Inter-agent outbox |
| GET | /messages/dead-letter | Dead letter queue |
Threadline (MCP Tools)
Section titled “Threadline (MCP Tools)”These tools are registered as an MCP server and called by Claude Code (or any MCP client) via stdio transport. They are registered automatically on server boot.
| Tool | Description |
|---|---|
threadline_discover | Find Threadline-capable agents. Scope: local (same machine) or network (known remotes). Optional capability filter |
threadline_send | Send a message to an agent. Creates or resumes a persistent thread. Optional waitForReply (default true, 120s timeout) |
threadline_history | Retrieve conversation history from a thread. Supports pagination via limit and before timestamp |
threadline_agents | List known agents with status, capabilities, framework, trust level, and active thread count |
threadline_delete | Delete a thread permanently. Requires confirm: true |
Threadline REST Endpoints
Section titled “Threadline REST Endpoints”| Method | Path | Description |
|---|---|---|
| GET | /messages/inbox | Inter-agent inbox |
| GET | /messages/outbox | Inter-agent outbox |
| GET | /messages/dead-letter | Dead letter queue |
| POST | /messages/send | Send a message (used internally by MCP tools) |
Serendipity Protocol
Section titled “Serendipity Protocol”| Method | Path | Description |
|---|---|---|
| GET | /serendipity/stats | Pending, processed, and invalid finding counts with details |
| GET | /serendipity/findings | List all pending findings (full JSON) |
Backup
Section titled “Backup”| Method | Path | Description |
|---|---|---|
| POST | /backup | Create a backup snapshot |
| GET | /backup | List available backups |
| POST | /backup/restore | Restore from a snapshot |
MoltBridge (Trust Network)
Section titled “MoltBridge (Trust Network)”Requires MoltBridge to be enabled in config: { "moltbridge": { "enabled": true, "apiUrl": "..." } }
| Method | Path | Description |
|---|---|---|
| POST | /moltbridge/register | Register agent with MoltBridge network. Body: capabilities[], displayName? |
| POST | /moltbridge/discover | Capability-based agent discovery. Body: capability (required), limit? |
| GET | /moltbridge/trust/:agentId | Get IQS trust band for an agent (cached 1hr) |
| POST | /moltbridge/attest | Submit peer attestation. Body: subject, capability, outcome, confidence?, context? |
| GET | /moltbridge/status | Registration status and wallet balance |
Rich Agent Profiles
Section titled “Rich Agent Profiles”Rich profiles let agents present meaningful, differentiated identities — not just capability tags. Profiles are auto-compiled from the agent’s own data (AGENT.md, tagged memory, git stats) with a mandatory human review gate before publication.
| Method | Path | Description |
|---|---|---|
| POST | /moltbridge/profile | Publish a rich profile directly. Body: narrative (required), specializations[], trackRecord[], roleContext, collaborationStyle, differentiation, fieldVisibility |
| GET | /moltbridge/profile | Get the agent’s full profile from MoltBridge |
| GET | /moltbridge/profile/summary | Get the public-facing discovery card |
| POST | /moltbridge/profile/compile | Trigger profile compilation from agent data (AGENT.md, tagged MEMORY.md, git stats). Returns a draft pending approval |
| POST | /moltbridge/profile/approve | Approve a pending draft and publish to MoltBridge |
| GET | /moltbridge/profile/draft | View the current compilation draft (if any) |
Profile compilation pipeline:
- Rule-based extraction from AGENT.md,
#profile-safetagged MEMORY.md entries, git stats, job names, and capabilities - Optional LLM narrative synthesis (Haiku-class) from extracted signals
- Content-hash freshness tracking (max 1 recompilation per 24 hours)
- Human review gate — drafts must be approved before first publication
Security: USER.md is never read (contains human PII). Only #profile-safe tagged memory entries are included. All track record entries are marked first_party until independently attested by other agents.
Feedback
Section titled “Feedback”| Method | Path | Description |
|---|---|---|
| POST | /feedback | Submit feedback |
| GET | /feedback | List feedback |
| POST | /feedback/retry | Retry un-forwarded feedback |
Full route inventory
Section titled “Full route inventory”The sections above describe the most commonly-used endpoints with curl examples and parameter notes. The full registered route surface is much larger — 460 routes across roughly 80 prefixes. This inventory lists every route by category so you can find the right endpoint when you need it. For curl examples on routes not detailed above, the route name is usually enough to guess the shape — GET /resource lists, GET /resource/:id reads, POST /resource creates, PATCH /resource/:id updates, DELETE /resource/:id removes.
/.well-known
Section titled “/.well-known”GET /.well-known/instar.json
/agents
Section titled “/agents”GET /agentsPOST /agents/:name/restart
/approvals
Section titled “/approvals”Approval-as-Data (spec Part B / Phase 2): every operator approval recorded as durable, signed data — approved-as-is vs approved-with-change (with the why of each divergence) vs rejected — and the per-class agreement ratios computed from it. Tracks approvals wherever they occur (spec sign-off, chat, other). Read-only with respect to behavior; the ratio is a signal, never a gate.
POST /approvals— record an operator decision (mode + divergences MUST be operator-sourced; inconsistent rows 400)GET /approvals— list recorded decisions (?limit/?decisionClass/?surface)GET /approvals/summary— per-class{ total, approvedAsIs, ratio, streak, autoApprovalEligible, divergenceCounts }+ abySurfacebreakdown
/apprenticeship
Section titled “/apprenticeship”GET /apprenticeship/instancesGET /apprenticeship/instances/:idPOST /apprenticeship/instancesPOST /apprenticeship/instances/:id/transitionPOST /apprenticeship/instances/:id/can-startPOST /apprenticeship/instances/:id/can-complete
/attention
Section titled “/attention”DELETE /attention/:idGET /attentionGET /attention/:idPATCH /attention/:idPOST /attentionPOST /attention/:id/remote-ack— durable operator-bound ack for a pooled attention item owned by ANOTHER machine (WS4.1 follow-up). Delivers immediately when the owner is reachable, else persists the intent (bound to the authenticated operator) and re-delivers when the owner returns; the owner revalidates at apply time and rejects a stale resolve against a since-escalated HIGH/URGENT item. Ships dark behindmultiMachine.seamlessness.ws41DurableAck.GET /attention/_remote-ack/pending— list still-pending durable remote-acks (observability).POST /attention/_remote-ack/drain— manually drain pending durable remote-acks to their owning machines.
/autonomous
Section titled “/autonomous”POST /autonomous/register— server-side start snapshot for an autonomous run (scope-accretion R30): the server mints the runId, snapshots thescopeAccretionconfig + sweep base-root start-SHAs, and clampsendAttonow + maxDurationMs. One registration per active run (409 while the existing record is active).POST /autonomous/:topic/run-end— every exit surface reports here (scope-accretion R44): runs the non-blocking advisory sweep and enumerates any unbuilt accreted work loudly; marks the run record ended.POST /autonomous/:topic/ratify-deferral— dashboard-PIN-gated operator ratification of deferred accreted artifacts ({"artifacts": [...]}or{"all": true}; the response echoes exactly what was ratified).POST /autonomous/:topic/scope-accretion-override— dashboard-PIN-gated live mid-run lever ({"enabled": false, "reason": "…"}): overrides the registration-time snapshot for the running session; audited.
/autonomy
Section titled “/autonomy”GET /autonomyGET /autonomy/elevationGET /autonomy/elevation/acceptanceGET /autonomy/elevation/opportunitiesGET /autonomy/evolutionGET /autonomy/evolution/notificationsGET /autonomy/historyGET /autonomy/summaryPATCH /autonomy/notificationsPOST /autonomy/elevation/dismissPOST /autonomy/elevation/dismiss-rubber-stampPOST /autonomy/elevation/recordPOST /autonomy/evolution/evaluatePOST /autonomy/evolution/notifications/drainPOST /autonomy/evolution/revertPOST /autonomy/evolution/sidecarPOST /autonomy/evolution/sidecar/applyPOST /autonomy/profile
/backups
Section titled “/backups”GET /backupsPOST /backupsPOST /backups/:id/restore
/build
Section titled “/build”POST /build/heartbeat
/capabilities
Section titled “/capabilities”GET /capabilities
/capability-map
Section titled “/capability-map”GET /capability-mapGET /capability-map/:domainGET /capability-map/driftPOST /capability-map/refresh
GET /ci
/coherence
Section titled “/coherence”GET /coherence/healthGET /coherence/proposalsPOST /coherence/checkPOST /coherence/proposalsPOST /coherence/proposals/:id/approvePOST /coherence/proposals/:id/rejectPOST /coherence/reflect
/commitments
Section titled “/commitments”GET /commitmentsGET /commitments/:idGET /commitments/active-contextGET /commitments/contextPATCH /commitments/:idPOST /commitmentsPOST /commitments/:id/deliverPOST /commitments/:id/resumePOST /commitments/:id/withdrawPOST /commitments/verify
/config
Section titled “/config”PATCH /configPOST /config/telemetry
/cutover-readiness
Section titled “/cutover-readiness”Cutover-READINESS (coordination-mandate spec §7 G2.4, decision 1A): everything UP TO the cutover door, never the door. The two objective conditions resolve from REAL durable state — the persisted import IntegrityReport and the durable zero-divergence parity window (with a readiness-layer freshness bound). The flip itself is the operator’s manual click; there is no fire-cutover route by design.
GET /cutover-readiness—{ ready, door: "manual-operator-click", integrity, parity, importDryRun }(read-only)POST /cutover-readiness/parity-pass— trigger a server-side live parity check; the request contributes nothing to the result; a failed check records nothingPOST /cutover-readiness/import-dryrun— trigger a server-side import REHEARSAL (live source fetch → AS-IS import into an in-memory target → integrity gate over what the target reads back); zero durable data writes; persists to a separate dry-run report and never greens the canonical integrity conditionGET /cutover-readiness/import-dryrun— the last rehearsal’s verdict (read-only, informational — not areadyinput)
/context
Section titled “/context”GET /contextGET /context/:segmentIdGET /context/active-jobGET /context/dispatchGET /context/working-memory
/decision-quality
Section titled “/decision-quality”GET /decision-qualityPOST /decision-quality/grade-pass
/benchmark-divergence
Section titled “/benchmark-divergence”GET /benchmark-divergencePOST /benchmark-divergence/analyzeGET /benchmark-divergence/rollup-aggregates
/delivery-queue
Section titled “/delivery-queue”GET /delivery-queue
/dispatches
Section titled “/dispatches”GET /dispatchesGET /dispatches/appliedGET /dispatches/autoGET /dispatches/contextGET /dispatches/pendingGET /dispatches/pending-approvalGET /dispatches/statsPOST /dispatches/:id/applyPOST /dispatches/:id/approvePOST /dispatches/:id/evaluatePOST /dispatches/:id/feedbackPOST /dispatches/:id/reject
/episodes
Section titled “/episodes”GET /episodes/recentGET /episodes/sessionsGET /episodes/sessions/:sessionIdGET /episodes/sessions/:sessionId/activitiesGET /episodes/statsGET /episodes/themes/:themePOST /episodes/scan
/events
Section titled “/events”GET /eventsPOST /events/delivery-failed
/evolution
Section titled “/evolution”GET /evolutionGET /evolution/actionsGET /evolution/actions/overdueGET /evolution/gapsGET /evolution/implicitGET /evolution/learningsGET /evolution/proposalsGET /evolution/tracesPATCH /evolution/actions/:idPATCH /evolution/gaps/:id/addressPATCH /evolution/learnings/:id/applyPATCH /evolution/proposals/:idPOST /evolution/actionsPOST /evolution/gapsPOST /evolution/learningsPOST /evolution/proposals
/features
Section titled “/features”DELETE /features/discovery-dataGET /featuresGET /features/:idGET /features/:id/consent-recordsGET /features/analyticsGET /features/cooldownsGET /features/digestGET /features/evaluator-statusGET /features/eventsGET /features/funnelGET /features/summaryPOST /features/:id/surfacePOST /features/:id/transitionPOST /features/evaluate-context
/feedback
Section titled “/feedback”GET /feedbackPOST /feedbackPOST /feedback/retry
/flows
Section titled “/flows”GET /flows/:flowIdGET /flows/waitingPOST /flowsPOST /flows/:flowId/cancel-flowPOST /flows/:flowId/cancel-requestPOST /flows/:flowId/failPOST /flows/:flowId/finishPOST /flows/:flowId/mark-lostPOST /flows/:flowId/pingPOST /flows/:flowId/resumePOST /flows/:flowId/start-stepPOST /flows/:flowId/wait
GET /git/logGET /git/statusPOST /git/commitPOST /git/pullPOST /git/push
/health
Section titled “/health”GET /healthGET /health/coherenceGET /health/degradationsGET /health/probesPOST /health/coherence/checkPOST /health/degradations/mark-reported
/homeostasis
Section titled “/homeostasis”GET /homeostasis/checkPOST /homeostasis/commitPOST /homeostasis/pausePOST /homeostasis/resetPUT /homeostasis/thresholds
/hooks
Section titled “/hooks”GET /hooks/events/:sessionIdGET /hooks/events/:sessionId/summaryGET /hooks/instructions/:sessionIdGET /hooks/plan-prompt/statusGET /hooks/sessionsGET /hooks/subagents/:sessionIdGET /hooks/worktreesGET /hooks/worktrees/last-reportPOST /hooks/eventsPOST /hooks/plan-promptPOST /hooks/plan-prompt/resolve
/identity
Section titled “/identity”GET /identityGET /identity/soulGET /identity/soul/driftGET /identity/soul/integrityGET /identity/soul/pendingPATCH /identity/soulPOST /identity/soul/pending/:id/approvePOST /identity/soul/pending/:id/reject
/imessage
Section titled “/imessage”GET /imessage/chatsGET /imessage/chats/:chatId/historyGET /imessage/log-statsGET /imessage/searchGET /imessage/statusPOST /imessage/reply/:recipientPOST /imessage/validate-send/:recipient
/initiatives
Section titled “/initiatives”DELETE /initiatives/:idGET /initiativesGET /initiatives/:idGET /initiatives/digestPATCH /initiatives/:idPOST /initiativesPOST /initiatives/:id/phase/:phaseId
/intent
Section titled “/intent”GET /intent/alignmentGET /intent/driftGET /intent/journalGET /intent/journal/statsGET /intent/orgGET /intent/validatePOST /intent/journal
/internal
Section titled “/internal”GET /internal/stop-gate/annotations/:eventIdGET /internal/stop-gate/hot-pathGET /internal/stop-gate/kill-switchGET /internal/stop-gate/logPOST /internal/compaction-resumePOST /internal/prompt-recallPOST /internal/slack-forwardPOST /internal/stop-gate/annotationsPOST /internal/stop-gate/evaluatePOST /internal/stop-gate/kill-switchPOST /internal/stop-gate/modePOST /internal/stop-gate/reset-breaker— clear the authenticated authority breaker after provider repair.POST /internal/telegram-callbackPOST /internal/telegram-forward
GET /jobsGET /jobs/:slug/historyGET /jobs/categoriesGET /jobs/category-report/:categoryGET /jobs/eventsGET /jobs/historyGET /jobs/migration-statusGET /jobs/reconcilePATCH /jobs/:slugPOST /jobs/:slug/reset-statePOST /jobs/:slug/runPOST /jobs/:slug/triggerPOST /jobs/migration-abandonPOST /jobs/migration-confirm
/listener
Section titled “/listener”GET /listener/healthGET /listener/metricsPOST /listener/restart
/mandate
Section titled “/mandate”Coordination Mandate (spec: coordination-mandate.md): a deny-by-default authority gate for autonomous agent-to-agent actions. The operator’s bounded, expiring, revocable mandate — issued from the dashboard behind their PIN — is the authorizer, never the agent. With no mandate issued, every evaluation denies. Every decision (allow AND deny) lands in a hash-chained, tamper-evident audit.
POST /mandate/evaluate— check an intended action{ action, params, agentFp, mandateId }→{ decision, reason }GET /mandate— list mandates (each with liveauthorshipValid)GET /mandate/:id— one mandate + verification statusGET /mandate/audit— the chained audit (chain.ok:false= tampering)POST /mandate/issue— PIN-GATED (operator only; Bearer alone is refused)POST /mandate/:id/revoke— PIN-GATED (the operator kill switch)
/memory
Section titled “/memory”GET /memory/entities/by-evidenceGET /memory/evidence/by-entity/:idGET /memory/searchGET /memory/statsPOST /memory/reindexPOST /memory/sync
/messages
Section titled “/messages”DELETE /messages/outbound/:machineId/:messageIdGET /messages/:idGET /messages/agentsGET /messages/dead-letterGET /messages/inboxGET /messages/outboundGET /messages/outboxGET /messages/route-scoreGET /messages/spawn/configGET /messages/statsGET /messages/summariesGET /messages/thread/:threadIdGET /messages/threadsPATCH /messages/spawn/configPOST /messages/ackPOST /messages/relay-agentPOST /messages/sendPOST /messages/spawn-requestPOST /messages/thread/:threadId/resolve
/messaging
Section titled “/messaging”GET /messaging/bridge
/monitoring
Section titled “/monitoring”GET /monitoring/memoryGET /monitoring/processesGET /monitoring/processes/lastGET /monitoring/telemetryPATCH /monitoring/memory/thresholdsPOST /monitoring/processes/killPOST /monitoring/processes/kill-all-external
/operations
Section titled “/operations”GET /operations/logGET /operations/permissions/:servicePOST /operations/classifyPOST /operations/evaluate
/pastes
Section titled “/pastes”DELETE /pastes/:idGET /pastesGET /pastes/:idPOST /pastes
GET /ping
GET /pool— the machine pool: router, nicknames, hardware, online status, load, quota stateGET /pool/placement— which machine owns a topic + the reason (pinned/placed/unowned) + the U4.1 verified pin state (pinState:actuated/pending/diverged/suspended-pending-owner-return,pinHeldSince,pendingReason,pinnedBy)POST /pool/transfer— deterministic topic move to a nickname/machineId (the validated planner)POST /pool/unpin— deliberately clear a topic’s placement pin; the clear replicates as a tombstone so a stale copy can never re-pin it (U4.1)GET /pool/pin-quarantine— the sticky skew-quarantine set (clock-skewed pin records excluded from pin resolution) + fold status (503 when pin replication is dark)POST /pool/pin-quarantine/readmit— the deliberate, explicit per-record re-admission of a quarantined pin record (dismissing the alert never re-admits)GET /pool/queue— durable inbound-queue counts + hold/flap state (503 while dark)GET /pool/reconciler— WS1.3 ownership reconciler status (+?topic=Nper-topic explain)GET /pool/stale-owner-release— U4.2 stale-owner release telemetry: attempts, would-claims (dry-run), refusals by reason, evidence classes, P19 give-ups, probe-breaker state, open episodes (503 when dark; see Multi-machine)GET /pool/lease-handback— U4.4 lease hand-back reconciler status: state, hysteresis window, operator-latch visibility, last episode, counters (503 when the mesh is dark)POST /pool/lease-handback/latch— write the operator-flip latch marker (the captain-flip playbook’s POST step; suppresses automated hand-back — the human always wins)DELETE /pool/lease-handback/latch— clear the latch early (PIN-gated: re-enables automation against a human decision, so the dashboard PIN is required)GET /pool/poll-cache— the shared per-peer pool-scope poll cache (WS4.4(f))GET /pool/duplicate-reconciler— ownership-gated-spawn unified status: duplicate-reconciler posture + substrate readiness, owner-dark notice episodes, spawn-admission counters, breaker state, audit-log locations (503 while dark; see Ownership-Gated Spawn)GET /pool/ownership-view?key=<topic>— THIS machine’s own ownership record for a conversation (proxy-free; the reconciler’s peer-echo verification read)GET /judgment-provenance— redacted judgment-provenance decision rows (?limit=,?sinceHours=,?scope=poolmerges peers’ redacted rows as clamped untrusted data; full context never leaves the deciding machine)
/project-map
Section titled “/project-map”GET /project-mapPOST /project-map/refresh
/projects
Section titled “/projects”DELETE /projects/:idGET /projectsGET /projects/:idGET /projects/:id/nextPOST /projectsPOST /projects/:id/abandonPOST /projects/:id/accept-partialPOST /projects/:id/ackPOST /projects/:id/advancePOST /projects/:id/claim-ownershipPOST /projects/:id/drift-checkPOST /projects/:id/haltPOST /projects/:id/resumePOST /projects/:id/run-roundPOST /projects/validate
/prompt-gate
Section titled “/prompt-gate”GET /prompt-gate/logGET /prompt-gate/statusGET /prompt-gate/topic/:topicId/overridePUT /prompt-gate/topic/:topicId/override
/providers
Section titled “/providers”GET /providers/cost-state/diffGET /providers/framework-router/routeGET /providers/routing/decide
/publish
Section titled “/publish”POST /publishPUT /publish/:path
/published
Section titled “/published”GET /published
/quota
Section titled “/quota”GET /quotaGET /quota/migrationGET /quota/pollingPOST /quota/migration/trigger
/reflection
Section titled “/reflection”GET /reflection/metricsPOST /reflection/recordPOST /reflection/session-startPUT /reflection/thresholds
/relationships
Section titled “/relationships”DELETE /relationships/:idGET /relationshipsGET /relationships/:idGET /relationships/:id/contextGET /relationships/stalePOST /relationships/import
/review
Section titled “/review”DELETE /review/historyGET /review/healthGET /review/historyGET /review/statsPOST /review/canaryPOST /review/evaluatePOST /review/test
/review-exchange
Section titled “/review-exchange”ReviewExchange (coordination-mandate spec §7 G2.3): one mutual, mandate-gated
sign-off of a review artifact between the two agents named in a mandate. Both
sign-offs run through the mandate gate’s sign-code-review authority; every
accepted signature carries the audit hash of the gate decision that authorized
it. Linear lifecycle: proposed → delivered → verdict-recorded → complete (or
changes-requested, terminal). Deny-by-default inherited: no mandate → 403.
POST /review-exchange— create{ mandateId, artifact, packageRef, packageSha256, parties:[ownerFp,peerFp] }(content-addressed)GET /review-exchange— list exchangesGET /review-exchange/:id— one exchange + signatures with audit hashesPOST /review-exchange/:id/delivered— record the Threadline delivery evidencePOST /review-exchange/:id/peer-verdict— the peer’s authenticated verdict;approveis their sign-off → mandate-gated (deny → 403)POST /review-exchange/:id/sign— the owner’s countersignature → mandate-gated; completes the exchange
/scope-coherence
Section titled “/scope-coherence”GET /scope-coherenceGET /scope-coherence/checkPOST /scope-coherence/recordPOST /scope-coherence/reset
/secrets
Section titled “/secrets”DELETE /secrets/pending/:tokenGET /secrets/drop/:tokenGET /secrets/pendingPOST /secrets/drop/:tokenPOST /secrets/requestPOST /secrets/retrieve/:token
/self-knowledge
Section titled “/self-knowledge”GET /self-knowledge/healthGET /self-knowledge/searchGET /self-knowledge/session-context— the boot self-knowledge block: vault secret NAMES (never values) + operational facts;?full=1bypasses display caps. Dark on the fleet (enabled ?? developmentAgent).GET /self-knowledge/treeGET /self-knowledge/validatePOST /self-knowledge/facts— append a durable operational fact (auto-stamped with date + machine)DELETE /self-knowledge/facts— remove a fact by{match}or{index, expect}
/semantic
Section titled “/semantic”DELETE /semantic/forget/:idGET /semantic/contextGET /semantic/explore/:idGET /semantic/exportGET /semantic/recall/:idGET /semantic/searchGET /semantic/search/hybridGET /semantic/staleGET /semantic/statsPOST /semantic/connectPOST /semantic/decayPOST /semantic/embeddings/migratePOST /semantic/export-memoryPOST /semantic/importPOST /semantic/migratePOST /semantic/migrate/canonical-statePOST /semantic/migrate/decisionsPOST /semantic/migrate/memory-mdPOST /semantic/migrate/relationshipsPOST /semantic/rebuildPOST /semantic/rememberPOST /semantic/snapshotPOST /semantic/supersedePOST /semantic/verify/:id
/sentinel
Section titled “/sentinel”GET /sentinel/statsPOST /sentinel/classify
/serendipity
Section titled “/serendipity”GET /serendipity/findingsGET /serendipity/stats
/session
Section titled “/session”GET /session/context/:topicId
/sessions
Section titled “/sessions”DELETE /sessions/:idGET /sessionsGET /sessions/:name/outputGET /sessions/tmuxPOST /sessions/:name/inputPOST /sessions/:name/remote-closePOST /sessions/cleanup-stalePOST /sessions/createPOST /sessions/refreshGET /sessions/resume-queuePOST /sessions/resume-queue/:id/cancelPOST /sessions/resume-queue/:id/requeuePOST /sessions/resume-queue/drainPOST /sessions/resume-queue/resumePOST /sessions/spawn
/shared-state
Section titled “/shared-state”GET /shared-state/chain/:idGET /shared-state/recentGET /shared-state/renderGET /shared-state/sessionsGET /shared-state/statsPOST /shared-state/appendPOST /shared-state/resolve/:idPOST /shared-state/session-bindPOST /shared-state/session-bind-confirmPOST /shared-state/session-bind-interactivePOST /shared-state/session-bind-rotatePOST /shared-state/sessions/:sid/revoke
/skip-ledger
Section titled “/skip-ledger”GET /skip-ledgerGET /skip-ledger/workloadsPOST /skip-ledger/workload
/slack
Section titled “/slack”GET /slack/channelsGET /slack/channels/:channelId/messagesGET /slack/log-statsGET /slack/searchPOST /slack/channelsPOST /slack/reply/:channelId
/state
Section titled “/state”GET /state/anti-patternsGET /state/projectsGET /state/quick-factsGET /state/summaryGET /state/syncPOST /state/anti-patternsPOST /state/heartbeatPOST /state/projectsPOST /state/quick-factsPOST /state/submit
/status
Section titled “/status”GET /status
/system-review
Section titled “/system-review”GET /system-review
/system-reviews
Section titled “/system-reviews”GET /system-reviews/historyGET /system-reviews/latestGET /system-reviews/trendPOST /system-reviews
/systems
Section titled “/systems”GET /systems/capability/:idGET /systems/status
/telegram
Section titled “/telegram”GET /telegram/log-statsGET /telegram/searchGET /telegram/topicsGET /telegram/topics/:topicId/messagesPOST /telegram/dashboard-refreshPOST /telegram/post-updatePOST /telegram/reply/:topicIdPOST /telegram/topics
/telemetry
Section titled “/telemetry”GET /telemetry/statusGET /telemetry/submissionsGET /telemetry/submissions/latestPOST /telemetry/disablePOST /telemetry/enable
/threadline
Section titled “/threadline”GET /threadline/observability/searchGET /threadline/observability/threadsGET /threadline/observability/threads/:threadIdGET /threadline/statusGET /threadline/telegram-bridge/configPATCH /threadline/telegram-bridge/configPOST /threadline/relay-discoverPOST /threadline/relay-send
/tokens
Section titled “/tokens”GET /tokens/by-projectGET /tokens/orphansGET /tokens/sessionsGET /tokens/summary
/topic
Section titled “/topic”GET /topic/context/:topicIdGET /topic/listGET /topic/searchGET /topic/statsPOST /topic/rebuildPOST /topic/summarizePOST /topic/summary
/topic-bindings
Section titled “/topic-bindings”GET /topic-bindingsPOST /topic-bindings
/topic-operator
Section titled “/topic-operator”Verified per-topic operator binding (Know Your Principal). The operator is established ONLY from the authenticated sender uid — a content name can never become the operator. See Know Your Principal.
POST /topic-operator— bind a topic operator from the AUTHENTICATED sender{ topicId, platform?, uid (required), displayName? }; a blank uid is refused400GET /topic-operator— all bound operators (names + uids)GET /topic-operator/:topicId— one topic’s verified operator (ornullwhen unbound)GET /topic-operator/session-context?topicId=N— the<topic-operator>session-start injection block ({ present:false }when unbound)
/triage
Section titled “/triage”GET /triage/historyGET /triage/statusPOST /triage/trigger
/trust
Section titled “/trust”GET /trustGET /trust/changelogGET /trust/elevationsGET /trust/summaryPOST /trust/grant
/tunnel
Section titled “/tunnel”GET /tunnel
/updates
Section titled “/updates”GET /updatesGET /updates/autoGET /updates/configGET /updates/lastGET /updates/statusPATCH /updates/configPOST /updates/applyPOST /updates/rollback
DELETE /view/:idGET /view/:idPOST /viewPOST /view/:id/unlockPUT /view/:id
/subscription-pool
Section titled “/subscription-pool”Multi-account subscription registry + per-account quota (the Subscription & Auth
Standard). The registry stores each account’s login location (its config home),
never tokens. These routes are operator/internal and ship dark — they do
nothing until accounts are enrolled, and are not surfaced in /capabilities
until the standard’s later phases (scheduler + enrollment wizard) make them
user-usable.
| Method | Path | Description |
|---|---|---|
| GET | /subscription-pool | List enrolled accounts (nickname, provider, framework, config home, status, last quota) |
| POST | /subscription-pool | Add an account. Body: id, nickname, provider, framework, configHome |
| GET | /subscription-pool/:id | Get one account |
| PATCH | /subscription-pool/:id | Update mutable fields (nickname, framework, configHome, status) |
| DELETE | /subscription-pool/:id | Remove an account |
| POST | /subscription-pool/poll | Poll every account’s live quota now (writes each account’s lastQuota) |
| GET | /subscription-pool/:id/quota | Read an account’s latest quota snapshot + measured burn rate |
| POST | /subscription-pool/swap | Resume a session on another eligible account (continuity guarantee — never dies on a quota limit). Body: sessionName, exhaustedAccountId |
| GET | /subscription-pool/proactive-swap | Pre-limit swap monitor status — thresholdPct, watchPct, maxSwapsPerCycle, cooldownMs, running, lastResult. 200 { enabled:false } when the monitor is dark. |
| POST | /subscription-pool/proactive-swap/check | Run one proactive pass now (refresh the poll if near the wall, then pre-emptively swap at-pressure sessions). The deterministic “show me it works” lever. |
| POST | /subscription-pool/enroll | Start a mobile-first new-account login. Body: id, label, provider, framework, optional kind, configHome. Returns the pending login (public code/URL + TTL — never a token). |
| GET | /subscription-pool/pending-logins | The “Pending Logins” surface — active logins awaiting approval (code/URL + TTL). |
| POST | /subscription-pool/enroll/:id/cancel | Safely abandon a pending or expired login and best-effort stop its waiting login pane. Completed/already-abandoned logins return idempotently; an in-flight completion returns 409. |
| POST | /subscription-pool/enroll/:id/complete | Mark a login completed once the operator approved + the account enrolled. |
| POST | /subscription-pool/enroll/reissue-expired | Sweep + auto-reissue every expired login with a fresh code/URL (the background tick calls the same path). |
| GET | /subscription-pool/in-use | Which pooled accounts are currently serving a live session. |
Account follow-me / account×machine matrix (WS5.2)
Section titled “Account follow-me / account×machine matrix (WS5.2)”Cross-machine account setup from the dashboard’s Subscriptions-tab grid. Dark behind multiMachine.accountFollowMe. Each machine re-mints its OWN login (no token is copied between machines).
| Method | Path | Description |
|---|---|---|
| POST | /subscription-pool/matrix/start-cell | PIN-gated orchestrator: the grid’s “Set up” tap. Issues the per-(account, targetMachine) account-follow-me mandate, then drives the enroll/start chain (self → loopback; peer → deliver the signed mandate + remote enroll). Body: accountId, machineId, pin. |
| POST | /subscription-pool/follow-me/enroll/start | Mandate-gated: re-mint the login on THIS target machine (Mechanism B). Spawns the waiting claude auth login pane + records a pending login. Body: mandateId, accountId. |
| POST | /subscription-pool/follow-me/enroll/:id/submit-code | Target-local: type the operator’s verification code into the waiting login pane, then drive to a real outcome (S7 email-gate complete → add to pool). |
| POST | /subscription-pool/follow-me/submit-code | Fronting relay for the above — the operator’s single dashboard hop; self → loopback, peer → forward. Body: machineId, id, code. |
| POST | /subscription-pool/follow-me/enroll/:id/cancel | Target-local: cancel a mis-tapped in-flight cell — abandon the pending login + tear down its login pane (raw tmux kill-session). Idempotent on a terminal record (200 alreadyTerminal); unknown/malformed id → 404; stands aside (409) while a code is mid-submit. Bearer-only. |
| POST | /subscription-pool/follow-me/cancel | Fronting relay for cancel — dispatches to self/peer by machineId (offline peer → 502). The route the dashboard Cancel button calls. Body: machineId, id. |
| POST | /subscription-pool/follow-me/enroll/:id/complete | Mark a follow-me login completed once the freshly-minted account passes the S7 email-gate. |
The quota-aware scheduler picks accounts reset-date-optimally (“use before reset”)
and guarantees a long-lived session that hits its account’s quota resumes on
another account (via claude --resume, which is account-agnostic, so the
conversation is preserved) rather than dying. There are two automatic swap
triggers, both dark by default in .instar/config.json: the reactive swap
(subscriptionPool.autoSwapOnRateLimit) fires AFTER a rate-limit escalation, and
the proactive pre-limit swap (subscriptionPool.proactiveSwap.enabled) moves a
session OFF an account BEFORE it walls, at a lag-aware measured thresholdPct
(default 80 — below the real limit because the polled reading trails real usage).
The proactive monitor resolves an UNTAGGED session’s effective account from the
default-config login, so the primary interactive session is swap-visible instead
of wedging at the wall. The /subscription-pool/swap route is the manual lever;
/subscription-pool/proactive-swap/check runs one proactive pass on demand.
These routes are backed by three core classes: SubscriptionPool (the durable
account registry — login location only, never tokens), QuotaPoller (the
background poller that measures each account’s live burn + reset windows), and
QuotaAwareScheduler (reset-date-optimal account selection + the swap continuity
guarantee). The swap itself drives SessionRefresh with an account-swap option so
the resumed session launches under the new account’s CLAUDE_CONFIG_DIR.
The enrollment routes are backed by PendingLoginStore (a durable ledger of
in-flight logins — public code/URL/TTL only, never a token), EnrollmentWizard
(start a login + auto-reissue expired codes on a background sweep), and
FrameworkLoginDriver (spawns the framework’s own login under the new account’s
CLAUDE_CONFIG_DIR and scrapes the public code/URL). Enrollment ships dark — the
routes answer 200 { enabled:false } until the wizard is wired.
Examples:
# List accounts and add one (login location only — never tokens)curl -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-poolcurl -X POST -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool \ -d '{"id":"claude-personal","nickname":"personal","provider":"anthropic","framework":"claude-code","configHome":"~/.claude-personal"}'
# Inspect, update, remove a specific accountcurl -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/claude-personalcurl -X PATCH -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/claude-personal -d '{"nickname":"personal-max"}'curl -X DELETE -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/claude-personal
# Refresh live quota for all accounts, then read one account's snapshot + burn ratecurl -X POST -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/pollcurl -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/claude-personal/quota
# Manually swap a session off a quota-exhausted account (continuity preserved)curl -X POST -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/swap \ -d '{"sessionName":"my-session","exhaustedAccountId":"claude-personal"}'
# Proactive pre-limit swap: check status, then run one pass on demandcurl -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/proactive-swapcurl -X POST -H "Authorization: Bearer $AUTH" http://localhost:4040/subscription-pool/proactive-swap/check/views
Section titled “/views”GET /views
/watchdog
Section titled “/watchdog”GET /watchdog/statusPOST /watchdog/toggle
GET /whatsapp/qrGET /whatsapp/statusPOST /whatsapp/send/:jid
/permissions
Section titled “/permissions”The Slack org permission gate (dark/observe-only by default — these routes are operator/internal, not surfaced in /capabilities until the enforce path is enabled in a later phase).
GET /permissions/decisions— recent permission-gate verdicts from the observe ledger (operator review).GET /permissions/scenario-suite— the worked-example verdict suite (deploy-allow, junior-deny, ambiguous-clarify, social-engineering-deny, compromised-CEO step-up) with expected vs actual verdicts.GET /permissions/registrations/pending— list pending self-registration requests awaiting admin approval.POST /permissions/registrations/register— admin registers a Slack user with an org role ({ slackUserId, displayName, role }).POST /permissions/registrations/approve— approve a pending registration ({ slackUserId, role }).POST /permissions/registrations/deny— deny/drop a pending registration ({ slackUserId }).
/whoami
Section titled “/whoami”GET /whoami
/work-queue
Section titled “/work-queue”The unified work-intake and prioritization registry (WorkQueue — see the Work Intake &
Prioritization Queue feature page). Development-agent gated; 503 when dark.
GET /work-queue— the current deterministic ranked list of normalized work items.POST /work-queue/rescore— recompute the ranking from live sources (pure compute, no durable writes).