一键导入
candid-loop
Run candid-review in a loop until all issues are resolved, with configurable auto, review-each, or interactive modes and support for ignored issues
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Run candid-review in a loop until all issues are resolved, with configurable auto, review-each, or interactive modes and support for ignored issues
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when you have an output — copy, a doc, an answer, a plan, a prompt, any text artifact — and want it made better against your goal. Runs a critique→refine loop with configurable stop conditions and auto/review-each/interactive modes. Default is a single pass using the current session context to decide what "better" means.
Fast ship for low-risk changes — runs only the steps you explicitly enable in fastShip config
Use when the code works and you want a focused pass on improving approach, clarity, and quality — distinct from candid-review's defect hunt. Each suggestion includes a concrete before/after, tradeoffs, and confidence level.
Use when reviewing code changes before commit or PR — configurable harsh or constructive review against Technical.md standards, with categorized issues, actionable fixes, todo tracking, and optional auto-commit.
Ship your changes - review, build, test, create PR, and optionally auto-merge
Take a candid-chrome-qa findings JSON, let the user pick which findings to fix, and dispatch fixes — single batched PR, one PR per finding via Conductor deep links, local-only, or issues-only. Optionally files Linear (or other tracker) issues per finding before shipping.
| name | candid-loop |
| description | Run candid-review in a loop until all issues are resolved, with configurable auto, review-each, or interactive modes and support for ignored issues |
Run candid-review repeatedly until your code is clean. This skill automates the fix-review-fix cycle, applying fixes and re-running reviews until no issues remain (or max iterations is reached).
Execute these steps in order:
Load loop configuration from CLI flags and config files.
Precedence (highest to lowest):
.candid/config.json → loop field)~/.candid/config.json → loop field)Parse CLI arguments for loop options:
| Flag | Description | Default |
|---|---|---|
--mode <auto|review-each|interactive> | Execution mode | auto |
--max-iterations <N> | Maximum loop iterations | 5 |
--categories <list> | Categories to enforce (comma-separated) | all |
Valid modes:
auto - Automatically apply all fixesreview-each - Go through each fix one by one (Yes/No for each)interactive - Full control with skip, ignore, and batch optionsValid categories: critical, major, standards, smell, edge_case, architectural, all
If CLI flags are provided, use them and skip config file checks for those specific options.
Read the loop field from .candid/config.json (jq -r '.loop // null' .candid/config.json 2>/dev/null); if absent, try ~/.candid/config.json. For each of mode, maxIterations, enforceCategories not set by CLI, take the config value; also extract ignored {categories, patterns, ids}. Output Using loop settings from project config or Using loop settings from user config when applied.
Defaults for anything still unset: mode = "auto", maxIterations = 5, enforceCategories = ["all"], ignored = { categories: [], patterns: [], ids: [] }.
Set up tracking variables:
iteration = 0
totalFixesApplied = 0
allFixedIssues = []
registerQuestionsRaised = 0
registerQuestionsResolved = 0
registerPriorDecisionsApplied = 0
Display mode banner: [<Mode> Mode] Running candid-loop with max [N] iterations... followed by a second line for review-each ("You will review each fix one by one.") or interactive ("Full control: skip, ignore, or batch process fixes.").
Execute the main loop:
WHILE iteration < maxIterations:
iteration++
Execute Step 3.1 through Step 3.6
IF exitLoop == true:
BREAK
IF iteration >= maxIterations AND remainingIssues > 0:
Output warning: "Max iterations ([N]) reached. [M] issues remain."
List remaining issues
.candid/last-review.json timestamp postdates the last Edit. Never infer PASS from an earlier iteration.allFixedIssues reappears in a later iteration, stop: Oscillation detected: fix for [id] was undone or reintroduced. List both fixes for manual resolution.sessionSkipped; filter them in Step 3.4 in later iterations. They count toward INCOMPLETE, not re-prompts.Display iteration header:
[Iteration [N]/[MAX]]
Running candid-review...
Invoke the candid-review skill to analyze current code:
/candid-review.candid/last-review.jsonNote: candid-review will present its own fix selection prompt. In auto mode, we need to handle this by selecting "Apply all fixes". In interactive mode, we defer to the user's choices within candid-review.
Decision Register: If the decision register is enabled in config, each candid-review iteration reads and updates the register file independently. This means:
After candid-review completes, read the saved review state:
cat .candid/last-review.json 2>/dev/null
Parse the JSON to extract:
issues array with all found issuesid, file, line, category, title, descriptionIf file doesn't exist or is empty:
No review state found. candid-review may not have completed.
Exit with error.
If enforceCategories is NOT ["all"]:
Filter the issues array to only include issues matching enforceCategories:
filteredIssues = issues.filter(issue =>
enforceCategories.includes(issue.category)
)
Output: Enforcing categories: [list]. Filtered to [N] issues.
Apply the ignored filters from config: remove any issue whose category is in ignored.categories, whose title matches any regex in ignored.patterns (case-insensitive), or whose id is in ignored.ids.
If any issues were filtered:
Filtered out [N] ignored issues ([M] remaining)
If filteredIssues.length === 0:
[Iteration [N]/[MAX]] No issues found!
exitLoop = true
Skip to Step 4 (Summary).
If mode == "auto":
Display found issues:
[N/MAX] Found [M] issues. Applying fixes...
The candid-review skill will have already applied fixes if the user selected "Apply all fixes" in its prompt. Since we're in auto mode, we should have configured candid-review to auto-apply.
For each issue that was fixed, log:
✓ [icon] Fixed: [title] in [file]:[line]
Track fixes:
totalFixesApplied += appliedCount
allFixedIssues.push(...appliedIssues)
Decision Register in auto mode:
If the decision register is enabled, candid-review handles register consultation during its Step 6 (before raising Clarification Needed questions). In auto mode:
Applied prior decision (#N) for [file]open in the registerApplied [N] prior decisions, skipped [M] new questions requiring clarificationTrack register activity:
registerPriorDecisionsApplied += priorDecisionsCount
registerQuestionsRaised += newQuestionsCount
registerQuestionsResolved += resolvedCount
Where resolvedCount comes from candid-review's Step 10.5 output — it includes questions answered by the user during Phase 8b and auto-resolutions from re-review. Read the register file after each iteration to count newly resolved entries compared to the previous read.
Continue to next iteration.
If mode == "review-each":
Go through each fix one by one with simple Yes/No prompts.
Display found issues:
[N/MAX] Found [M] issues. Reviewing each...
For each issue, use AskUserQuestion:
[1/M] [icon] [title]
File: [file]:[line]
Problem: [description]
Question: "Apply this fix?"
Options:
Track user choices:
After processing all issues, if any fixes were applied, continue to next iteration.
If mode == "interactive":
Full control mode with additional options for skipping, ignoring, and batch processing.
Display found issues:
Found [M] issues:
For each issue, use AskUserQuestion:
[1/M] [icon] [title]
File: [file]:[line]
Problem: [description]
Question: "How would you like to handle this issue?"
Options:
Track user choices:
After processing all issues in interactive mode, if any fixes were applied, continue to next iteration.
If user chose "Add to ignore list" for any issues:
.candid/config.json (or create if doesn't exist)loop.ignored.ids array# Read, modify, write
jq '.loop.ignored.ids += ["issue-id-1", "issue-id-2"]' .candid/config.json > tmp.json
mv tmp.json .candid/config.json
Output: Added [N] issues to ignore list in .candid/config.json
After loop exits (success or max iterations), display final summary:
Candid Loop [Complete|Stopped|Cancelled]
Summary:
- Iterations: [N]
- Issues fixed: [M]
- Status: [PASS|INCOMPLETE|CANCELLED]
If INCOMPLETE: add Issues remaining: [P] and list remaining issues as [icon] [title] in [file]:[line], plus tips: increase --max-iterations, add persistent ignores for false positives, review complex issues manually.
If CANCELLED: add Issues skipped: [P] and list skipped issues.
Decision Register section (add to all summary variants when register is enabled):
If decisionRegister.enabled == true in config, append this section to whichever summary is displayed:
Decision Register:
- Prior decisions applied: [N]
- New questions raised: [M]
- Questions resolved: [P]
- Open questions: [Q]
If open questions remain:
Open questions can be reviewed at: [registerPath]/review-decision-register.md
Add to .candid/config.json:
{
"version": 1,
"tone": "harsh",
"loop": {
"mode": "auto",
"maxIterations": 5,
"enforceCategories": ["all"],
"ignored": {
"categories": [],
"patterns": [],
"ids": []
}
}
}
| Field | Type | Default | Description |
|---|---|---|---|
loop.mode | string | "auto" | "auto", "review-each", or "interactive" |
loop.maxIterations | number | 5 | Maximum review-fix cycles |
loop.enforceCategories | array | ["all"] | Categories to enforce |
loop.ignored.categories | array | [] | Categories to skip entirely |
loop.ignored.patterns | array | [] | Regex patterns to match issue titles (example: ["Unicode", "timezone"]) |
loop.ignored.ids | array | [] | Specific issue IDs to skip |
# Run with defaults (auto mode, all categories, max 5 iterations)
/candid-loop
# Combine flags
/candid-loop --mode review-each --max-iterations 10 --categories critical,major
| Category | Icon | Description |
|---|---|---|
critical | 🔥 | Production killers: crashes, security holes, data loss |
major | ⚠️ | Serious problems: performance, missing error handling |
standards | 📜 | Technical.md violations |
smell | 📋 | Maintainability: complexity, duplication |
edge_case | 🤔 | Unhandled scenarios: null, empty, concurrent |
architectural | 💭 | Design concerns: coupling, SRP violations |