@deslop/coding-standards 0.1.828 → 0.1.856
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/dist/install.js +1 -1
- package/package.json +1 -1
- package/skills/design/SKILL.md +10 -7
- package/skills/engineering/SKILL.md +19 -20
- package/skills/testing/SKILL.md +11 -13
package/dist/install.js
CHANGED
|
@@ -24685,7 +24685,7 @@ const runWith = (command, config) => {
|
|
|
24685
24685
|
};
|
|
24686
24686
|
//#endregion
|
|
24687
24687
|
//#region package.json
|
|
24688
|
-
var version = "0.1.
|
|
24688
|
+
var version = "0.1.856";
|
|
24689
24689
|
//#endregion
|
|
24690
24690
|
//#region src/install.ts
|
|
24691
24691
|
const cli = pipe(make("deslop-coding-standards", {}, fnUntraced(function* () {
|
package/package.json
CHANGED
package/skills/design/SKILL.md
CHANGED
|
@@ -9,7 +9,7 @@ description: 'UI and UX rules for screens and visual explanations. Use when buil
|
|
|
9
9
|
|
|
10
10
|
## Decide
|
|
11
11
|
|
|
12
|
-
**Direction.** Start from the actual task, audience, content and settled preferences. Make the next user action and its relevant content dominant, not generic "premium" styling. When a reference is useful, inspect the relevant accepted one for transferable hierarchy, density and interaction choices; distinguish observed details from inferred ones. Community brand analyses are inspiration, not verified current tokens.
|
|
12
|
+
**Direction.** Start from the actual task, audience, content and settled preferences. Make the next user action and its relevant content dominant, not generic "premium" styling. When a reference is useful, inspect the relevant accepted one for transferable hierarchy, density and interaction choices; distinguish observed details from inferred ones. Community brand analyses are inspiration, not verified current tokens.
|
|
13
13
|
|
|
14
14
|
**One meaning.** Each visible element must add information, enable a distinct action or clarify a relationship. Delete repeated headings, summaries, counts, status badges, decorative wrappers and controls that say or do the same thing. Remove explanations that merely restate the visible example/state. Keyboard shortcuts, screen-reader labels and responsive placement are not redundant visible controls; preserve their function.
|
|
15
15
|
|
|
@@ -33,6 +33,8 @@ Do not remove necessary names, status, comfortable hit targets or instructions m
|
|
|
33
33
|
|
|
34
34
|
## Build
|
|
35
35
|
|
|
36
|
+
These rules apply to product UI. A rendered explanation follows the host's rendering contract and the rules below.
|
|
37
|
+
|
|
36
38
|
**Canonical components.** Reuse the existing renderer, states and interactions for the same role. Inspect its relevant source/API, not a full catalogue; add missing primitives through the repository registry command. Fix wrong shared patterns at their owner when delivering retained code, not before an exploratory preview. Without a sibling, use the supplied reference and component defaults within settled preferences.
|
|
37
39
|
|
|
38
40
|
```tsx
|
|
@@ -73,7 +75,8 @@ Do not remove necessary names, status, comfortable hit targets or instructions m
|
|
|
73
75
|
| Accents/tall scripts clip | Tight line height or text-box clipping | Fix the owning type-scale/overflow choice; don't shrink the font to fit |
|
|
74
76
|
| Missing metadata leaves separators | Empty optional slots still render | Omit orphaned separators/lines; reserve space only when the layout needs it |
|
|
75
77
|
|
|
76
|
-
|
|
78
|
+
**Prevent before rejecting.** When the app already knows an action is not allowed, such as a missing permission, a referenced record or invalid input, disable or hide the control and show the reason beside it. Never let the user act and then show an error the app can predict.
|
|
79
|
+
|
|
77
80
|
**Motion.** Explain change without delaying input or moving content just for decoration. Reuse existing tokens/components; no new library for a fade or universal curve, duration, bounce or press scale.
|
|
78
81
|
|
|
79
82
|
| Interaction | Treatment |
|
|
@@ -84,7 +87,7 @@ Do not remove necessary names, status, comfortable hit targets or instructions m
|
|
|
84
87
|
| Drag/gesture | Follow the pointer; preserve the existing primitive's capture, cancellation and release behavior |
|
|
85
88
|
| Reduced motion | Preserve feedback through a suitable static or gentle non-spatial equivalent |
|
|
86
89
|
|
|
87
|
-
Use responsive entry easing and brief existing durations. Simple retargetable states suit transitions; gestures
|
|
90
|
+
Use responsive entry easing and brief existing durations. Simple retargetable states suit transitions; gestures can use the existing spring. Prefer transforms and opacity where appropriate, but CSS and WAAPI do not guarantee compositor execution. Profile observed performance problems, not every animation. Inspect rapid repetition, reversal and reduced motion, not only the final frame.
|
|
88
91
|
|
|
89
92
|
**Access and responsiveness.** Preserve the complete task on phones, not merely stacked desktop panes. Keep essential actions reachable with keyboard, touch and zoom. Use semantic structure, accessible names, visible focus, logical order and deliberate focus return. Inspect long/duplicate content, overflow, contrast and relevant failure/permission states. Do not remove an accessible affordance to satisfy visual minimalism.
|
|
90
93
|
|
|
@@ -101,19 +104,19 @@ Touch and mouse can coexist; do not infer capabilities from user-agent strings o
|
|
|
101
104
|
|
|
102
105
|
**Try the question.** Build one rough representative screen or interaction in the existing host with realistic data. Inspect enough to make the trial trustworthy, then show it to the user before merge-readiness work. Label stubs and limits; a conceptual sketch is sufficient only when execution is unnecessary, never proof of working software. Set a short first-preview budget; show a partial result or blocker rather than expanding unseen. No production completeness or polished gallery first.
|
|
103
106
|
|
|
104
|
-
**Use the findings.** For layout questions, compare hierarchy or interaction, not color-only variants.
|
|
107
|
+
**Use the findings.** For layout questions, compare hierarchy or interaction, not color-only variants. Compare several directions at the mockup stage; add real attempts only for unresolved uncertainty, feedback or an explicit request. A style question can compare style. Keep useful comparisons; discard/rebuild freely and combine compatible strengths, not incompatible mechanisms. Test the weakest assumption while it can change the choice. A settled direction needs no manufactured taste question or exploration round.
|
|
105
108
|
|
|
106
109
|
## Verify and show
|
|
107
110
|
|
|
108
111
|
**Inspect retained UI.** Open actual captures at the sizes needed for the task. Compare related edges, columns, baselines and equivalent controls across rows/screens—not just successful clicks. Use realistic long names/URLs, translated labels, Unicode, missing fields and relevant 0/1/many records at the actual container width. Respect schema/API limits; never add a validation limit to make layout pass. Mix cases across rows. Check selected/focus/error states and scrolling; a clean default row can hide misalignment. Inspect hierarchy, density, legibility and clipping. Exercise the relevant keyboard/touch, narrow/wide, zoom and focus-return journeys; run axe where applicable. A clean scan does not prove contrast or usability. Inspect meaningful video frames and sequence; a playable file is not proof of a good composition. Batch relevant inspection/repairs; recheck affected views rather than restart a whole audit after each micro-edit. Visible misalignment, inconsistent controls or redundant elements remain defects even when types/tests pass; fix them before claiming acceptance.
|
|
109
112
|
|
|
110
|
-
**Show the design.** Use inspected screenshots for layout and short video for behavior. Compare at consistent sizes with states needed for the decision; no variant switcher just to see the options. A visual must add spatial or interactive information, not reproduce prose, a file list or a fake runtime screenshot.
|
|
113
|
+
**Show the design.** Use inspected screenshots for layout and short video for behavior. Compare at consistent sizes with states needed for the decision; no variant switcher just to see the options. A visual must add spatial or interactive information, not reproduce prose, a file list or a fake runtime screenshot. Embed useful existing captures in the render rather than recreate them. For diagrams, review pages and rendered answers, follow Visual explanations below. Use the user's theme and verify the actual browser color preference. Preserve useful media and retire settled attempts; workflow decides how long previews run.
|
|
111
114
|
|
|
112
115
|
**Review surfaces.** Open on the outcome the user needs to judge, with technical detail available on demand. Group by changed behavior, not files or agent stages. A selected example, diagram or diff must reveal its scope; never make curated evidence look like complete coverage. Do not build a custom review dashboard when existing captures and the PR can answer the question. A design-skill edit is not a product-screen change.
|
|
113
116
|
|
|
114
117
|
## Visual explanations
|
|
115
118
|
|
|
116
|
-
These rules cover diagrams, review pages and rendered agent answers
|
|
119
|
+
These rules cover diagrams, review pages and rendered agent answers; the pair prompt decides when a reply needs a render. A render replaces the text it shows; it never repeats it.
|
|
117
120
|
|
|
118
121
|
**Pick the exhibit from the question.**
|
|
119
122
|
|
|
@@ -157,4 +160,4 @@ When none fits, choose the form that matches the data's shape, not the first car
|
|
|
157
160
|
|
|
158
161
|
Use image generation only for a needed illustrative asset, atmosphere, texture or icon exploration—not ordinary text, exact diagrams or fake working UI. Use the native tool exposed by the harness; no invented invocation or replacement API client when unavailable. Report missing capability honestly.
|
|
159
162
|
|
|
160
|
-
Describe purpose, placement, composition, palette and intended size
|
|
163
|
+
Describe purpose, placement, composition, palette and intended size and aspect ratio. For edits, supply the real source and state what remains unchanged. Generate only what the chosen direction needs; prefer existing icons or CSS when they express the job precisely. Inspect the returned asset at its intended size for crop, text and edge artifacts, contrast and fit. Preserve useful originals and identify generated assets as such; they are not runtime or browser proof. Keep only used assets in product source.
|
|
@@ -5,30 +5,29 @@ description: 'TypeScript and Effect code conventions paired with shared lint. Us
|
|
|
5
5
|
|
|
6
6
|
**Scope.** Apply these rules and repository-specific CODING_STANDARDS.md.
|
|
7
7
|
|
|
8
|
-
**Dependency APIs.** Match
|
|
8
|
+
**Dependency APIs.** Match the manifest and lockfile versions. Before adding an API wrapper or workaround, read the upstream source per workflow's research procedure. Library APIs do not define coding policy.
|
|
9
9
|
|
|
10
10
|
**Diagnostics.** Use the shown idiom, not casts, weakened rules or a rewrite trading one diagnostic for another.
|
|
11
11
|
|
|
12
12
|
## Simplicity
|
|
13
13
|
|
|
14
|
-
**Clarity.** Plain, explicit, idiomatic code, names and files; read top to bottom without commentary or cleverness.
|
|
14
|
+
**Clarity.** Plain, explicit, idiomatic code, names and files; read top to bottom without commentary or cleverness. Match the surrounding code's naming, idiom and comment density.
|
|
15
15
|
|
|
16
16
|
**Experiments.** Write with these idioms; reserve the full refactor/cleanup pass for retained delivery. Keep disposable source isolated and shared rules intact.
|
|
17
17
|
|
|
18
|
-
- **
|
|
18
|
+
- **Reuse first.** Check existing code, installed modules and platform capabilities before adding code. Implement only the missing behavior, without dropping required behavior, safety or accessibility. Workflow owns the scope. A refactor or cleanup request applies every rule to every line of the owned files.
|
|
19
19
|
- **Inward layers.** Domain and service code never import HTTP, RPC, or other transport types.
|
|
20
20
|
- **Building blocks.** For a consequential new interface, start with a realistic caller operation and its ordering, failure and lifetime obligations; hide useful complexity, not forwarded names. Offer services, Layers and functions the caller composes like any Effect module, never a bundle such as `serve(app)`. No mandatory architecture document or alternatives round.
|
|
21
|
-
- **No machinery.**
|
|
22
|
-
- **Behavior kept.** A refactor keeps behavior at every
|
|
23
|
-
- **Reachable bugs.**
|
|
24
|
-
- **Performance.**
|
|
21
|
+
- **No machinery.** Add hooks, guards or generators only for a required contract or a recurring defect.
|
|
22
|
+
- **Behavior kept.** A refactor keeps observable behavior at every consumer. Report two accepted differences with the change: one no consumer observes, and one a rule here causes, such as an error keeping its cause. Printed diagnostics are not a contract. Any other behavior change follows workflow's scope.
|
|
23
|
+
- **Reachable bugs.** Fix a bug that real input reaches when it lies inside workflow's scope, and check every consumer of the changed output. For a hard bug, use one reproduction and one prediction per probe. Remove edits based on disproven hypotheses, then rerun the original scenario. Delete handling only for input the contract excludes; keep and report code that looks intentional.
|
|
24
|
+
- **Performance.** Optimize only when the request or a required contract needs it, and measure realistic input before claiming a speedup. Diagnose at the layer that owns the symptom: distributed spans for RPC/backend dependencies, React commits for rerenders, a browser performance profile for main-thread work. Correlate one real action before changing code, then repeat it on the fix; neither a screenshot nor a service name proves latency or trace coverage. Time correct completed work under equivalent workloads/configuration; distinguish setup/cache/profiling cost and report run count/variation. Differences within noise are unproved, not speedups. Use existing instrumentation; profiling is not a ritual on every change.
|
|
25
25
|
- **Type safety.** A fix never weakens types to make a symptom go away: no widened or erased type, cast, dropped generic, or loosened exported type.
|
|
26
26
|
- **Domain.** Implement the definition the domain uses, such as a cycle for recursion, never the nearest syntactic proxy.
|
|
27
|
-
- **Reread.** Before delivering retained code, reread the diff and delete every line the outcome does not require.
|
|
28
27
|
|
|
29
28
|
**Happy path.** Failures flow through the error channel: no catch, retry, fallback, backup, or defensive check unless the request or an existing contract needs it.
|
|
30
29
|
|
|
31
|
-
**Trusted data.** Validate and transform once
|
|
30
|
+
**Trusted data.** Validate and transform once at the boundary with Effect Schema. Carry narrowed values forward. Never re-check what the schema, the declared type, an earlier filter or every caller guarantees.
|
|
32
31
|
|
|
33
32
|
```ts
|
|
34
33
|
// good
|
|
@@ -54,7 +53,7 @@ Math.floor(Duration.toDays(DateTime.distance(oldest.timestamp, newest.timestamp)
|
|
|
54
53
|
import {glob} from 'glob' // a dependency Effect's FileSystem replaces
|
|
55
54
|
```
|
|
56
55
|
|
|
57
|
-
**Whole values.** Pass whole values or spread them.
|
|
56
|
+
**Whole values.** Pass whole values or spread them. Do not destructure parameters, callbacks or loop bindings, except labeled tuple parameters, React state and component refs. Project fields only to exclude data the recipient must not receive. Name the whole value by its role. A leading underscore marks only a parameter the body never reads; never add an underscore or a number to avoid shadowing.
|
|
58
57
|
|
|
59
58
|
```ts
|
|
60
59
|
// good
|
|
@@ -101,7 +100,7 @@ pipe(
|
|
|
101
100
|
|
|
102
101
|
## Lint pairs
|
|
103
102
|
|
|
104
|
-
The forms below are the ones lint enforces without an autofix,
|
|
103
|
+
The forms below are the ones lint enforces without an autofix, each in a form that satisfies every rule involved.
|
|
105
104
|
|
|
106
105
|
**Fallback.** A default is `??`; never a ternary on the same value.
|
|
107
106
|
|
|
@@ -112,7 +111,7 @@ const root = options?.root ?? '.'
|
|
|
112
111
|
const root = options?.root !== undefined ? options.root : '.'
|
|
113
112
|
```
|
|
114
113
|
|
|
115
|
-
**Conditions.** A boolean is tested bare; `=== true` only on a value that
|
|
114
|
+
**Conditions.** A boolean is tested bare; `=== true` only on a value that can be undefined.
|
|
116
115
|
|
|
117
116
|
```tsx
|
|
118
117
|
// good
|
|
@@ -120,7 +119,7 @@ if (enabled) return
|
|
|
120
119
|
aria-current={props.selected === true ? 'page' : undefined}
|
|
121
120
|
// bad
|
|
122
121
|
if (enabled === true) return // enabled is a boolean
|
|
123
|
-
if (props.selected) return // props.selected
|
|
122
|
+
if (props.selected) return // props.selected can be undefined
|
|
124
123
|
```
|
|
125
124
|
|
|
126
125
|
**Flat.** Use early-return statements in Effect.fn. No nested ternaries or combinators deeper than equivalent statements. Match/combinators serve single expressions; Boolean.match selects a value, except one-line JSX-attribute ternaries.
|
|
@@ -180,7 +179,7 @@ const parsed = Option.getOrUndefined(Number.parse(event.target.value))
|
|
|
180
179
|
|
|
181
180
|
**Handlers.** A handler used once is an arrow in place; a handler used twice is a `function`.
|
|
182
181
|
|
|
183
|
-
**Pairs.**
|
|
182
|
+
**Pairs.** Read positional tuples by index. Whole values lists the destructuring exceptions.
|
|
184
183
|
|
|
185
184
|
**Accumulators.** No `let`: a fold or an Effect collection operation that says what it selects.
|
|
186
185
|
|
|
@@ -244,7 +243,7 @@ const text = Effect.fn('Ai.text')(function* (response: AiResponse) {
|
|
|
244
243
|
})
|
|
245
244
|
```
|
|
246
245
|
|
|
247
|
-
**Casts.** No `as`, `any` or erasing a known shape into `unknown`; `satisfies` and `as const` are the only assertions. Genuinely opaque SDK/framework inputs remain `unknown` until narrowed or decoded at their boundary—do not fabricate a shape to avoid that type.
|
|
246
|
+
**Casts.** No `as`, `any` or erasing a known shape into `unknown`; `satisfies` and `as const` are the only assertions. Genuinely opaque SDK/framework inputs remain `unknown` until narrowed or decoded at their boundary—do not fabricate a shape to avoid that type.
|
|
248
247
|
|
|
249
248
|
```ts
|
|
250
249
|
// good
|
|
@@ -296,12 +295,12 @@ export const EntryKind = Schema.Literals(['income', 'expense']) // no importer
|
|
|
296
295
|
// oxlint-disable-next-line typescript/consistent-type-assertions
|
|
297
296
|
// oxlint-disable-next-line sort-keys -- keeps the printed order
|
|
298
297
|
// bad
|
|
299
|
-
files: ['packages/components/src/components/
|
|
298
|
+
files: ['packages/components/src/components/dev-tools.tsx', 'packages/components/src/components/form.tsx'],
|
|
300
299
|
```
|
|
301
300
|
|
|
302
301
|
## Effect
|
|
303
302
|
|
|
304
|
-
**Functions.**
|
|
303
|
+
**Functions.** Use Effect.fn('Name.method') for a traced function with arguments and Effect.fnUntraced for an internal helper. Use Effect.gen for an effect with several statements and no arguments, and a single effect directly. Use Effect.fn.Return for an explicit return type.
|
|
305
304
|
|
|
306
305
|
```ts
|
|
307
306
|
// good
|
|
@@ -325,7 +324,7 @@ const stop = Effect.gen(function* () {
|
|
|
325
324
|
}) // one statement
|
|
326
325
|
```
|
|
327
326
|
|
|
328
|
-
**Errors.** One domain error per service; preserve cause, redact secrets, map in Effect.fn's pipeline argument. Map SDK unknown errors at the adapter.
|
|
327
|
+
**Errors.** One domain error per service; preserve cause, redact secrets, map in Effect.fn's pipeline argument. Map SDK unknown errors at the adapter.
|
|
329
328
|
|
|
330
329
|
```ts
|
|
331
330
|
// good
|
|
@@ -544,7 +543,7 @@ setDraft(current => {
|
|
|
544
543
|
|
|
545
544
|
**File tree.** Use explicit kebab-case role names and one naming scheme. Prefer one substantive file to near-empty fragments; colocate <name>.test.ts; no barrels.
|
|
546
545
|
|
|
547
|
-
**Package surface.**
|
|
546
|
+
**Package surface.** Declare exports for imported subpaths and import aliases for internal paths. Use the shared lint preset with generated ignores only.
|
|
548
547
|
|
|
549
548
|
```ts
|
|
550
549
|
// good
|
|
@@ -560,7 +559,7 @@ const warned = ['sort-keys', 'typescript/no-restricted-types'] // a package rule
|
|
|
560
559
|
|
|
561
560
|
## React
|
|
562
561
|
|
|
563
|
-
**Components.** React Compiler memoizes
|
|
562
|
+
**Components.** React Compiler memoizes. Destructure state at its declaration, receive component refs through props, and keep shared logic in atoms.
|
|
564
563
|
|
|
565
564
|
```tsx
|
|
566
565
|
// good
|
package/skills/testing/SKILL.md
CHANGED
|
@@ -5,19 +5,17 @@ description: 'Select and run black-box behavior proof for Effect apps/tools. Use
|
|
|
5
5
|
|
|
6
6
|
# Testing
|
|
7
7
|
|
|
8
|
-
**Scope.**
|
|
9
|
-
|
|
10
|
-
**Timing.** An experiment needs trustworthy proof of its question, not comprehensive release coverage. Final acceptance applies to retained delivery; label stubbed/unproved behavior.
|
|
8
|
+
**Scope.** Test behavior the changed code owns; a coverage count proves nothing.
|
|
11
9
|
|
|
12
10
|
- **Worth it.** Test owned branching, computation, parsing/state transitions a plausible regression breaks; add missing valuable coverage before refactoring.
|
|
13
|
-
- **
|
|
14
|
-
- **Redundant.** Delete touched cases
|
|
11
|
+
- **Public interface.** Test exported Layers, services and functions through observable behavior, so a rewrite that keeps the contract keeps the tests green. The browser proves UI components.
|
|
12
|
+
- **Redundant.** Delete touched cases that only repeat dependency guarantees, constants, wording, removed behavior or an already covered input. Keep boundary tests that prove the application's own validation, encoding or integration.
|
|
15
13
|
- **Independent.** Expected values come from the contract/worked example, not implementation recomputation. Use the smallest reachable discriminating fixture.
|
|
16
|
-
- **Bugs.** Reproduce a bug before fixing it
|
|
14
|
+
- **Bugs.** Reproduce a bug before fixing it. Keep the failing case when it protects owned behavior, in the existing test that covers the fixed code, or a new case when none fits.
|
|
17
15
|
- **Throwaway.** Settle a worry with a throwaway test or prototype and delete it once answered.
|
|
18
16
|
- **Honest.** No wrong expectations or rule workarounds. Change assertions only for recorded behavior changes; preserve every still-relevant value.
|
|
19
17
|
|
|
20
|
-
**Assertions.**
|
|
18
|
+
**Assertions.** Use one representative input per behavior, in its existing case. Share a helper only between cases that use it. Use @effect/vitest assertions for outputs and structured error identity. Replace dependencies through Layers or public parameters, never global or module mocks. Isolate mutable state in its owning fixture.
|
|
21
19
|
|
|
22
20
|
```ts
|
|
23
21
|
// good — "test files only for the services/packages public interfaces"
|
|
@@ -40,10 +38,10 @@ assert.strictEqual(Array.flatMap(attioProvider.groups, group => group.actions).l
|
|
|
40
38
|
|
|
41
39
|
## Choose cases
|
|
42
40
|
|
|
43
|
-
- **Contract.**
|
|
41
|
+
- **Contract.** Connect a reachable input to an observable output, so a plausible wrong implementation fails. Use the nearest public interface, not private helpers or new harnesses. When behavior is uncertain, settle one reachable case with a focused check and minimal implementation, then choose the next case from the findings; do not batch tests for an imagined implementation or require universal TDD.
|
|
44
42
|
- **Branches.** Exercise reachable empty/duplicate/concurrent/dependency-failure distinctions; no Cartesian product or random/repeated happy paths without a hypothesis.
|
|
45
43
|
- **Failure.** Effect.flip for expected failure; Effect.exit for both outcomes. Assert domain identity and preserved state/resources: no partial write, lost value, extra retry or leak. Wording/rejection alone is insufficient; no incidental order assertions.
|
|
46
|
-
- **Control.** Run against the unfixed implementation
|
|
44
|
+
- **Control.** Run the regression test against the unfixed implementation, and confirm that the intended assertion fails, not setup, imports or compilation. Before a refactor, cover the old behavior first.
|
|
47
45
|
|
|
48
46
|
## Effect and fixtures
|
|
49
47
|
|
|
@@ -58,9 +56,9 @@ assert.strictEqual(Array.flatMap(attioProvider.groups, group => group.actions).l
|
|
|
58
56
|
|
|
59
57
|
## Run and reconcile
|
|
60
58
|
|
|
61
|
-
- **Run.** Use
|
|
62
|
-
- **Inventory.** Collect independent failures once instead of cancelling the suite at the first failure. Distinguish separate cases from repeated observations.
|
|
59
|
+
- **Run.** Use the documented test selectors and confirm that they collect and execute the intended cases. Zero collected tests, setup alone or exit code 0 alone prove nothing.
|
|
60
|
+
- **Inventory.** Collect independent failures once instead of cancelling the suite at the first failure. Distinguish separate cases from repeated observations. Rerun a timed-out test once in isolation; a pass proves that run, not the cause of the timeout. Do not call a bypassed selector or a skipped operation flaky.
|
|
63
61
|
- **Evidence.** Preserve the first failure, exact command, execution count and exit status. Separate cause from hypothesis, product defect from setup failure, and a skipped criterion from a passing one. A source read or overall green command never substitutes for a missing behavior check.
|
|
64
|
-
- **Stable inputs.**
|
|
65
|
-
- **Final proof.** Reconcile every required behavior on the final code. Screenshots
|
|
62
|
+
- **Stable inputs.** A check proves only the source, dependencies and configuration it ran on; an edit to them invalidates its result.
|
|
63
|
+
- **Final proof.** Reconcile every required behavior on the final code. Screenshots and video prove visible outcomes; execution through the public interface proves the rest.
|
|
66
64
|
- **Visual proof.** A capture proves one claim and ends on its outcome, held long enough to read: the run, the file or the rejection. Seed data first, and keep loading states off camera unless loading is the claim. Show realistic journeys end to end, cropped to the element at a readable scale; speed up waits instead of cutting steps. A capture is stale once any component it shows changes.
|