kodu 2.2.0 → 3.0.2

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.
Files changed (234) hide show
  1. package/README.md +24 -3
  2. package/bin/kodu.js +40 -0
  3. package/package.json +12 -67
  4. package/scripts/install.js +68 -0
  5. package/scripts/postinstall.js +22 -0
  6. package/AGENTS.md +0 -214
  7. package/__tests__/core/fs/fs.service.test.ts +0 -72
  8. package/__tests__/core/registry/registry.service.test.ts +0 -82
  9. package/__tests__/shared/cleaner/cleaner.service.test.ts +0 -102
  10. package/__tests__/shared/git/git.service.test.ts +0 -84
  11. package/__tests__/shared/runbook/runbook.service.test.ts +0 -104
  12. package/__tests__/shared/tokenizer/tokenizer.service.test.ts +0 -45
  13. package/biome.json +0 -50
  14. package/dist/package.json +0 -96
  15. package/dist/src/app.module.d.ts +0 -2
  16. package/dist/src/app.module.js +0 -42
  17. package/dist/src/app.module.js.map +0 -1
  18. package/dist/src/commands/clean/clean.command.d.ts +0 -37
  19. package/dist/src/commands/clean/clean.command.js +0 -240
  20. package/dist/src/commands/clean/clean.command.js.map +0 -1
  21. package/dist/src/commands/clean/clean.module.d.ts +0 -2
  22. package/dist/src/commands/clean/clean.module.js +0 -26
  23. package/dist/src/commands/clean/clean.module.js.map +0 -1
  24. package/dist/src/commands/init/init.command.d.ts +0 -10
  25. package/dist/src/commands/init/init.command.js +0 -96
  26. package/dist/src/commands/init/init.command.js.map +0 -1
  27. package/dist/src/commands/init/init.module.d.ts +0 -2
  28. package/dist/src/commands/init/init.module.js +0 -22
  29. package/dist/src/commands/init/init.module.js.map +0 -1
  30. package/dist/src/commands/ops/ops-add.command.d.ts +0 -18
  31. package/dist/src/commands/ops/ops-add.command.js +0 -102
  32. package/dist/src/commands/ops/ops-add.command.js.map +0 -1
  33. package/dist/src/commands/ops/ops-init.command.d.ts +0 -22
  34. package/dist/src/commands/ops/ops-init.command.js +0 -130
  35. package/dist/src/commands/ops/ops-init.command.js.map +0 -1
  36. package/dist/src/commands/ops/ops-list.command.d.ts +0 -12
  37. package/dist/src/commands/ops/ops-list.command.js +0 -73
  38. package/dist/src/commands/ops/ops-list.command.js.map +0 -1
  39. package/dist/src/commands/ops/ops-path.command.d.ts +0 -9
  40. package/dist/src/commands/ops/ops-path.command.js +0 -52
  41. package/dist/src/commands/ops/ops-path.command.js.map +0 -1
  42. package/dist/src/commands/ops/ops-runbook.command.d.ts +0 -12
  43. package/dist/src/commands/ops/ops-runbook.command.js +0 -81
  44. package/dist/src/commands/ops/ops-runbook.command.js.map +0 -1
  45. package/dist/src/commands/ops/ops-status.command.d.ts +0 -11
  46. package/dist/src/commands/ops/ops-status.command.js +0 -62
  47. package/dist/src/commands/ops/ops-status.command.js.map +0 -1
  48. package/dist/src/commands/ops/ops-use.command.d.ts +0 -12
  49. package/dist/src/commands/ops/ops-use.command.js +0 -76
  50. package/dist/src/commands/ops/ops-use.command.js.map +0 -1
  51. package/dist/src/commands/ops/ops.command.d.ts +0 -7
  52. package/dist/src/commands/ops/ops.command.js +0 -56
  53. package/dist/src/commands/ops/ops.command.js.map +0 -1
  54. package/dist/src/commands/ops/ops.helpers.d.ts +0 -2
  55. package/dist/src/commands/ops/ops.helpers.js +0 -11
  56. package/dist/src/commands/ops/ops.helpers.js.map +0 -1
  57. package/dist/src/commands/ops/ops.module.d.ts +0 -2
  58. package/dist/src/commands/ops/ops.module.js +0 -36
  59. package/dist/src/commands/ops/ops.module.js.map +0 -1
  60. package/dist/src/commands/pack/pack.command.d.ts +0 -51
  61. package/dist/src/commands/pack/pack.command.js +0 -355
  62. package/dist/src/commands/pack/pack.command.js.map +0 -1
  63. package/dist/src/commands/pack/pack.module.d.ts +0 -2
  64. package/dist/src/commands/pack/pack.module.js +0 -27
  65. package/dist/src/commands/pack/pack.module.js.map +0 -1
  66. package/dist/src/core/config/config.module.d.ts +0 -2
  67. package/dist/src/core/config/config.module.js +0 -23
  68. package/dist/src/core/config/config.module.js.map +0 -1
  69. package/dist/src/core/config/config.schema.d.ts +0 -19
  70. package/dist/src/core/config/config.schema.js +0 -56
  71. package/dist/src/core/config/config.schema.js.map +0 -1
  72. package/dist/src/core/config/config.service.d.ts +0 -7
  73. package/dist/src/core/config/config.service.js +0 -49
  74. package/dist/src/core/config/config.service.js.map +0 -1
  75. package/dist/src/core/config/prompt.service.d.ts +0 -10
  76. package/dist/src/core/config/prompt.service.js +0 -80
  77. package/dist/src/core/config/prompt.service.js.map +0 -1
  78. package/dist/src/core/file-system/fs.module.d.ts +0 -2
  79. package/dist/src/core/file-system/fs.module.js +0 -21
  80. package/dist/src/core/file-system/fs.module.js.map +0 -1
  81. package/dist/src/core/file-system/fs.service.d.ts +0 -27
  82. package/dist/src/core/file-system/fs.service.js +0 -203
  83. package/dist/src/core/file-system/fs.service.js.map +0 -1
  84. package/dist/src/core/registry/registry.module.d.ts +0 -2
  85. package/dist/src/core/registry/registry.module.js +0 -22
  86. package/dist/src/core/registry/registry.module.js.map +0 -1
  87. package/dist/src/core/registry/registry.schema.d.ts +0 -24
  88. package/dist/src/core/registry/registry.schema.js +0 -21
  89. package/dist/src/core/registry/registry.schema.js.map +0 -1
  90. package/dist/src/core/registry/registry.service.d.ts +0 -16
  91. package/dist/src/core/registry/registry.service.js +0 -91
  92. package/dist/src/core/registry/registry.service.js.map +0 -1
  93. package/dist/src/core/ui/ui.module.d.ts +0 -2
  94. package/dist/src/core/ui/ui.module.js +0 -22
  95. package/dist/src/core/ui/ui.module.js.map +0 -1
  96. package/dist/src/core/ui/ui.service.d.ts +0 -22
  97. package/dist/src/core/ui/ui.service.js +0 -43
  98. package/dist/src/core/ui/ui.service.js.map +0 -1
  99. package/dist/src/main.d.ts +0 -2
  100. package/dist/src/main.js +0 -16
  101. package/dist/src/main.js.map +0 -1
  102. package/dist/src/shared/cleaner/cleaner.service.d.ts +0 -23
  103. package/dist/src/shared/cleaner/cleaner.service.js +0 -223
  104. package/dist/src/shared/cleaner/cleaner.service.js.map +0 -1
  105. package/dist/src/shared/cleaner/cleaner.types.d.ts +0 -21
  106. package/dist/src/shared/cleaner/cleaner.types.js +0 -3
  107. package/dist/src/shared/cleaner/cleaner.types.js.map +0 -1
  108. package/dist/src/shared/constants.d.ts +0 -4
  109. package/dist/src/shared/constants.js +0 -113
  110. package/dist/src/shared/constants.js.map +0 -1
  111. package/dist/src/shared/deps/deps.module.d.ts +0 -2
  112. package/dist/src/shared/deps/deps.module.js +0 -21
  113. package/dist/src/shared/deps/deps.module.js.map +0 -1
  114. package/dist/src/shared/deps/deps.service.d.ts +0 -15
  115. package/dist/src/shared/deps/deps.service.js +0 -114
  116. package/dist/src/shared/deps/deps.service.js.map +0 -1
  117. package/dist/src/shared/git/git.module.d.ts +0 -2
  118. package/dist/src/shared/git/git.module.js +0 -21
  119. package/dist/src/shared/git/git.module.js.map +0 -1
  120. package/dist/src/shared/git/git.service.d.ts +0 -5
  121. package/dist/src/shared/git/git.service.js +0 -56
  122. package/dist/src/shared/git/git.service.js.map +0 -1
  123. package/dist/src/shared/runbook/runbook.module.d.ts +0 -2
  124. package/dist/src/shared/runbook/runbook.module.js +0 -22
  125. package/dist/src/shared/runbook/runbook.module.js.map +0 -1
  126. package/dist/src/shared/runbook/runbook.service.d.ts +0 -20
  127. package/dist/src/shared/runbook/runbook.service.js +0 -118
  128. package/dist/src/shared/runbook/runbook.service.js.map +0 -1
  129. package/dist/src/shared/runbook/runbook.templates.d.ts +0 -6
  130. package/dist/src/shared/runbook/runbook.templates.js +0 -49
  131. package/dist/src/shared/runbook/runbook.templates.js.map +0 -1
  132. package/dist/src/shared/tokenizer/tokenizer.module.d.ts +0 -2
  133. package/dist/src/shared/tokenizer/tokenizer.module.js +0 -21
  134. package/dist/src/shared/tokenizer/tokenizer.module.js.map +0 -1
  135. package/dist/src/shared/tokenizer/tokenizer.service.d.ts +0 -10
  136. package/dist/src/shared/tokenizer/tokenizer.service.js +0 -36
  137. package/dist/src/shared/tokenizer/tokenizer.service.js.map +0 -1
  138. package/dist/tsconfig.build.tsbuildinfo +0 -1
  139. package/docs/todo.md +0 -7
  140. package/knip.json +0 -10
  141. package/kodu.json +0 -63
  142. package/kodu.schema.json +0 -100
  143. package/lefthook.yml +0 -11
  144. package/nest-cli.json +0 -8
  145. package/registry.schema.json +0 -39
  146. package/scripts/generate-json-schema.ts +0 -27
  147. package/skills/ac/SKILL.md +0 -239
  148. package/skills/al/SKILL.md +0 -98
  149. package/skills/audit/SKILL.md +0 -205
  150. package/skills/audit/audit-baseline-template.yml +0 -188
  151. package/skills/audit/runtime-detect.md +0 -64
  152. package/skills/audit/stacks/_generic.md +0 -41
  153. package/skills/audit/stacks/_registry.md +0 -47
  154. package/skills/audit/stacks/go.md +0 -66
  155. package/skills/audit/stacks/java.md +0 -44
  156. package/skills/audit/stacks/node.md +0 -57
  157. package/skills/audit/stacks/python.md +0 -45
  158. package/skills/audit/stacks/rust.md +0 -44
  159. package/skills/audit-api-contracts/SKILL.md +0 -201
  160. package/skills/audit-architecture/SKILL.md +0 -200
  161. package/skills/audit-bugs/SKILL.md +0 -226
  162. package/skills/audit-concurrency/SKILL.md +0 -197
  163. package/skills/audit-deployment/SKILL.md +0 -218
  164. package/skills/audit-docs/SKILL.md +0 -209
  165. package/skills/audit-errors/SKILL.md +0 -216
  166. package/skills/audit-logging/SKILL.md +0 -197
  167. package/skills/audit-matrix/SKILL.md +0 -245
  168. package/skills/audit-meta/SKILL.md +0 -120
  169. package/skills/audit-naming/SKILL.md +0 -200
  170. package/skills/audit-owasp/SKILL.md +0 -223
  171. package/skills/audit-performance/SKILL.md +0 -199
  172. package/skills/audit-reinvention/SKILL.md +0 -214
  173. package/skills/audit-secrets/SKILL.md +0 -198
  174. package/skills/audit-tests/SKILL.md +0 -210
  175. package/skills/audit-validation/SKILL.md +0 -206
  176. package/skills/audit-verify/SKILL.md +0 -139
  177. package/skills/audit-yagni/SKILL.md +0 -188
  178. package/skills/doc-gen/SKILL.md +0 -490
  179. package/skills/doc-gen/scripts/doc_gen.py +0 -911
  180. package/skills/generate-project-docs/SKILL.md +0 -380
  181. package/skills/implement-project/SKILL.md +0 -409
  182. package/skills/liteend-init/SKILL.md +0 -84
  183. package/skills/litefront-init/SKILL.md +0 -96
  184. package/skills/litefront-prototype/SKILL.md +0 -484
  185. package/skills/ops/SKILL.md +0 -94
  186. package/skills/post-call-task-builder/SKILL.md +0 -419
  187. package/skills/project-setup-standardizer/SKILL.md +0 -285
  188. package/skills/skills-best-practices/SKILL.md +0 -415
  189. package/skills/start/SKILL.md +0 -319
  190. package/skills/tech-blueprint/SKILL.md +0 -890
  191. package/skills/tech-blueprint/scripts/blueprint_validator.py +0 -417
  192. package/src/app.module.ts +0 -29
  193. package/src/commands/clean/clean.command.ts +0 -235
  194. package/src/commands/clean/clean.module.ts +0 -13
  195. package/src/commands/init/init.command.ts +0 -92
  196. package/src/commands/init/init.module.ts +0 -9
  197. package/src/commands/ops/ops-add.command.ts +0 -83
  198. package/src/commands/ops/ops-init.command.ts +0 -125
  199. package/src/commands/ops/ops-list.command.ts +0 -57
  200. package/src/commands/ops/ops-path.command.ts +0 -38
  201. package/src/commands/ops/ops-runbook.command.ts +0 -74
  202. package/src/commands/ops/ops-status.command.ts +0 -47
  203. package/src/commands/ops/ops-use.command.ts +0 -76
  204. package/src/commands/ops/ops.command.ts +0 -42
  205. package/src/commands/ops/ops.helpers.ts +0 -20
  206. package/src/commands/ops/ops.module.ts +0 -23
  207. package/src/commands/pack/pack.command.ts +0 -347
  208. package/src/commands/pack/pack.module.ts +0 -14
  209. package/src/core/config/config.module.ts +0 -10
  210. package/src/core/config/config.schema.ts +0 -58
  211. package/src/core/config/config.service.ts +0 -43
  212. package/src/core/config/prompt.service.ts +0 -80
  213. package/src/core/file-system/fs.module.ts +0 -8
  214. package/src/core/file-system/fs.service.ts +0 -248
  215. package/src/core/registry/registry.module.ts +0 -9
  216. package/src/core/registry/registry.schema.ts +0 -46
  217. package/src/core/registry/registry.service.ts +0 -128
  218. package/src/core/ui/ui.module.ts +0 -9
  219. package/src/core/ui/ui.service.ts +0 -39
  220. package/src/main.ts +0 -12
  221. package/src/shared/cleaner/cleaner.service.ts +0 -289
  222. package/src/shared/cleaner/cleaner.types.ts +0 -23
  223. package/src/shared/constants.ts +0 -118
  224. package/src/shared/deps/deps.module.ts +0 -8
  225. package/src/shared/deps/deps.service.ts +0 -175
  226. package/src/shared/git/git.module.ts +0 -8
  227. package/src/shared/git/git.service.ts +0 -47
  228. package/src/shared/runbook/runbook.module.ts +0 -9
  229. package/src/shared/runbook/runbook.service.ts +0 -164
  230. package/src/shared/runbook/runbook.templates.ts +0 -66
  231. package/src/shared/tokenizer/tokenizer.module.ts +0 -8
  232. package/src/shared/tokenizer/tokenizer.service.ts +0 -30
  233. package/tsconfig.build.json +0 -7
  234. package/tsconfig.json +0 -28
