@deslop/coding-standards 0.1.886 → 0.1.897
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 +3 -3
- package/dist/install.js +8 -4
- package/package.json +1 -1
- package/skills/design/SKILL.md +40 -3
- package/skills/testing/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ Run inside a Git repository, including a linked worktree:
|
|
|
10
10
|
vpx @deslop/coding-standards@latest
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
It copies the three skills into the repository's existing `.agents`, `.claude` and `.codex` directories,
|
|
13
|
+
It copies the three skills into the repository's existing `.agents`, `.claude` and `.codex` directories. It always writes `.claude`, which Claude Code reads, and writes `.agents` when no `.codex` exists. A refresh replaces only those three skills, and destinations outside the repository or inside global agent configuration are rejected. Nothing is added to the manifest, lockfile or lint configuration. Installed copies are read-only; refresh them with the CLI.
|
|
14
14
|
|
|
15
15
|
## Use the lint preset
|
|
16
16
|
|
|
@@ -63,10 +63,10 @@ node tools/coding-standards/src/install.ts
|
|
|
63
63
|
| [Cursor / pstack](https://github.com/cursor/plugins/tree/e43c7ee26e0038c6c1fa8380dd34ce86ff94cb2a/pstack) | Interface rationale, focused bug replay and defensible benchmarks; no playbook-stage machinery |
|
|
64
64
|
| [Kit Langton's Effect skill](https://github.com/kitlangton/skills/tree/71195e36024ebd2e66c5beac946e81eafd5abc43/skills/effect) | Schema construction/optionality, checked against actual [Effect 4 source](https://github.com/Effect-TS/effect/tree/67ba4e46a11ccda0b6761578bfd22c04ae00167d/packages/effect/src) |
|
|
65
65
|
| [Vercel's agent skills](https://github.com/vercel-labs/agent-skills/tree/063bee94c3f4df8453406c830b0a7df0f2860278/skills) | Independent I/O and narrow subscriptions, translated to Effect/atoms; no manual React memoization |
|
|
66
|
-
| [Anthropic frontend-design](https://github.com/anthropics/skills/tree/main/skills/frontend-design), [Taste Skill](https://github.com/Leonxlnx/taste-skill), [Vercel design guidelines](https://vercel.com/design/guidelines) | Task-led composition
|
|
66
|
+
| [Anthropic frontend-design](https://github.com/anthropics/skills/tree/main/skills/frontend-design), [Taste Skill](https://github.com/Leonxlnx/taste-skill), [Vercel design guidelines](https://vercel.com/design/guidelines) | Task-led composition and copy in both modes; creative mode adapts Anthropic's studio stance, grounding and generated-default list; no plugin bundle or fixed aesthetic bans |
|
|
67
67
|
| [Emil Kowalski's skills](https://github.com/emilkowalski/skills/tree/e8a175de22ae1e49370fc144c1f3bb9aeedf988d/skills) | Realistic layout stress, interruptible motion and mobile checks; no fixed variant picker or audit fan-out. Performance caveats checked against [Motion docs](https://motion.dev/docs/performance) |
|
|
68
68
|
| [Dillon Mulroy's skills](https://github.com/dmmulroy/skills/tree/8603380821fee6a77c82639f364ce8fe4f5a92be) and [anti-slop](https://github.com/dmmulroy/anti-slop/tree/c44ef22ca116d0ba62a3ff663a0bd13a3f3fa40b) | Reviewed Effect/error and cleanup approaches; retain our own service layout and ownership |
|
|
69
|
-
| [Awesome DESIGN.md](https://github.com/VoltAgent/awesome-design-md) and [Impeccable](https://github.com/pbakaus/impeccable) |
|
|
69
|
+
| [Awesome DESIGN.md](https://github.com/VoltAgent/awesome-design-md) and [Impeccable](https://github.com/pbakaus/impeccable) | Impeccable's concept comparison and screenshot critique shaped creative mode; community brand analyses are inspiration, not authoritative or current tokens |
|
|
70
70
|
|
|
71
71
|
These are selectively adapted ideas, not imported frameworks. Concrete behavior, existing stack and settled user decisions govern the maintained skills.
|
|
72
72
|
|
package/dist/install.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { $n as isNullish, $t as causeFail, An as formatPath, B as match$5, Bt as Error$3, C as findFirst, Cn as setStackTraceLimit, Ct as some, Dn as format$1, Dt as Number$6, En as toStringUnknown, F as isReadonlyArrayNonEmpty, Fn as symbol, Gn as hasProperty, Gt as ReasonBase, Hn as string$1, Ht as Fail, I as join, Jn as isFunction, Jt as Yield, Kn as isBoolean$1, Kt as StackTraceKey, Ln as combine$1,
|
|
2
|
+
import { $n as isNullish, $t as causeFail, An as formatPath, B as match$5, Bt as Error$3, C as findFirst, Cn as setStackTraceLimit, Ct as some, Dn as format$1, Dt as Number$6, En as toStringUnknown, F as isReadonlyArrayNonEmpty, Fn as symbol, Gn as hasProperty, Gt as ReasonBase, Hn as string$1, Ht as Fail, I as join, Jn as isFunction, Jt as Yield, Kn as isBoolean$1, Kt as StackTraceKey, Ln as combine$1, Mn as currentFiberTypeId, N as isArrayNonEmpty, O as fromIterable$1, Ot as String$6, P as isCanonicalArrayIndex, Pn as equals$1, Pt as mapInput, Q as fail$5, Qn as isNotUndefined, Qt as causeEmpty, Rn as hash, Rt as CauseImpl, Sn as getStackTraceLimit, T as findLast, Tn as NodeInspectSymbol, U as reduce, Un as structure, Ut as InterruptorStackTrace, V as of, Vn as random, Vt as ExitTypeId, W as some$1, Wn as symbol$1, Wt as PipeInspectableProto, Xn as isNotNull, Xt as causeAnnotate, Yn as isIterable, Yt as args, Zn as isNotNullish, Zt as causeDie, _n as makePrimitive$1, _r as memoizeIdempotent, _t as isSome, an as done$1, ar as isString, bn as assignProperty, br as Prototype$1, bt as match$4, c as startsWith, cn as exitFail, cr as isUnknown, d as TaggedError$1, dn as isCause, dr as constUndefined, en as causeFromReasons, er as isNumber, f as taggedEnum, fn as isDieReason, fr as constVoid, ft as fromNullishOr, g as dedupe, gn as isInterruptReason, gr as memoize, gt as isNone, h as contains, hn as isFailReason$1, hr as identity, ht as getOrUndefined$1, in as contE, it as normalize$1, jn as formatPropertyKey, kn as formatJson, kt as isGreaterThan$1, l as trimEnd, ln as exitFailCause, lr as constFalse, mn as isEffect$1, mr as dual, mt as getOrElse, n as make$29, nn as contA, nr as isObjectKeyword, nt as match$3, on as evaluate, or as isTagged, p as append$1, pn as isDone$2, pr as constant, pt as fromUndefinedOr, qn as isError, qt as TaggedError$2, rn as contAll, rt as succeed$6, sn as exitDie, sr as isUndefined, st as exists, tn as constEmptyAnnotations, tr as isObject, tt as isFailure$1, u as Error$2, un as exitSucceed, ur as constTrue, ut as flatMap$3, v as empty$3, vn as makePrimitiveProto, vr as pipe, w as findFirstIndex, wn as BaseProto, x as filter, xn as internalCall, xr as pipeArguments, xt as none, yn as withFiber$1, yr as Class, yt as map$10, z as map$9, zn as number$1, zt as Done$1 } from "./MutableRef-NhSl8G9M.mjs";
|
|
3
3
|
import * as NodeChildProcess from "node:child_process";
|
|
4
4
|
import { PassThrough } from "node:stream";
|
|
5
5
|
import * as NodeCrypto from "node:crypto";
|
|
@@ -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.897";
|
|
24689
24689
|
//#endregion
|
|
24690
24690
|
//#region src/install.ts
|
|
24691
24691
|
const cli = pipe(make("deslop-coding-standards", {}, fnUntraced(function* () {
|
|
@@ -24717,7 +24717,11 @@ const cli = pipe(make("deslop-coding-standards", {}, fnUntraced(function* () {
|
|
|
24717
24717
|
".claude",
|
|
24718
24718
|
".codex"
|
|
24719
24719
|
], filter((directory) => contains(entries, directory)));
|
|
24720
|
-
const targets =
|
|
24720
|
+
const targets = dedupe([
|
|
24721
|
+
...directories,
|
|
24722
|
+
".claude",
|
|
24723
|
+
...contains(directories, ".codex") ? [] : [".agents"]
|
|
24724
|
+
]);
|
|
24721
24725
|
function isGlobal(destination) {
|
|
24722
24726
|
return some$1(globals, (global) => destination === global || pipe(destination, startsWith(`${global}${path.sep}`)));
|
|
24723
24727
|
}
|
|
@@ -24760,7 +24764,7 @@ const cli = pipe(make("deslop-coding-standards", {}, fnUntraced(function* () {
|
|
|
24760
24764
|
}
|
|
24761
24765
|
}
|
|
24762
24766
|
yield* log(`Installed engineering, design and testing in ${pipe(targets, map$9((directory) => path.join(root, directory, "skills")), join(", "))}.`);
|
|
24763
|
-
})), withDescription("Run anywhere inside a Git repository to install engineering, design and testing at its root, including linked worktrees. Copies into skills/ under each existing .agents, .claude and .codex directory
|
|
24767
|
+
})), withDescription("Run anywhere inside a Git repository to install engineering, design and testing at its root, including linked worktrees. Copies into skills/ under each existing .agents, .claude and .codex directory, always under .claude, and under .agents when no .codex exists. Replaces these three names, preserving other skills and global configuration. Destinations resolving outside the Git root are rejected before copying. Read engineering before coding, design before rendered output and testing before test work. Run the latest CLI transiently, independently of package preset versions; no repository dependency is needed. Claude uses .claude/skills; Codex documents .agents/skills for repository discovery. These skills belong in repositories, not global configuration."), withExamples([{
|
|
24764
24768
|
command: "vpx @deslop/coding-standards@latest",
|
|
24765
24769
|
description: "Install or refresh this repository’s three skills without adding a dependency."
|
|
24766
24770
|
}]));
|
package/package.json
CHANGED
package/skills/design/SKILL.md
CHANGED
|
@@ -7,6 +7,8 @@ description: 'UI and UX rules for screens and visual explanations. Use when buil
|
|
|
7
7
|
|
|
8
8
|
**Scope.** Follow repository-specific CODING_STANDARDS.md and engineering.
|
|
9
9
|
|
|
10
|
+
**Two modes.** Consistent mode works inside an existing product: its components, tokens and every rule below. Creative mode covers work with no product to match, such as websites, landing pages, portfolios, launch pages, motion design and videos. It follows [Creative mode](#creative-mode) in place of Decide and Build, whose calm, dense product rules make every page a dashboard; only Access and responsiveness and Verify still apply. When a request mixes both, the product's screens stay consistent.
|
|
11
|
+
|
|
10
12
|
## Decide
|
|
11
13
|
|
|
12
14
|
**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.
|
|
@@ -15,6 +17,8 @@ description: 'UI and UX rules for screens and visual explanations. Use when buil
|
|
|
15
17
|
|
|
16
18
|
**Scan-first.** Put the task, relevant content and next action where they can be identified without reading a paragraph. Use stable visual roles, not another card/badge/icon for every fact. Expose needed detail on demand, never hide a consequential warning or essential action.
|
|
17
19
|
|
|
20
|
+
**Hierarchy.** Blur a capture: the primary content and the next action must still stand out. Give unequal priorities unequal weight, and repeat one layout only for records with equal roles. De-emphasize labels, metadata and chrome before enlarging the important content. Give each decision area one strongest action, with secondary or text variants for the rest. Keep gaps inside a group smaller than gaps between groups, and space above a heading larger than below it. The first phone viewport shows real content and the next action, not an introduction. Left-align prose and records; keep prose at 45 to 75 characters per line. Reserve the accent for actions and selection, status colors for states and chart colors for series.
|
|
21
|
+
|
|
18
22
|
| Content | Preferred treatment |
|
|
19
23
|
| -------------------------- | ------------------------------------------------------------------------- |
|
|
20
24
|
| Comparable records/options | Aligned rows/columns; consistent order, units and metadata placement |
|
|
@@ -77,7 +81,7 @@ These rules apply to product UI. A rendered explanation follows the host's rende
|
|
|
77
81
|
|
|
78
82
|
**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
83
|
|
|
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.
|
|
84
|
+
**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. Show press, pending, success and failure through the existing primitives. Where no primitive sets the easing, use ease-out for entrances, ease-in-out for morphs and linear only for elapsed progress. Start an entrance near its resting size, never from zero. Keep a dismissible surface mounted through its exit, reverse its entry path, and move its panel, backdrop and content together while unrelated chrome stays still. Delay a loader so fast results never flash it, and size it like the final content. List transition properties explicitly; never `transition-all`. Delay the first tooltip, then open neighboring ones at once.
|
|
81
85
|
|
|
82
86
|
| Interaction | Treatment |
|
|
83
87
|
| -------------------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
@@ -100,6 +104,26 @@ Use responsive entry easing and brief existing durations. Simple retargetable st
|
|
|
100
104
|
|
|
101
105
|
Touch and mouse can coexist; do not infer capabilities from user-agent strings or viewport width. No blanket suppression of overscroll, selection or native feedback without a demonstrated need and working replacement. Emulation verifies selected layout cases, not every phone behavior: affected device-specific keyboard/viewport/gesture contracts need target-device proof before completion.
|
|
102
106
|
|
|
107
|
+
## Creative mode
|
|
108
|
+
|
|
109
|
+
Work as the design lead of a studio whose clients reject anything templated, and aim at the level of an award-winning site, not a tidy product page. Every choice of palette, type, layout and motion comes from this brief.
|
|
110
|
+
|
|
111
|
+
**Ground it.** Name the subject, the audience and the page's one job before designing. Take the visual language from the subject's world: its materials, tools, documents, places, times of day and vernacular. The brief's data is raw material for an idea, not content to lay out; write copy that names concrete capabilities and outcomes, never selling filler.
|
|
112
|
+
|
|
113
|
+
**Concept first.** Before any system or code, write three concepts that differ in structure, not in palette. Each is one paragraph: the big idea in one sentence; the metaphor or artifact from the subject's world; the structure it gives the page, such as a clock running from night to morning, a document being read, a journey or one interactive object; the signature moment; the motion; and the visual world of type, color, texture and imagery. Score each from 1 to 5 on three questions: would a viewer remember it tomorrow, could it exist for no other subject, does it make the reader act. Discard any concept whose structure is hero, features, list and form. Build the winner whole, with the full canvas, display typefaces chosen for the subject from Fontshare or Google Fonts, and canvas or SVG where the idea needs them; never retreat toward a safe page while building.
|
|
114
|
+
|
|
115
|
+
**Plan, then challenge the plan.** Then write a compact system for the chosen concept: four to six named colors with roles (canvas, ink, atmosphere, action), one or two clearly distinct typefaces with roles and a type scale, and a layout concept with alignment. Sketch three different compositions as ASCII wireframes, not three palettes, and pick one. Then ask what you would produce for any similar brief; revise every part of the plan that matches it, and say what changed.
|
|
116
|
+
|
|
117
|
+
**Defaults to avoid.** These appear whatever the subject, so they read as generated: a cream canvas with a serif display and a clay accent; near-black with one acid accent; broadsheet hairlines with zero radius; identical rounded cards with soft shadows and gradient washes; all-caps eyebrows above headings, middle-dot meta strings, a monospace face for labels, `→` on every link; one emphasized word in a headline; numbering on content that is no sequence. Also the generated launch-page skeleton: hero, feature table, ranked list, logo row, email form, each section opened by a heading on the left and a grey paragraph on the right; a pale sage or off-white canvas with navy ink. Use one only when the brief asks for it.
|
|
118
|
+
|
|
119
|
+
**Compose.** Build the page around one artifact from the subject's world, shown as it lives there: the message as it arrives, the object as it is used, the document as it is read. Invent the page's structure from the story that artifact tells, not from a section template, and give the product a mark people remember. Open with the most characteristic thing in its best form: a headline, an image, a live demo or an interaction, not a big number with a gradient by default. Own the grid: deliberate spans, overlaps and whitespace, with repeated layouts only for content with equal roles. Alternate dense demonstrations with quiet reading passages. Let typography carry the personality, as an active visual element, with body lines under 75 characters. Spend boldness on one memorable signature, keep everything around it quiet, and remove one more element before you finish.
|
|
120
|
+
|
|
121
|
+
**Imagery and texture.** Make subject-specific assets with one consistent light, material, palette and crop; keep text and controls in code. Take texture from the subject's real materials, never a universal grain or grid overlay. Never present a generated picture or invented testimonial as evidence.
|
|
122
|
+
|
|
123
|
+
**Motion.** Use motion to explain: a cause and its effect, a before and after, a process in order, not content fading in. Choreograph one orchestrated moment, such as the page load or one reveal, instead of fade-up entrances on every section. Before coding a sequence, write its purpose, focal order, movement, easing, duration, overlap and resting moment. Animate interactions from their spatial origin and keep them interruptible. Bind scroll storytelling to scroll progress without hijacking scrolling, and keep the first viewport readable and actionable before any animation runs. Every motion has a complete reduced-motion and static version; stop offscreen animation. For a video, storyboard timed keyframes with reading holds, persistent objects and deterministic frames, and check text at the size it plays.
|
|
124
|
+
|
|
125
|
+
**Critique.** Capture desktop and phone, and slowed motion frames; compare them with the plan and with the defaults above. Batch the repairs and recheck once. The quality floor is silent: responsive to phones, visible keyboard focus, sufficient contrast and reduced motion respected.
|
|
126
|
+
|
|
103
127
|
## Prototype
|
|
104
128
|
|
|
105
129
|
**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.
|
|
@@ -108,9 +132,22 @@ Touch and mouse can coexist; do not infer capabilities from user-agent strings o
|
|
|
108
132
|
|
|
109
133
|
## Verify and show
|
|
110
134
|
|
|
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.
|
|
135
|
+
**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. Inspect motion in slowed intermediate frames for jumps and stretched text.
|
|
136
|
+
|
|
137
|
+
**Generic output.** Check every capture for these tells and fix each one before showing it:
|
|
138
|
+
|
|
139
|
+
| Tell | Check |
|
|
140
|
+
| ----------------------------------------------- | -------------------------------------------------------- |
|
|
141
|
+
| Every section is a bordered card with an icon | Each container has a grouping purpose; remove the others |
|
|
142
|
+
| Everything has equal prominence | The blurred capture still shows the primary content |
|
|
143
|
+
| Uniform gaps | Unrelated groups sit farther apart than related items |
|
|
144
|
+
| Each tile gets its own accent color | Every hue names a state, series or action |
|
|
145
|
+
| An emphasized headline word or decorative label | Removing the treatment loses no meaning, so remove it |
|
|
146
|
+
| Charts, rings or dots without readable data | Each graphic shows values, units or state |
|
|
147
|
+
| Generic copy such as "seamless" or "Learn more" | Each label names its capability or the click's outcome |
|
|
148
|
+
| Content that waits for an entrance animation | The first frame is readable and actionable |
|
|
112
149
|
|
|
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;
|
|
150
|
+
**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; environment decides how long previews run.
|
|
114
151
|
|
|
115
152
|
**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.
|
|
116
153
|
|
package/skills/testing/SKILL.md
CHANGED
|
@@ -12,7 +12,7 @@ description: 'Select and run black-box behavior proof for Effect apps/tools. Use
|
|
|
12
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.
|
|
13
13
|
- **Independent.** Expected values come from the contract/worked example, not implementation recomputation. Use the smallest reachable discriminating fixture.
|
|
14
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.
|
|
15
|
-
- **Throwaway.** Settle a worry with a throwaway test or prototype and delete it once answered.
|
|
15
|
+
- **Throwaway.** Settle a worry with a throwaway test or prototype and delete it once answered, unless it becomes a regression test under Bugs.
|
|
16
16
|
- **Honest.** No wrong expectations or rule workarounds. Change assertions only for recorded behavior changes; preserve every still-relevant value.
|
|
17
17
|
|
|
18
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.
|