bb stelow sync-scopes/lock/config wrappers. Same workspace/card resolution as advance/doctor; lock preserves helper exit codes (1 = conflict). Advancing into execution auto-syncs scopes best-effort, so the vendored Step 2e works without a scripts/stelow binary in the workspace.
Worker prompt equivalents. Spawn/reseed prompts point at the bb stelow wrappers wherever vendored skills show scripts/stelow commands (single shared sentence).
Vendored content sync. Single-source cli-tools, visual_review.md canonical gate doc, R4 skill splits, fence fixes, link-integrity repairs — all propagated from upstream with zero sync errors.
Upstream delegation for advance mechanics.data/stelow is now a synced copy of upstream scripts/stelow (mode-skips, gate refusals and non-git roots ported there first); the transitions mirror and its fallbacks retire in favor of the vendored copy. New bb stelow doctor passthrough; workflow contract tests pin template, board order and transitions to the same 17 stages.
Round files on research cards. Every strategy round persists its native playbook output verbatim (one file per round, one per sub-step when a playbook fans out) and registers each in the manifest; the card lists rounds newest-first with run status plus unregistered state-dir files. brief.md stays the fan-out aggregator; history carries timestamps.
Board/List on both boards. Research gains the list view; the switch is now a quiet shared icon toggle beside the filters (a view preference, not a CTA) instead of a boxed segment next to the action buttons. The redundant Research empty-state hero is gone — first-run guidance lives in the tour.
Direct preset access. Build and Research headers gain a Presets button opening the preset manager without starting anything; agent configuration in both creation dialogs is now its own block instead of inline text.
Floating mobile sheets. Compact dialogs render as floating cards with backdrop margins on every side, not edge-to-edge panels.
Visual strategy picker. Choosing a research strategy is now emoji radio-cards (name + one-line summary) with instant search over label, summary, and keywords — shared by the creation modal and "Explore another strategy" (which badges already-ran playbooks). No preselected default: Start stays disabled until an explicit pick.
Fixed
Waiting on a question never moves the card. Opening a structured question stored the wait in status (awaiting-answer), which normalized to pending — a Doing research card fell back to To-Do while the question was open, and the ask transport forced in-progress, dragging draft Triage cards to Running on their first question. One rule now holds on both tracks: a pending question is activity only, never board position (lib/card-question-state, shared by server and board, pinned by a node test). Legacy rows heal to in-progress on read and are rewritten on the next sync; worker prompts and the README no longer promise a "Gate pending" column.
Strategy picker on mobile. The options list no longer nests its own scroll region inside the sheet scroll (scroll trap); it expands and the sheet scrolls as one column, autofocus is desktop-only so the keyboard doesn't cover the list, and a fieldset min-width fix removes the horizontal overflow. Disabled rows no longer hover.
Blocked submits keep the draft. A submit rejected for want of a strategy (or a failed create) used to resolve successfully from the composer's view, wiping what the user typed. Guards now throw so the draft is kept, per the composer contract — in both creation dialogs.
Ask refuses unknown threads fast.bb stelow ask --thread with an id that owns no card (provider session id, dirHash) exited 1 blaming storage after showing the question nowhere; now it exits 2 naming the fix ($BB_THREAD_ID). Prompts show the literal command, the storage message carries the cancel reason, and the sync state file moved out of skills/ (daemon log spam).
Failed cards name their cause. A worker that died before producing output (e.g. a provider 400 on the first inference call) left the card at Failed with a blank error. The latest provider/error detail is now resolved once and stored as last_error (workerFailureCause, lib/worker-failure.mjs, node-tested), so the Failed pill, the detail hero, and the inbox event read e.g. Provider error 400: Internal server error.
One research status everywhere. A ready brief rendered two competing states on the kanban card (Doing + Ready for review) and no status pill at all in the expanded view. ResearchStatusPill is now the single status on the kanban card, the list row, and the expanded view — Ready for review replaces the column label when the brief is ready.
Changed
Work track is now Build. The delivery tab, its build/card/... routes, and all copy drop the "Work" qualifier ("Build cards", "Paused", "Intent", "Settings") — cross-track references read the track title from the central STELOW_TRACKS table instead of hardcoding it. No backward compatibility: old work/... links fall back to the Build board.
Added
Tour nav visibility. Back/Next/Done use real button hierarchy (Next/Done solid primary, Back outline) in a fixed footer row, so tour navigation no longer dissolves into the background.
Shared tours for Inbox, Work, and Research. One Tour stepper for all three tracks: full steps on first use, a one-line summary bar once content exists, a quiet reopen once dismissed (per-track localStorage). Every step may carry its own primary action, rendered in the content zone while navigation owns a fixed footer row. Inbox teaches with a ghost sample row instead of a seeded notification.
Unified filters.FiltersBar with optional facets: project + attention shared by both boards, delivery adding stage/type/status/ activity by config. Research drops its forked filter row for the identical popover, pills, and checkbox. The popover dismisses on outside click or Escape; selections apply live.
Work tour. First-run progressive disclosure on the Work board: a 3-step tour on the empty state (start work, per-phase agents with the live routing, tune later), collapsing to a one-line agent routing bar once cards exist. Dismissible, reopenable, persisted in localStorage.
Research preset band. Investigations get their own research preset default instead of inheriting the analysis band, configured from the New research dialog (board default fallback). Spawn, restart, and strategy rounds resolve it; createResearchCard accepts an optional per-investigation presetId.
Batched question answering. Workers batch independent questions into one bb stelow ask call (repeat --question groups); the card, the artifact viewer, and the thread form answer them in one sitting via a stepper with counter, direct jump tabs, radio/checkbox options, a free-text Other on every question, and explicit Skip. One atomic submit (answerQuestions / answerExpiredQuestions) resumes the worker once. Timed-out questions batch the same way and resume the current worker.
GitHub import filters. The label field offers the alphabetical label picker; an assignee dropdown narrows to one person when the GitHub cache exposes assignees; per-issue assignees render inline.
GitHub completion write-back. Completed cards imported from an issue offer one explicit Manage action: post a factual English summary as an issue comment via gh, optionally closing the issue. Never automatic.
One Stelow panel with track tabs. Inbox, Work, and Research live as tabs under a single Stelow sidebar row (subPath-routed, last tab remembered, legacy card links resolve live). Track names, icons, and routes come from one table. The sidebar badge counts unresolved inbox action items across both tracks; each tab carries its own active count.
Research track. A Research tab beside Work and Inbox: To-Do / Doing / Done cards with composite strategy rounds on the same request (each round appends to brief.md, never rewrites), a parsed opportunities convention, and fan-out that turns opportunities into delivery work cards without duplication. Delivery surfaces (stages, gates, intent) refuse on research cards with named exits. Covered by brief-parser and strategy unit tests.
Turn exploratory work into a project. Exploratory cards gain a "Turn into project…" action that creates a BB project from the card's workspace. Files stay in place and the worker continues from the current stage; project cards never see the option. Covered by a naming and create/adopt/conflict unit test.
Scope/task progress everywhere. Open cards show per-scope n/m task counts plus task dependency chips; board and list rows carry scope and task done/totals from a per-workspace-cached lookup.
Fixed
Proportional Board/List toggle. The Work view switch is a fixed-height (44px) two-column segmented control with equal halves and centered labels, matching the action buttons beside it.
Inbox keeps stale content while reloading. Only the first mount skeletons; later polls show a quiet updating hint instead of blanking.
Uniform header and filter controls. Work toggle segments, action buttons, and research filters share one height and text size; the research project filter is horizontal so the row aligns.
Panel drops the board legacy. Single panel id/path is now stelow (was board); track routes, thread actions, and comments no longer reference it. Old panel URLs are not preserved — early development, no backward-compat tax.
Timeline count links to its artifacts. The count is now its own button (navigation and files no longer share a chip); it opens the Artifacts section and scrolls to it. Stage chips meet touch targets and scroll horizontally on mobile instead of wrapping.
Track tabs order and memory. Order is Inbox, Research, Work with Inbox as the default; explicit track routes persist the last tab while the bare root only reads it (it used to clobber the memory), and the tab bar scrolls instead of squeezing on mobile.
Artifacts live with their stages. File pills no longer sit among navigation pills in the timeline (count-only badges remain); a shared Artifacts section lists everything grouped by producing stage, in both tracks. Order pinned by unit test.
Inbox counts fresh completions. The badge now includes unseen completions from the last 7 days alongside unresolved actions; opening a completed card marks it seen (read, never resolved).
Strategy picker is alphabetical. Playbooks scan predictably; opportunity-mapping stays the suggested default.
Dead card-seen tracking removed. The unreachable markCardSeen endpoint and its always-NULL columns are gone; attention reads presence directly. No behavior change.
Research copy matches the concept. The input is a question or topic, not an opportunity space — that is the result. Empty state, header, and creation dialog reworded; the dialog also reflects composite rounds.
Research empty-state wording. "A question or a space" read as ambiguous — it now says "an opportunity space".
Skills sync verifies content hash. The raw CDN can serve a stale blob for a fresh tree sha right after pushes; the sync pinned stale bytes under a fresh sha forever. Fetched content is now verified against the tree sha before recording, with retry on mismatch. Covered by a blob-sha unit test; suite grows from 5 to 6.
Added
Worker lineage in stelow.json. Per the upstream Worker Lineage contract, spawn/reseed/restart mirror the thread ledger into the workflow's own state (host-readable, survives plugin DB loss). Merges retry on write conflicts instead of clobbering concurrent stage advances; covered by round-trip, preservation, and failure-path tests.
Artifact review surface. Read-only viewer (Markdown/source render) with multi-excerpt draft comments sent to the agent in one organized batch, pending gate question inline, and workspace-kind links that open in bb's official viewer. Review entry point from the decision hero.
Advance refuses mode-skipped gates.plan-gate/diff-gate in a review mode that skips them now fail with the redirect (to execution / audit) instead of parking the worker on a review nobody configured.
Gate-tool fallback in worker prompts. When visual_review is unavailable, Auto writes the approval receipt and advances; gated modes open a structured ask; chat-parking is forbidden.
Regression tests for ask-cancel and worker lifecycle. Ask cancellation matrix and worker ledger/stall/flag transitions run against real SQLite; suite grows from 3 to 5.
Honest paused verbs. The paused hero offers Resume (not Retry) when there is no error, matching the board's attention label.
Mode-gated interface picks in worker prompts. Spawn and retry prompts now state the review-mode discipline (Auto / Product Spec Gate → LLM decides; Interface-Gates+ → human picks), matching the new upstream human-gates.md policy that ships via skills sync.
Reload-proof questions. Transient ask cancellations (timeout, plugin reload/restart, aborted request) persist the question and park the card in awaiting-answer instead of losing the decision; explicit dismissals pass through. The persist is guarded against storage torn down mid-write, with an honest re-ask-once fallback.
Worker ledger. Every worker thread per card is recorded (initial, band-swap, restart, reseed) with preset and reason; a Worker history section in Manage opens current and archived threads.
Robust preset staleness. An explicit restart-pending flag (set on assign, self-healed by thread-birth comparison) replaces id-equality inference; fresh cards no longer get a pseudo-override row.
Official thread mention. Respawned workers reference the archived predecessor with a native mention chip, not just copied text.
Restart worker applies preset changes. Provider/model are fixed at spawn, so Resume can never switch them. While the running worker predates the override the hero offers Restart worker (fresh worker on the effective preset, continuing from the current stage), with the previous archived thread referenced for context recovery and trailed on the card.
Reload-safe workers. The dispose hook that stopped every live worker thread is removed — it fired on each hot-reload and massacred in-flight work. Workers survive reloads; boot reconcile re-syncs state.
Inbox history that persists. Resolved items render under a Resolved section instead of vanishing; the badge counts unresolved action items only. Silent stops leave an agent comment trail, and repeated stalls escalate the paused hero copy.
Pointer cursors. Every clickable across Stelow panels uses the hand cursor; disabled controls use not-allowed; text fields keep the I-beam.
Honest card-state signaling. A worker that stops with no new output, question, or stage progress signals paused immediately (no 90s grace); the retry nudge tells the worker to ask genuinely new questions instead of staying silent; the paused hero fires only on known-stuck idle; inbox summaries complement kind labels; the card hides the inbox banner when the hero already communicates that state.
Contextual thread button. The thread header shows "Stelow work item" only on a card's worker thread (via a new cardByWorkerThread lookup) and opens that card directly; other threads show nothing.
Inbox Resolved history. Auto-resolved items stay visible under a collapsed Resolved section instead of vanishing; resolution is per-kind (resume clears error/paused, answers clear questions).
Manual-stop recovery. Thread starting/stopping/error statuses map to card activity, opening a card reconciles with the live thread, and an idle worker always offers Resume next to Open thread.
Open-card zone order. The Manage disclosure (preset, restart, archive) now comes collapsed right after What is happening, with Conversation closing the page as the final interaction zone.
Open-card redesign (contextual hero + progressive disclosure). The open card now leads with a single hero derived from card state (decision > error > paused > working > calm) — one sentence plus one primary action — instead of competing error/paused/decision banners. Everything else collapses into three disclosures (What is happening / Conversation / Manage) with a fixed type scale, left-aligned single-column layout, and larger touch targets.
Intent correction after triage notifies the worker. Changing a card's intent past triage asks for confirmation (appetite and the stage path are not recomputed) and sends the correction straight to the worker thread; a failed notify falls back to Retry guidance.
Exploratory workspaces. "Don't work in a project" now creates an isolated workspace under ~/.bb/stelow/exploratory/<card-id/> backed by a local "Stelow exploratory work" project, instead of failing on the Personal project. Advance, reseed, preset swap, details, artifacts and intent editing all resolve the exploratory workspace.
Per-card preset override with reset. The card's Agent preset section has a Change dialog: board default first, user presets, every installed provider's models (with counts and load-failure notes), plus a Custom provider + filterable model combobox. A card override now beats band presets; reset restores the board default and drops the private row. Override rows stay out of preset listings.
Fixed
Exploratory bb stelow advance. The data/stelow helper was Git-only; it now accepts STELOW_STATEDIR/STELOW_STATE, resolves the project root correctly, and honors STELOW_TRANSITIONS in pre-condition checks.
Transitions parsing. Comment markers ((none — …)) no longer leak fake stages into the CLI allow-list nor hide real rework targets from the card UI; reject targets are listed; the terminal audit block parses (the JS \\Z anchor was a literal "Z").
Worker stalls after answers. Answering a card question now sends an explicit continuation turn — responding to the interaction alone never resumed the agent.
Worker errors. Specific failure causes survive reconcile (the generic fallback is never stored); the kanban attention pill no longer duplicates the activity pill; the broken W shortcut and double-click worker open were removed.
Every card starts unknown. The creation intent parameter is always persisted as unknown and the worker prompt classifies intent first, writing it to state.md before loading any phase skill.
Changed
Worker prompt trimmed. Intent-first instruction, state dir, advance and ask contracts only — redundant paragraphs removed.
Open card revamp. Single sticky identity bar (intent control lives there now), micro-caps section scale, de-boxed comments, contextual actions (Resume in the error box, Open thread button in Progress, quiet Archive), tooltips explaining intent/stage, stage shown before intent.
Preset dialog UX. Custom choice first, option counts, scroll fade affordance, filterable inline model list with free-text fallback.
Fixed
stelow advance / doctor after skill renames. The data/stelow SCOPE-2 helper still hardcoded the old stelow-product-orchestrator path in its TRANSITIONS fallback and the advance pre-condition Python block. Both now resolve stelow-workflow-orchestrator. Also fixed the stale mirror reference in references/transitions.md.
Architecture
DRY: stop duplicating Stelow skills. The plugin dropped the 13 stelow-product- playbooks from its bundle (consumed from the agent skills hub via npx skills add calionauta/stelow) and renamed the vendored workflow guides to the repo-authoritative stelow-workflow- prefix.
Auto-sync vendored workflow skills.lib/workflow-skills-sync.mjs fetches the calionauta/stelow repo tree, compares git blob hashes against a .sync-state.json, and rewrites only the changed core skills (stelow- + stelow-workflow-) into the plugin's skills dir. Registered on bb.background.schedule every 6h (STELOW_SKILLS_SYNC_CRON overrides; default 33 /6 ). Fail-soft: network/API errors just log and keep the current skills — the board never breaks.
Worker prompt updated to load workflow skills from the plugin and product playbooks from the stelow repo hub, matching the split distribution.
Security
Artifact manifest path hardening. Absolute paths and parent-directory traversal (..) in artifact manifests are now rejected; every resolved artifact path is verified to stay inside the project workspace (resolveArtifactPath in lib/artifact-manifest.mjs, used by the server's document-read path).
Optional third-party CLIs are user-installed only. References under skills/stelow-product-orchestrator/references/cli-tools/ (pi-tasks, rpiv-todo, thermo-nuclear code-quality review, and safe-change) no longer instruct the agent to run unpinned third-party installers automatically. They are framed as optional tools the user installs and pins/verifies themselves; absent them, the guidance falls back to built-in workflow steps.
Replace unsupported Columns host icon with the valid Columns2 icon in the board nav, thread panel action, and manifest metadata.
Design
Board/List filter spacing. The view toggle (Board/List) and the "New work" CTA now sit gap-3 apart on desktop so they read as two distinct controls, keeping gap-2 on mobile to preserve width.
Added
Contextual preset configuration. Removed the duplicate board-header Presets button. Configure presets now lives only beside Worker policy, where its phase assignments directly explain what a new card will use.
Shared worker policy at creation. New cards no longer ask for a per-card Worker preset. The composer now summarizes the board's effective preset per phase and links directly to configuration; cards always begin with the shared Analysis preset and follow phase assignments thereafter.
Delightful preset-form loading. While the real provider/model catalog is loading, Manage presets shows a purposeful preparation state instead of provisional fields. The editor appears only with the configured options.
No provisional preset editor values. The preset modal waits for its preset data before opening; its new-preset form begins neutral while provider data is loading, then seeds from the actual configured default. The board also states plainly that its Worker preset, not BB's general composer picker, controls execution.
Authoritative worker-preset selector. New-card creation now presents the configured Stelow presets directly. The selected preset, falling back to the built-in default, determines the worker's provider/model/reasoning/permission independently of the general BB composer controls.
Preset editor derives real defaults. Opening the new-preset form now seeds provider, model, reasoning, and permission mode from the configured default preset instead of relying on a stale hardcoded UI value.
Focused Pi preset routes. The Pi model picker now lists only its intended Bifrost routes — Harness Coding plus GPT-5.6 Sol, Terra, and Luna — instead of exposing Pi's unrelated OpenCode/OpenRouter catalog. The selected Harness Coding route remains present when the picker opens.
Reliable preset create/edit mode. New presets now begin with a null identifier, immediately switch to edit mode after creation, and expose a clear New preset action. Existing accidental empty-ID presets are repaired automatically while retaining their card and workflow-phase links.
New-card workflow controls. The board now lets the user set the two canonical workflow axes before creating a card: Appetite (Lean, Core, or Complete) and Review Mode (from Auto through the full code-diff gate). They default to Lean and Auto, are validated by the RPC contract, and are persisted to both the seeded state.md and stelow.json. The spawned worker receives the declared values and does not re-ask for them during setup.
Last-used workflow defaults. After a card is created successfully, its Appetite and Review Mode become the preselected choices for the next card. This is stored as plugin UI preference data, never in a workflow's canonical files; a fresh installation still starts at Lean + Auto.
Stage timeline: advance one step, return many — with correct verbs. Clicking a passed stage now opens a "Return to X?" dialog (was always "Advance to X?", wrong directionally). Forward movement is restricted to one stage at a time (the next legal stage — gates apply); going back is allowed for any number of stages and labeled as safe/reversible.
Per-card preset removed from the card detail. Presets are configured once, globally, per workflow phase from the board's Presets button. The card's per-preset dropdown/assign (which could conflict with the phase preset) is gone; the card now just shows an informative chip of the phase's active preset. Dead switchPreset/presets/presetSwitching code removed.
Scopes/tasks are ordered and dependencies are explicit. The card's Scopes list is now sorted topologically by dependency — a scope that depends on or is blocked by another appears after it, so reading top→bottom follows execution order. Tasks within a scope are sorted by progress (in-progress → pending → blocked → done). A scope waiting on an unfinished dependency gets a ⛔ "waiting on N" badge and an amber border; dependency chips show the scope's real name and turn amber when its dependency isn't done yet (missing deps shown as dashed). No framework, all client-side (topological sort + status rank).
Board columns are the workflow phases. Columns are now Analysis → Planning → Execution → Review (+ Done, Archived) instead of abstract lifecycle states (Triage/Shaping/Running). An active card sits in the column of its current phase (derived from its stage), so the board visualizes exactly where in the workflow each card is. The blocked column is removed — stelow never records card-level blocked status (only scope/task dependencies, which stay in the card). Drag & drop a card to a phase column moves it to that phase's entry stage; dropping on Done/Archived sets the terminal status. Needs-attention remains an overlay (badge + count) across any phase column.
Workflow timeline in the card detail. The 17 stages now render as a vertical timeline grouped by phase (Analyse / Plan / Execute / Review), replacing the loose "Advance stage" buttons. Each stage is a chip showing passed ✓ / current (highlighted) / upcoming, with the phase as a visual group label — so the card's position in the flow is clear at a glance. The timeline doubles as the advance control: click a future stage to advance, a passed one to go back, one step at a time (the confirm dialog and its per- stage preview still apply). Phase groupings live in a single STAGE_BAND map (cross-referenced with server STAGE_BANDS for presets), so phases are an aggregation of stages, not a rival axis.
[KISS/DRY] Attention is a single flag; "Gate pending" is no longer a column. A pending question is now purely an activity signal — the card stays in its real stage column (e.g. Running) and shows the attention badge "Answer required". The "Gate pending" column is gone (it misrepresented workflow position: gates can occur at any stage, not after planning). Server returns exactly one needsAttention boolean; the label is derived client-side from the card's own activity/status (a single attentionLabel() helper) rather than a parallel enum.
Board card: removed the redundant status pill. On the board, the column already communicates the card's status, so the status pill was noise. A board card now shows intent + stage (the phase, which differentiates cards within a column) + the activity pill. Status remains in the card detail, where the column is not visible; the detail also drops the now-duplicated status pill (its breadcrumb already shows status + stage).
Attention is unified. The board no longer distinguishes "needs attention" from "needs repair" as separate visual states. A single flag (needsAttention) answers "does this card need a human now?", and a kind (question / error / completed / idle) picks the reason and its action. Idle-stuck cards now count as needing attention, so a stopped worker on an active card is no longer invisible on the board. Idle only surfaces after the worker has sat idle ~90s (two reconcile cycles), so a card that merely finished a turn is not falsely flagged. The card detail's "Repair" is now "Resume". Cards that were already idle before the last_idle_at column existed are backfilled on the next reconcile poll (with updated_at as a fallback onset proxy), so legacy idle cards surface too instead of never counting as attention.
Presets are configurable from the board header. A Presets button in the Stelow board header opens the preset manager (create/edit/delete, set default, and the per-workflow-phase presets) without digging into a single card's drawer. The card-drawer entry point is unchanged.
Respawn reliability for phase-preset transitions. The band-boundary respawn now resolves the real per-workflow state dir (from stelow.json) instead of guessing the current date, retires the old worker only after the new spawn succeeds, and marks the card error (with last_error) if the spawn fails — no more zombie cards with no worker and a stale running state. The board advance path triggers the phase-preset swap too, matching the CLI path.
Worker preset per workflow phase. Presets can now be configured per stage phase (analysis / planning / execution / review) in the preset manager. When a card advances into a phase whose preset differs from the one its worker was spawned with, the worker is automatically respawned with that phase's preset on the same state dir (state.md is preserved, so the new worker continues from the current stage — no context reset). A phase with no configured preset falls back to the card's preset (or the default), so existing cards behave exactly as before. Add test_bands.mjs to verify the stage-phase mapping and fallback.
Artifacts flow: cards now surface the documents the workflow produces.transitions.md declares a per-stage artifact: glob (e.g. shape → plans/spec-product_*.md, planning → plans/spec-tech_*.md, scope → scopes/scope-report_*.md). stelow advance now (a) blocks the transition when the required artifact file is missing, and (b) records the produced path into state.md → artifacts.<stage> (repo-root-relative, merged so earlier artifacts are preserved). The card detail reads those artifacts and shows a new “Assets produced by the workflow” section with each file as a clickable chip (opens the document in the review panel).
Per-workflow state: stelow is now multi-card per project. Each card owns its own state file at <root>/.stelow/<date>/<dirHash>/state.md (plus invariants.json and lock) instead of sharing a single project-root state.md. The card stores its dir_hash; the helper resolves the dir from STELOW_STATEDIR (set per workflow by the server), so advance/status touch only that card's state. Removed the old one-active-card-per-project guard — N cards can now run concurrently in the same project without colliding. Legacy cards (no dir_hash) keep working via the root state.md fallback.
Fixed
Status vs. activity: distinct, non-competing visuals.status (the workflow's column anchor, e.g. "In progress") stays a solid pill; activity (the transient worker state) is subordinated as a dashed pill with its own glyphs — working (breathing dot), waiting-for-you (amber hourglass), error (red X). A worker resting in the normal idle state renders no activity badge, so a card no longer shows a jarring "Paused" beside "In progress". The play glyph is now reserved for the working state only; in-progress uses a solid dot instead, removing the play-icon collision that made a card read as both running and paused at once.
Artifacts are clickable right in the agent's message. Stage skills now emit a ::stelow-artifact{path="…" display="…"} message directive per artifact, rendered by a new plugin messageDirective as a clickable chip that opens the file in the workspace viewer. This fixes the old bare plans/… references in comments, which resolved against the project root and 404'd (real files live under .stelow/<date>/<dir>/).
Card ask questions are now real interactive forms. An open Stelow question on a card rendered as buttons that only pre-filled the thread composer (easy to miss, required a manual send, and offered no multi-select). The card now shows the same option-picker as the thread's native interaction and answers through threads.interactions.respond — picking option(s) and pressing Submit answer forwards a structured response to the worker, no manual composer edit needed. More pending questions reuses the same form.
Artifacts and mentioned files open as dedicated plugin tabs. The chips previously called openThreadPanel, which can be declined when the card detail is itself a plugin tab (no thread side panel). They now navigate to a review-document/<path> tab that renders the full markdown reviewer (read, inline comment, selection), reachable from the board or the card.
Pending stelow ask questions now surface on the card. The card only showed an awaiting-answer banner when activity was exactly awaiting-answer, and listCards/cardDetail only promoted to it when the thread was running. A card whose worker is idle with a pending interaction (the normal state after bb stelow ask parks the workflow) hid the question entirely. Both now detect pending interactions regardless of the stored/thread activity, so an open question is always visible and answerable.
Repair only shows on idle, unfinished cards (not when there is an open question to answer or an active error — those already have a clear action).
Comments render as Markdown (bb's chat renderer) instead of raw text, so agent comments keep bold, lists, and clickable file references.
Artifacts use repo-root-relative paths so the review file opener resolves them under the project (absolute paths containing / were rejected by the workspace-safety check and 404'd).
Realtime now works over Tailscale (port 8096). The bb-tcp-proxy was a plain HTTP forwarder that never upgraded WebSocket, so the board, the sidebar count, and card state only refreshed on manual reload. Rewrote it as a Node proxy in ~/bin/bb-tcp-proxy.js with upgrade support — board updates, drag-and-drop moves, and archives now reflect live without a refresh.
Card stays in Triage until triage is done. A freshly-created card was immediately promoted draft → in-progress as soon as its worker thread went active, so it never showed in the Triage column and "jumped" to Running. The sync now reads current_stage from state.md and keeps the card in draft (Triage) while the stage is triage, only moving to Running after the agent advances.
intent and stage sync from state.md. If a card is created with intent=unknown, the sync adopts the intent the agent records in the project's state.md (only when that state.md belongs to this card). The reported stage also follows current_stage from state.md.
state.md re-seeded per card. A single state.md lives per project, so creating a card reused an existing state.md that belonged to a different card (wrong name/intent). The seed now re-writes state.md for the card being created when it belongs to another card (or is missing).
One active card per project. Because state.md is a single per-project file (per the state-contract), creating a card now blocks if the project already has a non-archived card, with a clear message to archive/pause it first — preventing two cards from fighting over the same state.
Sidebar badge shows a number only. The count pill now renders just the number, matching bb's own sidebar accessory styling, instead of "N live".
Board header counts live cards only. "N cards" in the board header now uses the same live definition as the sidebar badge (in-progress / draft / planning / awaiting-answer), so archived, completed, and blocked cards are excluded and the two counters stay coherent.
Added
Full bb composer on the board. The new-card form now uses bb's own NewThreadComposer (tiptap editor): type @ for mentions, use the + action menu to attach files, skills, automations, or a plugin reference, and pick project/provider/model right in the form. Attached files are copied to the thread storage and listed as Attached files: in the card prompt — same behavior as bb threads.
Bundled Stelow skills. The plugin ships the 27 stelow- skills in skills/ and declares them via bb.skills, so a fresh install no longer depends on ~/.claude/skills/stelow- symlinks or the calionauta/stelow repo being checked out. The agent prompt now reads the stage guides from the plugin's own skills directory.
Workspace-file mention provider (@ + filename resolves to Workspace file: <path> when the route has a project context).
Timed-out questions are answerable later. If a bb stelow ask times out (user away), the question is persisted and the card stays in Gate pending — it does not look abandoned. The agent is told to STOP and wait (never guess, never re-ask); the card shows "Waiting for your answer — the agent paused" with the original options still clickable. Answering records it as a card comment and delivers the answer to the worker thread, which resumes the workflow.
Changed
Ask timeout stops the agent. Previously the worker was told to proceed with best judgment on timeout. Now the ask command returns a STOP instruction and the worker prompt says: on timeout, do not proceed; the question stays pending and answerable; the answer resumes the workflow. syncThreadState keeps an idle card in Gate pending while a question remains unanswered.
Card header de-duplicated. When activity and status agree (e.g. both awaiting-answer) only one tag shows; the breadcrumb shows the column state (Gate pending) plus the workflow stage (Triage) instead of only the stage. The intent label now shows the current intent next to the select.
Ask timeout is configurable via STELOW_ASK_TIMEOUT_MS (default 1h) for testing and tuning.
Delete archived cards. Manage on an archived card (research or build) offers Delete behind an English confirm dialog (deleteCard RPC: archived-only, removes the card row plus comments, presets, questions, inbox events, and ledger rows, stops + archives the worker thread). Archive stays the reversible exit; delete is the deliberate erasure.
Fullscreen creation on phones. The New card / New research dialogs stay real modals on compact viewports (full-viewport with an explicit close, fullscreenOnMobile on DialogContent) instead of collapsing into a bottom sheet; desktop centering is unchanged.