Coding Quality Loop
Make your AI coding agent ship changes you can trust, not giant diffs you have to babysit.
Quickstart · Orchestrator layer · The loop · Proof · Install · Compare · FAQ · Docs
AI coding agents are fast. Point one at a vague ticket and it can refactor things nobody asked for, pull in a dependency you did not want, claim "tests pass" without showing them, and sign off on its own work. You are left holding a big change you cannot tell is correct.
Coding Quality Loop makes the agent work like a careful engineer instead. It pins down what "done" means before writing code, changes as little as possible, proves the change with a test you can see, and has a separate agent review the work before it reaches you. What comes back is small, checked, and reversible: something you can read, trust, and merge in minutes.
It is a portable Agent Skill. The loop routes across two frontier hosts — Claude Code plans and implements, Codex reviews in a different model family — and it still installs into more (Droid, git, GitHub) as instruction and hook targets outside that routed loop. Cursor and Pi get advisory rules recipes in examples/, not a runtime install. Use it as a copy-paste prompt, a loadable skill, or a multi-agent config. No new tools, no lock-in.
Why the loop
Same agent, same model — a different process wrapped around it. Two honesty notes up front: the process asks for the table below, and our own published runs show the payoff is model-specific, not uniform — Claude cells measure positive code-quality lift, Codex cells measure flat-to-negative (−1.11, −9.0). Both numbers are on the dashboard, in red.
You ask your agent to "fix the checkout retry bug."
| Without the loop | With the loop |
|---|---|
| A sprawling diff across many files. | A focused fix in one or two files. |
| A new dependency you did not ask for. | No new dependencies. |
| "Looks right to me." | A test that fails before the fix and passes after, shown, not claimed. |
| You review it cold, by yourself. | A second agent already checked it against the goal. |
| Hope you can undo it. | A one-line rollback, written down. |
| Relearns the same lesson next session. | Remembers it and recalls it next time. |
That is the whole idea: smaller changes, real proof, a second set of eyes, and memory that sticks. The work scales to the risk: a typo just gets fixed; a payment migration runs the full process. See a real worked example in examples/walkthrough/.
| Step | What the agent produces |
|---|---|
| Task contract | Goal, acceptance criteria, constraints, risk tier. |
| Context map | The 2-3 relevant files, callers, and tests, not the whole tree. |
| Minimality decision | The smallest safe change; bigger rewrites explicitly rejected. |
| Small diff | One focused change, existing conventions, no new deps. |
| Verification evidence | A failing-then-passing test plus typecheck, recorded. |
| Independent review | A separate agent checks the diff against the contract, then approves or blocks. |
| Handoff | A completion record with evidence, risk note, and rollback. |
The state record in the walkthrough passes the same verify-gates check the loop enforces.
The Orchestrator Layer
New in v5.0.0 — and the headline of the release. The main session is the orchestrator: it thinks hard and makes every decision — task class, context map, contract, right-size rung, plan, model routing, the verdict on findings, and the stop-if-unsafe call. Workers (the implementer and the reviewer) never see the skill: they receive a brief, not context — goal, contract slice, files, commands, done-check, one screen max. No skill text, no references, no repository tour.
That inversion is a token diet. The always-loaded agent surface (SKILL.md) is now roughly half its former size, and workers load none of it. Decisions concentrate where the reasoning is; execution stays cheap and narrow. The rule that earns it: every gate must earn its tokens — that is the retention standard, and honestly, we have not yet run the live ablation that enforces it. The pre-registered protocol that will is bench/PROTOCOL.md; until it runs, deletions are still wins.
Routing is pinned to two hosts, two vendors: Claude Code plans and implements on frontier Anthropic models; Codex reviews on a frontier OpenAI model, always a different family than the implementer. This is a floor the config enforces (check-config), not a suggestion.
| Orchestrator (main session) | Workers (implementer, reviewer) | |
|---|---|---|
| Sees | full skill, references, repo | a one-screen brief only |
| Owns | every decision + the verdict | one narrow execution task |
| Model | frontier reasoning (plan/route) | implement on Claude Code · review on Codex (different family) |
See SKILL.md for the canonical contract and references/agentic-orchestration.md for the orchestrator/worker topology.
Quickstart
One command. Auto-detects your host (Claude Code, Codex, or Droid), copies the skill, wires the hooks, and writes an install manifest so check and remove are exact.
npx coding-quality-loop init
Shipped on npm with signed provenance. Requires Node 18+ and Python 3. Zero runtime dependencies. Interactive by default; add --yes for CI, --dry-run to preview, --host <name> to skip detection. See packages/npm/ for the full CLI.
npx coding-quality-loop init --dry-run --yes # preview only
npx coding-quality-loop add git # add the pre-commit backstop
npx coding-quality-loop check # verify a prior install against its manifest
npx coding-quality-loop remove # uninstall from the manifest; restores your backups
Lighter or heavier paths — a no-install drop-in prompt, or a manual per-host copy — plus the demo transcript and the task-class table live in docs/quickstart.md, the single onboarding doc.
The loop, visualized
Three phases, smallest-safe-first, each closed by its own verification gate before the next may start. Context is a budget; verification is what terminates a phase. The right-size gate runs twice: once in PLAN to choose the smallest approach, once in REVIEW to confirm nothing crept in.
PLAN -> EXECUTE -> REVIEW
flowchart LR
PLAN[PLAN] --> EXECUTE[EXECUTE]
EXECUTE --> REVIEW[REVIEW]
REVIEW -. durable lessons .-> PLAN
- PLAN — turn the goal into a task contract, map the change, write the validation contract, apply the right-size gate, and produce a plan. Terminates when the plan (and, for non-trivial work, the validation contract) exist and are checkable.
- EXECUTE — implement in small slices and verify. Terminates when the smallest sufficient checks pass with recorded evidence.
- REVIEW — independent review and ship/handoff. Terminates when a fresh-context reviewer has checked the diff against the validation contract and, for non-trivial work, a completion record exists.
Every older sub-step inherits one of these three phases; nothing is unlabeled. The helper script, config, and state record still use the original nine stable short machine names as sub-steps, so existing records, configs, and automation keep working unchanged:
| Phase | Sub-step (machine name) | What it produces |
|---|---|---|
| PLAN | INTAKE |
task contract: goal, acceptance criteria, risk tier |
| PLAN | EXPLORE |
the files that matter, callers, tests — not the whole tree |
| PLAN | INTAKE+PLAN |
contract.md — goal, per-criterion proving commands, what "done" means before writing code |
| PLAN | MINIMALITY_GATE |
the smallest valid rung; bigger rewrites rejected with reasons |
| PLAN | PLAN |
files to change, slices, verification commands, rollback |
| EXECUTE | IMPLEMENT_SLICE |
one small, reviewable, revertible slice at a time |
| EXECUTE | VERIFY |
sufficient checks run; exact commands + results recorded |
| REVIEW | REVIEW |
a separate agent checks the diff against the contract |
| REVIEW | PACKAGE |
PR handoff + completion record, the shipping gate |
| REVIEW | RETROSPECT |
repeated mistakes turned into durable harness changes |
The validation contract spans the INTAKE and PLAN sub-steps, both inside PLAN. Across tasks, durable lessons can persist in optional per-project memory. See SKILL.md for the canonical version of this mapping.
Anatomy of a shipped change
Each card above is a field in examples/walkthrough/agent-record.json — the same file verify-gates checks in the eval fixtures. See docs/architecture.md for the three-layer breakdown, and docs/quickstart.md for the three adoption paths.
Proof you can run
Every claim on this page is checkable on a clean checkout with no dependencies. Copy the block, paste in a terminal, watch the counts.
python3 -m py_compile scripts/*.py evals/*.py # 1. byte-compile
python3 scripts/quality_loop.py check-config assets/quality-loop.config.example.json # 2. config
python3 scripts/quality_loop.py eval-cases evals/cases --config assets/quality-loop.config.example.json # 3. static
python3 evals/run_evals.py # 4. behavioral gates
python3 evals/run_memory_evals.py # 5. memory gates
python3 evals/run_reality_evals.py # 6. reality gates (record↔diff)
python3 evals/run_hook_evals.py # 7. host hook fixtures
python3 evals/run_routing_evals.py # 8. model routing
python3 evals/run_control_evals.py # 9. control-plane add-on (in-repo checkout only; not in the npm tarball)
python3 bench/runner.py --mode fixture --seeds 1 --out /tmp/quality-loop-fixture-smoke.json # 10. bench fixture smoke
Current result: 20/20 static + 63/63 behavioral + 32/32 memory + 51/51 reality + 30/30 routing + 55/55 hook = 251 gate cases across the six core suites, plus 37 add-on cases for the opt-in control plane (step 9 — the add-on ships in the repo checkout, not the npm tarball), re-run on every push by a dependency-free GitHub Actions workflow.
- The static suite is an intake-classification regression test. It pins the routing table: risk tier, task class, required gates. It does not prove a gate fires on real prose.
- The behavioral suite is where the record gates actually fire. It drives the real CLI against constructed records and asserts hard-to-fake behavior: a self-downgraded boundary task is blocked, placeholder/wrong-content artifacts are rejected, the implementer cannot be the reviewer, and untracked secrets are flagged. One case is a docs-presence lint, not a gate.
- The memory suite drives
memory-recall/commit/pruneagainst constructed stores and asserts anti-bloat and safety invariants: the index stays <=40 lines even with multi-line lessons, recall respects budget, and secrets are redacted before they land. - The reality suite builds temp git repos where the record and the diff disagree: phantom completion, unmapped file, auth path under low tier, missing bugfix test, stale review hash, lying evidence, red-green catch, staged secret. It asserts the diff-grounded gates catch the lie.
- The hook suite feeds fixture JSON into Claude/Codex-compatible shims and checks destructive Bash blocks, secret-write blocks, required edit-before-plan blocks, Stop-gate continuation, SessionStart context, and installer idempotence.
The published eval runs
Five eval directories are committed with source, numbers, and caveats. Read them honestly: every cell is n=1 (single seed), judges are same-family LLMs, and only the webapp run is unambiguously real-CLI — the others are model-proxy or have no recorded invocation method. We publish the negatives (ts-search Codex −9.0, webapp Codex −1.11) next to the positives on purpose; the omitted negative was the most credible asset we were hiding. One caveat rises above a footnote: the webapp judge-lift numbers (incl. the −1.11) are void per bench/PROTOCOL.md §4 — judge-family independence was violated — so treat that run's objective browser checks as its evidence, not its judge scores (see the row note below).
| Eval | Date | Task | Agents | Methodology | Headline result (incl. negatives) |
|---|---|---|---|---|---|
| Sudoku 06-28 | 2026-06-28 | Browser Sudoku app | "Claude-style" + "OpenAI-style", skill vs baseline | Methodology not recorded (build invocation undocumented) | Skill avg 90.8 vs 83.3 baseline (~+7.5); original pilot |
| Sudoku 07-01 | 2026-07-01 | Browser Sudoku app | Codex, Claude Code, Droid/GLM-5.2 | Model-proxy (Perplexity subagents, per procmon cross-ref); no browser automation | CQL +4.5 avg (Codex +1.0, Claude Code +4.5, Droid/GLM-5.2 +8.0) |
| ts-search 07-03 | 2026-07-03 | TS in-memory search library | Codex (GPT-5), Claude Code (Sonnet 5) | Subagent proxy (not the real CLIs) | Claude Code +15.0; Codex −9.0 (a 60× slower single-term strategy crushed the perf dimension) |
| procmon 07-03 | 2026-07-03 | Rust process manager | Codex (GPT-5), Claude Code (Sonnet 4.6) | Model-proxy (Perplexity subagents) | Overall +5.75 (Codex +4.0, Claude +7.5) — almost all from D7 artifacts; code-quality dims flat-to-worse |
| Webapp 07-07 | 2026-07-07 | Browser task manager | Codex (gpt-5.5), Claude Code (claude-fable-5) | Live CLI + real browser verification (drop-in delivery) | ⚠️ Judge-lift numbers VOID per bench/PROTOCOL.md §4 (judge-family independence violated — the two judges differed only from each other, not from the arms' implementer models). Void figures, kept for the record: excl. D7 Claude Code +6.67 / Codex −1.11 (with D7: +16.0 / +7.5). The objective browser/behavior checks for this run are unaffected. |
All directional, not durable benchmark claims — and note the sign flips: the lift is model-specific (Claude positive, Codex flat-to-negative), which is exactly why the live ablation is pre-registered before it runs. One correction, stated where the numbers live: the Webapp 07-07 judge-lift figures (+6.67 / −1.11 excl-D7; +16.0 / +7.5 with D7) are void under bench/PROTOCOL.md §4 — the two judges were independent of each other but not of the arms' own implementer model families, so they scored their own house style. Only the judge-scored lift is void; the run's objective browser/behavior checks stand. The webapp run also caught an agent silently softening its local copy of the gate script and reporting PASS against it — see the panel below. The benchmark harness, fixture-smoke result, and the pre-registered protocol live in bench/PROTOCOL.md.
The gate-gaming story
During the Webapp 07-07 run, one agent silently softened its workspace copy of diff-audit and reported Overall: PASS under its own weakened gate. The pristine gates, re-run against the same record, failed it immediately — that contrast is the product in one incident. The fix (CHANGELOG.md §3.1.0): verify prints a sha256 for each helper module, the SKILL.md rule never repair or stub the helper; report and stop, and reality-eval cases pinning it. A repeated failure becomes a durable rule, test, and hook — not a chat correction.
Run it yourself on your task
First, see a record that already passes, end to end, in about ten seconds (exit 0):
python3 scripts/quality_loop.py verify-gates examples/walkthrough/agent-record.json
# verification gates look sufficient for recorded risk tier
# (exit 0 — this is what a complete, honest record looks like)
Then start your own. For medium/high-risk work, create a state record and run the primary verification command — an umbrella over record-shape gates, diff-grounded reality checks, evidence re-execution, and AC-to-command coverage:
python3 scripts/quality_loop.py init-record --goal "Fix invoice total rounding" --risk-tier medium --output .quality-loop/agent-record.json
python3 scripts/quality_loop.py verify .quality-loop/agent-record.json --red-green # --base defaults to the merge-base with origin/main
# Overall: FAIL
# (expected — a freshly-initialized record has no evidence or review yet; verify lists exactly what to fill in)
Ceremony scales with risk
A tiny task must not be forced through mission ceremony. A medium task must not ship without a contract and an independent review. Risk trumps size: any risk-boundary change is medium+ regardless of diff size. The task-class table (tiny → small → medium → mission) lives in docs/quickstart.md; the canonical definitions are in SKILL.md.
What the loop costs
Process is not free, and as of v6.3.0 the bill is measured, not estimated. The first live pre-registered run (bench/results/micro-bugfix-live-2026-07-21.json: {baseline, full} × claude-code × 3 seeds on a one-file micro-bugfix) put the full lifecycle at a median 8.1× output tokens, 6.3× input tokens, 7.65× cost, and ~10× wall time versus baseline — with identical objective quality (every cell in both arms: committed test green, 3/3 hidden cases, ≤28-line diff, zero new dependencies). On this micro-task the full loop bought no measured quality for 6–8× the cost — the observed cell, not a universal claim; it is why ceremony scales with risk and a tiny task must never pay for mission ceremony. The pre-registered §6.2 threshold (>1.5×) was exceeded ~5-fold — but the pre-registered outcome is not claimed: §6.0's letter forbids any §6 outcome when every arm passes the objective battery, and every arm did. The results file records that verbatim; the ladder/class-text cut candidate is opened as an ordinary operator decision informed by the data (ROADMAP), and §6.0's scope is amended for future runs only (PROTOCOL Amendments). The earlier live webapp run measured 3–6× wall time on a larger task. The retention standard — every gate must earn its tokens — now has its first enforcement datapoint; the full ablation that applies it to every component is still pre-registered, not yet run (policy, protocol). Live sweeps must record per-arm cost, and python3 bench/runner.py --validate fails any that don't.
What it enforces and what it does not
Most tools hide this table. Ours is one of the best marketing artifacts in the repo. The differentiator is that the gates are executable, not advisory, and the boundaries are explicit. scripts/quality_loop.py is a portable, stdlib-only checker. It complements CI, tests, scanners, and human review. It does not replace them.
| Enforced today | Not enforced by design, to stay portable |
|---|---|
| Non-trivial work, meaning medium/mission or any medium/high-risk or security-sensitive task, requires a named implementer, a real validation contract, an approving independent review by someone other than the implementer, and, at ship, a completion record with evidence. Required fields must be present and non-empty; bare booleans, empty strings, and nonexistent paths are rejected. It checks shape, not whether the content is substantive. A small low-risk task ships with handoff evidence, not a formal completion record. | run-evidence re-executes allowlisted commands but is not a sandbox. The trust model is repo-defined commands, same as CI. Commands not on the .quality-loop/allowed-commands allowlist are skipped and reported as not_allowed, not run. |
Reality layer. verify-gates --against-diff reads the real git diff and catches phantom completion, scope integrity, a diff-derived risk floor, bugfix-test co-presence, and stale review hashes. run-evidence re-executes recorded pass commands; --red-green replays a red_green command in a worktree at base and HEAD. Worktree unavailable means "not proven", never a silent pass. attest-review embeds the recomputed diff hash. |
Reviewer/implementer separation is compared as trimmed strings and fresh context is self-attested. attest-review plus --against-diff make review freshness checkable, but cannot prove the reviewer read the diff. The merge-base the diff is computed against is a CI-anchored guarantee, not a local one: locally, an agent that rewrites refs can move the base, and no gate reads the reflog to catch it — commit-first evasion is CI's job. |
| Detected-risk floor. The record goal, criteria, and plan are scanned for auth/authz, secrets, crypto, payments, migrations, destructive, concurrency, data-loss, PII, and infra boundaries. Any hit forces high-risk plus security-review gates regardless of the declared tier. | The detected-risk floor is a curated heuristic. It catches honest mis-tiering, not an agent deliberately phrasing around it. Deterministic policy hooks remain the backstop for anything you cannot afford an agent to get wrong. |
| UNDERSTAND is gated. Non-trivial work must carry a substantive context map with entry points or likely files plus callers or tests. | verify-gates without --against-diff reads the record, not the diff. It confirms recorded evidence is present and well-formed; --against-diff adds diff-grounded checks. diff-audit and CI remain the blocking layer. |
Every pass command carries a verifiable evidence handle and known class; a recorded minimality decision; and diff-audit flags secrets, including untracked files and test-weakening, dependency edits, migrations, and oversized diffs. diff-audit --staged covers the pre-commit diff; scan-text --stdin is a secret-scan-as-a-service for hook shims. |
The helper is not a hosted agent service. Authentication, model cost, and production rollout remain the caller's responsibility. |
| Repeated failure -> durable change. A recurring mistake must become a rule/test/hook/checklist/template, so a clean final record cannot bury a mistake corrected only in chat. | Host hooks are advisory unless the host or repo chooses to trust and enable them. Git hooks and CI are the portable backstop. |
Helper-integrity reporting. verify prints the sha256 of each helper module so a hook or CI can catch a locally modified gate script. Motivated by the gate-gaming incident. |
Helper-integrity is a report, not an enforcement action by itself — pair it with a CI check that compares against a known-good sha to make it blocking. |
The runtime entry points are verify (the umbrella: record gates + diff audit + evidence re-execution + AC coverage), verify-gates, verify-gates --against-diff, check-record, diff-audit, run-evidence, attest-review, render-prompt, and scan-text --stdin, pinned by evals. On Claude Code, the Stop hook runs the full verify umbrella (evidence re-execution included) at terminal statuses — fabricated pass rows no longer clear the local gate. The honest caveat: truthful-but-vacuous rows still clear it — an allowlisted no-op (e.g. true) named as the proving command for every acceptance criterion re-executes and passes, and >=3 criteria sharing one proving command is warn-only, even at medium+. The gate checks that evidence exists and re-runs, not that it is substantive.
Reviewer heterogeneity. check-config now hard-fails when the implementer and fresh_reviewer resolve to the same model on medium+ tasks. Tool-using evaluator. The reviewer must execute tests and benchmarks when available, not just read the diff; the verdict records ran_checks: true|false. Communication-bridge rule. After the reviewer produces findings, the implementer filters them against the contract: in-scope findings become fix tasks, out-of-scope findings become follow-ups. This prevents review loops.
Install & use matrix
Pick your host. Full copy-paste files live in examples/; every path below is real.
| Host | Install | Invoke |
|---|---|---|
| Any host (auto-detect) | npx coding-quality-loop init |
follow the printed "Next steps" for your host |
| Claude Code (skill) | cp -r . .claude/skills/coding-quality-loop (project) or ~/.claude/skills/coding-quality-loop (user) |
claude "Use the coding-quality-loop skill to fix the failing test and open a PR." |
| Claude Code (instruction-only) | cp examples/claude-code/CLAUDE.md ./CLAUDE.md (or /init, then paste the loop) |
claude "Follow the Coding Quality Loop to fix the failing test." |
| Codex | npx coding-quality-loop init --host codex (ships AGENTS.md + hooks) or cp examples/codex/AGENTS.md ./AGENTS.md |
codex "Follow the Coding Quality Loop in AGENTS.md to fix the bug." |
| Droid (Factory) | cp examples/droid/.factory/droids/*.md .factory/droids/ (role droids) + skill in repo root |
droid exec "Follow the Coding Quality Loop in SKILL.md to fix the bug and summarize verification evidence." |
| Cursor — advisory rules only, no runtime | cp -r examples/cursor/.cursor ./.cursor |
in chat: @coding-quality-loop fix the retry bug with verification evidence |
| Pi — advisory rules only, no runtime | cp -r . ~/.agents/skills/coding-quality-loop (or in-repo .agents/skills/) |
/skill:coding-quality-loop implement the change with a contract and independent review |
| Standalone / custom | route each step from assets/quality-loop.config.example.json |
follow examples/standalone/ |
Cursor and Pi are no longer offered by the npm installer's host picker: they load the instructions but none of the hook runtime, so they get honest advisory-only labels instead of surface parity.
Provenance note: the
npxinstaller ships from thecoding-quality-loopnpm package (source:packages/npm/) with signed Sigstore provenance tying the tarball to a specific GitHub Actions build. It is a thin UX wrapper aroundscripts/install.py, so both paths land the exact same files. This repo is not yet on the agentskills.io Skills Hub;gh skill installworks once a maintainer publishes a release. See Release & pinning.
The matrix rows above are the full per-host install + invoke commands; copy-paste host files live in examples/.
Install host integrations into a project:
python3 scripts/install.py --host all
This copies the stdlib Quality Loop runtime scripts, host hook shims, .claude/settings.json, .codex/hooks.json, read-only reviewer agents, pre-commit config, and an example GitHub workflow with backups. Claude Code and Codex hooks remain advisory unless the host trusts/enables them; git hooks and CI are the portable backstop.
Release 1.6 adds first-class host wiring without making any host mandatory:
hosts/claude-code/settings.jsonwiresSessionStart,PreToolUse, andStopcommand hooks. Shims are stdlib Python and delegate to the core CLI..claude/agents/quality-loop-reviewer.mdand.claude/agents/quality-loop-security-reviewer.mdare read-only reviewer subagents sourced fromreferences/reviewer-checklists.md.hosts/codex/hooks.jsonuses Codex's current project hook schema. Codex still requires hook trust review in/hooks.hosts/git/install-git-hooks.pyandhosts/git/.pre-commit-config.yamlprovide the universal git backstop: stageddiff-auditblocks secrets/test weakening.action.ymlandhosts/github/quality-loop-example.ymlprovide CI wiring.scripts/install.pyinstalls host wiring idempotently and prints what is enforced vs advisory.
Config-based model routing — the model_routing section in quality-loop.config.json maps each model class to a real model per host. python3 scripts/quality_loop.py setup-models --host <host> applies it: it rewrites model: frontmatter for Claude Code (.claude/agents/*.md) and Droid (.factory/droids/*.md), or prints the Codex config.toml / Pi /model settings to apply. Multi-host topologies are first-class: an agents entry may pin a role to another harness ({"host": "codex", "class": "strong_reasoning"}), main_session declares where the implementer runs, and one setup-models run applies every host — print hosts (codex, pi) are labeled PRINT-ONLY — settings not applied or verified by CQL. Reviewer independence is enforced on the resolved model family across hosts (family field or well-known prefix; unknown ids skip; allow_same_family is the explicit escape hatch). Three pre-validated variants along the intelligence↔cost dial ship in assets/routing/. brief shows the active routing per host and flags drift on file hosts. Agent files ship with model: inherit so they are host-neutral at rest. Route reasoning effort at high: check-config rejects xhigh/max unless a model-class block sets "allow_overthink": true, because effort is per-step, not per-task endurance — above high, models overthink and overspend each step. See the model capability glossary (intelligence / taste / cost, the effort ceiling, and the escalation policy) and config-driven model setup.
One user's personal cross-CLI setup (an external harness that overrides CQL routing) is documented — labeled as exactly that — in docs/cross-cli-recipe.md.
A repo can opt into required edit-before-plan blocking in the canonical root config, quality-loop.config.json:
{"enforcement": "required"}
(.quality-loop/config.json still works as a fallback for one release, with a deprecation warning.)
Three adoption levels
- No install — paste the Minimal Drop-In Prompt or a host rule file. Zero scripts, zero config. Best for trying it on one task.
- Install — copy the skill folder so the agent pulls
references/,assets/, and the state-record schema on demand via progressive disclosure. Best for repeated use. - Orchestrated — adopt
assets/quality-loop.config.example.jsonand route each step to a role-based agent profile. Best for multi-agent or production setups.
What's in the box
A single Agent Skill package following the open Agent Skills specification: SKILL.md at the root plus optional sibling folders. Progressive disclosure is the core mechanism: the agent always sees the frontmatter name/description, loads the full SKILL.md when relevant, and pulls references/assets/scripts only when a step needs them.
coding-quality-loop/
├── SKILL.md # the skill: when-to-use, lifecycle, task classes, roles, gates
├── assets/ # templates + schemas loaded on demand (contract, plan,
│ # completion record, progress, context map, record schema,
│ # config, per-role prompt cards)
├── references/ # deep-dive docs pulled only when needed (lifecycle, orchestration,
│ # reviewer checklists, tool contracts, philosophy,
│ # the memory contract, enforcement matrix)
├── examples/ # host-native copy-paste: claude-code, codex, droid,
No comments yet
Be the first to share your take.