03ccbfe4eec5a2479fb8099773b6f23a84438e52
Across ~12 delegated units, more than half reported a green suite the supervisor's own re-run contradicted. --gate removes the trust step: after the sub-session exits, mm-worktree-task re-runs the gate against the agent's LAST commit and appends the real verdict, flagging a MISMATCH when the agent's own report claimed a pass. Supervisor-verified: 45 pass / 1 fail on the branch vs 28 pass / 1 fail on main — the single failure is pre-existing (a date-window flake in the --docs recent fixture), confirmed by running main myself rather than accepting the claim. Forcing the verdict to PASSED unconditionally drives failures 1 -> 6, so the new assertions bite. The unit found a real defect en route: 'timeout -k 5 n bash -c' only signals the immediate wrapper, so any grandchildren the gate forks are reparented and run unbounded. Fixed with setsid + signalling the whole process group. Claude-Session: https://claude.ai/code/session_014KNyfHmHpMbdMrHZXDRkAp
small-scripts
A collection of small, standalone utility scripts for daily use. Scripts are symlinked into ~/sbin for PATH availability.
Approach
This project uses spec-driven development (OpenSpec) as a testbed for agent-driven development and refinement:
- Every script starts with a spec in
specs/ - Every script supports
--dryrunto preview actions without side effects - Every script has a test in
tests/that validates dryrun behaviour against the spec
Scripts
| Script | Purpose | Status |
|---|---|---|
check-skills |
Verify Claude Code skill symlinks match source repo | Done |
claude-profile |
Claude Code profile + engagement-mode launcher | Done |
claude-tmux |
Spawn a detached tmux Claude Code session with Remote Control, named after a project (wraps claude-profile) |
Done |
gen-secret |
Generate bash/YAML/JSON-safe random strings | Done |
git-identity |
Switch git user.name/email from a saved identity menu (~/.git-identities) |
Done |
git-status-report |
Recursive git repo status with diff stats | Done |
md-to-docx |
Markdown to DOCX conversion | Done |
mm-worktree-task |
Launch a MiniMax M3 implementation sub-session in an isolated git worktree, prompt assembled from a planner work item | Done |
review-loop-run |
Launch/track detached MiniMax reviews of /review-loop artefacts (verify, plan, spec, tests, code) from per-kind prompt templates; counts gates on CRITICAL/HIGH |
Done |
mp3-to-mp4 |
Convert MP3 to MP4 with a static title card | Done |
split-wezterm |
Split WezTerm pane into a rows × cols grid | Done |
sync-repos |
Mirror git repos across remotes | Done |
unreflected-logs |
Scan projects for unreflected session logs | Done |
validate-skill |
Validate SKILL.md files against known Claude Code restrictions | Done |
semver-ci |
Compute MAJOR.MINOR.PATCH.BUILD from commit-message tokens, maintain VERSION.md, and (on main) tag/push/create a Gitea release — see docs/semver-ci.md and template at templates/gitea-workflow-version.yml |
Done |
wait-for-release |
Poll a Gitea repo's releases until a glob pattern matches or a timeout expires (default 600s) | Done |
wait-for-version |
Poll a Gitea repo's Actions runs until the named CI workflow completes on HEAD of main, then print the latest release tag — solves the push-then-update race condition for semver dependencies | Done |
Engagement modes (claude-profile)
claude-profile launches Claude Code with both a configuration profile (selecting which ~/.claude-* directory to use) and an engagement mode that bundles a driver model, subagent policy, async tolerance, and workflow stance:
| Mode | Driver | For |
|---|---|---|
chat |
Haiku | No project, just conversation |
quick |
Sonnet | Single small focused job, fully synchronous |
deep |
Sonnet (Opus via named workflows) | Hard design or debugging, plan + spec enforced |
hybrid |
Haiku (Opus/Sonnet on demand) | Long sessions, escalates only when needed |
orch |
Sonnet | Decompose work and dispatch container agents |
Mode definitions live in data/claude-profile/modes/<name>.md — YAML frontmatter (machine-parsed) plus a markdown body that becomes part of the system prompt.
claude-profile # interactive picker
claude-profile oreillyit --mode deep # explicit profile + mode
claude-profile --preset deep-cluster # named preset from presets.yaml
claude-profile --dryrun [...] # show resolved values, do not launch
Copy data/claude-profile/presets.yaml.example to $CLAUDE_CONFIG_DIR/presets.yaml to set up named presets.
Repository Structure
small-scripts/
├── scripts/ # Executable scripts (symlinked into ~/sbin)
├── specs/ # OpenSpec files, one per script
├── tests/ # Test scripts that exercise --dryrun
├── data/ # Read-only data files used by scripts
│ └── claude-profile/
│ ├── modes/ # Engagement mode definitions
│ └── presets.yaml.example
└── memory/ # Tiered memory topic files
Quick Start
# Run all tests
./tests/run-all.sh
# Symlink a script into ~/sbin
ln -sf "$(pwd)/scripts/<name>" ~/sbin/<name>
Milestones
| # | Description | Status |
|---|---|---|
| M1 | Project setup, first script | In progress |
Description
Languages
Shell
73%
Python
27%