| name | runs-derive |
| description | Grep/wc replacement for .runs artifacts. Use for: count, extract, Machine Summary, receipt reading, marker counts. Null-safe counting (REQ/NFR/QID/RSK markers), YAML block parsing, BDD scenario counting. Deterministic read-only - no judgment. Use when cleanup agents need mechanical counts/extraction. Invoke via bash .claude/scripts/demoswarm.sh. |
| allowed-tools | Bash, Read |
Runs Derive Skill
Read-only, deterministic helpers for .runs/ derivation. Use when cleanup agents need mechanical counts/extraction without interpretation.
Invocation
Always invoke via the shim:
bash .claude/scripts/demoswarm.sh <command> [options]
The shim resolves implementation in order:
.demoswarm/bin/demoswarm (Rust binary, preferred)
demoswarm on PATH (global install)
cargo run fallback (dev environments)
- Python fallback (legacy)
Do not set PATH or call helpers directly. The shim handles resolution.
Operating Invariants
Repo root only
- Assume working directory is repo root.
- All paths are repo-root-relative.
Null over guess (counts)
- File/dir missing →
null (NOT 0)
- Present but no matches →
0
- Present but unparseable / tool error →
null
No writes
This skill only reads. Index updates use runs-index. Secrets use secrets-tools.
Command Reference
| Command | Purpose |
|---|
count pattern | Count lines matching regex in a file |
count bdd | Count BDD scenarios in feature files |
ms get | Extract field from Machine Summary block |
yaml get | Extract field from fenced YAML block |
yaml count-items | Count items in YAML block |
inv get | Extract inventory marker value |
line get | Extract value from line with prefix |
receipts count | Count prior flow receipts in run dir |
receipt get | Read field from receipt JSON |
openapi count-paths | Count paths in OpenAPI YAML |
time now | Get current UTC timestamp |
Quick Examples
Counting patterns (stable markers)
bash .claude/scripts/demoswarm.sh count pattern \
--file ".runs/feat-auth/signal/requirements.md" \
--regex '^### REQ-' \
--null-if-missing
bash .claude/scripts/demoswarm.sh count pattern \
--file ".runs/feat-auth/signal/requirements.md" \
--regex '^### NFR-' \
--null-if-missing
bash .claude/scripts/demoswarm.sh count bdd \
--dir ".runs/feat-auth/signal/features" \
--null-if-missing
bash .claude/scripts/demoswarm.sh count pattern \
--file ".runs/feat-auth/signal/open_questions.md" \
--regex '^- QID: OQ-SIG-[0-9]{3}' \
--null-if-missing
bash .claude/scripts/demoswarm.sh count pattern \
--file ".runs/feat-auth/signal/early_risks.md" \
--regex '^- RSK-[0-9]+ \[CRITICAL\]' \
--null-if-missing
Extracting Machine Summary fields
bash .claude/scripts/demoswarm.sh ms get \
--file ".runs/feat-auth/signal/requirements_critique.md" \
--section "## Machine Summary" \
--key "status" \
--null-if-missing
bash .claude/scripts/demoswarm.sh ms get \
--file ".runs/feat-auth/build/code_critique.md" \
--section "## Machine Summary" \
--key "recommended_action" \
--null-if-missing
Reading receipt fields
bash .claude/scripts/demoswarm.sh receipt get \
--file ".runs/feat-auth/gate/gate_receipt.json" \
--key "merge_verdict" \
--null-if-missing
bash .claude/scripts/demoswarm.sh receipt get \
--file ".runs/feat-auth/plan/plan_receipt.json" \
--key "status" \
--null-if-missing
Extracting YAML block fields
bash .claude/scripts/demoswarm.sh yaml get \
--file ".runs/feat-auth/deploy/deployment_decision.md" \
--key "deployment_verdict" \
--null-if-missing
bash .claude/scripts/demoswarm.sh yaml get \
--file ".runs/feat-auth/gate/merge_decision.md" \
--key "status" \
--null-if-missing
Counting items in YAML blocks
bash .claude/scripts/demoswarm.sh yaml count-items \
--file ".runs/feat-auth/gate/merge_decision.md" \
--item-regex '^[[:space:]]*- check:' \
--null-if-missing
Timestamp generation
bash .claude/scripts/demoswarm.sh time now
Contract Rules
- stdout: Always a single scalar (
null, integer, or string)
- exit code: Always
0 (errors expressed via null stdout)
- stderr: Optional diagnostics (never required for parsing)
- null semantics: Missing file →
null, no matches → 0
- template leak guard: Values containing
| or < → null
For Agent Authors
When writing cleanup agents:
- Use
runs-derive — bash .claude/scripts/demoswarm.sh ...
- Do not embed
grep|sed|awk|jq pipelines — use shim commands
- Trust the contract — helpers handle edge cases consistently
- Add blockers for nulls — when a count is null, explain why
Example pattern:
REQ_COUNT=$(bash .claude/scripts/demoswarm.sh count pattern \
--file ".runs/${RUN_ID}/signal/requirements.md" \
--regex '^### REQ-' \
--null-if-missing)
if [[ "$REQ_COUNT" == "null" ]]; then
BLOCKERS+=("requirements.md missing or unparseable")
fi
Installation
The Rust implementation is preferred. Install to repo-local directory:
cargo install --path tools/demoswarm-runs-tools --root .demoswarm
The shim will automatically resolve in order:
.demoswarm/bin/demoswarm (repo-local install, preferred)
demoswarm on PATH (global install)
cargo run fallback (dev environments)
- Python fallback (legacy)