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.
- package/.agents/skills/ponytail/SKILL.md +111 -0
- package/.agents/skills/ponytail-audit/SKILL.md +37 -0
- package/.agents/skills/ponytail-debt/SKILL.md +41 -0
- package/.agents/skills/ponytail-gain/SKILL.md +47 -0
- package/.agents/skills/ponytail-help/SKILL.md +70 -0
- package/.agents/skills/ponytail-review/SKILL.md +52 -0
- package/.agents/skills/prompt-review/SKILL.md +60 -0
- package/.agents/skills/wtk/SKILL.md +64 -0
- package/.agents/skills/wtk/references/artifacts.md +82 -0
- package/.agents/skills/wtk/references/evidence.md +68 -0
- package/.agents/skills/wtk/references/git.md +75 -0
- package/.agents/skills/wtk/references/test-contract.md +76 -0
- package/.agents/skills/wtk/references/validation.md +127 -0
- package/.agents/skills/wtk-config/SKILL.md +102 -0
- package/.agents/skills/wtk-config/assets/agents/claude/deep-reviewer.md +40 -0
- package/.agents/skills/wtk-config/assets/agents/claude/designer.md +57 -0
- package/.agents/skills/wtk-config/assets/agents/claude/explorer.md +41 -0
- package/.agents/skills/wtk-config/assets/agents/claude/implementer.md +57 -0
- package/.agents/skills/wtk-config/assets/agents/claude/planner.md +68 -0
- package/.agents/skills/wtk-config/assets/agents/claude/verifier.md +80 -0
- package/.agents/skills/wtk-config/assets/agents/codex/deep-reviewer.toml +41 -0
- package/.agents/skills/wtk-config/assets/agents/codex/designer.toml +55 -0
- package/.agents/skills/wtk-config/assets/agents/codex/explorer.toml +35 -0
- package/.agents/skills/wtk-config/assets/agents/codex/implementer.toml +52 -0
- package/.agents/skills/wtk-config/assets/agents/codex/planner.toml +66 -0
- package/.agents/skills/wtk-config/assets/agents/codex/verifier.toml +78 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/deep-reviewer.md +38 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/designer.md +55 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/explorer.md +39 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/implementer.md +55 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/planner.md +66 -0
- package/.agents/skills/wtk-config/assets/agents/cursor/verifier.md +79 -0
- package/.agents/skills/wtk-config/scripts/ad-index.py +123 -0
- package/.agents/skills/wtk-config/scripts/repository_intelligence.py +671 -0
- package/.agents/skills/wtk-config/scripts/workflow_config.py +972 -0
- package/.agents/skills/wtk-deep-review/SKILL.md +164 -0
- package/.agents/skills/wtk-deep-review/assets/PROMPT.md +56 -0
- package/.agents/skills/wtk-deep-review/assets/REVIEW_UI.html +1340 -0
- package/.agents/skills/wtk-deep-review/assets/findings.schema.json +113 -0
- package/.agents/skills/wtk-deep-review/references/context-pack.md +88 -0
- package/.agents/skills/wtk-deep-review/references/orchestration.md +164 -0
- package/.agents/skills/wtk-deep-review/references/output-contracts.md +149 -0
- package/.agents/skills/wtk-deep-review/references/publish-github.md +83 -0
- package/.agents/skills/wtk-deep-review/references/state-and-learnings.md +64 -0
- package/.agents/skills/wtk-deep-review/references/subagent-runtimes.md +33 -0
- package/.agents/skills/wtk-deep-review/references/taxonomy.md +70 -0
- package/.agents/skills/wtk-deep-review/scripts/_common.py +371 -0
- package/.agents/skills/wtk-deep-review/scripts/build_jobs.py +561 -0
- package/.agents/skills/wtk-deep-review/scripts/build_knowledge.py +349 -0
- package/.agents/skills/wtk-deep-review/scripts/build_manifest.py +479 -0
- package/.agents/skills/wtk-deep-review/scripts/graft_context.py +160 -0
- package/.agents/skills/wtk-deep-review/scripts/graphify_context.py +75 -0
- package/.agents/skills/wtk-deep-review/scripts/merge_findings.py +313 -0
- package/.agents/skills/wtk-deep-review/scripts/render_html.py +240 -0
- package/.agents/skills/wtk-deep-review/scripts/render_review.py +282 -0
- package/.agents/skills/wtk-deep-review/scripts/run_jobs.py +436 -0
- package/.agents/skills/wtk-deep-review/scripts/token_metrics.py +369 -0
- package/.agents/skills/wtk-discover/SKILL.md +270 -0
- package/.agents/skills/wtk-discover/references/document-format.md +149 -0
- package/.agents/skills/wtk-implement/SKILL.md +95 -0
- package/.agents/skills/wtk-implement/references/checklist-format.md +116 -0
- package/.agents/skills/wtk-implement/references/screens.md +129 -0
- package/.agents/skills/wtk-implement/references/test-policy.md +152 -0
- package/.agents/skills/wtk-implement/references/verify.md +297 -0
- package/.agents/skills/wtk-knowledge-check/SKILL.md +16 -0
- package/.agents/skills/wtk-knowledge-check/scripts/check.ts +502 -0
- package/.agents/skills/wtk-knowledge-check/scripts/cli.ts +32 -0
- package/.agents/skills/wtk-knowledge-check/scripts/frontmatter.ts +44 -0
- package/.agents/skills/wtk-lean/.skill-meta.json +6 -0
- package/.agents/skills/wtk-lean/NOTICE.md +18 -0
- package/.agents/skills/wtk-lean/SKILL.md +137 -0
- package/.agents/skills/wtk-lean/references/build.md +168 -0
- package/.agents/skills/wtk-lean/references/checks.md +253 -0
- package/.agents/skills/wtk-lean/references/memory.md +156 -0
- package/.agents/skills/wtk-lean/references/plan.md +514 -0
- package/.agents/skills/wtk-lean/references/verify.md +336 -0
- package/.agents/skills/wtk-lean/scripts/check_commit.py +121 -0
- package/.agents/skills/wtk-lean/scripts/fixtures/checks.md +98 -0
- package/.agents/skills/wtk-lean/scripts/fixtures/plan.md +119 -0
- package/.agents/skills/wtk-lean/scripts/fixtures/verification.md +41 -0
- package/.agents/skills/wtk-lean/scripts/lessons.py +412 -0
- package/.agents/skills/wtk-lean/scripts/selftest.py +401 -0
- package/.agents/skills/wtk-lean/scripts/validate_checks.py +417 -0
- package/.agents/skills/wtk-lean/scripts/validate_plan.py +580 -0
- package/.agents/skills/wtk-lean/scripts/validate_verification.py +357 -0
- package/.agents/skills/wtk-plan/SKILL.md +102 -0
- package/.agents/skills/wtk-plan/references/document-format.md +222 -0
- package/.agents/skills/wtk-qa/SKILL.md +14 -0
- package/.agents/skills/wtk-qa-execute/SKILL.md +115 -0
- package/.agents/skills/wtk-qa-execute/references/fix-loop.md +23 -0
- package/.agents/skills/wtk-qa-execute/references/session-protocol.md +25 -0
- package/.agents/skills/wtk-qa-plan/SKILL.md +111 -0
- package/.agents/skills/wtk-qa-plan/references/profile.md +35 -0
- package/.agents/skills/wtk-ship/SKILL.md +49 -0
- package/.agents/skills/wtk-ship/remediation.py +170 -0
- package/.agents/skills/wtk-ship/scripts/close_feature.py +83 -0
- package/.agents/skills/wtk-ship/scripts/review_convergence.py +373 -0
- package/.wtk.toml.example +93 -0
- package/AGENTS.md +129 -0
- package/NOTICE.md +12 -0
- package/README.md +440 -0
- package/bin/wtk.js +25 -0
- package/docs/toolkit/README.md +56 -0
- package/docs/toolkit/decisions.md +61 -0
- package/docs/toolkit/guidelines/CONTEXT-BUDGET.md +64 -0
- package/docs/toolkit/guidelines/DX.md +67 -0
- package/docs/toolkit/guidelines/FRONTEND.md +73 -0
- package/docs/toolkit/guidelines/KNOWLEDGE-WIKI.md +128 -0
- package/docs/toolkit/guidelines/MODELING.md +134 -0
- package/docs/toolkit/guidelines/QA-EXECUTION.md +46 -0
- package/docs/toolkit/guidelines/QA-SCENARIOS.md +165 -0
- package/docs/toolkit/guidelines/REVIEW-ROUNDS.md +160 -0
- package/docs/toolkit/guidelines/SECURITY.md +160 -0
- package/docs/toolkit/guidelines/UI-UX.md +117 -0
- package/docs/toolkit/guidelines/WORKFLOW-MEMORY.md +73 -0
- package/docs/toolkit/guidelines.md +50 -0
- package/docs/toolkit/loop.md +77 -0
- package/docs/toolkit/purpose.md +51 -0
- package/docs/toolkit/repository-intelligence.md +53 -0
- package/docs/toolkit/reviews.md +77 -0
- package/knowledge/AGENTS.md +316 -0
- package/knowledge/raw/README.md +17 -0
- package/package.json +74 -0
- package/scripts/install_security_skills.py +816 -0
- package/scripts/installer/engine.js +254 -0
- package/scripts/installer/knowledge.js +28 -0
- package/scripts/installer/packets.js +77 -0
- package/scripts/installer/terminal.js +98 -0
- package/scripts/installer/transaction.js +75 -0
- package/skills-lock.json +92 -0
- package/templates/adoption/agents/core.md +23 -0
- package/templates/adoption/agents/quality.md +3 -0
- package/templates/adoption/knowledge/wiki/architecture/index.md +3 -0
- package/templates/adoption/knowledge/wiki/decisions/index.md +3 -0
- package/templates/adoption/knowledge/wiki/design/index.md +3 -0
- package/templates/adoption/knowledge/wiki/domain/index.md +3 -0
- package/templates/adoption/knowledge/wiki/index.md +3 -0
- package/templates/adoption/knowledge/wiki/log.md +3 -0
- package/templates/adoption/knowledge/wiki/open-questions/index.md +3 -0
- package/templates/adoption/knowledge/wiki/product/index.md +3 -0
- package/templates/adoption/knowledge/wiki/research/index.md +3 -0
- package/templates/adoption/product/AGENT-CONTEXT.md +25 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# Verify
|
|
2
|
+
|
|
3
|
+
**Goal:** an independent answer to "is every check actually proven?", written as evidence
|
|
4
|
+
rather than as an opinion.
|
|
5
|
+
|
|
6
|
+
This is the only mechanism standing between "done" and a self-report, so it is never
|
|
7
|
+
prompted, never optional, and never skipped because the author feels confident.
|
|
8
|
+
|
|
9
|
+
## Author is not verifier
|
|
10
|
+
|
|
11
|
+
The agent that wrote the code is the author. The Verifier is a **fresh sub-agent** with no
|
|
12
|
+
inherited context, mental model or assumptions - an author re-checking their own work
|
|
13
|
+
reapplies the thinking that produced the gap. It receives the checklist, every source the
|
|
14
|
+
checklist marks binding, the feature's diff range and this file. It runs read-only and fixes
|
|
15
|
+
nothing.
|
|
16
|
+
|
|
17
|
+
**Dispatched by whoever holds the whole feature, never by a builder.** A fresh context is not
|
|
18
|
+
independence on its own: the parent writes the brief, so a Verifier spawned by the agent that
|
|
19
|
+
just closed the last batch inherits that agent's *scope* even though it inherits none of its
|
|
20
|
+
tokens. It gets pointed at the last batch, and a pass over four checks reads exactly like a pass
|
|
21
|
+
over forty. The range is `<feature base>..HEAD` and the set is every check in the checklist,
|
|
22
|
+
whoever wrote them.
|
|
23
|
+
|
|
24
|
+
The verdict goes back to the orchestrator and the user, never to a builder. A FAIL returned to
|
|
25
|
+
the author is the author deciding what to do about the author's work, and the round that follows
|
|
26
|
+
happens inside the session the separation existed to break.
|
|
27
|
+
|
|
28
|
+
**Read the profile first** - the project declares it in `AGENTS.md`, and `light` is the default.
|
|
29
|
+
Step 1 runs under `ui`; the `Coverage` join, the `Test policy` verdicts and fault injection run
|
|
30
|
+
under `standard` and `ui`; everything else runs always. The report names the profile, so a step
|
|
31
|
+
that did not run is distinguishable from a step that was forgotten.
|
|
32
|
+
|
|
33
|
+
A step whose input is absent is a line, not an investigation: no binding source, no set row, no
|
|
34
|
+
`Test policy` section - say so and move to the next.
|
|
35
|
+
|
|
36
|
+
## 1. Check the checklist against its binding sources (`ui`)
|
|
37
|
+
|
|
38
|
+
Every other step measures the code against the checklist, so a checklist that is wrong validates
|
|
39
|
+
cleanly and each later step confirms it. No amount of rigour further down catches this, because
|
|
40
|
+
both ends of every later comparison were derived from the same mistaken artifact.
|
|
41
|
+
|
|
42
|
+
Open every source the checklist marks **binding** - the design, a contract, a spec - and compare
|
|
43
|
+
it against the checks and the `Landing` rows. A URL sitting in `Sources` is not the same as having
|
|
44
|
+
opened it, and the gap between those two is where this fails.
|
|
45
|
+
|
|
46
|
+
**This is a narrow comparison, not a review of the product.** You are looking for a check that
|
|
47
|
+
contradicts a binding source on something that source decides concretely: a state the design draws
|
|
48
|
+
as a band on an existing screen that a check turned into a screen of its own, a label the design
|
|
49
|
+
fixes that a check spells differently, a status a contract names that a check maps elsewhere. You
|
|
50
|
+
are never asking whether the work is worth doing, whether the design is good, or whether a
|
|
51
|
+
decision the user already made was right. A contradiction is a finding; a preference is not.
|
|
52
|
+
|
|
53
|
+
A check that contradicts a binding source is a finding even with a green proof, and it outranks a
|
|
54
|
+
failing one: a red test says the code disagrees with the checklist, this says the checklist
|
|
55
|
+
disagrees with the decision, and the build ships the second faithfully. Where a source will not
|
|
56
|
+
open, say what you tried and what came back, then record every check resting on it as unverified
|
|
57
|
+
against its source.
|
|
58
|
+
|
|
59
|
+
**A check nobody wrote contradicts nothing, so comparing cannot find it.** This step catches a
|
|
60
|
+
check that disagrees with the design and is blind to the element the design draws that no check
|
|
61
|
+
mentions - blind in the direction that matters, because absence is the ordinary failure and it
|
|
62
|
+
leaves no trace to notice. So enumerate instead of comparing: per screen, list what the design decides that a selector
|
|
63
|
+
reaches - which controls and indicators are present, which are absent, their order, their count,
|
|
64
|
+
what they read, and **how they are arranged**: how many regions the screen has and what sits
|
|
65
|
+
inside what - and confirm each has a check. An element with no check is a coverage gap. An
|
|
66
|
+
element the code renders that the design does not draw is the same finding facing the other way.
|
|
67
|
+
|
|
68
|
+
**Arrangement is the one this step keeps missing.** A screen can pass every label, count and
|
|
69
|
+
order check and still be a different composition - a ring where the design draws a bar, a block
|
|
70
|
+
beside the band it belongs inside, one column where there are two. Those are selector-reachable
|
|
71
|
+
and therefore not exempt, so a screen whose checks are all copy and no structure is a finding
|
|
72
|
+
even when each of them is green. Where the repo has a design system, hold the design to structure
|
|
73
|
+
and hierarchy and the system to the values: a colour that differs from the mock is correct if it
|
|
74
|
+
came from a token, and an arrangement that differs is not.
|
|
75
|
+
|
|
76
|
+
Hold this to what carries function or state: controls, indicators, navigation, the arrangement
|
|
77
|
+
that distinguishes this screen from the one it replaces, and the affordances for empty, loading
|
|
78
|
+
and error. Not every text node on the comp. One row per screen naming what is uncovered, so this
|
|
79
|
+
lands as a short list somebody acts on rather than a re-litigation of the markup.
|
|
80
|
+
|
|
81
|
+
**An exemption that does not enumerate is a gap, not a limitation.** A checklist may put spacing,
|
|
82
|
+
colour and type weight out of reach, named against the screen they belong to. It may not write
|
|
83
|
+
"visual fidelity is unproven" and stop - that sentence also covers everything a selector *could*
|
|
84
|
+
have reached, and it arrives at you looking like a limitation properly declared, which is how a
|
|
85
|
+
real gap gets waved through by the one step that exists to catch it. Treat a blanket clause as a
|
|
86
|
+
finding, then enumerate what it was covering.
|
|
87
|
+
|
|
88
|
+
## 2. Account for every proof
|
|
89
|
+
|
|
90
|
+
Apply `.agents/skills/wtk/references/validation.md`: independently inspect each proof's recorded
|
|
91
|
+
result and input baseline, then run proofs with missing or invalidated evidence. A fresh Verifier
|
|
92
|
+
still covers every check; it does not rerun unaffected tests solely because the actor or HEAD changed.
|
|
93
|
+
For reused evidence, identify the original command/log, baseline and why its relevant inputs remain
|
|
94
|
+
equivalent. Batch the selected fresh proofs below.
|
|
95
|
+
|
|
96
|
+
**Batch selected proofs by runner target, not one invocation per proof.** Runners take
|
|
97
|
+
many files and many name patterns in a single call - `bin/rails test a_test.rb b_test.rb -n
|
|
98
|
+
"/one|two/"`, `pytest f.py g.py -k "one or two"`, `jest --testPathPattern` with one
|
|
99
|
+
`--testNamePattern` alternation. Batching per *file* is the mistake that looks like batching:
|
|
100
|
+
forty checks across twelve files is twelve process starts, and the process start is the cost.
|
|
101
|
+
|
|
102
|
+
The guarantee is unchanged as long as each named test appears in the output individually as
|
|
103
|
+
having run and passed. What is forbidden is substituting a *verdict* for a result: "the suite is
|
|
104
|
+
green" settles no single check. Fall back to one invocation per proof only where the runner
|
|
105
|
+
cannot report per test, or to re-run something that failed.
|
|
106
|
+
|
|
107
|
+
Then confirm each named test **exists and ran**. A filter matching nothing exits zero on
|
|
108
|
+
several runners - `passWithNoTests` and its equivalents - which would be a green check with no
|
|
109
|
+
test behind it. Show the hit; a name that appears nowhere in the tree is a finding, not a
|
|
110
|
+
detail.
|
|
111
|
+
|
|
112
|
+
Do that lookup with `rg -n` and enough context to carry the test body, rather than by reading
|
|
113
|
+
the file. The same hit that proves the test exists also yields the line numbers step 3 has to
|
|
114
|
+
cite, so it is one search instead of two, and reading a 400-line spec to quote six lines of it
|
|
115
|
+
is where this step's cost actually goes. One pass per file, not per check - checks cluster in a
|
|
116
|
+
few files.
|
|
117
|
+
|
|
118
|
+
Existing tests may prove a corrected behavior without being edited themselves. Confirm their
|
|
119
|
+
assertions cover the affected invariant. An earlier result remains valid only after checking its
|
|
120
|
+
causal inputs; neither an unchanged test file nor a new commit alone settles validity.
|
|
121
|
+
|
|
122
|
+
## 3. Check the assertion, not its presence
|
|
123
|
+
|
|
124
|
+
For each check, confirm the assertion targets the **checklist-defined** value, not merely
|
|
125
|
+
that an assertion exists. Cite `file:line` and reproduce the assertion expression.
|
|
126
|
+
|
|
127
|
+
Inspect the assertion and the relevant setup, fixtures and dependencies needed to establish its
|
|
128
|
+
expected value and causal coverage. Trace indirect expected values within that scope; missing
|
|
129
|
+
context is an evidence gap, not automatic proof that a test is wrong. Avoid unrelated fixture or
|
|
130
|
+
repository exploration.
|
|
131
|
+
|
|
132
|
+
Cite the one or two assertions that **settle** the claim, not every assertion in the test.
|
|
133
|
+
Setup lines earn a citation only when the claim itself names the precondition.
|
|
134
|
+
|
|
135
|
+
**Evidence or zero.** A check with no located `file:line` counts as not proven - per check,
|
|
136
|
+
never one citation standing in for twenty. Search before concluding something is absent, and
|
|
137
|
+
show the search.
|
|
138
|
+
|
|
139
|
+
Judge the checklist's own choices too (`standard`, `ui`). **Recompute the `Coverage` join rather than reading it** -
|
|
140
|
+
a join you only read is the author's self-report with a table around it. For each row, take the
|
|
141
|
+
members from the code itself, not from the row, and confirm each one has a proof that asserts it;
|
|
142
|
+
then sweep the artifact for sets it never gave a row at all - every enumeration named in
|
|
143
|
+
`Landing`, in the test-policy evidence or inside a claim. A member with no proof is a **coverage
|
|
144
|
+
gap**, and a member named in the artifact's own prose with no proof anywhere is a worse one,
|
|
145
|
+
because the author saw it and the table hid it.
|
|
146
|
+
|
|
147
|
+
**Take the members from whatever holds authority over that set, which is not always the code.** A
|
|
148
|
+
provider's statuses come from the provider and a framework's routes from the framework - there the
|
|
149
|
+
code is the right place to look, because the code is where the set is discovered. But a set the
|
|
150
|
+
code is meant to *satisfy* has its authority outside it: the screens a design draws, the fields a
|
|
151
|
+
contract declares. Recomputing those from the code asks the author's own output whether the
|
|
152
|
+
author's own output is complete, and it answers yes every time. Open the artifact and count there.
|
|
153
|
+
|
|
154
|
+
For a startup-configuration row, read each assembly directly - open the file that constructs it
|
|
155
|
+
and show the line. A suite that boots its own assembly structurally cannot fail on another one,
|
|
156
|
+
so a green proof here is evidence about the test's assembly and nothing else.
|
|
157
|
+
|
|
158
|
+
Two more, mechanically: a claim about nine cases proven on two is a coverage gap; and a claim
|
|
159
|
+
naming a status code, route or response shape whose proofs all sit below that boundary is a
|
|
160
|
+
**level gap**, no matter how many assertions it carries.
|
|
161
|
+
|
|
162
|
+
Judge the *level* against the artifact's own `## Test policy` rows whenever it carries them
|
|
163
|
+
(`standard`, `ui`).
|
|
164
|
+
Those rows are the bar the author built under, and that section exists precisely because the
|
|
165
|
+
repo's conventions were found not to answer - deferring to the conventions instead measures the
|
|
166
|
+
build against the weaker ruler, which is the deference test-policy.md warns about.
|
|
167
|
+
|
|
168
|
+
Give each row a verdict, the way each check gets one: for every file the row classifies, is the
|
|
169
|
+
required proof there, and does it assert what the coverage expectation demands? A row nobody met
|
|
170
|
+
is a finding even when every check is green, because the rows priced work the checks do not name.
|
|
171
|
+
|
|
172
|
+
Only where the artifact carries no such section does the project's own convention decide -
|
|
173
|
+
`AGENTS.md`, contributing docs, the shape of the existing tests. Either way, a suite thinner than
|
|
174
|
+
the standard in force is a finding; one that merely differs from your taste is not.
|
|
175
|
+
|
|
176
|
+
Where the checklist left a value imprecise, record a **precision gap** rather than passing a
|
|
177
|
+
vague assertion - that is a finding about the checklist, and the most useful thing this step
|
|
178
|
+
produces.
|
|
179
|
+
|
|
180
|
+
Read the `Swept` rows that resolve to **existing** against the code: is the constraint they
|
|
181
|
+
cite actually there? A cited constraint that is not there is a finding. Rows that say *not in
|
|
182
|
+
scope* are policy the user approved - there is nothing in the code for them to be wrong about.
|
|
183
|
+
|
|
184
|
+
## 4. Inject faults (`standard`, `ui`)
|
|
185
|
+
|
|
186
|
+
A green suite proves the tests run. Fault injection proves they can catch a regression.
|
|
187
|
+
|
|
188
|
+
1. **Isolate.** `git worktree add <scratch> HEAD`. Never mutate the real tree, and **never
|
|
189
|
+
use `git stash`** - it records state from *before* the mutation, so popping it does not
|
|
190
|
+
reverse a fault applied afterwards.
|
|
191
|
+
2. **Baseline.** Record `git status --porcelain` of the real tree first.
|
|
192
|
+
3. **Inject a behaviour-level fault** in the new code: flip a condition, change a returned
|
|
193
|
+
value or status, shift a bound by one, remove a required side effect.
|
|
194
|
+
4. **Run the covering proof** in the scratch and confirm it FAILS - the mutant is killed.
|
|
195
|
+
5. **Discard** the scratch and confirm the real tree's porcelain matches the baseline.
|
|
196
|
+
|
|
197
|
+
**One fault per distinct assertion surface, not per risky line.** Three mutations killed by the
|
|
198
|
+
same two proofs ran the same experiment three times: the first showed those assertions
|
|
199
|
+
discriminate and the rest confirmed it. Choose faults that force *different* proofs to fail,
|
|
200
|
+
stop once every proof carrying a check has been made to fail once, and cap it at five however
|
|
201
|
+
risky the feature looks - a quota that scales with risk costs most exactly where checks cluster
|
|
202
|
+
in risky code. Run only the narrowest proof covering each fault; a second covering proof adds a
|
|
203
|
+
run and no information. Use real mutation tooling when the stack has it (Stryker, mutmut,
|
|
204
|
+
cargo-mutants, pitest) - it gets many mutants from one run.
|
|
205
|
+
|
|
206
|
+
**A surviving mutant is a finding, not a footnote.** It means the assertion would pass under
|
|
207
|
+
a plausible wrong implementation.
|
|
208
|
+
|
|
209
|
+
## 5. Report
|
|
210
|
+
|
|
211
|
+
Write `.checks/<feature>.verified.md`. Lead with the verdict.
|
|
212
|
+
|
|
213
|
+
```markdown
|
|
214
|
+
# <Feature> Verification
|
|
215
|
+
|
|
216
|
+
**Verdict**: PASS
|
|
217
|
+
**Profile**: standard
|
|
218
|
+
**Diff range**: <base>..<head>
|
|
219
|
+
**Round**: 1 - full
|
|
220
|
+
**Verifier**: independent sub-agent (author != verifier)
|
|
221
|
+
|
|
222
|
+
## Binding sources
|
|
223
|
+
|
|
224
|
+
| Source | Opened | Contradiction | Uncovered |
|
|
225
|
+
|---|---|---|---|
|
|
226
|
+
| design `03` overview | yes - artifact URL | none | progress bar, radio indicator; breadcrumb rendered but not drawn |
|
|
227
|
+
| design `05` montando | yes | is a band on `03`; C20 renders it as its own screen | - |
|
|
228
|
+
| contract `billing.yaml` | yes | none | - |
|
|
229
|
+
|
|
230
|
+
## Checks
|
|
231
|
+
|
|
232
|
+
| Check | Claim | Proof run | Evidence | Result |
|
|
233
|
+
|---|---|---|---|---|
|
|
234
|
+
| C1 | suspends, never cancels | `pytest ...::test_failed_charge_suspends` exit 0 | `test_dunning.py:118` - `assert sub.status == "suspended"` | PASS |
|
|
235
|
+
| C3 | retry changes nothing | `bun test -- -t "retry is idempotent"` exit 0 | `webhook.spec.ts:41` - `expect(rows).toHaveLength(1)` | PASS |
|
|
236
|
+
|
|
237
|
+
## Test policy rows
|
|
238
|
+
|
|
239
|
+
| Row | Files it classifies | Required proof | Expectation met |
|
|
240
|
+
|---|---|---|---|
|
|
241
|
+
| Decides, reached across a boundary | `subscription.py` | boundary C1 · own layer C2 | `suspended` yes · `paused` no - C2 never asserts the emit |
|
|
242
|
+
|
|
243
|
+
## Faults injected
|
|
244
|
+
|
|
245
|
+
| Mutation | Location | Killed |
|
|
246
|
+
|---|---|---|
|
|
247
|
+
| returned status `suspended` -> `cancelled` | `subscription.py:88` | yes |
|
|
248
|
+
| removed the `subscription.suspended` emit | `subscription.py:104` | no - fix required |
|
|
249
|
+
|
|
250
|
+
## Gate
|
|
251
|
+
|
|
252
|
+
<command> - <N> passed, 0 failed
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Then return a compact verdict in chat: PASS or FAIL, checks proven out of total, fault
|
|
256
|
+
result, and a ranked gap list.
|
|
257
|
+
|
|
258
|
+
A FAIL, a surviving mutant, an unmet test-policy row, a check contradicting a binding source, an
|
|
259
|
+
element or an **arrangement** a binding source decides that no check covers, a blanket exemption
|
|
260
|
+
in place of an enumerated one, a binding source recorded as opened that nobody actually saw, or
|
|
261
|
+
any check without a located `file:line` all mean the work is not done.
|
|
262
|
+
|
|
263
|
+
**A composition finding fails at the same weight as a wrong label**, and it has to be said
|
|
264
|
+
because it does not feel that way: a substring missing from a CTA reads as a defect, while "01 is
|
|
265
|
+
a different composition" reads as feedback. The second one is the larger failure and the one that
|
|
266
|
+
survives to production, so it carries a FAIL and it survives to the last round rather than
|
|
267
|
+
softening into a note somewhere around round two. Route gaps back as fixes and re-verify, bounded to **three** rounds before
|
|
268
|
+
escalating to the user.
|
|
269
|
+
|
|
270
|
+
## Re-verifying after a fix
|
|
271
|
+
|
|
272
|
+
A later round is scoped by two things: **the fix's diff, and every verdict that was not PASS.**
|
|
273
|
+
Anything else carries forward. Re-running a whole review to reconfirm what a fix could not have
|
|
274
|
+
touched is the cost the three-round bound multiplies by three.
|
|
275
|
+
|
|
276
|
+
Rerun only evidence invalidated by the fix's causal delta. Reuse other proofs after independently
|
|
277
|
+
checking their tested code, transitive dependencies, fixtures, configuration and relevant runtime.
|
|
278
|
+
A failed full run is retained as such; focused retests can prove its corrections without claiming
|
|
279
|
+
that a new full run passed. Full-gate escalation follows `.agents/skills/wtk/references/validation.md`.
|
|
280
|
+
|
|
281
|
+
Everything carried forward identifies its source: mark sections `verified at <sha>` or
|
|
282
|
+
`carried from <sha>` with the input-equivalence reason and retain `Round: 2 - scoped` in the header.
|
|
283
|
+
|
|
284
|
+
Then scope by the diff, not by the fix's intent - a fix to a shared helper, a fixture or a
|
|
285
|
+
config has a wider blast radius than its description:
|
|
286
|
+
|
|
287
|
+
- **Faults**: re-inject on the surfaces the fix touched, and on any the fix created. A fix that
|
|
288
|
+
*adds* an assertion is the common case, and its new surface has never been made to fail once.
|
|
289
|
+
- **`Coverage`**: recompute the rows whose authority the fix touched. A fix that adds a branch
|
|
290
|
+
adds a member, which is exactly what may not pass unnoticed.
|
|
291
|
+
- **Citations**: refresh the files the fix touched; line numbers move.
|
|
292
|
+
- **`Test policy` rows**: re-judge the rows that were unmet, plus any row classifying a touched
|
|
293
|
+
file.
|
|
294
|
+
- **Step 1**: only where the fix touched the interface, and only for those screens. A design
|
|
295
|
+
does not change between rounds, and rule 4 keeps the checks fixed - so a contradiction found
|
|
296
|
+
in round 1 is still a contradiction. The exception is a check the user renegotiated: that one
|
|
297
|
+
goes back through step 1.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wtk-knowledge-check
|
|
3
|
+
description: Check `knowledge/` for source drift, naming, conformance, and harvested gaps. Use when verifying a knowledge bundle.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Knowledge Check
|
|
7
|
+
|
|
8
|
+
Run the bundled read-only checker from the consuming project root:
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
bun .agents/skills/wtk-knowledge-check/scripts/cli.ts [project-root]
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The checker reports knowledge findings and exits non-zero only for errors. Read the project's
|
|
15
|
+
`knowledge/AGENTS.md` before editing knowledge; this skill owns checking, while that policy owns
|
|
16
|
+
the bundle's frontmatter and write boundaries.
|