Thanks for opening a PR. bstack is the substrate that turns an agent-driven workspace into a self-operating system — every change to it propagates to every install. The contribution rules below exist to keep that propagation reliable.
- Branch names:
feat/<slug>,fix/<slug>,chore/<slug>,docs/<slug>. - PR title: Conventional Commits format (
feat:,fix:,chore:,docs:,refactor:,test:). Examples ingit log --oneline. - One concern per PR. Mixing release infrastructure with a new feature makes both harder to revert.
- Squash on merge. Linear history.
Conventional Commits, body explains the why. Existing commits are the reference:
feat(primitives): renumber so Wait=P9 — restore skill-name↔primitive-number alignment
fix(SKILL.md): compress description to ≤1024 chars per Agent Skill spec
chore(primitives): drop legacy fallback shims from the 0.2.0 renumber
make bstack-check # validates skills + hooks + bridge + policy (if you have the workspace harness)
bash scripts/doctor.sh --quiet # primitive-contract compliance lint
shellcheck scripts/*.sh bin/* # shell hygiene
jq -e . assets/templates/*.snippet >/dev/null # template JSON shapeCI runs the same checks via .github/workflows/ci.yml.
bstack's L3 stability budget says governance changes are rare and deliberate. Before adding a new Pn:
- Confirm rule-of-three: ≥ 3 independent instances of the failure mode the new primitive closes, each documented in
research/notes/or an entity page. - The pattern must have: concrete mechanism, stated invariant, stated failure mode it prevents.
- Add the row to
SKILL.md§Primitives table. - Add the section to
assets/templates/AGENTS.md.template§Primitives. - Update
references/primitives.mdShort-name index (must equal the new total count). - Update
scripts/doctor.shto lint the new row. - Bump VERSION minor and add a CHANGELOG entry — primitive additions are minor releases pre-1.0.
SKILL.md preamble has a ROSTER=(...) array of expected skill names. Add yours there. The skill itself lives in its own broomva/<name> repo; bstack tracks installation status, not source.
See RELEASE.md. Short version:
- Bump
VERSION. - Prepend a section to
CHANGELOG.mdmatching the new version. validate-release.ymlconfirms the two are aligned on the PR.- After merge, tag and create the GitHub Release (
gh release create vX.Y.Z).
- Shell:
set -euo pipefail, quote variables,shellcheck-clean. - Python: PEP 8, type hints where useful, no global state.
- Markdown: agent-readable surfaces (SKILL.md, AGENTS.md, primitives.md) stay terse and structural. Human-readable docs (RELEASE.md, CONTRIBUTING.md) can be longer.
Open a discussion in the repo or ping in the workspace channel where bstack is being used. PRs without context get bounced — paste the failure mode, the proposed fix, and the validation you ran.