compliance-review
Use when a milestone closes in the build (Step 8.7 calls it), when the build queue drains with a compliance report waiting for triage, when the user asks to…
Skill by FerEscobarDev
Chalk Labs
Need help deploying compliance-review?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/ferescobardev-compliance-review
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, devops, cloud, security
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/compliance-review
What's inside
- Skill name
compliance-review- Description
- Use when a milestone closes in the build (Step 8.7 calls it), when the build queue drains with a compliance report waiting for triage, when the user asks to check code against ALL the project rules — "revisión de cumplimiento", "revisá el milestone N contra las reglas", "qué reglas incumple lo que construimos" —, or to review a pull request or a branch — "revisá el PR 123", "revisá este PR de Azure", "revisá mi rama contra develop", "/specture:compliance-review milestone <N> | triage | pr <número|url> | rama <rama>". Reviews the code against every R-* invariant, conventions.md, W-* process rules, Accepted ADRs and the team's custom criteria (.specture/review-rules.md), writes a report with plain-language suggested comments to docs/07-reviews/, and (milestones only) asks the user which findings to address. Never posts anything to GitHub or Azure DevOps.
- License
- MIT
- Instructions
- 124 lines in SKILL.md · view on GitHub
Agent Skills spec issues
- files: referenced but missing: templates/COMPLIANCE_REPORT_TEMPLATE.md
Files (2)
- CORRECTION_LOOP.md
- SKILL.md
SKILL.md (first lines)
# Compliance Review (revisión de cumplimiento)
The per-spec `code-reviewer` judges each spec against the rules that match it. This skill judges a **whole milestone** against **every** rule the project declares — invariants whose tags never matched a spec, conventions no dimension covers, the process rules over the commits, Accepted ADRs and the team's own criteria linked from `.specture/review-rules.md` — and leaves a report the user can act on and a set of suggested comments anyone can read without the project's internal documents.
Two modes:
| Mode | When | Who talks to the user |
|---|---|---|
| `milestone <N>` | `build` Step 8.7 when a milestone closes (unattended), or on demand to re-run | nobody when called from `build`; on demand it continues straight into `triage` |
| `triage [<report>]` | `build` queue step 6 when the queue drains, `start` when a report is pending, or on demand | this skill — the only point where the user decides |
| `pr <número\|url>` · `rama <rama> [--base <rama>]` | on demand: a GitHub or Azure DevOps pull request, or a local branch against its base | nobody — it leaves a report to read; no triage, no correction, nothing committed, nothing posted |
The mechanical half lives in `hooks/lib/compliance.js` (range, lint, assemble, triage, correction, status, record); the grammars of the part and the report are in `templates/COMPLIANCE_REPORT_TEMPLATE.md`. You never write the report by hand.
## Iron Rules
1. **Never post.** No `gh pr review`, no `az repos`, no comment anywhere outside the repository. The suggested comments are text in the report; the user decides what to do with them.
2. **Never ask in the middle of a build queue.** Called from Step 8.7, the review runs and returns one informational line; the triage waits for the queue to drain (the same rule as Step 8.5).
3. **The user decides every finding.** You propose; a recommended option is applied only when the user chooses it (for all findings, or for the ones they name). Never infer a decision from silence.
4. **Only a `refactor` is corrected.** A finding of `Tipo: comportamiento` needs a spec (it is deferred, a candidate for `/specture:new-feature` or `/specture:debug`); a finding of `Tipo: test` belongs to the test-writer (deferred or "no aplica"); a finding of `Tipo: proceso` (a commit message, a branch name) is not fixed with code (deferred or "no aplica"). `compliance.js triage` refuses anything else.
5. **One writing agent at a time.** The reviewer writes only its part file under `.specture/state/compliance/<id>/`; after each dispatch `git status --porcelain` must show no change to a tracked file — otherwise stop and escalate (never restore with `git checkout`).
6. **Fail loud, never guess.** A range that cannot be verified, rules that do not resolve, or parts that fail lint twice produce a `BLOCKED` report (`compliance.js stub`) — never a review of the wrong code.
## Required Inputs
- `.specture/settings.yml` — `compliance_review.enabled` (honoured under every profile; default `true`). It gates only the automatic call from `build`; an explicit request always runs.
- `.specture/conventions.md` — passed whole to the reviewer (all sections, §13 `W-*` included); its test globs and §8 language are used by the correction loop.
- `.specture/rules.yml` — through `hooks/lib/rules-resolve.js --all` (`RULES_RESOLVED` with every `R-*`).
- `.specture/review-rules.md` (opt-in) — through `hooks/lib/review-rules-resolve.js --paths-file <chunk>.files` (`CUSTOM_RULES` per chunk). Exit 1 = stop and report it.
- `.specture/decisions/` — the Accepted ADRs relevant to each chunk's components (include when unsure).
- `docs/04-roadmap/ROADMAP.md`, `docs/05-specs/<epic>/_planning.md` (`LOCK_SHA`), `docs/02-architecture/architecture.md` ("Carpeta raíz") — read by `compliance.js range`, not by you.
- `docs/07-reviews/review-<epic-slug>-*.md` of the milestone's epics — the `IMPORTANT`/`NIT` findings their `APPROVED` reviews accepted (`ACCEPTED_FINDINGS`).
- `templates/COMPLIANCE_REPORT_TEMPLATE.md` — the grammars.
- `pr` / `rama`: `hooks/lib/pr.js`, read through `compliance.js range` — the GitHub CLI (`gh`, signed in with `gh auth login`) or the Azure CLI (`az` with the `azure-devops` extension, `az login`), used **read-only**; `conventions.md` §13 `W-4` for the default base of `rama`.
## Cross-Platform Subagent Initialization
If the session exposes `define_subagent` (Antigravity), register `compliance-reviewer`, `implementer` and `ux-implementer` from `agents/<name>/AGENT.md` before dispatching, each with `enable_write_tools: true` (they write their part file or correct code; the flag defaults to `false` and a reviewer without it cannot write). In Claude Code they are registered by the plugin. Script paths: `${CLAUDE_PLUGIN_ROOT}` (Claude Code), `${PLUGIN_ROOT}` (Antigravity), `$SPECTURE_ROOT` (manual setups).
## Mode `milestone <N>` — the review
1. **Gate.** Called from `build`: if `compliance_review.enabled` is `false`, print *"Revisión de cumplimiento desactivada (`compliance_review.enabled: false`)"* and return. On demand: run.
2. **Range.**
```
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" range --milestone <N>
```
- `READY <id> · …` → continue with its chunks (`.specture/state/compliance/<id>/range.json`).
- `EMPTY` → no code in the milestone: run `assemble` with no parts (an `APPROVED` report that says so) and go to step 6.
- `UNVERIFIABLE <motivo>` → `compliance.js stub --milestone <N> --reason "<motivo>"`, commit the report (step 5) and tell the user what could not be verified. Do not review.
3. **Review, one chunk at a time.** For each chunk of `range.json`:
- `rules-resolve.js --project . --all` → `RULES_RESOLVED`.
- `review-rules-resolve.js --project . --paths-file .specture/state/compliance/<id>/<chunk>.files` → `CUSTOM_RULES` (exit 1 → stub with the resolver's message).
- **`LINT_REPORT`**: run `stack.yml` → `quality.commands` `lint` and `format_check` with `{files}` = the chunk's files (in `pr` / `rama`, from `FILES_ROOT`), in background while you prepare the dispatch; their combined output (tail, ≤ 120 lines each) is the block. A slot `sin definir` / `none` → `LINT_REPORT: (none — <slot> sin definir)`. Never fix what they report: this review only suggests comments.
- Dispatch **`compliance-reviewer`** with `MODE: REVIEW`, `ID`, `CHUNK` + label, `HEAD`, `FILES`, `DIFF_FILE` (`<chunk>.diff`), `COMMITS_FILE` (`commits.txt`), `RULES_RESOLVED`, the content of `conventions.md`, the relevant Accepted ADRs, `CUSTOM_RULES`, `ACCEPTED_FINDINGS`, `LINT_REPORT` and `PART_FILE` = `.specture/state/compliance/<id>/part-<chunk>.md`.
- After it returns: `git status --porcelain` — any tracked change → stop and escalate (Iron Rule 5).
4. **Lint, then assemble.**
```
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" lint --id <id>
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" assemble --id <id>
```
`lint` FAIL → re-dispatch only the failing chunks once, with the lint lines verbatim; a second FAIL → `stub --reason "las partes no cumplen la gramática o citan documentos internos"`. `assemble` prints the report path and its `STATUS`.
5. **Commit** only the report: `git add <report>` and `docs(cumplimiento): milestone <N> — <STATUS>`.
6. **Hand back.**
- From `build`: one line — *"Cumplimiento Milestone <N>: <STATUS> · BLOCKER n · IMPORTANT n — triage al vaciar la cola"* — and return. Never ask here.
- On demand: continue with `triage` for this report.
## Mode `triage [<report>]` — the user decides
1. **What is pending.** `compliance.js status` lists reports with `TRIAGE PENDIENTE` and corrections still open, oldest first. Nothing pending → say so and stop. With a `<report>` argument, take only that one.
2. **Precondition: no epic `[/]`.** The correction loop runs without a seal; with an epic in progress its seal would deny the fixes and the two would collide. If an epic is `[/]`, leave the triage `PENDIENTE` and say when it will be asked (the next queue drain).
3. **Show the findings** of the report as a table — `F-n`, severity, Tipo, title, location, and the suggested comment — with a **proposed decision** per finding: `refactor` + `BLOCKER`/`IMPORTANT` → corregir; everything else → diferir. List the conflicts and what was not evaluated under the flexible level.
4. **Ask one closed question** (`AskUserQuestion`; on Antigravity a chat turn with the same closed options):
- *Aplicar la propuesta (Recomendada)*
- *Decidir hallazgo por hallazgo* — then up to 4 findings per call, options `corregir` (only for `refactor`) / `diferir` / `no aplica`; reasons go in "Other".
- *Diferir todo*
- *No aplica a todo*
5. **Record it**:
```
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" triage --report <report> --set "F-1=corregir;F-2=diferir:<motivo>;F-3=no-aplica:<motivo>"
```
(a reason cannot contain `;`). `FAIL` names what is wrong — fix the set, never the report. Commit `docs(cumplimiento): triage milestone <N>`.
6. **Correct** — only if some finding is `corregir`. Dispatch a fresh **general-purpose correction agent** (`model: sonnet`, no history) whose complete procedure is `skills/compliance-review/CORRECTION_LOOP.md`, with: the report path, the full block of each `corregir` finding, `TEST_GLOBS` (the conventions test globs + the test root, as the seal uses them), `TEST_COMMAND`, `stack.yml`, `conventions.md`, the relevant ADRs, `RULES_RESOLVED` (`--all`) and `CUSTOM_RULES` for the findings' files. Wait for its report and record it:
```
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" correction --report <report> --set "F-1=<sha>;F-4=no-corregido:<motivo>"
```
A `fix-range` FAIL or a `NUEVO:` line from the verify pass is escalated to the user with the details — no automatic revert.
7. **Deferred.** Each `diferir` is a `dueño: sin epic` line under `## DIFERIDOS`: offer them once, together, as possible `/specture:new-feature` items (behaviour) or a follow-up refactor — never create anything without the user's yes.
8. **Metrics.** `compliance.js record --report <report>` appends the `kind: "compliance"` line to `docs/.specture-meta/build-metrics.jsonl`; commit it with the report: `docs(cumplimiento): corrección milestone <N>` (or with the triage commit when nothing was corrected).
## Modes `pr` and `rama` — a pull request or a branch
The same review over code that may never have gone through the build: a teammate's pull request on GitHub or Azure DevOps, or a local branch before opening one. **Read-only on the platform, nothing committed, no triage, no correction** — the report is for the user to read and, if they want, copy the suggested comments.
1. **Range.**
```
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" range --pr <número|url> [--platform github|azure]
node "${CLAUDE_PLUGIN_ROOT}/hooks/lib/compliance.js" range --branch <rama> --base <rama>
```
For `rama`, the base is the one the user names, else the target `W-4` of `conventions.md` §13 declares for that kind of branch, else omit `--base` (the script takes the remote's default branch). `UNVERIFIABLE <motivo>` → tell the user verbatim (it carries the fix: `gh auth login`, `az login`, `az extension add --name azure-devops`, a PR that changed while being read) and stop — there is nothing to stub or commit. `READY` prints the chunks and, when the change touches rule files, a `cambia reglas` line: tell the user the review uses the **target branch's** rules.
2. **Review, one chunk at a time**, exactly as in `milestone` step 3, with these differences: the resolvers run on the target branch's copy — `rules-resolve.js --project <state>/base --all` and `review-rules-resolve.js --project <state>/base --paths-file <state>/<chunk>.files`; `conventions.md` and the ADRs come from `<state>/base/.specture/`; the dispatch adds `CONTEXT: pr | rama`, `FILES_ROOT: <state>/head`, `BRANCH` and `BASE_BRANCH` (from `range.json`), with `ACCEPTED_FINDINGS: (ninguno)`. `<state>` is `.specture/state/compliance/<id>/`. The `git status` guard applies.
3. **Lint and assemble** as in `milestone` step 4 (the report is `cumplimiento-pr-gh-<n>-…`, `cumplimiento-pr-az-<n>-…` or `cumplimiento-rama-<slug>-…`, with `TRIAGE: NO REQUERIDO`).
4. **Hand back — do not commit.** Give the user the report path, the counts by severity, the `## Comentarios sugeridos`-style comment of each finding with its `archivo:línea`, and the rule changes if any. Say plainly that nothing was posted to the PR. Never run `triage` or the correction loop on these reports, and never `gh pr review`, `gh pr comment`, `az repos pr` writes or any other platform write.
## Red Flags — STOP
| Thought | Reality |
|---|---|
| "Lo publico en el PR, así lo ven" | Never post. The report holds the suggested comments; the user copies what they want. |
| "Es un cambio chiquito de comportamiento, lo corrijo igual" | Behaviour changes go through a spec. Defer it. |
| "Pregunto ahora, total el epic siguiente puede esperar" | Never ask mid-queue. The triage waits for the drain. |
| "Corrijo el reporte a mano para que quede prolijo" | The script owns the report. Re-run `assemble` (a new `-pK`) or `triage`. |
| "El agente cambió un archivo, lo restauro con git checkout" | Stop and escalate. `git checkout` destroys work that is not yours. |
| "El usuario no contestó, aplico la propuesta" | Silence is not a decision. The triage stays `PENDIENTE`. |
| "Ya que estoy, dejo el comentario en el PR" | Never. `pr` mode reads the PR and writes a local report; the user decides what to post. |
| "El PR cambia rules.yml, lo reviso con esas reglas" | A change never relaxes the rules that review it: always the target branch's copy in `<state>/base/`. |
## Exit criteriaFrom FerEscobarDev/Specture, MIT.
More from FerEscobarDev/Specture
- 0.565score
knowledge
FerEscobarDev
Use to keep the project's knowledge healthy.
SkillAFreshness: AClaude Code +9 - 0.565score
start
FerEscobarDev
Use at the start of every conversation under Specture, when the user says "continue", "sigamos", "continuemos con el roadmap", asks to resume work, or…
SkillAFreshness: AClaude Code +9 - 0.565score
setup
FerEscobarDev
Use when the user says "configura el proyecto", "setup", "instala Specture", "ajusta las reglas", or when `.specture/stack.yml` does not exist in the project…
SkillAFreshness: AClaude Code +9 - 0.565score
verify
FerEscobarDev
Use before claiming any work is "done", "completed", "fixed", "passing", or "ready".
SkillAFreshness: AClaude Code +9 - 0.565score
contract-sync-audit
FerEscobarDev
Use on an existing project where the frontend and backend are out of sync — the frontend calls URLs the backend doesn't expose, expects response shapes the…
SkillAFreshness: AClaude Code +9 - 0.565score
ux-design
FerEscobarDev
Use when the project has a frontend (`stack.yml.frontend.framework` is set and not `none`) and `docs/03-ux-ui/navigation_map.md` or `design_system.md` is…
SkillAFreshness: AClaude Code +9 - 0.560score
build
FerEscobarDev
Use when `docs/04-roadmap/ROADMAP.md` exists and contains epics marked `[ ]` (pending) or `[/]` (in progress), or when the user says "construyamos", "sigamos…
SkillAFreshness: AClaude Code +9 - 0.560score
setup-docs-bridge
FerEscobarDev
Use when the user has an existing project (mode Adopt) that already contains a folder with substantial preexisting documentation (`docs/`, `Documentation/`…
SkillAFreshness: AClaude Code +9 - 0.560score
architecture
FerEscobarDev
Use when business requirements exist but no architecture or roadmap, when the user says "diseñemos la arquitectura", "generemos el roadmap", "planifiquemos"…
SkillAFreshness: AClaude Code +9 - 0.560score
debug
FerEscobarDev
Use the moment any test fails twice, when a build breaks unexpectedly, when the code-reviewer rejects code, when the implementer reports BLOCKED, when the…
SkillAFreshness: AClaude Code +9 - 0.559score
audit-knowledge
FerEscobarDev
Alias of `knowledge` in AUDIT mode.
SkillAFreshness: AClaude Code +9 - 0.559score
learn
FerEscobarDev
Alias of `knowledge` in CAPTURE mode.
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 1
- Open issues
- 0
- Last commit (this folder)
- Oct 22, 2026 (9 days ago)
- Last release
- Oct 23, 2026 (8 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/FerEscobarDev/Specture
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from FerEscobarDev
- 0.565score
start
FerEscobarDev
Use at the start of every conversation under Specture, when the user says "continue", "sigamos", "continuemos con el roadmap", asks to resume work, or…
SkillAFreshness: AClaude Code +9 - 0.565score
ux-design
FerEscobarDev
Use when the project has a frontend (`stack.yml.frontend.framework` is set and not `none`) and `docs/03-ux-ui/navigation_map.md` or `design_system.md` is…
SkillAFreshness: AClaude Code +9 - 0.565score
setup
FerEscobarDev
Use when the user says "configura el proyecto", "setup", "instala Specture", "ajusta las reglas", or when `.specture/stack.yml` does not exist in the project…
SkillAFreshness: AClaude Code +9 - 0.565score
contract-sync-audit
FerEscobarDev
Use on an existing project where the frontend and backend are out of sync — the frontend calls URLs the backend doesn't expose, expects response shapes the…
SkillAFreshness: AClaude Code +9 - 0.565score
knowledge
FerEscobarDev
Use to keep the project's knowledge healthy.
SkillAFreshness: AClaude Code +9 - 0.565score
verify
FerEscobarDev
Use before claiming any work is "done", "completed", "fixed", "passing", or "ready".
SkillAFreshness: AClaude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get compliance-review running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
compliance-review skill. Agent Mart. https://agentmart.dev/skills/ferescobardev-compliance-review (last updated 2026-10-24)