@su-record/vibe 4.1.13 → 4.1.15
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +4 -4
- package/agents/code-maintainer.md +26 -0
- package/agents/code-reviewer.md +28 -0
- package/dist/core/check.js +2 -0
- package/dist/core/check.js.map +1 -1
- package/dist/core/checks/file.js +13 -0
- package/dist/core/checks/file.js.map +1 -1
- package/dist/core/checks/fileRules.js +116 -0
- package/dist/core/checks/fileRules.js.map +1 -0
- package/dist/core/checks/review.js +51 -44
- package/dist/core/checks/review.js.map +1 -1
- package/dist/core/checks/run.js.map +1 -1
- package/dist/core/checks/source.js +23 -8
- package/dist/core/checks/source.js.map +1 -1
- package/dist/core/ledger.js +24 -2
- package/dist/core/ledger.js.map +1 -1
- package/dist/core/reader.js +5 -3
- package/dist/core/reader.js.map +1 -1
- package/dist/core/readerSession.js +15 -10
- package/dist/core/readerSession.js.map +1 -1
- package/dist/core/research.js +52 -14
- package/dist/core/research.js.map +1 -1
- package/dist/core/scenarios.js +2 -2
- package/dist/core/scenarios.js.map +1 -1
- package/dist/core/size.js +37 -1
- package/dist/core/size.js.map +1 -1
- package/dist/core/skills.js +29 -9
- package/dist/core/skills.js.map +1 -1
- package/dist/install/global.js +2 -2
- package/dist/install/global.js.map +1 -1
- package/dist/install/register.js +37 -0
- package/dist/install/register.js.map +1 -1
- package/package.json +1 -1
- package/reviewers/code/1-reviewer.md +21 -0
- package/reviewers/code/2-maintainer.md +19 -0
- package/skills/antislop-code/SKILL.md +206 -0
- package/skills/antislop-code/references/catalogue.md +28 -0
- package/skills/vibe-scope/SKILL.md +3 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: antislop-code
|
|
3
|
+
description: A code skill that strips generic-AI engineering patterns and writes, diagnoses, revises and converts code that other people will read or maintain — a library, a contribution, a handoff, a code review — in any programming language. Use it before writing code for a new module or feature, when judging or fixing an existing codebase, and whenever a change needs to fit the repository's own conventions instead of a generic default.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: [code, review, editing]
|
|
6
|
+
category: content
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Code Writing Skill (antislop-code)
|
|
10
|
+
|
|
11
|
+
`antislop-code` is a **general-purpose code skill**. It does not impose one
|
|
12
|
+
style or one language. It chooses names, structure and abstraction that fit
|
|
13
|
+
the repository at hand — the same way `antislop-design` chooses layout and
|
|
14
|
+
type that fit the brief rather than one house look.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
- Writing a new module, function or feature that another person will read, run or maintain later.
|
|
19
|
+
- Reviewing a pull request, a contribution, or a handoff before it ships.
|
|
20
|
+
- Diagnosing an existing file or directory without changing it.
|
|
21
|
+
- Revising only what needs to change while preserving behaviour and tests.
|
|
22
|
+
- Converting a generated draft, a template, or a scaffold into the codebase's own conventions.
|
|
23
|
+
|
|
24
|
+
Do not apply it to a throwaway script run once and discarded, a one-off
|
|
25
|
+
data-cleaning pass with no second reader, or bindings generated by a tool
|
|
26
|
+
from a schema or an IDL — those are not read or maintained the way a library
|
|
27
|
+
or a contribution is. Apply it to code in any language: the catalogue below
|
|
28
|
+
is about shape, not syntax.
|
|
29
|
+
|
|
30
|
+
Treat "write" or "implement" as authoring, "review" or "look this over" as
|
|
31
|
+
diagnosis, "fix" or "clean up" as revision, and "port this" or "make this
|
|
32
|
+
fit our style" as conversion. Do not attach a findings table the caller did
|
|
33
|
+
not ask for; lead with the finished code.
|
|
34
|
+
|
|
35
|
+
## Quality Priority
|
|
36
|
+
|
|
37
|
+
Judge in the following order. Do not damage an earlier condition to gain a
|
|
38
|
+
later advantage.
|
|
39
|
+
|
|
40
|
+
1. **Behaviour and tests**: the code does what it must, and the tests that prove it still pass.
|
|
41
|
+
2. **Fit with the codebase**: the change reads as if the same person who wrote the surrounding code wrote this too — same naming, same error handling, same structure.
|
|
42
|
+
3. **Clarity**: a maintainer who has never seen this file can follow it without asking the author.
|
|
43
|
+
4. **Brevity**: nothing exists that the first three conditions do not require.
|
|
44
|
+
|
|
45
|
+
## What Code Slop Is
|
|
46
|
+
|
|
47
|
+
Code slop is a structural or naming choice that could be dropped into any
|
|
48
|
+
codebase, in any language, unchanged, and would still "look like good
|
|
49
|
+
code." It is the engineering equivalent of a sentence that fits any topic.
|
|
50
|
+
The test is not whether a pattern appears — an interface, a try/except, a
|
|
51
|
+
comment can all be correct — but whether the choice was earned by this
|
|
52
|
+
code's actual shape or is the generic default a model reaches for when
|
|
53
|
+
nobody decided otherwise.
|
|
54
|
+
|
|
55
|
+
- **A comment that restates the line.** `// increment the counter` above `counter += 1`. The comment adds nothing the code did not already say.
|
|
56
|
+
- **A docstring on a getter.** `"""Gets the name."""` above `def get_name(self): return self._name`. The name of the method already is the docstring.
|
|
57
|
+
- **A guard for an impossible state.** A null check, a type check or an `assert` on a value the caller can never actually pass, defending against a state the type system or the call graph already rules out.
|
|
58
|
+
- **A try/except or try/catch that swallows.** `except: pass` or `catch (e) {}` — the failure disappears instead of propagating or being handled.
|
|
59
|
+
- **An interface or abstract class with one implementation.** A `Repository` interface with exactly one `SqlRepository` behind it, built for a substitution that will never happen.
|
|
60
|
+
- **A factory for one class.** `createWidget()` that only ever returns a `Widget`, adding a layer of indirection with no second product to switch between.
|
|
61
|
+
- **Names like `Manager`, `Helper`, `Utils`, `Handler`, `Service` with nothing behind them.** A class named for a role instead of what it actually holds or does, often a grab-bag of unrelated methods.
|
|
62
|
+
- **A wrapper that only forwards.** A function whose entire body calls another function with the same arguments and returns its result, adding a name but no behaviour.
|
|
63
|
+
- **A constant made configurable that never varies.** A value read from an environment variable, a config file or a settings object that has exactly one value in every environment that exists.
|
|
64
|
+
- **Dead code kept "just in case," or commented out.** A branch nothing reaches, an unused parameter, a block of commented-out code sitting next to the code that replaced it.
|
|
65
|
+
- **"Robust," "enhanced," "improved," "comprehensive" in a name, a comment or a commit message.** A quality claim standing in for a specific change; the word describes nothing a reader can check.
|
|
66
|
+
- **A TODO or FIXME that ships.** A marker for work that was never done, left in the code that goes out anyway.
|
|
67
|
+
- **Logging every step.** A `print` or `log.info` call after every line, drowning the one log line that would matter in noise.
|
|
68
|
+
- **A generic error message.** `raise Exception("Something went wrong")` or `throw new Error("failed")` — no failing operation named, no next step suggested.
|
|
69
|
+
- **Type or annotation noise that repeats the obvious.** `count: int # an integer` or a return-type annotation restating what the function's own name already says.
|
|
70
|
+
- **Re-exports and barrels nobody imports.** An `index.ts` or `__init__.py` re-exporting everything in a directory when nothing outside it imports through that path.
|
|
71
|
+
- **A test that asserts the implementation instead of behaviour.** A mock call count, a check that a private method ran, in place of a check on the return value or the observable state.
|
|
72
|
+
- **A commit message that praises itself.** "Successfully implemented the feature" or "now works perfectly" — a self-assessment where a commit message names what changed.
|
|
73
|
+
|
|
74
|
+
### How to see these in source
|
|
75
|
+
|
|
76
|
+
Most of these markers have a concrete textual signature: a bare
|
|
77
|
+
`except:`/`catch (e) {}` with an empty body, a class name ending in
|
|
78
|
+
`Manager`/`Helper`/`Utils`/`Handler`/`Service`, an `interface` or abstract
|
|
79
|
+
base class with exactly one class implementing or extending it, a `# TODO`
|
|
80
|
+
or `// TODO` comment, a comment line whose words are the same words as the
|
|
81
|
+
code line beneath it, a `raise`/`throw` with a generic string literal, a
|
|
82
|
+
config or environment lookup for a key whose value never changes across the
|
|
83
|
+
codebase's own config files, and a commit message containing "successfully"
|
|
84
|
+
or "robust." The full table of markers, a grep-able pattern for each, and
|
|
85
|
+
the fix, is in
|
|
86
|
+
[references/catalogue.md](references/catalogue.md).
|
|
87
|
+
|
|
88
|
+
## The Decisions a Specific Change Makes First
|
|
89
|
+
|
|
90
|
+
Before writing or changing code, settle the following. These outrank the
|
|
91
|
+
catalogue whenever they conflict with it.
|
|
92
|
+
|
|
93
|
+
1. **The repository's own conventions outrank the pack.** A sample of how this codebase already names things, handles errors and structures modules outranks any rule in this skill. Read two or three neighbouring files before writing one more.
|
|
94
|
+
2. **The smallest change that passes the check.** Do not restructure a file to fix one line; do not introduce a pattern the rest of the codebase does not use.
|
|
95
|
+
3. **Delete before add.** If a change can be made by removing code, remove it before reaching for a new abstraction, a new flag or a new file.
|
|
96
|
+
4. **A name says what, a comment says why, or nothing.** A comment that would still be true if the code beneath it changed is not doing its job; a comment that repeats the code is not doing its job either.
|
|
97
|
+
5. **An abstraction is earned by a second caller.** Do not generalise, interface, or configure something for a future need that has no present caller.
|
|
98
|
+
6. **A guard is earned by a reachable state.** Check for a condition only when something in the code's actual inputs or call sites can produce it.
|
|
99
|
+
7. **An error message names what failed and what to do.** "Config file not found at <path>; run `init` first" beats "Something went wrong."
|
|
100
|
+
8. **A test tests behaviour.** It asserts on inputs and outputs or observable state, not on how many times an internal method was called.
|
|
101
|
+
|
|
102
|
+
## The Four Tasks
|
|
103
|
+
|
|
104
|
+
### Write
|
|
105
|
+
|
|
106
|
+
1. Read two or three files near where the change lands: naming, error handling, module shape, test style.
|
|
107
|
+
2. Write the smallest version that satisfies the requirement and the existing conventions, real inputs and real error paths, no placeholder data.
|
|
108
|
+
3. Run the checklist in [Verification](#verification) before calling it done.
|
|
109
|
+
|
|
110
|
+
### Diagnose
|
|
111
|
+
|
|
112
|
+
Do not change the source. Produce a findings table and nothing else:
|
|
113
|
+
|
|
114
|
+
- What to preserve (behaviour that works, tests that pass, conventions already followed correctly).
|
|
115
|
+
- Findings: `file:line | marker | effect on the maintainer | one-line fix`.
|
|
116
|
+
- What a human must decide.
|
|
117
|
+
- Overall verdict.
|
|
118
|
+
|
|
119
|
+
Do not flag a marker you cannot pin to a location and a maintenance effect;
|
|
120
|
+
do not flag a single weak marker alone (see [Strength Tiers](#strength-tiers)).
|
|
121
|
+
|
|
122
|
+
### Revise
|
|
123
|
+
|
|
124
|
+
Hold a preservation contract. Do not add, remove or alter the following
|
|
125
|
+
while fixing what was flagged:
|
|
126
|
+
|
|
127
|
+
- **Behaviour**: what the code does for every input it already handles.
|
|
128
|
+
- **Public API and signatures**: function names, parameters, return shapes and exported symbols that other code calls.
|
|
129
|
+
- **Tests**: an existing passing test keeps passing; do not weaken an assertion to make a change fit.
|
|
130
|
+
- **Error messages**: a message another system or a log parser depends on, unless the brief asks for a specific message change.
|
|
131
|
+
- **Performance characteristics**: an complexity or resource bound the code was written to hold.
|
|
132
|
+
- **Anything the brief marks as kept.**
|
|
133
|
+
|
|
134
|
+
Be able to state the problem each change solves. Do not swap one name or one
|
|
135
|
+
structure for another only to look different. Stop at `needs-human` when the
|
|
136
|
+
brief or the codebase's own convention is too unclear to safely settle a
|
|
137
|
+
change.
|
|
138
|
+
|
|
139
|
+
### Convert
|
|
140
|
+
|
|
141
|
+
Take a generated draft, a scaffold, or a template and rebuild its names,
|
|
142
|
+
structure and error handling around the target codebase's own conventions,
|
|
143
|
+
keeping the behaviour and the public surface the draft already has. This is
|
|
144
|
+
not a rewrite for style alone: only change what would mark the file as
|
|
145
|
+
having come from somewhere else.
|
|
146
|
+
|
|
147
|
+
## Strength Tiers
|
|
148
|
+
|
|
149
|
+
- **Strong markers act alone.** One instance is enough to flag: a swallowing catch, an interface or abstract class with exactly one implementation, dead or commented-out code, a shipped TODO, invented "robust"/"enhanced" naming.
|
|
150
|
+
- **Weak markers act only when two or more overlap in the same function or file.** A short comment alone is not slop; a single defensive check alone is not slop; one `Helper`-named class alone is not slop. Two or three of these together, doing no other work, are.
|
|
151
|
+
|
|
152
|
+
Do not run the catalogue as a checklist of banned constructs. A try/except,
|
|
153
|
+
an interface and a comment are ordinary tools; the question is always
|
|
154
|
+
whether this use, in this code, was decided or defaulted to.
|
|
155
|
+
|
|
156
|
+
## Five Questions Before a Cut
|
|
157
|
+
|
|
158
|
+
Before removing anything flagged, check all five:
|
|
159
|
+
|
|
160
|
+
1. Does behaviour change if this is removed?
|
|
161
|
+
2. Is it the author's deliberate choice, or something a template or a generator left behind?
|
|
162
|
+
3. Does it explain something the code does not already say, or does it restate the code?
|
|
163
|
+
4. Does it guard a state the code's actual inputs or callers can reach?
|
|
164
|
+
5. Would the maintainer trust this file more with it gone?
|
|
165
|
+
|
|
166
|
+
## Verification
|
|
167
|
+
|
|
168
|
+
- Do the existing tests still pass, and does a new test cover the behaviour that changed?
|
|
169
|
+
- Does the change read as if it were written by whoever wrote the surrounding file?
|
|
170
|
+
- Would a maintainer who has never seen this file understand it without asking the author?
|
|
171
|
+
- Is every abstraction, interface and factory backed by a second real caller?
|
|
172
|
+
- Is every guard defending a state the code can actually reach?
|
|
173
|
+
- Does every error message name what failed and what to do next?
|
|
174
|
+
- Is anything present that behaviour, fit or clarity did not require?
|
|
175
|
+
- Are any strong markers present — a swallowing catch, a one-implementation interface, dead code, a shipped TODO, invented "robust" naming? One is enough to flag.
|
|
176
|
+
- Do two or more weak markers overlap in the same function or file — a short comment, a single guard, one generically named class, together?
|
|
177
|
+
- For a revision: does the preservation contract hold — same behaviour, same public API, same passing tests, same error messages, same performance characteristics?
|
|
178
|
+
|
|
179
|
+
## Editorial Review
|
|
180
|
+
|
|
181
|
+
Do not close out a change meant for another maintainer — a library release,
|
|
182
|
+
a contribution, a handoff — on the writer's own judgment alone. Bind a
|
|
183
|
+
`review` check to the change in a scenario:
|
|
184
|
+
|
|
185
|
+
```yaml
|
|
186
|
+
- id: roster-review
|
|
187
|
+
then: the roster module passes the reviewer and the maintainer
|
|
188
|
+
check: { type: review, pack: code, path: src/roster.py, contract: docs/roster-brief.md }
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
- `path` is the file or directory under review; `contract` is the brief describing what the change is for, who maintains it, and any stated conventions.
|
|
192
|
+
- The harness runs `reviewers/code/1-reviewer.md` first, and only on a pass runs `reviewers/code/2-maintainer.md`. A stage passes only when the entire response is exactly one line, `PASS`.
|
|
193
|
+
- The scope skill proposes this check only when the code will be read or maintained by someone else — a library, a contribution, a handoff. For code nobody else reads or runs again, `vibe size` is the code gate instead.
|
|
194
|
+
- If the same failure repeats twice, stop at `needs-human` rather than guessing at a fix the reviewer did not ask for.
|
|
195
|
+
|
|
196
|
+
This mirrors the two-stage independent review in `antislop-design`'s
|
|
197
|
+
[Editorial Review](../antislop-design/SKILL.md#editorial-review) — a
|
|
198
|
+
different reader judges, the writer does not self-certify, and a reviewer
|
|
199
|
+
returns only `PASS` or a `REJECT` list, never a rewrite.
|
|
200
|
+
|
|
201
|
+
## Pitfalls
|
|
202
|
+
|
|
203
|
+
- Do not strip the repository's own conventions to match this pack. When the two disagree, the sample outranks the rules.
|
|
204
|
+
- Do not remove a comment that explains why a choice was made, even a short one; only remove a comment that restates what the code already says.
|
|
205
|
+
- Do not delete a guard whose state is actually reachable, even if it looks defensive; check the call sites before cutting.
|
|
206
|
+
- Do not rewrite a test to make it pass instead of fixing the code, and do not weaken an assertion to quiet a failure.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Code Slop Catalogue
|
|
2
|
+
|
|
3
|
+
One row per marker. "Strength" follows the skill's tiers: a strong marker is
|
|
4
|
+
enough on its own; a weak marker only counts when two or more overlap in the
|
|
5
|
+
same function or file. Do not run this as a list of banned constructs — each
|
|
6
|
+
alternative names what to decide instead, not a substitute default. Patterns
|
|
7
|
+
are illustrative greps across common languages, not exhaustive regexes.
|
|
8
|
+
|
|
9
|
+
| Marker | What it looks like | A pattern a reviewer can grep | Strength | Fix |
|
|
10
|
+
|---|---|---|---|---|
|
|
11
|
+
| Comment restates the line | A comment whose words are the same words as the code beneath it | A `#`/`//` comment line immediately followed by a line whose identifiers and verb match it, e.g. `# increment the counter` above `counter += 1` | Weak | Delete the comment; if it explains why, keep only the why. |
|
|
12
|
+
| Docstring on a getter | A method docstring that says only what the method's name already says | `def get_\w+\(self\):\s*\n\s*"""Gets` or `"""Returns the \w+\."""` above a one-line return | Weak | Delete the docstring, or replace it with the one fact the name does not carry (units, a side effect, a caveat). |
|
|
13
|
+
| Guard for an impossible state | A null/type check or `assert` on a value the call graph never actually produces | `if \w+ is None:\s*raise` or `assert \w+ is not None` with no caller that can pass `None` | Weak | Remove the guard, or replace it with a real invariant the type system does not already enforce. |
|
|
14
|
+
| Try/except or try/catch that swallows | A failure disappears instead of propagating or being handled | `except:\s*pass`, `except Exception:\s*pass`, `catch\s*\(\w*\)\s*\{\s*\}` | Strong | Let the exception propagate, or handle it with a specific catch and a real recovery or log line naming the failure. |
|
|
15
|
+
| Interface or abstract class with one implementation | A substitution point built for a swap that never happens | `interface \w+` with exactly one `implements` of it in the codebase, or `class \w+\(ABC\)` with exactly one concrete subclass | Strong | Delete the interface and call the one implementation directly; reintroduce it when a second implementation actually exists. |
|
|
16
|
+
| Factory for one class | A creation function that only ever returns one type | `def create_\w+\(` or `class \w+Factory\b` returning a single concrete type with no branching | Weak | Replace the factory call with the constructor directly. |
|
|
17
|
+
| Manager/Helper/Utils/Handler/Service names with nothing behind them | A class named for a role, holding an unrelated grab-bag of methods | `class \w+(Manager\|Helper\|Utils\|Handler\|Service)\b` | Weak | Name the class for what it actually holds or does; split unrelated methods into their own homes. |
|
|
18
|
+
| Wrapper that only forwards | A function whose body only calls another function with the same arguments | `def \w+\(([^)]*)\):\s*\n\s*return \w+\(\1\)` or `return await inner\(` with identical arguments | Weak | Call the wrapped function directly at each call site; delete the wrapper. |
|
|
19
|
+
| Constant made configurable that never varies | A config or environment lookup for a key with exactly one value everywhere it is set | `config\.get\("[A-Z_]+"` or `os\.environ\.get\("[A-Z_]+"` whose key has one value across every config file in the repo | Weak | Replace it with a plain named constant in code. |
|
|
20
|
+
| Dead code, kept "just in case" or commented out | A branch nothing reaches, or old code left next to its replacement | A block of `#`/`//` commented-out statements, or a function/branch with no caller found by search | Strong | Delete it; version control already has the history. |
|
|
21
|
+
| "Robust"/"enhanced"/"improved"/"comprehensive" naming | A quality claim in place of a specific description | `\b(robust\|enhanced\|improved\|comprehensive)\b` in an identifier, a comment, or a commit message | Strong | Name the specific behaviour or fix instead of the adjective. |
|
|
22
|
+
| TODO/FIXME that ships | A marker for work that was never done, left in shipped code | `#\s*TODO`, `//\s*TODO`, `FIXME` with no linked issue | Strong | Do the work, file a tracked issue and reference it, or delete the marker. |
|
|
23
|
+
| Logging every step | A log or print call after nearly every line, burying the line that matters | Multiple `print\(` or `log(ger)?\.(info\|debug)\(` calls per function body, one per statement | Weak | Keep only the log line that marks a real state change or failure. |
|
|
24
|
+
| Generic error message | An error with no failing operation named and no next step | `raise Exception\("Something went wrong"\)`, `throw new Error\("failed"\)` | Strong | Name what failed and what to do: the operation, the input, and the fix. |
|
|
25
|
+
| Type/annotation noise repeating the obvious | An annotation or trailing comment that restates the type or the name | `\w+: int\s*#\s*(an? )?int(eger)?\b` or a return type annotation matching the function's own name with no added information | Weak | Delete the noise; keep only an annotation that adds information a reader could not infer. |
|
|
26
|
+
| Re-exports and barrels nobody imports | An index file re-exporting a directory that nothing imports through it | `export \* from` in `index.ts`, or `__all__ = \[.*\]` in `__init__.py`, with no import found elsewhere using that path | Weak | Delete the barrel; import from the concrete module directly. |
|
|
27
|
+
| Test asserts the implementation, not behaviour | A test checks that an internal method ran, not what the code produced | `assert_called_with\(`, `toHaveBeenCalledTimes\(`, `\.mock\.calls\.length` with no assertion on a return value or observable state in the same test | Strong | Rewrite the assertion against the function's return value or the system's observable state. |
|
|
28
|
+
| Commit message that praises itself | A self-assessment in place of a description of the change | `[Ss]uccessfully (implemented\|added\|fixed)`, `now works perfectly`, `fully functional` in a commit message | Strong | State what changed and why, not how well it turned out. |
|
|
@@ -9,9 +9,11 @@ user-invocable: false
|
|
|
9
9
|
## Procedure
|
|
10
10
|
|
|
11
11
|
1. Turn the discovery result into scenarios. A scenario is stored only if it carries exactly one check type:
|
|
12
|
-
- `run` command exit code · `file` exists/regex/contains/absent (a regex that must match nowhere)/schema/sum (a column total equals a reference) · `http` status/schema/maxMs · `eval` count of matching labelled cases (jsonl `{input, expected}` through a runner's stdin/stdout, `expect.pass` is a count) · `review` an antislop pack's reviewer stages in order (text: copy editor → chief editor; design: markup reviewer → art director), run by the harness, exact `PASS` only · `human` no verdict (goes to the inbox)
|
|
12
|
+
- `run` command exit code · `file` exists/regex/contains/absent (a regex that must match nowhere)/traceable (every number is in an evidence file)/a11y (mechanical accessibility defects)/schema/sum (a column total equals a reference) · `http` status/schema/maxMs · `eval` count of matching labelled cases (jsonl `{input, expected}` through a runner's stdin/stdout, `expect.pass` is a count) · `review` an antislop pack's reviewer stages in order (text: copy editor → chief editor; design: markup reviewer → art director; code: reviewer → maintainer), run by the harness, exact `PASS` only · `human` no verdict (goes to the inbox)
|
|
13
13
|
- When a success condition is human-read text (blog, column, article, report, script, speech), propose `check: { type: review, path: <file>, contract: <file>, evidence: <file> }` and mark it `⚠ model-judged` in the approval message.
|
|
14
14
|
- When it is something a person looks at (screen, page, component, dashboard, slide, card news, poster), propose `check: { type: review, pack: design, path: <file or directory>, contract: <brief>, screenshot: <png, if an earlier scenario renders one> }`, same mark.
|
|
15
|
+
- When the code will be read or maintained by someone else (a library, a contribution, a handoff), propose `check: { type: review, pack: code, path: <file or directory>, contract: <brief> }`, same mark; otherwise `vibe size` stays the code gate.
|
|
16
|
+
- Next to a text `review` that has an evidence file, propose `check: { type: file, path: <file>, traceable: <evidence file> }` (every number in the text is in the evidence); next to a design `review` on html, `check: { type: file, path: <html>, a11y: true }` (alt, heading order, unnamed controls, unlabelled inputs, contrast). These check facts; the reviewers keep the judgment.
|
|
15
17
|
- Next to every `review`, propose its deterministic pre-gate on the same file: `check: { type: file, path: <file>, absent: "@placeholders" }` — the preset is the usual leftovers (lorem-ipsum text, a bracketed TODO, a to-be-decided mark, a company-name placeholder, unfilled double-brace fields, double-square-bracket notes); add the project's own words with `|`. For a directory, a `run` check with `grep -rlE` and `expect: 1`. Tell the writer that a note to the model goes between double square brackets, so the gate catches it if it survives into the artifact.
|
|
16
18
|
- A condition you cannot check gets `human` explicitly. An irreversible action (push, deploy, send, delete, spend) gets `irreversible: <action>`.
|
|
17
19
|
- A scenario that only makes sense after another one has passed gets `needs: [ids]`. The harness orders and parallelises checks from these edges; keep a connected graph under six scenarios.
|