一键导入
cash-apply
Implement Cash tasks with a sub-agent quality gate after completion
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Implement Cash tasks with a sub-agent quality gate after completion
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Analyze artifact consistency for a change
Archive a completed change
Query openspec/documents and answer questions
Audit changed code for security sharp edges — dangerous defaults, type confusion, and silent failures
Commit files related to a specific Cash change
Systematically debug a problem using a four-phase workflow
| name | cash-apply |
| description | Implement Cash tasks with a sub-agent quality gate after completion |
| license | MIT |
| metadata | {"author":"cash","version":"1.0"} |
執行任何 Cash artifact command 前,MUST 先從目前目錄解析並驗證 Git root,再使用該 root 下的 absolute launcher;不得依賴 PATH 或外部 runtime:
cash_root="$(git rev-parse --show-toplevel)" || exit 1
cash_cli="$cash_root/.cash-skills/bin/cash"
test -x "$cash_cli" || exit 1
同一段 workflow 後續每個 artifact command MUST 使用 "$cash_cli"。
Implement tasks from a Cash change.
Input: Optionally specify a change name (e.g., $cash-apply add-auth). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.
Task tracking is file-based only. The tasks file's markdown checkboxes (- [ ] / - [x]) are the single source of truth for progress. Do NOT use any external task management system, built-in task tracker, or todo tool. When a task is done, edit the checkbox in the tasks file — that is the only way to record progress.
Prerequisites: The project-local launcher initialized above is required. If root resolution, launcher validation, or a Cash command fails, report the exact error and STOP.
Steps
Select the change
If a name is provided, use it. Otherwise:
"$cash_cli" list --json AND "$cash_cli" list --parked --json to get all available changes (including parked ones). Parked changes should be annotated with "(parked)" in the selection list. Use the AskUserQuestion tool to let the user selectAlways announce: "Using change: " and how to override (e.g., $cash-apply <other>).
If the AskUserQuestion tool is unavailable, ask the same question or options in plain text and wait for the user's response.
Check status to understand the schema
"$cash_cli" status --change "<name>" --json
If the command fails: show the error and STOP.
If the command succeeds, check whether the change is parked (status can succeed even for parked changes):
"$cash_cli" list --parked --json
Look for the change name in the parked array of the JSON output.
If the change IS in the parked list (it's parked): Inform the user that this change is currently parked(暫存). Use the AskUserQuestion tool to ask whether to continue. Two options:
If the user chooses to continue:
"$cash_cli" unpark "<name>"
Then mark it as in-progress:
"$cash_cli" in-progress add "<name>"
This is a silent operation — do not show the output to the user.
Then re-run "$cash_cli" status --change "<name>" --json and continue normally.
If the change is NOT in the parked list: mark it as in-progress and proceed normally.
"$cash_cli" in-progress add "<name>"
This is a silent operation — do not show the output to the user.
Parse the JSON to understand:
schemaName: The workflow being used (e.g., "spec-driven")Get apply instructions
"$cash_cli" instructions apply --change "<name>" --json
This returns:
Handle states:
missingArtifacts; it is present in every state.state: "blocked": show the non-empty missingArtifacts list and suggest using $cash-propose to create those artifacts firststate: "all_done": continue to the cash quality gate before any archive guidancestate: "ready": proceed to implementation3b. Preflight check
The apply instructions JSON always includes preflight. Treat a missing preflight, missingFiles, driftedFiles, or staleness field as a contract error. Act on preflight.status:
"clean": silently continue — no output needed.
"warnings": display a brief summary, then continue automatically:
⚠ Preflight warnings:
- Drifted files (modified after change was created): <list paths>
- Change is <N> days old
Continuing...
Only show the lines that are relevant (skip drifted if none, skip staleness if not stale).
"critical": display missing files with their source artifact, then use the AskUserQuestion tool to ask the user:
⚠ Preflight: missing files detected
- <path> (referenced in <source artifact>)
- ...
These files are referenced in the change artifacts but no longer exist on disk.
Options: "Continue anyway" / "Stop" If the user chooses "Stop", end the workflow.
3c. Artifact quality check
Run "$cash_cli" analyze <change-name> --json to check cross-artifact consistency (Coverage, Consistency, Ambiguity, Gaps).
3d. Drift dormancy check (passive trigger for stale changes)
When the change has been dormant for more than 5 days AND the change directory has had zero commits in the past 3 days, surface a drift report before tasks begin — the change is likely out-of-sync with the current codebase.
Detect dormancy from .openspec.yaml created and git log -1 --format=%at -- openspec/changes/<name>/:
"$cash_cli" drift <change-name>, display the report, then use the AskUserQuestion tool:
$cash-ingest <change-name> to update artifacts, then resumeThe trigger is guidance only — it MUST NOT block apply from proceeding when the user chooses to continue. Hard-blocking on dormancy would punish legitimate "I came back after a long weekend" cases.
(Threshold reasoning: AI-assisted commits are daily-cadence. ≥5 days dormant + ≥3 days no commit ≈ genuine stagnation, not normal pacing.)
Read context files
Read the files listed in contextFiles from the apply instructions output.
The files depend on the schema being used:
Check project preferences
Read .cash.yaml in the project root.
If tdd: true is set, apply TDD discipline throughout implementation:
"$cash_cli" instructions --skill tdd, then follow the Red-Green-Refactor cycleIf audit: true is set, apply sharp-edges discipline throughout implementation:
"$cash_cli" instructions --skill audit, follow the discipline checklist (not the standalone 3-agent workflow)If parallel_tasks: true is set, check whether consecutive pending tasks have [P] markers (format: - [ ] [P] Task description). You SHALL dispatch consecutive [P] tasks as parallel agents. Only fall back to sequential when tasks have a data dependency (one task's output is another's input) or when tasks modify overlapping regions of the same file. Targeting the same file alone is NOT a reason to skip parallel dispatch — if the modified regions are disjoint, dispatch in parallel. If the environment does not support parallel execution, ignore [P] markers and execute tasks sequentially.
Show current progress
Display:
Implement tasks (loop until done or blocked)
Reminder: Track progress by editing checkboxes in the tasks file only. Do not use any built-in task tracker.
For each pending task:
design.md exists and contains an ## Implementation Contract section (or contract content under another heading the design uses), read the part of it that covers this task's scope. The contract names the observable behavior, interface or data shape, failure modes, acceptance criteria, and scope boundaries you must satisfy. Treat the contract as the durable handoff — it is what the task will be measured against, regardless of who started the change.foo.rs", "update bar.svelte") with no behavior, contract, or verification target;##### Example: blocks, use them as concrete test cases:
"$cash_cli" task done --change "<name>" <task-id>
This command marks the checkbox in tasks.md AND records which files were modified for this task.Parallel task dispatch: When consecutive [P]-marked tasks are found and parallel_tasks: true is configured (see Step 5), dispatch them as parallel agents in a single message. If any [P] task fails, pause and report.
Pause if:
a synchronization primitive, identity/generation type, or state machine not defined in design.md → 依 Implementation Notes Protocol 記一筆 deviation,說明原手段與替代手段,然後繼續該 task,不暫停、不要求 $cash-ingest。當上述條件全部成立時,即使需要在多個都保留 contract 的替代手段之間選擇,也 SHALL 以記一筆 deviation 解決,不觸發暫停分支。a synchronization primitive, identity/generation type, or state machine not defined in design.md,或存在其解答可能改變 contract 或範圍、需要使用者決定的 open question → 暫停、報告 blocker,並引導使用者前往 $cash-ingest。Focused Implementation Discipline
tasks.md 任務描述與 design.md Implementation Contract 要求的功能;不要為單一使用情境引入抽象層、設定選項或額外彈性,也不要為 contract 已排除或型別已保證的情境撰寫防禦性錯誤處理——只在系統邊界(外部輸入、外部 API)驗證。implementation-notes.md 以 open-question 條目記錄,交給使用者決定。tasks.md 中的某條任務或 design.md 中的 Implementation Contract 項目。"$cash_cli" task done 之前先修正。若刻意 deviate,依 Implementation Notes Protocol 寫一筆 deviation 條目並說明原因。Implementation Notes Protocol
During the cash-apply task loop, maintain a lightweight running log at openspec/changes/<change>/implementation-notes.md that captures only two categories of information:
spec.md, design.md, or tasks.md (because the spec was ambiguous, the codebase reality differs, or a discovered issue forced a different path).Design decisions that match the spec, ordinary tradeoffs, and small judgment calls do NOT belong here — they are already covered by design.md, tasks.md, and the review-loop round files. Keep this log narrow.
File creation rule (eager)
openspec/changes/<change>/implementation-notes.md if it does not already exist.<!-- cash-apply implementation notes | change: <change-name> | initialized: <YYYY-MM-DD HH:MM> | no entries below means no deviations or open questions were recorded -->
Entry format
Each entry MUST be appended (never rewriting earlier entries) using this exact structure:
## <YYYY-MM-DD HH:MM> — <short title>
- 類別:deviation | open-question
- 任務:<task-id or "n/a">
- 內容:<one-paragraph description of what happened or what needs answering>
- 原因:<why this path was chosen, or why the user needs to weigh in>
Prose (內容, 原因, title) is written in Traditional Chinese, matching the cash-apply response-language rule. CLI commands, file paths, code identifiers, capability slugs, and quoted source text remain verbatim in English.
When to write an entry
design.md Implementation Contract, tasks.md description, or relevant spec.md requirements — write a deviation entry before marking the task done.open-question entry naming the assumption.When NOT to write an entry
design.md or the round-<N> review files — no entry.Sub-agent reviewer requirement
Reviewer A — Adherence in the Sub-Agent Review/Rating/Fix Loop MUST, at the start of each full round, read openspec/changes/<change>/implementation-notes.md. In each micro round, Reviewer V MUST read the same file before verifying fixes.
deviation or open-question entry. No finding raised by virtue of emptiness alone.deviation entries are evaluated for whether the divergence is justified. An unjustified deviation is a Critical finding; a justified-but-undocumented-in-design.md deviation is at minimum a Warning recommending the divergence be back-filled into design.md during Fix Actions.open-question entries are surfaced as Warning findings with a recommended ## Fix Actions step naming how to obtain user confirmation before the round can pass.The main agent derives the round decision mechanically from the post-filter reviewer findings and does not read this file directly; that round's reviewer findings already incorporate the notes context.
Idempotence and ingest interaction
$cash-ingest may modify tasks.md / design.md / proposal.md. After ingest resolves an open question, the agent MUST append a follow-up entry noting the resolution (do not delete or rewrite the original open-question entry — the historical record is the point).open-question entry (i.e. one followed by a resolution entry) as no longer blocking.Final check
After completing all tasks, re-run:
"$cash_cli" instructions apply --change "<name>" --json
Confirm state: "all_done". If not, review remaining tasks and complete them.
On completion or pause, show status
Display:
Cash-apply response language
All user-facing AI responses during this workflow MUST be written in Traditional Chinese unless the user explicitly requests another language. Keep shell commands, file paths, code identifiers, schema field names (applyRequires, outputPath 等), artifact IDs, capability slugs, technical names, and quoted source text verbatim.
Artifact modifications during cash-apply
When the cash-apply workflow modifies an artifact — during review-loop fix actions, or after $cash-ingest updates tasks.md / design.md / proposal.md — the updated artifact content MUST follow the same Chinese language rule as cash-propose:
tasks.md, design.md, proposal.md, and other non-spec artifacts under openspec/changes/<change>/: Traditional Chinese.openspec/changes/<change>/specs/**/spec.md and openspec/specs/**/spec.md): follow the Spec-file language policy — Traditional Chinese prose with English structural keywords (### Requirement:, #### Scenario:, GIVEN/WHEN/THEN/AND) and English normative verbs (SHALL / MUST and their NOT forms) embedded in Chinese sentences. Every MODIFIED/REMOVED requirement title and every RENAMED FROM title MUST be copied byte-for-byte from the current master spec, because "$cash_cli" archive matches titles verbatim and fails closed with requirement_identity_mismatch when a title does not match.Keep CLI commands, file paths, code identifiers, schema field names, artifact IDs, capability slugs, and existing quoted source text verbatim. If the user explicitly requests another language later, follow the latest user instruction.
Archive guidance timing
Do not suggest archive before the Sub-Agent Review/Rating/Fix Loop has ended with decision: passed.
passed, the final response MAY tell the user they can archive with $cash-archive. When it does, it MUST also tell them to commit first with $cash-commit, or to archive through the $cash-commit "Archive first, then commit together" sub-flow, because running $cash-archive on its own deletes the touched state that $cash-commit uses as its source allowlist, leaving it to fall back to the archive manifest's point-in-time snapshot — which does not include anything changed after archiving, and does not exist at all in archives created before that field was added.aborted, do NOT suggest archive; summarize the unresolved findings and point to the final round file.Run this review/rating/fix loop once per change, after the normal workflow has completed its required artifact or task work.
Entry conditions
cash-propose, start this loop only after proposal, design, specs, and tasks artifacts required for apply are complete AND "$cash_cli" validate "<name>" has passed. If validation fixes are required, complete them before entering this loop.cash-apply, start this loop only after all implementation tasks are complete and tasks.md 全 [x].Pre-round mechanical self-check (main agent, inline)
<!-- and --> counts MUST match; no unclosed annotation block (e.g. a dangling <!-- @trace line) and no stray --- separator may remain inside a requirement or scenario section.design.md defines, grep ALL artifacts (and for cash-apply, the changed files) and verify every occurrence is consistent in spelling and meaning.### Requirement: title under a ## MODIFIED Requirements or ## REMOVED Requirements section in a delta spec, and for the FROM title of every entry under ## RENAMED Requirements, verify the same title exists byte-for-byte as a ### Requirement: heading in the corresponding master spec openspec/specs/<capability>/spec.md. Skip capabilities whose master spec does not exist. A missing title is a self-check failure: copy the title verbatim from the master spec and fix the delta before spawning reviewers, because "$cash_cli" archive fails closed with requirement_identity_mismatch for non-matching titles.open signal whose frontmatter contains a check field, execute the check value from the project root by passing it as the single command-string argument to sh -c, without applying relevance filtering. Executing a check command MUST NOT modify any file. Exit 0 means the check passed. Exit 1 means the anti-pattern is present: inspect any project-root-relative paths printed by the check command and compare them with this change's artifacts and, for cash-apply, changed files. If at least one printed path is in that artifact/source file set, treat the failure as in scope. If the check command prints no usable project-root-relative path, or the output cannot be reliably mapped to a project-root-relative path, fail closed and treat the detected instance as in scope unless the already-read repository state proves the instance is pre-existing or the required fix location is outside the structured scope declarations. If the detected instance is in scope and the fix location is not a protected grader path that is not covered by the structured-scope exception, fix it before spawning reviewers. If the detected instance is pre-existing, or its fix lies outside this change's structured scope declarations, or its fix lies inside a protected grader path that is not covered by the structured-scope exception, do not fix it, record one 範圍外 check 失敗 note in that round file's ## Fix Actions, include the failing check result in the reviewers' context, and proceed to spawn reviewers. Any other exit code is an execution error: fall back to the existing best-effort judgment for that signal and record one fallback note in ## Fix Actions. These note lines coexist with None; pass condition met. and do not count toward ledger fixed_files.open signals without a check field, or signals whose check execution fell back because of an execution error, keep the existing best-effort behavior: if any relevant signal (see "Signals in reviewer context" below) describes a machine-checkable anti-pattern, run a corresponding check for it.## Fix Actions; self-check results are NOT reviewer findings and never feed the round decision.Graded convergence and micro-verification round
decision: next_round, derive the next round type from its position within the current run: the next round MUST be full if and only if it is the fourth round of the current run; otherwise it MUST be micro.Critical or Warning MUST include disposition: one of unresolved-prior, fix-introduced, or new.
unresolved-prior: the finding matches a blocking finding from any prior round of this loop, including a bucket-1 seed from a prior run. A re-report is evidence that any recorded fix was ineffective.fix-introduced: the finding cites one or more recorded fix actions that introduced the defect. Reviewer V and cash-propose reviewers MUST include the fix-action reference; cash-apply Reviewer B also follows the introduced_by rule below.new: the finding matches no prior blocking finding. A finding that matches only a prior non-blocking triage note remains new; record only a one-line cross-reference to the original triage note, not a duplicate triage note or signal.unresolved-prior or fix-introduced) wins over new.new tag, the main agent MUST inspect whether the finding is at a fix-touched location from this loop or, for a seeded re-run, the prior run. If the defect stems from those fix actions, correct it to fix-introduced and record the original tag, corrected tag, and evidence in ## Fix Actions. Record every disposition correction; list blocking-to-non-blocking corrections in the completion output.Critical or Warning finding is blocking if and only if its verified disposition is unresolved-prior or fix-introduced. In a run's first round, every surviving Critical and Warning is blocking; a seeded re-run's first round instead uses the seeded cumulative blocking set.fix-introduced with a traced correction.new finding is non-blocking. Record it as a triage note in ## Fix Actions, include it in the signals write step, and list it prominently in the completion output. For a non-blocking Critical, also recommend a follow-up change proposal.unresolved verdict keeps the member in the set. Record every verified-resolution removal with the member, fix reference, and verifying reviewer. Record every accepted-risk removal with the member and accepted-risk reference as a downgrade trace.decision: aborted plus Abort triage. If this becomes true during the fix phase, override the pending next_round decision with aborted in the current not-yet-finalized round file.Critical and no blocking Warning. Non-blocking findings do not cause next_round.decision: aborted, perform Abort triage, and end the workflow.Fresh sub-agent calls
design.md Implementation Contract, tasks.md task descriptions, and spec.md requirements; implementation-notes.md deviations are justified.##### Example: blocks.round_type: full and spawns no reviewer; this is the explicit exception for a seeded re-run where all members are withheld under grader protection and no consented exit exists.open signals. In a seeded re-run, include prior-run round files too.## Fix Actions; record in the current round's ## Fix Actions which rounds used extracts.openspec/signals/ entries whose frontmatter status is open, select relevant issue classes, and include them in every reviewer context. This is read-only; continue silently when none exist.design.md against actual call sites and code before its other checks. A claim that does not hold is a finding.location + summary. When full-round reviewers independently raise the same finding with different layer values, the merged finding MUST take layer == design; when they disagree on a seeded member's verdict, any unresolved verdict wins.Accepted-risks ledger
openspec/changes/<change>/reviews/accepted-risks.md.severity, location, defect mechanism, acceptance rationale, and date.## Fix Actions, naming the finding and matched entry, and list all such downgrades in the completion output.Reviewer output requirements
severity: Critical, Warning, or Suggestionconfidence: integer 0–100layer: design or textlocation: artifact + section, or file path + line rangesummary: one-line issue descriptionrecommendation: concrete resolutiondisposition: unresolved-prior, fix-introduced, or new after the run's first round, and in a seeded re-run's first roundfix-introduced finding MUST include introduced_by, citing one or more recorded fix actions that introduced the defect.text only for synchronization-only wording, count, spelling, or identifier consistency that changes no behavior or design statement. Otherwise use design. When a reviewer cannot decide between design and text, it MUST classify the finding as design.Critical or Warning finding MUST include introduced_by, citing a concrete change-diff location, one or more fix-action records, or all fix actions from a named round when their interaction caused the regression. This rule does not apply to cash-propose.Confidence scoring rubric (per finding)
0 — Not confident at all. False positive or pre-existing issue. SHOULD NOT be reported.25 — Somewhat confident. Could be real but was not verified.50 — Moderately confident. Verified but minor, unlikely, or outside changed scope.75 — Highly confident. Verified and likely to occur, without direct artifact proof.100 — Certain. Direct evidence or a cited SHALL, Implementation Contract item, task line, or proposal non-goal proves the violation.100, except the accepted-risks and cash-apply introduced-by downgrades below take precedence.Confidence filter (applied by main agent before the decision)
text finding; if its fix can affect behavior or design, reclassify it to design. The main agent MUST NOT reclassify a design finding to text.Critical or Warning finding without verifiable introduced_by evidence MUST be reduced to confidence ≤ 25. Record the finding and unverifiable reason in ## Fix Actions, and list every such downgrade in the completion output.confidence < 50; their required downgrade traces remain in ## Fix Actions.confidence ∈ [50, 80) to Suggestion.confidence ≥ 80 remain Critical or Warning.critical_gap is true if and only if the post-filter cumulative blocking set contains a Critical; the first round uses its surviving Criticals unless it is seeded.Common false positives — do NOT flag The following SHOULD NOT be reported, or if reported MUST be scored ≤ 25:
tasks.md or design.md explicitly required the test, or a spec ##### Example: block is not exercised.design.md, implementation-notes.md, the proposal's Non-Goals section, or ## Alternatives Considered.## What Changes or ## Proposed Solution.Failure handling
decision: aborted and include the failure note in ## Decision.Decision record requirements
critical_gap as true or false; it is true only when the post-filter cumulative blocking set contains a Critical.round_type as exactly full or micro.passed, next_round, or aborted.Round file path
openspec/changes/<change>/reviews/.cash-propose, write openspec/changes/<change>/reviews/propose-r<N>.md.cash-apply, write openspec/changes/<change>/reviews/apply-r<N>.md.<N> as the 1-based round number. On a re-run after abort, continue numbering after the highest existing round file for that skill; never overwrite a completed round file.openspec/changes/<change>/reviews/<skill>-r<N>.md.Round file schema
# Cash Propose Review — Round <N> or # Cash Apply Review — Round <N>## Reviewer Findings — list aggregated, post-filter findings grouped under Critical / Warning / Suggestion. Each entry includes severity, confidence, layer, location, summary, recommendation, reviewer source, and where required disposition and introduced_by.## Rating — post-filter cumulative blocking set Critical count, post-filter cumulative blocking set Warning count, non-blocking triaged finding count, critical_gap, round_type, and rationale.## Fix Actions## Decision — value MUST be exactly one of passed, next_round, or aborted.Fix actions
next_round, address every surviving finding and every cumulative-set carryover before spawning the next round.## Fix Actions.cash-propose, if any fix action modifies proposal, design, tasks, or spec artifacts, run "$cash_cli" validate "<name>" again and fix validation errors before starting the next round..cash-skills/ 下的 runtime 檔,先在 project root 執行 ./install-cash-skills.fish --self;rebuild the receipt before the next cash command。將候選路徑轉為 project-root-relative,濾除所有 openspec/changes/ 下的路徑;若濾除後為空,不呼叫 Cash CLI 且不產生警告。否則先執行 "$cash_cli" touched ensure "<change-name>",再以所有候選路徑執行 "$cash_cli" touched record "<change-name>" --path <path>;整批失敗時逐路徑重試,以記錄最大合法子集。touched ensure 或 touched record 失敗時印出警告並繼續,不使 workflow 失敗,也不改變任何 round file 的 decision;警告須列出未能記錄的路徑與 error.code,並 carry this warning into the final completion output。None; pass condition met.design.md, do not implement it. Record a needs-design note naming the finding, required mechanism, and reason; set decision: aborted; run Abort triage; and direct the user to $cash-ingest. In cash-propose, defining the mechanism in its own design.md is a normal fix and does not trigger this rule.next_round, every surviving finding and every cumulative-set member counted in the decision MUST have an action in the current ## Fix Actions.
new finding uses its triage note. A re-report of a prior triage finding uses a one-line cross-reference to the original note and creates no duplicate signal.needs-design note forces aborted and cannot coexist with next_round.Abort triage
## Fix Actions and completion output:
round_type: full, decision: aborted, and triage; append one ledger row. The pre-spawn short-circuit round uses round_type: full and spawns no reviewer. The completion output MUST direct the user to obtain consent for the protected members or expand the structured scope declarations via $cash-ingest before any further re-run.Grader immutability
## Impact section or in its tasks.md:
.claude/skills/cash-propose/SKILL.md.claude/skills/cash-apply/SKILL.md.agents/skills/cash-propose/SKILL.md.agents/skills/cash-apply/SKILL.md.cash.yamlscripts/cash-skills/tests/skill-checks.fishscripts/cash-cli/tests/cli-checks.fishopenspec/specs/## Impact, or a tasks.md path that is explicitly identified as a delivery target. A path that appears only in a verification command, a rule description, an example, a review finding, reviewer context, or other incidental prose MUST NOT count as a structured scope declaration. Naming a directory path in a structured scope declaration names every file under it.check frontmatter field of any signal under openspec/signals/, regardless of declared scope. The check field is grader input for the pre-round mechanical self-check.check field, do not make that modification. Record 未修復:裁判面保護 (an unfixed-due-to-grader-protection note) in ## Fix Actions, naming the protected file and finding. The finding remains surviving for the round decision. This is the explicit exception to the obligations to fix Critical/Warning findings before the next round in the cash-propose 品質關卡 and cash-apply 品質關卡 requirements: fixes are required except any finding withheld under the grader-immutability rule.decision: aborted under the existing round-limit rule.未修復:裁判面保護 record from every round, even if a later round passes: for cash-propose with decision: passed, list the records in the final summary; for cash-apply with decision: passed, list the records in the gate-complete final response; for any decision: aborted, list the records in the unresolved-findings warning.Loop ledger step
openspec/changes/<change>/reviews/loop-ledger.tsv. For a next_round round, append immediately before spawning the next round's reviewers, after all fix actions, post-fix self-check records, and validation re-run fix records have been written. For a final passed or aborted round, append at loop end before the signals write step.loop-ledger.tsv does not exist, create it first with this exact tab-separated header row: skill round round_type criticals warnings decision fixed_files.skill: propose or applyround: 1-based round numberround_type: full or microcriticals: post-filter cumulative blocking set Critical count; in an unseeded first round, all surviving Criticals; 0 when empty, including failure-aborted roundswarnings: post-filter cumulative blocking set Warning count; in an unseeded first round, all surviving Warnings; 0 when empty, including failure-aborted roundsdecision: passed, next_round, or abortedfixed_files: number of distinct files recorded as modified in that round's ## Fix Actions; use 0 when none are recorded, and do not count fallback, triage, downgrade-trace, disposition-correction, or grader-protection notes(skill, round) is not a unique key; duplicate round numbers from re-runs are valid.Round file language
openspec/changes/<change>/reviews/<skill>-r<N>.md) prose content — Reviewer Findings, Rating rationale, Fix Actions descriptions, and the ## Decision explanation — MUST be written in Traditional Chinese.# Cash Propose Review — Round <N>, # Cash Apply Review — Round <N>, ## Reviewer Findings, ## Rating, ## Fix Actions, ## Decision.decision value: one of passed, next_round, aborted.critical_gap (true / false), round_type (full / micro), severity, confidence, layer (design / text), disposition (unresolved-prior / fix-introduced / new), introduced_by, location, summary, recommendation.cash-propose and cash-apply round files because they share this review-loop template.Signals write step
decision is passed or aborted — and the mechanical decision has already been recorded. This step MUST run only after that decision is recorded, and it MUST NOT change the decision of any round file. It applies to both cash-propose and cash-apply, since this template is shared.Critical or Warning. Cover findings from every round, not only the final round — a finding that was caught and fixed in an early round of an otherwise-passing loop still produces a signal. Deduplicate the target set by issue class, so an issue class seen across multiple rounds is processed exactly once. This issue-class deduplication is INDEPENDENT of any per-round location + summary aggregation deduplication used elsewhere in the loop. Findings classified Suggestion, and any finding with confidence < 80, MUST NOT produce a signal.openspec/signals/ and judge issue-class match by: SAME capability or domain AND SAME underlying rule or anti-pattern. Differing free-text wording alone does NOT make a different class; a different root cause DOES make a different class. When uncertain, PREFER creating a new signal over merging into an existing one.open signal: Reuse that signal's slug and update it in place — increment occurrences, update last_seen to today (YYYY-MM-DD), append one ## Occurrences entry (date, change name, source skill + round, and a one-line context), and append the source round file path to links. Do NOT change its status. Do NOT add, modify, or remove its check field; preserve any existing human-authored check byte-for-byte.open match (including when only an addressed or dismissed signal matches): Create a NEW signal. Before coining the <slug>, list the existing openspec/signals/*.md files and choose a <slug> that does NOT already exist. The slug is a short semantic ASCII kebab-case issue-class identifier matching ^[a-z0-9]+(-[a-z0-9]+)*$ (e.g. spec-requirement-no-backing-task); it is NOT a mechanical transform of location + summary. If the natural slug is already taken, disambiguate with a suffix. Creating a signal MUST NOT overwrite any existing signal file and MUST NOT change any existing signal's human-maintained status. The new signal has status: open, occurrences: 1, and first_seen = last_seen = today.id (= slug), type (default recurring-finding for review-loop-written signals), status, occurrences, first_seen, last_seen, links, and optional human-authored check; followed by a title, a description paragraph, and a ## Occurrences section. New signals created by this step MUST NOT contain an automatically authored check.openspec/changes/ 下的路徑;若濾除後為空,不呼叫 Cash CLI 且不產生警告。否則先執行 "$cash_cli" touched ensure "<change-name>",再以所有候選路徑執行 "$cash_cli" touched record "<change-name>" --path <path>;整批失敗時逐路徑重試,以記錄最大合法子集。touched ensure 或 touched record 失敗時印出警告並繼續,不使 workflow 失敗,也不改變任何 round file 的 decision;警告須列出未能記錄的路徑與 error.code,並 carry this warning into the final completion output。openspec/signals/ fails, print a warning but do NOT fail the cash workflow — signals are an auxiliary layer. If there are no qualifying findings, write nothing.Output During Implementation
## Implementing: <change-name> (schema: <schema-name>)
Working on task 3/7: <task description>
[...implementation happening...]
✓ Task complete
Working on task 4/7: <task description>
[...implementation happening...]
✓ Task complete
Output On Completion
## Implementation Complete
**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 7/7 tasks complete ✓
### Completed This Session
- [x] Task 1
- [x] Task 2
...
All tasks complete. The cash quality gate runs next; archive guidance is shown only if it passes.
Output On Pause (Issue Encountered)
## Implementation Paused
**Change:** <change-name>
**Schema:** <schema-name>
**Progress:** 4/7 tasks complete
### Issue Encountered
<description of the issue>
**Options:**
1. <option 1>
2. <option 2>
3. Other approach
What would you like to do?
Fluid Workflow Integration
This skill supports the "actions on a change" model: