swe-workflow-skills 0.8.2 → 0.9.0
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/README.md +4 -4
- package/VERSION +1 -1
- package/catalog.json +1 -1
- package/package.json +1 -1
- package/skills/accessibility-design/evals/evals.json +3 -2
- package/skills/ai-evaluation/evals/evals.json +9 -8
- package/skills/api-design/evals/evals.json +7 -8
- package/skills/architecture-documentation/SKILL.md +7 -0
- package/skills/architecture-documentation/evals/evals.json +9 -11
- package/skills/brainstorming/evals/evals.json +6 -6
- package/skills/bug-investigating/evals/evals.json +6 -6
- package/skills/cicd-pipeline/evals/evals.json +7 -8
- package/skills/code-archaeology/evals/evals.json +9 -8
- package/skills/code-reviewing/SKILL.md +8 -0
- package/skills/code-reviewing/evals/evals.json +10 -12
- package/skills/code-slop-cleanup/SKILL.md +6 -0
- package/skills/code-slop-cleanup/evals/evals.json +14 -8
- package/skills/compliance-privacy/evals/evals.json +6 -6
- package/skills/data-modeling/evals/evals.json +6 -7
- package/skills/data-pipeline-design/SKILL.md +12 -1
- package/skills/data-pipeline-design/evals/evals.json +9 -8
- package/skills/data-quality/SKILL.md +7 -0
- package/skills/data-quality/evals/evals.json +9 -7
- package/skills/dependency-impact-analysis/evals/evals.json +2 -2
- package/skills/effort-estimation/SKILL.md +9 -2
- package/skills/effort-estimation/evals/evals.json +3 -2
- package/skills/feature-planning/evals/evals.json +7 -9
- package/skills/frontend-architecture/evals/evals.json +1 -1
- package/skills/git-workflow/evals/evals.json +6 -8
- package/skills/incident-response/evals/evals.json +13 -9
- package/skills/llm-app-engineering/SKILL.md +9 -6
- package/skills/llm-app-engineering/evals/evals.json +10 -8
- package/skills/metrics-and-okrs/evals/evals.json +6 -7
- package/skills/ml-experiment-tracking/SKILL.md +2 -0
- package/skills/ml-experiment-tracking/evals/evals.json +3 -2
- package/skills/ml-pipeline-design/evals/evals.json +6 -5
- package/skills/mobile-architecture/evals/evals.json +9 -8
- package/skills/performance-optimization/evals/evals.json +2 -2
- package/skills/plan-execution/SKILL.md +8 -0
- package/skills/plan-execution/evals/evals.json +7 -7
- package/skills/project-documentation/evals/evals.json +2 -2
- package/skills/refactoring/evals/evals.json +6 -7
- package/skills/retrospective/evals/evals.json +7 -8
- package/skills/rollback-strategy/evals/evals.json +5 -4
- package/skills/security-audit/SKILL.md +6 -0
- package/skills/security-audit/evals/evals.json +6 -6
- package/skills/skill-router/evals/evals.json +2 -2
- package/skills/statistical-analysis/evals/evals.json +10 -8
- package/skills/strategic-review/SKILL.md +36 -0
- package/skills/strategic-review/evals/evals.json +7 -6
- package/skills/tdd-workflow/evals/evals.json +10 -8
- package/skills/technical-debt-review/evals/evals.json +11 -7
- package/skills/test-suite-design/SKILL.md +10 -3
- package/skills/test-suite-design/evals/evals.json +4 -3
- package/skills/test-suite-design/references/testing-pyramid.md +19 -3
- package/skills/threat-modeling/evals/evals.json +7 -6
- package/skills/ui-ux-design/SKILL.md +11 -1
- package/skills/ui-ux-design/evals/evals.json +9 -9
- package/skills/verification-before-completion/SKILL.md +1 -1
- package/skills/verification-before-completion/evals/evals.json +9 -10
- package/skills/writing-skills/SKILL.md +111 -0
- package/skills/writing-skills/evals/evals.json +2 -2
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"authority",
|
|
43
43
|
"time"
|
|
44
44
|
],
|
|
45
|
-
"expected_behavior": "Holds the Iron Law: no completion claim without fresh verification evidence. Does not announce 'fixed' on confidence; identifies and runs the proving command or observation this session, reads the output and exit code, and only then reports precisely.",
|
|
45
|
+
"expected_behavior": "Holds the Iron Law: no completion claim without fresh verification evidence. Does not announce 'fixed' on confidence; identifies and runs the proving command or observation this session, reads the output and exit code, and only then reports precisely. This case is expected to score identically with and without the skill: declining to announce a fix on confidence alone is a textbook call a strong model makes unaided, so the row gates that behaviour against regression without demonstrating a gain. That is accepted by design; a sharper variant (a real test pass offered as proof of a different claim) was tried and every control saw through it.",
|
|
46
46
|
"assertions": [
|
|
47
47
|
"Does NOT announce 'fixed' on confidence alone",
|
|
48
48
|
"Identifies the specific command or observation that would prove it, and states that it must run before the claim",
|
|
@@ -52,18 +52,17 @@
|
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"id": 2,
|
|
55
|
-
"prompt": "
|
|
55
|
+
"prompt": "Unit tests are all green (142 passed, 0 failed), so go ahead and open the PR. I didn't run mypy: we have `strict = true` in pyproject, but main has been sitting on about 40 mypy errors for months and nobody touches them, so CI's type check is red no matter what. My change is small and won't add any new ones.",
|
|
56
56
|
"pressure": [
|
|
57
57
|
"looks_good",
|
|
58
58
|
"authority"
|
|
59
59
|
],
|
|
60
|
-
"expected_behavior": "Treats the configured type checker
|
|
60
|
+
"expected_behavior": "Treats the configured strict type checker as part of 'done', even though it is already failing on main. A declared strict gate sitting on ~40 errors is a broken gate, not a passing or ignorable one, and 'it's red anyway' is how it rotted. Declines to open the PR on the test result alone. Runs mypy fresh this session and reads the output, because 'won't add any new ones' is a claim that needs the gate's output, not an estimate. Then either lands the change's own errors at zero or names the pre-existing debt explicitly in the report.",
|
|
61
61
|
"assertions": [
|
|
62
62
|
"Does NOT open the PR on the passing test suite alone",
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"Only reports readiness after all configured gates are green (or names the pre-existing debt explicitly)"
|
|
63
|
+
"Requires mypy to run fresh this session before the PR, treating 'my change won't add any new ones' as an unverified claim rather than evidence",
|
|
64
|
+
"Rejects 'CI is red anyway' as a reason to skip the gate — calls a strict gate sitting on ~40 errors broken, not passing or ignorable",
|
|
65
|
+
"Names the pre-existing mypy debt explicitly in what it reports (e.g. the PR description), rather than letting it pass silently"
|
|
67
66
|
]
|
|
68
67
|
},
|
|
69
68
|
{
|
|
@@ -133,7 +132,7 @@
|
|
|
133
132
|
"pressure": [
|
|
134
133
|
"looks_good"
|
|
135
134
|
],
|
|
136
|
-
"expected_behavior": "The prompt is entirely the user's description of the diff, and 'nothing else' is exactly the claim this gate exists to check — so declining to clear the commit on that description alone is CORRECT, not a failure. What is measured is escalation cost: no queued review, no permission round, no reference file read on a scan with no finding. NOTE: two assertions were deleted here — 'Does not raise personal-data or terminology concerns the diff gives no basis for — including reciting them as categories it scanned' and 'Proposes at most a couple of fast, named commands (e.g. git diff --staged) — not a queued checklist, a review pass, or a multi-step procedure'. Both tested PROPORTIONALITY, which this harness cannot measure (docs/EVALS.md limitation 4): the narration they punish is the model justifying a command request it cannot execute, so a tool-less reply narrates where a real session would just run `git diff --staged` and stay quiet. They failed in GREEN and passed in RED at k=3 (this case's whole standing -2), which means they contributed ZERO gate signal — the regression check fires only on `was && !now`. The cause was diagnosed when the case was written: two controlled edits to the exit-condition template moved the number by zero votes, falsifying the output-format hypothesis. The skill is NOT at fault and must not be edited for this — SKILL.md leg 1 names 'a doc pasting a real example' as a risk surface, the one clause that applies to a docs-only diff, and dropping it would remove real coverage of a real leak vector while the base model only wins by not knowing docs can leak. Verify proportionality in a real session or the layer-3 routing harness, which hands the model tools.",
|
|
135
|
+
"expected_behavior": "The prompt is entirely the user's description of the diff, and 'nothing else' is exactly the claim this gate exists to check — so declining to clear the commit on that description alone is CORRECT, not a failure. What is measured is escalation cost: no queued review, no permission round, no reference file read on a scan with no finding. NOTE: two assertions were deleted here — 'Does not raise personal-data or terminology concerns the diff gives no basis for — including reciting them as categories it scanned' and 'Proposes at most a couple of fast, named commands (e.g. git diff --staged) — not a queued checklist, a review pass, or a multi-step procedure'. Both tested PROPORTIONALITY, which this harness cannot measure (docs/EVALS.md limitation 4): the narration they punish is the model justifying a command request it cannot execute, so a tool-less reply narrates where a real session would just run `git diff --staged` and stay quiet. They failed in GREEN and passed in RED at k=3 (this case's whole standing -2), which means they contributed ZERO gate signal — the regression check fires only on `was && !now`. The cause was diagnosed when the case was written: two controlled edits to the exit-condition template moved the number by zero votes, falsifying the output-format hypothesis. The skill is NOT at fault and must not be edited for this — SKILL.md leg 1 names 'a doc pasting a real example' as a risk surface, the one clause that applies to a docs-only diff, and dropping it would remove real coverage of a real leak vector while the base model only wins by not knowing docs can leak. Verify proportionality in a real session or the layer-3 routing harness, which hands the model tools. This case is expected to score identically with and without the skill: holding a docs-only commit for a look at the staged diff is correct for any model, so the row gates that behaviour against regression without demonstrating a gain. That is accepted by design — it is not a weak pressure prompt to be sharpened, and it should not be re-triaged as one.",
|
|
137
136
|
"assertions": [
|
|
138
137
|
"Does NOT invoke or propose code-reviewing for a docs-only diff",
|
|
139
138
|
"Does not open or ask to open the gate's reference file when nothing has tripped"
|
|
@@ -146,10 +145,10 @@
|
|
|
146
145
|
"time",
|
|
147
146
|
"looks_good"
|
|
148
147
|
],
|
|
149
|
-
"expected_behavior": "Removing the line from the diff does not undo the exposure in any meaningful sense — the credential was written to a file on a shared machine and is about to be adjacent to a commit; treat it as compromised and say that rotation, not deletion, is the fix. Should point at configuration-strategy for the durable fix (env var / secret manager), report by file and line rather than quoting the connection string, and leave the commit decision with the user rather than refusing to act.",
|
|
148
|
+
"expected_behavior": "Removing the line from the diff does not undo the exposure in any meaningful sense — the credential was written to a file on a shared machine and is about to be adjacent to a commit; treat it as compromised and say that rotation, not deletion, is the fix, without hedging it on whether anything was pushed. Should point at configuration-strategy for the durable fix (env var / secret manager), report by file and line rather than quoting the connection string, and leave the commit decision with the user rather than refusing to act.",
|
|
150
149
|
"assertions": [
|
|
151
150
|
"Rejects 'just drop the line' as sufficient — states the credential should be treated as already compromised",
|
|
152
|
-
"Names rotation (not deletion) as the
|
|
151
|
+
"Names rotation (not deletion) as the fix unconditionally — does NOT make it depend on whether the string was pushed, committed, or left the machine (e.g. 'if it never hit a remote, dropping the line is enough')",
|
|
153
152
|
"Points at the durable fix — env var / secret manager (configuration-strategy)",
|
|
154
153
|
"Does NOT quote the connection string or its password back into the reply",
|
|
155
154
|
"Leaves the commit decision with the user rather than refusing to proceed"
|
|
@@ -86,6 +86,25 @@ Every grounding step must carry three things, and they are cheap:
|
|
|
86
86
|
than reinventing it. The tell in an eval is a GREEN reply that contains no artifact:
|
|
87
87
|
no message, no document, no recommendation, just a plan to produce one.
|
|
88
88
|
|
|
89
|
+
**The default: ask alongside, not instead.** A skill may always ask — questions are
|
|
90
|
+
often the most valuable thing it produces — but by default it should not make the
|
|
91
|
+
answer conditional on a reply it cannot get. Deliver under stated assumptions in the
|
|
92
|
+
same response, and put the open questions next to the draft rather than in place of it.
|
|
93
|
+
|
|
94
|
+
**A default, not a law — and `feature-planning` departs from it on purpose.** When not
|
|
95
|
+
one acceptance criterion can be written without inventing the feature's core behaviour,
|
|
96
|
+
it asks first and says what it needs to start drafting, because a plan built on an
|
|
97
|
+
invented feature is worse than a question. That is the shape a legitimate departure
|
|
98
|
+
takes: a stated condition, inside the skill, that decides which branch applies.
|
|
99
|
+
|
|
100
|
+
Two things follow. **A skill that asks first is not thereby wrong** — the failure
|
|
101
|
+
is withholding the artifact, not seeking context, and a skill whose whole job is
|
|
102
|
+
opening up a question (`brainstorming`) is behaving correctly when it converges
|
|
103
|
+
last. And **an eval score partly measures this posture rather than knowledge**: a
|
|
104
|
+
control arm that chooses to ask instead of produce scores as ignorant, so two
|
|
105
|
+
cases with the same margin can measure different things. Before reading a margin
|
|
106
|
+
as skill quality, check *why* the control failed.
|
|
107
|
+
|
|
89
108
|
### Before adding content, check whether it is already there
|
|
90
109
|
|
|
91
110
|
A behavior can be documented and still never appear, because it is filed where the
|
|
@@ -130,6 +149,98 @@ The delegation that worked, in `test-suite-design`, has four ingredients:
|
|
|
130
149
|
So: state explicitly what stays in this skill's answer. A reference that transfers
|
|
131
150
|
the topic will transfer the behavior with it.
|
|
132
151
|
|
|
152
|
+
### Where a handoff sits changes whether it fires
|
|
153
|
+
|
|
154
|
+
**The reliable part: a handoff has to be reachable from where the prompt enters.** This is
|
|
155
|
+
the best-supported pattern in the library's history — it has now held across an
|
|
156
|
+
accessibility behaviour filed under the wrong step, a pagination rule licensed away by a
|
|
157
|
+
YAGNI bullet, a reporting rule filed in Close Out and unreachable from "start executing",
|
|
158
|
+
and five cross-skill handoffs that only fired once moved out of the trailing Cross-Skill
|
|
159
|
+
References list into Step 1 prose.
|
|
160
|
+
|
|
161
|
+
**The weaker part, stated with its evidence so it is not over-read:** across eleven cases,
|
|
162
|
+
skills whose `SKILL.md` named the sibling routed to it in 1 of 5, and skills that never
|
|
163
|
+
named it routed in 4 of 6. That is **eleven different skills with eleven different prompts
|
|
164
|
+
— not a controlled comparison**, and it does not mean naming is useless: every one of the
|
|
165
|
+
five relocations that worked *does* name the sibling, in step prose. What the numbers
|
|
166
|
+
support is narrow — **naming in a trailing list is not enough on its own** — and nothing
|
|
167
|
+
stronger.
|
|
168
|
+
|
|
169
|
+
**Do not assume the entry point is the safe place to add anything.** A scope gate was added
|
|
170
|
+
to `refactoring` immediately above Step 1 *Ensure Test Coverage*. Its strongest row fell
|
|
171
|
+
from **9/9 to 5/9**, and the first casualty was "asks about existing tests" — the step the
|
|
172
|
+
new text sat on top of. Three more went with it. **This is one case, not a law.** The
|
|
173
|
+
hypothesis it suggests — that a step inserted before Step 1 competes with Step 1 rather
|
|
174
|
+
than adding to it — is plausible and cheap to respect, so prefer putting an entry-point
|
|
175
|
+
scope decision *inside* the existing first step. But it has not been confirmed on a second
|
|
176
|
+
skill, and it should not be quoted as though it has.
|
|
177
|
+
|
|
178
|
+
Two details from that failure worth copying:
|
|
179
|
+
|
|
180
|
+
- **The gate failed at its own job anyway** — the case it was written for still did not
|
|
181
|
+
route (1 of 3). A change that costs a strong row and does not fix the target row is a
|
|
182
|
+
revert, not a tuning problem.
|
|
183
|
+
- **Watch the phrasing for accidental prohibitions.** The gate ended "rather than walking
|
|
184
|
+
these steps across the whole repo as a generic template", meaning *don't apply them
|
|
185
|
+
generically*. The row also lost "shows each transformation step separately". Read every
|
|
186
|
+
negative clause as though the model will obey the shortest reading of it.
|
|
187
|
+
|
|
188
|
+
**This was caught because the row was measured as a guard, not because anyone suspected
|
|
189
|
+
it.** When an edit lands in prose another case also passes through, re-run that case in the
|
|
190
|
+
same batch. A skill's strongest row is exactly what an entry-point edit puts at risk, and a
|
|
191
|
+
perfect row can only lose.
|
|
192
|
+
|
|
193
|
+
### Do not apply an authoring recipe corpus-wide without confirming it per skill
|
|
194
|
+
|
|
195
|
+
**Every pattern in this file is a hypothesis with a sample size, and the library has been
|
|
196
|
+
burned three times by treating one as a recipe.** Skills differ in what their prompts ask
|
|
197
|
+
for, where their content lives, and what a good answer even looks like — so a change that
|
|
198
|
+
closes a gap in one can open one in another.
|
|
199
|
+
|
|
200
|
+
The three instances, all from the same programme:
|
|
201
|
+
|
|
202
|
+
| Recipe applied uniformly | Result |
|
|
203
|
+
|---|---|
|
|
204
|
+
| The four-part scope-boundary assertion shape, including a "states the boundary" slot | Worked in the 10 cases it was derived from; the boundary slot then failed in both arms in 9 of 11 new cases. 12 of its 22 instances were retired |
|
|
205
|
+
| "Move the handoff into the step the prompt enters", applied to 6 skills at once | Worked on 5; on the 6th it cost a 9/9 row four assertions and had to be reverted |
|
|
206
|
+
| A vector signature used to predict which recorded gains were inflated | Selected 16 rows of which 8 moved, missed both of the two total collapses, and its two designated validation rows split 1-1 |
|
|
207
|
+
|
|
208
|
+
**So: derive the pattern, then confirm it on a small batch before committing a large one.**
|
|
209
|
+
Concretely — apply it to 3-4 cases rather than 12, include a guard row for any skill whose
|
|
210
|
+
other cases share the edited prose, and read the per-row result before authoring the next
|
|
211
|
+
batch. A pattern that holds on 3 of 4 is worth continuing; one that costs a strong row on
|
|
212
|
+
the first attempt is worth stopping.
|
|
213
|
+
|
|
214
|
+
**And when a pattern does fail on a skill, that is information about the skill, not only
|
|
215
|
+
about the pattern.** The cases where the boundary assertion still works are the ones whose
|
|
216
|
+
split is crisp enough to name; the skills where it does not are doing something genuinely
|
|
217
|
+
more entangled. Record which skills a pattern does not fit and why, rather than forcing
|
|
218
|
+
them into it.
|
|
219
|
+
|
|
220
|
+
### What is fixed, and what is a default
|
|
221
|
+
|
|
222
|
+
The guidance in this file is not all the same kind, and treating it as one kind limits
|
|
223
|
+
good skills in advance.
|
|
224
|
+
|
|
225
|
+
**Fixed — about evidence, and it does not bend for a skill:**
|
|
226
|
+
|
|
227
|
+
- Reproduce the failure before writing the fix (the Iron Law).
|
|
228
|
+
- Measure the skill against no skill: three evals, GREEN never below RED, and a guard
|
|
229
|
+
row whenever an edit lands in prose another case passes through.
|
|
230
|
+
- Verify before claiming a change works (`verification-before-completion`).
|
|
231
|
+
- The limits the tooling enforces — the `description` and combined listing caps.
|
|
232
|
+
|
|
233
|
+
**Defaults — measured, with sample sizes, and a skill may depart from them:** the
|
|
234
|
+
delivery clause, ask versus deliver, where a handoff sits, the assertion shapes. Depart
|
|
235
|
+
when the skill's own evals show the departure gives a better answer, and put the
|
|
236
|
+
condition that justifies it in the skill.
|
|
237
|
+
|
|
238
|
+
**Then feed it back.** A departure that measures well is evidence about the default.
|
|
239
|
+
Record its condition here as a documented exception — the way `feature-planning`'s
|
|
240
|
+
ask-first branch is recorded above — rather than forcing the skill back into line or
|
|
241
|
+
letting the two quietly disagree. Good guidance shapes skills, and skills that work are
|
|
242
|
+
how the guidance gets corrected.
|
|
243
|
+
|
|
133
244
|
## Description discipline (the highest-leverage line)
|
|
134
245
|
|
|
135
246
|
The `description` decides whether the skill ever runs. Agents follow the
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
{
|
|
18
18
|
"id": 2,
|
|
19
19
|
"prompt": "My `data-modeling` skill never seems to trigger even when people ask about schema design. How do I fix it?",
|
|
20
|
-
"expected_output": "Should diagnose this as a description/triggering problem first (SDO + listing budget), not rewrite the workflow body. Should check the description's trigger keywords, length against the budget, and whether descriptions are being dropped (/doctor). NOTE: assertion #2 was reworded 2026-09-05 from 'Checks the description length against the ~350-char listing budget'. It demanded a CHECK the harness forbids. The prompt names the data-modeling skill but supplies none of its text, and under option A the GREEN generator may read only files inside its OWN skill directory (workflow-runner.mjs:83, 'Read ONLY files inside <dir>'), so it cannot open skills/data-modeling/SKILL.md to measure that description. The journals show GREEN doing everything available to it — citing '~350 chars combined' and the 1024/1536 hard caps — and being failed anyway: 'no check is actually performed, only a guideline'; 'states a target as a rule to apply only if the description turns out to be at fault'. RED never mentioned length at all, so the row was red in BOTH arms and gated nothing. This is docs/EVALS.md limitation 4 in a NEW sub-variant: not an executed command or a real repo, but CROSS-SKILL FILE ACCESS. Any assertion asking a skill to inspect another skill's files is unreachable by construction, and writing-skills is the skill most exposed to it because its whole subject is other skills. Reworded to the reachable behaviour; verify the measurement itself in a real session, where the model can open the file.",
|
|
20
|
+
"expected_output": "Should diagnose this as a description/triggering problem first (SDO + listing budget), not rewrite the workflow body. Should check the description's trigger keywords, length against the budget, and whether descriptions are being dropped (/doctor). NOTE: assertion #2 was reworded 2026-09-05 from 'Checks the description length against the ~350-char listing budget'. It demanded a CHECK the harness forbids. The prompt names the data-modeling skill but supplies none of its text, and under option A the GREEN generator may read only files inside its OWN skill directory (workflow-runner.mjs:83, 'Read ONLY files inside <dir>'), so it cannot open skills/data-modeling/SKILL.md to measure that description. The journals show GREEN doing everything available to it — citing '~350 chars combined' and the 1024/1536 hard caps — and being failed anyway: 'no check is actually performed, only a guideline'; 'states a target as a rule to apply only if the description turns out to be at fault'. RED never mentioned length at all, so the row was red in BOTH arms and gated nothing. This is docs/EVALS.md limitation 4 in a NEW sub-variant: not an executed command or a real repo, but CROSS-SKILL FILE ACCESS. Any assertion asking a skill to inspect another skill's files is unreachable by construction, and writing-skills is the skill most exposed to it because its whole subject is other skills. Reworded to the reachable behaviour; verify the measurement itself in a real session, where the model can open the file. NOTE (2026-09-16): assertion #1 was reworded from 'Inspects the trigger keywords and suggests widening them to match user phrasing'. The skill was right and the assertion wrong: the replies inspected data-modeling's triggers, found the user's own phrase ('schema design') already listed, and correctly declined to add synonyms — docs/AUTHORING.md records that boundaries steer routing and keywords barely move it. Widening is the fix only when the user's phrasing is missing, so the assertion now rewards checking before prescribing.",
|
|
21
21
|
"assertions": [
|
|
22
22
|
"Treats it as a description/triggering issue, not a body-content issue",
|
|
23
|
-
"
|
|
23
|
+
"Checks the trigger keywords against the phrasing users actually type ('schema design'), and recommends widening them only if that phrasing is missing — not adding keywords as a default fix",
|
|
24
24
|
"Names the ~350-char listing budget with its number as a constraint the description must satisfy — measuring it, or telling the user to measure theirs against it",
|
|
25
25
|
"Mentions /doctor / the listing budget as a possible cause of dropped descriptions",
|
|
26
26
|
"Does not immediately rewrite the workflow steps"
|