Bead CLI queries¶
This page describes commands for finding and checking bead records.
sase bead blocked¶
Show all issues that have at least one active (non-closed) blocker. Rows use the same plain status/size gutter as compact list rows, including the collapsed size column when no blocked bead has a stored size.
sase bead doctor¶
Run health checks on the beads database. Checks for:
- Missing
config.json, event store, compatibility projection, or compatibility cache - Projection drift between canonical events and
issues.jsonl - Redundant close events, including how many landed in the recent diagnostic window
- Invalid events or unreduced orphan phase records
- Uncommitted bead-state changes
- Orphan children (phase or nested-plan beads whose parent is missing)
- Plan-archive sidecar drift: bead-linked plans missing from the sidecar, orphaned compatibility plan-link indexes, and canonical plans found only in local plan roots
- Old-format or unresolved
designplan references - Issue prefix leaked as the project's ProjectSpec directory key instead of its
PROJECT_NAME(reported; automatically repaired before the next top-level bead is minted, or repair on demand withsase bead doctor --fix-issue-prefix) - Artifact references with unknown namespaces, missing targets, or ambiguous targets
claimedbeads whose assignee resolves to no agent artifact (reported only; runsase bead open <id>to clear them)openbeads owned by a live agent that has not started work yet (reported only; it means thebead_claim_checksjob is not running or is failing, since it should have claimed them)
If bead commands fail before opening a store, run sase core health first. It verifies
that the required sase_core_rs extension is importable and exposes the representative
bead CLI binding used by the fast path.
--fix-projection previews rows where issues.jsonl differs from replaying the
canonical event streams, then rewrites the projection from the streams after
confirmation. The repair refuses unexpected diffs: row additions or removals, status
changes, fields outside closed_at, close_reason, close_history, and updated_at,
or any closed_at move later. close_history is allowed because the first repair after
upgrading to a sase-core release with close history legitimately materializes archived
records for beads whose close reasons were destroyed by a reopen before sase-core
started archiving them — see Close History. A successful
repair regenerates the local git-ignored export and commits nothing; a second clean run
writes nothing. Use --yes for non-interactive repair after reviewing the preview
through an external approval gate.
--fix-issue-prefix previews and, after confirmation, resets a store's issue prefix on
demand when it was leaked as the project's ProjectSpec directory key (e.g.
gh_bobs-org__bob-cli) instead of its PROJECT_NAME (e.g. bob-cli). The same repair
also runs automatically before the next top-level bead is minted. A deliberately
customized prefix is never flagged. The repair is forward-only: existing bead IDs keep
the old prefix, and only new top-level beads use the corrected one.
--fix-plan-archive previews recoverable plan-sidecar gaps and separates them from
entries that cannot be repaired safely on this machine. A candidate is recoverable only
when its canonical source exists in a resolved local plan root and passes committed-plan
validation. For a bead-owned gap, source frontmatter may omit bead_id or name the
expected bead; naming a different bead makes the candidate unrecoverable. Local-only
canonical plans are reported as drift but are explicitly “not necessarily approved”;
review the preview before applying.
After confirmation, the repair rechecks the complete finding set to catch races, adds a
missing bead_id to a bead-owned local source when required, archives the plan without
overwriting an existing canonical copy, and commits the plans sidecar as
Backfill missing plan archives. When that sidecar has a push remote, success also
requires the commit to be published. Missing, conflicting, or invalid source content is
reported as unrecoverable and is never fabricated. Use --yes only after reviewing the
same preview in automation.
See the generated sase bead CLI reference for this
command's options.
sase bead epic-symbols [<id>]¶
List --epic-symbol whitelist entries from the working tree's Justfile (for a full ID
owned by another enabled project, that project's primary-workspace Justfile). With no
ID, every entry is printed. With an ID, only entries keyed to that bead or a descendant
suffix (<bead-id> matches <bead-id> and <bead-id>.2) are shown. Land and phase
agents should run this before closing: leftover entries go stale the instant the bead
closes, and sase bead close refuses while any remain.
See the generated sase bead CLI reference for
this command's options.
sase bead list¶
List issues with optional filtering. Without --status, the command lists open,
claimed, ready, snoozed, and in_progress issues; pass --status=closed when you
need closed history. When the default active query is empty and no explicit --status
was given, the command falls back to listing closed beads. --status, --type, and
--tier are repeatable.
Compact rows lead with aligned, colored type, task-type, and size indicators ahead of the ID:
{type_glyph}<pad> {task_type_glyph}<pad> {status_glyph} {size_token}<pad> {id} · {title}{ ← parent_id}{ ⧖ age}
▸ ◐ <bead-id> · Attribute beads to the agent that created them ⧖ 1d
◆ ≈ ◐ S <bead-id> · Fix xdist flake in artifact modal copy shortcut ⧖ 1d
↳ ◐ M <bead-id>.3 · Record the creator on every bead creation path ← <bead-id> ⧖ 1d
See the generated sase bead CLI reference for this
command's options.
The fixed first column is the bead type. The second column is the task-type glyph for
task beads (≈ flake, ⨯ bug, · untyped, and so on) and is blank-padded for non-task
beads so columns stay aligned. Status follows, then the stored phase/task size. The size
column appears only when at least one listed bead has a stored size, stays blank for
unsized rows, and collapses entirely for listings where no bead is sized. Type,
task-type, and size color are controlled by the same -c, --color option as the status
and ID styles, and the icons and size tokens remain distinct without color. Tier (plan
vs. epic) stays out of this column; it remains visible through --tier,
--format full, and --format json.
| Type | Icon | Description |
|---|---|---|
plan |
▸ |
Plan-like container with a tier; may be a child epic |
phase |
↳ |
Sized executable child within an epic/plan bead |
task |
◆ |
Independent work item; new tasks require a size |
| Size Token | Stored Size |
|---|---|
XS |
xsmall |
S |
small |
M |
medium |
L |
large |
XL |
xlarge |
Summary line¶
Non-empty compact and full listings end with a blank line and one summary line:
{shown}[ {status-adjective}] {type-noun}[ · {type counts}][ · {status counts}][ · {hidden}]
Every count in the summary describes the rows printed above it, except the explicit
hidden clause, which counts matching beads not printed because a limit was active. If
all printed rows share one type, the head folds that type into plan/plans,
phase/phases, or task/tasks and omits the type-count group. If all printed rows
share one status, the head folds that status into open, claimed, ready, snoozed,
in-progress, or closed and omits the status-count group. Mixed listings use the
neutral bead/beads noun and include the needed groups:
6 beads · ▸ 3 ↳ 3 · ○ 5 ◐ 1
2 open beads · ▸ 1 ↳ 1 · 4 hidden
20 closed plans · 5 hidden (--limit 0 shows all)
The hidden clause is N hidden when --limit was explicit. When SASE applied the
default closed-list limit, it is N hidden (--limit 0 shows all). With color enabled,
summary glyphs reuse the row type/status accents, folded type and status words use their
matching accents, counts stay plain, and the hidden clause is dim. --format json does
not print the prose line; its envelope carries the same printed-row counts in by_type
and by_status, including zero buckets for every known type and status.
Active (open/claimed/ready/snoozed/in_progress) listings are unlimited by
default. Whenever the final status scope includes closed and --limit is omitted,
only the newest 20 beads print; pass --limit 0 for the full closed history. When
--since or --until is present, the newest-20 closed default does not apply; an
explicit --limit still wins.
Creation-date filters accept Nh/Nd/Nw, today, yesterday, YYYY-MM-DD, and
YYYY-MM-DDTHH:MM; day-granular --until bounds include the full named day. These CLI
flags bound bead creation time, unlike sase's TUI since: and until: filter tokens,
which bound last activity. A bead with no usable creation timestamp is omitted whenever
a creation-date bound is present.
sase bead ready¶
Show task beads whose explicit status is ready and whose dependencies are all
closed. Epic work does not appear: phase beads are preassigned at epic launch rather
than entering a derived ready queue. When no rows qualify, the command prints
No ready task beads (epic work is preassigned at launch). A ready task with an active
blocker remains stored as ready but is omitted until the blocker closes. Rows use the
same plain status/size gutter as compact list rows, including the collapsed size column
when no ready bead has a stored size.
sase bead search <query>¶
Find beads whose indexed text fields contain a case-insensitive literal substring by
default. Pass -e/--regex to interpret the query as a regular expression; regex
search is case-insensitive unless the pattern starts with (?-i). Regex matching is
unanchored, and ^/$ anchor the whole field unless the pattern uses (?m). A pattern
that starts with - needs the -- separator, such as
sase bead search --regex -- '-x'. Current indexed fields include ID, title,
description, the filing reason (creation_reason), notes, design/plan path, artifact
references, external issue reference, owner, assignee, model, phase/task size, Patch
name/bug ID, status, type, and tier; timestamps are not searched. Compact output prints
a field-labeled snippet for matches outside the title and description when the renderer
has that field's text. A match that hits only creation_reason still returns the bead,
and --format json lists creation_reason in matched_fields, but the compact snippet
line for that field is omitted. Unlike sase bead list, search includes open,
claimed, ready, snoozed, in_progress, and closed beads by default, so it is
the quickest way to recover older context.
Compact output prints each matching bead with the same type/status/size gutter as
sase bead list, followed by a short snippet. For multi-line fields such as
descriptions or notes, the snippet uses the line that matched the query when possible
instead of always showing the first line. JSON output exposes the exact matched_fields
list for each result.
sase bead search auth
sase bead search '^work-' --regex
sase bead search auth --format json
sase bead search auth --format full --limit 3
sase bead search auth --status open --type phase
sase bead search auth --type plan --tier epic
See the generated sase bead CLI reference for this
command's options.
sase bead stats¶
Show project statistics: total, open, claimed, ready, snoozed, in-progress, and closed counts, plus plan, phase, task, flag, and due-flag counts.
sase bead task-type¶
Inspect the effective task-type catalog assembled from builtins, plugins, and project
config. With no subcommand, sase bead task-type delegates to
sase bead task-type list.
sase bead task-type
sase bead task-type list
sase bead task-type list -a
sase bead task-type list -j
sase bead task-type show flake
sase bead task-type show flake -j
list prints a colored table of slug, label, summary, source, and whether agents may
file the type. Agent-uncreatable types such as github are hidden unless -a/--all is
passed. show <slug> prints the label, when_to_use, every field with type,
requirement, role, help, and validators, the body template, the triage threshold, and
provenance. Reads are not audited.
See the generated sase bead CLI reference for
this command's options.
sase bead touched <agent>¶
List the beads one agent touched, newest touch first, one row per bead with verb chips,
title, and relative age. Durable index rows merge with viewed entries from the
sase bead show view log (which is neither written nor synced) and audited bead:
reads (read), matching the Agents-tab Beads: sub-section row for row for touched
beads. read comes from sase bead read / sase artifact read bead: with reasons;
agents are now refused at show, so viewed rows predate that guard. Automation
running inside agents (symvision, flag checks, commit hooks) sets
SASE_BEAD_SKIP_VIEW_LOG=1 and bypasses the guard. The CLI lists touched beads only;
the panel also marks assigned but untouched beads own. A bead with read reasons prints
one extra indented line with the newest reason (↳ <reason>); JSON rows carry
read_reasons.
sase bead touched <agent-name>
sase bead touched 0oa -l 10
sase bead touched 0oa -v noted -v closed
sase bead touched 0oa -v viewed
sase bead touched 0oa -v read -j
See the generated sase bead CLI reference for this
command's options.
When the agent has no touched beads, or none match the -v filter, the command prints
No beads touched by <agent>. (-j prints an empty touches list instead).
Each row leads with one glyph for its strongest verb, shared with the Agents-tab
Beads: rows. The table lists glyphs from strongest to weakest, so a bead that was both
viewed and removed shows ◇:
| Glyph | Verb(s) |
|---|---|
✚ |
created |
✓ |
closed |
↻ |
reopened |
✎ |
updated, noted, ready, snoozed, dep, linked, ref, +1 |
← |
read |
◇ |
viewed (also an own-only panel row) |
⌫ |
removed |
Durable verbs come from a derived per-project touch index
(~/.sase/projects/<project>/agent_bead_touches.json) that is rebuilt from the bead
event streams after sase bead sync, by the periodic artifact-link backfill job, and
after bead mutations that run through SASE's Python mutation path (for example
sase bead create, sase bead close, note-style updates, and bead actions taken from
sase's TUI or gates). Mutations that the Rust fast path handles directly (typically
plain sase bead update, +1, or snooze) do not refresh it. Reading the index never
refreshes it, so rows reflect the last refresh; a missing index lists no durable verbs,
though read and viewed rows still appear. Run sase doctor -C beads.touch_index to
check it: a fresh or not-yet-built index reports OK, a stale index warns and lists the
changed and vanished streams, and an unreadable or wrong-schema index warns that the
next refresh rebuilds it. sase bead sync is a reliable way to refresh it on demand.
Related¶
_[project]: A sase project is a named unit of work registered with SASE. _[workspace]: A sase workspace is a numbered clone of a project's primary repo, managed by the workspace store and tracked in that project's registry.json. _[agent]: A sase agent is an agent session or a single agent that does not belong to a session. _[prompt]: A prompt is the text SASE hands to a provider to start an agent turn. _[macro]: A macro is a reusable prompt triggered with #name in agent prompts. _[Patch]: A Patch is SASE's local unit of change. _[bead]: A bead is one tracked work item in SASE's git-native issue tracker. _[plan]: A plan is a persisted, approved artifact recording the intent behind agent work. _[TUI]: The TUI is SASE's terminal interface for running agents and reviewing results. _[epic]: An epic is an executable multi-phase plan run with sase bead work. _[gate]: A sase gate is a durable, command-backed request for one user decision, created when work must pause for the user. _[monitor]: A sase monitor is a monitor turn that runs one long command under a detached supervisor, so the command outlives the agent that started it. *[stitch]: A stitch is the lightweight ordered change record inside a Patch's STITCHES: section.