Dave b09b6ce4f1 fix(agents): enforce single-instance concurrency per agent name
The agent pool allowed the same agent (e.g. "qa") to run concurrently
on multiple stories because start_agent() only checked whether that
story+agent combo was already active. It did not check whether the
agent was busy on a different story.

Two concurrent QA runs each spawn cargo clippy + cargo test + vitest,
causing extreme CPU load (load average >33 on M1 Mac).

Fix: before registering a new agent as Pending, scan all active entries
for any Running or Pending entry with the same agent_name. If one is
found, return an error explaining that the story will be picked up when
the agent becomes available.

The existing auto_assign_available_work() mechanism already scans
pipeline directories (3_qa/, 4_merge/, etc.) for unassigned stories
and uses find_free_agent_for_stage() — which respects single-instance
limits — to assign work when an agent slot opens up. So the queuing
behaviour is naturally provided: the story stays in its directory,
and auto-assign picks it up when the previous run completes.

Adds two regression tests:
- start_agent_rejects_when_same_agent_already_running_on_another_story
- start_agent_allows_new_story_when_previous_run_is_completed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 20:46:51 +00:00
2026-02-23 11:23:08 +00:00
2026-02-23 11:23:08 +00:00

Living Spec Standalone (Web Server Binary)

This app runs as a single Rust web server binary that serves the Vite/React frontend and exposes APIs. The frontend lives in the frontend/ directory.

You can also run the frontend and backend separately in development (Vite dev server + Rust API).

Running it in development

# Build the frontend
cd frontend
pnpm install 
pnpm dev

# Run the server (serves embedded frontend/dist/)
cargo run

Production

# Build the release binary (also builds the frontend via build.rs)
cargo build --release

# Run the server (serves embedded frontend/dist/)
./target/release/story-kit-server

Cross-Platform Distribution

Story Kit ships as a single self-contained binary with the React frontend embedded via rust-embed. No Rust toolchain, Node.js, or extra libraries are required on the target machine.

macOS

# Native build  no extra tools required beyond Rust + pnpm
make build-macos
# Output: target/release/story-kit-server

# Verify only system frameworks are linked (Security.framework, libSystem.B.dylib, etc.)
otool -L target/release/story-kit-server

Linux (static x86_64, zero dynamic deps)

The Linux build uses the x86_64-unknown-linux-musl target to produce a fully static binary.

Prerequisites:

# Install cross  a Rust cross-compilation tool backed by Docker
cargo install cross

# Ensure Docker Desktop (or Docker Engine) is running

Build:

make build-linux
# Output: target/x86_64-unknown-linux-musl/release/story-kit-server

# Verify the binary is statically linked
file target/x86_64-unknown-linux-musl/release/story-kit-server
# Expected: ELF 64-bit LSB executable, x86-64, statically linked

ldd target/x86_64-unknown-linux-musl/release/story-kit-server
# Expected: not a dynamic executable

Running on any Linux x86_64 machine:

# No Rust, Node, glibc, or any other library needed  just copy and run
./story-kit-server

Testing

Frontend Tests

The frontend uses Vitest for unit tests and Playwright for end-to-end tests.

cd frontend

# Run unit tests
pnpm test

# Run end-to-end tests
pnpm test:e2e

Backend Tests

This project uses nextest for running tests and cargo-llvm-cov for code coverage.

Install Tools

cargo install cargo-nextest cargo-llvm-cov

Run Tests

# Run all tests
cargo nextest run

# Run specific module
cargo nextest run search_files

# Run with verbose output
cargo nextest run --no-capture

Generate Coverage

# HTML report (opens in browser)
cargo llvm-cov nextest --html --open

# Terminal output
cargo llvm-cov nextest

# LCOV format (for CI)
cargo llvm-cov nextest --lcov --output-path lcov.info

# Clean coverage data
cargo llvm-cov clean

Configuration

  • Nextest config: .config/nextest.toml
  • Coverage output: target/llvm-cov/html/index.html

Current Coverage (search_files module)

Module: commands/search.rs
├── Region Coverage:   75.36%
├── Function Coverage: 69.05%
└── Line Coverage:     72.55%

Available Test Profiles

# Development (default)
cargo nextest run

# CI with retries
cargo nextest run --profile ci

# Coverage optimized
cargo nextest run --profile coverage
Description
No description provided
Readme 9.3 MiB
v0.4.1 Latest
2026-03-20 12:58:04 +00:00
Languages
Rust 79.9%
TypeScript 19%
Shell 0.6%
Dockerfile 0.3%
CSS 0.2%