@critiq/rules 0.0.2 → 0.1.0
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 +52 -4
- package/catalog.yaml +985 -19
- package/package.json +6 -1
- package/rules/go/go.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/go/go.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/go/go.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +46 -0
- package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +45 -0
- package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +47 -0
- package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +45 -0
- package/rules/go/go.security.sensitive-data-egress.rule.yaml +46 -0
- package/rules/go/go.security.tar-path-traversal.rule.yaml +45 -0
- package/rules/go/go.security.template-unescaped-request-value.rule.yaml +45 -0
- package/rules/go/go.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/go/go.testing.t-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/go/go.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/java/java.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/java/java.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/java/java.security.android-screenshot-exposure.rule.yaml +35 -0
- package/rules/java/java.security.android-world-readable-mode.rule.yaml +35 -0
- package/rules/java/java.security.jpa-concatenated-query.rule.yaml +47 -0
- package/rules/java/java.security.reflected-output-from-request.rule.yaml +35 -0
- package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +35 -0
- package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +40 -0
- package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +40 -0
- package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +49 -0
- package/rules/java/java.security.spring-debug-exposure.rule.yaml +35 -0
- package/rules/java/java.security.spring-permit-all-default.rule.yaml +47 -0
- package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +47 -0
- package/rules/java/java.security.template-unescaped-user-output.rule.yaml +49 -0
- package/rules/java/java.testing.disabled-without-ticket-reference.rule.yaml +33 -0
- package/rules/java/java.testing.http-client-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/php/php.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/php/php.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +41 -0
- package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +41 -0
- package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +42 -0
- package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +45 -0
- package/rules/php/php.security.sensitive-data-egress.rule.yaml +42 -0
- package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +42 -0
- package/rules/php/php.security.symfony-debug-exposure.rule.yaml +44 -0
- package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +41 -0
- package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +42 -0
- package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +42 -0
- package/rules/php/php.testing.curl-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.testing.mark-test-skipped-without-ticket-reference.rule.yaml +33 -0
- package/rules/php/php.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/python/py.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/python/py.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +46 -0
- package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +47 -0
- package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +47 -0
- package/rules/python/py.security.drf-allow-any-default.rule.yaml +46 -0
- package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +46 -0
- package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +43 -0
- package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +44 -0
- package/rules/python/py.testing.pytest-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/python/py.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +44 -0
- package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +46 -0
- package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +46 -0
- package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +45 -0
- package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +45 -0
- package/rules/ruby/ruby.testing.focused-example.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.pending-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +47 -0
- package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +45 -0
- package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +47 -0
- package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +45 -0
- package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +47 -0
- package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +47 -0
- package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +47 -0
- package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +45 -0
- package/rules/rust/rust.testing.ignore-without-ticket-reference.rule.yaml +33 -0
- package/rules/rust/rust.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/shared/security.archive-path-traversal.rule.yaml +41 -0
- package/rules/shared/security.external-file-upload.rule.yaml +40 -0
- package/rules/shared/security.permissive-file-permissions.rule.yaml +40 -0
- package/rules/shared/security.sensitive-data-egress.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.assignment-in-condition.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.assignment-to-import-binding.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.async-promise-executor.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-function-parameter.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-import-source.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-object-key.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-switch-case.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.empty-block-statement.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.identical-comparison-operands.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.reassign-catch-binding.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.regexp-pattern-unusual-control-character.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.self-assignment.rule.yaml +36 -0
- package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +35 -0
- package/rules/typescript/ts.performance.no-array-spread-in-hot-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-cache-miss-from-unstable-key.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-expensive-sort-in-render-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-json-parse-stringify-clone.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-large-object-spread-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-n-plus-one-await-in-map.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-redundant-network-fetch.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-regex-construction-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-sync-fs-in-request-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-unbounded-concurrency.rule.yaml +32 -0
- package/rules/typescript/ts.quality.no-ambiguous-abbreviations.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-barrel-file-cycle.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-boolean-parameter-trap.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-dead-export.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-hidden-side-effect-import.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-inconsistent-error-shape.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-mixed-abstraction-level.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-primitive-obsession-in-domain-model.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-temporal-coupling.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-wide-public-surface.rule.yaml +27 -0
- package/rules/typescript/ts.react.no-accessibility-label-missing.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-activedescendant-on-non-focusable-host.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-click-without-keyboard-handler.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-deprecated-create-factory.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-deprecated-react-dom-root-api.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-derived-state-from-props.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-effect-fetch-without-cancellation.rule.yaml +35 -0
- package/rules/typescript/ts.react.no-find-dom-node.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-img-missing-alt-text.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-index-as-key-in-dynamic-list.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-interactive-role-on-static-semantics.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-invalid-anchor-href.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-keyboard-interaction-without-widget-role.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-legacy-lifecycle.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-missing-error-boundary.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-positive-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-static-element-with-synthetic-handlers.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-string-ref.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-uncontrolled-to-controlled-input.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-widget-role-without-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +34 -0
- package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +35 -0
- package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +39 -0
- package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +36 -0
- package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +34 -0
- package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +35 -0
- package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +34 -0
- package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +38 -0
- package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +36 -0
- package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +36 -0
- package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +35 -0
- package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +35 -0
- package/rules/typescript/ts.security.log-injection.rule.yaml +36 -0
- package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +34 -0
- package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +36 -0
- package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +38 -0
- package/rules/typescript/ts.security.open-redirect.rule.yaml +2 -0
- package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +33 -0
- package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +1 -0
- package/rules/typescript/ts.security.ssrf.rule.yaml +1 -0
- package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +35 -0
- package/rules/typescript/ts.testing.no-flaky-timer-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-focused-test.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-missing-edge-case-tests.rule.yaml +35 -0
- package/rules/typescript/ts.testing.no-network-call-in-unit-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-skipped-test-without-ticket.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-snapshot-without-intent.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-test-only-code-in-production.rule.yaml +38 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: py.testing.real-network-in-unit-test
|
|
5
|
+
title: Avoid live HTTP clients in Python unit tests
|
|
6
|
+
summary: requests/httpx/urllib calls in unit tests should be doubled or recorded.
|
|
7
|
+
rationale: Live HTTP couples CI to the network and slows feedback.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- python
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- python
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: py.testing.real-network-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- python
|
|
29
|
+
message:
|
|
30
|
+
title: Mock outbound HTTP in `${captures.issue.text}`
|
|
31
|
+
summary: "`${captures.issue.text}` performs a live HTTP style call inside a test module."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Use responses/httpretty/pytest-httpserver or dependency-injected clients with fakes.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: py.testing.time-sleep-in-unit-test
|
|
5
|
+
title: Avoid time.sleep in Python unit tests
|
|
6
|
+
summary: Sleeping in tests slows suites and hides synchronization bugs.
|
|
7
|
+
rationale: Prefer deterministic waits, polling helpers, or clock fakes.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- python
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- python
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: py.testing.time-sleep-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: low
|
|
25
|
+
confidence: 0.6
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- python
|
|
29
|
+
message:
|
|
30
|
+
title: Replace `time.sleep` in unit tests
|
|
31
|
+
summary: "`${captures.issue.text}` blocks on real wall-clock time inside a test module."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Inject a clock, shorten waits, or move timing-sensitive coverage to integration tests.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.performance.no-regex-construction-in-loop
|
|
5
|
+
title: Avoid no regex construction in loop
|
|
6
|
+
summary: Performance hygiene signal for ruby sources.
|
|
7
|
+
rationale: Performance hygiene signal for ruby sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.performance.no-regex-construction-in-loop
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.allocation
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no regex construction in loop in `ruby` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches ruby.performance.no-regex-construction-in-loop."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.performance.no-sync-fs-in-request-path
|
|
5
|
+
title: Avoid no sync fs in request path
|
|
6
|
+
summary: Performance hygiene signal for ruby sources.
|
|
7
|
+
rationale: Performance hygiene signal for ruby sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.performance.no-sync-fs-in-request-path
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.io
|
|
24
|
+
severity: high
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no sync fs in request path in `ruby` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches ruby.performance.no-sync-fs-in-request-path."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.performance.no-unbounded-concurrency
|
|
5
|
+
title: Avoid no unbounded concurrency
|
|
6
|
+
summary: Performance hygiene signal for ruby sources.
|
|
7
|
+
rationale: Performance hygiene signal for ruby sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.performance.no-unbounded-concurrency
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: performance.async
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- performance
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no unbounded concurrency in `ruby` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches ruby.performance.no-unbounded-concurrency."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-csrf-disabled
|
|
5
|
+
title: Do not disable Rails CSRF protection on browser controllers
|
|
6
|
+
summary: >-
|
|
7
|
+
Browser-facing Rails controllers should keep forgery protection enabled with a safe strategy.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Skipping CSRF verification or downgrading to `null_session` lets attackers replay cross-site requests against authenticated sessions.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- csrf
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: ruby.security.rails-csrf-disabled
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.session-management
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.82
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- rails
|
|
40
|
+
message:
|
|
41
|
+
title: Re-enable CSRF protections around `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` weakens or skips Rails CSRF defenses outside an API-only controller surface."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Remove broad `skip_forgery_protection` usage, prefer `protect_from_forgery with: :exception`, and keep `verify_authenticity_token` enabled for state-changing browser actions.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-detailed-exceptions-enabled
|
|
5
|
+
title: Keep production Rails exception disclosure minimal
|
|
6
|
+
summary: >-
|
|
7
|
+
Production environments should not enable local-style exception pages or verbose Action Dispatch exception rendering.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Detailed exceptions leak stack traces, secrets, and implementation details that attackers can use to refine exploits.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- misconfiguration
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/config/environments/production.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
match:
|
|
27
|
+
fact:
|
|
28
|
+
kind: ruby.security.rails-detailed-exceptions-enabled
|
|
29
|
+
bind: issue
|
|
30
|
+
emit:
|
|
31
|
+
finding:
|
|
32
|
+
category: security.misconfiguration
|
|
33
|
+
severity: medium
|
|
34
|
+
confidence: 0.9
|
|
35
|
+
tags:
|
|
36
|
+
- security
|
|
37
|
+
- ruby
|
|
38
|
+
- rails
|
|
39
|
+
message:
|
|
40
|
+
title: Disable verbose exceptions for `${captures.issue.text}`
|
|
41
|
+
summary: "`${captures.issue.text}` enables detailed exceptions or local request handling in the production environment file."
|
|
42
|
+
remediation:
|
|
43
|
+
summary: >-
|
|
44
|
+
Set `consider_all_requests_local` and `show_detailed_exceptions` to safe defaults, route errors through monitored handlers, and keep `config.action_dispatch.show_exceptions` off verbose modes in production.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-open-redirect
|
|
5
|
+
title: Avoid open redirects from request-controlled targets
|
|
6
|
+
summary: >-
|
|
7
|
+
Redirect helpers must not send users to hosts or paths derived directly from request input without validation.
|
|
8
|
+
rationale: >-
|
|
9
|
+
`redirect_to` and `redirect_back` calls that honor `params`, `request` URLs, or `allow_other_host: true` with tainted data are a common phishing and OAuth bypass vector.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- open-redirect
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: ruby.security.rails-open-redirect
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.url-redirection
|
|
34
|
+
severity: medium
|
|
35
|
+
confidence: 0.84
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- rails
|
|
40
|
+
message:
|
|
41
|
+
title: Validate redirect targets in `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` forwards users using request-derived data or cross-host redirects without a safe allowlist."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Use an allowlisted path helper, reject off-host targets, and avoid pairing `allow_other_host: true` with user-controlled URLs.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-unsafe-html-output
|
|
5
|
+
title: Avoid unescaped HTML built from request or tainted data
|
|
6
|
+
summary: >-
|
|
7
|
+
Do not mark request-driven strings as HTML safe or bypass sanitization in views or helpers.
|
|
8
|
+
rationale: >-
|
|
9
|
+
`raw`, `html_safe`, `sanitize: false`, and ERB double-equals disable escaping and commonly become reflected XSS sinks.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- xss
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
- "**/*.erb"
|
|
25
|
+
exclude:
|
|
26
|
+
- "**/vendor/**"
|
|
27
|
+
- "**/node_modules/**"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: ruby.security.rails-unsafe-html-output
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: security.output-encoding
|
|
35
|
+
severity: high
|
|
36
|
+
confidence: 0.86
|
|
37
|
+
tags:
|
|
38
|
+
- security
|
|
39
|
+
- ruby
|
|
40
|
+
- rails
|
|
41
|
+
message:
|
|
42
|
+
title: Encode or sanitize HTML instead of `${captures.issue.text}`
|
|
43
|
+
summary: "`${captures.issue.text}` mixes tainted or request data with helpers that disable Rails HTML escaping."
|
|
44
|
+
remediation:
|
|
45
|
+
summary: >-
|
|
46
|
+
Prefer default escaping, pass sanitized fragments, or centralize HTML generation through a vetted sanitizer instead of `raw`/`html_safe`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-unsafe-render
|
|
5
|
+
title: Avoid rendering raw HTML or bodies from request input
|
|
6
|
+
summary: >-
|
|
7
|
+
`render` options such as `html:`, `plain:`, or `inline:` must not consume unvalidated request data.
|
|
8
|
+
rationale: >-
|
|
9
|
+
These render modes bypass templates and can reflect attacker-controlled markup or scripts when fed tainted strings.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- xss
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: ruby.security.rails-unsafe-render
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.output-encoding
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.83
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- rails
|
|
40
|
+
message:
|
|
41
|
+
title: Sanitize render payloads in `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` renders dynamic HTML or text modes using tainted or request-derived values."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Prefer templates with escaping, sanitize any rich text, or map request identifiers to trusted server-side content instead of rendering raw params.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-unsafe-session-or-cookie-store
|
|
5
|
+
title: Do not store raw request params in session or cookies
|
|
6
|
+
summary: >-
|
|
7
|
+
Session and signed cookie stores should not persist raw `params` blobs that attackers can influence.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Writing `params` directly into `session` or `cookies` enables tampering, fixation, and oversized payload attacks unless additional integrity controls exist.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- session
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: ruby.security.rails-unsafe-session-or-cookie-store
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.session-management
|
|
34
|
+
severity: medium
|
|
35
|
+
confidence: 0.85
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- rails
|
|
40
|
+
message:
|
|
41
|
+
title: Avoid persisting raw params in `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` assigns request `params` directly into session or cookie storage."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Store opaque identifiers, use signed or encrypted cookie jars appropriately, and validate any user-derived values before persistence.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.rails-unsafe-strong-parameters
|
|
5
|
+
title: Avoid unsafe Rails strong parameters and mass assignment
|
|
6
|
+
summary: >-
|
|
7
|
+
Strong parameters and mass assignment sinks should not accept unfiltered request hashes or privileged attributes.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Permissive `permit!`, privileged `permit` fields, and direct `params` mass assignment enable attackers to escalate privileges or overwrite protected columns.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- mass-assignment
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
- "**/*.erb"
|
|
25
|
+
exclude:
|
|
26
|
+
- "**/vendor/**"
|
|
27
|
+
- "**/node_modules/**"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: ruby.security.rails-unsafe-strong-parameters
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: security.authorization
|
|
35
|
+
severity: high
|
|
36
|
+
confidence: 0.88
|
|
37
|
+
tags:
|
|
38
|
+
- security
|
|
39
|
+
- ruby
|
|
40
|
+
- rails
|
|
41
|
+
message:
|
|
42
|
+
title: Fix unsafe parameter filtering in `${captures.issue.text}`
|
|
43
|
+
summary: "`${captures.issue.text}` permits privileged fields, uses `permit!`, or assigns raw `params` into a model."
|
|
44
|
+
remediation:
|
|
45
|
+
summary: >-
|
|
46
|
+
Replace `permit!` with an explicit attribute list, drop privileged symbols from `permit`, and route updates through vetted strong-parameter helpers instead of raw `params`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.sensitive-data-egress
|
|
5
|
+
title: Avoid relaying request-controlled data through outbound Ruby HTTP clients
|
|
6
|
+
summary: >-
|
|
7
|
+
Outbound HTTP helpers should not receive URLs or bodies directly from `params` or other tainted sources without validation.
|
|
8
|
+
rationale: >-
|
|
9
|
+
User-controlled egress enables SSRF, data exfiltration, and token theft when combined with open HTTP clients.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- privacy
|
|
14
|
+
- egress
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: security.sensitive-data-egress
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.privacy
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.8
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- privacy
|
|
40
|
+
message:
|
|
41
|
+
title: Validate outbound HTTP data in `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` forwards tainted values into an outbound HTTP client."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Allowlist hosts, strip secrets from outbound payloads, and route external calls through audited integration points.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.security.sidekiq-web-unauthenticated-mount
|
|
5
|
+
title: Protect Sidekiq::Web mounts with authentication
|
|
6
|
+
summary: >-
|
|
7
|
+
Sidekiq Web must not be exposed on public routes without an authentication or network guard.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unauthenticated Sidekiq Web consoles expose queues and often lead to remote code execution via job replay or configuration changes.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- ruby
|
|
13
|
+
- rails
|
|
14
|
+
- sidekiq
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- ruby
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rb"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
- "**/node_modules/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: ruby.security.sidekiq-web-unauthenticated-mount
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: security.authorization
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.8
|
|
36
|
+
tags:
|
|
37
|
+
- security
|
|
38
|
+
- ruby
|
|
39
|
+
- sidekiq
|
|
40
|
+
message:
|
|
41
|
+
title: Authenticate Sidekiq Web before `${captures.issue.text}`
|
|
42
|
+
summary: "`${captures.issue.text}` mounts the Sidekiq console without a visible authentication or constraint guard."
|
|
43
|
+
remediation:
|
|
44
|
+
summary: >-
|
|
45
|
+
Wrap mounts in `authenticate`, add route constraints, use basic auth or VPN-only routing, and keep consoles off public networks.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.testing.focused-example
|
|
5
|
+
title: Remove focused RSpec examples before merge
|
|
6
|
+
summary: fit and fdescribe skip the rest of the suite and should not ship.
|
|
7
|
+
rationale: Focused examples hide failures in sibling specs.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.testing.focused-example
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.85
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Remove focused RSpec call `${captures.issue.text}`
|
|
31
|
+
summary: "`${captures.issue.text}` runs only the focused block and skips other examples."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Delete `fit` / `fdescribe` usage and rely on the full spec suite in CI.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.testing.pending-without-ticket-reference
|
|
5
|
+
title: pending examples should cite a ticket
|
|
6
|
+
summary: pending without a tracker reference is easy to forget.
|
|
7
|
+
rationale: Pending specs should carry reviewable intent like skips elsewhere.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.testing.pending-without-ticket-reference
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: low
|
|
25
|
+
confidence: 0.6
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Add a ticket reference to `${captures.issue.text}`
|
|
31
|
+
summary: "`pending` is used without an adjacent issue key or accepted suppression comment."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Link pending work to a tracker id or convert to a skip with reason.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.testing.real-network-in-unit-test
|
|
5
|
+
title: Avoid live HTTP clients in Ruby unit tests
|
|
6
|
+
summary: Net::HTTP, Faraday, or HTTParty usage in specs should be doubled or recorded.
|
|
7
|
+
rationale: Live HTTP couples CI to the network.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- ruby
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- ruby
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: ruby.testing.real-network-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.64
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Stub outbound HTTP in `${captures.issue.text}`
|
|
31
|
+
summary: "`${captures.issue.text}` references a live HTTP client inside a spec-like path."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Use WebMock/VCR or dependency-injected doubles instead of live calls.
|