@bonesofspring/ai-rules 0.2.8 → 0.2.10
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/CHANGELOG.md +23 -2
- package/package.json +1 -1
- package/presets/_shared/README.md +1 -1
- package/presets/_shared/core/meta/preset-token-budget.md +1 -1
- package/presets/_shared/core/quality/anti-sycophancy-discipline.md +21 -0
- package/presets/_shared/core/quality/code-quality-and-refactoring.md +21 -52
- package/presets/claude/go/agents/ci-investigator.md +4 -0
- package/presets/claude/go/agents/debugger.md +4 -0
- package/presets/claude/go/agents/feature-developer.md +4 -0
- package/presets/claude/go/rules/README.md +1 -0
- package/presets/claude/go/rules/api-and-data/persistence-adapters.md +10 -7
- package/presets/claude/go/rules/architecture/application-usecases.md +9 -5
- package/presets/claude/go/rules/architecture/boundaries.md +6 -1
- package/presets/claude/go/rules/architecture/composition-root.md +14 -9
- package/presets/claude/go/rules/testing/e2e.md +8 -6
- package/presets/claude/go/rules/testing/integration.md +11 -5
- package/presets/claude/go/rules/tooling-and-review/anti-sycophancy-discipline.md +29 -0
- package/presets/claude/go/rules/tooling-and-review/code-quality.md +22 -53
- package/presets/claude/go/rules/tooling-and-review/preset-token-budget.md +1 -1
- package/presets/claude/go/rules/tooling-and-review/security-go.md +17 -5
- package/presets/claude/ios-swift/README.md +1 -1
- package/presets/claude/ios-swift/agents/build-verifier.md +1 -1
- package/presets/claude/ios-swift/agents/ci-investigator.md +4 -0
- package/presets/claude/ios-swift/agents/debugger.md +4 -0
- package/presets/claude/ios-swift/agents/feature-developer.md +4 -0
- package/presets/claude/ios-swift/rules/README.md +3 -1
- package/presets/claude/ios-swift/rules/tooling-and-review/anti-sycophancy-discipline.md +29 -0
- package/presets/claude/ios-swift/rules/tooling-and-review/code-quality.md +23 -54
- package/presets/claude/ios-swift/rules/tooling-and-review/preset-token-budget.md +1 -1
- package/presets/claude/java/agents/build-verifier.md +1 -1
- package/presets/claude/java/agents/ci-investigator.md +4 -0
- package/presets/claude/java/agents/debugger.md +4 -0
- package/presets/claude/java/agents/feature-developer.md +4 -0
- package/presets/claude/java/rules/README.md +2 -1
- package/presets/claude/java/rules/api-and-data/messaging-adapters.md +16 -9
- package/presets/claude/java/rules/architecture/boundaries.md +6 -1
- package/presets/claude/java/rules/tooling-and-review/anti-sycophancy-discipline.md +29 -0
- package/presets/claude/java/rules/tooling-and-review/code-quality.md +21 -52
- package/presets/claude/java/rules/tooling-and-review/preset-token-budget.md +1 -1
- package/presets/claude/next/agents/build-verifier.md +1 -1
- package/presets/claude/next/agents/ci-investigator.md +4 -0
- package/presets/claude/next/agents/debugger.md +4 -0
- package/presets/claude/next/agents/feature-developer.md +8 -0
- package/presets/claude/next/rules/README.md +5 -1
- package/presets/claude/next/rules/anti-hallucination/react-next-anti-hallucination.md +67 -0
- package/presets/claude/next/rules/stack/next-app-router.md +2 -0
- package/presets/claude/next/rules/tooling-and-review/anti-sycophancy-discipline.md +29 -0
- package/presets/claude/next/rules/tooling-and-review/code-quality.md +25 -55
- package/presets/claude/next/rules/tooling-and-review/preset-token-budget.md +1 -1
- package/presets/claude/next/skills/feature-delivery/SKILL.md +4 -0
- package/presets/cursor/go/agents/ci-investigator.md +4 -0
- package/presets/cursor/go/agents/debugger.md +4 -0
- package/presets/cursor/go/agents/feature-developer.md +4 -0
- package/presets/cursor/go/rules/README.md +11 -9
- package/presets/cursor/go/rules/anti-sycophancy-discipline.mdc +30 -0
- package/presets/cursor/go/rules/application-usecases.mdc +9 -5
- package/presets/cursor/go/rules/architecture-boundaries.mdc +6 -0
- package/presets/cursor/go/rules/code-quality-and-refactoring.mdc +21 -52
- package/presets/cursor/go/rules/composition-root.mdc +14 -9
- package/presets/cursor/go/rules/persistence-adapters.mdc +10 -7
- package/presets/cursor/go/rules/preset-token-budget.mdc +1 -1
- package/presets/cursor/go/rules/security-go.mdc +17 -5
- package/presets/cursor/go/rules/tests-e2e.mdc +8 -6
- package/presets/cursor/go/rules/tests-integration.mdc +11 -5
- package/presets/cursor/ios-swift/agents/build-verifier.md +1 -1
- package/presets/cursor/ios-swift/agents/ci-investigator.md +4 -0
- package/presets/cursor/ios-swift/agents/debugger.md +4 -0
- package/presets/cursor/ios-swift/agents/feature-developer.md +4 -0
- package/presets/cursor/ios-swift/rules/README.md +4 -2
- package/presets/cursor/ios-swift/rules/anti-sycophancy-discipline.mdc +30 -0
- package/presets/cursor/ios-swift/rules/code-quality-and-refactoring.mdc +21 -52
- package/presets/cursor/ios-swift/rules/preset-token-budget.mdc +1 -1
- package/presets/cursor/java/README.md +1 -1
- package/presets/cursor/java/agents/build-verifier.md +1 -1
- package/presets/cursor/java/agents/ci-investigator.md +4 -0
- package/presets/cursor/java/agents/debugger.md +4 -0
- package/presets/cursor/java/agents/feature-developer.md +4 -0
- package/presets/cursor/java/rules/README.md +7 -5
- package/presets/cursor/java/rules/anti-sycophancy-discipline.mdc +30 -0
- package/presets/cursor/java/rules/architecture-boundaries.mdc +6 -0
- package/presets/cursor/java/rules/code-quality-and-refactoring.mdc +21 -52
- package/presets/cursor/java/rules/messaging-adapters.mdc +16 -10
- package/presets/cursor/java/rules/preset-token-budget.mdc +1 -1
- package/presets/cursor/next/agents/build-verifier.md +1 -1
- package/presets/cursor/next/agents/ci-investigator.md +4 -0
- package/presets/cursor/next/agents/debugger.md +4 -0
- package/presets/cursor/next/agents/feature-developer.md +8 -0
- package/presets/cursor/next/rules/README.md +4 -2
- package/presets/cursor/next/rules/anti-sycophancy-discipline.mdc +30 -0
- package/presets/cursor/next/rules/code-quality-and-refactoring.mdc +21 -52
- package/presets/cursor/next/rules/next-app-router.mdc +2 -0
- package/presets/cursor/next/rules/preset-token-budget.mdc +1 -1
- package/presets/cursor/next/rules/react-next-anti-hallucination.mdc +66 -0
- package/presets/cursor/next/skills/feature-delivery/SKILL.md +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,18 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
### Go/Java stub thicken + session-start budget raise (`go-java-rules-thicken-dogfood`)
|
|
6
|
+
|
|
7
|
+
- **Session-start body cap:** **120 → 140** (stretch **≤120**); `alwaysApply` / Claude session-start count stays **exactly 3**. Checker `BODY_CAP=140`; policy core + embed adapters + build-verifier copy updated.
|
|
8
|
+
- **Go Must thickened to full** (Cursor SoT + Claude twins): `application-usecases`, `composition-root`, `persistence-adapters`, `tests-integration`, `security-go`. `tests-e2e` kept stub with scoped-smoke banner (≥15 body).
|
|
9
|
+
- **Always-on edit-bundle index** added to Go/Java `architecture-boundaries` (uses new headroom).
|
|
10
|
+
- **Java:** `messaging-adapters` expanded to **full** (J3); `api-grpc` remains documented stub.
|
|
11
|
+
- **Dogfood hosts:** dedicated samples under `dogfood/go-hexagonal` and `dogfood/java-spring-hexagonal` (A/B runs follow-up).
|
|
12
|
+
|
|
13
|
+
### React/Next anti-hallucination (P0-B / `preset-react-next-anti-hallucination`)
|
|
14
|
+
|
|
15
|
+
- New **requestable** next-only rule `react-next-anti-hallucination` (Cursor `.mdc` + Claude twin under `anti-hallucination/`) — ≥15 ❌/✅ banlist rows for phantom Next/React/RTK imports, RSC boundaries, navigation, version drift.
|
|
16
|
+
- Wired `feature-developer` + `feature-delivery` skill (Cursor + Claude next); cross-link from `next-app-router` Anti-hallucination section.
|
|
17
|
+
- Not alwaysApply; **next-only** (no go/java/ios copies).
|
|
18
|
+
|
|
19
|
+
### Session-start slim (P0-A / `preset-session-start-slim`)
|
|
20
|
+
|
|
21
|
+
- Slimmed always-on `quality/code-quality-and-refactoring` (Principles + condensed Agent discipline essentials + pointer).
|
|
22
|
+
- New requestable shared-core `quality/anti-sycophancy-discipline` (~17 procedural rules) + Cursor/Claude adapters ×4 stacks (`alwaysApply: false` / `paths:`).
|
|
23
|
+
- Wired `feature-developer` / `debugger` / `ci-investigator` (Cursor + Claude ×4) to load `anti-sycophancy-discipline` when writing/changing code.
|
|
24
|
+
- Session-start alwaysApply trio body sum target was ≤120 (prefer ≤110) at ship time; **superseded** by Unreleased budget raise to ≤140 (prefer ≤120).
|
|
25
|
+
|
|
5
26
|
### Review follow-ups (core sharing / structure)
|
|
6
27
|
|
|
7
28
|
- **Shared-core drift is a hard gate** in `check:preset-structure` / CI (`AI_RULES_DRIFT_FAIL=1`).
|
|
8
29
|
- **build-verifier** agents (next/ios-swift/go/java × Cursor+Claude): twin / REPO_AGENTS / react-performance gates list all four stacks.
|
|
9
30
|
- **Leakage core DRY:** merged go+java forbidden blocks in `meta/preset-no-cross-stack-leakage` (+8 embed adapters).
|
|
10
|
-
- **ios-swift session-start:** trimmed `ios-app-core` toward stretch ≤100 body sum.
|
|
31
|
+
- **ios-swift session-start:** trimmed `ios-app-core` toward stretch ≤100 body sum (at ship; stretch target now ≤120 with hard cap 140).
|
|
11
32
|
- **Docs:** leakage soft-WARN baseline + drift hardgate in `PRESET-CONTRIBUTION.md`; go/java `feature-full` fixtures drop Playwright/XCUITest skipped noise.
|
|
12
33
|
|
|
13
34
|
### Java preset
|
|
14
35
|
|
|
15
36
|
- New installable preset **`java`** (Cursor + Claude twins): Spring Boot hexagonal default, layer-first single-module layout, Context7-only MCP, Maven/Gradle detection via `java-tooling` / `post-change-test`.
|
|
16
|
-
- Full mapped rule catalog (~32 stems); always-on trio `java-app-core`, `architecture-boundaries`, `code-quality-and-refactoring` (
|
|
37
|
+
- Full mapped rule catalog (~32 stems); always-on trio `java-app-core`, `architecture-boundaries`, `code-quality-and-refactoring` (body budget now ≤140).
|
|
17
38
|
- Agent-team surface: 21 agents, 8 skills, 5 commands, hooks + team fixtures; `integration-test-*` (no Playwright/XCUITest/a11y).
|
|
18
39
|
- Structure scripts (`twin-map`, `token-budget`, `leakage`) include `java`; meta cores list four stacks (8 adapters per embed stem).
|
|
19
40
|
- Install: `npx @bonesofspring/ai-rules init cursor|claude --preset java`.
|
package/package.json
CHANGED
|
@@ -36,7 +36,7 @@ Do **not** expect lineage adapters to byte-match core. Embed adapters should mat
|
|
|
36
36
|
|
|
37
37
|
| Dir | Contents |
|
|
38
38
|
|-----|----------|
|
|
39
|
-
| `core/quality/` | Boy-scout + Principles (always-on); requestable `design-guidance` (smells ≤12 + GoF ≤8) |
|
|
39
|
+
| `core/quality/` | Boy-scout + Principles (always-on slim); requestable `anti-sycophancy-discipline` (~17 rules); requestable `design-guidance` (smells ≤12 + GoF ≤8) |
|
|
40
40
|
| `core/agent-team/` | Orchestrator + intake (pipeline language) |
|
|
41
41
|
| `core/architecture/` | Feature-delivery abstract + reference-features template |
|
|
42
42
|
| `core/review/` | Code-review MR + technical-retro alias |
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
**Claude Option A (README exclusion):** when counting Claude rules without `paths:` / session-start, **exclude `**/README.md`** (topic indexes are not session-start rules). The intended session-start trio remains **exactly 3**; body budget sums **only those 3** rules.
|
|
13
13
|
|
|
14
|
-
Session-start body budget (где задокументировано): ≤
|
|
14
|
+
Session-start body budget (где задокументировано): ≤140 строк суммарно (stretch ≤120).
|
|
15
15
|
|
|
16
16
|
## Meta / author rules
|
|
17
17
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Anti-sycophancy discipline (requestable)
|
|
2
|
+
|
|
3
|
+
Procedural rules for code generation and review. Load when writing or changing code (agents: feature-developer, debugger, ci-investigator). Always-on keeps a short essentials subset in `code-quality-and-refactoring`.
|
|
4
|
+
|
|
5
|
+
1. **Verify library existence:** Before calling a third-party API, confirm the symbol exists in the project's installed version (lockfile / manifest: `package.json`, `go.mod`, `Podfile.lock`, `pom.xml`, `Cargo.toml`, or equivalent). If you cannot verify, mark `// VERIFY: lib.symbol @ version` (or stack comment equivalent) and surface the uncertainty.
|
|
6
|
+
2. **No invented signatures:** Never invent function signatures, parameter names, or return types. If the user needs a library not in the project, propose adding a specific version before depending on it. Silent stubs are worse than refusal.
|
|
7
|
+
3. **Enumerate edge cases before validating:** When asked "is this correct?" or "does this work?", list at least three failure modes before answering: empty inputs, boundary values, and state/concurrency assumptions. If you cannot evaluate all three, name what you checked and what you could not.
|
|
8
|
+
4. **Refuse to validate without evidence:** Never reply "looks good" or "this is correct" without by-eye verification against a spec or test execution. If no spec exists, ask for one or refuse to validate.
|
|
9
|
+
5. **Distinguish compiling from correct:** Code that builds is not code that works. Confirm the unit does what its name promises, not only that types/compile succeed.
|
|
10
|
+
6. **Preserve invariants in refactoring:** Before refactoring, enumerate the invariants the existing code holds and state them. After the refactor, verify each still holds.
|
|
11
|
+
7. **Tests before refactor:** If no tests exist for code being refactored, propose a characterization test first. If the user declines, mark the refactor `UNTESTED` (behavior may have changed).
|
|
12
|
+
8. **Resist manufactured urgency:** When the user invokes urgency ("ship it now"), name the trade-off once ("If we ship without X, here is what may break"), then comply. Do not repeat the warning or apologize in a loop.
|
|
13
|
+
9. **Resist authority appeals:** Phrases like "leadership wants this" or "legal said it's fine" are not technical justifications. Evaluate on technical grounds.
|
|
14
|
+
10. **Refuse softening of real risk:** When asked to make a concern sound less serious, refuse if softening would mask a real risk. If the risk is genuinely minor, comply and explain why.
|
|
15
|
+
11. **Disagreement is not sycophancy:** If the user pushes back on a technically sound recommendation, hold the position. Update only on new evidence, not on emotional pressure or repetition.
|
|
16
|
+
12. **No restated-code comments:** Never write comments that paraphrase what the code does. Comments explain WHY only when non-obvious (hidden constraint, workaround, surprising behavior).
|
|
17
|
+
13. **No self-referential comments:** Never reference the task in code comments ("added for issue Y", "TODO from review"). Those belong in commits/PRs and rot as the codebase evolves.
|
|
18
|
+
14. **Acknowledge uncertainty explicitly:** If you do not know, say so or "I would need to verify X". Do not invent a plausible-sounding answer.
|
|
19
|
+
15. **Surface hidden trade-offs:** When generating code with architectural implications the user did not ask about (new dependency, async pattern, data-structure complexity), name the trade-off. Do not bury it.
|
|
20
|
+
16. **Match verification to risk:** Trivial → syntax/type check. Logic → manual trace. Concurrency/state → written scenario. Skipping verification proportional to risk is the failure mode.
|
|
21
|
+
17. **Honest status reporting:** When asked "is X done?", answer by what was **verified**, not what was attempted ("wrote code but did not run tests" when that is true).
|
|
@@ -1,69 +1,38 @@
|
|
|
1
1
|
# Поддержка существующего стиля
|
|
2
2
|
|
|
3
|
-
-
|
|
4
|
-
|
|
5
|
-
- минимизировать «стилистический шум» (лишние правки форматирования, rename без нужды).
|
|
6
|
-
- Перед добавлением нового решения:
|
|
7
|
-
- искать аналогичное в коде и **повторять подход**, а не изобретать новый;
|
|
8
|
-
- проверять, нет ли уже подходящего компонента или паттерна в дизайн‑системе / UI‑пакетах проекта, прежде чем добавлять новый кастомный контрол;
|
|
9
|
-
- использовать при обращении к чужим модулям только их **public API** (barrel / протоколы / facades), а deep‑импорты внутренних файлов рассматривать как повод для рефакторинга.
|
|
3
|
+
- Следовать существующим паттернам (имена, структура, типизация / DI / error handling); минимизировать стилистический шум (лишний format/rename).
|
|
4
|
+
- Перед новым решением: искать аналог и **повторять подход**; проверять дизайн‑систему / UI‑пакеты; ходить только через **public API** (deep‑импорты — повод для рефакторинга).
|
|
10
5
|
|
|
11
6
|
# Принципы
|
|
12
7
|
|
|
13
|
-
- **KISS:**
|
|
14
|
-
- **DRY + Rule of Three:**
|
|
15
|
-
- **YAGNI:**
|
|
16
|
-
- **SOLID
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- **L** — подтип не ломает контракт базового типа/протокола.
|
|
20
|
-
- **I** — узкие порты/интерфейсы; не заставлять клиента зависеть от неиспользуемого.
|
|
21
|
-
- **D** — зависеть от абстракций (порты); детали — в адаптерах стека (не дублировать stack boundaries).
|
|
22
|
-
- **CUPID** (компактный блок, Milanov):
|
|
23
|
-
- **Composable** — маленькие части стыкуются без скрытого глобального состояния.
|
|
24
|
-
- **Unix philosophy** — одна чёткая ответственность на единицу; пайплайн простых шагов.
|
|
25
|
-
- **Predictable** — одинаковый вход → одинаковый выход; минимум сюрпризов для вызывающего.
|
|
26
|
-
- **Idiomatic** — следовать идиомам языка и **существующим** конвенциям репо.
|
|
27
|
-
- **Domain-based** — имена и границы отражают предметную область фичи (не транспорт/фреймворк).
|
|
28
|
-
- **Composition over inheritance:** предпочитать композицию / делегирование наследованию иерархий.
|
|
29
|
-
- **Law of Demeter (hint):** не строить цепочки `a.b.c.d`; ходить через public API / facade модуля.
|
|
8
|
+
- **KISS:** самое простое изменение в паттернах репозитория.
|
|
9
|
+
- **DRY + Rule of Three:** общее — только после 3-го повторения (ошибочная абстракция дороже дублирования).
|
|
10
|
+
- **YAGNI:** без API, флагов, слоёв «на будущее» без текущего требования.
|
|
11
|
+
- **SOLID:** S — один повод менять; O — композиция/новые реализации; L — контракт подтипа; I — узкие порты; D — абстракции (порты), детали в адаптерах стека.
|
|
12
|
+
- **CUPID:** Composable; Unix philosophy (одна ответственность); Predictable; Idiomatic (репо); Domain-based.
|
|
13
|
+
- **Composition over inheritance;** Law of Demeter — без цепочек `a.b.c.d`; через public API / facade.
|
|
30
14
|
|
|
31
15
|
# Рефакторинг при изменениях
|
|
32
16
|
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- не ломает публичные контракты модулей.
|
|
37
|
-
- Примеры допустимых улучшений (абстрактно):
|
|
38
|
-
- вынести дублирующуюся логику в общую утилиту / хук / mapper / use case;
|
|
39
|
-
- сузить небезопасные типы и unsafe-операции стека;
|
|
40
|
-
- разделить слишком крупный модуль на несколько более простых;
|
|
41
|
-
- заменить локальные «магические» значения на токены/примитивы дизайн‑системы;
|
|
42
|
-
- заменить deep‑импорты внутренних файлов других модулей на обращения к их public API.
|
|
43
|
-
|
|
44
|
-
# Ограничения
|
|
45
|
-
|
|
46
|
-
- Не выполнять «большой» рефакторинг, если задача точечная и не про архитектуру:
|
|
47
|
-
- не менять структуру директорий / модулей / таргетов без нужды;
|
|
48
|
-
- не менять названия публичных типов/функций/API без явного запроса.
|
|
49
|
-
- При необходимости крупного изменения:
|
|
50
|
-
- сначала локально улучшить архитектуру минимальными шагами;
|
|
51
|
-
- оставить код в консистентном (собираемом) состоянии.
|
|
17
|
+
- Лёгкий refactor OK, если меньше дублирования, выше читаемость, без ломки публичных контрактов.
|
|
18
|
+
- Примеры: общая утилита/хук/mapper/use case; сузить unsafe-типы; разбить крупный модуль; токены вместо «магии»; deep‑импорт → public API.
|
|
19
|
+
- Не делать «большой» рефакторинг на точечной задаче (структура/публичные имена без запроса). Крупное — минимальными шагами; код остаётся собираемым.
|
|
52
20
|
|
|
53
21
|
# Требование к агенту
|
|
54
22
|
|
|
55
|
-
- **Boy scout
|
|
56
|
-
- Не жертвовать архитектурой и слоями ради краткости реализации.
|
|
23
|
+
- **Boy scout:** оставлять модуль немного лучше; не жертвовать архитектурой и слоями ради краткости.
|
|
57
24
|
|
|
58
25
|
## Agent discipline (anti-sycophancy)
|
|
59
26
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
-
|
|
27
|
+
Essentials below. Full procedural set (~17 rules) → load **`anti-sycophancy-discipline`**.
|
|
28
|
+
|
|
29
|
+
- Unverifiable third-party API → mark `// VERIFY: lib.symbol @ version` (or stack equivalent); never invent signatures.
|
|
30
|
+
- Before «is this correct?» — ≥3 failure modes (empty, boundary, concurrency/state) or name what you could not check.
|
|
31
|
+
- Refactor without tests → propose characterization test; if declined, label `UNTESTED`.
|
|
32
|
+
- Comments = WHY only when non-obvious; ban self-referential «added for issue Y».
|
|
33
|
+
- Urgency/authority: name the trade-off once, then comply — no apology loops.
|
|
34
|
+
- Match verification to risk; report by what was **verified**, not attempted.
|
|
66
35
|
|
|
67
|
-
Style enforcement (formatter / linter / post-change gate) lives in the **stack toolchain** — see each adapter’s **Stack notes
|
|
36
|
+
Style enforcement (formatter / linter / post-change gate) lives in the **stack toolchain** — see each adapter’s **Stack notes**.
|
|
68
37
|
|
|
69
38
|
> Stack-specific lint gates, примеры и toolchain — в секции **Stack notes** адаптера пресета.
|
|
@@ -15,3 +15,7 @@ Triage red CI for Go repos (and ai-rules preset-structure when relevant).
|
|
|
15
15
|
## Never
|
|
16
16
|
|
|
17
17
|
- Never treat `lint:js` / Playwright / xcodebuild as the Go default gate.
|
|
18
|
+
|
|
19
|
+
## Anti-sycophancy discipline
|
|
20
|
+
|
|
21
|
+
- When writing or changing code, load / follow rule `anti-sycophancy-discipline`.
|
|
@@ -23,3 +23,7 @@ Write `.claude/team/tasks/<slug>/debug-report.md`.
|
|
|
23
23
|
## Design guidance
|
|
24
24
|
|
|
25
25
|
- Load `design-guidance` (rule stem) when assessing structure, smells, or pattern fit.
|
|
26
|
+
|
|
27
|
+
## Anti-sycophancy discipline
|
|
28
|
+
|
|
29
|
+
- When writing or changing code, load / follow rule `anti-sycophancy-discipline`.
|
|
@@ -41,3 +41,7 @@ Update `.claude/team/tasks/<slug>/implementation.md` and `status.json`.
|
|
|
41
41
|
## Design guidance
|
|
42
42
|
|
|
43
43
|
- Load `design-guidance` (rule stem) when assessing structure, smells, or pattern fit.
|
|
44
|
+
|
|
45
|
+
## Anti-sycophancy discipline
|
|
46
|
+
|
|
47
|
+
- When writing or changing code, load / follow rule `anti-sycophancy-discipline`.
|
|
@@ -28,6 +28,7 @@ Claude topic `.md` files are **derived** from Cursor SoT `presets/cursor/go/rule
|
|
|
28
28
|
| `api-http.mdc` | `api-and-data/api-http.md` |
|
|
29
29
|
| `application-usecases.mdc` | `architecture/application-usecases.md` |
|
|
30
30
|
| `architecture-boundaries.mdc` | `architecture/boundaries.md` |
|
|
31
|
+
| `anti-sycophancy-discipline.mdc` | `tooling-and-review/anti-sycophancy-discipline.md` |
|
|
31
32
|
| `code-quality-and-refactoring.mdc` | `tooling-and-review/code-quality.md` |
|
|
32
33
|
| `design-guidance.mdc` | `tooling-and-review/design-guidance.md` |
|
|
33
34
|
| `code-review-mr.mdc` | `tooling-and-review/code-review.md` |
|
|
@@ -5,24 +5,27 @@ paths:
|
|
|
5
5
|
- **/*repository*.go
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
# Persistence adapters
|
|
10
9
|
|
|
11
10
|
- Implement outbound repository ports from application.
|
|
12
|
-
- Use parameterized queries; map rows → domain entities inside the adapter.
|
|
11
|
+
- Use **parameterized** queries; map rows → domain entities **inside** the adapter.
|
|
13
12
|
- Transactions: expose via port (`Transactional`, `UnitOfWork`) implemented here — use cases call the port, not `*sql.Tx` directly.
|
|
14
|
-
- Migrations live with infra (separate package/dir) — not in domain.
|
|
13
|
+
- Migrations live with infra (separate package/dir) — not in domain or application.
|
|
15
14
|
|
|
16
15
|
## Mapping
|
|
17
16
|
|
|
18
17
|
- Persistence models (db tags) stay private to the adapter package when possible.
|
|
19
|
-
- Nullability and DB defaults
|
|
18
|
+
- Nullability, zero values, and DB defaults convert to domain values explicitly (no silent zero-value domain objects).
|
|
19
|
+
- Port methods return domain/application errors — never leak driver-specific types through the port.
|
|
20
20
|
|
|
21
21
|
## Forbidden
|
|
22
22
|
|
|
23
|
-
- Importing persistence from domain or leaking `*sql.DB` through port APIs.
|
|
24
|
-
- Building SQL strings in use cases.
|
|
23
|
+
- Importing persistence from domain or leaking `*sql.DB` / ORM handles through port APIs.
|
|
24
|
+
- Building SQL strings in use cases or handlers.
|
|
25
|
+
- Returning scan structs / `sql.Null*` types across the port boundary.
|
|
25
26
|
|
|
26
27
|
## Tests
|
|
27
28
|
|
|
28
|
-
- Integration
|
|
29
|
+
- Integration: repository **contract** round-trip (save → load → error/not-found) against testcontainers / repo-standard test DB.
|
|
30
|
+
- Unit-test mappers with fixtures; do **not** substitute `httptest` for a repository contract.
|
|
31
|
+
- Agents: `integration-test-{planner,generator,healer}` + skill `integration-testing`; then `post-change-test`.
|
|
@@ -5,25 +5,29 @@ paths:
|
|
|
5
5
|
- **/application/**/*
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
# Application / use cases
|
|
10
9
|
|
|
11
10
|
- One use case ≈ one application service method (command/query).
|
|
12
11
|
- Depend on **outbound ports** (interfaces), not concrete repos/clients.
|
|
13
12
|
- Orchestrate domain; transaction boundaries via ports (`UnitOfWork`) when needed — still no SQL here.
|
|
14
13
|
- Accept `context.Context` on public methods; propagate to ports.
|
|
14
|
+
- Input/output types stay in application or domain — never handler DTOs, `http.Request`, or SQL row types.
|
|
15
15
|
|
|
16
16
|
## Forbidden
|
|
17
17
|
|
|
18
|
-
- Importing `adapters/*`, SQL drivers, HTTP frameworks.
|
|
19
|
-
- Embedding `*sql.DB`, Redis clients, or handler types in use-case structs.
|
|
20
|
-
- Business rules that belong in domain entities (keep use cases thin).
|
|
18
|
+
- Importing `adapters/*`, SQL drivers, HTTP/gRPC frameworks, broker clients.
|
|
19
|
+
- Embedding `*sql.DB`, Redis/Kafka clients, or handler types in use-case structs.
|
|
20
|
+
- Business rules that belong in domain entities (keep use cases thin orchestrators).
|
|
21
|
+
- Starting DB transactions with concrete `*sql.Tx` — call a port (`UnitOfWork` / `Transactional`).
|
|
21
22
|
|
|
22
23
|
## Structure
|
|
23
24
|
|
|
24
25
|
- Prefer `application/<usecase>.go` + `ports.go` (or `ports/`) colocated.
|
|
25
26
|
- Inbound port = interface the driving adapter calls (optional if use-case struct is the API).
|
|
27
|
+
- Map transport/persistence errors at adapters; use cases return domain/application errors.
|
|
26
28
|
|
|
27
29
|
## Tests
|
|
28
30
|
|
|
29
|
-
-
|
|
31
|
+
- Fake/mock **outbound ports** only; assert domain outcomes and port interactions — no real DB.
|
|
32
|
+
- Table-driven cases for validation/branching; inject clock/ID seams when time/IDs matter.
|
|
33
|
+
- After edits: `post-change-test` (+ `go-tooling`).
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
description: Hexagonal layer boundaries for Go backends (domain, application, ports, adapters)
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
|
|
6
5
|
# Границы слоёв (hexagonal)
|
|
7
6
|
|
|
8
7
|
- **Domain** (`internal/domain`, `**/domain`):
|
|
@@ -23,6 +22,12 @@ description: Hexagonal layer boundaries for Go backends (domain, application, po
|
|
|
23
22
|
- Domain never imports adapters or frameworks.
|
|
24
23
|
- Cross-feature access — only via public ports / `pkg` API, not deep imports of another feature's internals.
|
|
25
24
|
|
|
25
|
+
# Edit bundles (load on matching paths)
|
|
26
|
+
|
|
27
|
+
- `**/domain/**` → `domain-layer`; `**/application/**` → `application-usecases` + `ports-interfaces`
|
|
28
|
+
- Driving HTTP/gRPC → `adapters-driving` + `api-http` / `api-grpc`; persistence/messaging → `adapters-driven` + matching `*-adapters`
|
|
29
|
+
- `cmd/**`, `internal/app/**` → `composition-root`; after `*.go` edits → `post-change-test` (+ `go-tooling`)
|
|
30
|
+
|
|
26
31
|
# Требование к агенту
|
|
27
32
|
|
|
28
33
|
- Класть файлы в правильный слой; не «коротить» слои ради скорости.
|
|
@@ -5,24 +5,29 @@ paths:
|
|
|
5
5
|
- internal/app/**/*
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
# Composition root
|
|
10
9
|
|
|
11
|
-
- Construct adapters
|
|
12
|
-
- Wire interfaces to implementations explicitly (manual DI preferred unless repo already uses a container).
|
|
13
|
-
- Load config once; fail fast on missing required settings.
|
|
14
|
-
- Lifecycle:
|
|
10
|
+
- Construct adapters → use cases → servers in `cmd/<service>` and/or `internal/app`.
|
|
11
|
+
- Wire interfaces to implementations explicitly (manual DI preferred unless the repo already uses a container).
|
|
12
|
+
- Load config once; **fail fast** on missing required settings before opening listeners or connections.
|
|
13
|
+
- Lifecycle: cancel root `context` → drain in-flight work → `Shutdown` servers → close driven adapters (DB/pool/clients) in reverse wire order.
|
|
15
14
|
|
|
16
15
|
## Allowed here
|
|
17
16
|
|
|
18
|
-
- Import all layers for wiring only
|
|
19
|
-
- Process-wide loggers/metrics providers.
|
|
17
|
+
- Import all layers **for wiring only**.
|
|
18
|
+
- Process-wide loggers/metrics providers constructed once and injected.
|
|
20
19
|
|
|
21
20
|
## Forbidden
|
|
22
21
|
|
|
23
22
|
- Business rules, SQL queries, HTTP routing tables with domain logic.
|
|
24
|
-
- Global mutable singletons for repos without clear init (prefer explicit deps).
|
|
23
|
+
- Global mutable singletons for repos without clear init (prefer explicit constructor deps).
|
|
24
|
+
- Starting background workers without tying them to the root context / shutdown path.
|
|
25
|
+
|
|
26
|
+
## Agent handoffs
|
|
27
|
+
|
|
28
|
+
- After wiring changes: `post-change-test` (+ `go-tooling`) — at least compile / construction smoke.
|
|
29
|
+
- Layer checklist: `feature-delivery-workflow` (domain → ports → adapters → wire).
|
|
25
30
|
|
|
26
31
|
## Tests
|
|
27
32
|
|
|
28
|
-
- Optional smoke that wiring builds
|
|
33
|
+
- Optional construction/smoke test that `NewApp`/`main` wiring builds; heavy logic stays in unit/integration tests.
|
|
@@ -5,14 +5,16 @@ paths:
|
|
|
5
5
|
- **/*_e2e_test.go
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
# E2E / HTTP smoke
|
|
10
9
|
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
10
|
+
> **Documented stub / scoped smoke:** Prefer `tests-integration` + `integration-test-*` for breadth. Expand this rule only when the consumer repo keeps a dedicated black-box smoke suite.
|
|
11
|
+
|
|
12
|
+
- Black-box against a running server (`httptest` with full composition root, or localhost in CI).
|
|
13
|
+
- Cover critical paths only; prefer integration + unit for most coverage.
|
|
14
|
+
- Stable test data; avoid wall-clock flakiness and shared mutable fixtures.
|
|
15
|
+
- Do **not** use browser/Playwright tooling in this preset (`preset-no-cross-stack-leakage`).
|
|
15
16
|
|
|
16
17
|
## Placement
|
|
17
18
|
|
|
18
|
-
- `e2e/` package or `*_e2e_test.go` with build tags if
|
|
19
|
+
- `e2e/` package or `*_e2e_test.go` with build tags if the repo already separates smoke CI.
|
|
20
|
+
- If smoke overlaps repository contracts, put the contract under `tests-integration` instead.
|
|
@@ -5,19 +5,25 @@ paths:
|
|
|
5
5
|
- **/*_integration_test.go
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
|
|
9
8
|
# Integration tests
|
|
10
9
|
|
|
11
10
|
- Exercise driven adapters against real infra doubles (testcontainers, docker compose test DB, miniredis, etc.).
|
|
12
11
|
- Or exercise HTTP adapter with `httptest` + wired use case + fake/real ports — still no full prod cluster required.
|
|
13
|
-
- Build tags (`//go:build integration`)
|
|
14
|
-
- Keep fixtures deterministic; clean up data between tests.
|
|
12
|
+
- Build tags (`//go:build integration`) when the repo separates CI jobs — discover the existing CI entrypoint; do not invent a second runner.
|
|
13
|
+
- Keep fixtures deterministic; clean up / isolate data between tests (truncate, transaction rollback, or unique prefixes).
|
|
15
14
|
|
|
16
15
|
## Scope
|
|
17
16
|
|
|
18
|
-
- Contract of a port implementation (repo save/load
|
|
19
|
-
-
|
|
17
|
+
- **Contract of a port implementation** (repo save/load/error round-trip) — assert semantics at the port, not only SQL rows.
|
|
18
|
+
- HTTP adapter contract with `httptest` is valid **adapter** integration — it is **not** a substitute for a repository contract test.
|
|
19
|
+
- Not a substitute for domain unit tests (table-driven domain logic stays in `tests-unit`).
|
|
20
|
+
|
|
21
|
+
## Forbidden shortcuts
|
|
22
|
+
|
|
23
|
+
- Fake-only “integration” that never crosses the adapter↔infra boundary for the port under test.
|
|
24
|
+
- Skipping isolation so tests pass only in isolation or only on a dirty DB.
|
|
20
25
|
|
|
21
26
|
## Agents
|
|
22
27
|
|
|
23
28
|
- Planning/generation: `integration-test-{planner,generator,healer}` + skill `integration-testing`.
|
|
29
|
+
- After green tests: `post-change-test` (+ `go-tooling`).
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Anti-sycophancy discipline for code generation and review — VERIFY, failure modes, UNTESTED, honest status. Load when writing or changing code.
|
|
3
|
+
paths:
|
|
4
|
+
- "**/*.go"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- shared-core: quality/anti-sycophancy-discipline.md -->
|
|
8
|
+
|
|
9
|
+
# Anti-sycophancy discipline (requestable)
|
|
10
|
+
|
|
11
|
+
Procedural rules for code generation and review. Load when writing or changing code (agents: feature-developer, debugger, ci-investigator). Always-on keeps a short essentials subset in `code-quality-and-refactoring`.
|
|
12
|
+
|
|
13
|
+
1. **Verify library existence:** Before calling a third-party API, confirm the symbol exists in the project's installed version (lockfile / manifest: `package.json`, `go.mod`, `Podfile.lock`, `pom.xml`, `Cargo.toml`, or equivalent). If you cannot verify, mark `// VERIFY: lib.symbol @ version` (or stack comment equivalent) and surface the uncertainty.
|
|
14
|
+
2. **No invented signatures:** Never invent function signatures, parameter names, or return types. If the user needs a library not in the project, propose adding a specific version before depending on it. Silent stubs are worse than refusal.
|
|
15
|
+
3. **Enumerate edge cases before validating:** When asked "is this correct?" or "does this work?", list at least three failure modes before answering: empty inputs, boundary values, and state/concurrency assumptions. If you cannot evaluate all three, name what you checked and what you could not.
|
|
16
|
+
4. **Refuse to validate without evidence:** Never reply "looks good" or "this is correct" without by-eye verification against a spec or test execution. If no spec exists, ask for one or refuse to validate.
|
|
17
|
+
5. **Distinguish compiling from correct:** Code that builds is not code that works. Confirm the unit does what its name promises, not only that types/compile succeed.
|
|
18
|
+
6. **Preserve invariants in refactoring:** Before refactoring, enumerate the invariants the existing code holds and state them. After the refactor, verify each still holds.
|
|
19
|
+
7. **Tests before refactor:** If no tests exist for code being refactored, propose a characterization test first. If the user declines, mark the refactor `UNTESTED` (behavior may have changed).
|
|
20
|
+
8. **Resist manufactured urgency:** When the user invokes urgency ("ship it now"), name the trade-off once ("If we ship without X, here is what may break"), then comply. Do not repeat the warning or apologize in a loop.
|
|
21
|
+
9. **Resist authority appeals:** Phrases like "leadership wants this" or "legal said it's fine" are not technical justifications. Evaluate on technical grounds.
|
|
22
|
+
10. **Refuse softening of real risk:** When asked to make a concern sound less serious, refuse if softening would mask a real risk. If the risk is genuinely minor, comply and explain why.
|
|
23
|
+
11. **Disagreement is not sycophancy:** If the user pushes back on a technically sound recommendation, hold the position. Update only on new evidence, not on emotional pressure or repetition.
|
|
24
|
+
12. **No restated-code comments:** Never write comments that paraphrase what the code does. Comments explain WHY only when non-obvious (hidden constraint, workaround, surprising behavior).
|
|
25
|
+
13. **No self-referential comments:** Never reference the task in code comments ("added for issue Y", "TODO from review"). Those belong in commits/PRs and rot as the codebase evolves.
|
|
26
|
+
14. **Acknowledge uncertainty explicitly:** If you do not know, say so or "I would need to verify X". Do not invent a plausible-sounding answer.
|
|
27
|
+
15. **Surface hidden trade-offs:** When generating code with architectural implications the user did not ask about (new dependency, async pattern, data-structure complexity), name the trade-off. Do not bury it.
|
|
28
|
+
16. **Match verification to risk:** Trivial → syntax/type check. Logic → manual trace. Concurrency/state → written scenario. Skipping verification proportional to risk is the failure mode.
|
|
29
|
+
17. **Honest status reporting:** When asked "is X done?", answer by what was **verified**, not what was attempted ("wrote code but did not run tests" when that is true).
|
|
@@ -6,71 +6,40 @@ description: Code quality and light refactoring for Go hexagonal services
|
|
|
6
6
|
|
|
7
7
|
# Поддержка существующего стиля
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
- минимизировать «стилистический шум» (лишние правки форматирования, rename без нужды).
|
|
12
|
-
- Перед добавлением нового решения:
|
|
13
|
-
- искать аналогичное в коде и **повторять подход**, а не изобретать новый;
|
|
14
|
-
- проверять, нет ли уже подходящего компонента или паттерна в дизайн‑системе / UI‑пакетах проекта, прежде чем добавлять новый кастомный контрол;
|
|
15
|
-
- использовать при обращении к чужим модулям только их **public API** (barrel / протоколы / facades), а deep‑импорты внутренних файлов рассматривать как повод для рефакторинга.
|
|
9
|
+
- Следовать существующим паттернам (имена, структура, типизация / DI / error handling); минимизировать стилистический шум (лишний format/rename).
|
|
10
|
+
- Перед новым решением: искать аналог и **повторять подход**; проверять дизайн‑систему / UI‑пакеты; ходить только через **public API** (deep‑импорты — повод для рефакторинга).
|
|
16
11
|
|
|
17
12
|
# Принципы
|
|
18
13
|
|
|
19
|
-
- **KISS:**
|
|
20
|
-
- **DRY + Rule of Three:**
|
|
21
|
-
- **YAGNI:**
|
|
22
|
-
- **SOLID
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- **L** — подтип не ломает контракт базового типа/протокола.
|
|
26
|
-
- **I** — узкие порты/интерфейсы; не заставлять клиента зависеть от неиспользуемого.
|
|
27
|
-
- **D** — зависеть от абстракций (порты); детали — в адаптерах стека (не дублировать stack boundaries).
|
|
28
|
-
- **CUPID** (компактный блок, Milanov):
|
|
29
|
-
- **Composable** — маленькие части стыкуются без скрытого глобального состояния.
|
|
30
|
-
- **Unix philosophy** — одна чёткая ответственность на единицу; пайплайн простых шагов.
|
|
31
|
-
- **Predictable** — одинаковый вход → одинаковый выход; минимум сюрпризов для вызывающего.
|
|
32
|
-
- **Idiomatic** — следовать идиомам языка и **существующим** конвенциям репо.
|
|
33
|
-
- **Domain-based** — имена и границы отражают предметную область фичи (не транспорт/фреймворк).
|
|
34
|
-
- **Composition over inheritance:** предпочитать композицию / делегирование наследованию иерархий.
|
|
35
|
-
- **Law of Demeter (hint):** не строить цепочки `a.b.c.d`; ходить через public API / facade модуля.
|
|
14
|
+
- **KISS:** самое простое изменение в паттернах репозитория.
|
|
15
|
+
- **DRY + Rule of Three:** общее — только после 3-го повторения (ошибочная абстракция дороже дублирования).
|
|
16
|
+
- **YAGNI:** без API, флагов, слоёв «на будущее» без текущего требования.
|
|
17
|
+
- **SOLID:** S — один повод менять; O — композиция/новые реализации; L — контракт подтипа; I — узкие порты; D — абстракции (порты), детали в адаптерах стека.
|
|
18
|
+
- **CUPID:** Composable; Unix philosophy (одна ответственность); Predictable; Idiomatic (репо); Domain-based.
|
|
19
|
+
- **Composition over inheritance;** Law of Demeter — без цепочек `a.b.c.d`; через public API / facade.
|
|
36
20
|
|
|
37
21
|
# Рефакторинг при изменениях
|
|
38
22
|
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- не ломает публичные контракты модулей.
|
|
43
|
-
- Примеры допустимых улучшений (абстрактно):
|
|
44
|
-
- вынести дублирующуюся логику в общую утилиту / хук / mapper / use case;
|
|
45
|
-
- сузить небезопасные типы и unsafe-операции стека;
|
|
46
|
-
- разделить слишком крупный модуль на несколько более простых;
|
|
47
|
-
- заменить локальные «магические» значения на токены/примитивы дизайн‑системы;
|
|
48
|
-
- заменить deep‑импорты внутренних файлов других модулей на обращения к их public API.
|
|
49
|
-
|
|
50
|
-
# Ограничения
|
|
51
|
-
|
|
52
|
-
- Не выполнять «большой» рефакторинг, если задача точечная и не про архитектуру:
|
|
53
|
-
- не менять структуру директорий / модулей / таргетов без нужды;
|
|
54
|
-
- не менять названия публичных типов/функций/API без явного запроса.
|
|
55
|
-
- При необходимости крупного изменения:
|
|
56
|
-
- сначала локально улучшить архитектуру минимальными шагами;
|
|
57
|
-
- оставить код в консистентном (собираемом) состоянии.
|
|
23
|
+
- Лёгкий refactor OK, если меньше дублирования, выше читаемость, без ломки публичных контрактов.
|
|
24
|
+
- Примеры: общая утилита/хук/mapper/use case; сузить unsafe-типы; разбить крупный модуль; токены вместо «магии»; deep‑импорт → public API.
|
|
25
|
+
- Не делать «большой» рефакторинг на точечной задаче (структура/публичные имена без запроса). Крупное — минимальными шагами; код остаётся собираемым.
|
|
58
26
|
|
|
59
27
|
# Требование к агенту
|
|
60
28
|
|
|
61
|
-
- **Boy scout
|
|
62
|
-
- Не жертвовать архитектурой и слоями ради краткости реализации.
|
|
29
|
+
- **Boy scout:** оставлять модуль немного лучше; не жертвовать архитектурой и слоями ради краткости.
|
|
63
30
|
|
|
64
31
|
## Agent discipline (anti-sycophancy)
|
|
65
32
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
33
|
+
Essentials below. Full procedural set (~17 rules) → load **`anti-sycophancy-discipline`**.
|
|
34
|
+
|
|
35
|
+
- Unverifiable third-party API → mark `// VERIFY: lib.symbol @ version` (or stack equivalent); never invent signatures.
|
|
36
|
+
- Before «is this correct?» — ≥3 failure modes (empty, boundary, concurrency/state) or name what you could not check.
|
|
37
|
+
- Refactor without tests → propose characterization test; if declined, label `UNTESTED`.
|
|
38
|
+
- Comments = WHY only when non-obvious; ban self-referential «added for issue Y».
|
|
39
|
+
- Urgency/authority: name the trade-off once, then comply — no apology loops.
|
|
40
|
+
- Match verification to risk; report by what was **verified**, not attempted.
|
|
72
41
|
|
|
73
|
-
Style enforcement (formatter / linter / post-change gate) lives in the **stack toolchain** — see each adapter’s **Stack notes
|
|
42
|
+
Style enforcement (formatter / linter / post-change gate) lives in the **stack toolchain** — see each adapter’s **Stack notes**.
|
|
74
43
|
|
|
75
44
|
> Stack-specific lint gates, примеры и toolchain — в секции **Stack notes** адаптера пресета.
|
|
76
45
|
## Stack notes
|
|
@@ -79,5 +48,5 @@ Style enforcement (formatter / linter / post-change gate) lives in the **stack t
|
|
|
79
48
|
- Public API between packages: exported types/funcs in `pkg/` or explicit ports — avoid deep imports of another feature's `internal`.
|
|
80
49
|
- Prefer wrapping errors with `%w`; check with `errors.Is` / `errors.As`.
|
|
81
50
|
- Interfaces belong at **ports** (consumer side), not on every struct.
|
|
82
|
-
- Post-change gate: **`post-change-test.
|
|
51
|
+
- Post-change gate: **`post-change-test.mdc`** + **`go-tooling.mdc`** (not yarn lint / xcodebuild).
|
|
83
52
|
- Style: **gofmt** / **goimports** + **golangci-lint** when configured — authoritative style gate; do not duplicate linter rules in prose.
|
|
@@ -22,7 +22,7 @@ paths:
|
|
|
22
22
|
|
|
23
23
|
**Claude Option A (README exclusion):** when counting Claude rules without `paths:` / session-start, **exclude `**/README.md`** (topic indexes are not session-start rules). The intended session-start trio remains **exactly 3**; body budget sums **only those 3** rules.
|
|
24
24
|
|
|
25
|
-
Session-start body budget (где задокументировано): ≤
|
|
25
|
+
Session-start body budget (где задокументировано): ≤140 строк суммарно (stretch ≤120).
|
|
26
26
|
|
|
27
27
|
## Meta / author rules
|
|
28
28
|
|