workflow-toolkit 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/.agents/skills/ponytail/SKILL.md +111 -0
  2. package/.agents/skills/ponytail-audit/SKILL.md +37 -0
  3. package/.agents/skills/ponytail-debt/SKILL.md +41 -0
  4. package/.agents/skills/ponytail-gain/SKILL.md +47 -0
  5. package/.agents/skills/ponytail-help/SKILL.md +70 -0
  6. package/.agents/skills/ponytail-review/SKILL.md +52 -0
  7. package/.agents/skills/prompt-review/SKILL.md +60 -0
  8. package/.agents/skills/wtk/SKILL.md +64 -0
  9. package/.agents/skills/wtk/references/artifacts.md +82 -0
  10. package/.agents/skills/wtk/references/evidence.md +68 -0
  11. package/.agents/skills/wtk/references/git.md +75 -0
  12. package/.agents/skills/wtk/references/test-contract.md +76 -0
  13. package/.agents/skills/wtk/references/validation.md +127 -0
  14. package/.agents/skills/wtk-config/SKILL.md +102 -0
  15. package/.agents/skills/wtk-config/assets/agents/claude/deep-reviewer.md +40 -0
  16. package/.agents/skills/wtk-config/assets/agents/claude/designer.md +57 -0
  17. package/.agents/skills/wtk-config/assets/agents/claude/explorer.md +41 -0
  18. package/.agents/skills/wtk-config/assets/agents/claude/implementer.md +57 -0
  19. package/.agents/skills/wtk-config/assets/agents/claude/planner.md +68 -0
  20. package/.agents/skills/wtk-config/assets/agents/claude/verifier.md +80 -0
  21. package/.agents/skills/wtk-config/assets/agents/codex/deep-reviewer.toml +41 -0
  22. package/.agents/skills/wtk-config/assets/agents/codex/designer.toml +55 -0
  23. package/.agents/skills/wtk-config/assets/agents/codex/explorer.toml +35 -0
  24. package/.agents/skills/wtk-config/assets/agents/codex/implementer.toml +52 -0
  25. package/.agents/skills/wtk-config/assets/agents/codex/planner.toml +66 -0
  26. package/.agents/skills/wtk-config/assets/agents/codex/verifier.toml +78 -0
  27. package/.agents/skills/wtk-config/assets/agents/cursor/deep-reviewer.md +38 -0
  28. package/.agents/skills/wtk-config/assets/agents/cursor/designer.md +55 -0
  29. package/.agents/skills/wtk-config/assets/agents/cursor/explorer.md +39 -0
  30. package/.agents/skills/wtk-config/assets/agents/cursor/implementer.md +55 -0
  31. package/.agents/skills/wtk-config/assets/agents/cursor/planner.md +66 -0
  32. package/.agents/skills/wtk-config/assets/agents/cursor/verifier.md +79 -0
  33. package/.agents/skills/wtk-config/scripts/ad-index.py +123 -0
  34. package/.agents/skills/wtk-config/scripts/repository_intelligence.py +671 -0
  35. package/.agents/skills/wtk-config/scripts/workflow_config.py +972 -0
  36. package/.agents/skills/wtk-deep-review/SKILL.md +164 -0
  37. package/.agents/skills/wtk-deep-review/assets/PROMPT.md +56 -0
  38. package/.agents/skills/wtk-deep-review/assets/REVIEW_UI.html +1340 -0
  39. package/.agents/skills/wtk-deep-review/assets/findings.schema.json +113 -0
  40. package/.agents/skills/wtk-deep-review/references/context-pack.md +88 -0
  41. package/.agents/skills/wtk-deep-review/references/orchestration.md +164 -0
  42. package/.agents/skills/wtk-deep-review/references/output-contracts.md +149 -0
  43. package/.agents/skills/wtk-deep-review/references/publish-github.md +83 -0
  44. package/.agents/skills/wtk-deep-review/references/state-and-learnings.md +64 -0
  45. package/.agents/skills/wtk-deep-review/references/subagent-runtimes.md +33 -0
  46. package/.agents/skills/wtk-deep-review/references/taxonomy.md +70 -0
  47. package/.agents/skills/wtk-deep-review/scripts/_common.py +371 -0
  48. package/.agents/skills/wtk-deep-review/scripts/build_jobs.py +561 -0
  49. package/.agents/skills/wtk-deep-review/scripts/build_knowledge.py +349 -0
  50. package/.agents/skills/wtk-deep-review/scripts/build_manifest.py +479 -0
  51. package/.agents/skills/wtk-deep-review/scripts/graft_context.py +160 -0
  52. package/.agents/skills/wtk-deep-review/scripts/graphify_context.py +75 -0
  53. package/.agents/skills/wtk-deep-review/scripts/merge_findings.py +313 -0
  54. package/.agents/skills/wtk-deep-review/scripts/render_html.py +240 -0
  55. package/.agents/skills/wtk-deep-review/scripts/render_review.py +282 -0
  56. package/.agents/skills/wtk-deep-review/scripts/run_jobs.py +436 -0
  57. package/.agents/skills/wtk-deep-review/scripts/token_metrics.py +369 -0
  58. package/.agents/skills/wtk-discover/SKILL.md +270 -0
  59. package/.agents/skills/wtk-discover/references/document-format.md +149 -0
  60. package/.agents/skills/wtk-implement/SKILL.md +95 -0
  61. package/.agents/skills/wtk-implement/references/checklist-format.md +116 -0
  62. package/.agents/skills/wtk-implement/references/screens.md +129 -0
  63. package/.agents/skills/wtk-implement/references/test-policy.md +152 -0
  64. package/.agents/skills/wtk-implement/references/verify.md +297 -0
  65. package/.agents/skills/wtk-knowledge-check/SKILL.md +16 -0
  66. package/.agents/skills/wtk-knowledge-check/scripts/check.ts +502 -0
  67. package/.agents/skills/wtk-knowledge-check/scripts/cli.ts +32 -0
  68. package/.agents/skills/wtk-knowledge-check/scripts/frontmatter.ts +44 -0
  69. package/.agents/skills/wtk-lean/.skill-meta.json +6 -0
  70. package/.agents/skills/wtk-lean/NOTICE.md +18 -0
  71. package/.agents/skills/wtk-lean/SKILL.md +137 -0
  72. package/.agents/skills/wtk-lean/references/build.md +168 -0
  73. package/.agents/skills/wtk-lean/references/checks.md +253 -0
  74. package/.agents/skills/wtk-lean/references/memory.md +156 -0
  75. package/.agents/skills/wtk-lean/references/plan.md +514 -0
  76. package/.agents/skills/wtk-lean/references/verify.md +336 -0
  77. package/.agents/skills/wtk-lean/scripts/check_commit.py +121 -0
  78. package/.agents/skills/wtk-lean/scripts/fixtures/checks.md +98 -0
  79. package/.agents/skills/wtk-lean/scripts/fixtures/plan.md +119 -0
  80. package/.agents/skills/wtk-lean/scripts/fixtures/verification.md +41 -0
  81. package/.agents/skills/wtk-lean/scripts/lessons.py +412 -0
  82. package/.agents/skills/wtk-lean/scripts/selftest.py +401 -0
  83. package/.agents/skills/wtk-lean/scripts/validate_checks.py +417 -0
  84. package/.agents/skills/wtk-lean/scripts/validate_plan.py +580 -0
  85. package/.agents/skills/wtk-lean/scripts/validate_verification.py +357 -0
  86. package/.agents/skills/wtk-plan/SKILL.md +102 -0
  87. package/.agents/skills/wtk-plan/references/document-format.md +222 -0
  88. package/.agents/skills/wtk-qa/SKILL.md +14 -0
  89. package/.agents/skills/wtk-qa-execute/SKILL.md +115 -0
  90. package/.agents/skills/wtk-qa-execute/references/fix-loop.md +23 -0
  91. package/.agents/skills/wtk-qa-execute/references/session-protocol.md +25 -0
  92. package/.agents/skills/wtk-qa-plan/SKILL.md +111 -0
  93. package/.agents/skills/wtk-qa-plan/references/profile.md +35 -0
  94. package/.agents/skills/wtk-ship/SKILL.md +49 -0
  95. package/.agents/skills/wtk-ship/remediation.py +170 -0
  96. package/.agents/skills/wtk-ship/scripts/close_feature.py +83 -0
  97. package/.agents/skills/wtk-ship/scripts/review_convergence.py +373 -0
  98. package/.wtk.toml.example +93 -0
  99. package/AGENTS.md +129 -0
  100. package/NOTICE.md +12 -0
  101. package/README.md +440 -0
  102. package/bin/wtk.js +25 -0
  103. package/docs/toolkit/README.md +56 -0
  104. package/docs/toolkit/decisions.md +61 -0
  105. package/docs/toolkit/guidelines/CONTEXT-BUDGET.md +64 -0
  106. package/docs/toolkit/guidelines/DX.md +67 -0
  107. package/docs/toolkit/guidelines/FRONTEND.md +73 -0
  108. package/docs/toolkit/guidelines/KNOWLEDGE-WIKI.md +128 -0
  109. package/docs/toolkit/guidelines/MODELING.md +134 -0
  110. package/docs/toolkit/guidelines/QA-EXECUTION.md +46 -0
  111. package/docs/toolkit/guidelines/QA-SCENARIOS.md +165 -0
  112. package/docs/toolkit/guidelines/REVIEW-ROUNDS.md +160 -0
  113. package/docs/toolkit/guidelines/SECURITY.md +160 -0
  114. package/docs/toolkit/guidelines/UI-UX.md +117 -0
  115. package/docs/toolkit/guidelines/WORKFLOW-MEMORY.md +73 -0
  116. package/docs/toolkit/guidelines.md +50 -0
  117. package/docs/toolkit/loop.md +77 -0
  118. package/docs/toolkit/purpose.md +51 -0
  119. package/docs/toolkit/repository-intelligence.md +53 -0
  120. package/docs/toolkit/reviews.md +77 -0
  121. package/knowledge/AGENTS.md +316 -0
  122. package/knowledge/raw/README.md +17 -0
  123. package/package.json +74 -0
  124. package/scripts/install_security_skills.py +816 -0
  125. package/scripts/installer/engine.js +254 -0
  126. package/scripts/installer/knowledge.js +28 -0
  127. package/scripts/installer/packets.js +77 -0
  128. package/scripts/installer/terminal.js +98 -0
  129. package/scripts/installer/transaction.js +75 -0
  130. package/skills-lock.json +92 -0
  131. package/templates/adoption/agents/core.md +23 -0
  132. package/templates/adoption/agents/quality.md +3 -0
  133. package/templates/adoption/knowledge/wiki/architecture/index.md +3 -0
  134. package/templates/adoption/knowledge/wiki/decisions/index.md +3 -0
  135. package/templates/adoption/knowledge/wiki/design/index.md +3 -0
  136. package/templates/adoption/knowledge/wiki/domain/index.md +3 -0
  137. package/templates/adoption/knowledge/wiki/index.md +3 -0
  138. package/templates/adoption/knowledge/wiki/log.md +3 -0
  139. package/templates/adoption/knowledge/wiki/open-questions/index.md +3 -0
  140. package/templates/adoption/knowledge/wiki/product/index.md +3 -0
  141. package/templates/adoption/knowledge/wiki/research/index.md +3 -0
  142. package/templates/adoption/product/AGENT-CONTEXT.md +25 -0
