Skip to content

Releases: broomva/bstack

v0.23.0 — fix+feat: gitignore-aware, public-repo-aware, non-destructive bootstrap (issue #67)

29 May 21:25
ec27482

Choose a tag to compare

fix+feat: gitignore-aware, public-repo-aware, non-destructive bootstrap (issue #67)

Found dogfooding v0.22.0 on existing real repos (stimulus, broomva.tech): bootstrap is built for fresh workspaces and did two unsafe things + lacked one needed capability on repos with their own hooks/CI/gitignore.

Fixed

  • install-l3-stability.sh no longer clobbers a TRACKED .githooks/pre-commit. On a repo with a committed pre-commit (e.g. broomva.tech's multimedia-asset validator), bootstrap overwrote it with the bstack L3 rate-gate hook — moving the original to .pre-commit.localeven when core.hooksPath.githooks, so the bstack hook never even fired. Now: if the hook is git-tracked, skip + warn (the committed hook is authoritative; --force still allows the move-aside). An untracked hook is still preserved as .pre-commit.local as before.

Added

  • bootstrap.sh Phase 2.6 — gitignore reconciliation + public-repo advisory. Reconciles .gitignore against the committable-vs-machine-local manifest:
    • machine-local telemetry (.control/audit/*.jsonl) → auto-added to .gitignore if missing.
    • committable substrate (.control/arcs.yaml, rcs-parameters.toml, policy.yaml) → warns if gitignored (a coverage gap — the loop won't survive a fresh clone), never auto-un-ignores (publishing a maybe-private file is the human's call).
    • public-repo advisory (via gh repo view --json visibility, graceful if absent): on a PUBLIC remote, surfaces that scaffolded governance is committable-and-public so the operator reviews for secrets before pushing.
  • tests/gitignore-aware-bootstrap.test.sh — 5 assertions covering both fixes (tracked-hook preserved, untracked-hook sidecar still works, audit-glob added, committable-ignored warning). 5/5.

Notes

  • Additive + non-blocking: Phase 2.6 skips gracefully on a non-git workspace; canary 14/14 unaffected.
  • The manual handling on stimulus (#1811) + broomva.tech (broomva.tech#211) is the spec this automates.
  • VERSION 0.22.0 → 0.23.0.

v0.21.10 — revert: --full-depth no longer needed after broomva/skills restructure

28 May 04:33
eefd463

Choose a tag to compare

revert: --full-depth no longer needed after broomva/skills restructure

Companion to broomva/skills PR #11 (merge ab2d05b), which removed the root SKILL.md from broomva/skills to align with the anthropics/skills ecosystem-canonical monorepo shape (best practice per agentskills.io).

With the root SKILL.md gone, the npx skills CLI's default search descends into skills/<name>/ automatically — --full-depth is no longer required.

Reverted

  • references/skills-roster.md — dropped --full-depth from 26 --skill install commands
  • scripts/skill-graduate.sh — dropped --full-depth from the 4 generated install commands (commit msg, monorepo PR body, redirect-stub README, stub PR body). Future graduations now emit the canonical command form.
  • VERSION 0.21.9 → 0.21.10

Net effect across the 0.21.x line

Release What it did
0.21.9 Added --full-depth as a workaround for the root-SKILL.md shadowing (post-dogfood)
0.21.10 Removed --full-depth after the broomva/skills restructure eliminated the root cause

The roster's npx skills add broomva/skills --skill <name> commands are now both correct AND minimal — matching the form used by all other monorepos in the ecosystem.

20/20 tests (graduate + audit) still pass.


v0.21.6 — Phase 4f orcahand migration + dedup (final Tier-2 migration)

26 May 21:03
4310036

Choose a tag to compare

Phase 4f orcahand migration + dedup (final Tier-2 migration)

The last Tier-2 migration. orcahand consolidated to broomva/skills Tier-2 monorepo (broomva/skills PR #9 merge df4fb13), resolving the Phase-0 contested dedup case.

broomva/orcahand and broomva/orcahand-skill were true duplicates (both 180K, identical SKILL.md + assets/ + references/ + schemas/ + scripts/, both name: orcahand). Per user decision: migrate the canonical (.agents-symlinked) broomva/orcahandskills/orcahand/; archive BOTH source repos with redirect-stubs.

Source repos deprecated (both, 6mo window until 2026-11-26)

  • broomva/orcahand PR #1 (merge 4e637ed)
  • broomva/orcahand-skill PR #1 (merge f753966)

Files changed

  • references/companion-skills.yaml — 1 NEW entry (orcahand); 63 → 64 total
  • VERSION0.21.50.21.6
  • CHANGELOG.md — this entry

Migration complete

47 skills now in broomva/skills monorepo. All Tier-2 candidates from the inventory doc are migrated, except broomva/mirage (no remote on GitHub — flagged as an anomaly, not actionable). The skills-monorepo migration arc (Phases 2–4f) is complete.


v0.21.5 — Phase 4e neuroscience migration (TRIBE v2 family)

26 May 20:55
f5dd1ab

Choose a tag to compare

Phase 4e neuroscience migration (TRIBE v2 family)

3 standalone-repo neuroscience skills migrated to broomva/skills Tier-2 monorepo (broomva/skills PR #8 merge ca7de88):

  • tribe-v2-agent-alignment — cortical alignment benchmarking for AI encoders
  • tribe-v2-bci-applied — applied BCI + neuro-informed content optimization
  • tribe-v2-neuroscience — in-silico fMRI prediction

All NEW registry entries (none were previously registered).

Finding: _shared/ is demand-driven

The strategy doc anticipated a _shared/tribe-v2/ directory. On inspection, the 3 skills have DISJOINT reference sets (arcan-integration / cortical-region-atlas / brain-regions — no file overlap). No _shared/ extraction warranted. This validates the principle: _shared/<category>/ is created only when concrete shared content exists, never speculatively.

Source repos deprecated (6mo window until 2026-11-26)

  • broomva/tribe-v2-agent-alignment PR #1 (merge 7bca620)
  • broomva/tribe-v2-bci-applied PR #1 (merge 1e3ea14)
  • broomva/tribe-v2-neuroscience PR #1 (merge 64165b7)

Files changed

  • references/companion-skills.yaml — 3 NEW entries (60 → 63 total)
  • VERSION0.21.40.21.5
  • CHANGELOG.md — this entry

Cumulative monorepo state: 46 skills


v0.21.4 — Phase 4d specialty domain migration (largest batch)

26 May 13:02
db81481

Choose a tag to compare

Phase 4d specialty domain migration (largest batch)

17 standalone-repo skills migrated to broomva/skills Tier-2 monorepo (broomva/skills PR #7 merge 1be5fd9). 2 renamed during migration to drop -skill suffix per ecosystem norm.

By sub-category:

Hardware, robotics, physical (6): bitnet, capx-agentic-robotics, openrocket-sim, sdr-satellite, ocean-genomics, microgrid-agent

Compute & remote infrastructure (4): colab-remote, remote-gpu, claude-code-channels, claude-remote-sessions

Audio, voice, media (2, both renamed): omnivoice (from omnivoice-skill), livecoding

Advisory & consulting (3, one renamed): phronesis, procurer, alkosto-wait-optimizer (from alkosto-wait-optimizer-skill)

Health & body (2): health, founder-mode-oncology (Phase-0 contested case lean accepted)

Source repos deprecated (17 redirect-stubs merged 2026-05-26)

bitnet · livecoding · openrocket-sim · sdr-satellite · capx-agentic-robotics · ocean-genomics · phronesis · procurer · alkosto-wait-optimizer-skill · omnivoice-skill · microgrid-agent · claude-code-channels · claude-remote-sessions · colab-remote · remote-gpu · health · founder-mode-oncology — all archived after 6mo deprecation (2026-11-26).

Excluded from this batch

  • broomva/mirage — repository does not exist on GitHub (anomaly flagged in inventory § 8)
  • broomva/orcahand — Phase-0 contested dedup decision between broomva/orcahand (runtime) and broomva/orcahand-skill (duplicate); deferred to Phase 4f

Files changed

  • references/companion-skills.yaml — 16 NEW entries + 1 entry rewritten (alkosto-wait-optimizer)
  • references/skills-roster.md — install commands updated
  • VERSION0.21.30.21.4
  • CHANGELOG.md — this entry

Total registry size

44 → 60 entries (+16 net)

Cumulative monorepo state

43 skills under broomva/skills/skills/:

  • 2 workflow & lifecycle
  • 9 strategy & decision intelligence
  • 9 content & media
  • 3 research & intelligence
  • 3 finance
  • 6 hardware/robotics/physical
  • 4 compute & remote
  • 2 audio/voice/media
  • 3 advisory/consulting
  • 2 health & body

v0.21.3 — Phase 4c research + finance migration

26 May 01:09
005e012

Choose a tag to compare

Phase 4c research + finance migration

Six more skills migrated from standalone broomva/<name> repos into broomva/skills Tier-2 monorepo (broomva/skills PR #6 merge e2bdf14). Three renamed during migration to drop the -skill suffix per ecosystem norm:

Old repo New monorepo path Notes
broomva/deep-dive-research-skill skills/deep-dive-research-orchestrator/ Renamed to match canonical skill name in registry
broomva/social-intelligence skills/social-intelligence/ NEW registry entry
broomva/harness-engineering-skill skills/harness-engineering-playbook/ Renamed; preserves required: true
broomva/investment-management skills/investment-management/ NEW registry entry
broomva/wealth-management skills/wealth-management/ NEW registry entry
broomva/haima-skill skills/haima/ Renamed; runtime crate stays at broomva/haima (separate concern)

Source repos deprecated (6mo window until 2026-11-25)

  • broomva/deep-dive-research-skill PR #1 (merge c39a293)
  • broomva/social-intelligence PR #3 (merge b0d2bc5)
  • broomva/harness-engineering (renamed from -skill at GitHub level) PR #1 (merge 55edcde)
  • broomva/investment-management PR #7 (merge 557a950)
  • broomva/wealth-management PR #1 (merge 5022c12)
  • broomva/haima-skill PR #2 (merge c8f5014)

Files changed

  • references/companion-skills.yaml — 4 NEW entries (social-intelligence, investment-management, wealth-management, haima) + 2 entries rewritten (deep-dive-research-orchestrator, harness-engineering-playbook) — total 40 → 44
  • references/skills-roster.md — install commands updated
  • VERSION0.21.20.21.3
  • CHANGELOG.md — this entry

Cumulative monorepo state

26 skills under broomva/skills/skills/:

  • 2 workflow & lifecycle (handoff, make-spec)
  • 9 strategy & decision intelligence
  • 9 content & media
  • 3 research (deep-dive-research-orchestrator, social-intelligence, harness-engineering-playbook)
  • 3 finance (investment-management, wealth-management, haima)

v0.21.2 — Phase 4b content & media migration (final content batch)

25 May 23:50
7b42c69

Choose a tag to compare

Phase 4b content & media migration (final content batch)

Six more standalone-repo skills migrated into the broomva/skills Tier-2 monorepo (broomva/skills PR #5 merge e932c7b). After this release, all 9 content/media skills identified in the strategy doc inventory are in the monorepo:

  • content-creation — full-stack content pipeline; ships 45MB of demonstration campaigns (bstack-launch, open-source-stack). Registry entry updated to monorepo path.
  • content-engineNEW registry entry. AI content studio bundling 4 sub-skills (autopilot, cinema, dna, loop) under skills/content-engine/skills/.
  • launch-videoNEW entry. Remotion-based Liquid Glass launch video.
  • ltx-videoNEW entry. LTX-2.3 video generation (Lightricks 22B DiT model).
  • creative-reviewNEW entry. Meta creative review with style scoring.
  • brainrot-for-goodNEW entry. Dopamine-aware video editing for valuable content.

Source repos deprecated (6mo window until 2026-11-25)

  • broomva/content-creation PR #5 (merge 88c7ff7)
  • broomva/content-engine PR #2 (merge 9761756)
  • broomva/launch-video PR #1 (merge dfe48e6)
  • broomva/ltx-video PR #1 (merge f8962ab)
  • broomva/creative-review PR #1 (merge bcaea5a)
  • broomva/brainrot-for-good PR #1 (merge 7f22dd6)

Files changed

  • references/companion-skills.yaml — 5 new entries + 1 entry rewritten; total 35 → 40 entries
  • references/skills-roster.md — install commands updated for 6 entries
  • VERSION0.21.10.21.2 (additive patch)
  • CHANGELOG.md — this entry

Monorepo state after this release

20 skills installed in broomva/skills/skills/:

  • 2 workflow & lifecycle (handoff, make-spec)
  • 9 strategy & decision intelligence
  • 9 content & media (this release completes the content batch)

v0.21.1 — Phase 4a content & media migration

25 May 22:45
4b48237

Choose a tag to compare

Phase 4a content & media migration

Three more skills migrated from standalone broomva/<name> repos into the broomva/skills Tier-2 monorepo (broomva/skills PR #4 merge 2f5aec4):

  • blog-post — full-stack blog post production (substantial: 28KB SKILL.md + examples/ + references/ + scripts/publish.sh + templates/). NEW registry entry (was previously bundled / not registered separately).
  • brand-icons — brand icon and visual identity asset generation. Registry entry updated from repo: broomva/brand-iconsrepo: broomva/skills, skillPath: skills/brand-icons/SKILL.md.
  • seo-llmeo — SEO and LLM Engine Optimization (audits, meta tags, structured data, llms.txt). Registry entry updated to monorepo path.

Each source repo carries a redirect-stub README during a 6-month deprecation window (until 2026-11-25):

  • broomva/blog-post PR #1 (merge a7d90b6)
  • broomva/brand-icons PR #1 (merge 2e20534)
  • broomva/seo-llmeo PR #1 (merge 2b635d6)

Files changed

  • references/companion-skills.yaml — 2 entries rewritten (brand-icons, seo-llmeo), 1 new entry added (blog-post)
  • references/skills-roster.md — install commands updated to monorepo paths
  • VERSION0.21.00.21.1 (additive patch — new entries + corrected install paths)
  • CHANGELOG.md — this entry

Pattern note: multi-source-repo migration

Phase 3 migrated 9 sub-skills from ONE bundled source (broomva/strategy-skills/.skills/). Phase 4a tests the multi-source pattern — 3 separate standalone source repos, each with full skill layout (SKILL.md + scripts/ + references/ + assets/). The migration command is now well-rehearsed and ready to crystallize into the bstack skill graduate CLI (Phase 6b).

broomva/blog-post's root canonical content was preserved; 24 IDE-specific dotfile-mirror dirs (.agent/, .claude/, .continue/, etc.) were excluded as deployment artifacts — downstream agents resolve to skills/blog-post/SKILL.md per the agentskills.io spec.


v0.20.0 — Cross-review CLI — restore the P20 mechanism (BRO-1227 Fix B)

22 May 23:43
ac42639

Choose a tag to compare

Cross-review CLI — restore the P20 mechanism (BRO-1227 Fix B)

The P20 (broomva/cross-review) primitive — cross-model adversarial review on substantive PRs before merge — failed reliably during the 2026-05-21 Wave 3 dispatch session: both Cato sub-agent dispatches stalled within 6-7 tool uses with path-resolution errors. The Cato agent was invoked from the miami workspace but asked to read files at ~/broomva/broomva.tech/... — the working tree was on a different branch than the PR's head SHA, so Read-tool calls drifted into "let me locate the actual repo" loops and never produced output.

This release ships Fix B: a bstack cross-review CLI that reads PR contents via gh pr diff + gh api repos/.../contents/<path>?ref=<sha>. Working-tree state is eliminated as a variable — the CLI can be invoked from any cwd; only --repo <owner/name> + PR number matter.

New files (3)

  • NEW scripts/cross-review.py — argparse CLI. Fetches PR metadata (gh pr view), the diff (gh pr diff), and post-change file contents (gh api …/contents/<path>?ref=<head_sha>); skips lock files and >2000-line adds; bundles into a structured codex prompt; invokes codex exec --sandbox read-only --model gpt-5.4 --skip-git-repo-check with a 240s default timeout; parses JSON verdict (with fallback try_parse_json extractor that recovers a balanced {…} object from prose-wrapped output); writes structured JSON to .bstack-cross-review/<pr>.json + markdown to <pr>.md. Verdict schema: verdict (pass/concerns/fail/skipped) × anti_slop_score (0-10) × criticality (high/medium/low) × findings[] × blind_spots_surfaced[] × summary. Optional --post-comment posts the markdown verdict back to the PR. Exit codes: 0 pass · 10 concerns · 20 fail · 30 skipped · 2 invocation/gh failure.
  • NEW bin/bstack-cross-review — thin shim mirroring bin/bstack-wave: dispatches to scripts/cross-review.py, forwards argv unchanged.
  • NEW tests/cross-review.test.sh — 8-test hermetic offline smoke (dispatcher routing, argparse rejection cases, module import, try_parse_json recovery from prose-wrapped JSON, exit_code_for_verdict mapping). No network calls — end-to-end validation is the per-PR --dry-run against real PRs documented in the PR body.

Changed files (3)

  • CHANGED bin/bstack — adds cross-review) dispatch entry routing to bin/bstack-cross-review. Adds usage section "Review" with a one-liner pointing at cross-review <pr-num> --repo <owner/name> (≥ 0.20.0). Adds the canonical invocation to the Examples block.
  • CHANGED SKILL.md — Quick start block lists bstack cross-review with the BRO-1227 Fix B annotation and 0.20.0 introduction marker.
  • CHANGED VERSION0.19.0 → 0.20.0.

Why Fix B over Fix A or Fix C

  • Fix A (add --cwd parameter to Cato dispatch) leaves the working-tree-state coupling intact — every future P20 invocation has to remember to set it, and a stale checkout silently degrades review quality. The failure mode comes back the next time someone uses Cato across repos.
  • Fix B (always read from git, never the working tree) eliminates the failure mode by construction. The bug surface goes away.
  • Fix C (full skill repo + agent definition + tmp-checkout pipeline) is the complete answer but requires writing the ~/.claude/skills/cross-review/ skill, deciding whether the Cato agent stays as the codex-exec frontend or gets re-architected, and managing the tmp-checkout cleanup contract. Larger blast radius — deferred to a follow-up once Fix B has soaked.

Test plan executed

bash -n bin/bstack-cross-review                                      # syntax OK
bash -n bin/bstack                                                   # syntax OK
python3 -m py_compile scripts/cross-review.py                        # OK
bin/bstack --help | grep cross-review                                # 2 lines
bin/bstack cross-review --help | head -20                            # argparse usage
bin/bstack cross-review 195 --repo broomva/broomva.tech --dry-run    # 9 files fetched, 1 lock skipped
bash tests/cross-review.test.sh                                      # 8/8 pass

What's next (not in this release)

  • Apply bstack cross-review to the 3 PRs that merged WITHOUT P20 cross-review last session — broomva.tech#195, #196, life#1427 — and post retro-verdicts as PR comments. Out of scope for this PR (no code change needed; this PR ships the tool).
  • File a follow-up for the full ~/.claude/skills/cross-review/ skill (Fix C scope) once Fix B has soaked through ≥3 P20 invocations.

Backreferences

  • BRO-1227 — P20 cross-review mechanism gap (closes via Fix B)
  • 2026-05-22 session handoff — /Users/broomva/conductor/archived-contexts/broomva/wave-3-dispatch-and-linear-updates/handoffs/2026-05-22-SESSION-HANDOFF.md §"Queued + ready to dispatch"
  • CLAUDE.md §"Cross-Review (P20)" — the discipline rule this mechanism enforces

v0.19.0 — Closure Contract — generalize 5-tuple from 4 RCS layers to N declared arcs

22 May 20:47
7347554

Choose a tag to compare

Closure Contract — generalize 5-tuple from 4 RCS layers to N declared arcs

Builds on v0.18.0 (Phase 8 federation, BRO-47) — the federation registry is the substrate that lets per-workspace arc declarations roll up via bstack status --aggregate. Together, v0.18.0 + v0.19.0 close the substrate-completion arc through the user-defined-arcs layer.

v0.14.0 + v0.16.0 already shipped a 5-tuple (plant, sensor, controller, actuator, termination) for 4 hard-coded RCS layers via assets/templates/rcs-parameters.toml.template + scripts/compute-budget-status.sh. This release lifts the same pattern from those 4 layers to N user-declared domain arcs the workspace actually runs every day (PR greenflow, bookkeeping promotion quality, deploy reliability, etc.).

The closure contract: every arc declares (id, plant_surfaces, sensor, actuator, termination, tau_a, shield_ref). The agent's reasoning is the universal Π (controller) — that's not declared, it's the default binding when actuator.kind == "agent_reasoning". Script / mcp_tool / http actuators bind specific mechanisms while keeping the agent in the supervisory role.

Companion: point-in-time → trend monitoring for composite-ω. compute-budget-status.sh --trend appends one snapshot per call to .control/audit/composite-omega-history.jsonl, then reads the last 7 days and reports slope + verdict (stable_flat | drift_up | drift_down | volatile). Doctor §21 surfaces a hard gap only on drift_down — composite stability shrinking is the signal worth interrupting on.

New files (4)

  • NEW schemas/arcs.v1.json — JSON-schema draft-07 for .control/arcs.yaml. Mirrors the style of schemas/policy.v1.json and schemas/workspaces.v1.json. Required arc fields: id (same character class as workspace registry name), plant_surfaces (free-form URIs), sensor (enum: exit_code | json_path | log_match | metric_threshold), actuator (enum: agent_reasoning | script | mcp_tool | http), termination (enum: predicate | wallclock | score_threshold | exit_zero), tau_a (number, seconds). Optional: shield_ref pointing at a policy.yaml gate.
  • NEW assets/templates/arcs.yaml.template — declarative arcs template with 2 worked examples and heavy commentary mirroring the rcs-parameters.toml.template intro cadence. Example 1: code-pr-greenflow (json_path sensor, agent_reasoning actuator, predicate termination, tau_a=1800s). Example 2: bookkeeping-promotion-quality (exit_code sensor, agent_reasoning actuator, score_threshold termination, tau_a=86400s).
  • NEW scripts/compute-arc-status.sh — per-arc verdict reader; mirrors the shape of scripts/compute-budget-status.sh exactly. Looks at .control/arcs.yaml → falls back to bundled template. For each arc: runs the sensor (bash -c for exit_code/json_path/metric_threshold; regex against log file for log_match), reads most recent termination event from .control/audit/arc-<id>.jsonl, evaluates termination predicate, emits verdict green | yellow | red | unknown. Outputs JSON (default) or --human table. Exit codes: 0 all green, 1 ≥1 red, 2 config missing, 3 python3 unavailable. Ships its own inline minimal YAML parser (modeled on scripts/workspace.py _yaml_minimal_parse) — PyYAML preferred, falls back when absent, both code paths exercised by the test suite.
  • NEW tests/arcs-validation.test.sh + NEW tests/omega-drift-trend.test.sh — hermetic bash test suites in the tests/metrics-pipeline.test.sh style. 6 + 6 tests; both GREEN under system Python (PyYAML, no tomllib path) AND homebrew Python (tomllib, no PyYAML path). Tests exercise schema rejection (schema_version: 99), template loading, override precedence, drift_down / drift_up / stable_flat verdicts on synthetic data, and idempotent history-line writes per --trend call.

Changed files (2)

  • CHANGED scripts/compute-budget-status.sh — adds --trend flag. Without --trend: existing point-in-time behavior preserved. With --trend: appends {ts, omega, per_layer} snapshot to .control/audit/composite-omega-history.jsonl, then reads last 7 days, computes least-squares slope, baseline (median of first day in window), deviation, volatility (CV), and verdict. Verdict heuristic prefers drift detection over volatility when there's a clear directional signal (slope sign matches relative-deviation sign with magnitude > 1%); volatility is the residual category. Trend block surfaces in --human as one extra line and as a top-level trend object in --json.
  • CHANGED scripts/doctor.sh — adds §20 and §21. §20 reads .control/arcs.yaml (informational when absent), reports arc count + completeness count, surfaces last-termination-event timestamp per arc; hard gap only if schema_version != 1. §21 reads composite-omega-history.jsonl, calls compute-budget-status.sh --trend --json, reports last/baseline/slope/verdict; hard gap only if verdict == drift_down.

Test plan executed

bash -n scripts/compute-arc-status.sh                            # syntax OK
bash -n scripts/compute-budget-status.sh                         # syntax OK
bash -n scripts/doctor.sh                                        # syntax OK
python3 -c "import json; json.loads(open('schemas/arcs.v1.json').read())"  # schema parses
bash scripts/compute-arc-status.sh --human                       # reads template, prints table for both arcs
bash scripts/compute-budget-status.sh --trend --human            # writes 1 history line, prints trend line
bash tests/arcs-validation.test.sh                               # 6/6 GREEN under both python envs
bash tests/omega-drift-trend.test.sh                             # 6/6 GREEN
bash scripts/doctor.sh against ~/broomva                         # §20 + §21 visible; 87/89 (2 pre-existing gaps unrelated)

Honest scope caveats

  • The minimal inline YAML parser inside compute-arc-status.sh covers exactly the shape schemas/arcs.v1.json declares. Workspaces that hand-write .control/arcs.yaml with PyYAML-only features (anchors, multi-doc, flow-style) will need PyYAML installed; otherwise stick to the block-scalar shape shown in the template.
  • arc-<id>.jsonl audit-event writers are not shipped in this PR. Termination events are read by compute-arc-status.sh when present; for now, only wallclock and exit_zero terminations evaluate without a prior recorded event. predicate and score_threshold arcs surface yellow (running) until an event lands. Follow-up: add scripts/arc-event-hook.sh so actuators can record verdicts as they close.
  • Verdict thresholds in --trend (1% relative deviation, 10% coefficient of variation) are heuristic and calibrated for the broomva workspace's λ range. Tighten / loosen via follow-up policy.yaml block after rule-of-three failure modes accumulate.
  • The "ω is shrinking" signal in §21 fires only after ≥ 2 history points span the 7-day window. Workspaces that don't periodically invoke --trend (no scheduled call from /loop or a cron) will see only stable_flat regardless of underlying drift.

Spec doc + cross-references

  • Anchored arcs: prior PR (v0.16.0) shipped the 4-layer hard-coded analogue (assets/templates/rcs-parameters.toml.template); v0.14.0 shipped the L3 enforcement; this PR generalizes both surfaces to N user-declared arcs.
  • Why not a new primitive: the Closure Contract is the generalization of the existing (X, U, h, Π, T) substrate that L0–L3 already use. It's a declarative surface lift, not a new reflex. P21 "Closure Contract" promotion candidate logged — promotion to a numbered primitive deferred until rule-of-three concrete failures are recorded (per the L3 stability budget's stability budget for governance churn). The candidate ledger lives in research/entities/pattern/bstack-engine.md per CLAUDE.md §Bstack Engine.