@starci/hfs 1.0.0 → 2.0.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/CHANGELOG.md +57 -0
- package/README.md +116 -12
- package/bin/hfs.mjs +119 -15
- package/emit/compiler.mjs +35 -0
- package/emit/contracts.mjs +97 -0
- package/emit/operations-worker.mjs +24 -0
- package/emit/operations.mjs +126 -0
- package/emit/schema-worker.mjs +117 -0
- package/emit/static-graph.mjs +670 -0
- package/emit/type-schema.mjs +145 -0
- package/package.json +10 -2
- package/report/sonar.mjs +180 -0
- package/runtime/engine/admission.mjs +284 -0
- package/runtime/engine/digest.mjs +10 -0
- package/runtime/engine/ledger-db.mjs +1245 -0
- package/runtime/engine/machine-db.mjs +1484 -0
- package/runtime/engine/migrations/machine/0001-init.sql +887 -0
- package/runtime/engine/migrations/runtime/0001-init.sql +1072 -0
- package/runtime/engine/migrations/runtime/0003-usage-unavailable.sql +13 -0
- package/runtime/engine/migrations/runtime/0004-attempt-why.sql +43 -0
- package/runtime/engine/plain-object.mjs +5 -0
- package/runtime/knowledge/hfs/canon-pins.yaml +16 -58
- package/runtime/knowledge/hfs/slots.yaml +409 -140
- package/runtime/knowledge/patterns/fe/folder.yaml +309 -0
- package/runtime/knowledge/sonar-gate.yaml +85 -0
- package/runtime/modules/kernel/failure-codes.yaml +1480 -16
- package/runtime/scripts/checks/architecture/backend.mjs +350 -0
- package/runtime/scripts/checks/architecture/background-unowned.mjs +107 -0
- package/runtime/scripts/checks/architecture/client-reaches-server.mjs +94 -0
- package/runtime/scripts/checks/architecture/clones.mjs +200 -0
- package/runtime/scripts/checks/architecture/config-unread.mjs +35 -0
- package/runtime/scripts/checks/architecture/config.mjs +310 -0
- package/runtime/scripts/checks/architecture/connection-map.mjs +208 -0
- package/runtime/scripts/checks/architecture/constructor-deps.mjs +100 -0
- package/runtime/scripts/checks/architecture/contract-fixture-guard.mjs +128 -0
- package/runtime/scripts/checks/architecture/contracts.mjs +792 -0
- package/runtime/scripts/checks/architecture/cross-app-duplicate.mjs +73 -0
- package/runtime/scripts/checks/architecture/dead-exports.mjs +265 -0
- package/runtime/scripts/checks/architecture/default-deny.mjs +129 -0
- package/runtime/scripts/checks/architecture/doc-language.mjs +39 -0
- package/runtime/scripts/checks/architecture/entrypoint.mjs +57 -0
- package/runtime/scripts/checks/architecture/error-codes.mjs +45 -0
- package/runtime/scripts/checks/architecture/error-masked.mjs +60 -0
- package/runtime/scripts/checks/architecture/fe-slot-allows.mjs +38 -0
- package/runtime/scripts/checks/architecture/feature-shape.mjs +49 -0
- package/runtime/scripts/checks/architecture/framework-pinned.mjs +83 -0
- package/runtime/scripts/checks/architecture/frontend.mjs +995 -0
- package/runtime/scripts/checks/architecture/hfs-graph.mjs +61 -0
- package/runtime/scripts/checks/architecture/hfs.mjs +521 -0
- package/runtime/scripts/checks/architecture/hooks-are-hooks.mjs +88 -0
- package/runtime/scripts/checks/architecture/i18n-keys.mjs +146 -0
- package/runtime/scripts/checks/architecture/index.mjs +316 -0
- package/runtime/scripts/checks/architecture/injection-token-exported.mjs +62 -0
- package/runtime/scripts/checks/architecture/machine-ast.mjs +138 -0
- package/runtime/scripts/checks/architecture/module-per-transport.mjs +130 -0
- package/runtime/scripts/checks/architecture/next-data.mjs +775 -0
- package/runtime/scripts/checks/architecture/owners.mjs +89 -0
- package/runtime/scripts/checks/architecture/package-shape.mjs +63 -0
- package/runtime/scripts/checks/architecture/reachability.mjs +233 -0
- package/runtime/scripts/checks/architecture/register-once.mjs +141 -0
- package/runtime/scripts/checks/architecture/registration.mjs +319 -0
- package/runtime/scripts/checks/architecture/required-files.mjs +172 -0
- package/runtime/scripts/checks/architecture/route-files-thin.mjs +97 -0
- package/runtime/scripts/checks/architecture/schema-owner.mjs +261 -0
- package/runtime/scripts/checks/architecture/size-growth.mjs +73 -0
- package/runtime/scripts/checks/architecture/source-names.mjs +607 -0
- package/runtime/scripts/checks/architecture/sql-owner.mjs +142 -0
- package/runtime/scripts/checks/architecture/sql-tokens.mjs +327 -0
- package/runtime/scripts/checks/architecture/symbols.mjs +193 -0
- package/runtime/scripts/checks/architecture/test-world-files.mjs +163 -0
- package/runtime/scripts/checks/architecture/tiers.mjs +130 -0
- package/runtime/scripts/checks/architecture/transport-owner.mjs +112 -0
- package/runtime/scripts/checks/architecture/typescript.mjs +500 -0
- package/runtime/scripts/checks/architecture/unit-spec-providers.mjs +122 -0
- package/runtime/scripts/checks/architecture.mjs +41 -0
- package/runtime/scripts/checks/common.mjs +37 -0
- package/runtime/scripts/checks/typescript-programs.mjs +82 -0
- package/runtime/scripts/lib/artifact-hold.mjs +89 -0
- package/runtime/scripts/lib/artifact-store.mjs +103 -0
- package/runtime/scripts/lib/fs-kind.mjs +10 -0
- package/runtime/scripts/lib/git.mjs +53 -0
- package/runtime/scripts/lib/hfs-allows.mjs +57 -0
- package/runtime/scripts/lib/hfs-check.mjs +254 -28
- package/runtime/scripts/lib/hfs-rules/contract.mjs +126 -0
- package/runtime/scripts/lib/hfs-rules/deps.mjs +63 -0
- package/runtime/scripts/lib/hfs-rules/fe-no-tests.mjs +47 -0
- package/runtime/scripts/lib/hfs-rules/frontend.mjs +124 -0
- package/runtime/scripts/lib/hfs-rules/lint-suppression.mjs +34 -0
- package/runtime/scripts/lib/hfs-rules/pipeline.mjs +51 -0
- package/runtime/scripts/lib/hfs-rules/proof-commands.mjs +64 -0
- package/runtime/scripts/lib/hfs-rules/read.mjs +28 -0
- package/runtime/scripts/lib/hfs-rules/repo-local-checks.mjs +32 -0
- package/runtime/scripts/lib/hfs-rules/secrets.mjs +54 -0
- package/runtime/scripts/lib/hfs-rules/spec-placement.mjs +31 -0
- package/runtime/scripts/lib/hfs-rules/stacks.mjs +54 -0
- package/runtime/scripts/lib/hfs-rules/test-topology.mjs +31 -0
- package/runtime/scripts/lib/hfs-slots.mjs +95 -41
- package/runtime/scripts/lib/hfs-tree.mjs +80 -0
- package/runtime/scripts/lib/hfs-view.mjs +68 -0
- package/runtime/scripts/lib/json.mjs +22 -0
- package/runtime/scripts/lib/language.mjs +107 -0
- package/runtime/scripts/lib/path-key.mjs +2 -0
- package/runtime/scripts/lib/redact.mjs +148 -0
- package/runtime/scripts/lib/repo-identity.mjs +50 -0
- package/runtime/scripts/lib/safe-remove.mjs +179 -0
- package/runtime/scripts/lib/secret-patterns.mjs +44 -0
- package/runtime/scripts/lib/sleep-sync.mjs +17 -0
- package/runtime/scripts/lib/stack-declaration.mjs +52 -0
- package/runtime/scripts/lib/stack-services.mjs +217 -0
- package/runtime/scripts/lib/test-secrets.mjs +120 -0
- package/scaffold/service.mjs +333 -0
- package/sync/format.mjs +46 -0
- package/sync/hygiene.mjs +56 -24
- package/sync/index.mjs +126 -41
- package/sync/managed.mjs +170 -0
- package/sync/skeleton.mjs +32 -10
- package/sync/sonar-key.mjs +13 -0
- package/sync/ts-strict.mjs +48 -0
- package/templates/{common → be/ci-workflows/github/workflows}/ci.yml +13 -13
- package/templates/be/{e2e.yml → ci-workflows/github/workflows/e2e.yml} +1 -0
- package/templates/be/hooks/husky/pre-commit +13 -0
- package/templates/be/hooks/husky/pre-push +7 -0
- package/templates/be/package-scripts/package.json +21 -0
- package/templates/be/{sonar-project.properties → quality-config/sonar-project.properties} +2 -3
- package/templates/be/skeleton/apps/__app__/src/app.module.ts +14 -4
- package/templates/be/skeleton/apps/__app__/src/main.ts +9 -6
- package/templates/be/skeleton/scripts/.gitkeep +0 -0
- package/templates/be/skeleton/src/features/system-health/application/check-liveness.contracts.ts +2 -0
- package/templates/be/skeleton/src/features/system-health/application/check-liveness.handler.ts +22 -0
- package/templates/be/skeleton/src/features/system-health/application/check-liveness.query.ts +11 -0
- package/templates/be/skeleton/src/features/system-health/index.ts +1 -1
- package/templates/be/skeleton/src/features/system-health/system-health.module.ts +3 -3
- package/templates/be/skeleton/src/features/system-health/transport/http/live.controller.ts +8 -9
- package/templates/be/skeleton/src/features/system-health/transport/http/system-health-http.module.ts +3 -6
- package/templates/be/skeleton/src/modules/domain/liveness/index.ts +3 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.contracts.ts +9 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.module.ts +14 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.options.ts +2 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.service.spec.ts +40 -0
- package/templates/be/skeleton/src/modules/domain/liveness/liveness.service.ts +26 -0
- package/templates/be/skeleton/src/modules/platform/clock/clock.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/clock/clock.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/clock/clock.module.ts +19 -0
- package/templates/be/skeleton/src/modules/platform/clock/clock.options.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/clock/clock.port.ts +5 -0
- package/templates/be/skeleton/src/modules/platform/clock/index.ts +4 -0
- package/templates/be/skeleton/src/modules/platform/clock/system-clock.service.spec.ts +20 -0
- package/templates/be/skeleton/src/modules/platform/clock/system-clock.service.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/composition/composition.decorators.ts +8 -0
- package/templates/be/skeleton/src/modules/platform/composition/index.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/config/config.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/config/index.ts +2 -3
- package/templates/be/skeleton/src/modules/platform/config/server.config.ts +1 -1
- package/templates/be/skeleton/src/modules/platform/config/server.options.ts +0 -3
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.contracts.ts +5 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.handler.ts +27 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.log-events.ts +5 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.module.ts +18 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.options.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/cqrs/index.ts +4 -0
- package/templates/be/skeleton/src/modules/platform/errors/error.filter.ts +8 -12
- package/templates/be/skeleton/src/modules/platform/errors/errors.log-events.ts +5 -0
- package/templates/be/skeleton/src/modules/platform/errors/index.ts +1 -1
- package/templates/be/skeleton/src/modules/platform/logging/index.ts +4 -4
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.spec.ts +99 -0
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.ts +38 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.decorators.ts +9 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.log-events.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.module-definition.ts +7 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.module.ts +23 -10
- package/templates/be/skeleton/src/modules/platform/logging/logging.options.ts +2 -0
- package/templates/be/skeleton/src/modules/platform/logging/logging.port.ts +15 -0
- package/templates/be/tool-config/eslint.config.mjs +3 -0
- package/templates/be/tool-config/jest.config.js +1 -0
- package/templates/be/tool-config/prettierignore +8 -0
- package/templates/be/tool-config/prettierrc +1 -0
- package/templates/be/tool-config/src/tests/tsconfig.json +5 -0
- package/templates/be/tool-config/tsconfig.build.json +5 -0
- package/templates/be/tool-config/tsconfig.json +11 -0
- package/templates/common/gitignore.base +1 -1
- package/templates/fe/ci-workflows/github/workflows/ci.yml +54 -0
- package/templates/fe/hooks/husky/pre-commit +16 -0
- package/templates/fe/hooks/husky/pre-push +6 -0
- package/templates/fe/package-scripts/package.json +17 -0
- package/templates/fe/parts/api-client.ts +44 -0
- package/templates/fe/parts/api-outcome.ts +7 -0
- package/templates/fe/quality-config/sonar-project.properties +8 -0
- package/templates/fe/skeleton/apps/__app__/src/app/[locale]/layout.tsx +1 -1
- package/templates/fe/skeleton/apps/__app__/src/app/[locale]/not-found.tsx +1 -1
- package/templates/fe/skeleton/apps/__app__/src/app/global-error.tsx +1 -1
- package/templates/fe/skeleton/scripts/.gitkeep +0 -0
- package/templates/fe/skeleton-app/apps/__app__/src/modules/api/client.ts +1 -0
- package/templates/fe/skeleton-app/apps/__app__/src/modules/api/index.ts +3 -0
- package/templates/fe/skeleton-app/apps/__app__/src/modules/api/outcome.ts +1 -0
- package/templates/fe/skeleton-app/apps/__app__/src/modules/i18n/index.ts +4 -0
- package/templates/fe/skeleton-shared/apps/__app__/next.config.ts +12 -0
- package/templates/fe/skeleton-shared/apps/__app__/src/modules/api/index.ts +2 -0
- package/templates/fe/skeleton-shared/apps/__app__/src/modules/i18n/index.ts +9 -0
- package/templates/fe/skeleton-shared/apps/__app__/src/modules/i18n/request.ts +5 -0
- package/templates/fe/skeleton-shared/apps/__app__/src/proxy.ts +5 -0
- package/templates/fe/skeleton-shared/packages/__family__-api/package.json +12 -0
- package/templates/fe/skeleton-shared/packages/__family__-api/src/client.ts +1 -0
- package/templates/fe/skeleton-shared/packages/__family__-api/src/index.ts +3 -0
- package/templates/fe/skeleton-shared/packages/__family__-api/src/outcome.ts +1 -0
- package/templates/fe/skeleton-shared/packages/__family__-api/tsconfig.json +5 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/package.json +18 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/src/app.ts +19 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/src/index.ts +2 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/src/proxy.ts +12 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/src/request.ts +15 -0
- package/templates/fe/skeleton-shared/packages/__family__-i18n/tsconfig.json +5 -0
- package/templates/fe/tool-config/eslint.config.mjs +3 -0
- package/templates/fe/tool-config/prettierignore +10 -0
- package/templates/fe/tool-config/prettierrc +1 -0
- package/templates/fe/tool-config/stylelint.config.mjs +3 -0
- package/templates/fe/tool-config/tsconfig.json +4 -0
- package/templates/be/pre-commit +0 -8
- package/templates/be/skeleton/apps/__app__/src/__app__.composition.spec.ts +0 -31
- package/templates/be/skeleton/src/features/system-health/transport/http/live.controller.spec.ts +0 -13
- package/templates/be/skeleton/src/modules/platform/config/env-source.spec.ts +0 -36
- package/templates/be/skeleton/src/modules/platform/config/server.config.spec.ts +0 -19
- package/templates/be/skeleton/src/modules/platform/errors/domain-error.spec.ts +0 -15
- package/templates/be/skeleton/src/modules/platform/errors/error.filter.spec.ts +0 -38
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.spec.ts +0 -33
- package/templates/be/skeleton/src/modules/platform/logging/json-logger.ts +0 -35
- package/templates/be/skeleton/src/modules/platform/logging/log-id.ts +0 -9
- package/templates/be/skeleton/src/modules/platform/logging/logger.port.ts +0 -19
- package/templates/common/codecov.yml +0 -13
- package/templates/common/pre-push +0 -5
- package/templates/fe/e2e.yml +0 -22
- package/templates/fe/pre-commit +0 -7
- package/templates/fe/skeleton/apps/__app__/src/app/health/live/route.spec.ts +0 -10
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/messages.spec.ts +0 -27
- package/templates/fe/skeleton/apps/__app__/src/modules/i18n/routing.spec.ts +0 -10
- package/templates/fe/sonar-project.properties +0 -11
- /package/templates/be/skeleton/src/modules/platform/config/{env-source.ts → env-source.config.ts} +0 -0
- /package/templates/be/skeleton/src/modules/platform/errors/{domain-error.ts → domain.error.ts} +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/next.config.ts +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/src/modules/i18n/config.ts +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/src/modules/i18n/navigation.ts +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/src/modules/i18n/request.ts +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/src/modules/i18n/routing.ts +0 -0
- /package/templates/fe/{skeleton → skeleton-app}/apps/__app__/src/proxy.ts +0 -0
|
@@ -1,3 +1,973 @@
|
|
|
1
|
+
ARCH_COMPILER_FAILURE:
|
|
2
|
+
title: "Compiler failed during architecture check"
|
|
3
|
+
title_vi: "Trình biên dịch lỗi khi kiểm kiến trúc"
|
|
4
|
+
meaning_vi: "Trình biên dịch TypeScript gặp lỗi không rõ nhóm nên kiểm tra kiến trúc dừng."
|
|
5
|
+
causes_vi:
|
|
6
|
+
- "Lỗi trong bộ kiểm tra hoặc môi trường TypeScript"
|
|
7
|
+
- "Mã nguồn làm hỏng trình biên dịch"
|
|
8
|
+
nextStep_vi: "Lỗi được ghi thành lỗi đầu vào chưa kiểm; cần xem chi tiết thông báo, nếu là lỗi bộ kiểm tra thì sửa ở lõi."
|
|
9
|
+
owner: runtime-core
|
|
10
|
+
kind: check-finding
|
|
11
|
+
|
|
12
|
+
ARCH_CONFIG_INVALID:
|
|
13
|
+
title: "Architecture config invalid"
|
|
14
|
+
title_vi: "Cấu hình kiến trúc không hợp lệ"
|
|
15
|
+
meaning_vi: "Tệp cấu hình kiến trúc của dự án không đọc hoặc không đúng khuôn."
|
|
16
|
+
causes_vi:
|
|
17
|
+
- "Sai cú pháp hoặc thiếu trường bắt buộc"
|
|
18
|
+
nextStep_vi: "Op dựng khung hoặc sửa mã phải sửa cấu hình rồi chạy lại kiểm tra."
|
|
19
|
+
owner: op-retry
|
|
20
|
+
kind: check-finding
|
|
21
|
+
|
|
22
|
+
ARCH_DYNAMIC_DEPENDENCY_UNPROVEN:
|
|
23
|
+
title: "Dynamic import cannot be resolved"
|
|
24
|
+
title_vi: "Phụ thuộc động không xác định được"
|
|
25
|
+
meaning_vi: "Có import hoặc require dùng tên module không phải chuỗi cố định nên không biết nó phụ thuộc vào đâu."
|
|
26
|
+
causes_vi:
|
|
27
|
+
- "Dùng import(biến) hoặc require(biến)"
|
|
28
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
29
|
+
owner: op-retry
|
|
30
|
+
kind: check-finding
|
|
31
|
+
|
|
32
|
+
ARCH_EXECUTION_UNAVAILABLE:
|
|
33
|
+
title: "Architecture checker could not run"
|
|
34
|
+
title_vi: "Bộ kiểm tra kiến trúc không chạy được"
|
|
35
|
+
meaning_vi: "Không chạy được tiến trình kiểm kiến trúc."
|
|
36
|
+
causes_vi:
|
|
37
|
+
- "Thiếu công cụ hoặc TypeScript trong dự án mục tiêu"
|
|
38
|
+
- "Tiến trình kiểm tra gặp lỗi"
|
|
39
|
+
nextStep_vi: "Kết quả ghi là chưa kiểm; cần sửa môi trường hoặc bộ kiểm tra rồi chạy lại."
|
|
40
|
+
owner: runtime-core
|
|
41
|
+
kind: check-finding
|
|
42
|
+
|
|
43
|
+
ARCH_GRAMMAR_CONTRACT_INVALID:
|
|
44
|
+
title: "Grammar contract invalid"
|
|
45
|
+
title_vi: "Hợp đồng Grammar không hợp lệ"
|
|
46
|
+
meaning_vi: "Khai báo Grammar trong package.json của dự án không đúng khuôn."
|
|
47
|
+
causes_vi:
|
|
48
|
+
- "Thiếu gói, entry hoặc styleEntry của Grammar"
|
|
49
|
+
nextStep_vi: "Op sửa package.json cho đúng hợp đồng Grammar rồi chạy lại."
|
|
50
|
+
owner: op-retry
|
|
51
|
+
kind: check-finding
|
|
52
|
+
|
|
53
|
+
ARCH_GRAMMAR_EXPORT_BYPASS:
|
|
54
|
+
title: "Grammar entry bypassed"
|
|
55
|
+
title_vi: "Bỏ qua cổng xuất của Grammar"
|
|
56
|
+
meaning_vi: "Mã giao diện import Grammar không qua entry mã hoặc style được chọn."
|
|
57
|
+
causes_vi:
|
|
58
|
+
- "Import thẳng đường dẫn sâu trong gói Grammar"
|
|
59
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
60
|
+
owner: op-retry
|
|
61
|
+
kind: check-finding
|
|
62
|
+
|
|
63
|
+
ARCH_INTERNAL_IMPORT_OUTSIDE:
|
|
64
|
+
title: "Import leaves its own project"
|
|
65
|
+
title_vi: "Import trỏ ra ngoài dự án"
|
|
66
|
+
meaning_vi: "Một import nội bộ trỏ tới tệp nằm ngoài các dự án được kiểm."
|
|
67
|
+
causes_vi:
|
|
68
|
+
- "Import đường dẫn tương đối vượt khỏi dự án"
|
|
69
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
70
|
+
owner: op-retry
|
|
71
|
+
kind: check-finding
|
|
72
|
+
|
|
73
|
+
ARCH_INTERNAL_IMPORT_UNRESOLVED:
|
|
74
|
+
title: "Internal import unresolved"
|
|
75
|
+
title_vi: "Import nội bộ không tìm thấy đích"
|
|
76
|
+
meaning_vi: "Một import nội bộ không phân giải được tới tệp nào."
|
|
77
|
+
causes_vi:
|
|
78
|
+
- "Sai đường dẫn hoặc tệp đã bị xoá hay đổi tên"
|
|
79
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
80
|
+
owner: op-retry
|
|
81
|
+
kind: check-finding
|
|
82
|
+
|
|
83
|
+
ARCH_KNOWLEDGE_UNAVAILABLE:
|
|
84
|
+
title: "Architecture knowledge unavailable"
|
|
85
|
+
title_vi: "Tri thức của bộ kiểm kiến trúc không đọc được"
|
|
86
|
+
meaning_vi: "Bộ kiểm kiến trúc cần một tệp tri thức đi kèm (danh sách tệp gốc do framework ghim) nhưng không đọc được hoặc sai khuôn, nên không phán xét bằng hợp đồng khác."
|
|
87
|
+
causes_vi:
|
|
88
|
+
- "Bản đóng gói của `hfs` thiếu hoặc hỏng tệp tri thức, hoặc tệp tri thức trong runtime bị sửa sai khuôn."
|
|
89
|
+
nextStep_vi: "Cài lại `@starci/hfs` đúng phiên bản đã ghim; nếu là runtime thì sửa tệp tri thức rồi chạy `node packages/hfs/scripts/sync-runtime.mjs`."
|
|
90
|
+
owner: runtime-core
|
|
91
|
+
kind: check-finding
|
|
92
|
+
|
|
93
|
+
ARCH_NO_SOURCE:
|
|
94
|
+
title: "No production source found"
|
|
95
|
+
title_vi: "Không có mã nguồn để kiểm"
|
|
96
|
+
meaning_vi: "Các dự án TypeScript được cấu hình không chứa mã TypeScript hay JavaScript sản phẩm nào."
|
|
97
|
+
causes_vi:
|
|
98
|
+
- "Cấu hình include sai"
|
|
99
|
+
- "Dự án còn trống"
|
|
100
|
+
nextStep_vi: "Op phải sửa cấu hình hoặc thêm mã rồi chạy lại."
|
|
101
|
+
owner: op-retry
|
|
102
|
+
kind: check-finding
|
|
103
|
+
|
|
104
|
+
ARCH_OWNER_CYCLE:
|
|
105
|
+
title: "Owner import cycle"
|
|
106
|
+
title_vi: "Vòng import giữa các đơn vị sở hữu"
|
|
107
|
+
meaning_vi: "Các đơn vị sở hữu (feature, module domain, platform, gói...) import lẫn nhau thành vòng khép kín, kể cả bằng import chỉ kiểu. Vòng làm hai đơn vị không thể hiểu, kiểm thử hay thay thế riêng lẻ; bộ kiểm tra báo kèm đường đi của vòng."
|
|
108
|
+
causes_vi:
|
|
109
|
+
- "Hai module domain dùng chung một kiểu và import kiểu của nhau"
|
|
110
|
+
- "Một module gọi ngược lại module đã gọi nó thay vì nhận qua tham số hoặc sự kiện"
|
|
111
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để cắt vòng: chuyển phần chung sang một đơn vị thấp hơn hoặc đảo phụ thuộc; không cần ai can thiệp thêm."
|
|
112
|
+
owner: op-retry
|
|
113
|
+
kind: check-finding
|
|
114
|
+
|
|
115
|
+
ARCH_OWNER_EXPORT_BYPASS:
|
|
116
|
+
title: "Owner public export bypassed"
|
|
117
|
+
title_vi: "Bỏ qua cổng xuất công khai của module"
|
|
118
|
+
meaning_vi: "Import vào module chủ sở hữu không đi qua cổng xuất công khai của nó."
|
|
119
|
+
causes_vi:
|
|
120
|
+
- "Import thẳng tệp bên trong module khác"
|
|
121
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
122
|
+
owner: op-retry
|
|
123
|
+
kind: check-finding
|
|
124
|
+
|
|
125
|
+
ARCH_OWNER_EXPORT_STAR:
|
|
126
|
+
title: "Owner public export uses export star"
|
|
127
|
+
title_vi: "Cổng xuất công khai dùng export *"
|
|
128
|
+
meaning_vi: "Cổng xuất công khai của module dùng export * nên lộ mọi thứ bên trong."
|
|
129
|
+
causes_vi:
|
|
130
|
+
- "Viết export * from trong tệp index công khai"
|
|
131
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
132
|
+
owner: op-retry
|
|
133
|
+
kind: check-finding
|
|
134
|
+
|
|
135
|
+
ARCH_PACKAGE_EXPORT_BYPASS:
|
|
136
|
+
title: "Package export bypassed"
|
|
137
|
+
title_vi: "Bỏ qua cổng xuất của gói"
|
|
138
|
+
meaning_vi: "Import giữa các gói không dùng tên gói và export đã khai báo."
|
|
139
|
+
causes_vi:
|
|
140
|
+
- "Import đường dẫn tương đối sang gói khác"
|
|
141
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
142
|
+
owner: op-retry
|
|
143
|
+
kind: check-finding
|
|
144
|
+
|
|
145
|
+
ARCH_PACKAGE_IMPORTS_APP:
|
|
146
|
+
title: "Package depends on an app"
|
|
147
|
+
title_vi: "Gói dùng chung phụ thuộc vào ứng dụng"
|
|
148
|
+
meaning_vi: "Một gói dùng chung lại import mã của ứng dụng cụ thể."
|
|
149
|
+
causes_vi:
|
|
150
|
+
- "Đặt mã dùng chung nhưng lấy phụ thuộc từ app"
|
|
151
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
152
|
+
owner: op-retry
|
|
153
|
+
kind: check-finding
|
|
154
|
+
|
|
155
|
+
ARCH_SYNTAX_INVALID:
|
|
156
|
+
title: "Source syntax invalid"
|
|
157
|
+
title_vi: "Cú pháp mã nguồn không hợp lệ"
|
|
158
|
+
meaning_vi: "Trình biên dịch báo mã nguồn sai cú pháp."
|
|
159
|
+
causes_vi:
|
|
160
|
+
- "Tệp dở dang hoặc gõ sai"
|
|
161
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
162
|
+
owner: op-retry
|
|
163
|
+
kind: check-finding
|
|
164
|
+
|
|
165
|
+
ARCH_TSCONFIG_INVALID:
|
|
166
|
+
title: "tsconfig invalid"
|
|
167
|
+
title_vi: "tsconfig không hợp lệ"
|
|
168
|
+
meaning_vi: "Một tệp tsconfig không đọc được hoặc sai."
|
|
169
|
+
causes_vi:
|
|
170
|
+
- "Sai JSON hoặc tuỳ chọn không hợp lệ"
|
|
171
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
172
|
+
owner: op-retry
|
|
173
|
+
kind: check-finding
|
|
174
|
+
|
|
175
|
+
ARCH_TSCONFIG_MISSING:
|
|
176
|
+
title: "tsconfig missing"
|
|
177
|
+
title_vi: "Thiếu tsconfig"
|
|
178
|
+
meaning_vi: "Dự án được chọn nhưng không có tsconfig."
|
|
179
|
+
causes_vi:
|
|
180
|
+
- "Tệp bị xoá hoặc đường dẫn sai"
|
|
181
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
182
|
+
owner: op-retry
|
|
183
|
+
kind: check-finding
|
|
184
|
+
|
|
185
|
+
ARCH_TSCONFIG_REFERENCE_OUTSIDE:
|
|
186
|
+
title: "tsconfig reference leaves repo"
|
|
187
|
+
title_vi: "Tham chiếu tsconfig ra ngoài kho"
|
|
188
|
+
meaning_vi: "Một project reference trong tsconfig trỏ ra ngoài kho mã."
|
|
189
|
+
causes_vi:
|
|
190
|
+
- "Đường dẫn references dùng ../ vượt gốc"
|
|
191
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
192
|
+
owner: op-retry
|
|
193
|
+
kind: check-finding
|
|
194
|
+
|
|
195
|
+
ARCH_TYPESCRIPT_INVALID:
|
|
196
|
+
title: "TypeScript package has no compiler API"
|
|
197
|
+
title_vi: "Gói TypeScript trong kho không có API trình biên dịch"
|
|
198
|
+
meaning_vi: "Gói `typescript` trong kho được kiểm không cung cấp API trình biên dịch mà bộ kiểm kiến trúc cần."
|
|
199
|
+
causes_vi:
|
|
200
|
+
- "Gói `typescript` bị cài hỏng hoặc bị thay bằng gói khác cùng tên."
|
|
201
|
+
nextStep_vi: "Cài lại `typescript` đúng phiên bản đã ghim trong `knowledge/hfs/canon-pins.yaml` rồi chạy lại `hfs check`."
|
|
202
|
+
owner: op-retry
|
|
203
|
+
kind: check-finding
|
|
204
|
+
|
|
205
|
+
ARCH_TYPESCRIPT_MISSING:
|
|
206
|
+
title: "TypeScript is not installed in the checked repository"
|
|
207
|
+
title_vi: "Kho được kiểm chưa cài TypeScript"
|
|
208
|
+
meaning_vi: "Bộ kiểm kiến trúc chỉ dùng TypeScript cài trong chính kho được kiểm, không thay bằng bộ phân tích khác, nên không kiểm được."
|
|
209
|
+
causes_vi:
|
|
210
|
+
- "Kho thiếu `package.json` hoặc chưa chạy `npm ci` nên `node_modules/typescript` không có."
|
|
211
|
+
nextStep_vi: "Chạy `npm ci` trong kho rồi chạy lại `hfs check`."
|
|
212
|
+
owner: op-retry
|
|
213
|
+
kind: check-finding
|
|
214
|
+
|
|
215
|
+
BE_APPLICATION_IMPORTS_TRANSPORT:
|
|
216
|
+
title: "Application imports transport layer"
|
|
217
|
+
title_vi: "Lớp ứng dụng import lớp giao vận"
|
|
218
|
+
meaning_vi: "Mã lớp application của feature backend phụ thuộc vào adapter hay DTO của lớp transport."
|
|
219
|
+
causes_vi:
|
|
220
|
+
- "Import DTO hoặc controller vào use case, kể cả qua barrel hoặc import kiểu"
|
|
221
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
222
|
+
owner: op-retry
|
|
223
|
+
kind: check-finding
|
|
224
|
+
|
|
225
|
+
BE_APPLICATION_TRANSPORT_FRAMEWORK:
|
|
226
|
+
title: "Application uses transport framework types"
|
|
227
|
+
title_vi: "Lớp ứng dụng dùng kiểu khung giao vận"
|
|
228
|
+
meaning_vi: "Mã lớp application import decorator, kiểu request hay response của giao thức."
|
|
229
|
+
causes_vi:
|
|
230
|
+
- "Đặt validator hay decorator HTTP trong lớp application"
|
|
231
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
232
|
+
owner: op-retry
|
|
233
|
+
kind: check-finding
|
|
234
|
+
|
|
235
|
+
BE_APP_BUSINESS_ROLE:
|
|
236
|
+
title: "Composition root holds business role"
|
|
237
|
+
title_vi: "Gốc ghép nối chứa vai trò nghiệp vụ"
|
|
238
|
+
meaning_vi: "Thư mục ứng dụng gốc chứa mã có vai trò nghiệp vụ hay nhà cung cấp."
|
|
239
|
+
causes_vi:
|
|
240
|
+
- "Đặt service hay repository trong src của ứng dụng gốc"
|
|
241
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
242
|
+
owner: op-retry
|
|
243
|
+
kind: check-finding
|
|
244
|
+
|
|
245
|
+
BE_APP_COMPOSITION_ONLY:
|
|
246
|
+
title: "Composition root has stray source"
|
|
247
|
+
title_vi: "Gốc ghép nối có tệp lạc chỗ"
|
|
248
|
+
meaning_vi: "Mã trong ứng dụng gốc không phải tệp mà slot ứng dụng cho phép (main.ts, app.module.ts, <app>.options.ts)."
|
|
249
|
+
causes_vi:
|
|
250
|
+
- "Thêm tệp không đúng tên vào thư mục ứng dụng gốc"
|
|
251
|
+
- "Composition spec của app tự khai AppModule, import AppModule từ tệp khác app.module, hoặc không gọi AppModule.register( — module thật không bao giờ được khởi chạy"
|
|
252
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
253
|
+
owner: op-retry
|
|
254
|
+
kind: check-finding
|
|
255
|
+
|
|
256
|
+
BE_BACKGROUND_UNOWNED:
|
|
257
|
+
title: "Every sweep, outbox or retry has a job or consumer run by a worker app"
|
|
258
|
+
title_vi: "Việc nền không có ai chạy"
|
|
259
|
+
meaning_vi: "`<method>` là việc nền nhưng không có job/consumer nào chạy nó — 'khôi phục bền' này không bao giờ chạy."
|
|
260
|
+
causes_vi:
|
|
261
|
+
- "Vi phạm luật R46: Công việc nền (outbox, sweep, reconcile, retry) là `transport/schedule/*.job.ts` hoặc `transport/message/*.consumer.ts`, được app `worker` compose; job/consumer không app `worker` nào compose, hoặc `@Cron`/`@Interval`/`setInterval` ngoài `platform/scheduling`, hoặc method `sweep*\\|deliver*\\|reconcile*\\|retry*` không có job/consumer đã compose chạm tới = đỏ."
|
|
262
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ."
|
|
263
|
+
owner: op-retry
|
|
264
|
+
kind: check-finding
|
|
265
|
+
|
|
266
|
+
BE_CONNECTION_DUPLICATE:
|
|
267
|
+
title: "One database reached through more than one connection or injector"
|
|
268
|
+
title_vi: "Một cơ sở dữ liệu có hơn một kết nối hoặc injector"
|
|
269
|
+
meaning_vi: "Mỗi cơ sở dữ liệu vật lý chỉ có một kết nối và một injector Inject<Conn>EntityManager() khai báo một lần trong platform/database. Bộ kiểm tra thấy một injector thứ hai (ví dụ InjectCollabEntityManager bên cạnh InjectAgentOsEntityManager), một tên kết nối thứ hai trỏ vào cùng cơ sở dữ liệu, một lời gọi InjectEntityManager/getEntityManagerToken/InjectDataSource ngoài <conn>.decorators.ts, hoặc hfs.json, tệp kết nối và injector không khớp một-một."
|
|
270
|
+
causes_vi:
|
|
271
|
+
- "Một tính năng tự tạo injector hoặc kết nối riêng cho cùng cơ sở dữ liệu"
|
|
272
|
+
- "Hai tệp cùng export một tên injector nhưng trỏ tới hai kết nối"
|
|
273
|
+
- "Kết nối mới chưa được khai báo trong hfs.json connections"
|
|
274
|
+
- "Cấu hình kết nối đọc biến môi trường của kết nối khác"
|
|
275
|
+
nextStep_vi: "Giữ đúng một <conn>.connection.ts, <conn>.config.ts và <conn>.decorators.ts cho mỗi mục hfs.json connections trong src/modules/platform/database/, xóa injector hoặc kết nối thừa cùng mọi tham chiếu và đổi nơi dùng sang injector duy nhất. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong BE-CONVENTION; không thêm ngoại lệ, không tắt luật."
|
|
276
|
+
owner: op-retry
|
|
277
|
+
kind: check-finding
|
|
278
|
+
|
|
279
|
+
BE_CONTRACT_UNGUARDED:
|
|
280
|
+
title: "A fake serves payload fixtures that no sandbox contract spec compares with the real provider"
|
|
281
|
+
title_vi: "Fixture của fake chưa có contract spec bảo vệ"
|
|
282
|
+
meaning_vi: "Thư mục `src/tests/world/fakes/<provider>/` có fixture payload (`payloads/*.json`) nhưng không có `src/tests/contract/<provider>/*.contract-spec.ts` nào vừa tham chiếu fixture của nhà cung cấp đó vừa khẳng định `shapeOf(real)` bằng `shapeOf(fixture)`: `<detail>`."
|
|
283
|
+
causes_vi:
|
|
284
|
+
- "Fake có fixture payload nhưng chưa có thư mục contract/<provider>/ hay spec nào"
|
|
285
|
+
- "Contract spec có nhưng không so hình dạng (shapeOf) của payload thật với fixture, hoặc không đọc fixture của đúng nhà cung cấp, hoặc tự định nghĩa shapeOf thay vì import từ world"
|
|
286
|
+
nextStep_vi: "Thêm `src/tests/contract/<provider>/<provider>.contract-spec.ts` dùng contract helper của world (`sandbox.describe(...)`, tự bỏ qua khi thiếu cấu hình sandbox) và khẳng định `expect(shapeOf(thật)).toEqual(shapeOf(fixture))`. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
287
|
+
owner: op-retry
|
|
288
|
+
kind: check-finding
|
|
289
|
+
|
|
290
|
+
BE_DEFAULT_DENY:
|
|
291
|
+
title: "Open or untyped door"
|
|
292
|
+
title_vi: "Cửa mở hoặc nhận dữ liệu không kiểu"
|
|
293
|
+
meaning_vi: "Một operation nhận body không kiểu (unknown, any, GraphQLJSON, switch theo operation), công khai mà không có @Public({ reason: PublicReason.X }) lấy từ enum của domain/identity, tự chọn guard bằng @UseGuards, hoặc so sánh bí mật bằng toán tử bằng thay vì timingSafeEqual. Mặc định mọi route đi qua chuỗi APP_GUARD toàn cục và mọi đầu vào phải có kiểu."
|
|
294
|
+
causes_vi:
|
|
295
|
+
- "@Body() hoặc @Args() không khai kiểu, hoặc khai unknown, any, object"
|
|
296
|
+
- "GraphQLJSON được dùng để chui dữ liệu không kiểu qua schema"
|
|
297
|
+
- "@Public() thiếu reason, hoặc reason là chuỗi hay thuộc enum khác PublicReason"
|
|
298
|
+
- "@UseGuards(...) trên controller hay resolver thay vì chuỗi APP_GUARD toàn cục"
|
|
299
|
+
- "Token, mật khẩu hoặc chữ ký được so sánh bằng === hay !=="
|
|
300
|
+
- "Gốc app api không cung cấp APP_GUARD theo thứ tự throttler, CSRF origin guard của platform/http-security, AuthGuard của domain/identity, hoặc thiếu, lặp một guard"
|
|
301
|
+
nextStep_vi: "Khai DTO hoặc kiểu hợp đồng cho từng operation, dùng @Public({ reason: PublicReason.X }) khi cần mở cửa, bỏ @UseGuards, và so sánh bí mật bằng crypto.timingSafeEqual; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
302
|
+
owner: op-retry
|
|
303
|
+
kind: check-finding
|
|
304
|
+
|
|
305
|
+
BE_ENTRYPOINT_ONLY_IN_APPS:
|
|
306
|
+
title: "Entrypoints only in `apps/*/src`"
|
|
307
|
+
title_vi: "Entrypoint nằm ngoài apps"
|
|
308
|
+
meaning_vi: "`<file>` là một entrypoint tiến trình nằm ngoài `apps/`."
|
|
309
|
+
causes_vi:
|
|
310
|
+
- "Vi phạm luật R33: Không `main.ts`/`bootstrap()`/top-level `void x()` ngoài `apps/*/src`; migrate là `apps/migrate`."
|
|
311
|
+
- "NestFactory.create* hoặc lời gọi bootstrap() cấp cao nhất nằm ngoài apps/<app>/src/main.ts"
|
|
312
|
+
- "Chỉ `src/tests/world/` (gốc ghép của test, slot be.tests.world) được gọi NestFactory ngoài main.ts; một spec (integration, contract, e2e) không được ghép: nó chỉ gọi useTestWorld(...)."
|
|
313
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
314
|
+
owner: op-retry
|
|
315
|
+
kind: check-finding
|
|
316
|
+
|
|
317
|
+
BE_ERROR_HOME:
|
|
318
|
+
title: "Error declared outside its capability"
|
|
319
|
+
title_vi: "Lỗi không nằm ở capability sở hữu"
|
|
320
|
+
meaning_vi: "Một lớp lỗi nằm ngoài errors/<capability>.error.ts của capability sở hữu nó, kế thừa Error trần hay base đã bỏ thay vì DomainError, hoặc tệp errors/<capability>.error.ts không đúng hình dạng (một enum <C>ErrorCode, một bảng <C>_ERROR_KINDS kiểu Record<<C>ErrorCode, ErrorKind>, một lớp <C>Error rỗng); hoặc code ném giá trị không phải DomainError (new Error, exception của framework, chuỗi), hoặc domain ném lỗi của platform."
|
|
321
|
+
causes_vi:
|
|
322
|
+
- "Lớp lỗi đặt ở tệp service hay tệp khác thay vì <capability>/errors/<capability>.error.ts"
|
|
323
|
+
- "Lớp lỗi kế thừa Error hoặc AbstractException thay vì DomainError"
|
|
324
|
+
- "throw new Error(...), throw new NotFoundException(...) hoặc throw một chuỗi thoát ra khỏi capability"
|
|
325
|
+
- "Giá trị enum không theo <CAPABILITY>_<WHAT>, bảng kind thiếu kiểu Record hoặc lớp lỗi có thân"
|
|
326
|
+
- "Domain ném ConfigError hay lỗi khác của platform"
|
|
327
|
+
- "Giá trị của enum <C>ErrorCode không phải chuỗi literal dạng <CAPABILITY>_<WHAT>, có hậu tố _ERROR hay _EXCEPTION, hoặc trùng với một mã ở nơi khác trong repo"
|
|
328
|
+
nextStep_vi: "Chuyển lỗi về errors/<capability>.error.ts với đúng ba thành phần, kế thừa DomainError, dịch lỗi platform thành lỗi của capability; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
329
|
+
owner: op-retry
|
|
330
|
+
kind: check-finding
|
|
331
|
+
|
|
332
|
+
BE_ERROR_MASKED:
|
|
333
|
+
title: "One filter per app; undeclared errors are masked"
|
|
334
|
+
title_vi: "Lỗi nội bộ lộ ra client"
|
|
335
|
+
meaning_vi: "App `<a>` trả thông điệp lỗi nội bộ ra client (`<where>`). Lỗi lạ phải bị che."
|
|
336
|
+
causes_vi:
|
|
337
|
+
- "Vi phạm luật R39: Mỗi app đăng ký đúng một filter/formatError của `platform/errors`; lỗi không khai báo → 500 + thông điệp chung, chi tiết chỉ vào log."
|
|
338
|
+
- "Gốc app api không cung cấp đúng một APP_FILTER dùng lớp khai báo trong platform/errors"
|
|
339
|
+
- "GraphQLModule.forRoot không truyền formatError của platform/errors"
|
|
340
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
341
|
+
owner: op-retry
|
|
342
|
+
kind: check-finding
|
|
343
|
+
|
|
344
|
+
BE_FEATURE_IMPORTS_FEATURE:
|
|
345
|
+
title: "A feature never imports a feature"
|
|
346
|
+
title_vi: "Feature import feature khác"
|
|
347
|
+
meaning_vi: "Feature `<a>` import feature `<b>`. Logic dùng chung phải là một capability domain."
|
|
348
|
+
causes_vi:
|
|
349
|
+
- "Vi phạm luật R28: Feature không import feature khác (kể cả qua `index.ts`); dùng chung thì đưa xuống domain."
|
|
350
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ."
|
|
351
|
+
owner: op-retry
|
|
352
|
+
kind: check-finding
|
|
353
|
+
|
|
354
|
+
BE_FEATURE_LAYOUT_INVALID:
|
|
355
|
+
title: "Feature folder layout invalid"
|
|
356
|
+
title_vi: "Bố cục thư mục feature sai"
|
|
357
|
+
meaning_vi: "Tệp của feature đặt sai thư mục application hoặc transport so với vai trò của nó."
|
|
358
|
+
causes_vi:
|
|
359
|
+
- "Đặt vai trò giao vận trong application/ hoặc ngược lại"
|
|
360
|
+
- "Thiếu tên giao thức dưới transport/"
|
|
361
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
362
|
+
owner: op-retry
|
|
363
|
+
kind: check-finding
|
|
364
|
+
|
|
365
|
+
BE_FEATURE_NOT_COMPOSED:
|
|
366
|
+
title: "Feature or capability module not composed into any app"
|
|
367
|
+
title_vi: "Feature hoặc module năng lực không được lắp vào ứng dụng nào"
|
|
368
|
+
meaning_vi: "Một feature backend, hoặc một module domain, integrations hay platform, không có đường import chạy thật (không tính import chỉ-kiểu) từ tệp gốc của bất kỳ ứng dụng nào (app.module.ts hoặc main.ts), kể cả qua các module khác đã được lắp. Không tiến trình nào nạp nó nên code này không bao giờ được phục vụ."
|
|
369
|
+
causes_vi:
|
|
370
|
+
- "Quên thêm module của feature vào app.module.ts của ứng dụng"
|
|
371
|
+
- "Chỉ import kiểu (import type) từ ứng dụng, nên feature không thật sự được lắp vào"
|
|
372
|
+
- "Feature đã bị bỏ dở hoặc thay bằng feature khác nhưng thư mục cũ vẫn còn"
|
|
373
|
+
- "Module năng lực được viết sẵn nhưng chưa feature nào import nó, hoặc feature từng dùng nó đã bị xoá"
|
|
374
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để lắp module của feature vào ứng dụng phù hợp hoặc xoá feature không dùng; không cần ai can thiệp thêm."
|
|
375
|
+
owner: op-retry
|
|
376
|
+
kind: check-finding
|
|
377
|
+
|
|
378
|
+
BE_FEATURE_SHAPE:
|
|
379
|
+
title: "Feature root is `index.ts`, module, `application/`, `transport/<protocol>/`"
|
|
380
|
+
title_vi: "Feature sai hình dạng"
|
|
381
|
+
meaning_vi: "Feature `<f>` có `<dir>` ngoài hình dạng chuẩn (application/ + transport/<protocol>/)."
|
|
382
|
+
causes_vi:
|
|
383
|
+
- "Vi phạm luật R29: Feature gốc chỉ có `index.ts`, `<feature>.module.ts`, `application/`, `transport/<protocol>/` với protocol có slot; không `application/graphql\\|http`, không `infrastructure/`, `composition/`, cây transport-first."
|
|
384
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
385
|
+
owner: op-retry
|
|
386
|
+
kind: check-finding
|
|
387
|
+
|
|
388
|
+
BE_MODULE_HANDLER_REGISTRATION:
|
|
389
|
+
title: "Handler not registered exactly once"
|
|
390
|
+
title_vi: "Handler chưa đăng ký đúng một lần"
|
|
391
|
+
meaning_vi: "Một handler không được đăng ký trực tiếp đúng một lần trong module Nest."
|
|
392
|
+
causes_vi:
|
|
393
|
+
- "Quên đăng ký vào providers"
|
|
394
|
+
- "Đăng ký ở nhiều module"
|
|
395
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
396
|
+
owner: op-retry
|
|
397
|
+
kind: check-finding
|
|
398
|
+
|
|
399
|
+
BE_MODULE_PROVIDER_REREGISTRATION:
|
|
400
|
+
title: "Provider re-registered"
|
|
401
|
+
title_vi: "Provider bị đăng ký lại"
|
|
402
|
+
meaning_vi: "Một provider đã có nơi đăng ký lại bị đăng ký thêm ở module khác."
|
|
403
|
+
causes_vi:
|
|
404
|
+
- "Khai báo cùng provider ở hai module"
|
|
405
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
406
|
+
owner: op-retry
|
|
407
|
+
kind: check-finding
|
|
408
|
+
|
|
409
|
+
BE_MODULE_SHAPE:
|
|
410
|
+
title: "Nest module shape invalid"
|
|
411
|
+
title_vi: "Hình dạng module Nest sai"
|
|
412
|
+
meaning_vi: "Một module vi phạm hình dạng chuẩn: @Global() ở bất kỳ đâu, isGlobal: true ngoài apps/<app>/src/app.module.ts, import module của owner khác vào @Module({ imports }), ConfigurableModuleBuilder không khai kiểu options, có forRoot, forFeature hay registerAsync thay vì chỉ static register, nhiều module trong một tệp, new một provider, hoặc biến let ở cấp module."
|
|
413
|
+
causes_vi:
|
|
414
|
+
- "@Global() trên bất kỳ module nào (kể cả trong spec)"
|
|
415
|
+
- "isGlobal: true ở ngoài app.module.ts của app"
|
|
416
|
+
- "Module của một capability khác bị import vào imports thay vì dùng qua Inject<Thing>()"
|
|
417
|
+
- "new ConfigurableModuleBuilder() không có kiểu options"
|
|
418
|
+
- "register không static, hoặc có forRoot, forFeature, registerAsync"
|
|
419
|
+
- "new XService() hoặc let ở cấp module tạo trạng thái toàn cục"
|
|
420
|
+
- "Feature có hai module trong một thư mục transport (một module cho mỗi thao tác), có module-definition, hoặc @Module ngoài `<f>.module.ts` và `<f>-<protocol>.module.ts`; app import module ứng dụng của feature hoặc module transport không thuộc loại app cho phép (api: graphql/http/websocket; worker: schedule/message; cli: cli)"
|
|
421
|
+
- "Bộ máy đồ thị module: module đại diện của capability được đăng ký hai lần trong một app, thiếu isGlobal: true ở gốc app, hoặc bị module khác import"
|
|
422
|
+
- "Module con có hơn một nơi import, hoặc vừa nằm ở gốc app vừa được module khác import"
|
|
423
|
+
- "isGlobal: true xuất hiện ngoài gốc app apps/<app>/src/app.module.ts"
|
|
424
|
+
nextStep_vi: "Bỏ @Global, để app đăng ký capability đúng một lần với isGlobal: true, dùng capability khác qua Inject<Thing>(), khai kiểu options, chỉ dùng static register, tách module, để container dựng provider; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
425
|
+
owner: op-retry
|
|
426
|
+
kind: check-finding
|
|
427
|
+
|
|
428
|
+
BE_PUBLIC_CONTRACT_FORM:
|
|
429
|
+
title: "Public contract form invalid"
|
|
430
|
+
title_vi: "Dạng hợp đồng công khai sai"
|
|
431
|
+
meaning_vi: "Hợp đồng công khai của backend không được khai báo theo dạng được yêu cầu (ví dụ kiểu inline)."
|
|
432
|
+
causes_vi:
|
|
433
|
+
- "Viết kiểu ngay tại tham số thay vì khai báo tên riêng"
|
|
434
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
435
|
+
owner: op-retry
|
|
436
|
+
kind: check-finding
|
|
437
|
+
|
|
438
|
+
BE_RAW_INJECT:
|
|
439
|
+
title: "Infrastructure dependency injected without its Inject*() decorator"
|
|
440
|
+
title_vi: "Phụ thuộc hạ tầng không được tiêm qua Inject*()"
|
|
441
|
+
meaning_vi: "Mọi tham số constructor có kiểu thuộc hạ tầng (EntityManager, CommandBus, Clock, Logger, Cache, HttpClient, options của module, client SDK) phải mang một decorator Inject<Thing>() không tham số, export từ <owner>.decorators.ts và dựng bằng injector<T>(token) trên token unique symbol. Bộ kiểm tra thấy @Inject( thô ngoài *.decorators.ts, token chuỗi, forwardRef, ModuleRef, tiêm qua thuộc tính, injector sai hình hoặc kiểu T khác kiểu tham số. Token của Inject<Thing>() mà một service dùng cũng phải được export (từ <cap>.decorators.ts hoặc index.ts của năng lực) để spec có thể cung cấp nó."
|
|
442
|
+
causes_vi:
|
|
443
|
+
- "Token của Inject<Thing>() là const riêng tư, không export"
|
|
444
|
+
- "@Inject(TOKEN) viết thẳng ở nơi dùng"
|
|
445
|
+
- "Token là chuỗi thay vì unique symbol"
|
|
446
|
+
- "Tiêm lớp hạ tầng (CacheService, AppLogger) không qua injector"
|
|
447
|
+
- "Dùng ModuleRef.get hoặc forwardRef để né vòng phụ thuộc"
|
|
448
|
+
nextStep_vi: "Khai báo token `export const THING: unique symbol = Symbol(\"<owner>.<thing>\")` và `export const InjectThing = (): TypedParameterDecorator<Thing> => injector<Thing>(THING)` trong <owner>.decorators.ts rồi dùng @InjectThing() ở mọi nơi; vòng phụ thuộc là lỗi kiến trúc cần gỡ, không dùng forwardRef. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong BE-CONVENTION; không thêm ngoại lệ, không tắt luật."
|
|
449
|
+
owner: op-retry
|
|
450
|
+
kind: check-finding
|
|
451
|
+
|
|
452
|
+
BE_READONLY_BOUNDARY:
|
|
453
|
+
title: "Readonly boundary violated"
|
|
454
|
+
title_vi: "Vi phạm ranh giới chỉ-đọc"
|
|
455
|
+
meaning_vi: "Thông điệp hoặc phụ thuộc được tiêm không được đánh dấu readonly hoặc có setter."
|
|
456
|
+
causes_vi:
|
|
457
|
+
- "Thiếu readonly trên trường"
|
|
458
|
+
- "Có setter hay index signature"
|
|
459
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
460
|
+
owner: op-retry
|
|
461
|
+
kind: check-finding
|
|
462
|
+
|
|
463
|
+
BE_REQUIRED_MODULE_MISSING:
|
|
464
|
+
title: "Required backend module, app or feature file is missing"
|
|
465
|
+
title_vi: "Thiếu tệp hoặc thư mục bắt buộc của một phần backend"
|
|
466
|
+
meaning_vi: "Bảng kê HFS bắt buộc mỗi ứng dụng, tính năng, module miền, tích hợp và module nền tảng (cấu hình, ghi nhật ký, lỗi, kiểu nguyên thuỷ) phải có một số tệp hoặc thư mục cố định, ví dụ index.ts, tệp .module.ts hay thư mục application/. Ở đây một mục như vậy không tồn tại, nên phần đó chưa đúng khuôn và các bộ kiểm tra khác không thể tin vào nó."
|
|
467
|
+
causes_vi:
|
|
468
|
+
- "Tạo module hoặc tính năng mới nhưng quên tệp cửa vào index.ts hoặc tệp .module.ts"
|
|
469
|
+
- "Module nền tảng bắt buộc (config, logging, errors, primitives) chưa được tạo hoặc đặt tên khác"
|
|
470
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để tạo tệp hoặc thư mục còn thiếu đúng theo bảng kê; nếu tên hiện có là do thiết kế khác thì đó là việc đổi bảng kê, do người giám sát quyết định."
|
|
471
|
+
owner: op-retry
|
|
472
|
+
kind: check-finding
|
|
473
|
+
|
|
474
|
+
BE_SCHEMA_OWNER:
|
|
475
|
+
title: "Entities and migrations live in the owning capability's `persistence/`"
|
|
476
|
+
title_vi: "Entity hoặc migration sai chủ"
|
|
477
|
+
meaning_vi: "Entity/migration `<file>` không nằm dưới `persistence/` của capability sở hữu (hoặc sai tên)."
|
|
478
|
+
causes_vi:
|
|
479
|
+
- "Vi phạm luật R35: Entity + migration nằm trong `<capability>/persistence/` của capability sở hữu bảng, có `connection.ts` khai báo hai mảng `<c>Entities` và `<c>Migrations` (không có `CONNECTION`); connection của capability là connection mà app đăng ký hai mảng đó vào `DatabaseModule.register`: đúng một connection khai trong `hfs.json` ở mọi app, và mọi `Inject<Conn>EntityManager` trong capability phải là connection ấy; tên migration `<epochMs13>-<kebab>.ts`, class `<Pascal><epochMs13>`, thuộc tính `name` bằng tên class; `index.ts` của owner export `<c>Entities` và `<c>Migrations`, app compose."
|
|
480
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
481
|
+
owner: op-retry
|
|
482
|
+
kind: check-finding
|
|
483
|
+
|
|
484
|
+
BE_SOURCE_FORM:
|
|
485
|
+
title: "Back-end source file breaks the naming or form canon"
|
|
486
|
+
title_vi: "Tệp nguồn BE sai quy ước tên hoặc hình thức"
|
|
487
|
+
meaning_vi: "Tên tệp phải là kebab-case với hậu tố vai trò trong danh sách đóng của slots.yaml; chỉ export có tên (không export default); mọi export và thành viên công khai có JSDoc tiếng Anh; không emoji, và không có chữ tiếng Việt trong định danh, chuỗi ký tự, chú thích hay tên test ngoài catalog messages/ và slot fixture i18n."
|
|
488
|
+
causes_vi:
|
|
489
|
+
- "Tệp dùng hậu tố bị cấm (use-case, repository, store, util, helper, types, constants)"
|
|
490
|
+
- "Lớp export không kết thúc bằng hậu tố vai trò của tệp và cũng không kết thúc bằng tên port (interface trong *.port.ts hoặc *.contracts.ts) mà nó implements"
|
|
491
|
+
- "Interface trong tệp *.input.ts, *.request.ts, *.response.ts, *.type.ts, *.args.ts hoặc *.rows.ts không kết thúc bằng Input, Request, Response, Type, Args hoặc Row"
|
|
492
|
+
- "@Args dùng tên khác \"input\""
|
|
493
|
+
- "Export default"
|
|
494
|
+
- "Thiếu JSDoc trên export"
|
|
495
|
+
- "Chú thích tiếng Việt trong mã"
|
|
496
|
+
nextStep_vi: "Đổi tên tệp theo vai trò trong danh sách đóng, chuyển kiểu vào <tên>.contracts.ts, thêm JSDoc tiếng Anh và bỏ export default. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong BE-CONVENTION; không thêm ngoại lệ, không tắt luật."
|
|
497
|
+
owner: op-retry
|
|
498
|
+
kind: check-finding
|
|
499
|
+
|
|
500
|
+
BE_SPEC_PLACEMENT:
|
|
501
|
+
title: "A back-end spec lives in one of the four test layers"
|
|
502
|
+
title_vi: "Spec đặt ngoài bốn tầng test"
|
|
503
|
+
meaning_vi: "Tệp spec hoặc test `<f>` nằm ngoài bốn tầng test của back end (kể cả trong `scripts/` hoặc `tools/`)."
|
|
504
|
+
causes_vi:
|
|
505
|
+
- "Vi phạm luật R102: spec đơn vị là `<name>.service.spec.ts` cạnh service của nó; spec tích hợp, e2e và contract nằm dưới `src/tests/{integration,e2e,contract}`. Mọi `*.spec.*`, `*.test.*`, `*-spec.*` khác là vi phạm; script vận hành và công cụ không mang spec."
|
|
506
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: chuyển spec vào tầng đúng hoặc xóa nó; không thêm ngoại lệ, không tắt luật."
|
|
507
|
+
owner: op-retry
|
|
508
|
+
kind: check-finding
|
|
509
|
+
|
|
510
|
+
BE_SPEC_QUALITY:
|
|
511
|
+
title: "Spec reads source, or an e2e breaks its flow shape"
|
|
512
|
+
title_vi: "Spec đọc mã nguồn hoặc e2e phá dạng luồng"
|
|
513
|
+
meaning_vi: "Một spec đọc mã nguồn của repo bằng fs để kiểm tra chữ, một spec chỉ khẳng định lời gọi thay vì kết quả, hoặc một e2e đi vòng qua transport, ngủ theo thời lượng, rẽ nhánh trong bước, tự dựng module, gọi nhà cung cấp mô hình hay không đọc lại trạng thái đã lưu. Ép kiểu (as, x!) trong spec do các luật mượn của typescript-eslint chặn, cùng mã BE_TYPE_ESCAPE. Một spec của bất kỳ tầng nào bỏ qua hoặc đánh dấu test (skip, skipIf, runIf, todo, only, xit, xdescribe, xtest) hay chọn runner theo điều kiện cũng bị chặn; việc bỏ qua duy nhất là của contract helper trong world khi thiếu cấu hình sandbox."
|
|
514
|
+
causes_vi:
|
|
515
|
+
- "readFileSync hay readdirSync trên mã nguồn hoặc __dirname trong spec"
|
|
516
|
+
- "Spec chỉ có toHaveBeenCalled*, không khẳng định kết quả hay trạng thái"
|
|
517
|
+
- "`it.skip`, `describe.skip`, `xit`, `it.todo`, `.skipIf`/`.runIf` hoặc `(cond ? describe : describe.skip)` trong spec; hãy viết test thật hoặc xóa nó, còn việc bỏ qua khi thiếu sandbox nằm trong contract helper của world (`sandbox.describe(...)`)"
|
|
518
|
+
- "e2e gọi CommandBus, QueryBus hay handler trực tiếp; dùng sleep thay cho waitFor; tự gọi Test.createTestingModule; import SDK của nhà cung cấp mô hình; không đọc lại dòng đã lưu qua EntityManager"
|
|
519
|
+
- "Spec đơn vị của service có providers khác với phụ thuộc constructor: thừa nhà cung cấp, thiếu nhà cung cấp, service không đứng đầu, token không suy ra được hoặc nhà cung cấp không phải lớp hay { provide, useValue }"
|
|
520
|
+
nextStep_vi: "Chuyển luật kiến trúc sang lint hoặc bộ kiểm tra; khẳng định kết quả hoặc trạng thái; e2e vào bằng transport thật, chờ bằng waitFor và dựng thế giới ở src/tests/e2e/setup. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
521
|
+
owner: op-retry
|
|
522
|
+
kind: check-finding
|
|
523
|
+
|
|
524
|
+
BE_SQL_TABLE_OWNER:
|
|
525
|
+
title: "SQL touches another capability's table or reads unbounded"
|
|
526
|
+
title_vi: "SQL ghi bảng của năng lực khác hoặc đọc không giới hạn"
|
|
527
|
+
meaning_vi: "Bộ kiểm tra phân tích từng hằng SqlText: câu lệnh ghi (INSERT, UPDATE, DELETE) chỉ được chạm bảng của entity thuộc chính năng lực đó; câu đọc chỉ được chạm bảng của năng lực mà chủ sở hữu được phép import; SELECT nhiều dòng phải có LIMIT trừ khi lọc theo khóa chính hoặc khóa duy nhất hoặc chỉ tính tổng."
|
|
528
|
+
causes_vi:
|
|
529
|
+
- "Service của năng lực A cập nhật bảng của năng lực B"
|
|
530
|
+
- "Truy vấn danh sách quên LIMIT"
|
|
531
|
+
- "Bảng chưa có entity khai báo ở năng lực sở hữu"
|
|
532
|
+
nextStep_vi: "Chuyển câu ghi về năng lực sở hữu bảng và gọi qua API công khai của năng lực đó; thêm LIMIT theo PAGE_SIZE_MAX, LIST_ROWS_MAX hoặc BATCH_ROWS của platform/database. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong BE-CONVENTION; không thêm ngoại lệ, không tắt luật."
|
|
533
|
+
owner: op-retry
|
|
534
|
+
kind: check-finding
|
|
535
|
+
|
|
536
|
+
BE_TEST_TOPOLOGY:
|
|
537
|
+
title: "One jest config, four projects live by folder; the world is the only test infrastructure and runs the repository's own stack for real"
|
|
538
|
+
title_vi: "Cấu hình test lệch chuẩn"
|
|
539
|
+
meaning_vi: "Cấu hình test lệch chuẩn: `<detail>`."
|
|
540
|
+
causes_vi:
|
|
541
|
+
- "Vi phạm luật R47: một `jest.config.js` (preset `@starci/jest-preset`) với bốn project `unit`, `integration`, `e2e`, `contract`; thư mục và hậu tố spec luôn khớp nhau; `diagnostics: false` + `isolatedModules: true`; `test:integration`, `test:e2e`, `test:contract` = `typecheck:tests && jest --selectProjects <tên>`; `src/tests/world/` là nơi duy nhất dựng hạ tầng test và chỉ chứa `global-setup.ts`, `global-teardown.ts`, `use-test-world.ts`, `fakes/` và file gốc có hậu tố vai trò (kể cả `test-world.config.ts`)."
|
|
542
|
+
- "Vi phạm luật R47 về stack thật: mọi dịch vụ khai trong `.starcistacks/<env>` (Postgres, Redis, Keycloak, mail host, k3s...) chạy THẬT trong world qua toxiproxy, world đọc dịch vụ và phiên bản image từ stack lúc chạy; `fakes/<provider>/` chỉ giả SaaS bên ngoài mà đội không vận hành. Ngoại lệ duy nhất: dịch vụ stateless cần phần cứng đặc biệt hoặc model bên ngoài (GPU inference, embedding tự host) được giả khi `test-world.config.ts` khai trong `fakedBy` với `reason` không rỗng; dịch vụ có trạng thái (database, cache, identity, storage, mail, queue, search hoặc có volume bền) không bao giờ được giả, và mục `fakedBy` trỏ tới dịch vụ hoặc thư mục fake không tồn tại bị coi là cũ."
|
|
543
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
544
|
+
owner: op-retry
|
|
545
|
+
kind: check-finding
|
|
546
|
+
|
|
547
|
+
BE_TIER_DIRECTION:
|
|
548
|
+
title: "Backend import against the tier direction"
|
|
549
|
+
title_vi: "Backend import ngược chiều tầng"
|
|
550
|
+
meaning_vi: "Một tệp backend import từ tầng mà bảng kê HFS không cho phép tầng của nó phụ thuộc vào. Mỗi tầng (app, feature, domain, integrations, platform) chỉ được nhìn xuống các tầng liệt kê trong bảng; hai feature import nhau là mã riêng BE_FEATURE_IMPORTS_FEATURE, và import chỉ kiểu (type-only) cũng tính như import thật."
|
|
551
|
+
causes_vi:
|
|
552
|
+
- "Một module domain, integrations hoặc platform import ngược lên feature hoặc app"
|
|
553
|
+
- "Một module platform import domain hoặc integrations"
|
|
554
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để đưa phần dùng chung xuống đúng tầng (domain hoặc platform) rồi cho cả hai bên import từ đó; không cần ai can thiệp thêm."
|
|
555
|
+
owner: op-retry
|
|
556
|
+
kind: check-finding
|
|
557
|
+
|
|
558
|
+
FE_APP_ISOLATION:
|
|
559
|
+
title: "App imports another app"
|
|
560
|
+
title_vi: "Một app import app khác"
|
|
561
|
+
meaning_vi: "Một app trong apps/ import mã nguồn của app khác. Các app độc lập, build và triển khai riêng; mã dùng chung phải nằm trong một gói packages/<pkg>."
|
|
562
|
+
causes_vi:
|
|
563
|
+
- "Import đường dẫn tương đối hoặc bí danh trỏ sang apps/<app-khác>/src"
|
|
564
|
+
- "Sao chép cách dùng chung bằng import thay vì tạo gói dùng chung"
|
|
565
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để chuyển phần dùng chung vào một gói packages/<pkg> hoặc nhân bản có chủ đích; nếu cần ô gói mới thì người giám sát thêm ô vào bảng kê."
|
|
566
|
+
owner: op-retry
|
|
567
|
+
kind: check-finding
|
|
568
|
+
|
|
569
|
+
FE_BLOCK_PRODUCT_HOOK_DEFINITION:
|
|
570
|
+
title: "Block defines a product hook"
|
|
571
|
+
title_vi: "Khối giao diện tự định nghĩa hook sản phẩm"
|
|
572
|
+
meaning_vi: "Một block định nghĩa luôn vòng đời dữ liệu của sản phẩm, trong khi block chỉ được gọi hook có sẵn từ thư mục hooks."
|
|
573
|
+
causes_vi:
|
|
574
|
+
- "Viết hook dữ liệu ngay trong file block"
|
|
575
|
+
- "Trộn logic thế giới sản phẩm vào block"
|
|
576
|
+
nextStep_vi: "Op interface.implement chuyển hook sang thư mục hooks và để block chỉ gọi nó."
|
|
577
|
+
owner: other-op:interface.implement
|
|
578
|
+
kind: check-finding
|
|
579
|
+
|
|
580
|
+
FE_CLIENT_REACHES_SERVER:
|
|
581
|
+
title: "Client module reaches a server-only import"
|
|
582
|
+
title_vi: "Mô-đun client với tới import chỉ dành cho máy chủ"
|
|
583
|
+
meaning_vi: "Một mô-đun có chỉ thị `\"use client\"` với tới, qua chuỗi import chạy thật (nhiều bước, không tính import chỉ-kiểu), một mô-đun import `server-only`, `next/headers`, `next/server`, `next-intl/server`, `node:*` hoặc `fs`. Lời nhắn nêu client đầu vào và cả chuỗi import."
|
|
584
|
+
causes_vi:
|
|
585
|
+
- "Hook hoặc module dùng chung được client component import gián tiếp lại đọc request ở máy chủ"
|
|
586
|
+
- "Reader máy chủ bị import từ đường đi của một client component thay vì chỉ từ server component"
|
|
587
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để đọc dữ liệu ở server component và truyền xuống bằng props, hoặc đưa import ra khỏi đồ thị client theo lời nhắn; không thêm ngoại lệ."
|
|
588
|
+
owner: op-retry
|
|
589
|
+
kind: check-finding
|
|
590
|
+
|
|
591
|
+
FE_COMPONENT_DEEP_HOOK_IMPORT:
|
|
592
|
+
title: "Component imports a hook too deeply"
|
|
593
|
+
title_vi: "Thành phần nhập hook quá sâu"
|
|
594
|
+
meaning_vi: "Thành phần giao diện nhập hook dữ liệu không qua cửa (barrel) của thư mục hooks."
|
|
595
|
+
causes_vi:
|
|
596
|
+
- "Nhập thẳng tệp hook thay vì qua barrel"
|
|
597
|
+
- "Đường nhập đi vòng qua nhiều tầng"
|
|
598
|
+
nextStep_vi: "Op interface.implement đổi sang nhập qua barrel hooks của nơi sở hữu."
|
|
599
|
+
owner: other-op:interface.implement
|
|
600
|
+
kind: check-finding
|
|
601
|
+
|
|
602
|
+
FE_COMPONENT_WORLD_OWNERSHIP:
|
|
603
|
+
title: "Component owns product-world state"
|
|
604
|
+
title_vi: "Thành phần nắm trạng thái của thế giới sản phẩm"
|
|
605
|
+
meaning_vi: "Một thành phần cấp thấp tự giữ dữ liệu, điều hướng, ngôn ngữ hoặc phiên, trong khi chỉ được xử lý tương tác trình duyệt đơn giản."
|
|
606
|
+
causes_vi:
|
|
607
|
+
- "Gọi hook điều hướng hoặc ngôn ngữ trong thành phần thuần"
|
|
608
|
+
- "Đặt vòng đời dữ liệu ở tầng sai"
|
|
609
|
+
nextStep_vi: "Op interface.implement chuyển phần này lên thành phần kết nối (index.tsx) của tầng sở hữu."
|
|
610
|
+
owner: other-op:interface.implement
|
|
611
|
+
kind: check-finding
|
|
612
|
+
|
|
613
|
+
FE_CONNECTED_BLOCK_RENDER_PAIR:
|
|
614
|
+
title: "Connected block lacks pure render twin"
|
|
615
|
+
title_vi: "Khối kết nối thiếu bản render thuần đi kèm"
|
|
616
|
+
meaning_vi: "Block kết nối (index.tsx) không giao mọi đường render cho hàm thuần trong component.tsx cùng cấp."
|
|
617
|
+
causes_vi:
|
|
618
|
+
- "Viết JSX trực tiếp trong index.tsx"
|
|
619
|
+
- "Chưa có bản thuần trong component.tsx"
|
|
620
|
+
nextStep_vi: "Op interface.implement tách phần hiển thị sang component.tsx và để index.tsx chỉ nối dữ liệu."
|
|
621
|
+
owner: other-op:interface.implement
|
|
622
|
+
kind: check-finding
|
|
623
|
+
|
|
624
|
+
FE_CROSS_APP_DUPLICATE:
|
|
625
|
+
title: "File copied between apps"
|
|
626
|
+
title_vi: "Tệp chép nguyên giữa các app"
|
|
627
|
+
meaning_vi: "Hai tệp TypeScript của hai app khác nhau có nội dung token giống hệt (bỏ qua chú thích và khoảng trắng, giữ tên định danh), kể cả tệp trong cây route. Mã dùng chung là slot `packages/<pkg>`; tệp chỉ gồm import hoặc export lại một ký hiệu của gói thì được phép."
|
|
628
|
+
causes_vi:
|
|
629
|
+
- "Tệp route hoặc helper được chép từ app này sang app khác thay vì đưa vào gói dùng chung"
|
|
630
|
+
- "Mỗi app tự giữ một bản `error.tsx`, `not-found.tsx`, `i18n/request.ts` hay helper kiểm thử giống hệt nhau"
|
|
631
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để chuyển mã vào một gói `packages/<pkg>` và để mỗi app chỉ re-export ký hiệu của gói theo lời nhắn; không thêm ngoại lệ."
|
|
632
|
+
owner: op-retry
|
|
633
|
+
kind: check-finding
|
|
634
|
+
|
|
635
|
+
FE_CUSTOM_HOOK_LOCATION:
|
|
636
|
+
title: "Custom hook declared outside hooks root"
|
|
637
|
+
title_vi: "Hook tự viết nằm ngoài thư mục hooks"
|
|
638
|
+
meaning_vi: "Một hook useX do dự án tự viết được khai báo ngoài thư mục hooks đã cấu hình."
|
|
639
|
+
causes_vi:
|
|
640
|
+
- "Viết hook ngay trong file thành phần"
|
|
641
|
+
- "Đặt hook ở thư mục khác"
|
|
642
|
+
nextStep_vi: "Op interface.implement chuyển hook vào thư mục hooks."
|
|
643
|
+
owner: other-op:interface.implement
|
|
644
|
+
kind: check-finding
|
|
645
|
+
|
|
646
|
+
FE_ERROR_BOUNDARY_MISSING:
|
|
647
|
+
title: "Next app lacks a required error or loading boundary"
|
|
648
|
+
title_vi: "Ứng dụng Next thiếu trang lỗi hoặc trang đang tải bắt buộc"
|
|
649
|
+
meaning_vi: "Mỗi ứng dụng Next phải có global-error.tsx, error.tsx, not-found.tsx và loading.tsx trong src/app theo bảng kê HFS. Thiếu chúng thì khi trang gặp lỗi, không tìm thấy hoặc đang tải, người dùng sẽ thấy màn hình mặc định của khung phần mềm hoặc màn hình trắng thay vì giao diện của sản phẩm."
|
|
650
|
+
causes_vi:
|
|
651
|
+
- "Ứng dụng mới được dựng mà chưa thêm các trang biên lỗi"
|
|
652
|
+
- "Trang lỗi được đặt sai thư mục, ví dụ ngoài src/app/[locale]/"
|
|
653
|
+
- "Tệp bị xoá hoặc đổi tên trong lúc dọn dẹp"
|
|
654
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để thêm tệp còn thiếu vào đúng src/app hoặc src/app/[locale]; giao diện của các trang này do người thiết kế duyệt."
|
|
655
|
+
owner: op-retry
|
|
656
|
+
kind: check-finding
|
|
657
|
+
|
|
658
|
+
FE_HOOKS_ARE_HOOKS:
|
|
659
|
+
title: "`hooks/` hold hooks and one shared file per domain"
|
|
660
|
+
title_vi: "hooks/ chứa thứ không phải hook"
|
|
661
|
+
meaning_vi: "`<file>` trong `hooks/` không phải React hook, hoặc một domain có nhiều hơn một tệp `.shared.ts` (hay tệp shared không mang tên domain), hoặc một helper được khai báo ở nhiều tệp của domain. Reader server về `modules/api`, helper về `<domain>.shared.ts`."
|
|
662
|
+
causes_vi:
|
|
663
|
+
- "Vi phạm luật R56: `hooks/<domain>/` chỉ chứa `use*.ts` và một `<domain>.shared.ts` cho helper dùng chung; reader server nằm ở `modules/api/<domain>/read-*.ts` (bọc `cache()`)."
|
|
664
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
665
|
+
owner: op-retry
|
|
666
|
+
kind: check-finding
|
|
667
|
+
|
|
668
|
+
FE_HREF_RESOLVES:
|
|
669
|
+
title: "Link points to a route that does not exist"
|
|
670
|
+
title_vi: "Liên kết trỏ tới đường dẫn không tồn tại"
|
|
671
|
+
meaning_vi: "Một liên kết viết thẳng trong code (href, redirect hoặc router.push) trỏ tới đường dẫn mà không tệp page.tsx hay route.ts nào của ứng dụng phục vụ. Người dùng bấm vào sẽ gặp trang 404."
|
|
672
|
+
causes_vi:
|
|
673
|
+
- "Gõ sai đường dẫn hoặc đổi tên route mà quên sửa liên kết"
|
|
674
|
+
- "Route đã bị xoá hoặc chưa được tạo"
|
|
675
|
+
- "Thiếu một tham số động trong đường dẫn so với cấu trúc thư mục route"
|
|
676
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa liên kết cho khớp route thật hoặc tạo route còn thiếu; không cần ai can thiệp thêm."
|
|
677
|
+
owner: op-retry
|
|
678
|
+
kind: check-finding
|
|
679
|
+
|
|
680
|
+
FE_I18N_CATALOG:
|
|
681
|
+
title: "Same keys in every catalog, real catalog in specs, `pick` for clients"
|
|
682
|
+
title_vi: "Catalog ngôn ngữ lệch key"
|
|
683
|
+
meaning_vi: "Catalog `<locale>` thiếu/thừa key `<k>`."
|
|
684
|
+
causes_vi:
|
|
685
|
+
- "Vi phạm luật R60: Catalog các locale cùng tập key; không key thừa/thiếu; spec dùng catalog thật (không mock `useTranslations` trả key); catalog tách namespace, client chỉ nhận `pick`."
|
|
686
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
687
|
+
owner: op-retry
|
|
688
|
+
kind: check-finding
|
|
689
|
+
|
|
690
|
+
FE_I18N_KEYS:
|
|
691
|
+
title: "Catalog keys and the source that reads them agree"
|
|
692
|
+
title_vi: "Khóa catalog và mã nguồn đọc chúng không khớp"
|
|
693
|
+
meaning_vi: "Mã nguồn đọc khóa `<key>` mà một locale không có, hoặc catalog `<f>` giữ khóa `<key>` mà không đoạn mã nào của app hay của package dùng chung đọc tới."
|
|
694
|
+
causes_vi:
|
|
695
|
+
- "Vi phạm luật R106: khóa đọc bằng literal qua `next-intl` (`t`, `t.rich`, `t.raw`, `t.markup`) phải có trong mọi locale; khóa của catalog mà không chuỗi nào trong mã nguồn có thể đang đọc thì phải xóa."
|
|
696
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: thêm khóa vào mọi catalog của app hoặc đọc khóa có thật; xóa khóa chết khỏi mọi catalog; không thêm ngoại lệ."
|
|
697
|
+
owner: op-retry
|
|
698
|
+
kind: check-finding
|
|
699
|
+
|
|
700
|
+
FE_I18N_PLACEMENT:
|
|
701
|
+
title: "`next-intl`, `[locale]`, `modules/i18n/`"
|
|
702
|
+
title_vi: "i18n sai chuẩn next-intl"
|
|
703
|
+
meaning_vi: "i18n của app `<a>` không theo chuẩn (`<detail>`)."
|
|
704
|
+
causes_vi:
|
|
705
|
+
- "Vi phạm luật R59: `next-intl`, segment `[locale]`, `modules/i18n/{config,routing,navigation,request}.ts` + `modules/i18n/messages/<locale>.json`; app một ngôn ngữ vẫn dùng next-intl với một locale."
|
|
706
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
707
|
+
owner: op-retry
|
|
708
|
+
kind: check-finding
|
|
709
|
+
|
|
710
|
+
FE_NO_TESTS:
|
|
711
|
+
title: "Front end holds a test file, test tooling or a test dependency"
|
|
712
|
+
title_vi: "Front end có tệp test, công cụ test hoặc thư viện test"
|
|
713
|
+
meaning_vi: "Chuẩn của front end là không có test: repository có spec, e2e, cấu hình vitest, Playwright hay jest, script test, hoặc khai báo thư viện chạy test, dựng môi trường test, testing-library, axe trong package.json."
|
|
714
|
+
causes_vi:
|
|
715
|
+
- "Viết spec hoặc e2e cho component, hook hay trang"
|
|
716
|
+
- "Thêm vitest, Playwright, jest, testing-library hoặc axe vào package.json"
|
|
717
|
+
- "Thêm script test hoặc cấu hình test vào repository front end"
|
|
718
|
+
nextStep_vi: "Xóa tệp, cấu hình, script và thư viện test đó; front end không có ngoại lệ, kể cả thư mục scripts/. Kiểm tra giao diện bằng lint, typecheck và hfs check."
|
|
719
|
+
owner: op-retry
|
|
720
|
+
kind: check-finding
|
|
721
|
+
|
|
722
|
+
FE_OWNER_REACHABLE:
|
|
723
|
+
title: "Page feature not mounted by a route"
|
|
724
|
+
title_vi: "Feature trang chưa được route nào gắn vào"
|
|
725
|
+
meaning_vi: "Một feature trang, layout hoặc overlay của frontend không có đường import chạy thật từ bất kỳ tệp nào trong cây route của ứng dụng (thư mục src/app). Người dùng sẽ không bao giờ thấy nó vì không route nào hiển thị."
|
|
726
|
+
causes_vi:
|
|
727
|
+
- "Quên import feature vào page.tsx hoặc layout.tsx tương ứng"
|
|
728
|
+
- "Route chỉ import kiểu của feature chứ không render nó"
|
|
729
|
+
- "Feature đã bị thay thế nhưng thư mục cũ vẫn còn"
|
|
730
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để gắn feature vào route đúng hoặc xoá feature không dùng; không cần ai can thiệp thêm."
|
|
731
|
+
owner: op-retry
|
|
732
|
+
kind: check-finding
|
|
733
|
+
|
|
734
|
+
FE_PACKAGE_SHAPE:
|
|
735
|
+
title: "Packages build to `dist` with explicit exports and no dead unit"
|
|
736
|
+
title_vi: "Gói dùng chung sai hình dạng"
|
|
737
|
+
meaning_vi: "Package `<p>` export source chưa build (hoặc `export *`, hoặc unit không ai dùng)."
|
|
738
|
+
causes_vi:
|
|
739
|
+
- "Vi phạm luật R63: `packages/*` build ra `dist`, `exports` tường minh, không `export *`, không unit chết; package UI chỉ chứa composites/branches/leaves + CSS token của family."
|
|
740
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ."
|
|
741
|
+
owner: op-retry
|
|
742
|
+
kind: check-finding
|
|
743
|
+
|
|
744
|
+
FE_PURE_REACHES_DATA:
|
|
745
|
+
title: "Pure component reaches hooks or API"
|
|
746
|
+
title_vi: "Thành phần thuần chạm tới hook hoặc API"
|
|
747
|
+
meaning_vi: "Tệp component.tsx thuần lại nhập được hook hoặc lớp truyền tải API, kể cả qua alias hay barrel."
|
|
748
|
+
causes_vi:
|
|
749
|
+
- "Nhập hook dữ liệu vào thành phần thuần"
|
|
750
|
+
- "Đường nhập gián tiếp đưa hook vào"
|
|
751
|
+
nextStep_vi: "Op interface.implement đưa phần dữ liệu lên index.tsx kết nối và giữ component.tsx thuần."
|
|
752
|
+
owner: other-op:interface.implement
|
|
753
|
+
kind: check-finding
|
|
754
|
+
|
|
755
|
+
FE_PURE_WORLD_HOOK:
|
|
756
|
+
title: "Pure component uses a world hook"
|
|
757
|
+
title_vi: "Thành phần thuần dùng hook của thế giới sản phẩm"
|
|
758
|
+
meaning_vi: "Tệp component.tsx thuần dùng hook về trạng thái thế giới, thứ mà index.tsx kết nối mới được giữ."
|
|
759
|
+
causes_vi:
|
|
760
|
+
- "Gọi hook điều hướng, ngôn ngữ hay phiên trong thành phần thuần"
|
|
761
|
+
- "Chưa tách bản thuần khỏi bản kết nối"
|
|
762
|
+
nextStep_vi: "Op interface.implement chuyển hook sang index.tsx và truyền dữ liệu xuống qua props."
|
|
763
|
+
owner: other-op:interface.implement
|
|
764
|
+
kind: check-finding
|
|
765
|
+
|
|
766
|
+
FE_PURE_WORLD_IMPORT:
|
|
767
|
+
title: "Pure component imports router or locale"
|
|
768
|
+
title_vi: "Thành phần thuần nhập bộ định tuyến hoặc ngôn ngữ"
|
|
769
|
+
meaning_vi: "Tệp component.tsx thuần nhập module về định tuyến hoặc ngôn ngữ, việc chỉ index.tsx kết nối được làm."
|
|
770
|
+
causes_vi:
|
|
771
|
+
- "Nhập next/navigation hoặc thư viện dịch trong thành phần thuần"
|
|
772
|
+
- "Bản thuần và bản kết nối chưa được tách"
|
|
773
|
+
nextStep_vi: "Op interface.implement bỏ nhập này khỏi component.tsx và để index.tsx truyền vào."
|
|
774
|
+
owner: other-op:interface.implement
|
|
775
|
+
kind: check-finding
|
|
776
|
+
|
|
777
|
+
FE_ROUTE_CLIENT_BOUNDARY:
|
|
778
|
+
title: "Route page owns client boundary"
|
|
779
|
+
title_vi: "Trang route tự khai báo phía client"
|
|
780
|
+
meaning_vi: "Tệp page.tsx mang chỉ thị client, việc này route adapter phía máy chủ không được làm."
|
|
781
|
+
causes_vi:
|
|
782
|
+
- "Thêm use client vào page.tsx"
|
|
783
|
+
- "Gộp giao diện tương tác vào route"
|
|
784
|
+
nextStep_vi: "Op interface.implement bỏ chỉ thị client khỏi page.tsx và đặt nó ở thành phần được mount."
|
|
785
|
+
owner: other-op:interface.implement
|
|
786
|
+
kind: check-finding
|
|
787
|
+
|
|
788
|
+
FE_ROUTE_CLIENT_HOOK:
|
|
789
|
+
title: "Server route imports a client hook"
|
|
790
|
+
title_vi: "Route máy chủ nhập hook phía client"
|
|
791
|
+
meaning_vi: "Tệp page.tsx phía máy chủ nhập hook chỉ dùng được ở phía client."
|
|
792
|
+
causes_vi:
|
|
793
|
+
- "Dùng useX ngay trong page.tsx"
|
|
794
|
+
- "Nhập hook vào route thay vì thành phần"
|
|
795
|
+
nextStep_vi: "Op interface.implement chuyển hook sang thành phần được page.tsx mount."
|
|
796
|
+
owner: other-op:interface.implement
|
|
797
|
+
kind: check-finding
|
|
798
|
+
|
|
799
|
+
FE_ROUTE_DEFAULT_EXPORT:
|
|
800
|
+
title: "Page has no single default export"
|
|
801
|
+
title_vi: "Trang route thiếu một export mặc định duy nhất"
|
|
802
|
+
meaning_vi: "Tệp page.tsx phải mặc định export đúng một hàm route cục bộ nhưng không làm vậy."
|
|
803
|
+
causes_vi:
|
|
804
|
+
- "Thiếu export default"
|
|
805
|
+
- "Export mặc định là thứ khác hàm route"
|
|
806
|
+
nextStep_vi: "Op interface.implement khai báo const Page và kết thúc bằng export default Page."
|
|
807
|
+
owner: other-op:interface.implement
|
|
808
|
+
kind: check-finding
|
|
809
|
+
|
|
810
|
+
FE_ROUTE_DRAWING_DECISION:
|
|
811
|
+
title: "Route makes a visual composition choice"
|
|
812
|
+
title_vi: "Route tự quyết định bố cục hiển thị"
|
|
813
|
+
meaning_vi: "Tệp route chọn hoặc bỏ phần bố cục hình ảnh, việc chỉ redirect hoặc notFound mới được làm."
|
|
814
|
+
causes_vi:
|
|
815
|
+
- "Có điều kiện chọn giao diện ngay trong page.tsx"
|
|
816
|
+
- "Trộn logic hiển thị vào route"
|
|
817
|
+
nextStep_vi: "Op interface.implement đưa quyết định bố cục vào thành phần trang, route chỉ còn redirect hoặc notFound."
|
|
818
|
+
owner: other-op:interface.implement
|
|
819
|
+
kind: check-finding
|
|
820
|
+
|
|
821
|
+
FE_ROUTE_FILES_THIN:
|
|
822
|
+
title: "Route files mount one owner; Next conventions (`proxy.ts`, metadata)"
|
|
823
|
+
title_vi: "Tệp route không mỏng"
|
|
824
|
+
meaning_vi: "Tệp route `<file>` `<what>`. Route chỉ nhận input framework rồi mount một owner."
|
|
825
|
+
causes_vi:
|
|
826
|
+
- "Vi phạm luật R54: Luật route áp cho mọi tệp route (`page/layout/template/loading/not-found`): không component inline, không vẽ, không hook; `force-dynamic` cấm trên page client; redirect cũ nằm ở `next.config` `redirects()`."
|
|
827
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
828
|
+
owner: op-retry
|
|
829
|
+
kind: check-finding
|
|
830
|
+
|
|
831
|
+
FE_ROUTE_ONE_PAGE:
|
|
832
|
+
title: "Route must mount exactly one page"
|
|
833
|
+
title_vi: "Route phải mount đúng một thành phần trang"
|
|
834
|
+
meaning_vi: "Tệp page.tsx phải mount đúng một thành phần cấp trang, hoặc chỉ redirect và notFound không có JSX."
|
|
835
|
+
causes_vi:
|
|
836
|
+
- "Mount nhiều thành phần hoặc thành phần sai tầng"
|
|
837
|
+
- "Vừa có JSX vừa redirect"
|
|
838
|
+
nextStep_vi: "Op interface.implement sửa route để chỉ mount một thành phần trang."
|
|
839
|
+
owner: other-op:interface.implement
|
|
840
|
+
kind: check-finding
|
|
841
|
+
|
|
842
|
+
FE_SLOT_FILE_ROLE:
|
|
843
|
+
title: "A front-end file is owned by a slot and named by it"
|
|
844
|
+
title_vi: "Tệp không đúng vai trò trong slot"
|
|
845
|
+
meaning_vi: "Tệp `<f>` nằm trong slot `<s>` nhưng tên của nó không thuộc danh sách `allows` của slot (ví dụ `page.tsx` trong hooks, đoạn `[lang]` dưới `app/`, `*.test.tsx` cạnh component), hoặc là tệp đặt ở chỗ slot cần một thư mục."
|
|
846
|
+
causes_vi:
|
|
847
|
+
- "Vi phạm luật R94: mỗi slot thư mục của front end (route, feature, components, hooks, modules/api) chỉ chứa các tệp mà `allows` của nó gọi tên, và chứa chúng trong thư mục riêng; tệp không slot nào sở hữu là HFS_PATH_NO_SLOT."
|
|
848
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: đổi tên tệp về vai trò được phép hoặc chuyển nó về slot đúng; không thêm ngoại lệ."
|
|
849
|
+
owner: op-retry
|
|
850
|
+
kind: check-finding
|
|
851
|
+
|
|
852
|
+
FE_SOURCE_LAYOUT_INVALID:
|
|
853
|
+
title: "Frontend source in wrong folder"
|
|
854
|
+
title_vi: "Mã giao diện nằm sai thư mục"
|
|
855
|
+
meaning_vi: "Mã sản phẩm frontend không thuộc app, features, components, hooks hoặc modules, cũng không phải tệp gốc framework yêu cầu."
|
|
856
|
+
causes_vi:
|
|
857
|
+
- "Đặt tệp ở thư mục không có chủ sở hữu"
|
|
858
|
+
- "Tính năng chứa thứ không phải trang, layout hay overlay"
|
|
859
|
+
nextStep_vi: "Op interface.implement chuyển tệp về đúng thư mục theo cấu trúc chuẩn."
|
|
860
|
+
owner: other-op:interface.implement
|
|
861
|
+
kind: check-finding
|
|
862
|
+
|
|
863
|
+
FE_SWR_KEY_IDENTITY:
|
|
864
|
+
title: "SWR key misses an identity"
|
|
865
|
+
title_vi: "Khóa SWR thiếu thông tin định danh"
|
|
866
|
+
meaning_vi: "Hook SWR không dùng null khi thiếu đầu vào hoặc khóa chưa chứa đủ định danh của kết quả."
|
|
867
|
+
causes_vi:
|
|
868
|
+
- "Khóa thiếu định danh người xem hoặc tham số"
|
|
869
|
+
- "Không trả null khi thiếu đầu vào"
|
|
870
|
+
nextStep_vi: "Op interface.implement sửa khóa để chứa đủ định danh và dùng null khi thiếu đầu vào."
|
|
871
|
+
owner: other-op:interface.implement
|
|
872
|
+
kind: check-finding
|
|
873
|
+
|
|
874
|
+
FE_SWR_MUTATION_RESOURCE_IDENTITY:
|
|
875
|
+
title: "SWR mutation not tied to resource"
|
|
876
|
+
title_vi: "Thao tác ghi SWR chưa gắn với tài nguyên"
|
|
877
|
+
meaning_vi: "Thao tác thay đổi dữ liệu của hook SWR không giữ định danh tài nguyên mà nó tác động."
|
|
878
|
+
causes_vi:
|
|
879
|
+
- "Mutation dùng khóa chung không chỉ tài nguyên"
|
|
880
|
+
- "Thiếu định danh tài nguyên khi làm mới"
|
|
881
|
+
nextStep_vi: "Op interface.implement gắn định danh tài nguyên vào khóa của thao tác ghi."
|
|
882
|
+
owner: other-op:interface.implement
|
|
883
|
+
kind: check-finding
|
|
884
|
+
|
|
885
|
+
FE_TIER_DIRECTION:
|
|
886
|
+
title: "Frontend import against the tier direction"
|
|
887
|
+
title_vi: "Frontend import ngược chiều tầng"
|
|
888
|
+
meaning_vi: "Một tệp frontend import từ tầng mà bảng kê HFS không cho phép: route chỉ nhìn xuống feature, feature chỉ nhìn xuống components, hooks và modules, hai feature không bao giờ import nhau, và một lớp component chỉ import các lớp đứng sau nó (blocks, composites, branches, leaves)."
|
|
889
|
+
causes_vi:
|
|
890
|
+
- "Một feature import một feature khác thay vì đưa phần dùng chung xuống components, hooks hoặc modules"
|
|
891
|
+
- "Một component import ngược lên lớp cao hơn hoặc lên feature"
|
|
892
|
+
- "Một module import hooks hoặc components"
|
|
893
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để chuyển phần dùng chung xuống tầng thấp hơn rồi cho cả hai bên import từ đó; không cần ai can thiệp thêm."
|
|
894
|
+
owner: op-retry
|
|
895
|
+
kind: check-finding
|
|
896
|
+
|
|
897
|
+
FE_TRANSPORT_OWNER:
|
|
898
|
+
title: "One `fetch`, in the repository's one transport client, with timeout and abort"
|
|
899
|
+
title_vi: "fetch ngoài client duy nhất"
|
|
900
|
+
meaning_vi: "`fetch` ở `<file>` ngoài client truyền tải duy nhất của repository (gọi, gán lại hoặc truyền như giá trị), thư viện HTTP khác được import, reader `read-*.ts` không đi qua client, repository có nhiều hơn một client hoặc nhiều hơn một union `Outcome` (mỗi app giữ một bản, hoặc gói api cộng thêm một bản của app), hoặc state dùng chung dạng `let`."
|
|
901
|
+
causes_vi:
|
|
902
|
+
- "Vi phạm luật R50: Mỗi repository đúng một client `fetch`, có timeout + `AbortSignal`: `packages/<family>-api/src/client.ts` khi các app dùng chung, hoặc `modules/api/client.ts` của app duy nhất; không singleton `let` giữ token/locale; credential truyền bằng tham số/context."
|
|
903
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ."
|
|
904
|
+
owner: op-retry
|
|
905
|
+
kind: check-finding
|
|
906
|
+
|
|
907
|
+
FE_WIRE_GENERATED:
|
|
908
|
+
title: "Wire types generated from the contract copy"
|
|
909
|
+
title_vi: "Kiểu wire gõ tay"
|
|
910
|
+
meaning_vi: "`<file>` tự gõ kiểu wire/ép kiểu phản hồi. Dùng kiểu sinh từ `contract/`."
|
|
911
|
+
causes_vi:
|
|
912
|
+
- "Vi phạm luật R52: Kiểu wire sinh từ bản hợp đồng (`codegen`); tài liệu GraphQL trong `.graphql`; cấm `as GraphqlResult<T>`; enum wire không phải `string`."
|
|
913
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ."
|
|
914
|
+
owner: op-retry
|
|
915
|
+
kind: check-finding
|
|
916
|
+
|
|
917
|
+
FE_WORLD_OWNER_RENDER_BOUNDARY:
|
|
918
|
+
title: "World-state owner renders inline"
|
|
919
|
+
title_vi: "Nơi giữ trạng thái sản phẩm tự render trực tiếp"
|
|
920
|
+
meaning_vi: "Thành phần đọc trạng thái sản phẩm không giao mọi đường render cho hàm hoặc thành phần thuần đã xác định."
|
|
921
|
+
causes_vi:
|
|
922
|
+
- "Viết JSX trực tiếp trong thành phần đọc dữ liệu"
|
|
923
|
+
- "Chưa có thành phần thuần tương ứng"
|
|
924
|
+
nextStep_vi: "Op interface.implement tách phần hiển thị sang thành phần thuần và giao cho nó."
|
|
925
|
+
owner: other-op:interface.implement
|
|
926
|
+
kind: check-finding
|
|
927
|
+
|
|
928
|
+
HFS_ALIAS_REEXPORT:
|
|
929
|
+
title: "A declaration re-exported under a second name"
|
|
930
|
+
title_vi: "Xuất lại một khai báo dưới tên thứ hai"
|
|
931
|
+
meaning_vi: "Mã sản xuất dùng `export { X as Y }`, `export { default as Y }`, `export * as ns`, hoặc khai báo xuất `const Y = X`, `type Y = X`, `interface Y extends X {}` chỉ để đặt tên thứ hai cho một khai báo khác của repo: một khai báo có hai tên, nên người đọc và công cụ tìm kiếm phải đoán hai tên là một. Luật áp cho cả backend lẫn frontend."
|
|
932
|
+
causes_vi:
|
|
933
|
+
- "Cửa vào của owner đổi tên một khai báo để tránh trùng tên với khai báo cùng tên ở owner khác"
|
|
934
|
+
- "Đổi tên tạm để giữ tên cũ cho nơi dùng cũ"
|
|
935
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để đổi tên chính khai báo cho đúng nghĩa, hoặc import và xuất nó bằng tên của nó; không giữ tên cũ song song."
|
|
936
|
+
owner: op-retry
|
|
937
|
+
kind: check-finding
|
|
938
|
+
|
|
939
|
+
HFS_APPS_REQUIRED:
|
|
940
|
+
title: "Repository has no apps directory"
|
|
941
|
+
title_vi: "Kho mã không có thư mục apps"
|
|
942
|
+
meaning_vi: "Kho HFS phải là monorepo apps/<app>/ và có ít nhất một ứng dụng nhưng chưa có."
|
|
943
|
+
causes_vi:
|
|
944
|
+
- "Chưa tạo thư mục apps"
|
|
945
|
+
- "Mã còn nằm ở gốc kho"
|
|
946
|
+
nextStep_vi: "Op dựng khung (backend.scaffold hoặc interface.scaffold) tạo apps/<app> theo bố cục HFS."
|
|
947
|
+
owner: other-op:backend.scaffold
|
|
948
|
+
kind: check-finding
|
|
949
|
+
|
|
950
|
+
HFS_APP_LAYOUT_INVALID:
|
|
951
|
+
title: "App directory layout invalid"
|
|
952
|
+
title_vi: "Bố cục thư mục ứng dụng chưa đúng"
|
|
953
|
+
meaning_vi: "Mục dưới apps/ không phải thư mục, hoặc thiếu các tệp mà slot của loại ứng dụng đó yêu cầu (requires; ví dụ ứng dụng migrate không cần app.module.ts)."
|
|
954
|
+
causes_vi:
|
|
955
|
+
- "Có tệp lẻ trong apps/"
|
|
956
|
+
- "Ứng dụng thiếu tệp bắt buộc"
|
|
957
|
+
nextStep_vi: "Op dựng khung sửa bố cục ứng dụng theo HFS rồi kiểm tra lại."
|
|
958
|
+
owner: other-op:backend.scaffold
|
|
959
|
+
kind: check-finding
|
|
960
|
+
|
|
961
|
+
HFS_ARCH_CONFIG_UNREAD:
|
|
962
|
+
title: "The machine reads `hfs.json`; zero files analysed is red"
|
|
963
|
+
title_vi: "Máy kiến trúc không đọc được hfs.json"
|
|
964
|
+
meaning_vi: "Kiểm tra kiến trúc không đọc được `hfs.json` phân tích 0 tệp, hoặc repo còn một tệp cấu hình mà máy không đọc nữa (`architecture.json`) — đây là đỏ, không phải 'chưa có dữ liệu'."
|
|
965
|
+
causes_vi:
|
|
966
|
+
- "Vi phạm luật R24: Máy kiến trúc tự đọc `hfs.json`; phân tích 0 tệp hay `unavailable` cho một profile đã khai = thất bại."
|
|
967
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
968
|
+
owner: op-retry
|
|
969
|
+
kind: check-finding
|
|
970
|
+
|
|
1
971
|
HFS_CANON_PIN_DRIFT:
|
|
2
972
|
title: "Dependency version differs from the canon pin"
|
|
3
973
|
title_vi: "Phiên bản phụ thuộc lệch khỏi bản đã ghim"
|
|
@@ -10,6 +980,26 @@ HFS_CANON_PIN_DRIFT:
|
|
|
10
980
|
owner: op-retry
|
|
11
981
|
kind: check-finding
|
|
12
982
|
|
|
983
|
+
HFS_CI_MISSING_CANON:
|
|
984
|
+
title: "CI runs the pinned `@starci/hfs check`; pre-push runs typecheck and lint"
|
|
985
|
+
title_vi: "CI thiếu bước canon"
|
|
986
|
+
meaning_vi: "Workflow/husky thiếu bước `<step>`. Cấu trúc chỉ được kiểm khi agent chạy — CI phải tự kiểm."
|
|
987
|
+
causes_vi:
|
|
988
|
+
- "Vi phạm luật R13: CI phải chạy `npx @starci/hfs check` (bản pin); pre-push phải có `typecheck` + `lint:check`."
|
|
989
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
990
|
+
owner: op-retry
|
|
991
|
+
kind: check-finding
|
|
992
|
+
|
|
993
|
+
HFS_CONTRACT_SNAPSHOT_DRIFT:
|
|
994
|
+
title: "Contract snapshot equals the emit, the FE copy equals the BE"
|
|
995
|
+
title_vi: "Bản hợp đồng lệch bản thật"
|
|
996
|
+
meaning_vi: "Hợp đồng `<file>` lệch bản thật (`<sha>` ≠ `<sha>`). Chạy `npm run contract:emit` (BE) / `contract:pull` (FE) rồi commit kết quả. Nếu emit không chạy được thì finding nêu nguyên văn lỗi của emit; không bao giờ bỏ qua âm thầm."
|
|
997
|
+
causes_vi:
|
|
998
|
+
- "Vi phạm luật R23: BE: `contracts/<app>/schema.graphql` và `contracts/<app>/openapi.json` (sinh từ bảng thao tác có kiểu `apps/<app>/src/operations.ts`) phải bằng bản `hfs emit-contracts` phát ra ngay lúc kiểm tra (đồ thị module đọc từ mã nguồn, không cần env, DB hay mạng); chỉ chạy ở lượt kiểm tra đầy đủ, `--fast` bỏ qua và nói rõ trong phần coverage. FE: `modules/api/contract/*` bằng bản BE (so hash)."
|
|
999
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
1000
|
+
owner: op-retry
|
|
1001
|
+
kind: check-finding
|
|
1002
|
+
|
|
13
1003
|
HFS_DECLARATION_INVALID:
|
|
14
1004
|
title: "hfs.json missing or invalid"
|
|
15
1005
|
title_vi: "hfs.json thiếu hoặc sai định dạng"
|
|
@@ -23,6 +1013,71 @@ HFS_DECLARATION_INVALID:
|
|
|
23
1013
|
owner: op-retry
|
|
24
1014
|
kind: check-finding
|
|
25
1015
|
|
|
1016
|
+
HFS_DEP_VERSION_SKEW:
|
|
1017
|
+
title: "One version per dependency in the workspace"
|
|
1018
|
+
title_vi: "Một gói nhiều phiên bản"
|
|
1019
|
+
meaning_vi: "`<pkg>` có `<n>` version trong workspace (`<list>`). Chỉ được một."
|
|
1020
|
+
causes_vi:
|
|
1021
|
+
- "Vi phạm luật R14: Mỗi dependency một version trong workspace; cấm bản sao lồng thứ hai (`apps/*/node_modules/@starci/grammar`)."
|
|
1022
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1023
|
+
owner: op-retry
|
|
1024
|
+
kind: check-finding
|
|
1025
|
+
|
|
1026
|
+
HFS_DOC_NOT_ENGLISH:
|
|
1027
|
+
title: "Document is not English"
|
|
1028
|
+
title_vi: "Tài liệu không viết bằng tiếng Anh"
|
|
1029
|
+
meaning_vi: "Tệp Markdown hoặc YAML trong knowledge/, docs/, src/ hoặc apps/ có chữ cái tiếng Việt (kể cả trong khối mã của Markdown); tài liệu, mẫu và ví dụ phải viết bằng tiếng Anh."
|
|
1030
|
+
causes_vi:
|
|
1031
|
+
- "Viết hoặc dán đoạn tiếng Việt vào tài liệu, mẫu, ví dụ hay lời trích của chủ dự án"
|
|
1032
|
+
- "Đặt dữ liệu YAML có tiếng Việt ngoài slot danh mục thông điệp hoặc slot fixture i18n"
|
|
1033
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: dịch dòng được nêu sang tiếng Anh. Chỉ dữ liệu YAML trong slot danh mục thông điệp hoặc slot fixture i18n được giữ tiếng khác; không thêm ngoại lệ."
|
|
1034
|
+
owner: op-retry
|
|
1035
|
+
kind: check-finding
|
|
1036
|
+
|
|
1037
|
+
HFS_DUPLICATE_CODE:
|
|
1038
|
+
title: "Duplicated code block"
|
|
1039
|
+
title_vi: "Mã trùng lặp"
|
|
1040
|
+
meaning_vi: "Một đoạn mã (bỏ qua khác biệt về tên biến và giá trị chữ hoặc số) xuất hiện hai lần trong mã sản phẩm: ở hai chủ sở hữu, ở hai tệp của một chủ sở hữu, hoặc hai lần trong một tệp. Ngưỡng số dòng và số token là một định nghĩa duy nhất trong ruleParams.<profile>.duplicateBlock của knowledge/hfs/slots.yaml; lời nhắn của bộ kiểm tra ghi rõ ngưỡng và hai vị trí."
|
|
1041
|
+
causes_vi:
|
|
1042
|
+
- "Op cần một hàm hỗ trợ đã có ở nơi khác nhưng chép lại thay vì dùng chung"
|
|
1043
|
+
- "Hai nơi cùng tự viết một logic giống nhau vì chưa ai đưa nó vào chỗ dùng chung"
|
|
1044
|
+
- "Đoạn mã được chép nguyên rồi chỉ đổi tên biến hoặc hằng số"
|
|
1045
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để đưa đoạn mã về một chỗ duy nhất theo lời nhắn (trong cùng chủ sở hữu, hoặc src/modules/platform/primitives, module miền của năng lực đó, hay packages/* với FE) rồi gọi từ cả hai nơi; không thêm ngoại lệ."
|
|
1046
|
+
owner: op-retry
|
|
1047
|
+
kind: check-finding
|
|
1048
|
+
|
|
1049
|
+
HFS_DUPLICATE_SYMBOL:
|
|
1050
|
+
title: "One exported name declared in two files"
|
|
1051
|
+
title_vi: "Một tên xuất được khai báo ở hai tệp"
|
|
1052
|
+
meaning_vi: "Một tên mà cửa vào công khai (index.ts) của một chủ sở hữu xuất ra, truy về tệp khai báo nó, cũng được một tệp sản xuất khác của repo khai báo và xuất ra (hàm, lớp, hằng, enum, kiểu, interface). Hai bản khai báo cùng tên khiến import nhầm một bản mà trình biên dịch không báo, ví dụ hai decorator cùng tên InjectPrimaryEntityManager cho hai kết nối khác nhau. Việc xuất lại (re-export) một khai báo duy nhất không phải là bản thứ hai. Không có danh sách tên được miễn."
|
|
1053
|
+
causes_vi:
|
|
1054
|
+
- "Hai module cùng tự viết một helper, decorator hoặc kiểu với cùng một tên thay vì dùng chung một bản"
|
|
1055
|
+
- "Mỗi kết nối hoặc mỗi ứng dụng chép nguyên một tệp rồi giữ nguyên tên xuất"
|
|
1056
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để giữ đúng một khai báo (dùng chung qua cửa vào của chủ sở hữu thích hợp) hoặc đổi tên bản còn lại cho đúng nghĩa của nó; không thêm ngoại lệ."
|
|
1057
|
+
owner: op-retry
|
|
1058
|
+
kind: check-finding
|
|
1059
|
+
|
|
1060
|
+
HFS_E2E_IN_AUTOMATIC_GATE:
|
|
1061
|
+
title: "E2E runs in automatic gate"
|
|
1062
|
+
title_vi: "Kiểm thử e2e nằm trong cổng tự động"
|
|
1063
|
+
meaning_vi: "Hook husky hoặc script tự động gọi cả kiểm thử e2e, trong khi e2e không được nằm trong cổng tự động."
|
|
1064
|
+
causes_vi:
|
|
1065
|
+
- "Pre-commit hoặc pre-push chạy e2e"
|
|
1066
|
+
- "Script lint:check kéo e2e vào"
|
|
1067
|
+
nextStep_vi: "Op backend.scaffold gỡ e2e khỏi hook và script tự động."
|
|
1068
|
+
owner: other-op:backend.scaffold
|
|
1069
|
+
kind: check-finding
|
|
1070
|
+
|
|
1071
|
+
HFS_EMPTY_DIR:
|
|
1072
|
+
title: "No empty directory outside an `ignored` slot"
|
|
1073
|
+
title_vi: "Thư mục rỗng còn sót lại"
|
|
1074
|
+
meaning_vi: "Có thư mục không có tệp nào bên dưới (kể cả các thư mục con cũng rỗng). Git không theo dõi thư mục rỗng nên nó chỉ là dấu vết của cấu trúc đã đổi tên hoặc đã xóa. Xóa thư mục."
|
|
1075
|
+
causes_vi:
|
|
1076
|
+
- "Vi phạm luật R03: cấu trúc bị đổi tên hoặc tệp bị xóa mà thư mục cũ không được dọn (vd `src/modules/business/*` còn trống bên cạnh `domain/*`)."
|
|
1077
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1078
|
+
owner: op-retry
|
|
1079
|
+
kind: check-finding
|
|
1080
|
+
|
|
26
1081
|
HFS_FORBIDDEN_PRESENT:
|
|
27
1082
|
title: "Tracked path in a forbidden slot"
|
|
28
1083
|
title_vi: "Có tệp bị cấm trong cây mã nguồn"
|
|
@@ -35,6 +1090,57 @@ HFS_FORBIDDEN_PRESENT:
|
|
|
35
1090
|
owner: op-retry
|
|
36
1091
|
kind: check-finding
|
|
37
1092
|
|
|
1093
|
+
HFS_FORMAT:
|
|
1094
|
+
title: "Prettier is the only formatter"
|
|
1095
|
+
title_vi: "Chưa format bằng Prettier"
|
|
1096
|
+
meaning_vi: "`<file>` chưa được format. Chạy `npm run format`."
|
|
1097
|
+
causes_vi:
|
|
1098
|
+
- "Vi phạm luật R19: Prettier (config `@starci/prettier-config`) là formatter duy nhất; ESLint không còn luật định dạng."
|
|
1099
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1100
|
+
owner: op-retry
|
|
1101
|
+
kind: check-finding
|
|
1102
|
+
|
|
1103
|
+
HFS_FORMAT_TOOL_MISSING:
|
|
1104
|
+
title: "The repository's own prettier is not installed"
|
|
1105
|
+
title_vi: "Kho chưa cài prettier của chính nó"
|
|
1106
|
+
meaning_vi: "Kiểm tra định dạng (R19) chạy prettier của chính kho. Kho chưa cài prettier nên không thể xác nhận định dạng, và trạng thái đó không bao giờ được tính là đạt."
|
|
1107
|
+
causes_vi:
|
|
1108
|
+
- "Chưa chạy `npm ci` trong kho"
|
|
1109
|
+
- "prettier không nằm trong devDependencies của kho"
|
|
1110
|
+
nextStep_vi: "Cài đúng phiên bản prettier ghi trong canon-pins.yaml (`npm ci`) rồi chạy lại `hfs check`."
|
|
1111
|
+
owner: op-retry
|
|
1112
|
+
kind: input-invalid
|
|
1113
|
+
|
|
1114
|
+
HFS_GHOST_TREE:
|
|
1115
|
+
title: "No empty directory beside a near-identical sibling"
|
|
1116
|
+
title_vi: "Cây thư mục ma cạnh thư mục gần trùng tên"
|
|
1117
|
+
meaning_vi: "Có thư mục rỗng mà tên chỉ khác vài ký tự so với thư mục anh em cùng cấp (thông báo nêu cả hai), tức là bản đổi tên hoặc gõ sai của cùng một cấu trúc chưa được dọn. Giữ bản có tệp, xóa bản rỗng."
|
|
1118
|
+
causes_vi:
|
|
1119
|
+
- "Vi phạm luật R03: đổi tên cấu trúc để lại bản cũ hoặc bản gõ sai (vd `business` và `bussiness`)."
|
|
1120
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1121
|
+
owner: op-retry
|
|
1122
|
+
kind: check-finding
|
|
1123
|
+
|
|
1124
|
+
HFS_GITIGNORE_BLOCK_DRIFT:
|
|
1125
|
+
title: "The managed `.gitignore` block equals its render"
|
|
1126
|
+
title_vi: "Khối .gitignore lệch bản render"
|
|
1127
|
+
meaning_vi: "Khối .gitignore chuẩn đã bị sửa tay hoặc thiếu dòng `<rule>`. Chạy `hfs sync`."
|
|
1128
|
+
causes_vi:
|
|
1129
|
+
- "Vi phạm luật R04: Khối `.gitignore` do `.claude` quản lý phải trùng bản render (never-tracked list, deny `.env*`, cache)."
|
|
1130
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1131
|
+
owner: op-retry
|
|
1132
|
+
kind: check-finding
|
|
1133
|
+
|
|
1134
|
+
HFS_HOOKS_PATH_REDIRECTED:
|
|
1135
|
+
title: "A clone redirects core.hooksPath away from husky"
|
|
1136
|
+
title_vi: "core.hooksPath bị đổi hướng khỏi husky"
|
|
1137
|
+
meaning_vi: "Cấu hình Git cục bộ của bản clone đặt `core.hooksPath` trỏ ra ngoài `.husky`, nên hook pre-commit và pre-push không chạy và cổng mà mọi clone khác phải qua đã bị bỏ qua. Chỉ xét khi thư mục được kiểm tra chính là gốc work tree Git của nó; một thư mục nằm trong clone khác (một ví dụ trong clone runtime) không có hook riêng nên không bị xét."
|
|
1138
|
+
causes_vi:
|
|
1139
|
+
- "Vi phạm luật R13: pre-push chạy typecheck và lint, và không clone nào được đổi `core.hooksPath` để né husky; giá trị duy nhất được phép là `.husky` hoặc `.husky/_` do chính husky đặt."
|
|
1140
|
+
nextStep_vi: "Gỡ cấu hình bằng `git config --local --unset core.hooksPath` rồi commit lại qua hook; không dùng `--no-verify` và không đổi đường dẫn hook để né kiểm tra."
|
|
1141
|
+
owner: op-retry
|
|
1142
|
+
kind: check-finding
|
|
1143
|
+
|
|
38
1144
|
HFS_INIT_EXISTS:
|
|
39
1145
|
title: "hfs.json already exists"
|
|
40
1146
|
title_vi: "hfs.json đã có sẵn"
|
|
@@ -56,6 +1162,26 @@ HFS_INIT_UNDETECTED:
|
|
|
56
1162
|
owner: op-retry
|
|
57
1163
|
kind: verb-refusal
|
|
58
1164
|
|
|
1165
|
+
HFS_LINT_SUPPRESSION_FILE:
|
|
1166
|
+
title: "A repository keeps no lint-suppression file, script or option"
|
|
1167
|
+
title_vi: "Kho có tệp hoặc script ghi nhận bỏ qua lỗi lint"
|
|
1168
|
+
meaning_vi: "Kho có tệp, script hoặc tùy chọn ghi nhận lỗi lint để bỏ qua ở `<f>`: `eslint.suppressions*`, script `lint:suppressions`, cờ `--suppress-all`/`--suppressions-location`, hoặc cấu hình eslint có `suppressions`."
|
|
1169
|
+
causes_vi:
|
|
1170
|
+
- "Vi phạm luật R104: lỗi lint được sửa trong mã (hoặc luật được đổi trong canon); không ghi nhận để lỗi nằm lại trong tệp suppressions."
|
|
1171
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: xóa tệp, script hoặc cờ, và sửa các lỗi lint trong mã."
|
|
1172
|
+
owner: op-retry
|
|
1173
|
+
kind: check-finding
|
|
1174
|
+
|
|
1175
|
+
HFS_MANAGED_FILE_DRIFT:
|
|
1176
|
+
title: "A managed file equals its template render"
|
|
1177
|
+
title_vi: "Tệp do .claude quản lý bị lệch"
|
|
1178
|
+
meaning_vi: "`<file>` do `.claude` quản lý nhưng nội dung lệch bản render từ template. Chạy `hfs sync --write`, không sửa tay."
|
|
1179
|
+
causes_vi:
|
|
1180
|
+
- "Vi phạm luật R05: Tệp trong slot có `managedBy` của slots.yaml (tsconfig, jest.config.js, .prettierrc, .prettierignore, husky, workflows, sonar, khối `scripts` của package.json) phải bằng bản render từ template; danh sách tệp nằm trong slots.yaml, không nằm trong mã."
|
|
1181
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1182
|
+
owner: op-retry
|
|
1183
|
+
kind: check-finding
|
|
1184
|
+
|
|
59
1185
|
HFS_MANIFEST_INVALID:
|
|
60
1186
|
title: "HFS slot manifest invalid"
|
|
61
1187
|
title_vi: "Bảng kê ô HFS sai định dạng"
|
|
@@ -90,15 +1216,143 @@ HFS_MIN_INSTANCES:
|
|
|
90
1216
|
owner: op-retry
|
|
91
1217
|
kind: check-finding
|
|
92
1218
|
|
|
93
|
-
|
|
94
|
-
title: "
|
|
95
|
-
title_vi: "
|
|
96
|
-
meaning_vi: "
|
|
1219
|
+
HFS_MODULE_TIER_INVALID:
|
|
1220
|
+
title: "Module tier name is not allowed"
|
|
1221
|
+
title_vi: "Tên tầng module không hợp lệ"
|
|
1222
|
+
meaning_vi: "Trong src/modules có thư mục tầng không thuộc domain, platform hoặc integrations."
|
|
97
1223
|
causes_vi:
|
|
98
|
-
- "
|
|
99
|
-
- "
|
|
100
|
-
|
|
101
|
-
|
|
1224
|
+
- "Đặt tên tầng tự do"
|
|
1225
|
+
- "Sai chính tả tên tầng"
|
|
1226
|
+
nextStep_vi: "Op backend.implement chuyển module về một trong ba tầng hợp lệ."
|
|
1227
|
+
owner: other-op:backend.implement
|
|
1228
|
+
kind: check-finding
|
|
1229
|
+
|
|
1230
|
+
HFS_PACKAGE_MANAGER_MIXED:
|
|
1231
|
+
title: "Package manager mixed with npm"
|
|
1232
|
+
title_vi: "Trộn trình quản lý gói khác với npm"
|
|
1233
|
+
meaning_vi: "Trường packageManager trong package.json mâu thuẫn với hợp đồng dùng npm và package-lock.json."
|
|
1234
|
+
causes_vi:
|
|
1235
|
+
- "Khai pnpm hoặc yarn trong package.json"
|
|
1236
|
+
- "Còn tệp khóa của trình khác"
|
|
1237
|
+
nextStep_vi: "Op dựng khung đưa packageManager về npm rồi kiểm tra lại."
|
|
1238
|
+
owner: other-op:backend.scaffold
|
|
1239
|
+
kind: check-finding
|
|
1240
|
+
|
|
1241
|
+
HFS_PLAINTEXT_SECRET:
|
|
1242
|
+
title: "Secrets exist only as `.starcistacks/<env>/secrets/<slug>.enc`"
|
|
1243
|
+
title_vi: "Bí mật dạng rõ trong kho"
|
|
1244
|
+
meaning_vi: "Tìm thấy bí mật dạng rõ ở `<path>`. Bí mật chỉ được nằm ở `.starcistacks/<env>/secrets/<slug>.enc` (sops). Không đọc, không in giá trị."
|
|
1245
|
+
causes_vi:
|
|
1246
|
+
- "Vi phạm luật R06: Bí mật chỉ tồn tại ở `.starcistacks/<env>/secrets/<slug>.enc`. Mọi `.env*`, `.secrets/`, `*.key\\|*.pem` plaintext, `runtime/files/*` đều bị từ chối, kể cả khi ignore."
|
|
1247
|
+
nextStep_vi: "Không đọc và không in giá trị. Chủ kho mã hoá bí mật bằng sops vào .starcistacks/<môi-trường>/secrets/<slug>.enc, sau đó xoá tệp rõ; agent không tạo hay xoay khoá."
|
|
1248
|
+
owner: owner
|
|
1249
|
+
kind: check-finding
|
|
1250
|
+
|
|
1251
|
+
HFS_PROOF_COMMAND_FILE_MISSING:
|
|
1252
|
+
title: "A proof command names only files the repository holds"
|
|
1253
|
+
title_vi: "Lệnh chứng minh trỏ tới tệp không tồn tại"
|
|
1254
|
+
meaning_vi: "Lệnh `requiresProof.<kind>.command` của hồ sơ `.starciwork` `<f>` chạy tệp `<path>` mà kho không có, nên không thể chạy đúng như đã viết."
|
|
1255
|
+
causes_vi:
|
|
1256
|
+
- "Vi phạm luật R105: lệnh chứng minh phải chạy được nguyên văn; tệp spec, script hay cấu hình mà nó nêu tên phải có trong kho (script đã xóa thì kế hoạch chứng minh phải được viết lại)."
|
|
1257
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: tạo tệp được nêu hoặc viết lại kế hoạch chứng minh (ví dụ thành một spec e2e trên world); không thêm ngoại lệ."
|
|
1258
|
+
owner: op-retry
|
|
1259
|
+
kind: check-finding
|
|
1260
|
+
|
|
1261
|
+
HFS_README_BADGE_NOT_LIVE:
|
|
1262
|
+
title: "README badge is not a live service"
|
|
1263
|
+
title_vi: "Huy hiệu README không phải dịch vụ ngoài đang chạy"
|
|
1264
|
+
meaning_vi: "Một huy hiệu trong README không trỏ tới dịch vụ ngoài HTTPS đang hoạt động."
|
|
1265
|
+
causes_vi:
|
|
1266
|
+
- "Dùng huy hiệu tĩnh hoặc địa chỉ nội bộ"
|
|
1267
|
+
- "Địa chỉ huy hiệu không hợp lệ"
|
|
1268
|
+
nextStep_vi: "Op docs.author thay bằng huy hiệu từ dịch vụ ngoài HTTPS thật."
|
|
1269
|
+
owner: other-op:docs.author
|
|
1270
|
+
kind: check-finding
|
|
1271
|
+
|
|
1272
|
+
HFS_README_DESCRIPTION_INVALID:
|
|
1273
|
+
title: "README description line invalid"
|
|
1274
|
+
title_vi: "Dòng mô tả trong README chưa đúng"
|
|
1275
|
+
meaning_vi: "README thiếu một dòng mô tả ngắn ngay dưới tên kho."
|
|
1276
|
+
causes_vi:
|
|
1277
|
+
- "Không có dòng mô tả dưới tiêu đề"
|
|
1278
|
+
- "Mô tả dài nhiều dòng"
|
|
1279
|
+
nextStep_vi: "Op docs.author thêm một dòng mô tả ngắn ngay dưới tiêu đề."
|
|
1280
|
+
owner: other-op:docs.author
|
|
1281
|
+
kind: check-finding
|
|
1282
|
+
|
|
1283
|
+
HFS_README_DEVELOPMENT_INCOMPLETE:
|
|
1284
|
+
title: "README Development section incomplete"
|
|
1285
|
+
title_vi: "Mục Development trong README chưa đủ lệnh"
|
|
1286
|
+
meaning_vi: "Mục Development chưa nêu đủ các lệnh cài đặt, typecheck, lint:check, build và test (các script do hfs sync quản lý; test chạy bằng npm test)."
|
|
1287
|
+
causes_vi:
|
|
1288
|
+
- "Quên một hoặc vài lệnh"
|
|
1289
|
+
- "Viết bằng lệnh của trình quản lý khác"
|
|
1290
|
+
nextStep_vi: "Op docs.author bổ sung đủ các lệnh npm còn thiếu."
|
|
1291
|
+
owner: other-op:docs.author
|
|
1292
|
+
kind: check-finding
|
|
1293
|
+
|
|
1294
|
+
HFS_README_PRIVATE_URL:
|
|
1295
|
+
title: "README links a private host"
|
|
1296
|
+
title_vi: "README chứa địa chỉ nội bộ hoặc cục bộ"
|
|
1297
|
+
meaning_vi: "README có địa chỉ trỏ tới máy cục bộ hoặc mạng riêng."
|
|
1298
|
+
causes_vi:
|
|
1299
|
+
- "Để nguyên địa chỉ localhost hoặc IP riêng"
|
|
1300
|
+
- "Dán nhầm liên kết nội bộ"
|
|
1301
|
+
nextStep_vi: "Op docs.author xóa hoặc thay bằng địa chỉ công khai."
|
|
1302
|
+
owner: other-op:docs.author
|
|
1303
|
+
kind: check-finding
|
|
1304
|
+
|
|
1305
|
+
HFS_README_SECTION_MISSING:
|
|
1306
|
+
title: "README lacks a standard section"
|
|
1307
|
+
title_vi: "README thiếu một mục chuẩn"
|
|
1308
|
+
meaning_vi: "README thiếu một trong các mục chuẩn: Overview, Stack, Repository layout, Development."
|
|
1309
|
+
causes_vi:
|
|
1310
|
+
- "Chưa viết mục đó"
|
|
1311
|
+
- "Đặt sai cấp tiêu đề (không phải ##)"
|
|
1312
|
+
nextStep_vi: "Op docs.author thêm mục còn thiếu bằng tiêu đề ## đúng tên."
|
|
1313
|
+
owner: other-op:docs.author
|
|
1314
|
+
kind: check-finding
|
|
1315
|
+
|
|
1316
|
+
HFS_README_SECTION_ORDER:
|
|
1317
|
+
title: "README sections out of order"
|
|
1318
|
+
title_vi: "Các mục README sai thứ tự"
|
|
1319
|
+
meaning_vi: "Các mục chuẩn của README không theo đúng thứ tự quy định."
|
|
1320
|
+
causes_vi:
|
|
1321
|
+
- "Đặt mục sau trước mục trước"
|
|
1322
|
+
- "Chèn mục thêm làm xáo trộn thứ tự"
|
|
1323
|
+
nextStep_vi: "Op docs.author sắp lại các mục theo thứ tự chuẩn."
|
|
1324
|
+
owner: other-op:docs.author
|
|
1325
|
+
kind: check-finding
|
|
1326
|
+
|
|
1327
|
+
HFS_README_TITLE_INVALID:
|
|
1328
|
+
title: "README title does not match repo name"
|
|
1329
|
+
title_vi: "Tiêu đề README không khớp tên kho"
|
|
1330
|
+
meaning_vi: "Dòng đầu README phải là # kèm tên kho nhưng đang khác."
|
|
1331
|
+
causes_vi:
|
|
1332
|
+
- "Tiêu đề đặt tên khác"
|
|
1333
|
+
- "Kho đổi tên mà README chưa đổi"
|
|
1334
|
+
nextStep_vi: "Op docs.author sửa dòng đầu thành # <tên kho>."
|
|
1335
|
+
owner: other-op:docs.author
|
|
1336
|
+
kind: check-finding
|
|
1337
|
+
|
|
1338
|
+
HFS_README_WORK_POINTER_MISSING:
|
|
1339
|
+
title: "README lacks Work pointer"
|
|
1340
|
+
title_vi: "README thiếu chỉ dẫn tới cây Work"
|
|
1341
|
+
meaning_vi: "README chưa chỉ tới cây .starciwork của kho backend."
|
|
1342
|
+
causes_vi:
|
|
1343
|
+
- "Chưa viết dòng trỏ tới .starciwork"
|
|
1344
|
+
- "Chỉ dẫn viết sai nơi"
|
|
1345
|
+
nextStep_vi: "Op docs.author thêm chỉ dẫn tới cây .starciwork của backend."
|
|
1346
|
+
owner: other-op:docs.author
|
|
1347
|
+
kind: check-finding
|
|
1348
|
+
|
|
1349
|
+
HFS_REPO_LOCAL_CHECK:
|
|
1350
|
+
title: "A repository keeps no check or lint rule of its own"
|
|
1351
|
+
title_vi: "Kho tự giữ bộ kiểm tra riêng"
|
|
1352
|
+
meaning_vi: "Kho có nguồn kiểm tra hoặc luật lint cục bộ ở `<f>`: tệp `check-*` trong `scripts/` hay `tools/`, tệp `eslint-local-rules*`, plugin eslint cục bộ, hoặc script npm chạy một tệp `check-*`."
|
|
1353
|
+
causes_vi:
|
|
1354
|
+
- "Vi phạm luật R103: mọi bộ kiểm tra sống trong runtime `.claude` (hfs check, các canon eslint); kho sản phẩm không giữ bộ kiểm tra hay luật riêng. `scripts/` chỉ chứa script vận hành."
|
|
1355
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra: xóa tệp và script trỏ tới nó; nếu luật còn cần thì đề xuất vào canon trong runtime `.claude`, không giữ bản sao trong kho."
|
|
102
1356
|
owner: op-retry
|
|
103
1357
|
kind: check-finding
|
|
104
1358
|
|
|
@@ -113,15 +1367,81 @@ HFS_REPO_UNREADABLE:
|
|
|
113
1367
|
owner: op-retry
|
|
114
1368
|
kind: input-invalid
|
|
115
1369
|
|
|
116
|
-
|
|
117
|
-
title: "Required file or
|
|
118
|
-
title_vi: "Thiếu tệp
|
|
119
|
-
meaning_vi: "
|
|
1370
|
+
HFS_REQUIRED_FILE_MISSING:
|
|
1371
|
+
title: "Required file, directory or minimum instance is missing"
|
|
1372
|
+
title_vi: "Thiếu tệp, thư mục hoặc số lượng tối thiểu bắt buộc theo bảng kê"
|
|
1373
|
+
meaning_vi: "Bảng kê HFS đòi một tệp hoặc thư mục phải có trong mỗi phần của kho (gói dùng chung, module frontend, api, i18n, tuyến, layout...), hoặc đòi kho có ít nhất một ứng dụng hay tính năng thuộc loại bắt buộc. Mục đó không tồn tại; khi là số lượng tối thiểu thì báo tại hfs.json. Thiếu nó thì phần liên quan chưa hoạt động đầy đủ hoặc kho chưa phải một sản phẩm hoàn chỉnh."
|
|
120
1374
|
causes_vi:
|
|
121
|
-
- "
|
|
122
|
-
- "
|
|
123
|
-
- "Kho
|
|
124
|
-
nextStep_vi: "
|
|
1375
|
+
- "Tạo thư mục mới nhưng chưa thêm tệp bắt buộc như index.ts, client.ts, outcome.ts hoặc package.json"
|
|
1376
|
+
- "Tệp có nhưng tên hoặc chỗ đặt khác với bảng kê"
|
|
1377
|
+
- "Kho chưa có tính năng hoặc ứng dụng nào của loại bắt buộc"
|
|
1378
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để tạo tệp còn thiếu đúng chỗ bảng kê chỉ định; nếu cấu trúc hiện có là chủ ý thì đó là việc sửa bảng kê, do người giám sát làm, không phải kho tự đổi."
|
|
1379
|
+
owner: op-retry
|
|
1380
|
+
kind: check-finding
|
|
1381
|
+
|
|
1382
|
+
HFS_ROOT_ENTRY_FORBIDDEN:
|
|
1383
|
+
title: "Root entry not on HFS allowlist"
|
|
1384
|
+
title_vi: "Mục ở thư mục gốc không được phép"
|
|
1385
|
+
meaning_vi: "Ở thư mục gốc của repo có một tệp hoặc thư mục không nằm trong các gốc mà slot của repo khai báo (ví dụ contracts/ cho ảnh chụp hợp đồng)."
|
|
1386
|
+
causes_vi:
|
|
1387
|
+
- "Worker tạo thêm tệp hoặc thư mục ngay ở gốc repo"
|
|
1388
|
+
- "Tệp cũ chưa được dời vào đúng chỗ của nó"
|
|
1389
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op vừa tạo ra mục đó phải dời nó vào thư mục sở hữu rồi chạy lại kiểm tra."
|
|
1390
|
+
owner: op-retry
|
|
1391
|
+
kind: check-finding
|
|
1392
|
+
|
|
1393
|
+
HFS_ROOT_ENTRY_MISSING:
|
|
1394
|
+
title: "Required root entry is missing"
|
|
1395
|
+
title_vi: "Thiếu mục bắt buộc ở thư mục gốc"
|
|
1396
|
+
meaning_vi: "Repo thiếu một tệp hoặc thư mục mà cấu trúc chuẩn bắt buộc phải có ở gốc, hoặc README.md không đọc được."
|
|
1397
|
+
causes_vi:
|
|
1398
|
+
- "Repo mới chưa được dựng khung đầy đủ"
|
|
1399
|
+
- "Tệp gốc bị xóa hoặc chưa được commit"
|
|
1400
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op đang làm việc phải tạo mục còn thiếu rồi chạy lại kiểm tra."
|
|
1401
|
+
owner: op-retry
|
|
1402
|
+
kind: check-finding
|
|
1403
|
+
|
|
1404
|
+
HFS_ROOT_MARKDOWN_FORBIDDEN:
|
|
1405
|
+
title: "Markdown file at repository root"
|
|
1406
|
+
title_vi: "Tệp Markdown đặt ở thư mục gốc"
|
|
1407
|
+
meaning_vi: "Có một tệp Markdown nằm ngay ở gốc repo, trong khi tài liệu phải nằm trong thư mục docs hoặc hồ sơ Work của nó."
|
|
1408
|
+
causes_vi:
|
|
1409
|
+
- "Worker ghi ghi chú hoặc báo cáo thẳng ra gốc repo"
|
|
1410
|
+
- "Tài liệu cũ chưa được dời đi"
|
|
1411
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải chuyển tệp vào docs/ hoặc hồ sơ Work rồi chạy lại."
|
|
1412
|
+
owner: op-retry
|
|
1413
|
+
kind: check-finding
|
|
1414
|
+
|
|
1415
|
+
HFS_ROOT_SRC_FORBIDDEN_FE:
|
|
1416
|
+
title: "Root src folder in frontend repo"
|
|
1417
|
+
title_vi: "Repo giao diện có thư mục src ở gốc"
|
|
1418
|
+
meaning_vi: "Repo giao diện có thư mục src ngay ở gốc, trong khi mã nguồn chỉ được đặt trong apps/<tên app>/src."
|
|
1419
|
+
causes_vi:
|
|
1420
|
+
- "Dự án giao diện được dựng theo kiểu một app đơn"
|
|
1421
|
+
- "Worker tạo mã ngoài thư mục app"
|
|
1422
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải chuyển toàn bộ src vào apps/<app>/src rồi chạy lại."
|
|
1423
|
+
owner: op-retry
|
|
1424
|
+
kind: check-finding
|
|
1425
|
+
|
|
1426
|
+
HFS_RULE_OFF_WITHOUT_REPLACEMENT:
|
|
1427
|
+
title: "The ESLint configuration (and a front end's stylelint configuration) is the rendered one-liner, so no rule is off, warned or redefined in a repository"
|
|
1428
|
+
title_vi: "Cấu hình ESLint hoặc stylelint lệch bản render"
|
|
1429
|
+
meaning_vi: "`eslint.config.mjs` (hoặc `stylelint.config.mjs` của front end) khác bản render (một dòng gọi `starciBeConfig`, `starciFeConfig` hoặc `starciStylelintConfig`). Factory không nhận tham số ghi đè, nên một luật chỉ có thể bị tắt, hạ mức hoặc định nghĩa lại trong repo khi tệp này khác bản render. Chạy `hfs sync --write`, không sửa tay."
|
|
1430
|
+
causes_vi:
|
|
1431
|
+
- "Vi phạm luật R17: `eslint.config.mjs` phải đúng bằng bản render; luật thay thế nằm trong plugin của `.claude`, không bao giờ tắt trong repo."
|
|
1432
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
1433
|
+
owner: op-retry
|
|
1434
|
+
kind: check-finding
|
|
1435
|
+
|
|
1436
|
+
HFS_SIZE_GROWTH:
|
|
1437
|
+
title: "Source file over the size budget grew"
|
|
1438
|
+
title_vi: "Tệp mã nguồn vượt hạn mức dòng vẫn tiếp tục dài thêm"
|
|
1439
|
+
meaning_vi: "Một tệp mã nguồn đã dài hơn hạn mức mềm của ruleParams.fileLines nhưng lại dài thêm so với phiên bản gốc của nhánh, hoặc một tệp mới tạo đã vượt hạn mức ngay từ đầu. Tệp quá dài khó đọc, khó sửa và là nơi lỗi dễ ẩn; quy tắc này cho phép tệp cũ đang quá dài được giữ nguyên hoặc thu nhỏ dần, nhưng không cho phép nó phình thêm."
|
|
1440
|
+
causes_vi:
|
|
1441
|
+
- "Op thêm mã mới vào một tệp vốn đã quá hạn mức thay vì tách phần mới sang tệp khác"
|
|
1442
|
+
- "Một tệp đang dưới hạn mức được thêm mã cho đến khi vượt hạn mức"
|
|
1443
|
+
- "Một tệp mới tạo dài hơn hạn mức, hoặc một tệp bị di chuyển sang đường dẫn mới nên bị coi là tệp mới"
|
|
1444
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để tách phần mã mới (hoặc bớt phần cũ) sang tệp riêng đúng ô của nó, sao cho tệp không dài hơn phiên bản gốc và tệp mới nằm trong hạn mức."
|
|
125
1445
|
owner: op-retry
|
|
126
1446
|
kind: check-finding
|
|
127
1447
|
|
|
@@ -157,6 +1477,95 @@ HFS_SLOT_NOT_ENABLED:
|
|
|
157
1477
|
owner: op-retry
|
|
158
1478
|
kind: check-finding
|
|
159
1479
|
|
|
1480
|
+
HFS_SLOT_REQUIRED_MISSING:
|
|
1481
|
+
title: "A slot is missing a required file (feature `index.ts`, app composition spec, FE `global-error.tsx`)"
|
|
1482
|
+
title_vi: "Ô thiếu tệp bắt buộc"
|
|
1483
|
+
meaning_vi: "Một ô bắt buộc (hoặc một thực thể của ô, như một ứng dụng hay một tính năng) đòi có tệp hoặc thư mục này nhưng nó không nằm trong những gì Git theo dõi."
|
|
1484
|
+
causes_vi:
|
|
1485
|
+
- "Vi phạm luật R02: slot bắt buộc thiếu tệp `requires` (vd feature thiếu `index.ts`, app thiếu composition spec, FE thiếu `global-error.tsx`)."
|
|
1486
|
+
- "Ứng dụng thiếu main.ts, app.module.ts hoặc spec ghép ứng dụng"
|
|
1487
|
+
- "Kho thiếu tệp gốc bắt buộc như README.md, hfs.json, .starciwork, .starcistacks"
|
|
1488
|
+
nextStep_vi: "Tạo tệp hoặc thư mục theo mẫu của ô rồi commit; tệp chưa git add vẫn tính là thiếu. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
1489
|
+
owner: op-retry
|
|
1490
|
+
kind: check-finding
|
|
1491
|
+
|
|
1492
|
+
HFS_SLOT_UNDECLARED:
|
|
1493
|
+
title: "Every tracked path matches exactly one slot"
|
|
1494
|
+
title_vi: "Đường dẫn không thuộc ô nào"
|
|
1495
|
+
meaning_vi: "Một tệp hoặc thư mục trong kho không thuộc ô nào trong bảng kê; mọi đường dẫn được theo dõi phải khớp đúng một ô. Bộ kiểm tra báo kèm ô gần nhất để biết tệp lẽ ra thuộc đâu."
|
|
1496
|
+
causes_vi:
|
|
1497
|
+
- "Vi phạm luật R01: mọi path được track phải khớp đúng một slot trong `knowledge/hfs/slots.yaml` (thay allowlist gốc)."
|
|
1498
|
+
- "Tệp đặt sai chỗ, ví dụ một tệp không phải *.e2e-spec.ts nằm trong thư mục kiểm thử e2e"
|
|
1499
|
+
- "Thư mục do kho tự đặt ở gốc hoặc trong src mà HFS không có ô cho nó"
|
|
1500
|
+
- "Tên tệp hoặc thư mục viết sai so với mẫu của ô gần nhất"
|
|
1501
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để chuyển tệp vào ô gần nhất được báo hoặc xoá nó; nếu thực sự cần một loại nội dung mới thì đó là việc thêm ô vào bảng kê, do người giám sát làm, không phải kho tự thêm."
|
|
1502
|
+
owner: op-retry
|
|
1503
|
+
kind: check-finding
|
|
1504
|
+
|
|
1505
|
+
HFS_SONAR_CONFIG:
|
|
1506
|
+
title: "Sonar config is generated, with no host URL and no coverage import"
|
|
1507
|
+
title_vi: "Cấu hình Sonar lệch"
|
|
1508
|
+
meaning_vi: "Cấu hình Sonar lệch: `<detail>`. Sonar phải đọc đúng cấu hình sinh ra, không nhập báo cáo độ phủ."
|
|
1509
|
+
causes_vi:
|
|
1510
|
+
- "Vi phạm luật R11: `sonar-project.properties` do template sinh: không `sonar.host.url`, `sources`/`tests` không chồng, `sonar.exclusions` = đúng danh sách loại trừ của jest, không nhập lcov hay `sonar.coverage.*`, không nhắc kiểu spec đã bỏ, và nhận báo cáo ESLint cùng tệp nhập lỗi HFS (`sonar.eslint.reportPaths`, `sonar.externalIssuesReportPaths`) để mọi lỗi canon hiện trong Sonar."
|
|
1511
|
+
- "Khối `services.sonar.qualityGate` của khai báo stack phải gọi đúng cổng chất lượng duy nhất của `knowledge/sonar-gate.yaml`; repo không tự ghi ngưỡng."
|
|
1512
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1513
|
+
owner: op-retry
|
|
1514
|
+
kind: check-finding
|
|
1515
|
+
|
|
1516
|
+
HFS_SRC_LAYOUT_INVALID:
|
|
1517
|
+
title: "Backend src holds unexpected folders"
|
|
1518
|
+
title_vi: "Thư mục src của backend có mục lạ"
|
|
1519
|
+
meaning_vi: "Trong src của repo backend có thư mục nằm ngoài ba nơi cho phép là features, modules và tests, hoặc trong src/tests có thư mục ngoài các slot be.tests.* (world, fixtures, integration, e2e, contract)."
|
|
1520
|
+
causes_vi:
|
|
1521
|
+
- "Worker tạo thư mục mới ngay dưới src"
|
|
1522
|
+
- "Mã cũ chưa được dời về đúng feature hoặc module"
|
|
1523
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải dời thư mục đó về nơi sở hữu nó rồi chạy lại."
|
|
1524
|
+
owner: op-retry
|
|
1525
|
+
kind: check-finding
|
|
1526
|
+
|
|
1527
|
+
HFS_STACKS_IN_FE:
|
|
1528
|
+
title: "Stack declarations in frontend repo"
|
|
1529
|
+
title_vi: "Khai báo stack nằm trong repo giao diện"
|
|
1530
|
+
meaning_vi: "Repo giao diện đang chứa thư mục .starcistacks, trong khi khai báo stack chỉ được đặt ở repo backend."
|
|
1531
|
+
causes_vi:
|
|
1532
|
+
- "Sao chép nhầm thư mục stack từ backend sang"
|
|
1533
|
+
- "Worker tạo stack ở sai repo"
|
|
1534
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải xóa thư mục khỏi repo giao diện và đặt khai báo ở backend."
|
|
1535
|
+
owner: op-retry
|
|
1536
|
+
kind: check-finding
|
|
1537
|
+
|
|
1538
|
+
HFS_STACKS_SHAPE:
|
|
1539
|
+
title: "`.starcistacks` has the standard shape and the host Sonar owner"
|
|
1540
|
+
title_vi: "Hình dạng .starcistacks sai"
|
|
1541
|
+
meaning_vi: "`.starcistacks` có `<path>` ngoài hình dạng chuẩn (danh sách allows của slot be.starcistacks, gồm cả infra/metadata.json) (hoặc còn trỏ `.stacks`)."
|
|
1542
|
+
causes_vi:
|
|
1543
|
+
- "Vi phạm luật R10: `.starcistacks/<env>/` chỉ có `README.md`, `environment.json`, `infra/{compose,k8s,terraform}`, `runtime/{config,env}`, `secrets/`, `seeds/`; khối sonar là `owner: host` trỏ `.claude/ext/sonar`; không còn gốc `.stacks`."
|
|
1544
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1545
|
+
owner: op-retry
|
|
1546
|
+
kind: check-finding
|
|
1547
|
+
|
|
1548
|
+
HFS_TEST_KIND_RETIRED:
|
|
1549
|
+
title: "Retired test kind or extra test config"
|
|
1550
|
+
title_vi: "Dùng loại test đã bỏ hoặc cấu hình test thừa"
|
|
1551
|
+
meaning_vi: "Có tệp test thuộc loại đã bị loại bỏ, hoặc một cấu hình jest hay Playwright riêng thay vì một cấu hình chung ở gốc."
|
|
1552
|
+
causes_vi:
|
|
1553
|
+
- "Viết spec tích hợp hoặc harness theo kiểu cũ"
|
|
1554
|
+
- "Tạo thêm tệp cấu hình test cho riêng từng nhóm"
|
|
1555
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải đổi tệp thành unit hoặc e2e và bỏ cấu hình thừa rồi chạy lại."
|
|
1556
|
+
owner: op-retry
|
|
1557
|
+
kind: check-finding
|
|
1558
|
+
|
|
1559
|
+
HFS_TOOL_CONFIG_LOCAL:
|
|
1560
|
+
title: "Configs only call the factories; no local rules"
|
|
1561
|
+
title_vi: "Kho tự đặt luật cục bộ"
|
|
1562
|
+
meaning_vi: "Repo có cấu hình công cụ cục bộ ở `<file>`: tệp cấu hình ngoài bộ được quản lý (`.eslintrc*`, `.eslintignore`, `eslint.config.*` hay `stylelint.config.*` thứ hai, cấu hình prettier/lint-staged khác), tệp tự định nghĩa luật ESLint hoặc plugin stylelint, khóa cấu hình công cụ trong `package.json` (`eslintConfig`, `stylelint`, `prettier`, `lint-staged`, `jest`), hoặc lệnh chạy eslint/stylelint/prettier với cờ đổi cấu hình (`--rule`, `--no-inline-config`, `--no-eslintrc`, `--config`, `--ignore-pattern`). Luật chung nằm trong `.claude`; đề xuất thay đổi ở đó."
|
|
1563
|
+
causes_vi:
|
|
1564
|
+
- "Vi phạm luật R16: Cấu hình của repo chỉ gọi factory của `.claude`; cấm tệp cấu hình công cụ khác, tệp luật cục bộ (vd một tệp eslint-local trong thư mục scripts) và cờ dòng lệnh đổi hoặc tắt cấu hình trong hook, workflow, script."
|
|
1565
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1566
|
+
owner: op-retry
|
|
1567
|
+
kind: check-finding
|
|
1568
|
+
|
|
160
1569
|
HFS_TRACKED_MUST_BE_IGNORED:
|
|
161
1570
|
title: "Tracked path that must be gitignored"
|
|
162
1571
|
title_vi: "Tệp bị theo dõi nhưng lẽ ra phải bị bỏ qua"
|
|
@@ -167,3 +1576,58 @@ HFS_TRACKED_MUST_BE_IGNORED:
|
|
|
167
1576
|
nextStep_vi: "Gỡ tệp khỏi Git bằng git rm --cached và thêm vào khối .gitignore chuẩn; không xoá thư mục trên đĩa. Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra; không cần ai can thiệp thêm."
|
|
168
1577
|
owner: op-retry
|
|
169
1578
|
kind: check-finding
|
|
1579
|
+
|
|
1580
|
+
HFS_TS_STRICT:
|
|
1581
|
+
title: "tsconfig extends `@starci/tsconfig` and lowers no flag"
|
|
1582
|
+
title_vi: "tsconfig hạ cờ strict"
|
|
1583
|
+
meaning_vi: "`tsconfig.json` đặt hoặc hạ cờ `<flag>`. `tsconfig.json` chỉ extends `@starci/tsconfig/be.json` và khai báo `paths` của ba alias; mọi cờ do preset quy định."
|
|
1584
|
+
causes_vi:
|
|
1585
|
+
- "Vi phạm luật R22: `tsconfig.json` chỉ có `extends` và `paths`; các cờ `strict`, `noUncheckedIndexedAccess`, `noImplicitOverride`, `noImplicitReturns`, `noFallthroughCasesInSwitch`, `noUnusedLocals`, `noUnusedParameters`, `allowJs: false` nằm trong preset và repo không đặt, không hạ cờ nào."
|
|
1586
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1587
|
+
owner: op-retry
|
|
1588
|
+
kind: check-finding
|
|
1589
|
+
|
|
1590
|
+
HFS_UNTRACKED_ROOT_ENTRY:
|
|
1591
|
+
title: "No untracked or ignored entry outside an `ignored` slot"
|
|
1592
|
+
title_vi: "Mục lạ ở gốc kho"
|
|
1593
|
+
meaning_vi: "Có mục chưa được git theo dõi, cũng không nằm trong `.gitignore` hay slot `ignored`, nên HFS không cho phép nó tồn tại trong cây làm việc. Theo dõi nó vào đúng slot, hoặc lưu trữ ra `D:/starci-archive/` rồi xóa."
|
|
1594
|
+
causes_vi:
|
|
1595
|
+
- "Vi phạm luật R03: Thư mục làm việc không được có mục untracked/ignored ngoài slot `ignored` (vd `nul`, `.qwen/`, `.worktrees/`, `design-plans/`, `express`)."
|
|
1596
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (nợ hàng loạt có codemod của HFS); không cần ai can thiệp thêm."
|
|
1597
|
+
owner: op-retry
|
|
1598
|
+
kind: check-finding
|
|
1599
|
+
|
|
1600
|
+
HFS_UNUSED_EXPORT:
|
|
1601
|
+
title: "Public export that nothing outside the module uses"
|
|
1602
|
+
title_vi: "Tên xuất công khai mà không nơi nào bên ngoài dùng"
|
|
1603
|
+
meaning_vi: "Cửa vào công khai (index.ts) của một module, tính năng hoặc gói đang xuất ra một tên mà không tệp sản xuất nào nằm ngoài module đó import. Tệp kiểm thử không được tính là nơi dùng. Tên thừa ở cửa vào làm bề mặt công khai phình to, khiến người sau tưởng có thể dựa vào nó và làm việc thay đổi module khó hơn."
|
|
1604
|
+
causes_vi:
|
|
1605
|
+
- "Xuất thêm kiểu, hằng số hoặc hàm 'phòng khi cần' nhưng chưa có nơi nào dùng"
|
|
1606
|
+
- "Nơi từng dùng tên này đã bị xoá hoặc chuyển vào cùng module, còn dòng xuất ở cửa vào bị bỏ sót"
|
|
1607
|
+
- "Tên chỉ được dùng trong tệp kiểm thử, nên với bộ kiểm tra nó vẫn là thừa"
|
|
1608
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để xoá tên khỏi cửa vào (hoặc bỏ luôn phần khai báo nếu không còn ai dùng); nếu tên thực sự cần cho một nơi ngoài module thì nơi đó phải import nó qua cửa vào."
|
|
1609
|
+
owner: op-retry
|
|
1610
|
+
kind: check-finding
|
|
1611
|
+
|
|
1612
|
+
HFS_UNUSED_FILE:
|
|
1613
|
+
title: "Production file that nothing reaches"
|
|
1614
|
+
title_vi: "Tệp mã sản xuất không ai chạm tới"
|
|
1615
|
+
meaning_vi: "Một tệp mã sản xuất không được nối tới từ bất kỳ gốc nào: không phải main.ts hay app.module.ts của một ứng dụng, không phải tệp route, không phải cửa vào của một gói, và không tệp sản xuất nào import nó (kể cả import chỉ kiểu). Tệp kiểm thử không được tính; tệp chỉ có spec dùng vẫn là chết. Không tiến trình nào chạy tệp này."
|
|
1616
|
+
causes_vi:
|
|
1617
|
+
- "Nơi từng import tệp đã bị xoá hoặc chuyển đi, còn tệp bị bỏ sót"
|
|
1618
|
+
- "Tệp được thêm nhưng chưa nối vào module hay cửa vào nào"
|
|
1619
|
+
- "Tệp chỉ được spec dùng"
|
|
1620
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để xoá tệp, hoặc nối nó vào nơi thật sự dùng; không thêm ngoại lệ."
|
|
1621
|
+
owner: op-retry
|
|
1622
|
+
kind: check-finding
|
|
1623
|
+
|
|
1624
|
+
HFS_WORK_IN_FE:
|
|
1625
|
+
title: "Work tree inside frontend repo"
|
|
1626
|
+
title_vi: "Hồ sơ Work nằm trong repo giao diện"
|
|
1627
|
+
meaning_vi: "Repo giao diện chứa thư mục .starciwork, trong khi hồ sơ Work chỉ được lưu ở repo backend."
|
|
1628
|
+
causes_vi:
|
|
1629
|
+
- "Tạo hồ sơ Work nhầm repo"
|
|
1630
|
+
- "Sao chép nguyên cây Work sang repo giao diện"
|
|
1631
|
+
nextStep_vi: "Bộ kiểm kiến trúc từ chối; op phải chuyển hồ sơ sang repo backend rồi chạy lại."
|
|
1632
|
+
owner: op-retry
|
|
1633
|
+
kind: check-finding
|