@@ -0,0 +1,222 @@
1
+ # Task document format
2
+
3
+ Load this file only when writing `.tasks/<name>.md` — after the cut, the grounding, the surface walk, and the sweep. Do not load it during Cut.
4
+
5
+ Section headings stay as they are — the next skill refers to them by name — while the prose follows the language of the document and identifiers are never translated. The document is for humans first: `wtk-implement` copies criteria into checks, and nothing under `Unresolved` gets settled while building.
6
+
7
+ Replace every placeholder with a concrete value, or omit the section. A heading with "N/A" under it does not appear.
8
+
9
+ ## Template
10
+
11
+ Write `.tasks/<name>.md`, one file per task:
12
+
13
+ ````markdown
14
+ # <Title>
15
+
16
+ > Build this with **wtk-implement** (`<repo-relative path, when the project vendors the skill>`).
17
+ > Every criterion below becomes a check with a proof, referenced by its number. Nothing under
18
+ > `Unresolved` gets settled while building.
19
+
20
+ ## Intent
21
+
22
+ <The problem, in the present tense, with no solution in it: what is true today that should not be,
23
+ who pays for it, and what it costs them. Copy the evidence the source gives.>
24
+
25
+ <The change: what is different for a user when this ships. For interface work, name the screen and
26
+ the flow, and link the design - it is a source, not an illustration.>
27
+
28
+ <N criteria in M slices · K one-way doors · Q open, of which B block>
29
+
30
+ ## Criteria
31
+
32
+ One observable outcome per line, with the concrete value. State the precondition when the
33
+ outcome depends on one. On a screen, every state that matters is its own line: empty, loading,
34
+ error, unauthorised, and it names the screen the design gives it. Use whichever shape the criterion
35
+ actually has - most are When/Then, and the list below is a menu, not a quota. Headings are the
36
+ slices; numbering runs across the whole task.
37
+
38
+ ### <slice - the outcome someone can watch>
39
+
40
+ 1. Given <state>, when <trigger>, then <observable outcome with the concrete value>.
41
+ 2. When <trigger>, then <observable outcome>.
42
+
43
+ ### <slice>
44
+
45
+ 3. While <state holds>, <observable outcome>.
46
+ 4. If <condition goes wrong>, then <observable outcome>.
47
+ 5. Always, <invariant with the concrete value>.
48
+
49
+ ## States
50
+
51
+ Only when the task changes a lifecycle. Every edge carries the criterion that states it.
52
+
53
+ ```mermaid
54
+ stateDiagram-v2
55
+ <From> --> <To>: <trigger> (<criterion number>)
56
+ <ExistingState> --> <ExistingState>: <unchanged - label as existing>
57
+ ```
58
+
59
+ ## Out of scope
60
+
61
+ - <excluded capability> - <why>
62
+
63
+ ## Observable
64
+
65
+ Every item of every surface this task exposes. A landing is a criterion already written, `existing`, `n/a`, or `Unresolved` - never a behaviour the walk invented.
66
+
67
+ | Surface | Decision | Landing |
68
+ | --- | --- | --- |
69
+ | screen `<name>` | empty state | 1 |
70
+ | screen `<name>` | error state | Unresolved 2 |
71
+ | screen `<name>` | destructive action confirms | existing - <the pattern already in use> |
72
+ | API `<METHOD> /<path>` | error shape and codes | n/a - <why it does not apply> |
73
+
74
+ <Or:> `None - no user-facing surface`
75
+
76
+ ## Swept
77
+
78
+ Where each unwritten requirement landed. All nine, one line each, every time.
79
+
80
+ - validation: <criterion number>
81
+ - failure modes: <criterion number>
82
+ - idempotency and retry: <criterion number>
83
+ - authorization: existing - <the guard or policy that already covers this>
84
+ - concurrency and ordering: <criterion number>
85
+ - data lifecycle: n/a - <why it does not apply>
86
+ - external-dependency failure: <criterion number>
87
+ - state transitions: <criterion number>
88
+ - observability: Unresolved <number>
89
+
90
+ ## Impact
91
+
92
+ What already exists and gets disturbed. "Nothing" is a valid answer; a missing row is not.
93
+
94
+ | Front | What changes |
95
+ |---|---|
96
+ | domain | new term: `<Name>` - <one-line definition>, lives in <module> |
97
+ | domain | existing term: `<Name>` meant <x>, now means <y> - <who branches on it today> |
98
+ | stored data | <backfill now / migrate on read / dual write / nothing to migrate> |
99
+
100
+ ## Decided
101
+
102
+ Only what is hard to reverse, with the literal shape. `None - <why nothing here is one-way>` is
103
+ a valid row.
104
+
105
+ | Decision | Shape | Alternative rejected |
106
+ |---|---|---|
107
+ | <what was decided> | <schema, endpoint + body, enum value, event payload, dependency> | <the option and the property that disqualified it> |
108
+
109
+ ## Relations
110
+
111
+ Only when the task changes the shape of stored data, and only what `Decided` already settled:
112
+ entities, cardinality, and the constraints that are one-way. No columns, no types.
113
+
114
+ ```mermaid
115
+ erDiagram
116
+ <Entity> ||--o{ <Entity> : <verb>
117
+ <Entity> ||--|| <Entity> : "<verb> - unique, decision <row>"
118
+ ```
119
+
120
+ ## Surface
121
+
122
+ Only when the task adds or changes an interface consumed outside it. The signature, not a
123
+ specification.
124
+
125
+ | Route | In | Out | Status | Criteria |
126
+ |---|---|---|---|---|
127
+ | `<METHOD> /<path>` | `<field>`, `<field>` | `<field>`, `<field>` | `<code>`, `<code>` | <numbers> |
128
+
129
+ ## Sources
130
+
131
+ - <link> - <what it settles>
132
+ - <design> - **binding for the interface**: screens <ids>, and where the copy lives
133
+
134
+ This task is the record of decision. If a linked document diverges, ask before building.
135
+
136
+ ## Unresolved
137
+
138
+ Questions the source does not settle and asking did not close. Nobody fills these in while
139
+ building. `None` when nothing is open — one row, Question is `None`, other cells empty. A missing
140
+ section is not an answer.
141
+
142
+ | # | Kind | Question | Until answered |
143
+ |---|---|---|---|
144
+ | 1 | blocks | <question> | <which criterion cannot be satisfied until it is answered> |
145
+ | 2 | blocks go-live | <question> | <what cannot be switched on for real users until it is answered> |
146
+ | 3 | open | <question> | <what stays imprecise, and what was written in the meantime> |
147
+ ````
148
+
149
+ **The handoff line** comes first because whoever opens this file was handed a path and nothing else - increasingly a model, with no memory of the conversation that produced the task. It names the skill that turns criteria into checks, so the reader does not improvise a plan out of a document that deliberately contains none, and it repeats the one rule that gets broken under pressure: an open question is not an invitation to decide. Name the skill, never a path - where it is installed differs per repository, and a link that does not resolve teaches the reader to skip the line. Add a repo-relative path beside the name only where the project vendors the skill in-tree, and only as a fallback: a skill configured as explicitly-invoked-only never appears in an agent's list, and in a headless or cloud run the name on its own is a reference nobody can act on. A path into somebody's home directory is the one that goes stale - never write that.
150
+
151
+ **Intent** is two paragraphs because it is two questions, and asking both in one breath reliably returns only the second. The change is already in the source and costs nothing to restate; the problem has to be recovered, so that is the half that gets dropped. Splitting them makes the omission visible.
152
+
153
+ Write the problem in the present tense with no solution inside it. "We have no Stripe integration" is not a problem - it is the absence of this task's answer, and a problem phrased that way can only ever justify the thing already chosen. Say what is true today that should not be, who pays for it and what it costs them: "anyone evaluating the product has to enter a card first" is a sentence someone can disagree with, and being disagreeable is the test. Copy whatever evidence the source gives, literally - a conversion figure, a support volume, a date somebody else set. Where it gives none, say so instead of manufacturing urgency.
154
+
155
+ When the source states no problem at all, that is a gap like any other and it comes back as a question. Not blocking, since the criteria stand without it, but worth asking, because decided work whose problem nobody can state is the likeliest to be the wrong work. The problem is also what makes the rest reviewable: every rejected alternative in `Decided` argues about means, so with the end unwritten a reviewer can confirm the task is well-formed and never that it is right.
156
+
157
+ **Criteria** are numbered because everything downstream refers to them by number - a proof, a review comment, a question. One **outcome** per line, which is not one assertion: a single outcome usually has several observable facets, and a trial that comes back `Trialing`, sets `trialEndsAt` and leaves a subscription at the provider is one criterion rather than three. Split when a line carries two triggers or two outcomes that can succeed independently - never merely because it contains "and". Splitting facets into separately provable pieces is the next skill's job, where each check owes exactly one proof. Given/When/Then only where a precondition changes the outcome; a bare When reads better and says the same thing.
158
+
159
+ When/Then answers a trigger, and three kinds of criterion have no trigger to answer. An **invariant** holds always - "a paused subscription never grants access" - and inventing a moment for it moves the criterion off what it actually claims. A **state-driven** outcome holds while something is true rather than at an instant: "while the trial is active, usage is recorded and not billed". An **unwanted condition** responds to something going wrong rather than to someone acting: "if the provider does not answer within 10s, the charge is not retried". Give each its own shape - `Always`, `While`, `If`. Squeezed into a When, they come out as a subordinate clause inside some other criterion, which is exactly where failure handling and invariants get lost.
160
+
161
+ **Write the connectives in the language of the task.** `Given`, `When`, `Then`, `While`, `If` and `Always` are shapes, not keywords, and nothing parses them - a task written in Portuguese writes `Dado`, `Quando`, `Então`. A document that switches language mid-sentence costs the reader a beat on every line and buys nothing. Three tiers, and only the middle one moves: the section headings stay as they are, because they are a schema that this skill and the next one both refer to by name; the prose and the connectives follow the document; identifiers are never translated, so a status value, a field, a route, an HTTP code and a class name keep the spelling the system uses. Translating `Trialing` into a criterion is how a task starts describing a system that does not exist.
162
+
163
+ The headings are the slices the cut already found. Enumerating them and then writing a flat list throws the shape of the work away: nobody can tell where starting a trial ends and cancelling begins without reading every line, and the seams you would otherwise describe from memory when someone asks about splitting are already drawn. **Number across the whole task, never per heading** - everything downstream refers to a criterion by number, and a `3` that exists three times is worse than no grouping at all. Under about six criteria skip the headings; a list you can see whole does not need signposting.
164
+
165
+ **The status line** closing `Intent` is the file obeying the rule the chat already follows: lead with the verdict. A reviewer decides in seconds whether to read now or hand it back, and the three facts that decide it - how much work, how much is locked, how much is open - otherwise sit in three different sections, the last of them at the bottom. Count, never characterise: "4 open, 1 blocks go-live" is a fact a reviewer can act on, "mostly settled" is a feeling.
166
+
167
+ Each one will get a proof attached downstream, so a criterion for which nobody can name a test is not ready to be written. You do not name the test here - finding the real command needs the repository's own test setup, and that is the next skill's job.
168
+
169
+ **States** exists because a lifecycle is the one thing a list of criteria describes badly. Each transition is right on its own line and the machine they form is nowhere, so the missing edge - the state nobody said how to leave - stays invisible exactly where it costs most. Draw it only when the task changes a lifecycle, and draw it **from** the criteria: every edge carries the number that states it, and an edge you want but cannot number is a gap to close rather than a fact to add. That rule is the entire safeguard. Without it this becomes a design document with opinions of its own, which is the thing that goes stale and then misleads.
170
+
171
+ Include the states that already exist and are not changing, marked as existing. The dangerous edge is usually the one between what you are adding and what was already there.
172
+
173
+ That rule is what admits `Relations` and `Surface` below and excludes everything else. A map of components and a sequence of calls are design: they assert what nothing in the task sustains, so nothing holds them honest and they are the first thing to diverge - and a component diagram drawn by someone who has not read the code invents components the repository does not have, then reads as settled because it is drawn. Where a call sequence really is load-bearing it is a one-way door and belongs in `Decided` as a literal shape. If tasks live in a tracker, check that it renders mermaid before standardising on it - an unrendered block is still readable, but barely.
174
+
175
+ **Impact** has fixed rows because the failure here is omission rather than vagueness. A section that is simply absent looks like nothing to answer; an empty row is a question someone can see.
176
+
177
+ The domain row matters more than it looks. A name leaks: it becomes a class, a column, a payload key, a route, and renaming it later costs a migration plus every consumer, so naming is a one-way door that does not look like one. Give the new term its definition in one line and say where it lives. For a term that changes meaning, the second half - **who branches on it today** - is what catches the silent breakage, because those callers never appear in the feature's diff.
178
+
179
+ Past two terms, give each one its own `domain` row instead of packing them into one cell. Six terms separated by punctuation inside a single cell cannot show a gap, and being able to see the gap is the only reason this is a table.
180
+
181
+ The stored-data row is about what runs against existing data, not only about rows you move. A constraint added to a populated table is data-dependent: a unique index over a column that was never unique fails on the first pair that already exists, and it fails in production against real rows rather than in a test against three fixtures. "Nothing to migrate" answers the other half of the question. Say what the migration needs to be true before it runs.
182
+
183
+ **Decided** carries a persisted schema, a contract someone else consumes, a new dependency, a data backfill, or a pattern the codebase does not have yet - precedent is the part that stops being reversible once the next features have copied it. Each row shows the literal shape the next person will copy and what you rejected, named with the property that disqualified it: "cleaner" cannot be argued with, "cannot express the next state" can. Where the choice was forced rather than compared, name the constraint that forced it; where two options were live, give each one a row.
184
+
185
+ Weigh the rejection against what comes after this task, not only against this task. A constraint that settles the problem in front of you can forbid something a later slice needs - a uniqueness rule written for anti-abuse also decides that a user can never have a second row, which is a question for whoever builds renewals and never appears in the reasoning that produced it. When a door reaches past the boundary, say what it closes. That sentence is what the review is for.
186
+
187
+ Two things look like decisions here and are not, and letting them in is how the table turns into a dumping ground. Scope - "V1 does not charge" - reverses by doing the next slice, and it already has a home in `Out of scope`. A rule with no mechanism - "one trial per user" - reverses by changing a condition; it becomes a door only once something persisted enforces it, and then the row is the unique index, with its literal definition, rather than the rule.
188
+
189
+ A column and a type belong here whenever they are doors, and the tell is never the word "column". Identifier width is the plainest case - formally a type, irreversibly a door, because you do not migrate it once there is volume. Uniqueness decides product behaviour, not storage. Nullability over a populated table is a migration that depends on the rows already there. A field a consumer binds to stops being yours to rename. Everything else about the schema - names, indexes, ordinary types - is settled by whoever implements, from the conventions in the repository, and deciding it here means deciding it without having read the code that has to hold it. Where a data decision needs argument rather than a row - partitioning, denormalising, changing store - it is an RFC.
190
+
191
+ When a decision needs a paragraph to justify itself, or several one-way doors arrive together, that is an RFC and it comes **before** the task. Write it first, then link it and keep the row literal.
192
+
193
+ **Relations** renders what `Decided` settled, so it decides nothing. That is the whole licence for drawing it: cardinality is the part of stored data that reads worst in prose and best in a picture
194
+ - `1 --> 1` against `1 --> *` is the difference between a user who can never hold a second subscription and one who can, and buried in a decision row it goes past a reviewer who would have caught it at a glance.
195
+
196
+ Entities, cardinality and the constraints that are one-way. Nothing else, and columns least of all: a full diagram looks authoritative, so the next person builds exactly what is drawn, and the four fifths the planner filled in without opening the code arrive looking decided. An invented schema wearing the costume of a decision is worse than no diagram, because nobody argues with it. Every relationship traces to a row in `Decided`; one you cannot trace is a decision nobody made.
197
+
198
+ **Surface** is the same move for an interface, and it earns a section for the reason a shape does not survive being scattered. Route, method, fields in, fields out, statuses - spread across eight criteria, all of it is present and none of it is legible, and a missing status is invisible because absence has nowhere to show. Consolidated, the hole is a blank cell. Every row cites the criteria that state it, so this stays a projection rather than a second source competing with them.
199
+
200
+ The signature, never a specification. Types, examples and a catalogue of errors are OpenAPI, which is the heavyweight artifact this skill exists to do without, and the half of it nobody decided would get invented to fill the page. Only interfaces something outside this task binds to: a public endpoint, a webhook payload, a published event, a CLI. An internal method is refactorable, so it is not a door and it is not yours to fix here. What the source leaves open - the error body, an unnamed status - is `Unresolved`, not a guess in a table cell.
201
+
202
+ **Sources** are usually several and rarely in one shape - a PRD, a design doc, a thread. The task normalises them so what comes next has one stable input instead of five formats.
203
+
204
+ A design is a source like any other, and the one that gets demoted to decoration. Mark it binding and say which screens it carries, because downstream a check gets written from whatever this section calls binding - a link without the mark arrives as background reading, and the interface then gets built from whatever the codebase already looks like. On a screen the design is also where the concrete values are, so a criterion that renders one carries its screen: without that, "shows the assembling state" is as empty as "gracefully" and passes under any interface.
205
+
206
+ Open it, then transcribe what it decides. Most designs resolve: an artifact URL with a fetch, a design file through its MCP, an attachment on the issue through the tracker, an image committed to the repo as an ordinary file read. The one that does not resolve is an image pasted into a chat and nowhere else, so commit it and reference the path - otherwise it is gone before anyone builds.
207
+
208
+ **Whether a link opens is something you find out, not something you infer.** A domain name tells you nothing about whether there is a sign-in behind it, and reporting a public artifact as inaccessible without having made the request is a fabricated fact about the environment - the same failure as inventing an API, wearing the costume of caution. Fetch it. The attempt costs one call; the assumption costs the interface.
209
+
210
+ When it genuinely fails, say what you tried and what came back. "I could not access the design" leaves the user nowhere; "the fetch returned 403" tells them whether to paste an export, connect the MCP, or grant access, which is the difference between a task that is blocked and one the next message unblocks.
211
+
212
+ Transcribing is not a substitute for the link and not a bet that the link will fail. It is there because what a check asserts is text, and because the readers downstream differ: a sub-agent may have no vision and a CI job certainly has none. The link stays for the person; the values travel in the criterion for each screen - what the heading says, which controls are present, what the step counter reads, which states are one screen rather than a band on another.
213
+
214
+ That is also what makes this work on a picture at all, where "quote the deciding lines" has nothing to quote. Describing is still forbidden and transcribing is required, and the two are easy to tell apart: "a clean screen with cards" gives nobody anything to check, while "heading is the question, options as full-width cards, a `1 de 3` counter, Voltar and Continuar" is four things a check can assert.
215
+
216
+ When a source has no address - a conversation, a document pasted into a chat - say so and quote the deciding lines instead of describing them. Nothing downstream can re-read a chat, so a description is where the decision quietly stops existing.
217
+
218
+ Copy only the slice that this task cannot get wrong, and copy it literally. The reasoning stays in the source, where it has readers and outlives the merge. Two reasons to copy rather than link: the source covers more than this slice and keeps being edited for months, while the task is the record at the moment of building; and whoever builds needs the exact shape in front of them, not a link to thirty pages containing it somewhere.
219
+
220
+ **Observable** is the surface walk made checkable. A blank landing is an item nobody decided; an `n/a` without a reason is the same blank wearing an escape. A row that would need a new behaviour cites `Unresolved <n>` and stops - writing a criterion to fill the cell is the failure the landing rule exists to prevent. `None - no user-facing surface` is a complete answer, and stating it is what makes the omission contestable.
221
+
222
+ **Unresolved** is a table because `Kind` has to travel with the question. A numbered list with a bold prefix still lets a blocking row read as a note, which is the failure this section exists to prevent. The three `Kind` values are a closed set: `blocks` (a criterion cannot be satisfied), `blocks go-live` (proofs can be green and real users still cannot be switched on), `open` (imprecise, not blocking - including a default you assumed and nobody confirmed). Order the rows that way, so the status line can be counted from the column rather than inferred from wording. `#` stays because Swept, Observable and the chat refer to a row by number. `Until answered` is where a written-in-the-meantime value lives, so a reviewer can see what to tear up when the question closes. Never treat silence as confirmation: an assumed default stays `open` until a human says otherwise.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: wtk-qa
3
+ description: "Run one tagged QA planning or execution phase through `/wtk-qa [plan] <flow>`. Use for verifier-owned journey work."
4
+ argument-hint: "[plan] <flow>"
5
+ context: fork
6
+ agent: verifier
7
+ background: false
8
+ ---
9
+
10
+ # QA
11
+
12
+ Run this phase for: $ARGUMENTS. If empty, stop and ask for the flow.
13
+
14
+ Run exactly one QA phase: wtk-qa-plan when the first argument is plan, else wtk-qa-execute, over journeys tagged with the flow; read .agents/skills/wtk-qa-plan/SKILL.md or wtk-qa-execute/SKILL.md in full; if no journey carries the tag, report and stop.
@@ -0,0 +1,115 @@
1
+ ---
2
+ name: wtk-qa-execute
3
+ description: Execute planned QA through existing public interfaces and record evidence or defects. Use when a Verifier walks QA; Don't use for planning, product fixes, or framework setup.
4
+ metadata:
5
+ author: Antonio Fulgêncio
6
+ ---
7
+
8
+ # QA Execute
9
+
10
+ Walk the current QA plan through the consuming project's public surfaces. Select the adapter already
11
+ declared by the project, capture evidence, write durable results, and return product defects to an
12
+ Implementer for a fresh Verifier cycle.
13
+
14
+ ## Provenance
15
+
16
+ Author: Antonio Fulgêncio.
17
+
18
+ This is an original project-owned adaptation for this workflow, inspired by Pedro Nauck's
19
+ [`qa-execution` skill](https://github.com/pedronauck/skills/tree/main/skills/mine/qa-execution).
20
+
21
+ ## Inputs and boundaries
22
+
23
+ Read `docs/qa/README.md`, the QA Plan handoff, the in-scope scenarios and charters, open bugs, and
24
+ `docs/toolkit/guidelines/QA-SCENARIOS.md` in full. The guideline owns scenario fields, ids, statuses, and
25
+ flag/reset rules. Read [`references/session-protocol.md`](references/session-protocol.md) in full
26
+ before the first charter.
27
+
28
+ Use real public interfaces and the project's existing browser, API, CLI, mobile, or manual adapter.
29
+ When no runner is adopted, choose the closest reachable public interface or a manual adapter and
30
+ record the limitation. Mark only an unreachable leg `untested`; missing tooling alone is a
31
+ limitation, not an unreachable product surface. Report the exact adapter, path, evidence, and
32
+ limitation. Keep raw evidence in the repository's disposable evidence path and keep reports, scenario
33
+ status, and bug records durable.
34
+
35
+ QA execution validates the product; it does not write product code, install a framework, invent a
36
+ command, or replace the automated gate.
37
+
38
+ ## Procedure
39
+
40
+ ### 1. Preflight the cycle
41
+
42
+ Read the profile, plan handoff, affected scenarios, open bugs, and charters. Confirm the recorded
43
+ automated gate is green and the product is reachable through a production-parity path. Resolve the
44
+ adapter and prerequisite gaps before the first walk. If a runner is missing, use the closest
45
+ reachable public interface or manual adapter and record the limitation. A leg is `untested` only
46
+ when its product surface is unreachable; a leg that only a human can complete may be
47
+ `blocked-verify` with the exact reason.
48
+
49
+ **Done when:** every charter has a reachable entry point or a named limitation, the gate result is
50
+ recorded, and the selected adapter is supported by the profile.
51
+
52
+ ### 2. Select the adapter
53
+
54
+ Choose the closest existing adapter for each public surface: browser, API, CLI, mobile, or manual.
55
+ Prefer a reachable manual walk when no automated runner exists.
56
+ Follow the profile's setup, authentication, fixture, seed, cleanup, and residue checks. Preserve the
57
+ project's runner and commands as declared by its manifest or CI. Read
58
+ [`references/session-protocol.md`](references/session-protocol.md) in full for the execution and
59
+ evidence contract.
60
+
61
+ **Done when:** the session log names one adapter and exact execution path for every walkable surface,
62
+ with setup and cleanup prerequisites resolved or recorded as limitations.
63
+
64
+ ### 3. Open the report
65
+
66
+ Create `docs/qa/reports/<YYYY-MM-DD>-<scope>.md` before the first charter, or resume the current
67
+ report when one exists for this cycle. Add every charter and scenario to the matrix with a pending
68
+ verdict. Include the adapter, environment, gate command/result, and evidence destination. When a
69
+ visual criterion is in scope, point the row at its feature `uiux.md` source/frame and record paired reference
70
+ and implementation captures with the declared state, exact viewport, fonts/assets, and expected
71
+ differences. Do not count that manual comparison as an automated test.
72
+
73
+ **Done when:** one dated report contains every in-scope charter and scenario, and no walk has started
74
+ with a missing matrix row.
75
+
76
+ ### 4. Walk in persona
77
+
78
+ Adopt the charter's persona, enter through its public entry point, and walk the journey to its true
79
+ end state. Confirm the expected observable through an independent read path and after a reload. Capture
80
+ evidence at each checkpoint and divergence, then update the report and scenario status immediately.
81
+
82
+ **Done when:** every charter has a recorded verdict, independent confirmation, evidence path, and
83
+ debrief, or an explicit limitation with the status prescribed by `QA-SCENARIOS.md`.
84
+
85
+ ### 5. Probe the changed surface
86
+
87
+ Run the charter's tour and choose 5–10 relevant edge probes. Re-walk the two largest changed
88
+ journeys with the comprehension, recovery, trust, speed, accessibility, and language lenses when
89
+ the cycle has enough surface to justify them. Record clean attempts as results and keep evidence
90
+ paths beside their report rows.
91
+
92
+ **Done when:** the selected tour, every chosen edge, and every applicable lens have a recorded
93
+ result, evidence path, or named limitation.
94
+
95
+ ### 6. Record findings and govern fixes
96
+
97
+ Deduplicate against `docs/qa/bugs/` and linked scenario bug ids. File a new bug only for a new
98
+ symptom; append re-found or regressed observations to the existing record and link affected
99
+ scenarios. When a product defect is confirmed, read
100
+ [`references/fix-loop.md`](references/fix-loop.md) in full, hand the defect to an Implementer, and
101
+ close this Verifier session before remediation.
102
+
103
+ **Done when:** every finding has a deduplicated bug record, affected scenario links, severity and
104
+ evidence, and every product fix is explicitly assigned to an Implementer rather than changed here.
105
+
106
+ ### 7. Close or resume the cycle
107
+
108
+ After a fix, start a fresh Verifier, rerun only impact-invalidated technical proofs, and resume from the affected journey
109
+ plus its adjacent canary. Keep the original report history and update statuses, retest fields, bug
110
+ links, and evidence. At close, replace every pending row with a terminal result or an allowed
111
+ `untested`/`blocked-verify` explanation, apply `.agents/skills/wtk/references/validation.md` and record
112
+ the selected commands, reused evidence and results. QA close does not automatically repeat a full gate.
113
+
114
+ **Done when:** no report row remains pending, every fixed bug has a passing retest or an explicit
115
+ decision, every scenario status matches its evidence, and the final gate result is recorded.
@@ -0,0 +1,23 @@
1
+ # QA fix loop
2
+
3
+ Read this reference in full when a walk finds a product defect.
4
+
5
+ ## Handoff
6
+
7
+ Deduplicate the symptom, file or update the bug record, link every affected scenario, and return the
8
+ smallest clear remediation to the Implementer. Include the expected observable, observed result,
9
+ adapter, exact path, evidence, and a regression-test recommendation when the project can own one.
10
+
11
+ **Done when:** the Implementer has a bug id, reproducible path, evidence, expected result, and
12
+ affected scenario list.
13
+
14
+ ## Fresh verification
15
+
16
+ End the current QA execution session before the product changes. After the Implementer reports the
17
+ fix, a fresh Verifier selects invalidated technical proofs using incremental impact validation and
18
+ retests the affected journey plus its adjacent
19
+ canary. QA then resumes from the affected charter and records the retest result in the original
20
+ report.
21
+
22
+ **Done when:** the fix has a fresh Verifier result, the affected journey is re-walked, and the bug
23
+ and scenario statuses carry matching evidence.
@@ -0,0 +1,25 @@
1
+ # QA session protocol
2
+
3
+ Read this reference in full before the first charter.
4
+
5
+ ## Enter, act, verify, capture
6
+
7
+ Enter through the public entry point named by the charter and adopt its persona. Act only through
8
+ the selected browser, API, CLI, mobile, or manual surface. Verify the expected observable through an
9
+ independent read path and after a reload where the surface supports it. Capture the evidence path,
10
+ environment, adapter, and any divergence immediately.
11
+
12
+ Keep a clean session between retries. A stalled flow gets one clean retry; record the stall and its
13
+ result in the report. The session records attempted-and-clean edges as results.
14
+
15
+ **Done when:** each charter interaction has an entry point, action, independent verification, and
16
+ evidence or a named limitation.
17
+
18
+ ## Evidence contract
19
+
20
+ Evidence identifies the scenario or charter, adapter, exact path, timestamp, and expected versus
21
+ observed result. Store raw screenshots, traces, logs, or captures under the consuming project's
22
+ ignored evidence path. Link those files from the durable report; keep scenario prose focused on the
23
+ promise and current status.
24
+
25
+ **Done when:** every report verdict can be traced to a durable row and its raw evidence or limitation.
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: wtk-qa-plan
3
+ description: Plan user-visible QA journeys, scenarios, and charters. Use when a Verifier prepares QA; Don't use for live walks, product fixes, or framework setup.
4
+ metadata:
5
+ author: Antonio Fulgêncio
6
+ ---
7
+
8
+ # QA Plan
9
+
10
+ Plan a reviewable QA cycle for a user-visible change. Keep the plan stack-agnostic: the consuming
11
+ project's operational profile chooses the public interface and adapter later.
12
+
13
+ ## Provenance
14
+
15
+ Author: Antonio Fulgêncio.
16
+
17
+ This is an original project-owned adaptation for this workflow, inspired by Pedro Nauck's
18
+ [`qa-report` skill](https://github.com/pedronauck/skills/tree/main/skills/mine/qa-report).
19
+
20
+ ## Inputs and boundaries
21
+
22
+ Read the feature contract or Verifier packet, the current diff, `docs/qa/README.md`, and the
23
+ affected QA records. Read `docs/toolkit/guidelines/QA-SCENARIOS.md` in full before creating or changing a
24
+ scenario. It owns the scenario tree, fields, ids, statuses, and flag/reset rules.
25
+
26
+ Plan journeys, scenarios, and charters. Leave live walks, evidence capture, defect remediation,
27
+ and framework selection to `wtk-qa-execute` or the next independent Verifier session.
28
+
29
+ When the profile is missing or incomplete, read
30
+ [`references/profile.md`](references/profile.md) in full before discovering capabilities or writing
31
+ `docs/qa/README.md`.
32
+
33
+ ## Procedure
34
+
35
+ ### 1. Resolve scope
36
+
37
+ Read the feature contract, acceptance criteria, current diff, and existing QA records. Classify each
38
+ changed surface as user-visible or internal. Include routes, screens, public configuration, CLI
39
+ commands, API responses, mobile surfaces, and user-facing copy when their observable behaviour
40
+ changed.
41
+
42
+ Maintain a criterion disposition for every changed acceptance criterion. Map user-visible criteria
43
+ to a QA journey/scenario; for an internal criterion, enumerate it in the handoff with the reason it
44
+ does not change a user-visible promise. If no criterion is user-visible, record `no user-visible
45
+ change` in the task handoff and stop.
46
+
47
+ For a visual criterion, point the disposition at the owning feature `uiux.md` reference row and follow
48
+ `UI-UX.md#verifying-the-built-screen`. The visual comparison remains evidence for that criterion; it
49
+ does not replace behavioral coverage.
50
+
51
+ **Done when:** every changed acceptance criterion has one explicit disposition, and the no-surface
52
+ case has a written handoff.
53
+
54
+ ### 2. Load the QA context
55
+
56
+ Read `docs/qa/README.md`, the relevant personas, journeys, scenarios, open bugs, and current
57
+ charters. If the operational profile is absent or lacks a capability needed to plan the scope,
58
+ follow [`references/profile.md`](references/profile.md) in full and record discovered facts with
59
+ links to executable manifests or CI. Keep product-owned documentation intact while updating the
60
+ profile.
61
+
62
+ **Done when:** the plan names the profile path, every in-scope persona, and every existing journey or
63
+ scenario that can cover the changed surface.
64
+
65
+ ### 3. Map the promises
66
+
67
+ Map every user-visible acceptance criterion to an existing journey under `docs/qa/journeys/` and a
68
+ scenario under `docs/qa/scenarios/`. Mint a stable, content-addressed scenario for a new promise.
69
+ Fold duplicate coverage into the canonical scenario and record overlaps there. Include one adjacent
70
+ canary journey when the feature has a user-visible surface. Keep each internal criterion's explicit
71
+ reason in the disposition handoff.
72
+
73
+ Use the schema and status vocabulary from `QA-SCENARIOS.md`; keep field definitions in that file.
74
+ Describe the expected observable in user language and preserve scenario ids once published.
75
+
76
+ **Done when:** every changed acceptance criterion has a disposition: one canonical
77
+ `docs/qa/journeys/` + `docs/qa/scenarios/` mapping for a user-visible promise, or a handoff entry
78
+ that names the criterion and explains why no user promise changed.
79
+
80
+ ### 4. Flag the cycle
81
+
82
+ Create a scenario under `docs/qa/scenarios/` with `qa_status: untested` when the promise is new.
83
+ Reset an affected existing scenario to `untested` when the diff changes its promise. Link open bugs
84
+ and preserve the latest report path and evidence according to the schema. Update journey maps under
85
+ `docs/qa/journeys/` when the route through the product changed.
86
+
87
+ **Done when:** every affected scenario is new or reset to `untested`, and its journey, bug links,
88
+ and report references are internally consistent.
89
+
90
+ ### 5. Write session charters
91
+
92
+ Create one new dated charter under `docs/qa/charters/` per meaningful persona × journey × tour ×
93
+ time-box for this cycle. Never update an existing charter. Journeys and scenarios may be refreshed
94
+ when the contract changes. Point each charter at its scenario and journey, state the public entry
95
+ point, and define the observable that proves success. Include the adjacent canary and prioritize
96
+ changed or risky paths.
97
+
98
+ **Done when:** every affected scenario is covered by a dated, bounded charter with a persona,
99
+ journey, entry point, tour, time-box, and expected observable.
100
+
101
+ ### 6. Hand off for execution
102
+
103
+ Summarize the criterion disposition ledger, the `docs/qa/journeys/`, `docs/qa/scenarios/`, and
104
+ `docs/qa/charters/` outputs, profile path, adapter candidates, and any missing prerequisite for the
105
+ next fresh Verifier. State that execution must use `wtk-qa-execute`, the project's existing public
106
+ interface, and the profile's declared adapter. End this skill before launching the product or
107
+ changing product code.
108
+
109
+ **Done when:** the handoff lists every changed criterion with its disposition, every affected
110
+ scenario and charter output, names the next Verifier session, and contains no live execution result
111
+ or product fix.
@@ -0,0 +1,35 @@
1
+ # QA capability profile
2
+
3
+ Read this reference in full when `docs/qa/README.md` is absent or lacks the capability needed to
4
+ plan a changed surface.
5
+
6
+ ## Discover
7
+
8
+ Inspect the repository read-only. Find the package or build manifest, declared gates, CI workflows,
9
+ production-parity start and health path, public browser/API/CLI/mobile entry points, authentication
10
+ setup, fixtures or seed path, cleanup path, installed QA runners, and known unavailable surfaces.
11
+ Use the actual directory and command names found in manifests or CI.
12
+
13
+ Record each capability under the matching heading in `docs/qa/README.md`:
14
+
15
+ - Public interfaces and area codes
16
+ - Runner or adapter, linked to its manifest, CI job, or documented entry point
17
+ - Build/start path and health signal
18
+ - Authentication and session setup
19
+ - Fixtures, seed, cleanup, and residue check
20
+ - Limitations and unavailable surfaces
21
+
22
+ Keep executable command strings in their manifest or CI authority. Link to that authority instead of
23
+ copying a command that can drift.
24
+
25
+ **Done when:** `docs/qa/README.md` names every required capability, its source of truth, and every
26
+ known limitation needed by the QA plan.
27
+
28
+ ## Choose the next step
29
+
30
+ If an existing adapter can reach the changed surface, record it for `wtk-qa-execute`. If no runner is
31
+ adopted, record the closest public interface and the limitation. Framework installation is a
32
+ separate planned change; the profile remains useful without it.
33
+
34
+ **Done when:** the handoff identifies one existing adapter or an explicit reachability limitation
35
+ for every affected public surface.
@@ -0,0 +1,49 @@
1
+ ---
2
+ name: wtk-ship
3
+ description: Ship a proven feature through verification, local gates, lifecycle closeout, and authorized branch delivery. Use when asked to ship a proven feature.
4
+ disable-model-invocation: true
5
+ argument-hint: "[the work, in your own words]"
6
+ ---
7
+
8
+ # Workflow Toolkit Ship
9
+
10
+ Deliver the requested branch using the scope rules in `.agents/skills/wtk/references/validation.md`.
11
+
12
+ ## Previously verified work
13
+
14
+ Identify the recorded verified base and the subsequent diff. If that diff is bounded maintenance,
15
+ use the existing receipt plus its scoped evidence and proceed to delivery. A merge request does not
16
+ trigger a new full-branch Verifier, full gate or QA cycle. Closed artifacts may remain in Git; do not
17
+ recreate them merely to satisfy this entrypoint. Apply active feature closeout only to unverified
18
+ feature work or a substantive change whose named risk requires that scope.
19
+
20
+ ## Active feature closeout
21
+
22
+ An active Lean feature has `.specs/features/<feature>/plan.md`, `checks.md`, and independent
23
+ `verification.md`. The following steps apply to that feature scope.
24
+
25
+ Resolve or resume the provider route through `.agents/skills/wtk-config/SKILL.md` before dispatch.
26
+
27
+ 1. Confirm the feature's verification report passes the profile recorded in `checks.md` by running
28
+ `.agents/skills/wtk-lean/scripts/validate_verification.py <feature>`.
29
+ 2. Apply incremental impact selection from `.agents/skills/wtk/references/validation.md`, including merges from main.
30
+ Run invalidated proofs and reuse valid evidence; a full gate needs that reference's trigger or an
31
+ explicit human request. Run selected `wtk-deep-review`, security, UI and QA procedures only for
32
+ their affected scope.
33
+ 3. Promote durable decisions, lessons, product promises, architecture rules, and QA evidence to
34
+ their owning stores. Promotion is semantic work; do not invent an automatic knowledge merger.
35
+ 4. After promotion is complete, delete the entire transient feature directory with
36
+ `python3 .agents/skills/wtk-ship/scripts/close_feature.py <feature> --promoted`. The helper refuses
37
+ cleanup without a passing verification receipt and explicit promotion confirmation.
38
+
39
+ ## Delivery authority
40
+
41
+ Invoking this skill authorizes the feature branch push, one pull request, and merge after readiness
42
+ is rechecked immediately before the merge. Do not pause between those scoped delivery steps. Deploy,
43
+ release, production mutations, force-push, direct push to `main`, and unrelated remote actions remain
44
+ separately authorized.
45
+
46
+ If required readiness evidence is missing, name the affected scope and required check. A builder
47
+ never certifies its own feature; feature verification uses a fresh agent over the complete feature
48
+ range. Confirmed Critical, Major,
49
+ and Minor Deep Review findings are fixed in the feature run before delivery.