Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/mostashraf/ai-sdlc-harness/dev-workflownpx skills add MostAshraf/ai-sdlc-harness --skill dev-workflowgit clone --depth 1 https://github.com/MostAshraf/ai-sdlc-harnessWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/mostashraf/ai-sdlc-harness/dev-workflow)<a href="https://agentmods.dev/skills/mostashraf/ai-sdlc-harness/dev-workflow"><img src="https://agentmods.dev/badge/skills/mostashraf/ai-sdlc-harness/dev-workflow.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00053 | $0.03352 |
| Opus 5 | $0.00026 | $0.01676 |
| Sonnet 5 | $0.00011 | $0.00670 |
| Haiku 4.5 | $0.00005 | $0.00335 |
Grade A, and why
dev-workflow scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 199 lines — stays where its author put it; the contents beside it link to each section on GitHub.
dev-workflow — the thin orchestrator walker
You are the orchestrator: a coordinator, not an implementer. You never
write code, never touch ai/<run>/ authority files directly, and never run
raw git commit|merge|rebase — every mutation goes through harness
(guards block the raw paths and redirect you here).
Every command below runs through ${CLAUDE_PLUGIN_ROOT}/bin/harness — a
wrapper script that resolves the plugin venv (created by /init-workspace,
either OS layout) and falls back to system python3/python pre-setup;
it runs under Git Bash on Windows too. --workspace <ws> and
--run <run> may go before or after the verb, in any mix — e.g. both
harness --workspace <ws> --run <run> <verb> … and
harness <verb> --workspace <ws> --run <run> … work. Always use the full
${CLAUDE_PLUGIN_ROOT} path; a bare harness is not on PATH, and shell
variables do not persist between separate Bash calls. Non-zero exit =
refused; read the JSON error.
Startup
${CLAUDE_PLUGIN_ROOT}/bin/harness fetch --id <work-item-id>— refuses if bootstrap is incomplete (run/init-workspacefirst) or a live run already exists (offer the user Resume or Abort — never clobber). Abort is a real verb:${CLAUDE_PLUGIN_ROOT}/bin/harness abort --run <run> --reason "<why>"— terminal (mutations refuse from then on), sweeps worktrees, keeps the audit trail, and releases the work-item slot so a fresh fetch works. On success noterun,mode.- The pipeline manifest (
${CLAUDE_PLUGIN_ROOT}/pipeline/manifest.yaml) is the single source of truth for step order. Do not improvise steps.
The walk
Loop until the mode's sequence is exhausted, then close the run:
${CLAUDE_PLUGIN_ROOT}/bin/harness complete --run <run> (terminal, the
successful sibling of abort — the final step's file says exactly when).
${CLAUDE_PLUGIN_ROOT}/bin/harness show --run <run>→ current step, mode, tasks, gates. It also returnsnext_steps(the engine-legal cursor moves right now, the same{step: reason}setcursor --tovalidates against),derived(ledger-freshverdict_boundoutcomes that the persistedstate.artifactscache hasn't caught up to yet — e.g. a plan-review already APPROVED in the ledger shows{"plan-review.outcome": "approved"}here whilestatestill readspending), andprobe_error(nullnormally; a non-null value is the engine's own reason there is no legal move yet — a seal-valid but malformed state, awhenpredicate needing an artifact this step still produces, or a corrupt ledger — so an emptynext_stepsis never mistaken for "wedged" (a fail-closed verdict window is NOT one of these: the walk completes and returns{}withprobe_errornull). These are a read-only compass, not a substitute for the step contract: the step file (2) remains the instruction authority for what to actually do.- Read the step's file:
${CLAUDE_PLUGIN_ROOT}/skills/dev-workflow/steps/<step>.md— load ONE step file at a time (context economy). Gate steps all usesteps/gate.md. - Execute it. Spawning a shape? The prompt MUST carry the structured headers
(
harness-mode,harness-task,harness-run,harness-repo,harness-test-cmd,harness-plugin-root). Agent identity: step text says "Spawnreviewer" — that's the shape word; pass the agent's frontmatter name (ai-sdlc-reviewer), not a generic agent. Seeshared/spawn-identity.mdfor the mapping and the reason a wrong identity silently disables governance. The spawn guard now BLOCKS a harness-headed spawn that uses a non-harness agent type. Enforcement, precisely: the spawn guard BLOCKS a harness-shape spawn missingharness-mode, and one missingharness-runwhenever the spawn is legalized by a run's current step (the header must name THAT run). The remaining headers are capture conventions —harness-taskattributes the token ledger and reviewer verdicts (a per-task review whose spawn omits it cannot satisfy the task's completion guard),harness-repo/harness-test-cmdscope the subagent's work,harness-plugin-rootpasses the resolved plugin install path (agents use it as$PLUGIN_ROOTto open instruction files and runbin/harness— the token must NOT be${CLAUDE_PLUGIN_ROOT}because Qwen'stemplateStringscans agent bodies for braced tokens and rejects unknown keys at spawn). Before every spawn, resolve its model:${CLAUDE_PLUGIN_ROOT}/bin/harness resolve-model --shape <shape> --mode <mode>(per-mode ?? per-shape default ??inherit, fromsubagent_models). Pass the result as the spawn'smodelparam — unless it's the literal stringinherit, in which case omit themodelparam entirely so the subagent runs on the session model. If the resolve-model result carries anoticekey, relay its text to the user verbatim the FIRST time it appears in this run; it repeats on every resolve and needn't be repeated. Background or foreground — both are captured: where the Agent tool hasrun_in_background,trueandfalseare equally legal; where it defaults spawns to background or has no such parameter, the spawn returns a launch STUB in place of the reply. On a stub: WAIT for its completion notification, do not proceed on the stub, and do notstall(show'soutstanding_spawnsnames every spawn still in flight — the Stalls triage below starts there, not at the events tail). Read the verdict from the LEDGER (show, or the cursor/task gate refusing) — never from reply text. One live spawn per (task, mode): the guard refuses a second while the first is unreported; different tasks and modes stay parallel, panel lenses (plan-attack) are exempt, and batching spawns in ONE message still runs them concurrently.harness-taskmust name a task the run registered — the guard blocks a typo at the spawn. Task dispatch indevelopis DAG-DRIVEN, not lane-ordered:ready-tasksnames every task whosedepends_onis satisfied and they all go out together (steps/ develop.md owns the loop). - Advance:
${CLAUDE_PLUGIN_ROOT}/bin/harness cursor --to <next> --run <run>. If refused, you are off-manifest — re-readshowand correct course; never force. A refusal that reports waiting for the run lock, or aMergePreconditionErrornaming this run'sai/<run>paths or feature branch, is not off-manifest at all: a sibling lane is mid-flight. Wait for its completion notification and re-run the IDENTICAL command — never stash, never hand-commit, never conclude a git operation the message did not name. If the refusal isverdict_bound(a reviewer verdict was not captured), the only sanctioned recovery is to re-spawn the reviewer for that mode — correct agent identity (ai-sdlc-reviewer), full headers, spawned per (3) — and let the hook capture it. Never writereviews.ndjsonor any ledger directly, never synthesize a capture-hook payload (they are platform-fired; a synthetic payload forges evidence), and never force the cursor. If a second correctly-formed spawn still yields no verdict, stop and report to the user with the run path and what was attempted — a broken capture is a bug to surface, not to route around.
What ships with it
33 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
- shared/diagram-styling.md 3.2 KB
- shared/engineering.md 853 B
- shared/spawn-identity.md 1.6 KB
- shared/status-block.md 2.3 KB
- steps/analyze-comments.md 1.8 KB
- steps/apply-fixes.md 1.8 KB
- steps/comment-analysis.md 555 B
- steps/confirm-repo.md 3.6 KB
- steps/create-pr.md 2.3 KB
- steps/develop-task.md 3.5 KB
- steps/develop.md 11 KB
- steps/fetch.md 2.6 KB
- steps/fixup-task.md 674 B
- steps/gate.md 5.5 KB
- steps/harden-task.md 664 B
- steps/harden.md 2.5 KB
- steps/intake.md 3.8 KB
- steps/metrics.md 910 B
- steps/plan-attack-task.md 3.3 KB
- steps/plan-review-task.md 7.6 KB
- steps/plan-review.md 8.2 KB
- steps/plan-task.md 11 KB
- steps/plan.md 11 KB
- steps/pre-pr-fixes.md 879 B
- steps/pre-pr-review.md 1.0 KB
- steps/pre-pr.md 1.2 KB
- steps/preflight.md 5.5 KB
- steps/quick-recheck.md 600 B
- steps/reconcile.md 1.1 KB
- steps/repo-map-task.md 2.3 KB
- steps/review-task.md 2.2 KB
- steps/security.md 936 B
- steps/triage-request.md 721 B
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago First seen · 199 lines · 53 tokens per session scan A e576c74e87a7
dev-workflow is a skill published in the GitHub repository MostAshraf/ai-sdlc-harness (18 stars, last pushed 7d ago), licensed MIT. It adds 53 tokens to every session and 3,352 once invoked, about $0.0003 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
live-bugbash
Safe-by-default Symphony for Trello bug bash. Uses fake Trello, fake Codex, and fake/local GitHub unless explicitly asked for a real live bug bash; the phrase "hardened host" enables run-scoped danger-full-access and Codex dangerous-bypass coverage. Covers SPEC.md conformance, installers, CLI options, workflow…
java-optionals-eval-capture
Use in Symphony for Trello when a Java change or review presents a reusable Optional or absence/fallback strategy-selection lesson, including on an adjacent owning API such as ScopedValue even when no java.util.Optional appears. Capture the before/prompt/after code and create or update a self-contained eval issue in…
java-streams-eval-capture
Use in Symphony for Trello when a Java change or review presents a reusable lesson about choosing or preserving a stream, collector, direct result-producing collection transformation, or character-predicate traversal, including identity or delimited string reductions, even when the preferred final code contains no…
push-pr
Push a branch and create or update the matching GitHub pull request. Use when publishing work, updating a PR, or preparing a branch for human review.
trello-handoff
Move the current Trello card through the configured Symphony-for-Trello lifecycle. Use when picking up work, handing off for human review, marking a blocker, or completing a merge.
publish-bugbash-issues
Explicit-only publisher for reviewed live-bugbash issue drafts. Creates new GitHub issues for unique confirmed findings and comments on duplicate issues with sanitized reproduction details. Never runs the bug bash.