alp-code 0.9.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 +770 -0
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/alp.config.yaml +5 -0
- package/dist/src/agents/agent-definition.js +28 -0
- package/dist/src/agents/capability-catalog.js +33 -0
- package/dist/src/agents/compaction.js +36 -0
- package/dist/src/agents/errors.js +12 -0
- package/dist/src/agents/librarian.js +38 -0
- package/dist/src/agents/main.js +37 -0
- package/dist/src/agents/memory-grant.js +29 -0
- package/dist/src/agents/model-context.js +70 -0
- package/dist/src/agents/modes.js +134 -0
- package/dist/src/agents/oracle.js +36 -0
- package/dist/src/agents/read-thread.js +38 -0
- package/dist/src/agents/registry.js +238 -0
- package/dist/src/agents/render-identity.js +38 -0
- package/dist/src/agents/review.js +37 -0
- package/dist/src/agents/search.js +37 -0
- package/dist/src/agents/shared/house-rules.js +33 -0
- package/dist/src/agents/shared/principal.js +18 -0
- package/dist/src/agents/shared/voice.js +29 -0
- package/dist/src/agents/titling.js +32 -0
- package/dist/src/agents/types.js +15 -0
- package/dist/src/backend/execution-backend.js +2 -0
- package/dist/src/backend/local-execution-store.js +144 -0
- package/dist/src/backend/local-process-backend.js +533 -0
- package/dist/src/backend/local-supervisor.js +104 -0
- package/dist/src/cli/alp.js +380 -0
- package/dist/src/cli/commands/context.js +203 -0
- package/dist/src/cli/commands/delegate.js +136 -0
- package/dist/src/cli/commands/identity-sync.js +31 -0
- package/dist/src/cli/commands/init.js +184 -0
- package/dist/src/cli/commands/mode.js +22 -0
- package/dist/src/cli/commands/principal.js +114 -0
- package/dist/src/cli/commands/run-main.js +90 -0
- package/dist/src/cli/commands/runtime.js +21 -0
- package/dist/src/cli/mode-preference-store.js +62 -0
- package/dist/src/cli/mode-selector.js +178 -0
- package/dist/src/cli/update-check.js +77 -0
- package/dist/src/context/checkpoint.js +134 -0
- package/dist/src/context/compact-journal.js +153 -0
- package/dist/src/context/compact-payload.js +121 -0
- package/dist/src/context/continuity.js +70 -0
- package/dist/src/context/types.js +2 -0
- package/dist/src/delegation/backend-registry.js +40 -0
- package/dist/src/delegation/delegation-service.js +300 -0
- package/dist/src/delegation/types.js +12 -0
- package/dist/src/execution/execution-policy.js +96 -0
- package/dist/src/execution/execution-service.js +115 -0
- package/dist/src/execution/execution-store.js +78 -0
- package/dist/src/execution/identity-capsule.js +65 -0
- package/dist/src/execution/types.js +12 -0
- package/dist/src/hooks/execution-bridge.js +84 -0
- package/dist/src/index.js +4 -0
- package/dist/src/memory/adapters/markdown-file-store.js +257 -0
- package/dist/src/memory/adapters/memory-api-client.js +2 -0
- package/dist/src/memory/adapters/memory-path-mapper.js +76 -0
- package/dist/src/memory/adapters/remote-api-store.js +25 -0
- package/dist/src/memory/context-ranker.js +21 -0
- package/dist/src/memory/errors.js +58 -0
- package/dist/src/memory/memory-service.js +149 -0
- package/dist/src/memory/memory-store.js +2 -0
- package/dist/src/memory/types.js +2 -0
- package/dist/src/policy/capability-policy.js +29 -0
- package/dist/src/policy/delegation-policy.js +25 -0
- package/dist/src/policy/errors.js +10 -0
- package/dist/src/policy/invariants.js +31 -0
- package/dist/src/policy/memory-policy.js +22 -0
- package/dist/src/policy/policy-engine.js +85 -0
- package/dist/src/policy/types.js +8 -0
- package/dist/src/policy/workspace-policy.js +77 -0
- package/dist/src/principal/principal-profile-store.js +89 -0
- package/dist/src/runtime/adapter-files.js +147 -0
- package/dist/src/runtime/claude-adapter.js +177 -0
- package/dist/src/runtime/codex-adapter.js +169 -0
- package/dist/src/runtime/permission-rules.js +156 -0
- package/dist/src/runtime/render-session-context.js +124 -0
- package/dist/src/runtime/render-task-input.js +33 -0
- package/dist/src/runtime/runtime-adapter.js +2 -0
- package/dist/src/runtime/runtime-preference-store.js +66 -0
- package/dist/src/runtime/runtime-selector.js +178 -0
- package/dist/src/runtime/types.js +2 -0
- package/dist/src/runtime/windows-shim.js +57 -0
- package/dist/src/state-paths.js +49 -0
- package/dist/src/workflow/output-validator.js +27 -0
- package/dist/src/workflow/repair-policy.js +8 -0
- package/dist/src/workflow/types.js +22 -0
- package/dist/src/workflow/workflow-runner.js +81 -0
- package/hooks/compact-record.cjs +109 -0
- package/hooks/session-boot.cjs +112 -0
- package/hooks/session-end.cjs +34 -0
- package/package.json +48 -0
- package/scaffold/memory/INDEX.md +27 -0
- package/scaffold/memory/README.md +76 -0
- package/scaffold/memory/projects/INDEX.md +22 -0
- package/scaffold/memory/projects/PROTOCOL.md +128 -0
- package/scaffold/memory/projects/_template/PROJECT.md +45 -0
- package/scripts/alp.cjs +126 -0
- package/scripts/alp.ps1 +4 -0
- package/scripts/alp.sh +3 -0
- package/scripts/bootstrap.cjs +144 -0
- package/scripts/checkout-release.cjs +30 -0
- package/scripts/delegate.cjs +19 -0
- package/scripts/doctor.cjs +158 -0
- package/scripts/doctor.sh +3 -0
- package/scripts/ensure-state.cjs +22 -0
- package/scripts/lib/cli-link.cjs +375 -0
- package/scripts/lib/codex-role.cjs +18 -0
- package/scripts/lib/delegation/command-runner.cjs +108 -0
- package/scripts/lib/delegation/config.cjs +81 -0
- package/scripts/lib/install-paths.cjs +154 -0
- package/scripts/lib/release-manifest.cjs +42 -0
- package/scripts/lib/semver-lite.cjs +20 -0
- package/scripts/lib/state.cjs +274 -0
- package/scripts/lib/uninstall.cjs +252 -0
- package/scripts/lib/update-check-worker.cjs +21 -0
- package/scripts/lib/update.cjs +395 -0
- package/scripts/run-role.cjs +42 -0
- package/scripts/run-role.ps1 +4 -0
- package/scripts/run-role.sh +3 -0
- package/scripts/sync-project-index.sh +167 -0
- package/skills/agent-memory/SKILL.md +109 -0
- package/skills/alp-debug/SKILL.md +90 -0
- package/skills/alp-debug/references/defense-in-depth.md +118 -0
- package/skills/alp-debug/references/investigation-methodology.md +106 -0
- package/skills/alp-debug/references/log-and-ci-analysis.md +96 -0
- package/skills/alp-debug/references/performance-diagnostics.md +112 -0
- package/skills/alp-debug/references/reporting-standards.md +120 -0
- package/skills/alp-debug/references/root-cause-tracing.md +134 -0
- package/skills/alp-debug/references/systematic-debugging.md +93 -0
- package/skills/alp-debug/references/verification.md +86 -0
- package/skills/alp-debug/scripts/find-polluter.sh +63 -0
- package/skills/alp-debug/scripts/find-polluter.test.md +102 -0
- package/skills/alp-plan/SKILL.md +128 -0
- package/skills/alp-plan/references/archive-workflow.md +77 -0
- package/skills/alp-plan/references/codebase-understanding.md +55 -0
- package/skills/alp-plan/references/output-standards.md +96 -0
- package/skills/alp-plan/references/plan-organization.md +129 -0
- package/skills/alp-plan/references/red-team-personas.md +76 -0
- package/skills/alp-plan/references/red-team-workflow.md +81 -0
- package/skills/alp-plan/references/research-phase.md +57 -0
- package/skills/alp-plan/references/scope-challenge.md +82 -0
- package/skills/alp-plan/references/solution-design.md +76 -0
- package/skills/alp-plan/references/validate-question-framework.md +89 -0
- package/skills/alp-plan/references/validate-workflow.md +83 -0
- package/skills/alp-predict/SKILL.md +98 -0
- package/skills/alp-scenario/SKILL.md +86 -0
- package/skills/code-review/SKILL.md +111 -0
- package/skills/code-review/references/code-review-reception.md +114 -0
- package/skills/code-review/references/edge-case-scouting.md +78 -0
- package/skills/code-review/references/verification-before-completion.md +117 -0
- package/skills/delegation/SKILL.md +46 -0
- package/skills/docs-seeker/.env.example +15 -0
- package/skills/docs-seeker/SKILL.md +87 -0
- package/skills/docs-seeker/package.json +25 -0
- package/skills/docs-seeker/references/advanced.md +82 -0
- package/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/skills/docs-seeker/references/errors.md +72 -0
- package/skills/docs-seeker/scripts/analyze-llms-txt.js +211 -0
- package/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/skills/docs-seeker/scripts/fetch-docs.js +213 -0
- package/skills/docs-seeker/scripts/tests/run-tests.js +72 -0
- package/skills/docs-seeker/scripts/tests/test-analyze-llms.js +119 -0
- package/skills/docs-seeker/scripts/tests/test-detect-topic.js +112 -0
- package/skills/docs-seeker/scripts/tests/test-fetch-docs.js +84 -0
- package/skills/docs-seeker/scripts/utils/env-loader.js +94 -0
- package/skills/docs-seeker/workflows/library-search.md +73 -0
- package/skills/docs-seeker/workflows/repo-analysis.md +90 -0
- package/skills/docs-seeker/workflows/topic-search.md +69 -0
- package/skills/git/SKILL.md +121 -0
- package/skills/git/references/branch-management.md +90 -0
- package/skills/git/references/commit-standards.md +82 -0
- package/skills/git/references/gh-cli-guide.md +132 -0
- package/skills/git/references/safety-protocols.md +86 -0
- package/skills/git/references/workflow-commit.md +89 -0
- package/skills/git/references/workflow-merge.md +63 -0
- package/skills/git/references/workflow-pr.md +70 -0
- package/skills/git/references/workflow-push.md +62 -0
- package/skills/gkg/SKILL.md +87 -0
- package/skills/gkg/references/cli-commands.md +92 -0
- package/skills/gkg/references/http-api.md +99 -0
- package/skills/gkg/references/language-support.md +54 -0
- package/skills/problem-solving/SKILL.md +86 -0
- package/skills/problem-solving/references/attribution.md +48 -0
- package/skills/problem-solving/references/collision-zone-thinking.md +71 -0
- package/skills/problem-solving/references/inversion-exercise.md +88 -0
- package/skills/problem-solving/references/meta-pattern-recognition.md +80 -0
- package/skills/problem-solving/references/scale-game.md +82 -0
- package/skills/problem-solving/references/simplification-cascades.md +83 -0
- package/skills/problem-solving/references/when-stuck.md +76 -0
- package/skills/repomix/SKILL.md +94 -0
- package/skills/repomix/references/configuration.md +134 -0
- package/skills/repomix/references/usage-patterns.md +106 -0
- package/skills/repomix/scripts/.coverage +0 -0
- package/skills/repomix/scripts/README.md +179 -0
- package/skills/repomix/scripts/repomix_batch.py +455 -0
- package/skills/repomix/scripts/repos.example.json +15 -0
- package/skills/repomix/scripts/requirements.txt +15 -0
- package/skills/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/research/SKILL.md +107 -0
- package/skills/security-scan/SKILL.md +101 -0
- package/skills/security-scan/references/secret-patterns.md +75 -0
- package/skills/security-scan/references/vulnerability-patterns.md +136 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Phân tích log và CI/CD
|
|
2
|
+
|
|
3
|
+
## GitHub Actions
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
gh run list --limit 10 # các lần chạy gần đây
|
|
7
|
+
gh run list --workflow=ci.yml --limit 5 # theo workflow
|
|
8
|
+
gh run view <run-id> # chi tiết, trạng thái từng bước
|
|
9
|
+
gh run view <run-id> --log-failed # CHỈ log của job hỏng — bắt đầu ở đây
|
|
10
|
+
gh run view <run-id> --log > /tmp/ci.txt # tải hết
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Luôn bắt đầu bằng `--log-failed`. Tải log đầy đủ trước rồi đọc là cách nhanh nhất để nhấn
|
|
14
|
+
chìm context bằng hàng nghìn dòng xanh.
|
|
15
|
+
|
|
16
|
+
`gh run rerun <run-id> --failed` chạy lại job hỏng — nhưng **đó là thao tác tốn tài nguyên
|
|
17
|
+
và tác động ra ngoài**: báo lại, đừng tự chạy để "xem thử có phải flaky không".
|
|
18
|
+
|
|
19
|
+
### Mẫu hỏng thường gặp
|
|
20
|
+
|
|
21
|
+
| Mẫu | Nguyên nhân hay gặp | Kiểm gì |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| máy chạy được, CI hỏng | khác môi trường | phiên bản Node/Python, OS, biến môi trường |
|
|
24
|
+
| lúc hỏng lúc không | race, test flaky | chạy 3 lần, xem thời điểm, trạng thái dùng chung |
|
|
25
|
+
| timeout | giới hạn tài nguyên, vòng lặp vô hạn | mức dùng tài nguyên, có timeout chưa |
|
|
26
|
+
| lỗi quyền | token/secret sai cấu hình | `GITHUB_TOKEN`, tên secret |
|
|
27
|
+
| cài phụ thuộc hỏng | registry, xung đột phiên bản | lockfile, trạng thái registry |
|
|
28
|
+
| build được, test hỏng | môi trường test | config test, database, fixture |
|
|
29
|
+
|
|
30
|
+
Dòng đầu đáng chú ý nhất: **"máy chạy được, CI hỏng" gần như luôn là khác biệt môi
|
|
31
|
+
trường**, không phải bug trong code. So biến môi trường trước khi đọc code.
|
|
32
|
+
|
|
33
|
+
### Đọc bước hỏng
|
|
34
|
+
|
|
35
|
+
1. `gh run view <id>` — xác định **bước nào** hỏng.
|
|
36
|
+
2. `gh run view <id> --log-failed` — lấy log tập trung.
|
|
37
|
+
3. Tìm mẫu lỗi: `Error:`, `FAIL`, `exit code`, stack trace.
|
|
38
|
+
4. Xem annotation: `gh api repos/{owner}/{repo}/check-runs/{id}/annotations`.
|
|
39
|
+
|
|
40
|
+
## Log server
|
|
41
|
+
|
|
42
|
+
### Cách thu
|
|
43
|
+
|
|
44
|
+
1. **Xác định chỗ chứa log** — log ứng dụng, log hệ thống, log web server.
|
|
45
|
+
2. **Lọc theo khung thời gian** của sự cố.
|
|
46
|
+
3. **Đối chiếu theo request ID** — lần một request qua nhiều dịch vụ.
|
|
47
|
+
4. **Tìm mẫu** — lỗi lặp, tỷ lệ lỗi đổi, payload bất thường.
|
|
48
|
+
|
|
49
|
+
### Truy vấn database
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# truy vấn chậm
|
|
53
|
+
psql -c "SELECT query, calls, mean_exec_time FROM pg_stat_statements ORDER BY mean_exec_time DESC LIMIT 10;"
|
|
54
|
+
|
|
55
|
+
# trạng thái kết nối
|
|
56
|
+
psql -c "SELECT count(*), state FROM pg_stat_activity GROUP BY state;"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Chỉ chạy truy vấn **đọc**. `UPDATE`, `DELETE`, `ALTER` trên database thật là thao tác khó
|
|
60
|
+
đảo ngược, phải xin principal duyệt.
|
|
61
|
+
|
|
62
|
+
### Đối chiếu chéo nguồn
|
|
63
|
+
|
|
64
|
+
1. **Căn mốc thời gian** giữa mọi nguồn — chú ý múi giờ, đây là chỗ hay sai nhất.
|
|
65
|
+
2. **Dựng timeline** — lỗi đầu tiên → lan ra → người dùng thấy.
|
|
66
|
+
3. **Tìm chỗ kích hoạt** — cái gì đổi ngay trước lỗi đầu tiên?
|
|
67
|
+
4. **Vẽ bán kính ảnh hưởng** — dịch vụ/endpoint nào bị.
|
|
68
|
+
|
|
69
|
+
## Đọc mẫu lỗi ứng dụng
|
|
70
|
+
|
|
71
|
+
| Hình dạng | Nghĩa thường là |
|
|
72
|
+
|---|---|
|
|
73
|
+
| vọt lên đột ngột | deploy, đổi config, phụ thuộc ngoài chết |
|
|
74
|
+
| tăng dần | rò tài nguyên, dữ liệu phình, xuống cấp |
|
|
75
|
+
| hỏng theo chu kỳ | cron, tác vụ định kỳ, tranh chấp tài nguyên |
|
|
76
|
+
| chỉ một endpoint | bug code, vấn đề dữ liệu, một phụ thuộc cụ thể |
|
|
77
|
+
| mọi endpoint | hạ tầng, database, mạng |
|
|
78
|
+
|
|
79
|
+
Hình dạng theo thời gian nói nhiều hơn nội dung một dòng lỗi. Vẽ nó trước khi đọc chi tiết.
|
|
80
|
+
|
|
81
|
+
### Trường log ưu tiên
|
|
82
|
+
|
|
83
|
+
mốc thời gian · mức · thông báo lỗi · stack trace · request ID · endpoint · mã phản hồi ·
|
|
84
|
+
thời lượng.
|
|
85
|
+
|
|
86
|
+
## Giữ bằng chứng
|
|
87
|
+
|
|
88
|
+
Trích **đúng phần cần** cho báo cáo, không dán cả file log:
|
|
89
|
+
|
|
90
|
+
- Thông báo lỗi và stack trace nguyên văn.
|
|
91
|
+
- Mốc thời gian và request ID.
|
|
92
|
+
- So sánh trước/sau — trạng thái bình thường và trạng thái lỗi.
|
|
93
|
+
- Số lượng và tần suất, không phải tính từ.
|
|
94
|
+
|
|
95
|
+
"Rất nhiều lỗi timeout" là vô dụng. "412 lỗi timeout trong 5 phút, so với 0 ở khung giờ
|
|
96
|
+
trước" thì dùng được.
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Chẩn đoán hiệu năng
|
|
2
|
+
|
|
3
|
+
## Khi nào dùng
|
|
4
|
+
|
|
5
|
+
Thời gian phản hồi tăng rõ rệt · ứng dụng chậm · truy vấn lâu · CPU/bộ nhớ/đĩa cao · cạn
|
|
6
|
+
tài nguyên hoặc OOM.
|
|
7
|
+
|
|
8
|
+
## Luật vào nghề
|
|
9
|
+
|
|
10
|
+
**Đo trước, tối ưu sau.** Tối ưu mà không có số đo trước là đoán — và thường tối ưu đúng
|
|
11
|
+
chỗ không phải nút thắt.
|
|
12
|
+
|
|
13
|
+
Bốn câu phải trả lời trước khi động vào bất cứ thứ gì:
|
|
14
|
+
|
|
15
|
+
- Kỳ vọng bao nhiêu, thực tế bao nhiêu? (số cụ thể, không phải "chậm")
|
|
16
|
+
- Chậm từ khi nào? Trùng với thay đổi nào?
|
|
17
|
+
- Endpoint / thao tác nào bị?
|
|
18
|
+
- Luôn luôn hay lúc có lúc không?
|
|
19
|
+
|
|
20
|
+
## Khoanh tầng nút thắt
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Request → Mạng → Web server → Ứng dụng → Database → Filesystem
|
|
24
|
+
↓
|
|
25
|
+
API / dịch vụ ngoài
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Đo thời gian ở **từng tầng** để biết độ trễ nằm ở đâu. Loại trừ, đừng đoán.
|
|
29
|
+
|
|
30
|
+
| Tầng | Kiểm | Công cụ |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Mạng | độ trễ, DNS, TLS | `curl -w`, log mạng |
|
|
33
|
+
| Web server | hàng đợi request, số kết nối | metric server, access log |
|
|
34
|
+
| Ứng dụng | CPU, bộ nhớ | profiler, `process.memoryUsage()` |
|
|
35
|
+
| Database | thời gian truy vấn, kết nối | `EXPLAIN ANALYZE`, `pg_stat_statements` |
|
|
36
|
+
| Filesystem | I/O wait, dung lượng | `iostat`, `df -h` |
|
|
37
|
+
| API ngoài | thời gian phản hồi, timeout | log request kèm thời lượng |
|
|
38
|
+
|
|
39
|
+
## Database — PostgreSQL
|
|
40
|
+
|
|
41
|
+
Toàn bộ truy vấn dưới đây là **chỉ đọc**. Không chạy `UPDATE`/`ALTER`/`DELETE` trên
|
|
42
|
+
database thật — đó là thao tác khó đảo ngược, phải xin principal duyệt.
|
|
43
|
+
|
|
44
|
+
```sql
|
|
45
|
+
-- truy vấn chậm (cần extension pg_stat_statements)
|
|
46
|
+
SELECT query, calls, mean_exec_time, total_exec_time
|
|
47
|
+
FROM pg_stat_statements
|
|
48
|
+
ORDER BY mean_exec_time DESC LIMIT 20;
|
|
49
|
+
|
|
50
|
+
-- truy vấn đang chạy ngay lúc này
|
|
51
|
+
SELECT pid, now() - query_start AS duration, query, state
|
|
52
|
+
FROM pg_stat_activity
|
|
53
|
+
WHERE state != 'idle'
|
|
54
|
+
ORDER BY duration DESC;
|
|
55
|
+
|
|
56
|
+
-- kích thước bảng
|
|
57
|
+
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
|
|
58
|
+
FROM pg_catalog.pg_statio_user_tables
|
|
59
|
+
ORDER BY pg_total_relation_size(relid) DESC LIMIT 20;
|
|
60
|
+
|
|
61
|
+
-- thiếu index: quét tuần tự nhiều trên bảng lớn
|
|
62
|
+
SELECT relname, seq_scan, seq_tup_read, idx_scan
|
|
63
|
+
FROM pg_stat_user_tables
|
|
64
|
+
WHERE seq_scan > 100 AND seq_tup_read > 10000
|
|
65
|
+
ORDER BY seq_tup_read DESC;
|
|
66
|
+
|
|
67
|
+
-- trạng thái pool kết nối
|
|
68
|
+
SELECT count(*), state FROM pg_stat_activity GROUP BY state;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Phân tích một truy vấn cụ thể:
|
|
72
|
+
|
|
73
|
+
```sql
|
|
74
|
+
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) <truy vấn>;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Tìm:** quét tuần tự trên bảng lớn · nested loop với số dòng cao · sort không có index ·
|
|
78
|
+
số lần chạm buffer bất thường.
|
|
79
|
+
|
|
80
|
+
## Ứng dụng — nút thắt thường gặp
|
|
81
|
+
|
|
82
|
+
| Vấn đề | Triệu chứng | Hướng sửa |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| N+1 truy vấn | rất nhiều truy vấn nhỏ mỗi request | nạp sớm, gộp truy vấn |
|
|
85
|
+
| Rò bộ nhớ | bộ nhớ tăng dần theo thời gian | profile heap, kiểm event listener |
|
|
86
|
+
| I/O chặn | thời gian phản hồi cao, CPU thấp | bất đồng bộ, pool kết nối |
|
|
87
|
+
| Nghẽn CPU | CPU cao, tỷ lệ thuận với tải | tối ưu thuật toán, cache |
|
|
88
|
+
| Cạn kết nối | timeout lúc có lúc không | chỉnh kích thước pool, dùng lại kết nối |
|
|
89
|
+
| Payload lớn | truyền chậm, tốn bộ nhớ | phân trang, nén, streaming |
|
|
90
|
+
|
|
91
|
+
Cặp **"thời gian phản hồi cao + CPU thấp"** là dấu hiệu rõ nhất: hệ đang **chờ**, không
|
|
92
|
+
phải đang **tính**. Đừng đi tối ưu thuật toán khi CPU đang rảnh.
|
|
93
|
+
|
|
94
|
+
## Thứ tự tối ưu
|
|
95
|
+
|
|
96
|
+
1. **Thắng nhanh** — thêm index còn thiếu, sửa N+1, bật cache.
|
|
97
|
+
2. **Cấu hình** — kích thước pool, timeout, buffer, số worker.
|
|
98
|
+
3. **Code** — tối ưu thuật toán, đổi cấu trúc dữ liệu.
|
|
99
|
+
4. **Kiến trúc** — tầng cache, read replica, xử lý bất đồng bộ, CDN.
|
|
100
|
+
|
|
101
|
+
Đi từ trên xuống. Bước 4 đắt và khó đảo ngược; bước 1 thường giải quyết phần lớn vấn đề.
|
|
102
|
+
|
|
103
|
+
**Mỗi lần một thay đổi, đo lại sau mỗi lần.** Đổi ba thứ cùng lúc rồi thấy nhanh hơn thì
|
|
104
|
+
không biết thứ nào có tác dụng — và hai thứ kia có thể đang làm chậm đi.
|
|
105
|
+
|
|
106
|
+
## Đưa vào báo cáo
|
|
107
|
+
|
|
108
|
+
- **Số đo trước và sau**, có con số. Không có số thì không phải chẩn đoán hiệu năng.
|
|
109
|
+
- **Nút thắt nằm ở tầng nào**, kèm bằng chứng.
|
|
110
|
+
- **Nguyên nhân gốc** — vì sao tầng đó chậm.
|
|
111
|
+
- **Đề xuất sửa** kèm tác động mong đợi.
|
|
112
|
+
- **Cách kiểm chứng** rằng bản sửa có hiệu quả.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Chuẩn báo cáo điều tra
|
|
2
|
+
|
|
3
|
+
Hy sinh ngữ pháp cho cô đọng. Sự kiện và bằng chứng, không kể chuyện.
|
|
4
|
+
|
|
5
|
+
## Khi nào viết ra file
|
|
6
|
+
|
|
7
|
+
Điều tra ngắn → trả lời thẳng trong phiên, không tạo file.
|
|
8
|
+
|
|
9
|
+
Viết file khi: điều tra nhiều bước còn dùng lại được, sự cố cần hậu kiểm, hoặc được yêu cầu.
|
|
10
|
+
|
|
11
|
+
**Đường dẫn:** `plans/reports/{loại}-{YYMMDD}-{HHMM}-{slug}.md`
|
|
12
|
+
|
|
13
|
+
Tự tính ngày giờ — alp-code không có hook nào inject đường dẫn.
|
|
14
|
+
|
|
15
|
+
**Lưu ý ACL:** loadout có thể không cấp `Write` — khi đó bạn không tự tạo được file báo
|
|
16
|
+
cáo. Đưa nội dung cho bên giao việc để họ ghi. Đừng tìm đường vòng qua `Bash`
|
|
17
|
+
(HOUSE-RULES §1.9).
|
|
18
|
+
|
|
19
|
+
## Cấu trúc
|
|
20
|
+
|
|
21
|
+
### 1. Tóm tắt (3–5 dòng)
|
|
22
|
+
|
|
23
|
+
- **Vấn đề:** một dòng
|
|
24
|
+
- **Ảnh hưởng:** ai/hệ nào, mức nghiêm trọng
|
|
25
|
+
- **Nguyên nhân gốc:** một dòng — hoặc **"chưa xác định được"**
|
|
26
|
+
- **Trạng thái:** đã xong · đã giảm thiểu · đang điều tra
|
|
27
|
+
- **Đề xuất sửa:** ở đâu, vì sao ở đó
|
|
28
|
+
|
|
29
|
+
Chưa ra nguyên nhân gốc thì **ghi thẳng là chưa ra**. Thay bằng nguyên nhân gần nhất là
|
|
30
|
+
cách để người đọc đi sửa nhầm chỗ.
|
|
31
|
+
|
|
32
|
+
### 2. Phân tích
|
|
33
|
+
|
|
34
|
+
**Mốc thời gian** — chỉ khi sự cố diễn ra theo thời gian:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
HH:MM — sự kiện
|
|
38
|
+
HH:MM — sự kiện
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Chuỗi bằng chứng** — phần quan trọng nhất:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
1. <quan sát> — `path:line` hoặc output lệnh
|
|
45
|
+
2. <suy ra> — vì sao bước 1 dẫn tới đây
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Người đọc phải đi lại được chuỗi này và tới cùng kết luận. Bước nào không đi lại được thì bước
|
|
49
|
+
đó là giả thuyết, phải ghi là giả thuyết.
|
|
50
|
+
|
|
51
|
+
**Tách ba loại, đừng trộn:**
|
|
52
|
+
|
|
53
|
+
| Loại | Cách viết |
|
|
54
|
+
|---|---|
|
|
55
|
+
| Đã xác nhận | "chạy X, output cho thấy Y" |
|
|
56
|
+
| Giả thuyết | "có thể do X — chưa tái hiện được" |
|
|
57
|
+
| Tương quan | "X và Y cùng xuất hiện — chưa chứng minh nhân quả" |
|
|
58
|
+
|
|
59
|
+
Nhầm tương quan thành nhân quả là lỗi hay gặp nhất trong báo cáo điều tra.
|
|
60
|
+
|
|
61
|
+
### 3. Đã loại trừ
|
|
62
|
+
|
|
63
|
+
Giả thuyết nào đã thử và **bị bác**, bằng bằng chứng gì.
|
|
64
|
+
|
|
65
|
+
Mục này hay bị bỏ và nó đắt: không có nó, người đọc sẽ đi lại đúng con đường bạn vừa đi.
|
|
66
|
+
|
|
67
|
+
### 4. Khuyến nghị
|
|
68
|
+
|
|
69
|
+
| Mức | Nghĩa |
|
|
70
|
+
|---|---|
|
|
71
|
+
| Ngay | sửa để hết vấn đề |
|
|
72
|
+
| Tiếp theo | cải thiện sau khi hết cháy |
|
|
73
|
+
| Lâu dài | giám sát, cảnh báo, phòng ngừa tái diễn |
|
|
74
|
+
|
|
75
|
+
Mỗi khuyến nghị: **làm gì · vì sao · tác động mong đợi · công sức (thấp/vừa/cao)**.
|
|
76
|
+
|
|
77
|
+
Khuyến nghị nào là thao tác khó đảo ngược (migration, xoá dữ liệu, đổi cấu hình
|
|
78
|
+
production) thì đánh dấu rõ **cần principal duyệt**.
|
|
79
|
+
|
|
80
|
+
### 5. Câu hỏi còn mở
|
|
81
|
+
|
|
82
|
+
Luôn có mục này. Phần chưa rõ, giả định cần kiểm chứng, và thứ bạn không tự lấy được.
|
|
83
|
+
|
|
84
|
+
## Mẫu
|
|
85
|
+
|
|
86
|
+
```markdown
|
|
87
|
+
# <Vấn đề> — Báo cáo điều tra
|
|
88
|
+
|
|
89
|
+
## Tóm tắt
|
|
90
|
+
- **Vấn đề:**
|
|
91
|
+
- **Ảnh hưởng:**
|
|
92
|
+
- **Nguyên nhân gốc:**
|
|
93
|
+
- **Trạng thái:**
|
|
94
|
+
- **Đề xuất sửa:**
|
|
95
|
+
|
|
96
|
+
## Chuỗi bằng chứng
|
|
97
|
+
1.
|
|
98
|
+
2.
|
|
99
|
+
|
|
100
|
+
## Đã loại trừ
|
|
101
|
+
-
|
|
102
|
+
|
|
103
|
+
## Khuyến nghị
|
|
104
|
+
### Ngay
|
|
105
|
+
- [ ]
|
|
106
|
+
### Tiếp theo
|
|
107
|
+
- [ ]
|
|
108
|
+
### Lâu dài
|
|
109
|
+
- [ ]
|
|
110
|
+
|
|
111
|
+
## Câu hỏi còn mở
|
|
112
|
+
-
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Luật viết
|
|
116
|
+
|
|
117
|
+
- **Có bằng chứng:** mọi khẳng định kèm log, số đo, hoặc bước tái hiện.
|
|
118
|
+
- **Trung thực:** nói rõ cái gì không biết. "Nhiều khả năng là" khác "đã xác nhận là".
|
|
119
|
+
- **Cụ thể:** khuyến nghị chỉ được `path:line`, không nói chung chung.
|
|
120
|
+
- **Quét được bằng mắt:** tiêu đề, bảng, gạch đầu dòng.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Lần ngược nguyên nhân gốc
|
|
2
|
+
|
|
3
|
+
Lần ngược call stack tới chỗ **phát sinh**, không dừng ở chỗ lỗi nổ ra.
|
|
4
|
+
|
|
5
|
+
## Nguyên lý
|
|
6
|
+
|
|
7
|
+
Bug thường nổ **sâu** trong call stack. Bản năng là sửa ngay chỗ báo lỗi — đó là chữa
|
|
8
|
+
triệu chứng. Giá trị sai đã đi qua nhiều tầng trước khi tới đó, và mỗi tầng đều là một cơ
|
|
9
|
+
hội bị bỏ lỡ để chặn nó.
|
|
10
|
+
|
|
11
|
+
## Khi nào dùng
|
|
12
|
+
|
|
13
|
+
- Lỗi xảy ra sâu trong luồng thực thi, không phải ở cửa vào.
|
|
14
|
+
- Stack trace dài.
|
|
15
|
+
- Chưa rõ dữ liệu sai sinh ra từ đâu.
|
|
16
|
+
- Cần biết test nào hoặc đường code nào kích hoạt.
|
|
17
|
+
|
|
18
|
+
## Quy trình
|
|
19
|
+
|
|
20
|
+
### 1. Quan sát triệu chứng
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Error: git init failed in /Users/oaidq/project/packages/core
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Tìm nguyên nhân trực tiếp
|
|
27
|
+
|
|
28
|
+
Dòng code nào gây ra nó?
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
await execFileAsync('git', ['init'], { cwd: projectDir });
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 3. Hỏi: ai gọi dòng này?
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
WorktreeManager.createSessionWorktree(projectDir, sessionId)
|
|
38
|
+
← Session.initializeWorkspace()
|
|
39
|
+
← Session.create()
|
|
40
|
+
← test tại Project.create()
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 4. Lần tiếp lên trên — giá trị nào được truyền vào?
|
|
44
|
+
|
|
45
|
+
- `projectDir = ''` — chuỗi rỗng.
|
|
46
|
+
- Chuỗi rỗng làm `cwd` thì rơi về `process.cwd()`.
|
|
47
|
+
- Đó là thư mục source.
|
|
48
|
+
|
|
49
|
+
### 5. Tìm chỗ phát sinh
|
|
50
|
+
|
|
51
|
+
Chuỗi rỗng từ đâu ra?
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
const context = setupCoreTest(); // trả { tempDir: '' }
|
|
55
|
+
Project.create('name', context.tempDir); // đọc TRƯỚC khi beforeEach chạy
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Nguyên nhân gốc:** biến ở tầng ngoài được khởi tạo khi giá trị chưa sẵn sàng.
|
|
59
|
+
**Không phải** `git init`, cũng không phải `WorktreeManager`.
|
|
60
|
+
|
|
61
|
+
## Chèn stack trace khi lần tay không nổi
|
|
62
|
+
|
|
63
|
+
```js
|
|
64
|
+
async function gitInit(directory) {
|
|
65
|
+
console.error('DEBUG git init:', {
|
|
66
|
+
directory,
|
|
67
|
+
cwd: process.cwd(),
|
|
68
|
+
stack: new Error().stack,
|
|
69
|
+
});
|
|
70
|
+
await execFileAsync('git', ['init'], { cwd: directory });
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Dùng `console.error()`, **không** dùng logger — logger trong test hay bị nuốt.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm test 2>&1 | grep 'DEBUG git init'
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Đọc stack trace tìm: tên file test · số dòng kích hoạt · mẫu lặp (cùng một test? cùng một
|
|
81
|
+
tham số?).
|
|
82
|
+
|
|
83
|
+
**Lưu ý ACL:** loadout có thể không cấp `Edit` — khi đó bạn không tự chèn được đoạn debug
|
|
84
|
+
này. Mô tả chính xác chèn gì, vào file nào, dòng nào, rồi để người có quyền chèn và chạy.
|
|
85
|
+
Đừng tìm đường vòng qua `Bash` (HOUSE-RULES §1.9).
|
|
86
|
+
|
|
87
|
+
## Tìm test nào gây nhiễm
|
|
88
|
+
|
|
89
|
+
Có thứ xuất hiện trong lúc chạy test mà không biết test nào tạo ra:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
.claude/skills/alp-debug/scripts/find-polluter.sh '.git' 'src/**/*.test.ts'
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Chạy từng test một, dừng ở test đầu tiên gây nhiễm. Đường dẫn tính từ CWD của phiên
|
|
96
|
+
(`active workspace`), qua symlink skill.
|
|
97
|
+
|
|
98
|
+
## Luật
|
|
99
|
+
|
|
100
|
+
**Không bao giờ chỉ sửa ở chỗ lỗi nổ ra.**
|
|
101
|
+
|
|
102
|
+
Tìm được nguyên nhân trực tiếp rồi thì hỏi tiếp:
|
|
103
|
+
|
|
104
|
+
- Lần lên được một tầng nữa không? → lần tiếp.
|
|
105
|
+
- Đây đúng là chỗ phát sinh? → đề xuất sửa ở đây.
|
|
106
|
+
- Rồi đề xuất thêm chốt chặn ở từng tầng — `defense-in-depth.md`.
|
|
107
|
+
|
|
108
|
+
## Ví dụ thật, đủ chuỗi
|
|
109
|
+
|
|
110
|
+
**Triệu chứng:** `.git` được tạo trong `packages/core/` (thư mục source).
|
|
111
|
+
|
|
112
|
+
**Chuỗi lần ngược:**
|
|
113
|
+
|
|
114
|
+
1. `git init` chạy trong `process.cwd()` ← tham số `cwd` rỗng
|
|
115
|
+
2. `WorktreeManager` nhận `projectDir` rỗng
|
|
116
|
+
3. `Session.create()` truyền chuỗi rỗng
|
|
117
|
+
4. test đọc `context.tempDir` trước khi `beforeEach` chạy
|
|
118
|
+
5. `setupCoreTest()` ban đầu trả `{ tempDir: '' }`
|
|
119
|
+
|
|
120
|
+
**Nguyên nhân gốc:** khởi tạo biến ở tầng ngoài, đọc giá trị chưa sẵn sàng.
|
|
121
|
+
|
|
122
|
+
**Sửa:** biến `tempDir` thành getter, ném lỗi nếu bị đọc trước `beforeEach`.
|
|
123
|
+
|
|
124
|
+
**Chốt chặn thêm:**
|
|
125
|
+
|
|
126
|
+
| Tầng | Chốt |
|
|
127
|
+
|---|---|
|
|
128
|
+
| 1 | `Project.create()` kiểm thư mục |
|
|
129
|
+
| 2 | `WorkspaceManager` từ chối chuỗi rỗng |
|
|
130
|
+
| 3 | guard môi trường: từ chối `git init` ngoài thư mục tạm |
|
|
131
|
+
| 4 | log stack trace trước khi `git init` |
|
|
132
|
+
|
|
133
|
+
Chuỗi này là mẫu cho phần **Chuỗi bằng chứng** trong báo cáo — người đọc phải đi lại được
|
|
134
|
+
từng bước và tới cùng kết luận.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Gỡ lỗi có hệ thống
|
|
2
|
+
|
|
3
|
+
Bốn pha. Pha này xong mới sang pha kia.
|
|
4
|
+
|
|
5
|
+
## Luật sắt
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
KHÔNG ĐỀ XUẤT SỬA KHI CHƯA TRUY XONG NGUYÊN NHÂN GỐC
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Chưa xong Pha 1 thì không được đề xuất cách sửa.
|
|
12
|
+
|
|
13
|
+
Nếu loadout không cấp `Edit` thì luật này còn dễ giữ hơn: bạn **không sửa được gì**. Sản
|
|
14
|
+
phẩm của bạn là nguyên nhân gốc kèm chuỗi bằng chứng; người khác mới là người sửa.
|
|
15
|
+
|
|
16
|
+
## Pha 1 — Truy nguyên nhân gốc
|
|
17
|
+
|
|
18
|
+
1. **Đọc kỹ thông báo lỗi.** Đọc hết stack trace, đừng lướt qua warning. Dòng bạn bỏ qua
|
|
19
|
+
thường là dòng nói thật.
|
|
20
|
+
2. **Tái hiện ổn định.** Kích hoạt lại được không? Chính xác các bước nào? Không tái hiện
|
|
21
|
+
được → thu thập thêm dữ liệu, **chưa** đưa giả thuyết.
|
|
22
|
+
3. **Xem gì vừa đổi.** `git diff`, commit gần đây, phụ thuộc mới, config đổi.
|
|
23
|
+
4. **Thu bằng chứng ở ranh giới giữa các thành phần.** Với mỗi ranh giới: dữ liệu vào là
|
|
24
|
+
gì, ra là gì, biến môi trường có truyền qua không. Chạy **một lượt** để biết nó vỡ ở
|
|
25
|
+
*đâu*, rồi mới phân tích *vì sao*.
|
|
26
|
+
5. **Lần theo dòng dữ liệu.** Giá trị sai sinh ra từ đâu? Lần ngược call stack tới nguồn —
|
|
27
|
+
xem `root-cause-tracing.md`.
|
|
28
|
+
|
|
29
|
+
Chưa xong 5 bước này thì mọi giả thuyết đều là đoán.
|
|
30
|
+
|
|
31
|
+
## Pha 2 — Phân tích mẫu
|
|
32
|
+
|
|
33
|
+
1. **Tìm ví dụ đang chạy đúng.** Code tương tự trong cùng repo mà không hỏng.
|
|
34
|
+
2. **Đọc bản tham chiếu ĐẦY ĐỦ** trước khi so. Đọc lướt rồi so là cách bỏ sót đúng khác
|
|
35
|
+
biệt quan trọng.
|
|
36
|
+
3. **Liệt kê mọi khác biệt**, dù nhỏ. Không được tự nhủ "chỗ đó không thể ảnh hưởng".
|
|
37
|
+
4. **Hiểu phụ thuộc** — cần thành phần nào, config nào, biến môi trường nào.
|
|
38
|
+
|
|
39
|
+
## Pha 3 — Giả thuyết và kiểm chứng
|
|
40
|
+
|
|
41
|
+
1. **Một giả thuyết, cụ thể:** "tôi cho rằng X là nguyên nhân gốc vì Y". Không phải "chắc
|
|
42
|
+
do phần auth".
|
|
43
|
+
2. **Thử tối thiểu** — thay đổi nhỏ nhất đủ để kiểm giả thuyết. **Một biến một lần.**
|
|
44
|
+
3. **Kiểm chứng trước khi đi tiếp.** Đúng → Pha 4. Sai → giả thuyết **mới**, không phải
|
|
45
|
+
chồng thêm bản sửa.
|
|
46
|
+
4. **Không biết thì nói không biết.** "Tôi chưa hiểu vì sao X" là câu hợp lệ. Giả vờ hiểu
|
|
47
|
+
là cách để người đọc đi sửa nhầm chỗ.
|
|
48
|
+
|
|
49
|
+
## Pha 4 — Kết luận và bàn giao
|
|
50
|
+
|
|
51
|
+
1. **Tái hiện được, càng nhỏ càng tốt.** Tự động hoá được thì tốt. Đây là thứ chứng minh
|
|
52
|
+
nguyên nhân gốc đúng.
|
|
53
|
+
2. **Một đề xuất sửa duy nhất**, nhắm nguyên nhân gốc. Không kèm "tiện tay cải thiện luôn".
|
|
54
|
+
3. **Chỉ rõ vì sao sửa ở đó**, chứ không phải ở chỗ triệu chứng nổ ra.
|
|
55
|
+
4. **Đề xuất không đứng vững:**
|
|
56
|
+
- DỪNG. Đếm: đã thử mấy giả thuyết?
|
|
57
|
+
- Dưới 3 → về Pha 1 với thông tin mới.
|
|
58
|
+
- **Từ 3 trở lên → dừng và chất vấn kiến trúc.**
|
|
59
|
+
5. **Ba lần thất bại nghĩa là gì.** Mẫu điển hình: mỗi lần sửa lại lộ ra một chỗ dùng chung
|
|
60
|
+
trạng thái hoặc coupling khác. Đó không còn là bug, đó là kiến trúc sai. Dừng, báo lại,
|
|
61
|
+
và cân nhắc `alp-predict` hoặc `problem-solving` thay vì thử tiếp.
|
|
62
|
+
|
|
63
|
+
## Cờ đỏ — dừng lại, quay về Pha 1
|
|
64
|
+
|
|
65
|
+
- "sửa tạm đã, điều tra sau"
|
|
66
|
+
- "cứ thử đổi X xem sao"
|
|
67
|
+
- "đổi vài chỗ rồi chạy test"
|
|
68
|
+
- "bỏ qua test, kiểm tay cũng được"
|
|
69
|
+
- "chắc là do X, sửa chỗ đó"
|
|
70
|
+
- "tôi chưa hiểu hết nhưng chắc cách này được"
|
|
71
|
+
- "thử thêm một lần nữa thôi" — khi đã thử 2+ lần
|
|
72
|
+
|
|
73
|
+
## Tín hiệu cho thấy bạn đang làm sai
|
|
74
|
+
|
|
75
|
+
| Nghe câu này | Nghĩa là |
|
|
76
|
+
|---|---|
|
|
77
|
+
| "thế nó có xảy ra không?" | bạn đang giả định mà chưa kiểm |
|
|
78
|
+
| "chạy cái đó có cho thấy gì không?" | lẽ ra phải thu bằng chứng trước |
|
|
79
|
+
| "đừng đoán nữa" | đang đề xuất sửa khi chưa hiểu |
|
|
80
|
+
| "nghĩ kỹ lại từ gốc" | chất vấn nền tảng, không phải triệu chứng |
|
|
81
|
+
|
|
82
|
+
Gặp mấy câu này → về Pha 1.
|
|
83
|
+
|
|
84
|
+
## Chặn biện minh
|
|
85
|
+
|
|
86
|
+
| Lý do | Thực tế |
|
|
87
|
+
|---|---|
|
|
88
|
+
| "lỗi đơn giản, không cần quy trình" | lỗi đơn giản cũng có nguyên nhân gốc |
|
|
89
|
+
| "gấp lắm, không kịp làm quy trình" | có hệ thống **nhanh hơn** đoán-và-thử |
|
|
90
|
+
| "thử cái này trước rồi điều tra sau" | lần thử đầu đặt luôn lối mòn |
|
|
91
|
+
| "thử thêm lần nữa" (sau 2 lần hỏng) | 3 lần hỏng = vấn đề kiến trúc |
|
|
92
|
+
|
|
93
|
+
Cái giá thật: có hệ thống mất 15–30 phút; đoán bừa mất 2–3 giờ và hay đẻ bug mới.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Kiểm chứng trước khi kết luận
|
|
2
|
+
|
|
3
|
+
Đây là việc chẩn đoán, không phải việc sửa. Nên thứ bạn phải kiểm chứng không phải "đã làm
|
|
4
|
+
xong chưa" mà là **"kết luận này có đứng vững không"**.
|
|
5
|
+
|
|
6
|
+
Nói sai nguyên nhân gốc còn tệ hơn nói không biết: người ta sẽ đi sửa nhầm chỗ, mất thời
|
|
7
|
+
gian gấp đôi, và lần sau không tin bạn nữa.
|
|
8
|
+
|
|
9
|
+
## Luật sắt
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
KHÔNG KẾT LUẬN KHI CHƯA CÓ BẰNG CHỨNG MỚI, LẤY TRONG PHIÊN NÀY
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Hàm cổng
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
TRƯỚC khi nói bất cứ kết luận nào:
|
|
19
|
+
|
|
20
|
+
1. XÁC ĐỊNH: lệnh hoặc quan sát nào chứng minh được điều này?
|
|
21
|
+
2. CHẠY: chạy đủ, mới, không cắt
|
|
22
|
+
3. ĐỌC: đọc hết output, xem exit code, đếm số fail
|
|
23
|
+
4. ĐỐI CHIẾU: output có xác nhận không?
|
|
24
|
+
- KHÔNG → nói trạng thái thật, kèm bằng chứng
|
|
25
|
+
- CÓ → nói kết luận, KÈM bằng chứng
|
|
26
|
+
5. RỒI MỚI: phát biểu
|
|
27
|
+
|
|
28
|
+
Bỏ bước nào = đoán, không phải kết luận
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Ba mức tin cậy — phải nói rõ mức nào
|
|
32
|
+
|
|
33
|
+
| Mức | Điều kiện | Viết thế nào |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| **Đã xác nhận** | tái hiện được, có output | "chạy X, output cho thấy Y" |
|
|
36
|
+
| **Giả thuyết** | hợp lý nhưng chưa tái hiện | "có thể do X — chưa tái hiện được" |
|
|
37
|
+
| **Tương quan** | hai thứ cùng xuất hiện | "X và Y cùng xuất hiện — chưa chứng minh nhân quả" |
|
|
38
|
+
|
|
39
|
+
Trộn ba mức này vào cùng một giọng khẳng định là lỗi hay gặp nhất trong báo cáo điều tra.
|
|
40
|
+
|
|
41
|
+
## Bảng đối chiếu
|
|
42
|
+
|
|
43
|
+
| Kết luận | Bằng chứng bắt buộc | KHÔNG đủ |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| đây là nguyên nhân gốc | tái hiện được, và gỡ nguyên nhân thì triệu chứng biến mất | code đọc thấy có vẻ sai |
|
|
46
|
+
| lỗi nằm ở thành phần X | log ở ranh giới cho thấy dữ liệu vào đúng, ra sai | X là chỗ stack trace nổ |
|
|
47
|
+
| test fail do môi trường | chạy lại ở môi trường sạch: pass | "chắc do máy CI" |
|
|
48
|
+
| chậm vì truy vấn N+1 | có số đo: số truy vấn, thời gian | đọc code thấy vòng lặp có query |
|
|
49
|
+
| đã loại trừ giả thuyết Y | thử Y, kết quả bác bỏ | thấy Y không hợp lý |
|
|
50
|
+
|
|
51
|
+
## Cờ đỏ — dừng lại
|
|
52
|
+
|
|
53
|
+
- Dùng "chắc là", "nhiều khả năng", "có vẻ" trong phần **Nguyên nhân gốc**.
|
|
54
|
+
- Kết luận dựa trên đọc code mà chưa chạy gì.
|
|
55
|
+
- Nhận báo cáo của agent khác làm bằng chứng — nó chạy phiên riêng, bạn không thấy nó đã
|
|
56
|
+
chạy gì.
|
|
57
|
+
- Dừng ở nguyên nhân **gần nhất** vì nó đủ hợp lý.
|
|
58
|
+
- Mệt và muốn xong cho rồi.
|
|
59
|
+
|
|
60
|
+
## Chặn biện minh
|
|
61
|
+
|
|
62
|
+
| Lý do | Thực tế |
|
|
63
|
+
|---|---|
|
|
64
|
+
| "đọc code là thấy ngay mà" | đọc code cho giả thuyết, không cho kết luận |
|
|
65
|
+
| "tôi khá chắc" | chắc ≠ bằng chứng |
|
|
66
|
+
| "không tái hiện được nhưng chắc đúng" | thì ghi là giả thuyết, đừng ghi là nguyên nhân gốc |
|
|
67
|
+
| "đang gấp" | kết luận sai làm mất nhiều thời gian hơn |
|
|
68
|
+
| "bên kia đã kiểm rồi" | kiểm độc lập, hoặc ghi rõ là dựa vào báo cáo của họ |
|
|
69
|
+
|
|
70
|
+
## Bài kiểm quyết định
|
|
71
|
+
|
|
72
|
+
Một nguyên nhân gốc chỉ được gọi là **đã xác nhận** khi trả lời được cả hai:
|
|
73
|
+
|
|
74
|
+
1. **Tái hiện được triệu chứng** theo đúng cơ chế đã mô tả?
|
|
75
|
+
2. **Gỡ nguyên nhân đi thì triệu chứng biến mất?** — hoặc chứng minh được bằng suy luận từ
|
|
76
|
+
bằng chứng đã có.
|
|
77
|
+
|
|
78
|
+
Không trả lời được câu 2 thì đó vẫn là giả thuyết mạnh, không phải nguyên nhân gốc. Nói
|
|
79
|
+
đúng như vậy trong báo cáo.
|
|
80
|
+
|
|
81
|
+
## Chốt
|
|
82
|
+
|
|
83
|
+
Chạy. Đọc output. **Rồi mới** kết luận.
|
|
84
|
+
|
|
85
|
+
Chưa ra thì nói chưa ra, kèm danh sách đã loại trừ. Đó là câu trả lời hợp lệ và hữu ích —
|
|
86
|
+
Một lượt chẩn đoán được mở ra vì độ tin cậy, không vì tốc độ.
|