Development workflow orchestration for task-driven development with atomic commits, conventional commit messages, and systematic release processes. Enforces task traceability, branch discipline, smart test scope selection, and GitHub Actions integration. Use when committing code, creating releases, managing branches, or following contribution protocols. Triggers on commit operations, release preparation, or workflow compliance needs.
Install
npx skillscat add kryptobaseddev/cleo/ct-dev-workflow Install via the SkillsCat registry.
Development Workflow Context Injection
Opt-in unified-hook releases use the numbered vYYYY.MM.N-canary.N channel
through the normal release plan/open and OIDC workflow. The release-preparation
workflow accepts this channel explicitly; publication stays on canary and does
not advance to latest. Preserve registry retries and installed-package soak
checks. Stable promotion needs the separately retained, source-bound live harness
and hosted VidaPeps pilot evidence; missing or unavailable verification holds it.
The stable target may follow the canary base when npm has already advanced, but
every receipt must still bind to the exact canary and implementation digest.
Reject backward targets and prerelease targets; use the normal stable pipeline.
Before editing, inspect focus/briefing authority and coverage. Missing evidence
means UNKNOWN impact; current static coverage does not prove every runtime caller.
Task start, verification, completion, and handoff expose assessed coverage. Preserve
these limitations in PR and handoff claims, and recheck after source changes.
Use the repair matrix and sourced foreground resolutions; verify postconditions
and retain receipt recovery. Record actionable learning rather than empty traces.
Protocol: @src/protocols/contribution.md
Type: Context Injection (cleo-subagent)
Version: 3.0.0
Purpose
Context injection for development workflow tasks spawned via cleo-subagent. Provides domain expertise for atomic commits with task traceability, conventional commit messages, and systematic release processes.
Core Principle: Task-Driven Development
CRITICAL: NO code changes or commits without a tracked task.
Every commit MUST be traceable to a CLEO task. This ensures:
- Work is planned and tracked
- Changes are reviewable and reversible
- Progress is measurable
- Context is preserved for future agents
Immutable Constraints (WORKFLOW)
| ID | Rule | Enforcement |
|---|---|---|
| WF-001 | Task required | NO commits without CLEO task reference |
| WF-002 | Branch discipline | NO commits to main/master |
| WF-003 | Atomic commits | ONE logical change per commit |
| WF-004 | Conventional format | <type>(<scope>): <description> |
| WF-005 | Tests before push | Relevant tests MUST pass |
Git hook compatibility (T13349)
Init, upgrade and explicit Git hook installation share the ownership-aware installer.
Resolve the effective hook directory through Git, including core.hooksPath and
linked worktrees. Preserve foreign hooks and customized managed hooks; a CLEO
marker alone never authorizes replacement. Refresh only exact shipped legacy
bodies or receipt-owned content, using locked atomic writes and hash-guarded
rollback. Report conflicts with the suggested integration snippet.
Receipts and locks stay in Git-private common metadata, including whencore.hooksPath selects tracked files. Default installation preserves hook
paths inside the checkout. Use cleo init --git-hooks-only --allow-tracked-hooks-path only after
reviewing the tracked destination; this opt-in still preserves foreign and
customized hooks. Init warnings carry the exact opt-in command.
The pre-push wrapper spools Git stdin once for task IDs and shared project checks.
Besides Merge/Revert/fixup!/squash!/amend!, commit-msg and pre-push accept the exact
subject initial: cleo init (the empty commit cleo init makes so HEAD resolves; T13577),
only on a parentless first commit (T13582); a later commit with that subject, or any
longer or different subject, still needs a task ID. A template change adds the
previously shipped hash to legacy-hashes.json so installed copies refresh.
cleo init and cleo upgrade no longer seed the CleoOS hub (Pi extensions, CANT
workflows, justfile) into the global CLEO home (T13994, ADR-098); only the deprecatedcleo admin scaffold-hub still does.
It probes CLEO_PROJECT_HOOK_V1 before invoking the implemented CLI adapter;
missing or incompatible runners warn and allow. cleo hook run --probe -- execution
answers EXEC or INERT (older builds answer V1; stable builds before 2026.10.17 are
inert). Every ungated push, including a hooks-inert cleo first on PATH, prints one
pre-push stderr line WARNING: push NOT gated by project hooks: <reason>, flagging a
checkout whose activation is on (T13774). Verify nested checkout paths, linked
worktrees, custom hook paths, historical release bodies and corrupt receipts
with focused Git fixtures before changing this delivery path.
The fourth managed hook, post-merge (T14010), never blocks. In shell, before
starting anything, it requires the cleo.nexusReindexOnMerge git marker and
HEAD on the base branch; otherwise it starts no process. When both hold it
starts cleo nexus reindex-on-merge detached. That command runs one at a time
per project (.cleo/nexus-reindex.lock) at the lowest admission priority: it
never joins the cleo run queue, tries only when nothing is waiting, and
records deferred after nexus.reindexOnMerge.timeoutSeconds (300). Turn it
on or off with cleo nexus reindex-on-merge --enable / --disable.
Task Tracking Integration
Before Any Work
# 1. Verify you have a task
cleo current
# 2. If no task, find or create one
cleo find "relevant query"
cleo add "Task title" --description "What you're doing" --parent T001
cleo start T123
# 3. If 'cleo start' fails with E_SESSION_UNBOUND (spawned workers and
# subagents are already bound), bind first, then retry:
# cleo session start --scope global --name "<what you are doing>"
# (or: cleo session resume <id>)Commit Message Format
MUST include task reference:
<type>(<scope>): <description>
<body explaining why>
Task: T123
Co-Authored-By: Claude <noreply@anthropic.com>Example:
fix(auth): prevent token expiry race condition
The refresh token was being invalidated before the new access
token was validated, causing intermittent auth failures.
Task: T1456
Co-Authored-By: Claude <noreply@anthropic.com>Branch & Subagent Awareness
Single Branch Reality
Subagents share the parent session's branch. This means:
- All work happens on the same branch
- No parallel feature branches from subagents
- Commits are sequential, not parallel
- Worktrees needed for true branch isolation
Branch Strategy
# Check current branch
git branch --show-current
# Feature work (typical pattern)
main → feature/T123-description → PR → main
# Branch naming
feature/T123-auth-improvements # Task-prefixed
fix/T456-token-validation # Bug fixGate System (Simplified)
Not all gates apply to all changes. Follow the decision matrix. Required gates also follow the task's evidence kind (verification.requiredGatesByKind): research and documentation tasks owe the required gates without testsPassed/qaPassed until their work touches any non-document path, which restores the full code gates.
G0: Pre-Flight Check
Always required.
# 1. Verify task context
cleo current
# MUST have a current task
# 2. Check branch
git branch --show-current
# MUST NOT be main/master
# 3. Check for uncommitted work
git status --porcelain
# Review staged/unstaged changesG1: Classify Change
| Type | Description | Tests Needed | Version Bump |
|---|---|---|---|
feat |
New feature | Related tests | MINOR |
fix |
Bug fix | Regression test | PATCH |
docs |
Documentation | None | None |
refactor |
Code restructure | Affected tests | PATCH |
test |
Test additions | The new tests | None |
chore |
Maintenance | None | None |
perf |
Performance | Perf tests | PATCH |
security |
Security fix | Security tests | PATCH |
G2: Testing (Smart Scope)
NOT always full test suite. CI runs full tests on push.
| Change Type | Test Scope | Command |
|---|---|---|
feat |
Related module tests | bats tests/unit/feature.bats |
fix |
Regression + affected | bats tests/unit/affected.bats |
docs |
None (CI validates) | Skip |
refactor |
Affected modules | bats tests/unit/module*.bats |
test |
The new tests only | bats tests/unit/new.bats |
chore |
Syntax check only | bash -n scripts/*.sh |
When to run full suite locally:
- Before release (version bump)
- Major refactoring
- Cross-cutting changes
- User explicitly requests
# Full suite (when needed)
./tests/run-all-tests.sh
# Targeted tests (typical)
bats tests/unit/specific-feature.bats
bats tests/integration/workflow.bats
# Quick syntax check
bash -n scripts/*.sh lib/*.shG3: Commit
# 1. Get task info
task_id=$(cleo current --quiet)
# 2. Stage changes (be specific for atomic commits)
git add scripts/specific-file.sh lib/related.sh
# 3. Create commit with task reference
git commit -m "$(cat <<'EOF'
fix(auth): prevent token expiry race condition
The refresh token was being invalidated before validation.
Task: T1456
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"G4: Push (Triggers CI)
# Push branch (CI runs full tests)
git push origin HEAD
# CI will run:
# - Full test suite
# - ShellCheck linting
# - JSON validation
# - Documentation drift check
# - Installation testG5: Version Bump (Release Only)
Only for releases, not every commit.
# 1. Preview
./dev/bump-version.sh --dry-run patch
# 2. Execute
./dev/bump-version.sh patch
# 3. Validate
./dev/validate-version.sh
# 4. Reinstall locally
./install.sh --force
cleo versionG6: Tag & Release
GitHub Actions handles release creation.
# 1. Create annotated tag
git tag -a v${VERSION} -m "${TYPE}: ${SUMMARY}"
# 2. Push tag (triggers release workflow)
git push origin v${VERSION}
# 3. Push branch
git push origin HEAD
# GitHub Actions automatically:
# - Builds release tarball
# - Creates GitHub Release
# - Generates release notes
# - Uploads artifactsRelease preflight (release-prepare.yml). cleo release open <version>
checks main's HEAD SHA and dispatches with skip-tests=true when the ci.yml
push run for that SHA, or for an ancestor reached only through release-plan
commits (the plan file, changesets, CHANGELOG; T13140), is green AND ran every
Linux Unit Tests shard green (a docs-only push that skipped the tests does
not count). It sets skip-macos-tests=true when the newest completed nightly
or macos-main.yml (main-push, never cancelled mid-run, pending pushes coalesce;
T13143, T13187) run with macOS jobs for
one of those commits is green. A ci.yml push run still queued or in progress
is polled for up to 10 minutes first (T13823). The SHA travels asverified-sha and the proving run's id as reused-ci-run; the workflow
ignores the skips if it checks out another commit or verified-sha is empty,
and re-reads the reused run from the API (push to main, success, every Linux
shard green, same tree: the exact commit, or one it extends only by
whole-path-allowlisted plan, changeset .md and CHANGELOG.md files; T13825)
before it skips the Linux shards, naming the run in the
summary and the bump-PR body. Otherwise the 8 Linux and 8 macOS test shards run, and the reason names
the newest main commit that has a green macOS run. The decision is in the run
summary.
Bump-PR merge. Its pull_request runs stay action_required (no GitHub
App), so the orchestrator admin-merges once the dispatched CI run on the PR
head SHA is green: gh pr merge <n> --admin --merge — seedocs/release/merge-queue-runbook.md.
Quick Decision Matrix
What Tests to Run?
| Change | Local Tests | Rely on CI |
|---|---|---|
| Single file fix | Related unit test | Yes |
| New feature | Feature tests | Yes |
| Docs only | None | Yes |
| Schema change | Schema tests | Yes |
| Cross-cutting refactor | Full suite | Yes |
| Release prep | Full suite | Yes |
Do I Need a Version Bump?
| Change | Bump | Tag |
|---|---|---|
feat |
minor | Yes |
fix |
patch | Yes |
docs |
No | No |
refactor |
patch | Yes |
test |
No | No |
chore |
No | No |
perf |
patch | Yes |
security |
patch | Yes |
Task System Integration
@skills/_shared/task-system-integration.md
CLEO Integration Commands
# Task lifecycle
cleo current # Current task
cleo start T123 # Start task (on E_SESSION_UNBOUND: bind a session, see above)
cleo complete T123 # Mark done
# Find existing work
cleo find "query" # Search tasks
cleo list --status pending # Pending work
# Create new work
cleo add "Title" --parent T001 --description "..."
# Session management
cleo session status # Current session
cleo session end --note "Completed X, Y, Z"Subagent Protocol
@skills/_shared/subagent-protocol-base.md
Output Requirements
- MUST record workflow summary with
cleo docs add {{TASK_ID}} --content - --type note --slug {{TOPIC_SLUG}}(never a raw file under.cleo/agent-outputs/) - MUST record ONE manifest entry:
cleo manifest append --entry '<entry JSON>'(the flat manifest file is retired, ADR-027) - MUST return ONLY: "Workflow complete. Manifest appended to pipeline_manifest."
- MUST NOT return full commit/release details in response
Complete Workflow Examples
Example 1: Bug Fix (Typical)
# 1. Verify task
cleo current
# Output: T1456 - Fix token validation
# 2. Make changes
# ... edit files ...
# 3. Run relevant test
bats tests/unit/auth.bats
# 4. Stage specific files
git add lib/auth.sh scripts/login.sh
# 5. Commit with task
git commit -m "$(cat <<'EOF'
fix(auth): prevent token expiry race condition
Task: T1456
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"
# 6. Push (CI handles full tests)
git push origin HEAD
# 7. Mark task complete
cleo complete T1456Example 2: Documentation Only
# 1. Verify task
cleo current # T1550 - Update README
# 2. Make doc changes
# ... edit docs ...
# 3. No tests needed (CI validates)
# 4. Commit
git add docs/ README.md
git commit -m "$(cat <<'EOF'
docs: update installation instructions
Task: T1550
Co-Authored-By: Claude <noreply@anthropic.com>
EOF
)"
# 5. Push
git push origin HEAD
# 6. Complete
cleo complete T1550Anti-Patterns
| Pattern | Problem | Solution |
|---|---|---|
| No task reference | Untracked work | Create/find task first |
| Committing to main | Bypass review | Use feature branches |
| Running full tests always | Slow iteration | Use smart test scope |
| Skipping CI | Missing validations | Always push, let CI run |
| Manual release creation | Inconsistent releases | Use tag, GH Actions |
| Giant commits | Hard to review/revert | Atomic commits |
| Vague commit messages | Lost context | Conventional + task ref |
Critical Rules Summary
- Always have a task before making changes
- Always include task reference in commit message
- Never commit to main/master directly
- Run relevant tests locally, not always full suite
- Let CI validate with full test suite on push
- Use tags for releases - GitHub Actions handles the rest
- One logical change per commit (atomic)
- Conventional commit format with task reference
Shared project hooks and managed Git delivery
Provider delivery receives canonical SDK file reads and Git discovery through a contracts port.
Adapters do not acquire a runtime dependency on core for these utilities.
CLEO's own harness hooks are separate from project hooks: cleo hook heavy-command
(PreToolUse), cleo hook stop (Stop; it runs ask-enforce) and, for Claude Code, cleo hook session-end
(SessionEnd) and cleo hook subagent-start (SubagentStart, the ct-lean rules for Agent-tool subagents) are installed together bycleo init/cleo upgrade or cleo doctor heavy-command-hook --fix, and fail open.
Project business rules live in tracked .cleo/hooks.json; generated provider entries
are delivery outputs. hooks-v1 was promoted in v2026.10.17 and is released in source
(T13776), so every build activates and runs project hooks. The release gate
(core/src/hooks/release-gate.ts, T13557) stays for a future hook feature: while one is
unreleased, cleo hook sync --activate refuses with E_HOOKS_V1_UNRELEASED and existing
receipts report unreleased and never run. Preview with cleo hook sync --dry-run; explicit local activation
uses cleo hook sync --activate and binds definitions, handlers and dependencies to
current hashes. Source drift requires reactivation and runs no handler: Git, worktree, direct
and CI refuse (naming cleo hook sync --activate) every event bound by the approved bindings
recorded at activation, the current manifest or a linked checkout's, so a deleted, rebound or
unparseable definition, or a deleted handler or dependency, stays enforced; unbound events
run no hooks (a pre-bindings activation refuses them too), and agents only warn (T13742). Agent project checks are advisory; Git applies project verdicts. Native harness trust remains separately unverified.
Inspect with cleo doctor hooks; --fix never activates definitions or grants trust.cleo hook sync --disable disables execution and removes only verified managed entries:
it skips providers with no delivery receipt, creates nothing, prunes only containers
activation created, deletes a provider config (and its directory) that activation created
once it is empty, and deletes the receipt (T13743).
CI uses cleo hook check <id> --ci --candidate <sha> or an explicit JSON --input file;
CLEO infrastructure failure is an unavailable check, never successful CI evidence.
Launcher faults allow locally regardless of checker error policy. File inputs and
provider records use bounded regular-file reads; FIFOs are rejected. Unsupported
provider bindings remain unsupported in delivery summaries, including mixed bindings.
The Stop event has ONE CLEO entry per provider, cleo hook stop --provider claude-code|codex
(T13796), in order goal tick → ask-enforce. Stop fires at every turn end, so it NEVER ends the CLEO
session (T13913): ending there deleted the terminal binding every turn. Claude Code's SessionEnd
hook (cleo hook session-end, always installed) runs cleo session end --quiet detached, waited for
at most 20 s; Codex has no session-end event, so its sessions end explicitly. The goal runtime goes first, only when.opencode/goals/ exists (CLEO_GOAL_TICK_COMMAND, default ocg tick, Stop JSON on stdin,
JSON-only stdout, at most 60 s, its process group SIGKILLed at the deadline): a block is
re-serialised as exactly {decision, reason} (reason capped) and skips the rest. Otherwise
ask-enforce (T13420) answers. Every step fails open (missing, failing or timed-out tick;
ask-enforce error); CLEO_GOAL_TICK=off skips the tick; CLEO_ASK_ENFORCE=off or heavy-command
mode off (CLEO_HEAVY_COMMAND_HOOK / resources.heavyCommandHook, read at run time) skips the
ask check, as they removed its separate hook before.
Sync folds the separate ask-enforce and old session-end Stop entries into it in place; Codex's
rides the heavy-command mode, Claude Code's always stays. cleo doctor heavy-command-hook
reports the hook outdated when the Stop, SessionEnd or SubagentStart entry is missing or was
written by another build (a binary updated without a re-sync, T13960); --fix re-syncs them.cleo self-update re-syncs only the project it runs in.
Init, upgrade and inspection share the commit-msg, pre-commit and pre-push installer.
Git determines effective hooksPath and the common directory, including linked worktrees.
Exact known template hashes or local receipts authorize refresh; a marker alone does
not. Customized and foreign hooks are preserved even on forced refresh and report an
integration snippet. Rollback is guarded by the installed-content hash.