@@ -1,285 +0,0 @@
1
- ---
2
- name: project-setup-standardizer
3
- description: Enforces a unified, production-ready project setup (scripts, linting, testing, biome, lefthook) across any JS/TS project (backend, frontend, CLI, etc.). This skill MUST be invoked when initializing a new project.
4
- ---
5
-
6
- **This skill is MANDATORY and must be invoked when creating a new project.**
7
-
8
- You are responsible for transforming an existing JavaScript/TypeScript project into a **production-ready, standardized
9
- structure**.
10
-
11
- Your goal is NOT to suggest — you MUST **apply and enforce** the conventions below.
12
-
13
- ---
14
-
15
- ## 1. PROJECT TYPE DETECTION
16
-
17
- Before making any changes, detect the project type using these signals:
18
-
19
- | Signal | Type |
20
- |------------------------------------------------------------------|----------|
21
- | `dependencies` contains `react` or `vue` | frontend |
22
- | `devDependencies` contains `vite` (without react/vue) | frontend |
23
- | `dependencies` contains `@nestjs/core` or `express` or `fastify` | backend |
24
- | `bin` field exists in package.json | CLI |
25
- | None of the above | library |
26
-
27
- Frontend projects get additional tools (stylelint, steiger). All other types share the base setup.
28
-
29
- ---
30
-
31
- ## 2. MIGRATION: REMOVE CONFLICTING TOOLS FIRST
32
-
33
- Before installing Biome, you MUST remove ESLint and Prettier if present:
34
-
35
- 1. Delete config files: `.eslintrc*`, `.eslintignore`, `.prettierrc*`, `.prettierignore`
36
- 2. Remove from `package.json` dependencies/devDependencies: `eslint`, `prettier`, and all `eslint-*` / `prettier-*`
37
- packages
38
- 3. Only after removal, proceed with Biome setup
39
-
40
- ---
41
-
42
- ## 3. PACKAGE.JSON SCRIPTS (MANDATORY STRUCTURE)
43
-
44
- You MUST normalize `package.json/scripts` into clearly separated sections using visual separators.
45
-
46
- Use this exact pattern:
47
-
48
- ```json
49
- "scripts": {
50
- "________________ BUILD AND RUN ________________": "",
51
- "build": "...",
52
- "start:dev": "...",
53
- "start:prod": "...",
54
- "________________ FORMAT AND LINT ________________": "",
55
- "lint": "biome check",
56
- "lint:fix": "biome check --write",
57
- "lint:fix:unsafe": "biome check --write --unsafe",
58
- "ts:check": "tsc --noEmit",
59
- "knip": "knip --production",
60
- "check": "run-p ts:check lint:fix knip",
61
- "________________ TEST ________________": "",
62
- "test": "vitest run",
63
- "test:watch": "vitest",
64
- "test:cov": "vitest run --coverage",
65
-
66
- "________________ OTHER ________________": "",
67
- "prepare": "is-ci || lefthook install",
68
- "update": "npx npm-check-updates -u && rimraf node_modules package-lock.json && npm i",
69
- "postupdate": "npm run lint:fix && npm run check"
70
- }
71
- ```
72
-
73
- If the project has distinct unit and e2e test layers, add:
74
-
75
- ```json
76
- "test:unit": "...",
77
- "test:e2e": "...",
78
- "test:all": "run-s test:unit test:e2e"
79
- ```
80
-
81
- Otherwise omit `test:all` — do not duplicate `test` under a different name.
82
-
83
- ### Rules:
84
-
85
- - ALWAYS include `check` script → central quality gate
86
- - ALWAYS include `ts:check`; if no `tsconfig.json` exists, create a minimal one (see section 7)
87
- - ALWAYS include `knip` for unused exports/deps detection
88
- - ALWAYS include `lint:fix` in `check`
89
- - Use `run-p` (from `npm-run-all`) for parallel execution — never `npx run-p`
90
- - `prepare` MUST use `is-ci || lefthook install` to avoid CI failures when lefthook is not yet installed
91
-
92
- ---
93
-
94
- ## 4. FRONTEND-SPECIFIC REQUIREMENTS
95
-
96
- If project type is **frontend**, additionally include:
97
-
98
- ```json
99
- "lint:fsd": "steiger ./src",
100
- "lint:style": "stylelint '**/*.{css,scss}'",
101
- "lint:style:fix": "npm run lint:style -- --fix",
102
- "check": "run-p lint:style ts:check lint:fix knip lint:fsd"
103
- ```
104
-
105
- ### Mandatory:
106
-
107
- - FSD validation via `steiger`
108
- - stylelint integration
109
- - include ALL checks in `check`
110
-
111
- ---
112
-
113
- ## 5. TESTING STANDARD (MANDATORY)
114
-
115
- Use **vitest only**.
116
-
117
- Rules:
118
-
119
- - NO jest
120
- - NO mixed frameworks
121
- - coverage MUST be supported via `test:cov`
122
-
123
- ---
124
-
125
- ## 6. BIOME CONFIG (MANDATORY)
126
-
127
- You MUST ensure `biome.json` exists with this content:
128
-
129
- ```json
130
- {
131
- "$schema": "./node_modules/@biomejs/biome/configuration_schema.json",
132
- "formatter": {
133
- "enabled": true,
134
- "indentStyle": "space",
135
- "lineEnding": "lf"
136
- },
137
- "javascript": {
138
- "formatter": {
139
- "quoteStyle": "single"
140
- }
141
- },
142
- "linter": {
143
- "enabled": true,
144
- "rules": {
145
- "recommended": true,
146
- "correctness": {
147
- "noUnusedImports": "error",
148
- "noUnusedVariables": "error",
149
- "noUnusedFunctionParameters": "error"
150
- }
151
- }
152
- },
153
- "files": {
154
- "includes": [
155
- "**",
156
- "!node_modules",
157
- "!dist"
158
- ]
159
- },
160
- "vcs": {
161
- "enabled": true,
162
- "clientKind": "git",
163
- "useIgnoreFile": true
164
- }
165
- }
166
- ```
167
-
168
- ---
169
-
170
- ## 7. LEFTHOOK (MANDATORY)
171
-
172
- You MUST write `lefthook.yml` with this exact content:
173
-
174
- ```yaml
175
- pre-commit:
176
- parallel: false
177
- commands:
178
- check:
179
- run: npm run check
180
-
181
- pre-push:
182
- parallel: false
183
- commands:
184
- test-all:
185
- run: npm run test:all
186
- ```
187
-
188
- Rules:
189
-
190
- - `check` (lint + types + knip) gates every commit
191
- - tests gate every push — `pre-push` does NOT re-run `check` (already gated at commit)
192
- - no bypassing allowed
193
-
194
- ---
195
-
196
- ## 8. MINIMAL TSCONFIG (if missing)
197
-
198
- If `tsconfig.json` does not exist, create it:
199
-
200
- ```json
201
- {
202
- "compilerOptions": {
203
- "target": "ES2022",
204
- "module": "NodeNext",
205
- "moduleResolution": "NodeNext",
206
- "strict": true,
207
- "noEmit": true,
208
- "skipLibCheck": true
209
- },
210
- "include": [
211
- "src",
212
- "*.ts"
213
- ]
214
- }
215
- ```
216
-
217
- ---
218
-
219
- ## 9. REQUIRED DEV DEPENDENCIES
220
-
221
- Ensure these are installed (add any that are missing):
222
-
223
- Core (all project types):
224
-
225
- - `@biomejs/biome`
226
- - `typescript`
227
- - `vitest`
228
- - `lefthook`
229
- - `is-ci`
230
- - `npm-run-all`
231
- - `knip`
232
- - `rimraf`
233
- - `npm-check-updates`
234
-
235
- Frontend only:
236
-
237
- - `stylelint`
238
- - `steiger`
239
-
240
- ---
241
-
242
- ## 10. ENFORCEMENT LOGIC
243
-
244
- You MUST follow this order:
245
-
246
- 1. Detect project type (section 1)
247
- 2. Remove conflicting tools (section 2)
248
- 3. Rewrite `package.json` scripts (section 3, or 4 for frontend)
249
- 4. Write/update `biome.json` (section 6)
250
- 5. Write/update `lefthook.yml` (section 7)
251
- 6. Create `tsconfig.json` if missing (section 8)
252
- 7. Install missing dev dependencies (section 9)
253
-
254
- NEVER:
255
-
256
- - keep inconsistent scripts
257
- - mix tools (eslint + biome)
258
- - leave partial setup
259
-
260
- ---
261
-
262
- ## 11. OUTPUT FORMAT
263
-
264
- You must output:
265
-
266
- 1. Updated `package.json` (only the `scripts` and `devDependencies` sections)
267
- 2. `biome.json`
268
- 3. `lefthook.yml`
269
- 4. `tsconfig.json` (if created)
270
- 5. List of removed files and packages
271
-
272
- All configs must be **complete and copy-paste ready**.
273
-
274
- ---
275
-
276
- ## 12. PRINCIPLE
277
-
278
- Your job is to enforce:
279
-
280
- - determinism
281
- - reproducibility
282
- - zero-config onboarding
283
- - strict quality gates
284
-
285
- If something is ambiguous — choose the stricter option.