Changelog

What we shipped, when.

Releases for Ship — the open-source delivery workspace for AI-assisted engineering. The deeper thinking behind each beat lives in Ship Log; this page is the dry timeline.

Navigator goes agentic

A subagent tool, a tighter operating-rules prompt, and a fleet of read-and-write tools — all under the same chat surface, all bounded by workspace policy.

This is the week the Navigator stopped being a chat shell with tools and started being an agent that decides which agent to be. Three PRs in one stack: a session-enrichment pass, a system prompt that names the operating rules, and a consult_specialist tool that hands a focused task off to a sub-agent with its own role prompt and the same workspace tools. Every move is still scoped by the workspace policy; the human can see who decided, why, and whether the rules held.

Alongside that, a complete rebuild of the knowledge layer — claim store, extractor cron, topic-view renderer, decay-and-revive — and a brand-new "project-first" delivery flow that walks decomposition (BA → Architect → QA → Developer) before any code is touched.

Highlights

Navigator: agentic loop in three PRs

A staged rewrite (#153#154#155) that lifted the chat from "tools called from a prompt" to a proper agentic loop. PR1 enriched the session context with the open ticket, project, recent inbox items, and tracker state — so the model isn't operating blind. PR2 rewrote the system prompt around explicit operating rules ("you have these tools, you can refuse, you must explain"). PR3 added consult_specialist — Navigator can now hand a focused task to an isolated sub-agent (BA, Architect, Developer, etc.) with the right role prompt and the same workspace tools, without inheriting Navigator's context.

A leaner, sharper toolbox

Four redundant tools were retired (#157) and KB search got consolidated (#158) so the model isn't picking between three near-equivalents. Then six new tools landed in two PRs: read-only (#160) — get_ticket, get_dashboard, workspace_audit_search — and mutating (#161) — update_ticket, set_priority_state, start_decomposition. Each mutating tool is verify-before-mutate; nothing changes until the human says yes (unless the user gave an explicit command).

Project-first delivery

A four-PR sequence (#142, #143, #145, #147) replaced "an agent picks a ticket and writes code" with "an agent shapes a project, hands it off to specialists, then writes code". create_project lands an anchor on the dashboard in Drafts. Navigator helps shape it. start_decomposition walks the BA → Architect → QA → Developer chain through the planning anchor; only when stage:planning_done lands does the Drafts row flip Active and the autonomous picker takes over.

Knowledge layer, end-to-end

A six-phase build of the claim graph: claim store + extractor (#144), reconciliation engine (#146), topic-view renderer (#149), read API (#150), decay + auto-revive (#151), batch extractor with the Anthropic preamble fix (#152). The console stopped reading legacy buckets, started reading topic views (#163), got a real topic detail page (#164), and finally an editorial layout for the index (#165).

Agent runs: picker hardening

Eight PRs that turn the autonomous picker from a "tries hard, sometimes runs the wrong thing" worker into a deterministic, contention-safe one. Orphan tickets get rejected (#169). The picker only runs on projects whose priority state is Active (#184). Parent project bodies inject into the SDLC startup context (#186). Overlay-frozen tickets — ones in clarification or blocked — are filtered out (#187). Drafts flip to Parked at planning_done (#188). A pick-race becomes impossible thanks to advisory transactional locks (#189). Linear-native projects auto-onboard onto the dashboard (#190).

Repo symbols on demand

A new tree-sitter parser (#174) — when a specialist needs to know the shape of a file (functions, classes, exports), it calls repo_symbols and gets a structured map without re-walking the repo on every turn. Cuts startup latency for code-touching agents in half.

Improvements

  • processes: decomposition is now a first-class peer process, not an embedded sub-flow (#167)
  • priorities: child ticket states sync with the parent project state in Linear (#181); new projects default to planning (#172)
  • agent_roles: Navigator system prompt no longer references retired tools (#178)
  • landing: refreshed dogfood numbers — 30 days, 608 commits, claim-graph live (#183)
  • docs: agent-launch pre-flight smoke runbook (#179)
  • notion: walker soft-skips child_database blocks with no accessible data sources (#159)

Fixes

  • linear: intake's empty-label exclusion fired incorrectly on labelled-but-empty issues (#180)
  • knowledge: ingestion sync survives long-running connector walks (#168)
  • reconciler: real pgvector embeddings round-trip correctly through numpy + binary codec (#162)
  • fix: default Anthropic Haiku model id bumped to the post-preview stable (#156)
  • hotfix: prioritizer handoff hooks hoisted above empty-state returns (#148)

A process editor that's actually editable, and a dashboard that doesn't lie

Process map went from a React-Flow demo to a CSS-grid swim-lane editor with state, drag-drop, and a publish gate. Dashboard prioritizer learned the difference between active, planning, and parked. The console stopped agreeing with itself when reality disagreed.

The week of polish before the agentic push. Most of the work was in the console: a real process editor (drag-drop, swim-lanes, validation, publish blocking), a dashboard prioritizer that surfaces state buckets and Linear OAuth diagnostics, and a long list of small "actually shipping is what gets you to the next thing" cleanups. The methodology layer got harder boundaries — what's a routine, what's a specialist, where does configuration live — so the upcoming Navigator work could lean on stable footing.

Highlights

Process editor: no more React Flow

The visual canvas got rebuilt on CSS Grid + SVG arrows. Two reasons: 86 KB of First-Load JS gone, and swim-lane layouts that actually correspond to the seven canonical states (Backlog → Planning → Executing → Reviewing → Awaiting input → Blocked → Closed). Flow canvas is now the projection table's UI; Tracker tab was retired because there was nothing in it that didn't already live under the canvas.

Drag-and-drop reorder inside columns landed in process: H1; the SVG arrows that were doing nothing useful were dropped. Inline + add stage button on lane-header hover (H2). Visual distinction for specialists vs routines on the Capacity calendar (H3).

Process editor: the validation gate

A configuration with no tracker, no orchestrator, or no default-agent profile is not a publishable process. The editor blocks Publish on hard errors and surfaces warnings instead of silently shipping a broken state machine. Hard-stop gating on missing tracker / orchestrator / default agent.

process: state field on YAML stages closed the swim-lane bug forever — every stage now declares which canonical state it lives in, so the projection can never put a stage in the wrong column.

Dashboard prioritizer

Three buckets — active, planning, parked — visible on the dashboard, each with its own meaning (#139). Drag a row between buckets and it actually moves; completed Linear projects stop showing up on the active list (#138). Linear OAuth scopes surface in the empty-state error, not an opaque "list_projects failed" (#137). PAT-vs-OAuth tokens get auto-detected with response bodies surfaced for diagnosis (#135). Blind team-resolution probe gone from list_projects (#136).

Wizard: drift surface + workspace defaults gate

The install wizard learned to detect drift between the seed bundle and what's actually in the workspace, and shows it next to the Linear OAuth-only connection list. A workspace-defaults gate (tracker / agent / orchestrator) means brand-new workspaces can't accidentally publish without naming what's connected.

The seed bundle itself shipped at #80 — the wizard-default install bundle that brand-new workspaces get as a starting point.

Improvements

  • process: editor body streams so the shell paints instantly
  • process: Capacity calendar shows the real cron grid; empty by default
  • process: tracker mapping bakes into the adapter — no more "15 unmapped" on first attach
  • process: 3-level model (process : stage : state) — canonical lifecycle bucketing across every stage
  • process: transition.trigger_actor — user / agent / either
  • process: workspace map → CSS card grid (drop React Flow from overview)
  • process: editor canvas → CSS Grid swim-lanes (drop React Flow)
  • process: count Ship GitHub App as a ready orchestrator
  • process: chrome cleanup — page title is the process, banners are pills
  • process: canonical six routines — fixed in seed, FE, and elship config (forever)
  • wizard: ripped out stale codeowners/intel UI; rewrote confirm-step bullets
  • integrations: Linear/Notion are OAuth-only now; raw-key paths killed
  • synth: archive action — LLM can vote stale articles out of a bucket
  • nav: search_buckets surfaces article_id / article_slug
  • nav: pin tool inventory + cross-link prompt to registry
  • agent: A1 — harden prompt against hallucinated people, dates, IDs
  • secret_probe: Linear probe exercises Read-issues scope
  • chat: include_archived now surfaces dual-flip archived rows too

Fixes

  • inbox: row actions go through form route handlers (fix client/server-only split)
  • chat: post-end scroll-down jolt is gone
  • chat: real conversation title; no more blink/jerk
  • process: editor is repo-backed; reseed CI secrets repaired
  • settings: any one endpoint hiccup no longer collapses the whole shell

Console comes online — process editor, knowledge wizard, native trackers

The first week the methodology had a real surface. Process editor with FSM config, knowledge import wizard, native Linear / Notion / GitLab / Azure / Jira / Confluence integrations. The CLI stopped being the only entry point.

For three weeks Ship had been a CLI sitting on top of a methodology stack that lived in YAML. This was the week the operator UI showed up — a Next.js console with a process editor, a knowledge import wizard, a workspace ops dashboard, and direct OAuth-or-PAT integrations to the trackers and code hosts the methodology assumes. Everything still runs from shipctl for engineers; the console is what a product owner opens.

The PR-flow only started landing late this week, so most of these are direct main commits — proper PR-numbered entries start in the next release.

Highlights

Process editor: agent profiles, role catalog, transitions

The process editor surface picked up nine distinct features this week. State editor with role selector. Transition editing scoped to the selected state. Editable state keys. Specialist prompt and exit contracts on the role. Agent-profile selector per state. Specialist role catalog. Validation on the process schema. Persisted FSM config edits. Persisted canvas layout. By Friday the process map was a real editable thing rather than a read-only diagram.

Knowledge import wizard

Two PRs added a guided knowledge-import flow to the console — pick a source, scope it, run it, see what came back. The Distiller (the LLM-backed ingest classifier) now has a button instead of just a CLI invocation.

Procedural patterns started seeding into the catalog as knowledge — the codified versions of the methodology, queryable from the agent.

Native integrations

Linear, Notion, GitHub, GitLab, Azure DevOps, Jira, Confluence — all six trackers and code hosts the methodology assumes got native install flows this week, with native credential paths instead of "paste this token here". Notion learned to create tickets through data sources. Linear got native credentials. GitLab and Azure DevOps connect via PAT flows for now (OAuth coming).

Console basics

add ops dashboard. add process view. add app shell. The console moved from "scaffolding next to the CLI" to "the place a workspace operator lives".

Improvements

  • process: streamline editor canvas
  • process: reshape process canvas; make process map visible
  • process: add layout editor; persist canvas layout
  • process: make editor repo-backed
  • process: align review owner role id
  • process: clean up config proposal flow; trim editor cleanup leftovers
  • process: add draft change controls
  • process: use inbox-created timestamp
  • console: make app shell full-width; clean app shell lint
  • console: show connected tracker cards
  • integrations: refresh native provider health
  • integrations: use native Linear credentials
  • integrations: add Jira and Confluence adapters
  • integrations: connect GitLab PAT
  • integrations: connect Azure DevOps PAT
  • integrations: add native provider installs
  • integrations: expand native setup flows
  • integrations: disable native providers (kill switch)
  • cli: validate process schema fields
  • cli: prefer workspace API base for Ship actions
  • workflows: isolate Ship repo env for scheduled lanes
  • catalog: seed procedural patterns as knowledge
  • ship: install wizard-default bundle; release 0.12.0

Fixes

  • process: validate agent profile config; validate process schema fields
  • process: commit canvas layout on drag end
  • notion: create tickets through data sources
  • integrations: handle Notion OAuth persistence; allow Jira tracker refs
  • console: use OAuth for Notion integrations

Ship cut out of elmundi

Day zero. The methodology lived inside a host product for six months. We extracted it into its own repo, gave it a license, a CLI, a landing site, and a deploy. Twenty commits to get there.

Ship didn't begin as a greenfield repo. It began as a folder inside a product called elmundi where coding agents had been running against a real codebase for months. The methodology worked. The fact that it lived inside someone else's app didn't.

This is the entry for the first thirteen days — the period before the PR-flow started — read off the actual git log. It's not a long entry because the work was foundational rather than user-facing: a repo, a license, a CLI, a deploy, and a landing app where there hadn't been anything before. There's a longer telling on the Ship Log.

Highlights

The extraction

The first commit on the new repo says it plainly: Initial import: Ship framework (extracted from elmundi). A single commit that carried over the manual, the prompts, the Node runtime, and the scripts — with paths rewritten, ElMundi-specific examples gone, and a LICENSE file where there hadn't been one before.

shipctl v0.9 — protocol before product

Eleven days after the extraction, on a Sunday, shipctl v0.9 landed: artifacts protocol, stack adapters, pharma pilot e2e. The CLI shipped before the cloud product because the contract between client and server is what makes Ship plural. Without that contract, every adopter would fork the runtime; with it, every adopter speaks to the same protocol.

Landing app + retire MkDocs

MkDocs was the original docs runtime. This week it got retired in favour of a Next.js landing app under landing/ — same content, different runtime, with a downloadable book PDF and a real /docs viewer. The docs MCP server experiment got removed (kept the lesson, dropped the code).

RFC-0005 — artifacts as frontmatter

The first piece of public RFC-driven cleanup. Two waves: 61 artifacts moved to a v2 folder layout (Wave 1), then the legacy manifests got dropped and the filesystem became the single source of truth (Wave 2). Fewer concepts, fewer places where the same artifact was described, one less footgun. The longer telling lives at /blog/artifacts-are-frontmatter-now.

Bunny Magic Containers deploy

CI got a real deploy target. Bunny Magic Containers, EU region, with auto-provisioned app + DNS summary. Several follow-up fixes through the week to nail down the create/PATCH flow and make it idempotent.

Improvements

  • cli: ship search + resource commands; docs-only fetch / feedback
  • cli: ship-agent multi-tracker adapters + docs
  • cli: published as @elmundi/ship-cli under npm org elmundi
  • landing: downloadable book.pdf + Download CTA on /book
  • docs: book — Prologue, Manifesto, 9 lettered sub-chapters, 8 field notes
  • docs: Ukrainian Part II — Prompts & workflows
  • docs: expand framework chapters; add adopt-ship.sh launcher
  • prompts: translate cloud-prompts and templates to English
  • bunny: deploy Magic Containers with sha-* image tag, not latest
  • bunny: PATCH with Hub-fetched digest + imagePullPolicy: always

Fixes

  • bunny: honor BUNNY_APP_ID over name lookup; clarify env vars in README
  • bunny: strip MC create payload to OpenAPI-allowed fields
  • bunny: safer MC create payload (name, regions, sticky cleanup, 500 retry)
  • bunny: create MC app without config-suggestions; region/probe fallbacks
  • docker: workspace lockfiles + dev deps for Next build
  • bunny: align container port 8080 with Magic Containers template
  • docs: include prompts/ in Docker build for MkDocs snippets
  • cloud-prompts: correct branch markdown in _base; restore EOF newlines
  • ci: PATCH Bunny with image digest; replace fire-and-forget action
  • ci: resolve Bunny MC container name; generalize Ship docs and tooling
  • ci: publish @ship/cli workspace with npm -w, not --prefix