Skip to content

v1.5.0 - Team mode, waves, and a rebuilt review pipeline

Choose a tag to compare

@AmirShayegh AmirShayegh released this 05 Jul 20:58

storybloq 1.5.0 is a three-part release. Team mode lets several people (and their agents) work the same .story/ backlog on separate branches and merge without trashing each other's state. The wave working style (/story orchestrate) drives a whole backlog or a multi-repo federation with tiered background agents. And the multi-lens review pipeline is rebuilt end to end on the @storybloq/lenses package. It also ships a batch of community-reported fixes.

One framing holds the three together: judgment stays with the strongest model, execution scales out, and quality gates hold the line.

Team mode (opt-in)

Nothing changes for existing projects until you run storybloq team init.

  • Canonical IDs with friendly display ids. Items get collision-free canonical ids underneath while you keep typing T-042. Every command accepts either form.
  • A three-way JSON merge driver. team init installs a storybloq-json git merge driver scoped to .story/ files. Divergent edits to the same ticket merge field-by-field instead of leaving raw conflict markers in JSON.
  • Recorded conflicts instead of blocked merges. When both sides change the same field, the merge concludes and the disagreement is recorded on the item. Write access to that item is blocked until you settle it with storybloq resolve. Unresolved conflicts carry forward; nothing is silently dropped.
  • Claims. Autonomous sessions claim tickets so two agents on different machines do not pick the same work. Stale claims expire (configurable via team.claimStalenessHours).
  • Tombstones. Deletes are soft and merge cleanly; deleted items stop appearing in selection, recommendations, and exports.
  • storybloq reconcile for post-merge housekeeping and storybloq team doctor for setup diagnostics.
  • Two id allocators. The default local allocator needs no infrastructure; --id-allocator git-refs reserves ids through git refs so parallel branches cannot mint duplicates.

Team projects are stamped schemaVersion: 3. Older CLI releases refuse to write to a v3 project rather than corrupt it, so upgrade every teammate's CLI before running team init on a shared repo.

Waves: /story orchestrate

Autonomous mode (/story auto) drives one item end to end. Wave mode drives a whole backlog or a multi-repo federation. It runs on two planes: a durable plane (the .story/ ledger, which survives every session) and an ephemeral plane (background agents that execute and then discard their context). Agents report; the orchestrator files. Nothing an agent discovers is real until it lands in the ledger.

Work is tiered by model strength:

  • pen is the session model. It owns the two gates that need judgment (plan review and byte-review), enriches items into full specs, and files ledger writes. One pen per repo.
  • hands is one tier below the pen. It implements the enriched specs.
  • inspector is the cheap tier, for mechanical checks and verification.

Enrichment is the prerequisite, not an optional polish step. Because weaker tiers execute, an item has to be a full spec (context, scope, acceptance, pitfalls) before it is dispatched, or the ambiguity becomes a downstream defect. Ships are per-item or batched, always with origin verification after push.

Why tier the work this way: keep the model that is good at judgment on the gates, and push the typing down to a cheaper, faster tier that executes an already-unambiguous spec. In our own use the effect was not a dramatic cost cut. What changed was the shape of the spending: the strong tier stopped carrying the bulk of the work, and usage rebalanced across tiers so each does the share that fits it. The gates are what make that safe: the plan is reviewed before code is written, and the exact diff is re-derived and reviewed before it ships.

Multi-lens review, rebuilt on @storybloq/lenses

The multi-lens review backend now runs on the @storybloq/lenses package end to end (source-available under the same noncommercial license). The previous in-tree fork (about 5,500 lines) is deleted, so there is a single implementation to maintain. Behavior changes you will notice:

  • 9 lenses. New this release is data-safety, which flags SQL, migrations, and schema changes.
  • Concurrency is a core lens. It always runs on code review (coverage-capped) instead of being optional.
  • Verdicts are computed by the package's merger pipeline, not an agent. There is no merger agent and no judge agent, so a review makes fewer model calls and comes back faster.
  • The judge is a deterministic three-value mapping: approve, approve-with-a-recommended-fix-round, or revise/reject. Convergence damping across rounds keeps review from thrashing on the same diff.
  • Evidence is byte-verified. Every finding's quoted evidence is checked against the reviewed diff before the verdict is computed. If the quote cannot be found in the diff, the finding is deferred instead of shipped, so reviews do not surface hallucinated line references.
  • Coverage semantics come from the package. If a core lens fails to cover part of the diff, the result is marked PARTIAL_RESULTS and the verdict is capped below approve rather than passing on incomplete coverage.

Community fixes

  • #15 - skip_ticket crashed the MCP server via an unhandled rejection. Fixed. Thanks @Huggyduggy for the sharp diagnosis.
  • #13 - issue phase, location, and order were invisible through MCP, and issue list had no phase filter. Both fixed. Thanks @j2webs.

Reliability

  • The MCP inbox watcher no longer strands events when macOS fs.watch misses a rename; a background sweep guarantees pickup.
  • Update banners and cache housekeeping no longer run inside git plumbing commands (merge driver output is byte-clean).
  • CLI error paths that previously exited 0 now exit nonzero (move, resolve, gc).

Upgrade

npm install -g @storybloq/storybloq@latest

No migration needed for solo projects. For teams: upgrade all CLIs first, then storybloq team init once per repo.