osoleve avatar

bbs

Manage issues with The Fold's CAS-native BBS (Bulletin Board System). Use for creating, updating, se

by osoleve|Open Source

BBS (Bulletin Board System) Skill

Overview

BBS is The Fold's CAS-native issue tracker built on block primitives. All issues are content-addressed, with full history preserved in the store.

The API has two layers:

  • Data functions return values (alists, lists, booleans) — use these programmatically
  • Print functions (suffixed with !) display formatted output — use these at the REPL

Quick Reference

Data API (returns values)

FunctionReturnsExample
bbs-getIssue alist or #f(bbs-get "fold-001")
bbs-readyList of unblocked IDs(bbs-ready)
bbs-blockedList of blocked IDs(bbs-blocked)
bbs-blockers(id . status) pairs(bbs-blockers "fold-001")
bbs-blocker-idsList of blocker IDs(bbs-blocker-ids "fold-001")
bbs-blockingList of IDs this blocks(bbs-blocking "fold-001")
bbs-is-blocked?Boolean(bbs-is-blocked? "fold-001")
bbs-by-statusList of IDs(bbs-by-status 'open)
bbs-by-priorityList of IDs(bbs-by-priority 0)
bbs-by-labelList of IDs(bbs-by-label 'sft)
bbs-by-typeList of IDs(bbs-by-type 'epic)
bbs-all-idsAll issue IDs(bbs-all-ids)
bbs-labelsAll unique labels(bbs-labels)
bbs-statsStatistics alist(bbs-stats)
bbs-get-historyList of version alists(bbs-get-history "fold-001")
bbs-get-blockRaw issue Block or #f(bbs-get-block "fold-001")
bbs-issue-countInteger(bbs-issue-count)
bbs-issue-exists?Boolean(bbs-issue-exists? "fold-001")

Mutations (return hashes/IDs)

FunctionReturnsExample
bbs-createIssue ID string(bbs-create "Title" 'priority 2 'type 'task)
bbs-updateNew hash(bbs-update 'fold-001 'status 'in_progress)
bbs-closeHash or #f(bbs-close 'fold-001 'reason "Done")
bbs-reopenHash or #f(bbs-reopen 'fold-001)
bbs-commentHash(bbs-comment "fold-001" "Note text")
bbs-depVoid(bbs-dep 'blocker 'blocked)
bbs-undepVoid(bbs-undep 'blocker 'blocked)

Display (print to stdout, return void)

FunctionExample
bbs-show!(bbs-show! 'fold-001)
bbs-list!(bbs-list! 'status 'closed)
bbs-ready!(bbs-ready!)
bbs-blocked!(bbs-blocked!)
bbs-history!(bbs-history! 'fold-001)
bbs-blockers!(bbs-blockers! 'fold-001)
bbs-find!(bbs-find! "query")
bbs-search!(bbs-search! "query")
bbs-list-by-label!(bbs-list-by-label! 'topology)
bbs-list-by-type!(bbs-list-by-type! 'epic)
bbs-label-report!(bbs-label-report!)
bbs-gc!(bbs-gc!)

Instructions

Getting Issue Data

# Get issue as alist (programmatic access)
./fold "(bbs-get \"fold-001\")"
# Returns: ((id . "fold-001") (title . "...") (status . open) (priority . 2) ...)

# Get unblocked issue IDs
./fold "(bbs-ready)"

# Get blockers with their status
./fold "(bbs-blockers \"fold-002\")"
# Returns: (("fold-001" . open) ("fold-003" . closed))

Displaying Issues (REPL)

# Display formatted issue
./fold "(bbs-show! 'fold-001)"

# List open issues
./fold "(bbs-list!)"

# List closed issues
./fold "(bbs-list! 'status 'closed)"

# Search titles + descriptions
./fold "(bbs-search! \"authentication\")"

# Show unblocked work
./fold "(bbs-ready!)"

Creating Issues

# Basic create (just title)
./fold "(bbs-create \"Fix authentication bug\")"

# With priority (0=critical, 2=medium, 4=backlog)
./fold "(bbs-create \"Urgent fix\" 'priority 0)"

# With type (task, bug, feature, epic)
./fold "(bbs-create \"Add dark mode\" 'type 'feature)"

# Full creation with all options
./fold "(bbs-create \"Refactor auth\" 'description \"Detailed description here\" 'priority 1 'type 'task 'labels '(core security))"

Updating and Closing Issues

# Update status
./fold "(bbs-update 'fold-001 'status 'in_progress)"

# Change priority
./fold "(bbs-update 'fold-001 'priority 0)"

# Close with reason
./fold "(bbs-close 'fold-001 'reason \"Fixed in commit abc123\")"

Managing Dependencies

# fold-001 blocks fold-002
./fold "(bbs-dep 'fold-001 'fold-002)"

# What blocks this issue?
./fold "(bbs-blockers \"fold-002\")"

# What does this issue block?
./fold "(bbs-blocking 'fold-001)"

Field Reference

Priority Levels

PriorityMeaning
0Critical - drop everything
1High - do soon
2Medium (default)
3Low - when time permits
4Backlog - someday maybe

Issue Types

TypeUse For
taskGeneral work items
bugDefects to fix
featureNew functionality
epicLarge multi-issue efforts

Status Values

StatusMeaning
openNot yet started
in_progressCurrently being worked
closedCompleted or won't fix

Notes

  • Issue IDs: Can be symbols ('fold-001) or strings ("fold-001")
  • Auto-initialization: BBS initializes automatically when the REPL starts
  • CAS Storage: All issues are content-addressed in .store/
  • Head files: Current issue state tracked in .store/heads/bbs/
  • Counter: Issue counter in .bbs/counter

Pipeline Integration

BBS effects are available in agent pipelines (lattice/pipeline/effects.ss):

(bbs-create "title")              ; Create issue, return ID
(bbs-create-full title desc type priority)
(bbs-update id updates-alist)     ; Update issue fields
(bbs-close id)                    ; Close issue
(bbs-ready)                       ; Get unblocked issues
(bbs-show id)                     ; Get issue details

Note: Pipeline effect names match the data API, not the display API.

File Locations

PathPurpose
.store/heads/bbs/Issue head files (current hash per issue)
.bbs/counterNext issue number
.bbs/depsDependency relationships
boundary/bbs/bbs.ssEntry point and display functions
boundary/bbs/store.ssData accessors (bbs-get, bbs-get-history)
boundary/bbs/ops.ssMutations (create, update, close)
boundary/bbs/index.ssQuery index (by-status, ready, blocked)