[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HYMX1HEAXCMXTNPR0DEMA0":3,"skill-same:01M6HYMX1HEAXCMXTNPR0DEMA0":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":44,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":66},"01M6HYMX1HEAXCMXTNPR0DEMA0","dev",null,"Load when implementing an issue or applying review fixes as a dev agent.","vanillagreencom\u002Fkendex","vanillagreencom","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F960140?v=4","01M6HYKK40E293HJHZHAXBHRP3","vanillagreen","01M6HYKK8C03G1JWBP1S14HHFN",93,"MIT","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35],"as","fixes","issues","implementing","true","load","review","github","https","issue","when","review fixes","2026-11-10 10:12:30",false,"---\nname: dev\ndescription: \"Load when implementing an issue or applying review fixes as a dev agent.\"\nlicense: MIT\nuser-invocable: true\nmetadata:\n  author: \"vanillagreen\"\n  source: \"kendex\"\n  repository: \"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\"\n  bugs: \"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fissues\"\n---\n\n\u003C!-- kendex:project-instructions:start -->\n## Project Instructions\n\n\u003C!-- kendex:shared-instructions:start -->\nProblems with a kendex-owned skill go through `kendex report`; check ownership in the file first.\n\u003C!-- kendex:shared-instructions:end -->\n\u003C!-- kendex:project-instructions:end -->\n\n# Dev Workflows\n\norch is the caller and runtime: it owns delegation format, round acceptance, and every shell-shape rule.\n\n| Workflow | Purpose |\n|----------|---------|\n| `workflows\u002Fdev-implement.md` | Implementation: activate → plan → implement → validate → commit → QA labels → summary → artifact → return (§ 1-11) |\n| `workflows\u002Fdev-fix.md` | Review fixes: evaluate → apply or skip → validate → commit → artifact → return |\n\nReview and QA-review belong to the reviewer skill's workflows\u002Freview.md and workflows\u002Fqa-review.md. Command shapes are orch's [`..\u002Forch\u002FSKILL.md`](..\u002Forch\u002FSKILL.md) § Harness-Safe Shell; literal format tags and round mechanics are its [`..\u002Forch\u002Freferences\u002Fskill-rules.md`](..\u002Forch\u002Freferences\u002Fskill-rules.md) § Format Tags Are Literal and § Round Closure.\n\n## Implementer selection\n\nAn `agent:X` label selects X. With no agent label, use the item's Location paths and required work:\n\n| Required work | Agent |\n|---|---|\n| Non-Iced Rust implementation | `rust` |\n| Iced view layer and UI messages, even under `crates\u002F` | `iced` |\n| Declarative UI: TypeScript\u002FReact web, mobile and terminal views. Frontend owns all Quickshell QML and its JavaScript, view and non-view. | `frontend` |\n| SwiftUI and UIKit views, Swift application code, Xcode and Swift Package Manager builds\u002Ftests; excludes non-UI runtime and data persistence | `swift` |\n| Non-UI shell, Python, TypeScript or Go runtime implementation | `runtime` |\n| Documentation, references, file or configuration organization | `maintainer` |\n\nFor an item spanning domains, split the delegation by domain. If the selected agent is not installed, report the missing agent to the caller. Never substitute `maintainer` for runtime or UI implementation.\n\n## Engineering Rules\n\n- Scope is the issue's Done-when. A behavioral surface that does not trace to it stays out of this change, and a committed render of a source file you changed traces to whatever its source traces to. Two exceptions:\n  - the mechanical enablers of landing it ride without tracing to it: locks, changelog, baselines, dismissal renewals, that list and nothing else, never code that runs at runtime;\n  - a defect the change introduces or arms is in scope by definition, unless Step 0 of [`..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md`](..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md) excludes it.\n- A behavior change ships with the test code-quality admits; the pull request body names an omitted test and the judgement. A workflow sentence ships no test. A test that drives a second implementation or stubs the function under test does not count. Message assertions follow [code-quality § Tests](..\u002Fcode-quality\u002FSKILL.md#tests).\n- A review finding adds a case only when it names a behaviour no existing case reaches. Otherwise it tightens the existing case's assertion, and the item reasoning names that case.\n- A second fix round on the same function's guard is recurrence: redesign the rule under test so the class is unrepresentable, and fold the family of cases into one table. Fix an item with an `Owner:` line at that owner, with one table whose rows cover every state the owner can be in.\n- A test whose premise died is deleted whole in the commit that kills the premise, and the PR body names the deletion.\n- Test shape is [code-quality § Tests](..\u002Fcode-quality\u002FSKILL.md#tests) and [§ Prove Your Guards](..\u002Fcode-quality\u002FSKILL.md#prove-your-guards).\n- A refusal, a validator, a lock, a retry, or a test exists only for an input a real producer emits, this project's code or anything it calls or serves; name that producer beside it, or do not write it.\n- When a change deletes a call, apply [code-quality § Cleanup](..\u002Fcode-quality\u002FSKILL.md#cleanup) to its callee. Its deletion maps to the call removal's Done-when item; no internal caller is not proof that a supported external API is unused.\n- A field, setting, or view member added by the change has a real producer and consumer. A named and documented external producer or consumer is valid when the change adds its in-repository counterpart; otherwise, add both sides in the change.\n- Follow the project's declared release compatibility standard for changes to project-owned formats.\n- Before adding a function, parser, stub or loop, grep the repo for the verb it performs; before stating a rule, grep for the rule.\n  - A second copy of that verb, in any language, is a twin and never delegation, and so is a second statement of a rule another file owns, in prose, config or a table.\n  - Call or cite the one that exists, or escalate in your return. An issue that orders a twin is escalated, not implemented.\n- A doc claim the change makes false is updated in the same change; a code change alone owes no doc change. The `docs-writing` skill states what each document holds.\n- Once a commit has been reported to the orchestrator, in a return artifact or in a message naming it, later work adds a commit and never amends, whatever the branch push state. The one exception is a head the orchestrator states is unread: there the orch fix cycle may amend, only to refresh a required check that cannot be rerun.\n- A push that prints `rebase-map:` lines has rewritten the shas the PR's `Fixed in \u003Csha>` replies name: before holding, re-reply each such thread with the new sha, or post the map as one PR comment naming old and new per line; a sha the map reports as `dropped` gets a reply that the fix commit no longer exists on the branch.\n\nCode standards are [`..\u002Fcode-quality\u002FSKILL.md`](..\u002Fcode-quality\u002FSKILL.md): correctness, comments, over-engineering, cleanup.\n\n## Round Contract\n\nExecute workflow sections in order; a \"**Skip if**\" condition is the workflow's decision, never your own scope assessment. Never push and never open a PR. The orchestrator owns publication order through orch's `pr-order` resolver. A finding on a mechanism this diff introduces or arms is a fix whatever the round, unless Step 0 of the disposition flow excludes it; a `Declined:` there takes one of the reason forms [`..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md`](..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md) § Decision flow sets out, never a label or a test count.\n\nA session keeps the rule text it loaded, and a push, `worktree create --reuse` or a restack can rebase the branch onto a base that changed that text. A session that already ran a round on this branch runs this diff before the round's first step, `[PREVIOUS_ROUND_COMMIT]` being the commit its last round reported: `git diff --no-renames --name-only [PREVIOUS_ROUND_COMMIT] HEAD -- \u003Ceach loaded file's repo path>`. Before that first step, it reads again each listed file. A listed path it loaded that no longer exists voids the text loaded from it; it reads again the skill's current `SKILL.md`, or the file that replaced it, in its place.\n\n**The completion artifact is the round.** `dev-return-write` writes it after the commit; never hand-author the JSON (schema: orch [`schemas\u002Fdev-return.md`](..\u002Forch\u002Fschemas\u002Fdev-return.md)).\n\n- `--issue` is the delegation's `Artifact Key:` line, the workflow-state key where one exists, or the `local-` key `workflow-state new-local-key` mints, per [`dev-return.md` § Identity: the round id](..\u002Forch\u002Fschemas\u002Fdev-return.md#identity-the-round-id); never the tracker-native `OWNER\u002FREPO#N` or a bare number. `--round-id` is its `Round ID:` line.\n- `--kind` always matches what was delegated. `--validate` matches your commit message and return. `--validate-note` carries the test-only validation-ceiling report when that route applies. Flag constraints and value shapes: `dev-return-write --help`.\n\n**Acceptance is that artifact plus git state, never your message.** Write the artifact, then return exactly once over the harness's agent-to-agent channel; a disk write is not a return. Send the `**Return exactly**` body once and go idle. Once the artifact is written, start no validation, test, lint or build run except the admitted stopped-round recovery in [dev-implement.md § 5](workflows\u002Fdev-implement.md#5-validate); otherwise the orchestrator validates there next.\n\nUnder push-first, queue-only work can close its local round before a pull request exists when `dev-validate-run` proves that the resolved base requires the merge queue and the configured validation context. Its CI record names `ci-event=merge_group` and remains pending. The orchestrator's existing queue route proves that required run.\n\nThe Codex caller follows [orch codex-runtime.md § Delegated round wait](..\u002Forch\u002Freferences\u002Fcodex-runtime.md#delegated-round-wait) while this agent works.\n\n- The channel is Claude Code `SendMessage`, Codex `send_input`, OpenCode a resume on the stored `task_id`, Pi background the final assistant message. Copilot CLI's channel is not yet measured, so this contract names none for it.\n- In a Pi persistent pane, follow the return with `complete_subagent`; background agents must not call it.\n- On Codex the `send_input` MESSAGE is the durable return, and the runtime's `FINAL_ANSWER` echo of it is expected, not a separate return to author or expand.\n\n## Validation\n\nThe validation gate and role ownership are complete in [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate). For that gate, run no proof, rerun, receipt, isolation step, or approval step that section does not name. That section also owns the one proposed-rule route and verification of the controls code-quality § Tests requires.\n\nA test or sandbox run outside that gate, such as a nested-session smoke run or one test file run alone while investigating, is an investigation run and names its question first. Before it starts, append `Run N: question: \u003Cwhat this run decides>; expect: \u003Cthe result that answers yes or no>` to the round notes, `[WORKTREE_PATH]\u002Ftmp\u002Frun-notes-[ARTIFACT_KEY]-[DEV_ROUND_ID].md`; after it, append `Run N: answer: \u003Cyes|no|inconclusive> \u003Cone line>`. A run with no question line is not started. A second `inconclusive` in a row on one question sends the agent back to the code and logs, never to a third run. Every run the gate lists is exempt, its must-fail controls included.\n\n### Long-Running Validation\n\n**Invariant, every harness:** the completion tail (commit → QA labels → summary → artifact → return) is never dropped, and an interrupted run is never success. Re-check its real outcome and resume the tail.\n\nOn a host whose agent warden reaps orphan scopes, a foreground project entry-point run or an `--attached` run does not survive its agent's scope. A context handoff with either run in flight holds the stop until the verdict. If the session must stop first, its handoff `traps` record the interruption, the runner identity, the log and exit-receipt paths, and one recovery route. The successor confirms the old run has stopped, preserves its log and any exit receipt, and reruns only those interrupted checks once. Use the orch job runner or `dev-validate-run` according to this section's command routes, with a runner that survives the successor's agent scope. Never wait on an orphan queued run whose parent is gone.\n\nA command that can outlast the harness's tool-call limit never runs as one blocking foreground tool call, with two exceptions: the `dev-validate-run` start, whose detached run and on-disk verdict survive a cut-off call and whose `--wait --run-dir` poll resumes it, and a project validation entry point on the foreground route [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate) gives a project whose own policy forbids `dev-validate-run`, run under the harness's maximum command timeout. Run only `DEV_VALIDATE_CMD` and `DEV_VALIDATE_RANGE_CMD` through `dev-validate-run`, outside that route; never override these settings per run. Run every other long command, including standalone preflight, doc-limits and mutation-control sweeps, through the orch job runner per [waiter-launch.md](..\u002Forch\u002Freferences\u002Fwaiter-launch.md). Read each completion file, preserve nonzero exit codes, and report an interruption without a verdict as failure.\n\nBefore starting, polling or resuming validation, read [long-running-validation.md](workflows\u002Flong-running-validation.md).\n\n## Reflect\n\n**Skip if** nothing recurred and nothing surprised you. Otherwise a lesson goes to the authoritative place only where it is a durable constraint: a regression test, a reason comment at the code, an `AGENTS.md` convention, a decision record under the decider bar, or a principle doc where the `docs-writing` skill admits one. Add nothing when the repository already holds it. A rule for the managing project alone goes in its kendex config (`kendex.toml` at the kendex project root, `kendex-local.toml` in a source-catalog checkout) under `[skill-instructions]`, `[agent-additional-instructions]`, or `[agent-launch-instructions]`. Bar: would this save 5+ minutes in a future session? One surgical addition per lesson, no verbose examples. A config edit takes effect only once it is rendered: render it where the project's render policy lets you, and otherwise name it, and anything else you cannot update yourself, in your return as `[process]` discovered work.\n\n## Configuration\n\nAgent-type placeholders are project-configurable: `[AGENT_TYPE]` (dev agents receiving implementation delegations), `[REVIEW_AGENT]`, `[QA_AGENT]`. Commit format: `[PREFIX]([ISSUE_ID]): [DESCRIPTION]`. `DEV_VALIDATE_CMD` (`kendex.settings.toml` `[env]`) names the project's validation command for the Validate step; [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate) states what it must read and that an empty value is a validation failure, never a fallback. `DEV_VALIDATE_RANGE_CMD` (same table, optional) names the command a fix round runs instead, which validates the changes since the commit it reads as `DEV_VALIDATE_BASE`; unset, a fix round runs `DEV_VALIDATE_CMD`. An orch restack also runs it, as [`..\u002Forch\u002Fworkflows\u002Fmerge-pr-restack.md`](..\u002Forch\u002Fworkflows\u002Fmerge-pr-restack.md) sets out. `DEV_VALIDATE_CI_CONTEXT` (same table, optional) names the required status check context whose run covers `DEV_VALIDATE_CMD`: the merge-group run where `dev-validate-run --record` names `ci-event=merge_group`, as every queue-only change's does, and the pull-request run otherwise; `dev-validate-run --help` states when a `ci` run leaves a round to it. `DEV_VALIDATE_FINDING_PREFIX` (same table, optional) is the prefix both commands print each finding line with; `dev-validate-run --help` states what a run the bound ended with no such line answers. `DEV_VALIDATE_TIMEOUT_SECS` (same table, default 3600) is how long either command may run, and the only number § Long-Running Validation derives its cap from.\n","\u003C!-- kendex:project-instructions:start -->\n## Project Instructions\n\n\u003C!-- kendex:shared-instructions:start -->\nProblems with a kendex-owned skill go through `kendex report`; check ownership in the file first.\n\u003C!-- kendex:shared-instructions:end -->\n\u003C!-- kendex:project-instructions:end -->\n\n# Dev Workflows\n\norch is the caller and runtime: it owns delegation format, round acceptance, and every shell-shape rule.\n\n| Workflow | Purpose |\n|----------|---------|\n| `workflows\u002Fdev-implement.md` | Implementation: activate → plan → implement → validate → commit → QA labels → summary → artifact → return (§ 1-11) |\n| `workflows\u002Fdev-fix.md` | Review fixes: evaluate → apply or skip → validate → commit → artifact → return |\n\nReview and QA-review belong to the reviewer skill's workflows\u002Freview.md and workflows\u002Fqa-review.md. Command shapes are orch's [`..\u002Forch\u002FSKILL.md`](..\u002Forch\u002FSKILL.md) § Harness-Safe Shell; literal format tags and round mechanics are its [`..\u002Forch\u002Freferences\u002Fskill-rules.md`](..\u002Forch\u002Freferences\u002Fskill-rules.md) § Format Tags Are Literal and § Round Closure.\n\n## Implementer selection\n\nAn `agent:X` label selects X. With no agent label, use the item's Location paths and required work:\n\n| Required work | Agent |\n|---|---|\n| Non-Iced Rust implementation | `rust` |\n| Iced view layer and UI messages, even under `crates\u002F` | `iced` |\n| Declarative UI: TypeScript\u002FReact web, mobile and terminal views. Frontend owns all Quickshell QML and its JavaScript, view and non-view. | `frontend` |\n| SwiftUI and UIKit views, Swift application code, Xcode and Swift Package Manager builds\u002Ftests; excludes non-UI runtime and data persistence | `swift` |\n| Non-UI shell, Python, TypeScript or Go runtime implementation | `runtime` |\n| Documentation, references, file or configuration organization | `maintainer` |\n\nFor an item spanning domains, split the delegation by domain. If the selected agent is not installed, report the missing agent to the caller. Never substitute `maintainer` for runtime or UI implementation.\n\n## Engineering Rules\n\n- Scope is the issue's Done-when. A behavioral surface that does not trace to it stays out of this change, and a committed render of a source file you changed traces to whatever its source traces to. Two exceptions:\n  - the mechanical enablers of landing it ride without tracing to it: locks, changelog, baselines, dismissal renewals, that list and nothing else, never code that runs at runtime;\n  - a defect the change introduces or arms is in scope by definition, unless Step 0 of [`..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md`](..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md) excludes it.\n- A behavior change ships with the test code-quality admits; the pull request body names an omitted test and the judgement. A workflow sentence ships no test. A test that drives a second implementation or stubs the function under test does not count. Message assertions follow [code-quality § Tests](..\u002Fcode-quality\u002FSKILL.md#tests).\n- A review finding adds a case only when it names a behaviour no existing case reaches. Otherwise it tightens the existing case's assertion, and the item reasoning names that case.\n- A second fix round on the same function's guard is recurrence: redesign the rule under test so the class is unrepresentable, and fold the family of cases into one table. Fix an item with an `Owner:` line at that owner, with one table whose rows cover every state the owner can be in.\n- A test whose premise died is deleted whole in the commit that kills the premise, and the PR body names the deletion.\n- Test shape is [code-quality § Tests](..\u002Fcode-quality\u002FSKILL.md#tests) and [§ Prove Your Guards](..\u002Fcode-quality\u002FSKILL.md#prove-your-guards).\n- A refusal, a validator, a lock, a retry, or a test exists only for an input a real producer emits, this project's code or anything it calls or serves; name that producer beside it, or do not write it.\n- When a change deletes a call, apply [code-quality § Cleanup](..\u002Fcode-quality\u002FSKILL.md#cleanup) to its callee. Its deletion maps to the call removal's Done-when item; no internal caller is not proof that a supported external API is unused.\n- A field, setting, or view member added by the change has a real producer and consumer. A named and documented external producer or consumer is valid when the change adds its in-repository counterpart; otherwise, add both sides in the change.\n- Follow the project's declared release compatibility standard for changes to project-owned formats.\n- Before adding a function, parser, stub or loop, grep the repo for the verb it performs; before stating a rule, grep for the rule.\n  - A second copy of that verb, in any language, is a twin and never delegation, and so is a second statement of a rule another file owns, in prose, config or a table.\n  - Call or cite the one that exists, or escalate in your return. An issue that orders a twin is escalated, not implemented.\n- A doc claim the change makes false is updated in the same change; a code change alone owes no doc change. The `docs-writing` skill states what each document holds.\n- Once a commit has been reported to the orchestrator, in a return artifact or in a message naming it, later work adds a commit and never amends, whatever the branch push state. The one exception is a head the orchestrator states is unread: there the orch fix cycle may amend, only to refresh a required check that cannot be rerun.\n- A push that prints `rebase-map:` lines has rewritten the shas the PR's `Fixed in \u003Csha>` replies name: before holding, re-reply each such thread with the new sha, or post the map as one PR comment naming old and new per line; a sha the map reports as `dropped` gets a reply that the fix commit no longer exists on the branch.\n\nCode standards are [`..\u002Fcode-quality\u002FSKILL.md`](..\u002Fcode-quality\u002FSKILL.md): correctness, comments, over-engineering, cleanup.\n\n## Round Contract\n\nExecute workflow sections in order; a \"**Skip if**\" condition is the workflow's decision, never your own scope assessment. Never push and never open a PR. The orchestrator owns publication order through orch's `pr-order` resolver. A finding on a mechanism this diff introduces or arms is a fix whatever the round, unless Step 0 of the disposition flow excludes it; a `Declined:` there takes one of the reason forms [`..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md`](..\u002Freviewer\u002Freferences\u002Ffinding-disposition.md) § Decision flow sets out, never a label or a test count.\n\nA session keeps the rule text it loaded, and a push, `worktree create --reuse` or a restack can rebase the branch onto a base that changed that text. A session that already ran a round on this branch runs this diff before the round's first step, `[PREVIOUS_ROUND_COMMIT]` being the commit its last round reported: `git diff --no-renames --name-only [PREVIOUS_ROUND_COMMIT] HEAD -- \u003Ceach loaded file's repo path>`. Before that first step, it reads again each listed file. A listed path it loaded that no longer exists voids the text loaded from it; it reads again the skill's current `SKILL.md`, or the file that replaced it, in its place.\n\n**The completion artifact is the round.** `dev-return-write` writes it after the commit; never hand-author the JSON (schema: orch [`schemas\u002Fdev-return.md`](..\u002Forch\u002Fschemas\u002Fdev-return.md)).\n\n- `--issue` is the delegation's `Artifact Key:` line, the workflow-state key where one exists, or the `local-` key `workflow-state new-local-key` mints, per [`dev-return.md` § Identity: the round id](..\u002Forch\u002Fschemas\u002Fdev-return.md#identity-the-round-id); never the tracker-native `OWNER\u002FREPO#N` or a bare number. `--round-id` is its `Round ID:` line.\n- `--kind` always matches what was delegated. `--validate` matches your commit message and return. `--validate-note` carries the test-only validation-ceiling report when that route applies. Flag constraints and value shapes: `dev-return-write --help`.\n\n**Acceptance is that artifact plus git state, never your message.** Write the artifact, then return exactly once over the harness's agent-to-agent channel; a disk write is not a return. Send the `**Return exactly**` body once and go idle. Once the artifact is written, start no validation, test, lint or build run except the admitted stopped-round recovery in [dev-implement.md § 5](workflows\u002Fdev-implement.md#5-validate); otherwise the orchestrator validates there next.\n\nUnder push-first, queue-only work can close its local round before a pull request exists when `dev-validate-run` proves that the resolved base requires the merge queue and the configured validation context. Its CI record names `ci-event=merge_group` and remains pending. The orchestrator's existing queue route proves that required run.\n\nThe Codex caller follows [orch codex-runtime.md § Delegated round wait](..\u002Forch\u002Freferences\u002Fcodex-runtime.md#delegated-round-wait) while this agent works.\n\n- The channel is Claude Code `SendMessage`, Codex `send_input`, OpenCode a resume on the stored `task_id`, Pi background the final assistant message. Copilot CLI's channel is not yet measured, so this contract names none for it.\n- In a Pi persistent pane, follow the return with `complete_subagent`; background agents must not call it.\n- On Codex the `send_input` MESSAGE is the durable return, and the runtime's `FINAL_ANSWER` echo of it is expected, not a separate return to author or expand.\n\n## Validation\n\nThe validation gate and role ownership are complete in [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate). For that gate, run no proof, rerun, receipt, isolation step, or approval step that section does not name. That section also owns the one proposed-rule route and verification of the controls code-quality § Tests requires.\n\nA test or sandbox run outside that gate, such as a nested-session smoke run or one test file run alone while investigating, is an investigation run and names its question first. Before it starts, append `Run N: question: \u003Cwhat this run decides>; expect: \u003Cthe result that answers yes or no>` to the round notes, `[WORKTREE_PATH]\u002Ftmp\u002Frun-notes-[ARTIFACT_KEY]-[DEV_ROUND_ID].md`; after it, append `Run N: answer: \u003Cyes|no|inconclusive> \u003Cone line>`. A run with no question line is not started. A second `inconclusive` in a row on one question sends the agent back to the code and logs, never to a third run. Every run the gate lists is exempt, its must-fail controls included.\n\n### Long-Running Validation\n\n**Invariant, every harness:** the completion tail (commit → QA labels → summary → artifact → return) is never dropped, and an interrupted run is never success. Re-check its real outcome and resume the tail.\n\nOn a host whose agent warden reaps orphan scopes, a foreground project entry-point run or an `--attached` run does not survive its agent's scope. A context handoff with either run in flight holds the stop until the verdict. If the session must stop first, its handoff `traps` record the interruption, the runner identity, the log and exit-receipt paths, and one recovery route. The successor confirms the old run has stopped, preserves its log and any exit receipt, and reruns only those interrupted checks once. Use the orch job runner or `dev-validate-run` according to this section's command routes, with a runner that survives the successor's agent scope. Never wait on an orphan queued run whose parent is gone.\n\nA command that can outlast the harness's tool-call limit never runs as one blocking foreground tool call, with two exceptions: the `dev-validate-run` start, whose detached run and on-disk verdict survive a cut-off call and whose `--wait --run-dir` poll resumes it, and a project validation entry point on the foreground route [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate) gives a project whose own policy forbids `dev-validate-run`, run under the harness's maximum command timeout. Run only `DEV_VALIDATE_CMD` and `DEV_VALIDATE_RANGE_CMD` through `dev-validate-run`, outside that route; never override these settings per run. Run every other long command, including standalone preflight, doc-limits and mutation-control sweeps, through the orch job runner per [waiter-launch.md](..\u002Forch\u002Freferences\u002Fwaiter-launch.md). Read each completion file, preserve nonzero exit codes, and report an interruption without a verdict as failure.\n\nBefore starting, polling or resuming validation, read [long-running-validation.md](workflows\u002Flong-running-validation.md).\n\n## Reflect\n\n**Skip if** nothing recurred and nothing surprised you. Otherwise a lesson goes to the authoritative place only where it is a durable constraint: a regression test, a reason comment at the code, an `AGENTS.md` convention, a decision record under the decider bar, or a principle doc where the `docs-writing` skill admits one. Add nothing when the repository already holds it. A rule for the managing project alone goes in its kendex config (`kendex.toml` at the kendex project root, `kendex-local.toml` in a source-catalog checkout) under `[skill-instructions]`, `[agent-additional-instructions]`, or `[agent-launch-instructions]`. Bar: would this save 5+ minutes in a future session? One surgical addition per lesson, no verbose examples. A config edit takes effect only once it is rendered: render it where the project's render policy lets you, and otherwise name it, and anything else you cannot update yourself, in your return as `[process]` discovered work.\n\n## Configuration\n\nAgent-type placeholders are project-configurable: `[AGENT_TYPE]` (dev agents receiving implementation delegations), `[REVIEW_AGENT]`, `[QA_AGENT]`. Commit format: `[PREFIX]([ISSUE_ID]): [DESCRIPTION]`. `DEV_VALIDATE_CMD` (`kendex.settings.toml` `[env]`) names the project's validation command for the Validate step; [dev-implement.md § 5. Validate](workflows\u002Fdev-implement.md#5-validate) states what it must read and that an empty value is a validation failure, never a fallback. `DEV_VALIDATE_RANGE_CMD` (same table, optional) names the command a fix round runs instead, which validates the changes since the commit it reads as `DEV_VALIDATE_BASE`; unset, a fix round runs `DEV_VALIDATE_CMD`. An orch restack also runs it, as [`..\u002Forch\u002Fworkflows\u002Fmerge-pr-restack.md`](..\u002Forch\u002Fworkflows\u002Fmerge-pr-restack.md) sets out. `DEV_VALIDATE_CI_CONTEXT` (same table, optional) names the required status check context whose run covers `DEV_VALIDATE_CMD`: the merge-group run where `dev-validate-run --record` names `ci-event=merge_group`, as every queue-only change's does, and the pull-request run otherwise; `dev-validate-run --help` states when a `ci` run leaves a round to it. `DEV_VALIDATE_FINDING_PREFIX` (same table, optional) is the prefix both commands print each finding line with; `dev-validate-run --help` states what a run the bound ended with no such line answers. `DEV_VALIDATE_TIMEOUT_SECS` (same table, default 3600) is how long either command may run, and the only number § Long-Running Validation derives its cap from.\n",{"name":5,"license":15,"metadata":41,"description":7,"user-invocable":45},{"bugs":42,"author":12,"source":43,"repository":44},"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fissues","kendex","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex",true,"main","a2e5db5fb9ec70910af6c687644cae6edac1dba8",".agents\u002Fskills\u002Fdev",37,"https:\u002F\u002Fkendex.ai","https:\u002F\u002Fgithub.com\u002Fvanillagreencom","http:\u002F\u002Fvanillagreen.com","2026-11-14 03:55:14",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":45},[56,59,62],{"tool":57,"command":58},"npx","npx skills add vanillagreencom\u002Fkendex --skill dev",{"tool":60,"command":61},"bunx","bunx skills add vanillagreencom\u002Fkendex --skill dev",{"tool":63,"command":64},"pnpm","pnpm dlx skills add vanillagreencom\u002Fkendex --skill dev","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002FSKILL.md",[67,73,79,83,87],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"kendex.settings.toml.example","OTHER","其他",2453,"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002Fkendex.settings.toml.example",{"path":74,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"README.md","REFERENCE","参考文档",2649,"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002FREADME.md",{"path":80,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":81,"sourceHtmlUrl":82},"workflows\u002Fdev-fix.md",11711,"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002Fworkflows\u002Fdev-fix.md",{"path":84,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":85,"sourceHtmlUrl":86},"workflows\u002Fdev-implement.md",34717,"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002Fworkflows\u002Fdev-implement.md",{"path":88,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":89,"sourceHtmlUrl":90},"workflows\u002Flong-running-validation.md",5113,"https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fdev\u002Fworkflows\u002Flong-running-validation.md",[92,115,144,167,205,233],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":36},"01M6HZ0GYHMRX8JCH9RPPAY59N","youtube-publish","Load to draft a YouTube upload, comment or reply, or send a draft after the user's recorded approval.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fyoutube-publish\u002FSKILL.md",[],[99,100,101,102,26,28,103,29,104,105,106,107,108,109,31,110,32,111,112,113,114],"youtube publish","publish","youtube","youtube upload","publishing","upload","api","synthetic","check","draft","with","integration","data","youtube data","content","send",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":124,"publishedAt":36},"01M6HZ0CT05TA9746ZG5Q4K1E0","xcode-run","Load to install or dispatch a macOS GitHub Actions build, test or simulator screenshot run for an Xcode project.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fxcode-run\u002FSKILL.md",[121],{"categoryNo":122,"categoryName":123,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[125,126,127,128,129,130,131,26,132,133,134,135,136,137,138,139,140,141,142,143],"xcode","run","xcode run","SET","project","actions","testing","github actions","workflows","workflow","logs","delete","artifact","scripts","repository","install","screenshot","macos","screenshots",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":36},"01M6HZ060RP0FKH75JKN214909","worktree","Load to create, list, remove, push, or repair a git worktree.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fworktree\u002FSKILL.md",[],[146,151,152,26,153,154,155,156,157,158,159,160,161,162,163,28,164,165,29,166],"branch","remove","create","git worktree","config","git","list","path","push","repair","conflict","pr","continue","reuse","replay","keep",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":171,"sourceHtmlUrl":172,"categories":173,"keywords":186,"publishedAt":36},"01M6HZ01AB8P28NTWWMHDMTM0A","social-media-content-calendar","Load to plan a social media campaign, build a content calendar, or adapt existing material into post drafts.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fsocial-media-content-calendar\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fsocial-media-content-calendar\u002FSKILL.md",[174,177,178,183],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":179,"categoryName":180,"taxonomyType":181,"taxonomyTypeDesc":182},"01JBSEEDCAT000000000000035","市场营销","PROFESSION","适用职业",{"categoryNo":184,"categoryName":185,"taxonomyType":181,"taxonomyTypeDesc":182},"01JBSEEDCAT000000000000036","内容创作者",[187,188,189,190,191,192,113,193,26,194,195,196,197,198,199,200,201,202,28,203,204],"Media","social","calendar","content calendar","social media content calendar","social media","adaptation","campaign","plan","drafts","asset","briefs","platform","planning","for","adapt","material","approval gate",{"skillNo":206,"name":207,"nameZh":6,"description":208,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":209,"categories":210,"keywords":214,"publishedAt":36},"01M6HYZS25D7RJK8CZ93MCZ3V8","slack","Load to bind an overseer's mailbox to a private Slack channel, run or check the relay, or post an alert or a file to Slack.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fslack\u002FSKILL.md",[211],{"categoryNo":212,"categoryName":213,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[207,215,216,217,218,219,220,221,222,26,28,29,223,224,225,226,227,126,140,228,229,230,107,231,232],"bind","back","checkout","lane","relay","messages","socket","mode","compact","alert","orchestration","mail","communication","linear","receiver","file","store","post",{"skillNo":234,"name":235,"nameZh":6,"description":236,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":237,"categories":238,"keywords":239,"publishedAt":36},"01M6HYZHPANA68C9WQQ11A1B5Z","second-opinion","Load for a cross-model review, challenge, audit, or quick consult.","https:\u002F\u002Fgithub.com\u002Fvanillagreencom\u002Fkendex\u002Fblob\u002Fmain\u002Fskills\u002Fsecond-opinion\u002FSKILL.md",[],[240,241,242,243,244,245,201,246,26,247,248,28,249,29,250,30,251,252,31,253,32],"second opinion","second","quick","ai cli","scope","model","pi","copilot","challenge","question","consult","codex","cli","audit"]